From 796f39223b88a3c3e473421835e5e923df7c0d7c Mon Sep 17 00:00:00 2001 From: Yukai Huang Date: Wed, 20 Dec 2017 11:22:06 +0800 Subject: [PATCH 001/830] Fix backspace in composition --- src/vs/editor/browser/controller/textAreaInput.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/vs/editor/browser/controller/textAreaInput.ts b/src/vs/editor/browser/controller/textAreaInput.ts index 97926f7e12a..b9c5b03be3c 100644 --- a/src/vs/editor/browser/controller/textAreaInput.ts +++ b/src/vs/editor/browser/controller/textAreaInput.ts @@ -111,7 +111,8 @@ export class TextAreaInput extends Disposable { this._nextCommand = ReadFromTextArea.Type; this._register(dom.addStandardDisposableListener(textArea.domNode, 'keydown', (e: IKeyboardEvent) => { - if (this._isDoingComposition && e.keyCode === KeyCode.KEY_IN_COMPOSITION) { + if (this._isDoingComposition && + (e.keyCode === KeyCode.KEY_IN_COMPOSITION || e.keyCode === KeyCode.Backspace)) { // Stop propagation for keyDown events if the IME is processing key input e.stopPropagation(); } From 24f28ba28122e957d193d955d2d92ad8603dd1d4 Mon Sep 17 00:00:00 2001 From: Rob Lourens Date: Tue, 19 Dec 2017 21:05:56 -0800 Subject: [PATCH 002/830] Tests for #36792 --- .../search/test/common/queryBuilder.test.ts | 47 ++++++++++++++++--- 1 file changed, 40 insertions(+), 7 deletions(-) diff --git a/src/vs/workbench/parts/search/test/common/queryBuilder.test.ts b/src/vs/workbench/parts/search/test/common/queryBuilder.test.ts index 0530c08b20f..d09622c31c2 100644 --- a/src/vs/workbench/parts/search/test/common/queryBuilder.test.ts +++ b/src/vs/workbench/parts/search/test/common/queryBuilder.test.ts @@ -44,8 +44,8 @@ suite('QueryBuilder', () => { mockContextService = new TestContextService(); mockWorkspace = new Workspace('workspace', 'workspace', toWorkspaceFolders([{ path: ROOT_1_URI.fsPath }])); mockContextService.setWorkspace(mockWorkspace); - instantiationService.stub(IWorkspaceContextService, mockContextService); + instantiationService.stub(IWorkspaceContextService, mockContextService); instantiationService.stub(IEnvironmentService, TestEnvironmentService); queryBuilder = instantiationService.createInstance(QueryBuilder); @@ -437,6 +437,32 @@ suite('QueryBuilder', () => { cases.forEach(testIncludesDataItem); }); + test('includes with tilde', () => { + const userHome = TestEnvironmentService.userHome; + const cases: [string, ISearchPathsResult][] = [ + [ + '~/foo/bar', + { + searchPaths: [{ searchPath: getUri(userHome, '/foo/bar') }] + } + ], + [ + '~/foo/bar, a', + { + searchPaths: [{ searchPath: getUri(userHome, '/foo/bar') }], + pattern: patternsToIExpression(...globalGlob('a')) + } + ], + [ + fixPath('/foo/~/bar'), + { + searchPaths: [{ searchPath: getUri('/foo/~/bar') }] + } + ], + ]; + cases.forEach(testIncludesDataItem); + }); + test('relative includes w/single root folder', () => { const cases: [string, ISearchPathsResult][] = [ [ @@ -685,14 +711,21 @@ function patternsToIExpression(...patterns: string[]): IExpression { undefined; } -function getUri(slashPath: string): uri { - return uri.file(fixPath(slashPath)); +function getUri(...slashPathParts: string[]): uri { + return uri.file(fixPath(...slashPathParts)); } -function fixPath(slashPath: string): string { - return process.platform === 'win32' ? - (slashPath.match(/^c:/) ? slashPath : paths.join('c:', ...slashPath.split('/'))) : - slashPath; +function fixPath(...slashPathParts: string[]): string { + const pathParts = arrays.flatten(slashPathParts.map(part => part.split('/'))); + if (process.platform === 'win32') { + if (slashPathParts.length === 1 && slashPathParts[0].match(/^c:/)) { + return slashPathParts[0]; + } else { + return paths.join('c:', ...pathParts); + } + } else { + return paths.join(...pathParts); + } } function normalizeExpression(expression: IExpression): IExpression { From 8505dcc4694ce23be6b207861384f44ba4f5705b Mon Sep 17 00:00:00 2001 From: Andrew Baumann Date: Fri, 2 Mar 2018 11:10:08 -0800 Subject: [PATCH 003/830] enable CLI when invoked from WSL on modern (RS4) hosts Fixes issue #39892 There's one minor gotchya: this script tests for a modern WSL release (which supports the WSLENV feature) using the existence of /bin/wslpath. Per https://docs.microsoft.com/en-us/windows/wsl/release-notes, wslpath was added in build 17046 but WSLENV is only supported in the subsequent build (17063). Both those builds were only shipped as Windows insider builds, so this test should be safe enough. --- resources/win32/bin/code.sh | 22 ++++++++++++++-------- 1 file changed, 14 insertions(+), 8 deletions(-) diff --git a/resources/win32/bin/code.sh b/resources/win32/bin/code.sh index 251d718cfee..ff651424bcb 100644 --- a/resources/win32/bin/code.sh +++ b/resources/win32/bin/code.sh @@ -7,14 +7,20 @@ NAME="@@NAME@@" VSCODE_PATH="$(dirname "$(dirname "$(realpath "$0")")")" ELECTRON="$VSCODE_PATH/$NAME.exe" if grep -q Microsoft /proc/version; then - # If running under WSL don't pass cli.js to Electron as environment vars - # cannot be transferred from WSL to Windows - # See: https://github.com/Microsoft/BashOnWindows/issues/1363 - # https://github.com/Microsoft/BashOnWindows/issues/1494 - "$ELECTRON" "$@" - exit $? -fi -if [ "$(expr substr $(uname -s) 1 9)" == "CYGWIN_NT" ]; then + if [ -x /bin/wslpath ]; then + # On recent WSL builds, we just need to set WSLENV so that + # ELECTRON_RUN_AS_NODE is visible to the win32 process + export WSLENV=ELECTRON_RUN_AS_NODE/w:$WSLENV + CLI=$(wslpath -m "$VSCODE_PATH/resources/app/out/cli.js") + else + # If running under older WSL, don't pass cli.js to Electron as + # environment vars cannot be transferred from WSL to Windows + # See: https://github.com/Microsoft/BashOnWindows/issues/1363 + # https://github.com/Microsoft/BashOnWindows/issues/1494 + "$ELECTRON" "$@" + exit $? + fi +elif [ "$(expr substr $(uname -s) 1 9)" == "CYGWIN_NT" ]; then CLI=$(cygpath -m "$VSCODE_PATH/resources/app/out/cli.js") else CLI="$VSCODE_PATH/resources/app/out/cli.js" From 37dc1c7e8c7a08afb7f27431e5faf031e7c74607 Mon Sep 17 00:00:00 2001 From: Marco Beltempo Date: Tue, 27 Mar 2018 03:11:20 -0400 Subject: [PATCH 004/830] Added key binding to "Disable Breakpoint" --- src/vs/code/electron-main/menus.ts | 2 ++ .../parts/debug/browser/debugCommands.ts | 23 +++++++++++++++++++ 2 files changed, 25 insertions(+) diff --git a/src/vs/code/electron-main/menus.ts b/src/vs/code/electron-main/menus.ts index 442e70d33c9..1e3dcd0648f 100644 --- a/src/vs/code/electron-main/menus.ts +++ b/src/vs/code/electron-main/menus.ts @@ -850,6 +850,7 @@ export class CodeMenu { const continueAction = this.createMenuItem(nls.localize({ key: 'miContinue', comment: ['&& denotes a mnemonic'] }, "&&Continue"), 'workbench.action.debug.continue'); const toggleBreakpoint = this.createMenuItem(nls.localize({ key: 'miToggleBreakpoint', comment: ['&& denotes a mnemonic'] }, "Toggle &&Breakpoint"), 'editor.debug.action.toggleBreakpoint'); + const disableBreakpoint = this.createMenuItem(nls.localize({ key: 'miDisableBreakpoint', comment: ['&& denotes a mnemonic'] }, "Disable &&Breakpoint"), 'debug.disableBreakpoint'); const breakpointsMenu = new Menu(); breakpointsMenu.append(this.createMenuItem(nls.localize({ key: 'miConditionalBreakpoint', comment: ['&& denotes a mnemonic'] }, "&&Conditional Breakpoint..."), 'editor.debug.action.conditionalBreakpoint')); breakpointsMenu.append(this.createMenuItem(nls.localize({ key: 'miColumnBreakpoint', comment: ['&& denotes a mnemonic'] }, "C&&olumn Breakpoint"), 'editor.debug.action.toggleColumnBreakpoint')); @@ -875,6 +876,7 @@ export class CodeMenu { continueAction, __separator__(), toggleBreakpoint, + disableBreakpoint, newBreakpoints, enableAllBreakpoints, disableAllBreakpoints, diff --git a/src/vs/workbench/parts/debug/browser/debugCommands.ts b/src/vs/workbench/parts/debug/browser/debugCommands.ts index 98653f91eec..e6bc9e67dea 100644 --- a/src/vs/workbench/parts/debug/browser/debugCommands.ts +++ b/src/vs/workbench/parts/debug/browser/debugCommands.ts @@ -44,6 +44,29 @@ export function registerCommands(): void { } }); + KeybindingsRegistry.registerCommandAndKeybindingRule({ + id: 'debug.disableBreakpoint', + weight: KeybindingsRegistry.WEIGHT.workbenchContrib(), + primary: KeyMod.CtrlCmd | KeyMod.Alt | KeyCode.KEY_D, + when: EditorContextKeys.editorTextFocus, + handler: (accessor) => { + const debugService = accessor.get(IDebugService); + const editorService = accessor.get(IWorkbenchEditorService); + const editor = editorService.getActiveEditor(); + const control = editor.getControl(); + + if (control) { + const position = control.getPosition(); + const modelUri = control.getModel().uri; + const bp = debugService.getModel().getBreakpoints() + .filter(bp => bp.lineNumber === position.lineNumber, bp => bp.column === position.column && bp.uri.toString() === modelUri.toString()).pop(); + if (bp && bp.enabled) { + debugService.enableOrDisableBreakpoints(!bp.enabled, bp).done(null, errors.onUnexpectedError); + } + } + } + }); + KeybindingsRegistry.registerCommandAndKeybindingRule({ id: 'debug.renameWatchExpression', weight: KeybindingsRegistry.WEIGHT.workbenchContrib(5), From 63eb8f20fd0806de8972dad8dd30ea36e2e8591f Mon Sep 17 00:00:00 2001 From: Koji Murata Date: Tue, 3 Apr 2018 11:06:20 +0900 Subject: [PATCH 005/830] ReindentSelectedLinesAction --- .../editor/contrib/indentation/indentation.ts | 44 +++++++++++++++++++ 1 file changed, 44 insertions(+) diff --git a/src/vs/editor/contrib/indentation/indentation.ts b/src/vs/editor/contrib/indentation/indentation.ts index 3ca805ebfad..dd3ed47ec6a 100644 --- a/src/vs/editor/contrib/indentation/indentation.ts +++ b/src/vs/editor/contrib/indentation/indentation.ts @@ -327,6 +327,49 @@ export class ReindentLinesAction extends EditorAction { } } +export class ReindentSelectedLinesAction extends EditorAction { + constructor() { + super({ + id: 'editor.action.reindentselectedlines', + label: nls.localize('editor.reindentselectedlines', "Reindent Selected Lines"), + alias: 'Reindent Selected Lines', + precondition: EditorContextKeys.writable + }); + } + + public run(accessor: ServicesAccessor, editor: ICodeEditor): void { + let model = editor.getModel(); + if (!model) { + return; + } + let edits: IIdentifiedSingleEditOperation[] = []; + + for (let selection of editor.getSelections()) { + console.log(selection); + let startLineNumber = selection.startLineNumber; + let endLineNumber = selection.endLineNumber; + if (startLineNumber !== endLineNumber && selection.endColumn === 1) { + endLineNumber--; + } + if (startLineNumber === 1) { + if (startLineNumber === endLineNumber) { continue; } + } else { + startLineNumber--; + } + let editOperations = getReindentEditOperations(model, startLineNumber, endLineNumber) || []; + for (let editOp of editOperations) { + edits.push(editOp); + } + } + + if (edits) { + editor.pushUndoStop(); + editor.executeEdits(this.id, edits); + editor.pushUndoStop(); + } + } +} + export class AutoIndentOnPasteCommand implements ICommand { private _edits: TextEdit[]; @@ -649,3 +692,4 @@ registerEditorAction(IndentUsingTabs); registerEditorAction(IndentUsingSpaces); registerEditorAction(DetectIndentation); registerEditorAction(ReindentLinesAction); +registerEditorAction(ReindentSelectedLinesAction); \ No newline at end of file From 92010980b2cafd886d6056d244a13070d463d809 Mon Sep 17 00:00:00 2001 From: Koji Murata Date: Tue, 3 Apr 2018 11:11:04 +0900 Subject: [PATCH 006/830] remove debug log --- src/vs/editor/contrib/indentation/indentation.ts | 1 - 1 file changed, 1 deletion(-) diff --git a/src/vs/editor/contrib/indentation/indentation.ts b/src/vs/editor/contrib/indentation/indentation.ts index dd3ed47ec6a..4e293d8ce18 100644 --- a/src/vs/editor/contrib/indentation/indentation.ts +++ b/src/vs/editor/contrib/indentation/indentation.ts @@ -345,7 +345,6 @@ export class ReindentSelectedLinesAction extends EditorAction { let edits: IIdentifiedSingleEditOperation[] = []; for (let selection of editor.getSelections()) { - console.log(selection); let startLineNumber = selection.startLineNumber; let endLineNumber = selection.endLineNumber; if (startLineNumber !== endLineNumber && selection.endColumn === 1) { From d1371dfbfc246bc41943aac4434a7a10005f8c18 Mon Sep 17 00:00:00 2001 From: Peng Lyu Date: Tue, 17 Apr 2018 15:00:16 -0700 Subject: [PATCH 007/830] tiny changes. --- src/vs/editor/contrib/indentation/indentation.ts | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) diff --git a/src/vs/editor/contrib/indentation/indentation.ts b/src/vs/editor/contrib/indentation/indentation.ts index 4e293d8ce18..6cbbc22822b 100644 --- a/src/vs/editor/contrib/indentation/indentation.ts +++ b/src/vs/editor/contrib/indentation/indentation.ts @@ -342,26 +342,30 @@ export class ReindentSelectedLinesAction extends EditorAction { if (!model) { return; } + let edits: IIdentifiedSingleEditOperation[] = []; for (let selection of editor.getSelections()) { let startLineNumber = selection.startLineNumber; let endLineNumber = selection.endLineNumber; + if (startLineNumber !== endLineNumber && selection.endColumn === 1) { endLineNumber--; } + if (startLineNumber === 1) { - if (startLineNumber === endLineNumber) { continue; } + if (startLineNumber === endLineNumber) { + continue; + } } else { startLineNumber--; } + let editOperations = getReindentEditOperations(model, startLineNumber, endLineNumber) || []; - for (let editOp of editOperations) { - edits.push(editOp); - } + edits.push(...editOperations); } - if (edits) { + if (edits.length > 0) { editor.pushUndoStop(); editor.executeEdits(this.id, edits); editor.pushUndoStop(); From 7d29048eebec80f218b9e3b02a70a32789f61b97 Mon Sep 17 00:00:00 2001 From: Jason Liu Date: Sun, 22 Apr 2018 21:35:49 +0800 Subject: [PATCH 008/830] Update cshtml.tmLanguage.json --- .../razor/syntaxes/cshtml.tmLanguage.json | 293 +++++++++++++++++- 1 file changed, 292 insertions(+), 1 deletion(-) diff --git a/extensions/razor/syntaxes/cshtml.tmLanguage.json b/extensions/razor/syntaxes/cshtml.tmLanguage.json index 2995e473ee0..043e6e3b493 100644 --- a/extensions/razor/syntaxes/cshtml.tmLanguage.json +++ b/extensions/razor/syntaxes/cshtml.tmLanguage.json @@ -120,6 +120,297 @@ "end": "(\\))", "comments": "Covers same line Razor statments with embedded C#" }, + { + "begin": "(^[ \\t]+)?(?=<(?i:script))", + "beginCaptures": { + "1": { + "name": "punctuation.whitespace.embedded.leading.html" + } + }, + "end": "(?!\\G)([ \\t]*$\\n?)?", + "endCaptures": { + "1": { + "name": "punctuation.whitespace.embedded.trailing.html" + } + }, + "patterns": [ + { + "begin": "(<)((?i:script))\\b", + "beginCaptures": { + "0": { + "name": "meta.tag.metadata.script.html" + }, + "1": { + "name": "punctuation.definition.tag.begin.html" + }, + "2": { + "name": "entity.name.tag.html" + } + }, + "end": "(/>)|(/)((?i:script))(>)", + "endCaptures": { + "0": { + "name": "meta.tag.metadata.script.html" + }, + "1": { + "name": "punctuation.definition.tag.end.html" + }, + "2": { + "name": "punctuation.definition.tag.begin.html" + }, + "3": { + "name": "entity.name.tag.html" + }, + "4": { + "name": "punctuation.definition.tag.end.html" + } + }, + "name": "meta.embedded.block.html", + "patterns": [ + { + "begin": "\\G", + "end": "(?=/>|/)", + "patterns": [ + { + "begin": "(>)", + "beginCaptures": { + "0": { + "name": "meta.tag.metadata.script.html" + }, + "1": { + "name": "punctuation.definition.tag.end.html" + } + }, + "end": "((<))(?=/(?i:script))", + "endCaptures": { + "0": { + "name": "meta.tag.metadata.script.html" + }, + "1": { + "name": "punctuation.definition.tag.begin.html" + }, + "2": { + "name": "source.js" + } + }, + "patterns": [ + { + "begin": "\\G", + "end": "(?=|type(?=[\\s=])(?!\\s*=\\s*('|\"|)(text/(javascript|ecmascript|babel)|application/((x-)?javascript|ecmascript|babel)|module)[\\s\"'>])))", + "name": "meta.tag.metadata.script.html", + "patterns": [ + { + "include": "#tag-stuff" + } + ] + }, + { + "begin": "(?=(?i:type\\s*=\\s*('|\"|)(text/(x-handlebars|(x-(handlebars-)?|ng-)?template|html)[\\s\"'>])))", + "end": "((<))(?=/(?i:script))", + "endCaptures": { + "0": { + "name": "meta.tag.metadata.script.html" + }, + "1": { + "name": "punctuation.definition.tag.begin.html" + }, + "2": { + "name": "text.html.cshtml" + } + }, + "patterns": [ + { + "begin": "\\G", + "end": "(>)|(?=/>)", + "endCaptures": { + "1": { + "name": "punctuation.definition.tag.end.html" + } + }, + "name": "meta.tag.metadata.script.html", + "patterns": [ + { + "include": "#tag-stuff" + } + ] + }, + { + "begin": "(?!\\G)", + "end": "(?=)|(?=/>)", + "endCaptures": { + "1": { + "name": "punctuation.definition.tag.end.html" + } + }, + "name": "meta.tag.metadata.script.html", + "patterns": [ + { + "include": "#tag-stuff" + } + ] + }, + { + "begin": "(?!\\G)", + "end": "(?=)|((<)/)((?i:style))(>)", + "endCaptures": { + "0": { + "name": "meta.tag.metadata.style.html" + }, + "1": { + "name": "punctuation.definition.tag.end.html" + }, + "2": { + "name": "punctuation.definition.tag.begin.html" + }, + "3": { + "name": "source.css" + }, + "4": { + "name": "entity.name.tag.html" + }, + "5": { + "name": "punctuation.definition.tag.end.html" + } + }, + "name": "meta.embedded.block.html", + "patterns": [ + { + "begin": "\\G", + "captures": { + "1": { + "name": "punctuation.definition.tag.end.html" + } + }, + "end": "(?=/>)|(>)", + "name": "meta.tag.metadata.style.html", + "patterns": [ + { + "include": "#tag-stuff" + } + ] + }, + { + "begin": "(?!\\G)", + "end": "(?= Date: Sun, 22 Apr 2018 21:36:27 +0800 Subject: [PATCH 009/830] Update package.json --- extensions/razor/package.json | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/extensions/razor/package.json b/extensions/razor/package.json index 2fef3415689..f4432ee986d 100644 --- a/extensions/razor/package.json +++ b/extensions/razor/package.json @@ -23,7 +23,9 @@ "scopeName": "text.html.cshtml", "path": "./syntaxes/cshtml.tmLanguage.json", "embeddedLanguages": { - "section.embedded.source.cshtml": "csharp" + "section.embedded.source.cshtml": "csharp", + "source.css": "css", + "source.js": "javascript" } }] } From 6217260bf9c9f43d0c0ec78f5f267ec41a0f6540 Mon Sep 17 00:00:00 2001 From: Marco Beltempo Date: Mon, 23 Apr 2018 12:49:11 -0400 Subject: [PATCH 010/830] Remove disableBreakpoint from global menu --- src/vs/code/electron-main/menus.ts | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/vs/code/electron-main/menus.ts b/src/vs/code/electron-main/menus.ts index 1e3dcd0648f..442e70d33c9 100644 --- a/src/vs/code/electron-main/menus.ts +++ b/src/vs/code/electron-main/menus.ts @@ -850,7 +850,6 @@ export class CodeMenu { const continueAction = this.createMenuItem(nls.localize({ key: 'miContinue', comment: ['&& denotes a mnemonic'] }, "&&Continue"), 'workbench.action.debug.continue'); const toggleBreakpoint = this.createMenuItem(nls.localize({ key: 'miToggleBreakpoint', comment: ['&& denotes a mnemonic'] }, "Toggle &&Breakpoint"), 'editor.debug.action.toggleBreakpoint'); - const disableBreakpoint = this.createMenuItem(nls.localize({ key: 'miDisableBreakpoint', comment: ['&& denotes a mnemonic'] }, "Disable &&Breakpoint"), 'debug.disableBreakpoint'); const breakpointsMenu = new Menu(); breakpointsMenu.append(this.createMenuItem(nls.localize({ key: 'miConditionalBreakpoint', comment: ['&& denotes a mnemonic'] }, "&&Conditional Breakpoint..."), 'editor.debug.action.conditionalBreakpoint')); breakpointsMenu.append(this.createMenuItem(nls.localize({ key: 'miColumnBreakpoint', comment: ['&& denotes a mnemonic'] }, "C&&olumn Breakpoint"), 'editor.debug.action.toggleColumnBreakpoint')); @@ -876,7 +875,6 @@ export class CodeMenu { continueAction, __separator__(), toggleBreakpoint, - disableBreakpoint, newBreakpoints, enableAllBreakpoints, disableAllBreakpoints, From 055745dc1c2909412695b41803c4452a90b2fba0 Mon Sep 17 00:00:00 2001 From: Marco Beltempo Date: Mon, 23 Apr 2018 12:58:04 -0400 Subject: [PATCH 011/830] Command can now enable/disable a breakpoint. Removed default keybinding. --- src/vs/workbench/parts/debug/browser/debugCommands.ts | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/vs/workbench/parts/debug/browser/debugCommands.ts b/src/vs/workbench/parts/debug/browser/debugCommands.ts index e6bc9e67dea..8ecd60bb741 100644 --- a/src/vs/workbench/parts/debug/browser/debugCommands.ts +++ b/src/vs/workbench/parts/debug/browser/debugCommands.ts @@ -45,9 +45,9 @@ export function registerCommands(): void { }); KeybindingsRegistry.registerCommandAndKeybindingRule({ - id: 'debug.disableBreakpoint', + id: 'debug.enableOrDisableBreakpoint', weight: KeybindingsRegistry.WEIGHT.workbenchContrib(), - primary: KeyMod.CtrlCmd | KeyMod.Alt | KeyCode.KEY_D, + primary: undefined, when: EditorContextKeys.editorTextFocus, handler: (accessor) => { const debugService = accessor.get(IDebugService); @@ -60,7 +60,7 @@ export function registerCommands(): void { const modelUri = control.getModel().uri; const bp = debugService.getModel().getBreakpoints() .filter(bp => bp.lineNumber === position.lineNumber, bp => bp.column === position.column && bp.uri.toString() === modelUri.toString()).pop(); - if (bp && bp.enabled) { + if (bp) { debugService.enableOrDisableBreakpoints(!bp.enabled, bp).done(null, errors.onUnexpectedError); } } From 36c5c3124a38059be5a1dd0448841d838f0e2bc5 Mon Sep 17 00:00:00 2001 From: Johannes Rieken Date: Tue, 24 Apr 2018 17:50:21 +0200 Subject: [PATCH 012/830] argument names, #48527 --- src/vs/vscode.d.ts | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/vs/vscode.d.ts b/src/vs/vscode.d.ts index 2f09e079a4f..74288c8cf84 100644 --- a/src/vs/vscode.d.ts +++ b/src/vs/vscode.d.ts @@ -5048,11 +5048,11 @@ declare module 'vscode' { * Copy files or folders. Implementing this function is optional but it will speedup * the copy operation. * - * @param uri The existing file or folder. - * @param target The target location. + * @param source The existing file or folder. + * @param destination The destination location. * @param token A cancellation token. */ - copy?(uri: Uri, target: Uri, options: FileOptions, token: CancellationToken): FileStat | Thenable; + copy?(source: Uri, destination: Uri, options: FileOptions, token: CancellationToken): FileStat | Thenable; } /** From 0f78eb2d71e3d82a4435ba23c0f41cfe52e5a10b Mon Sep 17 00:00:00 2001 From: Johannes Rieken Date: Tue, 24 Apr 2018 18:29:41 +0200 Subject: [PATCH 013/830] fix #48550 --- src/vs/workbench/api/node/extHostFileSystem.ts | 17 ++++++++++++----- 1 file changed, 12 insertions(+), 5 deletions(-) diff --git a/src/vs/workbench/api/node/extHostFileSystem.ts b/src/vs/workbench/api/node/extHostFileSystem.ts index 1c7356f967b..fbf7724536a 100644 --- a/src/vs/workbench/api/node/extHostFileSystem.ts +++ b/src/vs/workbench/api/node/extHostFileSystem.ts @@ -245,12 +245,19 @@ export class ExtHostFileSystem implements ExtHostFileSystemShape { }; } + private static _asIStat(stat: vscode.FileStat): files.IStat { + const { isFile, isDirectory, isSymbolicLink, mtime, size } = stat; + return { isFile, isDirectory, isSymbolicLink, mtime, size }; + } + $stat(handle: number, resource: UriComponents): TPromise { - return asWinJsPromise(token => this._fsProvider.get(handle).stat(URI.revive(resource), {}, token)); + return asWinJsPromise(token => this._fsProvider.get(handle).stat(URI.revive(resource), {}, token)).then(ExtHostFileSystem._asIStat); } $readdir(handle: number, resource: UriComponents): TPromise<[string, files.IStat][], any> { - return asWinJsPromise(token => this._fsProvider.get(handle).readDirectory(URI.revive(resource), {}, token)); + return asWinJsPromise(token => this._fsProvider.get(handle).readDirectory(URI.revive(resource), {}, token)).then(tuples => { + return tuples.map(([name, stat]) => <[string, files.IStat]>[name, ExtHostFileSystem._asIStat(stat)]); + }); } $readFile(handle: number, resource: UriComponents, opts: files.FileOptions): TPromise { @@ -270,15 +277,15 @@ export class ExtHostFileSystem implements ExtHostFileSystemShape { } $rename(handle: number, oldUri: UriComponents, newUri: UriComponents, opts: files.FileOptions): TPromise { - return asWinJsPromise(token => this._fsProvider.get(handle).rename(URI.revive(oldUri), URI.revive(newUri), opts, token)); + return asWinJsPromise(token => this._fsProvider.get(handle).rename(URI.revive(oldUri), URI.revive(newUri), opts, token)).then(ExtHostFileSystem._asIStat); } $copy(handle: number, oldUri: UriComponents, newUri: UriComponents, opts: files.FileOptions): TPromise { - return asWinJsPromise(token => this._fsProvider.get(handle).copy(URI.revive(oldUri), URI.revive(newUri), opts, token)); + return asWinJsPromise(token => this._fsProvider.get(handle).copy(URI.revive(oldUri), URI.revive(newUri), opts, token)).then(ExtHostFileSystem._asIStat); } $mkdir(handle: number, resource: UriComponents): TPromise { - return asWinJsPromise(token => this._fsProvider.get(handle).createDirectory(URI.revive(resource), {}, token)); + return asWinJsPromise(token => this._fsProvider.get(handle).createDirectory(URI.revive(resource), {}, token)).then(ExtHostFileSystem._asIStat); } $watch(handle: number, session: number, resource: UriComponents, opts: files.IWatchOptions): void { From 9cab59b32f5a6c8fc479d93db12e11c715eba7a6 Mon Sep 17 00:00:00 2001 From: Daniel Imms Date: Tue, 24 Apr 2018 11:06:57 -0700 Subject: [PATCH 014/830] Document Terminal.onData API Fixes #48516 --- src/vs/vscode.proposed.d.ts | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/vs/vscode.proposed.d.ts b/src/vs/vscode.proposed.d.ts index fee4fe35746..51cbbd456ff 100644 --- a/src/vs/vscode.proposed.d.ts +++ b/src/vs/vscode.proposed.d.ts @@ -430,6 +430,11 @@ declare module 'vscode' { //#region Terminal export interface Terminal { + /** + * Fires when the terminal's pty slave pseudo-device is written to. In other words, this is + * provides access to the raw data stream from the process running within the terminal, + * including ANSI sequences. + */ onData: Event; } From 63fd9f4ded547b7e7dd8b204c65c0f54a60eb35d Mon Sep 17 00:00:00 2001 From: Daniel Imms Date: Tue, 24 Apr 2018 11:07:37 -0700 Subject: [PATCH 015/830] Fix typo --- src/vs/vscode.proposed.d.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/vs/vscode.proposed.d.ts b/src/vs/vscode.proposed.d.ts index 51cbbd456ff..4194828c2b4 100644 --- a/src/vs/vscode.proposed.d.ts +++ b/src/vs/vscode.proposed.d.ts @@ -431,7 +431,7 @@ declare module 'vscode' { export interface Terminal { /** - * Fires when the terminal's pty slave pseudo-device is written to. In other words, this is + * Fires when the terminal's pty slave pseudo-device is written to. In other words, this * provides access to the raw data stream from the process running within the terminal, * including ANSI sequences. */ From bb77f586648e23b369168800acdf4693c152cc7f Mon Sep 17 00:00:00 2001 From: Andre Weinand Date: Tue, 24 Apr 2018 20:30:50 +0200 Subject: [PATCH 016/830] Revert "eh debug: Do not end process on initial attach" This reverts commit 4cce36adf59fbc0f950d608ca187949ac768913c. --- .../parts/debug/electron-browser/debugService.ts | 12 +++--------- 1 file changed, 3 insertions(+), 9 deletions(-) diff --git a/src/vs/workbench/parts/debug/electron-browser/debugService.ts b/src/vs/workbench/parts/debug/electron-browser/debugService.ts index d666b3aad27..26b39c756e1 100644 --- a/src/vs/workbench/parts/debug/electron-browser/debugService.ts +++ b/src/vs/workbench/parts/debug/electron-browser/debugService.ts @@ -154,17 +154,11 @@ export class DebugService implements debug.IDebugService { const session = process.session; if (broadcast.channel === EXTENSION_ATTACH_BROADCAST_CHANNEL) { - const initialAttach = process.configuration.request === 'launch'; + this.onSessionEnd(session); + process.configuration.request = 'attach'; process.configuration.port = broadcast.payload.port; - // Do not end process on initial attach (since the request is still 'launch') - if (initialAttach) { - session.attach(process.configuration); - } else { - this.onSessionEnd(session); - this.doCreateProcess(process.session.root, process.configuration, process.getId()); - } - + this.doCreateProcess(process.session.root, process.configuration, process.getId()); return; } From 3936999a16876cb5c2bfdc33bc89b42a9e647ecc Mon Sep 17 00:00:00 2001 From: Matt Bierner Date: Tue, 24 Apr 2018 13:47:12 -0700 Subject: [PATCH 017/830] onDidChangeDiagnostics is now stable, don't check proposed Fixes #48591 --- src/vs/workbench/api/node/extHost.api.impl.ts | 1 - 1 file changed, 1 deletion(-) diff --git a/src/vs/workbench/api/node/extHost.api.impl.ts b/src/vs/workbench/api/node/extHost.api.impl.ts index 2ce97028827..ee6e7186c07 100644 --- a/src/vs/workbench/api/node/extHost.api.impl.ts +++ b/src/vs/workbench/api/node/extHost.api.impl.ts @@ -240,7 +240,6 @@ export function createApiFactory( return extHostDiagnostics.createDiagnosticCollection(name); }, get onDidChangeDiagnostics() { - checkProposedApiEnabled(extension); return extHostDiagnostics.onDidChangeDiagnostics; }, getDiagnostics: (resource?) => { From c9e4724226c6ba605396bb4bf1f5d9f5a56611cb Mon Sep 17 00:00:00 2001 From: Andre Weinand Date: Wed, 25 Apr 2018 00:22:45 +0200 Subject: [PATCH 018/830] node-debug@1.23.3 --- build/builtInExtensions.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build/builtInExtensions.json b/build/builtInExtensions.json index 2d610acc638..8c0c4de5120 100644 --- a/build/builtInExtensions.json +++ b/build/builtInExtensions.json @@ -1,7 +1,7 @@ [ { "name": "ms-vscode.node-debug", - "version": "1.23.2", + "version": "1.23.3", "repo": "https://github.com/Microsoft/vscode-node-debug" }, { From 5006f7aea757a64d717ea92095ac035a37103cdb Mon Sep 17 00:00:00 2001 From: Matt Bierner Date: Tue, 24 Apr 2018 13:52:16 -0700 Subject: [PATCH 019/830] Update js/ts grammars --- .../syntaxes/JavaScript.tmLanguage.json | 123 +++++++++++------- .../syntaxes/JavaScriptReact.tmLanguage.json | 123 +++++++++++------- .../syntaxes/TypeScript.tmLanguage.json | 123 +++++++++++------- .../syntaxes/TypeScriptReact.tmLanguage.json | 123 +++++++++++------- 4 files changed, 312 insertions(+), 180 deletions(-) diff --git a/extensions/javascript/syntaxes/JavaScript.tmLanguage.json b/extensions/javascript/syntaxes/JavaScript.tmLanguage.json index e214a676dc6..fa4961af3e5 100644 --- a/extensions/javascript/syntaxes/JavaScript.tmLanguage.json +++ b/extensions/javascript/syntaxes/JavaScript.tmLanguage.json @@ -4,7 +4,7 @@ "If you want to provide a fix or improvement, please create a pull request against the original repository.", "Once accepted there, we are happy to receive an update request." ], - "version": "https://github.com/Microsoft/TypeScript-TmLanguage/commit/fefa94101ef0114b95d3e14493051ebf5ec70c7c", + "version": "https://github.com/Microsoft/TypeScript-TmLanguage/commit/ee1eb6f2d995b662dc2759a2636ae64aa952c0ba", "name": "JavaScript (with React support)", "scopeName": "source.js", "patterns": [ @@ -391,7 +391,7 @@ "include": "#comment" }, { - "begin": "(?=(([_$[:alpha:]][_$[:alnum:]]*)|(\\'([^\\'\\\\]|\\\\\\'|\\\\)*\\')|(\\\"([^\\\"\\\\]|\\\\\\\"|\\\\)*\\\")|(\\[([^\\[\\]]|\\[[^\\[\\]]*\\])+\\]))\\s*(:))", + "begin": "(?x)(?=((\\b(? Date: Tue, 24 Apr 2018 13:57:52 -0700 Subject: [PATCH 020/830] Fix possible exception when using snippets in ts completions --- .../src/features/completionItemProvider.ts | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/extensions/typescript-language-features/src/features/completionItemProvider.ts b/extensions/typescript-language-features/src/features/completionItemProvider.ts index 6b155ccfdd2..da0144c864c 100644 --- a/extensions/typescript-language-features/src/features/completionItemProvider.ts +++ b/extensions/typescript-language-features/src/features/completionItemProvider.ts @@ -519,7 +519,11 @@ export default class TypeScriptCompletionItemProvider implements vscode.Completi const snippet = new vscode.SnippetString(); const methodName = detail.displayParts.find(part => part.kind === 'methodName'); - snippet.appendText((item.insertText as string) || (methodName && methodName.text) || item.label); + if (item.insertText) { + snippet.appendText(typeof item.insertText === 'string' ? item.insertText : item.insertText.value); + } else { + snippet.appendText((methodName && methodName.text) || item.label); + } snippet.appendText('('); let parenCount = 0; From 3d055f3189daf75ff00d29a900ce9bfd7378db5d Mon Sep 17 00:00:00 2001 From: Matt Bierner Date: Tue, 24 Apr 2018 15:38:36 -0700 Subject: [PATCH 021/830] Fix codeActionsOnSave description Fixes #48557 --- src/vs/editor/common/config/commonEditorConfig.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/vs/editor/common/config/commonEditorConfig.ts b/src/vs/editor/common/config/commonEditorConfig.ts index 035f47aa206..75efeb0c4c3 100644 --- a/src/vs/editor/common/config/commonEditorConfig.ts +++ b/src/vs/editor/common/config/commonEditorConfig.ts @@ -664,7 +664,7 @@ const editorConfiguration: IConfigurationNode = { 'type': 'boolean' }, 'default': EDITOR_DEFAULTS.contribInfo.codeActionsOnSave, - 'description': nls.localize('codeActionsOnSave', "Code actions kinds to be run on save.") + 'description': nls.localize('codeActionsOnSave', "Code action kinds to be run on save.") }, 'editor.codeActionsOnSaveTimeout': { 'type': 'number', From b67472bae04d5bab892963c344522de03dcd939e Mon Sep 17 00:00:00 2001 From: Matt Bierner Date: Tue, 24 Apr 2018 15:53:37 -0700 Subject: [PATCH 022/830] Rephrase some webview docs Fixes #48593 --- src/vs/vscode.d.ts | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/vs/vscode.d.ts b/src/vs/vscode.d.ts index 74288c8cf84..cce35a0cd08 100644 --- a/src/vs/vscode.d.ts +++ b/src/vs/vscode.d.ts @@ -5119,15 +5119,15 @@ declare module 'vscode' { */ export interface WebviewPanelOptions { /** - * Should the find widget be enabled in the panel? + * Controls if the find widget is enabled in the panel. * * Defaults to false. */ readonly enableFindWidget?: boolean; /** - * Should the webview panel's content (iframe) be kept around even when the panel - * is no longer visible? + * 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 is hidden. Extensions that have complex state From 29893748826d62dcd62aace58899f4af9276dd33 Mon Sep 17 00:00:00 2001 From: Rachel Macfarlane Date: Tue, 24 Apr 2018 16:08:25 -0700 Subject: [PATCH 023/830] Extensions list in issue reporter should be sorted in a case insensitive way, fixes #48614 --- src/vs/code/electron-browser/issue/issueReporterMain.ts | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/vs/code/electron-browser/issue/issueReporterMain.ts b/src/vs/code/electron-browser/issue/issueReporterMain.ts index 0c7ffd60be7..72c46ded2cb 100644 --- a/src/vs/code/electron-browser/issue/issueReporterMain.ts +++ b/src/vs/code/electron-browser/issue/issueReporterMain.ts @@ -800,11 +800,13 @@ export class IssueReporter extends Disposable { // Sort extensions by name extensionOptions.sort((a, b) => { - if (a.name > b.name) { + const aName = a.name.toLowerCase(); + const bName = b.name.toLowerCase(); + if (aName > bName) { return 1; } - if (a.name < b.name) { + if (aName < bName) { return -1; } From 568b1c49d47b8f2c2f347c7b73ecba194e6a8da1 Mon Sep 17 00:00:00 2001 From: Matt Bierner Date: Tue, 24 Apr 2018 16:51:55 -0700 Subject: [PATCH 024/830] More webview rephrasing Fixes #48593 --- src/vs/vscode.d.ts | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/vs/vscode.d.ts b/src/vs/vscode.d.ts index cce35a0cd08..d6c1d38cef0 100644 --- a/src/vs/vscode.d.ts +++ b/src/vs/vscode.d.ts @@ -5060,14 +5060,14 @@ declare module 'vscode' { */ export interface WebviewOptions { /** - * Should scripts be enabled in the webview content? + * Controls whether scripts are enabled in the webview content or not. * * Defaults to false (scripts-disabled). */ readonly enableScripts?: boolean; /** - * Should command uris be enabled in webview content? + * Controls whether command uris are enabled in webview content or not. * * Defaults to false. */ @@ -5147,7 +5147,7 @@ declare module 'vscode' { */ interface WebviewPanel { /** - * Type of the webview panel, such as `'markdown.preview'`. + * Identifies the type of the webview panel, such as `'markdown.preview'`. */ readonly viewType: string; From 1e7095ee31bf0aeb20317de4ca2676fddc3627c9 Mon Sep 17 00:00:00 2001 From: Matt Bierner Date: Tue, 24 Apr 2018 17:10:45 -0700 Subject: [PATCH 025/830] Make sure we rehydrate uri in resolve rename location Fixes #48592 --- src/vs/workbench/api/node/extHostLanguageFeatures.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/vs/workbench/api/node/extHostLanguageFeatures.ts b/src/vs/workbench/api/node/extHostLanguageFeatures.ts index 708a8059d54..2a7c092734d 100644 --- a/src/vs/workbench/api/node/extHostLanguageFeatures.ts +++ b/src/vs/workbench/api/node/extHostLanguageFeatures.ts @@ -1116,7 +1116,7 @@ export class ExtHostLanguageFeatures implements ExtHostLanguageFeaturesShape { } $resolveRenameLocation(handle: number, resource: URI, position: IPosition): TPromise { - return this._withAdapter(handle, RenameAdapter, adapter => adapter.resolveRenameLocation(resource, position)); + return this._withAdapter(handle, RenameAdapter, adapter => adapter.resolveRenameLocation(URI.revive(resource), position)); } // --- suggestion From 4832deb1b44c56ceeacb23b84e10fe37e531624a Mon Sep 17 00:00:00 2001 From: Matt Bierner Date: Tue, 24 Apr 2018 17:17:16 -0700 Subject: [PATCH 026/830] Fix snippetForFunctionCall if called with already resolve item --- .../src/features/completionItemProvider.ts | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/extensions/typescript-language-features/src/features/completionItemProvider.ts b/extensions/typescript-language-features/src/features/completionItemProvider.ts index da0144c864c..803342d7ffa 100644 --- a/extensions/typescript-language-features/src/features/completionItemProvider.ts +++ b/extensions/typescript-language-features/src/features/completionItemProvider.ts @@ -520,7 +520,11 @@ export default class TypeScriptCompletionItemProvider implements vscode.Completi const snippet = new vscode.SnippetString(); const methodName = detail.displayParts.find(part => part.kind === 'methodName'); if (item.insertText) { - snippet.appendText(typeof item.insertText === 'string' ? item.insertText : item.insertText.value); + if (typeof item.insertText === 'string') { + snippet.appendText(item.insertText); + } else { + return item.insertText; + } } else { snippet.appendText((methodName && methodName.text) || item.label); } From 9ceaf07eed820ecd1aba6cec302bc0d880ccded1 Mon Sep 17 00:00:00 2001 From: Daniel Imms Date: Tue, 24 Apr 2018 17:33:29 -0700 Subject: [PATCH 027/830] Fire onDidOpenTerminal event for split terminals Fixes #48510 --- .../parts/terminal/electron-browser/terminalService.ts | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/vs/workbench/parts/terminal/electron-browser/terminalService.ts b/src/vs/workbench/parts/terminal/electron-browser/terminalService.ts index 1ee8373b643..d6279436f55 100644 --- a/src/vs/workbench/parts/terminal/electron-browser/terminalService.ts +++ b/src/vs/workbench/parts/terminal/electron-browser/terminalService.ts @@ -85,14 +85,15 @@ export class TerminalService extends AbstractTerminalService implements ITermina // It's the first instance so it should be made active automatically this.setActiveInstanceByIndex(0); } - this._onInstanceCreated.fire(instance); this._onInstancesChanged.fire(); this._suggestShellChange(wasNewTerminalAction); return instance; } public createInstance(terminalFocusContextKey: IContextKey, configHelper: ITerminalConfigHelper, container: HTMLElement, shellLaunchConfig: IShellLaunchConfig, doCreateProcess: boolean): ITerminalInstance { - return this._instantiationService.createInstance(TerminalInstance, terminalFocusContextKey, configHelper, container, shellLaunchConfig, true); + const instance = this._instantiationService.createInstance(TerminalInstance, terminalFocusContextKey, configHelper, container, shellLaunchConfig, true); + this._onInstanceCreated.fire(instance); + return instance; } public requestExtHostProcess(proxy: ITerminalProcessExtHostProxy, shellLaunchConfig: IShellLaunchConfig, cols: number, rows: number): void { From 36e6cbb7667e7874748d8fbf2021b743d2d90afc Mon Sep 17 00:00:00 2001 From: Rob Lourens Date: Tue, 24 Apr 2018 21:26:05 -0700 Subject: [PATCH 028/830] Bump node-debug2 --- build/builtInExtensions.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build/builtInExtensions.json b/build/builtInExtensions.json index 8c0c4de5120..c8c9057b592 100644 --- a/build/builtInExtensions.json +++ b/build/builtInExtensions.json @@ -6,7 +6,7 @@ }, { "name": "ms-vscode.node-debug2", - "version": "1.23.2", + "version": "1.23.4", "repo": "https://github.com/Microsoft/vscode-node-debug2" } ] From 7cf50421da1e698f59b6b0d5c5a126945b31d2c3 Mon Sep 17 00:00:00 2001 From: Joao Moreno Date: Tue, 24 Apr 2018 18:10:28 +0200 Subject: [PATCH 029/830] fixes #48211 --- extensions/git/src/git.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/extensions/git/src/git.ts b/extensions/git/src/git.ts index dc4829808b4..8505ff4b49a 100644 --- a/extensions/git/src/git.ts +++ b/extensions/git/src/git.ts @@ -1001,7 +1001,7 @@ export class Repository { } async pull(rebase?: boolean, remote?: string, branch?: string): Promise { - const args = ['pull']; + const args = ['pull', '--tags']; if (rebase) { args.push('-r'); From 2c49115cf5690687ea719f0a61511e20302be5e1 Mon Sep 17 00:00:00 2001 From: Sandeep Somavarapu Date: Wed, 25 Apr 2018 09:58:16 +0200 Subject: [PATCH 030/830] Fix #48573 --- src/vs/workbench/parts/markers/electron-browser/markersPanel.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/vs/workbench/parts/markers/electron-browser/markersPanel.ts b/src/vs/workbench/parts/markers/electron-browser/markersPanel.ts index 7c11d749c64..88f455d8cee 100644 --- a/src/vs/workbench/parts/markers/electron-browser/markersPanel.ts +++ b/src/vs/workbench/parts/markers/electron-browser/markersPanel.ts @@ -315,7 +315,7 @@ export class MarkersPanel extends Panel { const span1 = dom.append(container, dom.$('span')); span1.textContent = Messages.MARKERS_PANEL_NO_PROBLEMS_FILE_EXCLUSIONS_FILTER; const link = dom.append(container, dom.$('a.messageAction')); - link.textContent = localize('disableFilesExclude', "Disable Files Exclude."); + link.textContent = localize('disableFilesExclude', "Disable Files Exclude Filter."); link.setAttribute('tabIndex', '0'); dom.addDisposableListener(link, dom.EventType.CLICK, () => this.filterInputActionItem.useFilesExclude = false); } From 1fbff4ea95f621d76d4b5073e0f5414df198a873 Mon Sep 17 00:00:00 2001 From: Sandeep Somavarapu Date: Wed, 25 Apr 2018 10:35:51 +0200 Subject: [PATCH 031/830] Fix #48563 --- .../api/browser/viewsContainersExtensionPoint.ts | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/src/vs/workbench/api/browser/viewsContainersExtensionPoint.ts b/src/vs/workbench/api/browser/viewsContainersExtensionPoint.ts index 1cdced5ea47..9292757e1f6 100644 --- a/src/vs/workbench/api/browser/viewsContainersExtensionPoint.ts +++ b/src/vs/workbench/api/browser/viewsContainersExtensionPoint.ts @@ -42,7 +42,8 @@ const viewsContainerSchema: IJSONSchema = { properties: { id: { description: localize({ key: 'vscode.extension.contributes.views.containers.id', comment: ['Contribution refers to those that an extension contributes to VS Code through an extension/contribution point. '] }, "Unique id used to identify the container in which views can be contributed using 'views' contribution point"), - type: 'string' + type: 'string', + pattern: '^[a-zA-Z0-9_-]+$' }, label: { description: localize('vscode.extension.contributes.views.containers.title', 'Human readable string used to render the container'), @@ -104,7 +105,11 @@ class ViewsContainersExtensionHandler implements IWorkbenchContribution { for (let descriptor of viewsContainersDescriptors) { if (typeof descriptor.id !== 'string') { - collector.error(localize('requirestring', "property `{0}` is mandatory and must be of type `string`", 'id')); + collector.error(localize('requireidstring', "property `{0}` is mandatory and must be of type `string`. Allowed only alphanumeric letters, '_', '-'.", 'id')); + return false; + } + if (!(/^[a-z0-9_-]+$/i.test(descriptor.id))) { + collector.error(localize('requireidstring', "property `{0}` is mandatory and must be of type `string`. Allowed only alphanumeric letters, '_', '-'.", 'id')); return false; } if (typeof descriptor.title !== 'string') { From f6a0f9779ae26fe41a9c1cc2d9d83a874a65ce6e Mon Sep 17 00:00:00 2001 From: Sandeep Somavarapu Date: Wed, 25 Apr 2018 10:47:05 +0200 Subject: [PATCH 032/830] Fix #48582 --- src/vs/workbench/api/browser/viewsExtensionPoint.ts | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/src/vs/workbench/api/browser/viewsExtensionPoint.ts b/src/vs/workbench/api/browser/viewsExtensionPoint.ts index 2931cf6e8dd..f52c1e7dad5 100644 --- a/src/vs/workbench/api/browser/viewsExtensionPoint.ts +++ b/src/vs/workbench/api/browser/viewsExtensionPoint.ts @@ -101,7 +101,7 @@ function getViewLocation(value: string): ViewLocation { case 'explorer': return ViewLocation.Explorer; case 'debug': return ViewLocation.Debug; case 'scm': return ViewLocation.SCM; - default: return ViewLocation.get(`workbench.view.extension.${value}`) || ViewLocation.Explorer; + default: return ViewLocation.get(`workbench.view.extension.${value}`); } } @@ -115,7 +115,11 @@ ExtensionsRegistry.registerExtensionPoint<{ [loc: string]: schema.IUserFriendlyV return; } - const location = getViewLocation(entry.key); + let location = getViewLocation(entry.key); + if (!location) { + collector.warn(localize('ViewContainerDoesnotExist', "View container '{0}' does not exist and all views registered to it will be added to 'Explorer'.", entry.key)); + location = ViewLocation.Explorer; + } const registeredViews = ViewsRegistry.getViews(location); const viewIds = []; const viewDescriptors = coalesce(entry.value.map(item => { From de6972f5efad5517f5058fa1d6892693b49b97ef Mon Sep 17 00:00:00 2001 From: Sandeep Somavarapu Date: Wed, 25 Apr 2018 10:52:18 +0200 Subject: [PATCH 033/830] Fix #48583 --- .../api/browser/viewsContainersExtensionPoint.ts | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/vs/workbench/api/browser/viewsContainersExtensionPoint.ts b/src/vs/workbench/api/browser/viewsContainersExtensionPoint.ts index 9292757e1f6..3ffac39ecdd 100644 --- a/src/vs/workbench/api/browser/viewsContainersExtensionPoint.ts +++ b/src/vs/workbench/api/browser/viewsContainersExtensionPoint.ts @@ -56,8 +56,8 @@ const viewsContainerSchema: IJSONSchema = { } }; -export const viewsContainerContribution: IJSONSchema = { - description: localize('vscode.extension.contributes.viewsContainer', 'Contributes views containers to the editor'), +export const viewsContainersContribution: IJSONSchema = { + description: localize('vscode.extension.contributes.viewsContainers', 'Contributes views containers to the editor'), type: 'object', properties: { 'activitybar': { @@ -68,7 +68,7 @@ export const viewsContainerContribution: IJSONSchema = { } }; -export const viewsContainersExtensionPoint: IExtensionPoint<{ [loc: string]: IUserFriendlyViewsContainerDescriptor[] }> = ExtensionsRegistry.registerExtensionPoint<{ [loc: string]: IUserFriendlyViewsContainerDescriptor[] }>('viewsContainers', [], viewsContainerContribution); +export const viewsContainersExtensionPoint: IExtensionPoint<{ [loc: string]: IUserFriendlyViewsContainerDescriptor[] }> = ExtensionsRegistry.registerExtensionPoint<{ [loc: string]: IUserFriendlyViewsContainerDescriptor[] }>('viewsContainers', [], viewsContainersContribution); class ViewsContainersExtensionHandler implements IWorkbenchContribution { constructor() { @@ -80,7 +80,7 @@ class ViewsContainersExtensionHandler implements IWorkbenchContribution { for (let extension of extensions) { const { value, collector } = extension; if (!extension.description.enableProposedApi) { - collector.error(localize({ key: 'proposed', comment: ['Contribution refers to those that an extension contributes to VS Code through an extension/contribution point. '] }, "'viewsContainer' contribution is only available when running out of dev or with the following command line switch: --enable-proposed-api {0}", extension.description.id)); + collector.error(localize({ key: 'proposed', comment: ['Contribution refers to those that an extension contributes to VS Code through an extension/contribution point. '] }, "'viewsContainers' contribution is only available when running out of dev or with the following command line switch: --enable-proposed-api {0}", extension.description.id)); continue; } forEach(value, entry => { From bdb258dd5f86af6a29698090eae008607dba3d71 Mon Sep 17 00:00:00 2001 From: Sandeep Somavarapu Date: Wed, 25 Apr 2018 10:55:40 +0200 Subject: [PATCH 034/830] Fix #48629 --- src/vs/workbench/api/browser/viewsContainersExtensionPoint.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/vs/workbench/api/browser/viewsContainersExtensionPoint.ts b/src/vs/workbench/api/browser/viewsContainersExtensionPoint.ts index 3ffac39ecdd..85a1e5509c0 100644 --- a/src/vs/workbench/api/browser/viewsContainersExtensionPoint.ts +++ b/src/vs/workbench/api/browser/viewsContainersExtensionPoint.ts @@ -45,7 +45,7 @@ const viewsContainerSchema: IJSONSchema = { type: 'string', pattern: '^[a-zA-Z0-9_-]+$' }, - label: { + title: { description: localize('vscode.extension.contributes.views.containers.title', 'Human readable string used to render the container'), type: 'string' }, From 81766b6126e75d56a34142627dd225d6c88d97c7 Mon Sep 17 00:00:00 2001 From: isidor Date: Wed, 25 Apr 2018 11:19:20 +0200 Subject: [PATCH 035/830] Log Point -> Logpoint fixes #48611 --- src/vs/code/electron-main/menus.ts | 2 +- src/vs/workbench/parts/debug/browser/breakpointsView.ts | 4 ++-- src/vs/workbench/parts/debug/browser/debugEditorActions.ts | 4 ++-- .../parts/debug/electron-browser/debugEditorContribution.ts | 6 +++--- 4 files changed, 8 insertions(+), 8 deletions(-) diff --git a/src/vs/code/electron-main/menus.ts b/src/vs/code/electron-main/menus.ts index 8cc7ad73dd1..2b9cc41a2e7 100644 --- a/src/vs/code/electron-main/menus.ts +++ b/src/vs/code/electron-main/menus.ts @@ -854,7 +854,7 @@ export class CodeMenu { breakpointsMenu.append(this.createMenuItem(nls.localize({ key: 'miConditionalBreakpoint', comment: ['&& denotes a mnemonic'] }, "&&Conditional Breakpoint..."), 'editor.debug.action.conditionalBreakpoint')); breakpointsMenu.append(this.createMenuItem(nls.localize({ key: 'miColumnBreakpoint', comment: ['&& denotes a mnemonic'] }, "C&&olumn Breakpoint"), 'editor.debug.action.toggleColumnBreakpoint')); breakpointsMenu.append(this.createMenuItem(nls.localize({ key: 'miFunctionBreakpoint', comment: ['&& denotes a mnemonic'] }, "&&Function Breakpoint..."), 'workbench.debug.viewlet.action.addFunctionBreakpointAction')); - breakpointsMenu.append(this.createMenuItem(nls.localize({ key: 'miLogPoint', comment: ['&& denotes a mnemonic'] }, "&&Log Point..."), 'editor.debug.action.toggleLogPoint')); + breakpointsMenu.append(this.createMenuItem(nls.localize({ key: 'miLogPoint', comment: ['&& denotes a mnemonic'] }, "&&Logpoint..."), 'editor.debug.action.toggleLogPoint')); const newBreakpoints = new MenuItem({ label: this.mnemonicLabel(nls.localize({ key: 'miNewBreakpoint', comment: ['&& denotes a mnemonic'] }, "&&New Breakpoint")), submenu: breakpointsMenu }); const enableAllBreakpoints = this.createMenuItem(nls.localize({ key: 'miEnableAllBreakpoints', comment: ['&& denotes a mnemonic'] }, "Enable All Breakpoints"), 'workbench.debug.viewlet.action.enableAllBreakpoints'); const disableAllBreakpoints = this.createMenuItem(nls.localize({ key: 'miDisableAllBreakpoints', comment: ['&& denotes a mnemonic'] }, "Disable A&&ll Breakpoints"), 'workbench.debug.viewlet.action.disableAllBreakpoints'); diff --git a/src/vs/workbench/parts/debug/browser/breakpointsView.ts b/src/vs/workbench/parts/debug/browser/breakpointsView.ts index 3c7afd4f1f6..f4a1096b410 100644 --- a/src/vs/workbench/parts/debug/browser/breakpointsView.ts +++ b/src/vs/workbench/parts/debug/browser/breakpointsView.ts @@ -124,7 +124,7 @@ export class BreakpointsView extends ViewsViewletPanel { const actions: IAction[] = []; const element = e.element; - const breakpointType = element instanceof Breakpoint && element.logMessage ? nls.localize('logPoint', "Log Point") : nls.localize('breakpoint', "Breakpoint"); + const breakpointType = element instanceof Breakpoint && element.logMessage ? nls.localize('logPoint', "Logpoint") : nls.localize('breakpoint', "Breakpoint"); if (element instanceof Breakpoint || element instanceof FunctionBreakpoint) { actions.push(new Action('workbench.action.debug.openEditorAndEditBreakpoint', nls.localize('editBreakpoint', "Edit {0}...", breakpointType), undefined, true, () => { if (element instanceof Breakpoint) { @@ -594,7 +594,7 @@ export function getBreakpointMessageAndClassName(debugService: IDebugService, te if (process && breakpoint.condition && !process.session.capabilities.supportsLogPoints) { return { className: 'debug-breakpoint-unsupported', - message: nls.localize('logBreakpointUnsupported', "Log points not supported by this debug type"), + message: nls.localize('logBreakpointUnsupported', "Logpoints not supported by this debug type"), }; } diff --git a/src/vs/workbench/parts/debug/browser/debugEditorActions.ts b/src/vs/workbench/parts/debug/browser/debugEditorActions.ts index a8342fec394..d838c0e8e9f 100644 --- a/src/vs/workbench/parts/debug/browser/debugEditorActions.ts +++ b/src/vs/workbench/parts/debug/browser/debugEditorActions.ts @@ -74,8 +74,8 @@ class LogPointAction extends EditorAction { constructor() { super({ id: 'editor.debug.action.toggleLogPoint', - label: nls.localize('logPointEditorAction', "Debug: Add Log Point..."), - alias: 'Debug: Add Log Point...', + label: nls.localize('logPointEditorAction', "Debug: Add Logpoint..."), + alias: 'Debug: Add Logpoint...', precondition: null }); } diff --git a/src/vs/workbench/parts/debug/electron-browser/debugEditorContribution.ts b/src/vs/workbench/parts/debug/electron-browser/debugEditorContribution.ts index c421fa40b66..79e935940ce 100644 --- a/src/vs/workbench/parts/debug/electron-browser/debugEditorContribution.ts +++ b/src/vs/workbench/parts/debug/electron-browser/debugEditorContribution.ts @@ -95,7 +95,7 @@ export class DebugEditorContribution implements IDebugEditorContribution { private getContextMenuActions(breakpoints: IBreakpoint[], uri: uri, lineNumber: number): TPromise<(IAction | ContextSubMenu)[]> { const actions: (IAction | ContextSubMenu)[] = []; if (breakpoints.length === 1) { - const breakpointType = breakpoints[0].logMessage ? nls.localize('logPoint', "Log Point") : nls.localize('breakpoint', "Breakpoint"); + const breakpointType = breakpoints[0].logMessage ? nls.localize('logPoint', "Logpoint") : nls.localize('breakpoint', "Breakpoint"); actions.push(new RemoveBreakpointAction(RemoveBreakpointAction.ID, nls.localize('removeBreakpoint', "Remove {0}", breakpointType), this.debugService, this.keybindingService)); actions.push(new Action( 'workbench.debug.action.editBreakpointAction', @@ -156,7 +156,7 @@ export class DebugEditorContribution implements IDebugEditorContribution { )); actions.push(new Action( 'addLogPoint', - nls.localize('addLogPoint', "Add Log Point..."), + nls.localize('addLogPoint', "Add Logpoint..."), null, true, () => TPromise.as(this.editor.getContribution(EDITOR_CONTRIBUTION_ID).showBreakpointWidget(lineNumber, undefined, BreakpointWidgetContext.LOG_MESSAGE)) @@ -196,7 +196,7 @@ export class DebugEditorContribution implements IDebugEditorContribution { if (breakpoints.length) { if (breakpoints.some(bp => !!bp.condition || !!bp.logMessage || !!bp.hitCondition)) { const logPoint = breakpoints.every(bp => !!bp.logMessage); - const breakpointType = logPoint ? nls.localize('logPoint', "Log Point") : nls.localize('breakpoint', "Breakpoint"); + const breakpointType = logPoint ? nls.localize('logPoint', "Logpoint") : nls.localize('breakpoint', "Breakpoint"); this.dialogService.show(severity.Info, nls.localize('breakpointHasCondition', "This {0} has a {1} that will get lost on remove. Consider disabling the {0} instead.", breakpointType.toLowerCase(), logPoint ? nls.localize('message', "message") : nls.localize('condition', "condition")), [ nls.localize('removeLogPoint', "Remove {0}", breakpointType), From 50f81f0fb28ee2d1fbd95e6d316406ede6fa94fe Mon Sep 17 00:00:00 2001 From: Sandeep Somavarapu Date: Wed, 25 Apr 2018 11:35:09 +0200 Subject: [PATCH 036/830] Fix #48634 --- .../browser/parts/views/customView.ts | 2 +- .../browser/parts/views/panelViewlet.ts | 19 ++++++++++++++++++- 2 files changed, 19 insertions(+), 2 deletions(-) diff --git a/src/vs/workbench/browser/parts/views/customView.ts b/src/vs/workbench/browser/parts/views/customView.ts index c9b52390c63..015158a08ee 100644 --- a/src/vs/workbench/browser/parts/views/customView.ts +++ b/src/vs/workbench/browser/parts/views/customView.ts @@ -339,7 +339,7 @@ class TreeDataSource implements IDataSource { public getChildren(tree: ITree, node: ITreeItem): TPromise { if (this.treeView.dataProvider) { - return this.location ? this.treeView.dataProvider.getChildren(node) : this.progressService.withProgress({ location: this.location }, () => this.treeView.dataProvider.getChildren(node)); + return this.location ? this.progressService.withProgress({ location: this.location }, () => this.treeView.dataProvider.getChildren(node)) : this.treeView.dataProvider.getChildren(node); } return TPromise.as([]); } diff --git a/src/vs/workbench/browser/parts/views/panelViewlet.ts b/src/vs/workbench/browser/parts/views/panelViewlet.ts index 76656e42490..44d08bb945f 100644 --- a/src/vs/workbench/browser/parts/views/panelViewlet.ts +++ b/src/vs/workbench/browser/parts/views/panelViewlet.ts @@ -46,6 +46,9 @@ export abstract class ViewletPanel extends Panel { private _onDidFocus = new Emitter(); readonly onDidFocus: Event = this._onDidFocus.event; + private _onDidChangeTitleArea = new Emitter(); + readonly onDidChangeTitleArea: Event = this._onDidChangeTitleArea.event; + protected actionRunner: IActionRunner; protected toolbar: ToolBar; private headerContainer: HTMLElement; @@ -103,6 +106,7 @@ export abstract class ViewletPanel extends Panel { protected updateActions(): void { this.toolbar.setActions(prepareActions(this.getActions()), prepareActions(this.getSecondaryActions()))(); this.toolbar.context = this.getActionsContext(); + this._onDidChangeTitleArea.fire(); } protected updateActionsVisibility(): void { @@ -221,6 +225,14 @@ export class PanelViewlet extends Viewlet { return []; } + getActionItem(action: IAction): IActionItem { + if (this.isSingleView()) { + return this.panelItems[0].panel.getActionItem(action); + } + + return super.getActionItem(action); + } + focus(): void { super.focus(); @@ -263,6 +275,11 @@ export class PanelViewlet extends Viewlet { private addPanel(panel: ViewletPanel, size: number, index = this.panelItems.length - 1): void { const disposables: IDisposable[] = []; const onDidFocus = panel.onDidFocus(() => this.lastFocusedPanel = panel, null, disposables); + const onDidChangeTitleArea = panel.onDidChangeTitleArea(() => { + if (this.isSingleView()) { + this.updateTitleArea(); + } + }, null, disposables); const onDidChange = panel.onDidChange(() => { if (panel === this.lastFocusedPanel && !panel.isExpanded()) { this.lastFocusedPanel = undefined; @@ -275,7 +292,7 @@ export class PanelViewlet extends Viewlet { headerHighContrastBorder: index === 0 ? null : contrastBorder, dropBackground: SIDE_BAR_DRAG_AND_DROP_BACKGROUND }, panel); - const disposable = combinedDisposable([onDidFocus, panelStyler, onDidChange]); + const disposable = combinedDisposable([onDidFocus, onDidChangeTitleArea, panelStyler, onDidChange]); const panelItem: IViewletPanelItem = { panel, disposable }; this.panelItems.splice(index, 0, panelItem); From ad5f1113483ac843bbdab46f2afc33377ba1b2c4 Mon Sep 17 00:00:00 2001 From: Christof Marti Date: Wed, 25 Apr 2018 11:42:09 +0200 Subject: [PATCH 037/830] Check if list is displayed (fixes #48652) --- src/vs/workbench/browser/parts/quickinput/quickInput.ts | 3 +++ .../browser/parts/quickinput/quickInputCheckboxList.ts | 4 ++++ 2 files changed, 7 insertions(+) diff --git a/src/vs/workbench/browser/parts/quickinput/quickInput.ts b/src/vs/workbench/browser/parts/quickinput/quickInput.ts index d7c8a08d479..54c49535f2b 100644 --- a/src/vs/workbench/browser/parts/quickinput/quickInput.ts +++ b/src/vs/workbench/browser/parts/quickinput/quickInput.ts @@ -258,6 +258,9 @@ export class QuickInputService extends Component implements IQuickInputService { checkboxList.filter(value); }); this.toUnbind.push(inputBox.onKeyDown(event => { + if (!checkboxList.isDisplayed()) { + return; + } switch (event.keyCode) { case KeyCode.DownArrow: checkboxList.focus('First'); diff --git a/src/vs/workbench/browser/parts/quickinput/quickInputCheckboxList.ts b/src/vs/workbench/browser/parts/quickinput/quickInputCheckboxList.ts index c4a2553db8c..2ee58ceec06 100644 --- a/src/vs/workbench/browser/parts/quickinput/quickInputCheckboxList.ts +++ b/src/vs/workbench/browser/parts/quickinput/quickInputCheckboxList.ts @@ -356,6 +356,10 @@ export class QuickInputCheckboxList { this.container.style.display = display ? null : 'none'; } + isDisplayed() { + return this.container.style.display !== 'none'; + } + dispose() { this.elementDisposables = dispose(this.elementDisposables); this.disposables = dispose(this.disposables); From 27ce868a013cf9bb522571f9737c3097bebacb70 Mon Sep 17 00:00:00 2001 From: Alex Dima Date: Tue, 24 Apr 2018 15:50:13 +0200 Subject: [PATCH 038/830] Fixes Microsoft/monaco-editor#628 --- src/vs/base/browser/browser.ts | 1 + src/vs/base/browser/dom.ts | 3 ++- 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/src/vs/base/browser/browser.ts b/src/vs/base/browser/browser.ts index 50d6761118f..a326864787f 100644 --- a/src/vs/base/browser/browser.ts +++ b/src/vs/base/browser/browser.ts @@ -155,6 +155,7 @@ export const isWebKit = (userAgent.indexOf('AppleWebKit') >= 0); export const isChrome = (userAgent.indexOf('Chrome') >= 0); export const isSafari = (userAgent.indexOf('Chrome') === -1) && (userAgent.indexOf('Safari') >= 0); export const isIPad = (userAgent.indexOf('iPad') >= 0); +export const isEdgeWebView = isEdge && (userAgent.indexOf('WebView/') >= 0); export const isChromev56 = ( userAgent.indexOf('Chrome/56.') >= 0 diff --git a/src/vs/base/browser/dom.ts b/src/vs/base/browser/dom.ts index 9aee0d502d6..b4e6d482b66 100644 --- a/src/vs/base/browser/dom.ts +++ b/src/vs/base/browser/dom.ts @@ -1110,8 +1110,9 @@ export function computeScreenAwareSize(cssPx: number): number { * See https://mathiasbynens.github.io/rel-noopener/ */ export function windowOpenNoOpener(url: string): void { - if (platform.isNative) { + if (platform.isNative || browser.isEdgeWebView) { // In VSCode, window.open() always returns null... + // The same is true for a WebView (see https://github.com/Microsoft/monaco-editor/issues/628) window.open(url); } else { let newTab = window.open(); From 6bf2e72541726a866f3bb91f1eef3905706481b4 Mon Sep 17 00:00:00 2001 From: Alex Dima Date: Wed, 25 Apr 2018 11:46:17 +0200 Subject: [PATCH 039/830] Fixes Microsoft/monaco-editor#770 --- build/gulpfile.editor.js | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/build/gulpfile.editor.js b/build/gulpfile.editor.js index 659ef8b3008..abb7d785698 100644 --- a/build/gulpfile.editor.js +++ b/build/gulpfile.editor.js @@ -124,6 +124,17 @@ gulp.task('editor-distro', ['clean-editor-distro', 'compile-editor-esm', 'minify gulp.src('src/vs/monaco.d.ts') ).pipe(gulp.dest('out-monaco-editor-core')), + // place the .d.ts in the esm folder + gulp.src('src/vs/monaco.d.ts') + .pipe(es.through(function (data) { + this.emit('data', new File({ + path: data.path.replace(/monaco\.d\.ts/, 'editor.api.d.ts'), + base: data.base, + contents: data.contents + })); + })) + .pipe(gulp.dest('out-monaco-editor-core/esm/vs/editor')), + // package.json gulp.src('build/monaco/package.json') .pipe(es.through(function (data) { From 47b4ef2f227c475915427254f0269fb97386dce1 Mon Sep 17 00:00:00 2001 From: isidor Date: Wed, 25 Apr 2018 11:52:48 +0200 Subject: [PATCH 040/830] debug: run to cursor keep track of added breakpoint fixes #48586 --- .../parts/debug/browser/debugEditorActions.ts | 19 ++++++++++--------- src/vs/workbench/parts/debug/common/debug.ts | 2 +- .../debug/electron-browser/debugService.ts | 6 +++--- .../parts/debug/test/common/mockDebug.ts | 4 ++-- 4 files changed, 16 insertions(+), 15 deletions(-) diff --git a/src/vs/workbench/parts/debug/browser/debugEditorActions.ts b/src/vs/workbench/parts/debug/browser/debugEditorActions.ts index d838c0e8e9f..2e4110d5477 100644 --- a/src/vs/workbench/parts/debug/browser/debugEditorActions.ts +++ b/src/vs/workbench/parts/debug/browser/debugEditorActions.ts @@ -10,7 +10,7 @@ import { Range } from 'vs/editor/common/core/range'; import { EditorContextKeys } from 'vs/editor/common/editorContextKeys'; import { ServicesAccessor, registerEditorAction, EditorAction } from 'vs/editor/browser/editorExtensions'; import { ContextKeyExpr } from 'vs/platform/contextkey/common/contextkey'; -import { IDebugService, CONTEXT_IN_DEBUG_MODE, CONTEXT_NOT_IN_DEBUG_REPL, CONTEXT_DEBUG_STATE, State, REPL_ID, VIEWLET_ID, IDebugEditorContribution, EDITOR_CONTRIBUTION_ID, BreakpointWidgetContext } from 'vs/workbench/parts/debug/common/debug'; +import { IDebugService, CONTEXT_IN_DEBUG_MODE, CONTEXT_NOT_IN_DEBUG_REPL, CONTEXT_DEBUG_STATE, State, REPL_ID, VIEWLET_ID, IDebugEditorContribution, EDITOR_CONTRIBUTION_ID, BreakpointWidgetContext, IBreakpoint } from 'vs/workbench/parts/debug/common/debug'; import { IPanelService } from 'vs/workbench/services/panel/common/panelService'; import { IViewletService } from 'vs/workbench/services/viewlet/browser/viewlet'; import { ICodeEditor } from 'vs/editor/browser/editorBrowser'; @@ -107,26 +107,27 @@ class RunToCursorAction extends EditorAction { public run(accessor: ServicesAccessor, editor: ICodeEditor): TPromise { const debugService = accessor.get(IDebugService); - if (debugService.state !== State.Stopped) { return TPromise.as(null); } - const position = editor.getPosition(); - const uri = editor.getModel().uri; + let breakpointToRemove: IBreakpoint; const oneTimeListener = debugService.getViewModel().focusedProcess.session.onDidEvent(event => { if (event.event === 'stopped' || event.event === 'exit') { - const toRemove = debugService.getModel().getBreakpoints() - .filter(bp => bp.lineNumber === position.lineNumber && bp.uri.toString() === uri.toString()).pop(); - if (toRemove) { - debugService.removeBreakpoints(toRemove.getId()); + if (breakpointToRemove) { + debugService.removeBreakpoints(breakpointToRemove.getId()); } oneTimeListener.dispose(); } }); + const position = editor.getPosition(); + const uri = editor.getModel().uri; const bpExists = !!(debugService.getModel().getBreakpoints().filter(bp => bp.column === position.column && bp.lineNumber === position.lineNumber && bp.uri.toString() === uri.toString()).pop()); - return (bpExists ? TPromise.as(null) : debugService.addBreakpoints(uri, [{ lineNumber: position.lineNumber, column: position.column }])).then(() => { + return (bpExists ? TPromise.as(null) : debugService.addBreakpoints(uri, [{ lineNumber: position.lineNumber, column: position.column }])).then((breakpoints) => { + if (breakpoints && breakpoints.length) { + breakpointToRemove = breakpoints[0]; + } debugService.getViewModel().focusedThread.continue(); }); } diff --git a/src/vs/workbench/parts/debug/common/debug.ts b/src/vs/workbench/parts/debug/common/debug.ts index 566acd9d9af..9522abecb6f 100644 --- a/src/vs/workbench/parts/debug/common/debug.ts +++ b/src/vs/workbench/parts/debug/common/debug.ts @@ -603,7 +603,7 @@ export interface IDebugService { /** * Adds new breakpoints to the model for the file specified with the uri. Notifies debug adapter of breakpoint changes. */ - addBreakpoints(uri: uri, rawBreakpoints: IBreakpointData[]): TPromise; + addBreakpoints(uri: uri, rawBreakpoints: IBreakpointData[]): TPromise; /** * Updates the breakpoints. diff --git a/src/vs/workbench/parts/debug/electron-browser/debugService.ts b/src/vs/workbench/parts/debug/electron-browser/debugService.ts index 26b39c756e1..183080fc4f4 100644 --- a/src/vs/workbench/parts/debug/electron-browser/debugService.ts +++ b/src/vs/workbench/parts/debug/electron-browser/debugService.ts @@ -599,11 +599,11 @@ export class DebugService implements debug.IDebugService { return this.sendAllBreakpoints(); } - public addBreakpoints(uri: uri, rawBreakpoints: debug.IBreakpointData[]): TPromise { - this.model.addBreakpoints(uri, rawBreakpoints); + public addBreakpoints(uri: uri, rawBreakpoints: debug.IBreakpointData[]): TPromise { + const breakpoints = this.model.addBreakpoints(uri, rawBreakpoints); rawBreakpoints.forEach(rbp => aria.status(nls.localize('breakpointAdded', "Added breakpoint, line {0}, file {1}", rbp.lineNumber, uri.fsPath))); - return this.sendBreakpoints(uri); + return this.sendBreakpoints(uri).then(() => breakpoints); } public updateBreakpoints(uri: uri, data: { [id: string]: DebugProtocol.Breakpoint }, sendOnResourceSaved: boolean): void { diff --git a/src/vs/workbench/parts/debug/test/common/mockDebug.ts b/src/vs/workbench/parts/debug/test/common/mockDebug.ts index 6db8bef34f6..71efd17b36e 100644 --- a/src/vs/workbench/parts/debug/test/common/mockDebug.ts +++ b/src/vs/workbench/parts/debug/test/common/mockDebug.ts @@ -7,7 +7,7 @@ import uri from 'vs/base/common/uri'; import { Event, Emitter } from 'vs/base/common/event'; import { TPromise } from 'vs/base/common/winjs.base'; import { IWorkspaceFolder } from 'vs/platform/workspace/common/workspace'; -import { ILaunch, IDebugService, State, DebugEvent, IProcess, IConfigurationManager, IStackFrame, IBreakpointData, IBreakpointUpdateData, IConfig, IModel, IViewModel, ISession } from 'vs/workbench/parts/debug/common/debug'; +import { ILaunch, IDebugService, State, DebugEvent, IProcess, IConfigurationManager, IStackFrame, IBreakpointData, IBreakpointUpdateData, IConfig, IModel, IViewModel, ISession, IBreakpoint } from 'vs/workbench/parts/debug/common/debug'; export class MockDebugService implements IDebugService { public _serviceBrand: any; @@ -39,7 +39,7 @@ export class MockDebugService implements IDebugService { public focusStackFrame(focusedStackFrame: IStackFrame): void { } - public addBreakpoints(uri: uri, rawBreakpoints: IBreakpointData[]): TPromise { + public addBreakpoints(uri: uri, rawBreakpoints: IBreakpointData[]): TPromise { return TPromise.as(null); } From 04c4d3eb02d4cc9d0b95f1650e8471c5dbd2ba32 Mon Sep 17 00:00:00 2001 From: isidor Date: Wed, 25 Apr 2018 11:57:35 +0200 Subject: [PATCH 041/830] breakpoint widget: allow to delete condition or message fixes #48657 --- .../parts/debug/electron-browser/breakpointWidget.ts | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/vs/workbench/parts/debug/electron-browser/breakpointWidget.ts b/src/vs/workbench/parts/debug/electron-browser/breakpointWidget.ts index 037df6816e5..f294e927388 100644 --- a/src/vs/workbench/parts/debug/electron-browser/breakpointWidget.ts +++ b/src/vs/workbench/parts/debug/electron-browser/breakpointWidget.ts @@ -156,13 +156,13 @@ export class BreakpointWidget extends ZoneWidget implements IPrivateBreakopintWi let logMessage = this.breakpoint && this.breakpoint.logMessage; this.rememberInput(); - if (this.conditionInput) { + if (this.conditionInput || this.context === Context.CONDITION) { condition = this.conditionInput; } - if (this.hitCountInput) { + if (this.hitCountInput || this.context === Context.HIT_COUNT) { hitCondition = this.hitCountInput; } - if (this.logMessageInput) { + if (this.logMessageInput || this.context === Context.LOG_MESSAGE) { logMessage = this.logMessageInput; } From 05bca58420a8d195f7710d89580c043fdf837131 Mon Sep 17 00:00:00 2001 From: Johannes Rieken Date: Wed, 25 Apr 2018 12:00:05 +0200 Subject: [PATCH 042/830] fix #48502 --- .../electron-browser/mainThreadDecorations.ts | 17 +++++--- .../decorations/browser/decorations.ts | 3 +- .../decorations/browser/decorationsService.ts | 23 ++++++++-- .../test/browser/decorationsService.test.ts | 43 ++++++++++++++++++- 4 files changed, 73 insertions(+), 13 deletions(-) diff --git a/src/vs/workbench/api/electron-browser/mainThreadDecorations.ts b/src/vs/workbench/api/electron-browser/mainThreadDecorations.ts index d0ab516ec47..1f8d8af2c36 100644 --- a/src/vs/workbench/api/electron-browser/mainThreadDecorations.ts +++ b/src/vs/workbench/api/electron-browser/mainThreadDecorations.ts @@ -10,11 +10,13 @@ import { IDisposable, dispose } from 'vs/base/common/lifecycle'; import { ExtHostContext, MainContext, IExtHostContext, MainThreadDecorationsShape, ExtHostDecorationsShape, DecorationData, DecorationRequest } from '../node/extHost.protocol'; import { extHostNamedCustomer } from 'vs/workbench/api/electron-browser/extHostCustomers'; import { IDecorationsService, IDecorationData } from 'vs/workbench/services/decorations/browser/decorations'; +import { TPromise } from 'vs/base/common/winjs.base'; +import { values } from 'vs/base/common/collections'; class DecorationRequestsQueue { private _idPool = 0; - private _requests: DecorationRequest[] = []; + private _requests: { [id: number]: DecorationRequest } = Object.create(null); private _resolver: { [id: number]: Function } = Object.create(null); private _timer: number; @@ -25,12 +27,15 @@ class DecorationRequestsQueue { // } - enqueue(handle: number, uri: URI): Thenable { - return new Promise((resolve, reject) => { - const id = ++this._idPool; - this._requests.push({ id, handle, uri }); + enqueue(handle: number, uri: URI): TPromise { + const id = ++this._idPool; + return new TPromise((resolve, reject) => { + this._requests[id] = { id, handle, uri }; this._resolver[id] = resolve; this._processQueue(); + }, () => { + delete this._requests[id]; + delete this._resolver[id]; }); } @@ -43,7 +48,7 @@ class DecorationRequestsQueue { // make request const requests = this._requests; const resolver = this._resolver; - this._proxy.$provideDecorations(requests).then(data => { + this._proxy.$provideDecorations(values(requests)).then(data => { for (const id in resolver) { resolver[id](data[id]); } diff --git a/src/vs/workbench/services/decorations/browser/decorations.ts b/src/vs/workbench/services/decorations/browser/decorations.ts index 63dc7710727..e777db83119 100644 --- a/src/vs/workbench/services/decorations/browser/decorations.ts +++ b/src/vs/workbench/services/decorations/browser/decorations.ts @@ -9,6 +9,7 @@ import URI from 'vs/base/common/uri'; import { Event } from 'vs/base/common/event'; import { ColorIdentifier } from 'vs/platform/theme/common/colorRegistry'; import { IDisposable } from 'vs/base/common/lifecycle'; +import { TPromise } from 'vs/base/common/winjs.base'; export const IDecorationsService = createDecorator('IFileDecorationsService'); @@ -31,7 +32,7 @@ export interface IDecoration { export interface IDecorationsProvider { readonly label: string; readonly onDidChange: Event; - provideDecorations(uri: URI): IDecorationData | Thenable; + provideDecorations(uri: URI): IDecorationData | TPromise; } export interface IResourceDecorationChangeEvent { diff --git a/src/vs/workbench/services/decorations/browser/decorationsService.ts b/src/vs/workbench/services/decorations/browser/decorationsService.ts index dfce99a732f..26f60f74f1d 100644 --- a/src/vs/workbench/services/decorations/browser/decorationsService.ts +++ b/src/vs/workbench/services/decorations/browser/decorationsService.ts @@ -17,6 +17,8 @@ import { IdGenerator } from 'vs/base/common/idGenerator'; import { IIterator } from 'vs/base/common/iterator'; import { isFalsyOrWhitespace } from 'vs/base/common/strings'; import { localize } from 'vs/nls'; +import { TPromise } from 'vs/base/common/winjs.base'; +import { isPromiseCanceledError } from 'vs/base/common/errors'; class DecorationRule { @@ -229,7 +231,7 @@ class FileDecorationChangeEvent implements IResourceDecorationChangeEvent { class DecorationProviderWrapper { - readonly data = TernarySearchTree.forPaths | IDecorationData>(); + readonly data = TernarySearchTree.forPaths | IDecorationData>(); private readonly _dispoable: IDisposable; constructor( @@ -298,6 +300,13 @@ class DecorationProviderWrapper { private _fetchData(uri: URI): IDecorationData { + // check for pending request and cancel it + const pendingRequest = this.data.get(uri.toString()); + if (TPromise.is(pendingRequest)) { + pendingRequest.cancel(); + this.data.delete(uri.toString()); + } + const dataOrThenable = this._provider.provideDecorations(uri); if (!isThenable(dataOrThenable)) { // sync -> we have a result now @@ -305,9 +314,15 @@ class DecorationProviderWrapper { } else { // async -> we have a result soon - const request = Promise.resolve(dataOrThenable) - .then(data => this._keepItem(uri, data)) - .catch(_ => this.data.delete(uri.toString())); + const request = TPromise.wrap(dataOrThenable).then(data => { + if (this.data.get(uri.toString()) === request) { + this._keepItem(uri, data); + } + }, err => { + if (!isPromiseCanceledError(err) && this.data.get(uri.toString()) === request) { + this.data.delete(uri.toString()); + } + }); this.data.set(uri.toString(), request); return undefined; diff --git a/src/vs/workbench/services/decorations/test/browser/decorationsService.test.ts b/src/vs/workbench/services/decorations/test/browser/decorationsService.test.ts index 631cc2df561..bf3fa03c39d 100644 --- a/src/vs/workbench/services/decorations/test/browser/decorationsService.test.ts +++ b/src/vs/workbench/services/decorations/test/browser/decorationsService.test.ts @@ -9,8 +9,9 @@ import * as assert from 'assert'; import { FileDecorationsService } from 'vs/workbench/services/decorations/browser/decorationsService'; import { IDecorationsProvider, IDecorationData } from 'vs/workbench/services/decorations/browser/decorations'; import URI from 'vs/base/common/uri'; -import { Event, toPromise } from 'vs/base/common/event'; +import { Event, toPromise, Emitter } from 'vs/base/common/event'; import { TestThemeService } from 'vs/platform/theme/test/common/testThemeService'; +import { TPromise } from 'vs/base/common/winjs.base'; suite('DecorationsService', function () { @@ -33,7 +34,7 @@ suite('DecorationsService', function () { readonly onDidChange: Event = Event.None; provideDecorations(uri: URI) { callCounter += 1; - return new Promise(resolve => { + return new TPromise(resolve => { setTimeout(() => resolve({ color: 'someBlue', tooltip: 'T' @@ -169,4 +170,42 @@ suite('DecorationsService', function () { reg.dispose(); }); + + test('Decorations not showing up for second root folder #48502', async function () { + + let cancelCount = 0; + let callCount = 0; + + let provider = new class implements IDecorationsProvider { + + _onDidChange = new Emitter(); + onDidChange: Event = this._onDidChange.event; + + label: string = 'foo'; + + provideDecorations(uri): TPromise { + return new TPromise(resolve => { + callCount += 1; + setTimeout(() => { + resolve({ letter: 'foo' }); + }, 10); + }, () => { + cancelCount += 1; + }); + } + }; + + let reg = service.registerDecorationsProvider(provider); + + const uri = URI.parse('foo://bar'); + service.getDecoration(uri, false); + + provider._onDidChange.fire([uri]); + service.getDecoration(uri, false); + + assert.equal(cancelCount, 1); + assert.equal(callCount, 2); + + reg.dispose(); + }); }); From 811d3985ef47c2ac49d7ac09268e5c650de7abdd Mon Sep 17 00:00:00 2001 From: Alex Dima Date: Wed, 25 Apr 2018 12:40:03 +0200 Subject: [PATCH 043/830] Fixes #48546: Merge editor.largeFileSize and editor.largeFileLineCount --- .../common/config/commonEditorConfig.ts | 13 ++++------ src/vs/editor/common/config/editorOptions.ts | 3 +-- src/vs/editor/common/model.ts | 3 +-- src/vs/editor/common/model/textModel.ts | 18 +++++++++----- .../common/services/modelServiceImpl.ts | 24 +++++-------------- src/vs/editor/test/common/editorTestUtils.ts | 6 ++--- 6 files changed, 26 insertions(+), 41 deletions(-) diff --git a/src/vs/editor/common/config/commonEditorConfig.ts b/src/vs/editor/common/config/commonEditorConfig.ts index 75efeb0c4c3..70f7b4053ee 100644 --- a/src/vs/editor/common/config/commonEditorConfig.ts +++ b/src/vs/editor/common/config/commonEditorConfig.ts @@ -687,15 +687,10 @@ const editorConfiguration: IConfigurationNode = { 'default': true, 'description': nls.localize('ignoreTrimWhitespace', "Controls if the diff editor shows changes in leading or trailing whitespace as diffs") }, - 'editor.largeFileSize': { - 'type': 'number', - 'default': EDITOR_MODEL_DEFAULTS.largeFileSize, - 'description': nls.localize('largeFileSize', "Controls file size threshold in bytes beyond which special optimization rules are applied") - }, - 'editor.largeFileLineCount': { - 'type': 'number', - 'default': EDITOR_MODEL_DEFAULTS.largeFileLineCount, - 'description': nls.localize('largeFileLineCount', "Controls file size threshold in terms of line count beyond which special optimization rules are applied") + 'editor.largeFileOptimizations': { + 'type': 'boolean', + 'default': EDITOR_MODEL_DEFAULTS.largeFileOptimizations, + 'description': nls.localize('largeFileOptimizations', "Special handling for large files to disable certain memory intensive features.") }, 'diffEditor.renderIndicators': { 'type': 'boolean', diff --git a/src/vs/editor/common/config/editorOptions.ts b/src/vs/editor/common/config/editorOptions.ts index 61037c9f7d0..02f732afc75 100644 --- a/src/vs/editor/common/config/editorOptions.ts +++ b/src/vs/editor/common/config/editorOptions.ts @@ -2230,8 +2230,7 @@ export const EDITOR_MODEL_DEFAULTS = { insertSpaces: true, detectIndentation: true, trimAutoWhitespace: true, - largeFileSize: 20 * 1024 * 1024, // 20 MB - largeFileLineCount: 300 * 1000 // 300K lines + largeFileOptimizations: true }; /** diff --git a/src/vs/editor/common/model.ts b/src/vs/editor/common/model.ts index 3f628c4136a..3dcea7a7f55 100644 --- a/src/vs/editor/common/model.ts +++ b/src/vs/editor/common/model.ts @@ -400,8 +400,7 @@ export interface ITextModelCreationOptions { trimAutoWhitespace: boolean; defaultEOL: DefaultEndOfLine; isForSimpleWidget: boolean; - largeFileSize: number; - largeFileLineCount: number; + largeFileOptimizations: boolean; } export interface ITextModelUpdateOptions { diff --git a/src/vs/editor/common/model/textModel.ts b/src/vs/editor/common/model/textModel.ts index 8bad048eb1b..487668fe43f 100644 --- a/src/vs/editor/common/model/textModel.ts +++ b/src/vs/editor/common/model/textModel.ts @@ -155,6 +155,8 @@ class TextModelSnapshot implements ITextSnapshot { export class TextModel extends Disposable implements model.ITextModel { private static readonly MODEL_SYNC_LIMIT = 50 * 1024 * 1024; // 50 MB + private static readonly LARGE_FILE_SIZE_THRESHOLD = 20 * 1024 * 1024; // 20 MB; + private static readonly LARGE_FILE_LINE_COUNT_THRESHOLD = 300 * 1000; // 300K lines public static DEFAULT_CREATION_OPTIONS: model.ITextModelCreationOptions = { isForSimpleWidget: false, @@ -163,8 +165,7 @@ export class TextModel extends Disposable implements model.ITextModel { detectIndentation: false, defaultEOL: model.DefaultEndOfLine.LF, trimAutoWhitespace: EDITOR_MODEL_DEFAULTS.trimAutoWhitespace, - largeFileSize: EDITOR_MODEL_DEFAULTS.largeFileSize, - largeFileLineCount: EDITOR_MODEL_DEFAULTS.largeFileLineCount, + largeFileOptimizations: EDITOR_MODEL_DEFAULTS.largeFileOptimizations, }; public static createFromString(text: string, options: model.ITextModelCreationOptions = TextModel.DEFAULT_CREATION_OPTIONS, languageIdentifier: LanguageIdentifier = null, uri: URI = null): TextModel { @@ -285,13 +286,18 @@ export class TextModel extends Disposable implements model.ITextModel { const bufferLineCount = this._buffer.getLineCount(); const bufferTextLength = this._buffer.getValueLengthInRange(new Range(1, 1, bufferLineCount, this._buffer.getLineLength(bufferLineCount) + 1), model.EndOfLinePreference.TextDefined); + // !!! Make a decision in the ctor and permanently respect this decision !!! // If a model is too large at construction time, it will never get tokenized, // under no circumstances. - this._isTooLargeForTokenization = ( - (bufferTextLength > creationOptions.largeFileSize) - || (bufferLineCount > creationOptions.largeFileLineCount) - ); + if (creationOptions.largeFileOptimizations) { + this._isTooLargeForTokenization = ( + (bufferTextLength > TextModel.LARGE_FILE_SIZE_THRESHOLD) + || (bufferLineCount > TextModel.LARGE_FILE_LINE_COUNT_THRESHOLD) + ); + } else { + this._isTooLargeForTokenization = false; + } this._shouldSimplifyMode = ( this._isTooLargeForTokenization diff --git a/src/vs/editor/common/services/modelServiceImpl.ts b/src/vs/editor/common/services/modelServiceImpl.ts index 6490f6d7a0e..4d5123785ab 100644 --- a/src/vs/editor/common/services/modelServiceImpl.ts +++ b/src/vs/editor/common/services/modelServiceImpl.ts @@ -205,8 +205,8 @@ interface IRawConfig { insertSpaces?: any; detectIndentation?: any; trimAutoWhitespace?: any; - largeFileSize?: any; - largeFileLineCount?: any; + creationOptions?: any; + largeFileOptimizations?: any; }; } @@ -285,20 +285,9 @@ export class ModelServiceImpl implements IModelService { detectIndentation = (config.editor.detectIndentation === 'false' ? false : Boolean(config.editor.detectIndentation)); } - let largeFileSize = EDITOR_MODEL_DEFAULTS.largeFileSize; - if (config.editor && typeof config.editor.largeFileSize !== 'undefined') { - let parsedlargeFileSize = parseInt(config.editor.largeFileSize, 10); - if (!isNaN(parsedlargeFileSize)) { - largeFileSize = parsedlargeFileSize; - } - } - - let largeFileLineCount = EDITOR_MODEL_DEFAULTS.largeFileLineCount; - if (config.editor && typeof config.editor.largeFileLineCount !== 'undefined') { - let parsedlargeFileLineCount = parseInt(config.editor.largeFileLineCount, 10); - if (!isNaN(parsedlargeFileLineCount)) { - largeFileLineCount = parsedlargeFileLineCount; - } + let largeFileOptimizations = EDITOR_MODEL_DEFAULTS.largeFileOptimizations; + if (config.editor && typeof config.editor.largeFileOptimizations !== 'undefined') { + largeFileOptimizations = (config.editor.largeFileOptimizations === 'false' ? false : Boolean(config.editor.largeFileOptimizations)); } return { @@ -308,8 +297,7 @@ export class ModelServiceImpl implements IModelService { detectIndentation: detectIndentation, defaultEOL: newDefaultEOL, trimAutoWhitespace: trimAutoWhitespace, - largeFileSize: largeFileSize, - largeFileLineCount: largeFileLineCount + largeFileOptimizations: largeFileOptimizations }; } diff --git a/src/vs/editor/test/common/editorTestUtils.ts b/src/vs/editor/test/common/editorTestUtils.ts index d2e8cb2072e..d5ba6be54b1 100644 --- a/src/vs/editor/test/common/editorTestUtils.ts +++ b/src/vs/editor/test/common/editorTestUtils.ts @@ -22,8 +22,7 @@ export interface IRelaxedTextModelCreationOptions { trimAutoWhitespace?: boolean; defaultEOL?: DefaultEndOfLine; isForSimpleWidget?: boolean; - largeFileSize?: number; - largeFileLineCount?: number; + largeFileOptimizations?: boolean; } export function createTextModel(text: string, _options: IRelaxedTextModelCreationOptions = TextModel.DEFAULT_CREATION_OPTIONS, languageIdentifier: LanguageIdentifier = null, uri: URI = null): TextModel { @@ -34,8 +33,7 @@ export function createTextModel(text: string, _options: IRelaxedTextModelCreatio trimAutoWhitespace: (typeof _options.trimAutoWhitespace === 'undefined' ? TextModel.DEFAULT_CREATION_OPTIONS.trimAutoWhitespace : _options.trimAutoWhitespace), defaultEOL: (typeof _options.defaultEOL === 'undefined' ? TextModel.DEFAULT_CREATION_OPTIONS.defaultEOL : _options.defaultEOL), isForSimpleWidget: (typeof _options.isForSimpleWidget === 'undefined' ? TextModel.DEFAULT_CREATION_OPTIONS.isForSimpleWidget : _options.isForSimpleWidget), - largeFileSize: (typeof _options.largeFileSize === 'undefined' ? TextModel.DEFAULT_CREATION_OPTIONS.largeFileSize : _options.largeFileSize), - largeFileLineCount: (typeof _options.largeFileLineCount === 'undefined' ? TextModel.DEFAULT_CREATION_OPTIONS.largeFileLineCount : _options.largeFileLineCount), + largeFileOptimizations: (typeof _options.largeFileOptimizations === 'undefined' ? TextModel.DEFAULT_CREATION_OPTIONS.largeFileOptimizations : _options.largeFileOptimizations), }; return TextModel.createFromString(text, options, languageIdentifier, uri); } From 29dddc43cc68359df220fb27e593de2a44f9fd5a Mon Sep 17 00:00:00 2001 From: isidor Date: Wed, 25 Apr 2018 12:41:17 +0200 Subject: [PATCH 044/830] breakpoint widget: ovewriteBefore magic to get proper suggestions fixes #46824 --- .../electron-browser/breakpointWidget.ts | 23 +++++++++++++------ .../debugEditorContribution.ts | 2 +- 2 files changed, 17 insertions(+), 8 deletions(-) diff --git a/src/vs/workbench/parts/debug/electron-browser/breakpointWidget.ts b/src/vs/workbench/parts/debug/electron-browser/breakpointWidget.ts index f294e927388..7229bb4bf08 100644 --- a/src/vs/workbench/parts/debug/electron-browser/breakpointWidget.ts +++ b/src/vs/workbench/parts/debug/electron-browser/breakpointWidget.ts @@ -54,7 +54,7 @@ export class BreakpointWidget extends ZoneWidget implements IPrivateBreakopintWi private logMessageInput = ''; private breakpoint: IBreakpoint; - constructor(editor: ICodeEditor, private lineNumber: number, private column: number, private context: Context, + constructor(editor: ICodeEditor, private lineNumber: number, private context: Context, @IContextViewService private contextViewService: IContextViewService, @IDebugService private debugService: IDebugService, @IThemeService private themeService: IThemeService, @@ -219,14 +219,23 @@ export class BreakpointWidget extends ZoneWidget implements IPrivateBreakopintWi provideCompletionItems: (model: ITextModel, position: Position, _context: SuggestContext, token: CancellationToken): Thenable => { let suggestionsPromise: TPromise; if (this.context === Context.CONDITION || this.context === Context.LOG_MESSAGE && this.isCurlyBracketOpen()) { - suggestionsPromise = provideSuggestionItems(this.editor.getModel(), new Position(this.lineNumber, this.column), 'none', undefined, _context).then(suggestions => { + suggestionsPromise = provideSuggestionItems(this.editor.getModel(), new Position(this.lineNumber, 1), 'none', undefined, _context).then(suggestions => { + + let overwriteBefore = 0; + if (this.context === Context.CONDITION) { + overwriteBefore = position.column - 1; + } else { + // Inside the currly brackets, need to count how many useful characters are behind the position so they would all be taken into account + const value = this.input.getModel().getValue(); + while ((position.column - 2 - overwriteBefore >= 0) && value[position.column - 2 - overwriteBefore] !== '{' && value[position.column - 2 - overwriteBefore] !== ' ') { + overwriteBefore++; + } + } + return { suggestions: suggestions.map(s => { - if (this.context === Context.CONDITION) { - s.suggestion.overwriteBefore = position.column - 1; - s.suggestion.overwriteAfter = 0; - } - + s.suggestion.overwriteAfter = 0; + s.suggestion.overwriteBefore = overwriteBefore; return s.suggestion; }) }; diff --git a/src/vs/workbench/parts/debug/electron-browser/debugEditorContribution.ts b/src/vs/workbench/parts/debug/electron-browser/debugEditorContribution.ts index 79e935940ce..c1bee3bf46b 100644 --- a/src/vs/workbench/parts/debug/electron-browser/debugEditorContribution.ts +++ b/src/vs/workbench/parts/debug/electron-browser/debugEditorContribution.ts @@ -395,7 +395,7 @@ export class DebugEditorContribution implements IDebugEditorContribution { this.breakpointWidget.dispose(); } - this.breakpointWidget = this.instantiationService.createInstance(BreakpointWidget, this.editor, lineNumber, column, context); + this.breakpointWidget = this.instantiationService.createInstance(BreakpointWidget, this.editor, lineNumber, context); this.breakpointWidget.show({ lineNumber, column: 1 }, 2); this.breakpointWidgetVisible.set(true); } From 3907d479e4318057aab0a74a6e832f305bb0e2c3 Mon Sep 17 00:00:00 2001 From: Johannes Rieken Date: Wed, 25 Apr 2018 12:32:43 +0200 Subject: [PATCH 045/830] jsdoc-polish, #48527 --- src/vs/vscode.d.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/vs/vscode.d.ts b/src/vs/vscode.d.ts index d6c1d38cef0..1d637a470a7 100644 --- a/src/vs/vscode.d.ts +++ b/src/vs/vscode.d.ts @@ -5027,7 +5027,7 @@ declare module 'vscode' { writeFile(uri: Uri, content: Uint8Array, options: FileOptions, token: CancellationToken): void | Thenable; /** - * Delete a file or folder from the underlying storage. + * Delete a file. * * @param uri The resource that is to be deleted * @param options Options bag for future use From a4eedac6cc86abc3d9749e98de580de69a479056 Mon Sep 17 00:00:00 2001 From: Alex Dima Date: Wed, 25 Apr 2018 12:45:55 +0200 Subject: [PATCH 046/830] Rename `isTooLargeForHavingARichMode` to `isTooLargeForSyncing` (#44897) --- src/vs/editor/common/model.ts | 6 +++--- src/vs/editor/common/model/textModel.ts | 2 +- src/vs/editor/common/services/modelService.ts | 2 +- src/vs/editor/contrib/find/findController.ts | 4 ++-- src/vs/editor/contrib/find/findModel.ts | 2 +- .../api/mainThreadDocumentsAndEditors.test.ts | 2 +- 6 files changed, 9 insertions(+), 9 deletions(-) diff --git a/src/vs/editor/common/model.ts b/src/vs/editor/common/model.ts index 3dcea7a7f55..ca064215e92 100644 --- a/src/vs/editor/common/model.ts +++ b/src/vs/editor/common/model.ts @@ -679,11 +679,11 @@ export interface ITextModel { tokenizeViewport(startLineNumber: number, endLineNumber: number): void; /** - * Only basic mode supports allowed on this model because it is simply too large. - * (tokenization is allowed and other basic supports) + * This model is so large that it would not be a good idea to sync it over + * to web workers or other places. * @internal */ - isTooLargeForHavingARichMode(): boolean; + isTooLargeForSyncing(): boolean; /** * The file is so large, that even tokenization is disabled. diff --git a/src/vs/editor/common/model/textModel.ts b/src/vs/editor/common/model/textModel.ts index 487668fe43f..e4a4656ef51 100644 --- a/src/vs/editor/common/model/textModel.ts +++ b/src/vs/editor/common/model/textModel.ts @@ -547,7 +547,7 @@ export class TextModel extends Disposable implements model.ITextModel { return this._attachedEditorCount; } - public isTooLargeForHavingARichMode(): boolean { + public isTooLargeForSyncing(): boolean { return this._shouldSimplifyMode; } diff --git a/src/vs/editor/common/services/modelService.ts b/src/vs/editor/common/services/modelService.ts index a6be991567b..6db067c4b04 100644 --- a/src/vs/editor/common/services/modelService.ts +++ b/src/vs/editor/common/services/modelService.ts @@ -39,6 +39,6 @@ export interface IModelService { export function shouldSynchronizeModel(model: ITextModel): boolean { return ( - !model.isTooLargeForHavingARichMode() && !model.isForSimpleWidget + !model.isTooLargeForSyncing() && !model.isForSimpleWidget ); } diff --git a/src/vs/editor/contrib/find/findController.ts b/src/vs/editor/contrib/find/findController.ts index 1150a26fac9..b5ef08fa38c 100644 --- a/src/vs/editor/contrib/find/findController.ts +++ b/src/vs/editor/contrib/find/findController.ts @@ -347,7 +347,7 @@ export class CommonFindController extends Disposable implements editorCommon.IEd public getGlobalBufferTerm(): string { if (this._editor.getConfiguration().contribInfo.find.globalFindClipboard && this._clipboardService - && !this._editor.getModel().isTooLargeForHavingARichMode() + && !this._editor.getModel().isTooLargeForSyncing() ) { return this._clipboardService.readFindText(); } @@ -357,7 +357,7 @@ export class CommonFindController extends Disposable implements editorCommon.IEd public setGlobalBufferTerm(text: string) { if (this._editor.getConfiguration().contribInfo.find.globalFindClipboard && this._clipboardService - && !this._editor.getModel().isTooLargeForHavingARichMode() + && !this._editor.getModel().isTooLargeForSyncing() ) { this._clipboardService.writeFindText(text); } diff --git a/src/vs/editor/contrib/find/findModel.ts b/src/vs/editor/contrib/find/findModel.ts index 3cccfcd1d73..2ab6a35c5ca 100644 --- a/src/vs/editor/contrib/find/findModel.ts +++ b/src/vs/editor/contrib/find/findModel.ts @@ -147,7 +147,7 @@ export class FindModelBoundToEditorModel { if (e.searchString || e.isReplaceRevealed || e.isRegex || e.wholeWord || e.matchCase || e.searchScope) { let model = this._editor.getModel(); - if (model.isTooLargeForHavingARichMode()) { + if (model.isTooLargeForSyncing()) { this._startSearchingTimer.cancel(); this._startSearchingTimer.setIfNotSet(() => { diff --git a/src/vs/workbench/test/electron-browser/api/mainThreadDocumentsAndEditors.test.ts b/src/vs/workbench/test/electron-browser/api/mainThreadDocumentsAndEditors.test.ts index 7af128da410..3431b411e91 100644 --- a/src/vs/workbench/test/electron-browser/api/mainThreadDocumentsAndEditors.test.ts +++ b/src/vs/workbench/test/electron-browser/api/mainThreadDocumentsAndEditors.test.ts @@ -89,7 +89,7 @@ suite('MainThreadDocumentsAndEditors', () => { this.timeout(1000 * 60); // increase timeout for this one test const model = modelService.createModel(hugeModelString, null, null); - assert.ok(model.isTooLargeForHavingARichMode()); + assert.ok(model.isTooLargeForSyncing()); assert.equal(deltas.length, 1); const [delta] = deltas; From 6ca5d339022ffe015ad1bde101e8afeb0725844a Mon Sep 17 00:00:00 2001 From: Alex Dima Date: Wed, 25 Apr 2018 12:47:01 +0200 Subject: [PATCH 047/830] Fixes #44897 --- src/vs/editor/common/model/textModel.ts | 9 +++------ 1 file changed, 3 insertions(+), 6 deletions(-) diff --git a/src/vs/editor/common/model/textModel.ts b/src/vs/editor/common/model/textModel.ts index e4a4656ef51..9a7a735e650 100644 --- a/src/vs/editor/common/model/textModel.ts +++ b/src/vs/editor/common/model/textModel.ts @@ -237,7 +237,7 @@ export class TextModel extends Disposable implements model.ITextModel { * Unlike, versionId, this can go down (via undo) or go to previous values (via redo) */ private _alternativeVersionId: number; - private readonly _shouldSimplifyMode: boolean; + private readonly _isTooLargeForSyncing: boolean; private readonly _isTooLargeForTokenization: boolean; //#region Editing @@ -299,10 +299,7 @@ export class TextModel extends Disposable implements model.ITextModel { this._isTooLargeForTokenization = false; } - this._shouldSimplifyMode = ( - this._isTooLargeForTokenization - || (bufferTextLength > TextModel.MODEL_SYNC_LIMIT) - ); + this._isTooLargeForSyncing = (bufferTextLength > TextModel.MODEL_SYNC_LIMIT); this._setVersionId(1); this._isDisposed = false; @@ -548,7 +545,7 @@ export class TextModel extends Disposable implements model.ITextModel { } public isTooLargeForSyncing(): boolean { - return this._shouldSimplifyMode; + return this._isTooLargeForSyncing; } public isTooLargeForTokenization(): boolean { From 499b3c9731b9fa3983760ab14c867b4255808f39 Mon Sep 17 00:00:00 2001 From: Dirk Baeumer Date: Wed, 25 Apr 2018 11:39:48 +0200 Subject: [PATCH 048/830] Make taskExecutions a ReadonlyArray --- src/vs/vscode.proposed.d.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/vs/vscode.proposed.d.ts b/src/vs/vscode.proposed.d.ts index 4194828c2b4..17f98c7bf01 100644 --- a/src/vs/vscode.proposed.d.ts +++ b/src/vs/vscode.proposed.d.ts @@ -412,7 +412,7 @@ declare module 'vscode' { * * @readonly */ - export let taskExecutions: TaskExecution[]; + export let taskExecutions: ReadonlyArray; /** * Fires when a task starts. From d99e5f06e8e21f436a9aad50b9e2d203df49e23f Mon Sep 17 00:00:00 2001 From: Dirk Baeumer Date: Wed, 25 Apr 2018 12:46:36 +0200 Subject: [PATCH 049/830] Fixes #48351: Tasks fail to run on networked locations --- .../electron-browser/terminalTaskSystem.ts | 26 +++++++++++++------ 1 file changed, 18 insertions(+), 8 deletions(-) diff --git a/src/vs/workbench/parts/tasks/electron-browser/terminalTaskSystem.ts b/src/vs/workbench/parts/tasks/electron-browser/terminalTaskSystem.ts index 584292e76c0..9cf72ec9d93 100644 --- a/src/vs/workbench/parts/tasks/electron-browser/terminalTaskSystem.ts +++ b/src/vs/workbench/parts/tasks/electron-browser/terminalTaskSystem.ts @@ -275,6 +275,7 @@ export class TerminalTaskSystem implements ITaskSystem { private executeCommand(task: CustomTask | ContributedTask, trigger: string): TPromise { let terminal: ITerminalInstance = undefined; let executedCommand: string = undefined; + let error: TaskError = undefined; let promise: TPromise = undefined; if (task.isBackground) { promise = new TPromise((resolve, reject) => { @@ -293,7 +294,10 @@ export class TerminalTaskSystem implements ITaskSystem { })); watchingProblemMatcher.aboutToStart(); let delayer: Async.Delayer = undefined; - [terminal, executedCommand] = this.createTerminal(task); + [terminal, executedCommand, error] = this.createTerminal(task); + if (error || !terminal) { + return; + } this._onDidStateChange.fire(TaskEvent.create(TaskEventKind.Start, task)); const registeredLinkMatchers = this.registerLinkMatchers(terminal, problemMatchers); const onData = terminal.onLineData((line) => { @@ -341,7 +345,10 @@ export class TerminalTaskSystem implements ITaskSystem { }); } else { promise = new TPromise((resolve, reject) => { - [terminal, executedCommand] = this.createTerminal(task); + [terminal, executedCommand, error] = this.createTerminal(task); + if (error || !terminal) { + return; + } this._onDidStateChange.fire(TaskEvent.create(TaskEventKind.Start, task)); this._onDidStateChange.fire(TaskEvent.create(TaskEventKind.Active, task)); let problemMatchers = this.resolveMatchers(task, task.problemMatchers); @@ -377,6 +384,9 @@ export class TerminalTaskSystem implements ITaskSystem { }); }); } + if (error) { + return TPromise.wrapError(new Error(error.message)); + } if (!terminal) { return TPromise.wrapError(new Error(`Failed to create terminal for task ${task._label}`)); } @@ -430,7 +440,7 @@ export class TerminalTaskSystem implements ITaskSystem { }); } - private createTerminal(task: CustomTask | ContributedTask): [ITerminalInstance, string] { + private createTerminal(task: CustomTask | ContributedTask): [ITerminalInstance, string, TaskError | undefined] { let options = this.resolveOptions(task, task.command.options); let { command, args } = this.resolveCommandAndArgs(task); let commandExecutable = CommandString.value(command); @@ -448,9 +458,6 @@ export class TerminalTaskSystem implements ITaskSystem { let shellLaunchConfig: IShellLaunchConfig = undefined; let isShellCommand = task.command.runtime === RuntimeType.Shell; if (isShellCommand) { - if (Platform.isWindows && ((options.cwd && TPath.isUNC(options.cwd)) || (!options.cwd && TPath.isUNC(process.cwd())))) { - throw new TaskError(Severity.Error, nls.localize('TerminalTaskSystem', 'Can\'t execute a shell command on an UNC drive.'), TaskErrors.UnknownError); - } shellLaunchConfig = { name: terminalName, executable: null, args: null, waitOnExit }; let shellSpecified: boolean = false; let shellOptions: ShellConfiguration = task.command.options && task.command.options.shell; @@ -472,6 +479,9 @@ export class TerminalTaskSystem implements ITaskSystem { if (Platform.isWindows) { windowsShellArgs = true; let basename = path.basename(shellLaunchConfig.executable).toLowerCase(); + if (basename === 'cmd.exe' && ((options.cwd && TPath.isUNC(options.cwd)) || (!options.cwd && TPath.isUNC(process.cwd())))) { + return [undefined, undefined, new TaskError(Severity.Error, nls.localize('TerminalTaskSystem', 'Can\'t execute a shell command on an UNC drive using cmd.exe.'), TaskErrors.UnknownError)]; + } if (basename === 'powershell.exe' || basename === 'pwsh.exe') { if (!shellSpecified) { toAdd.push('-Command'); @@ -568,7 +578,7 @@ export class TerminalTaskSystem implements ITaskSystem { } if (terminalToReuse) { terminalToReuse.terminal.reuseTerminal(shellLaunchConfig); - return [terminalToReuse.terminal, commandExecutable]; + return [terminalToReuse.terminal, commandExecutable, undefined]; } const result = this.terminalService.createTerminal(shellLaunchConfig); @@ -582,7 +592,7 @@ export class TerminalTaskSystem implements ITaskSystem { } }); this.terminals[terminalKey] = { terminal: result, lastTask: taskKey }; - return [result, commandExecutable]; + return [result, commandExecutable, undefined]; } private buildShellCommandLine(shellExecutable: string, shellOptions: ShellConfiguration, command: CommandString, args: CommandString[]): string { From d9f8813eb6f68113d1d1bba943456f590462ea5e Mon Sep 17 00:00:00 2001 From: Erich Gamma Date: Wed, 25 Apr 2018 13:32:21 +0200 Subject: [PATCH 050/830] Fixing issue #48539 improve wording of error message --- extensions/npm/package.nls.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/extensions/npm/package.nls.json b/extensions/npm/package.nls.json index c9093ef39a0..fa751eeba24 100644 --- a/extensions/npm/package.nls.json +++ b/extensions/npm/package.nls.json @@ -15,5 +15,5 @@ "command.debug": "Debug", "command.openScript": "Open", "npm.scriptInvalid": "Could not find the script '{0}'. Try to refresh the view.", - "npm.noDebugOptions": "Could not launch '{0}' for debugging, the script needs to include the node debug options: '--nolazy --inspect-brk=port', [learn more](https://code.visualstudio.com/docs/nodejs/nodejs-debugging#_launch-configuration-support-for-npm-and-other-tools).`" + "npm.noDebugOptions": "Could not launch '{0}' for debugging because the scripts lacks a node debug option, e.g. '--inspect-brk'." } From 7cf5c292d13e2826c0c3c340761f5ef9dffbe7b0 Mon Sep 17 00:00:00 2001 From: Erich Gamma Date: Wed, 25 Apr 2018 13:53:47 +0200 Subject: [PATCH 051/830] Fixing #48538 use modal alert for the error message --- extensions/npm/src/npmView.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/extensions/npm/src/npmView.ts b/extensions/npm/src/npmView.ts index 58293583ffe..f3f92d19505 100644 --- a/extensions/npm/src/npmView.ts +++ b/extensions/npm/src/npmView.ts @@ -159,8 +159,8 @@ export class NpmScriptsTreeDataProvider implements TreeDataProvider { let debugArg = await this.extractDebugArg(scripts, task); if (!debugArg) { - let message = localize('npm.noDebugOptions', 'Could not launch "{0}" for debugging, the script needs to include the node debug options: "--nolazy --inspect-brk=port", [learn more](https://code.visualstudio.com/docs/nodejs/nodejs-debugging#_launch-configuration-support-for-npm-and-other-tools).', task.name); - window.showErrorMessage(message); + let message = localize('npm.noDebugOptions', 'Could not launch "{0}" for debugging because the scripts lacks a node debug option, e.g. "--inspect-brk".', task.name); + window.showErrorMessage(message, { modal: true }); return; } From ea40a3e00137daba2e890bed7089c7d25262808b Mon Sep 17 00:00:00 2001 From: Erich Gamma Date: Wed, 25 Apr 2018 14:03:13 +0200 Subject: [PATCH 052/830] Fixing #48552 specify the protocol --- extensions/npm/src/npmView.ts | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/extensions/npm/src/npmView.ts b/extensions/npm/src/npmView.ts index f3f92d19505..94f9bdbebbc 100644 --- a/extensions/npm/src/npmView.ts +++ b/extensions/npm/src/npmView.ts @@ -164,6 +164,11 @@ export class NpmScriptsTreeDataProvider implements TreeDataProvider { return; } + let protocol = 'inspector'; + if (debugArg[0] === 'debug') { + protocol = 'legacy'; + } + let packageManager = getPackageManager(script.getFolder()); const config: DebugConfiguration = { type: 'node', @@ -174,7 +179,8 @@ export class NpmScriptsTreeDataProvider implements TreeDataProvider { 'run-script', task.name, ], - port: debugArg[1] + port: debugArg[1], + protocol: protocol }; if (isWorkspaceFolder(task.scope)) { From 1fbb30d149ab4c43b5167a0595fd21725ca5d2b0 Mon Sep 17 00:00:00 2001 From: Sandeep Somavarapu Date: Wed, 25 Apr 2018 13:38:30 +0200 Subject: [PATCH 053/830] :lipstick: --- .../browser/viewsContainersExtensionPoint.ts | 118 +++++++++--------- 1 file changed, 62 insertions(+), 56 deletions(-) diff --git a/src/vs/workbench/api/browser/viewsContainersExtensionPoint.ts b/src/vs/workbench/api/browser/viewsContainersExtensionPoint.ts index 85a1e5509c0..5a220bc3886 100644 --- a/src/vs/workbench/api/browser/viewsContainersExtensionPoint.ts +++ b/src/vs/workbench/api/browser/viewsContainersExtensionPoint.ts @@ -69,13 +69,16 @@ export const viewsContainersContribution: IJSONSchema = { }; export const viewsContainersExtensionPoint: IExtensionPoint<{ [loc: string]: IUserFriendlyViewsContainerDescriptor[] }> = ExtensionsRegistry.registerExtensionPoint<{ [loc: string]: IUserFriendlyViewsContainerDescriptor[] }>('viewsContainers', [], viewsContainersContribution); + +const CUSTOM_VIEW_CONTAINER_ORDER = 5; + class ViewsContainersExtensionHandler implements IWorkbenchContribution { constructor() { - this.handleViewsContainersExtensionPoint(); + this.handleAndRegisterCustomViewContainers(); } - private handleViewsContainersExtensionPoint() { + private handleAndRegisterCustomViewContainers() { viewsContainersExtensionPoint.setHandler((extensions) => { for (let extension of extensions) { const { value, collector } = extension; @@ -89,7 +92,7 @@ class ViewsContainersExtensionHandler implements IWorkbenchContribution { } switch (entry.key) { case 'activitybar': - this.contributeToActivitybar(entry.value, extension.description); + this.registerCustomViewContainers(entry.value, extension.description); break; } }); @@ -125,63 +128,66 @@ class ViewsContainersExtensionHandler implements IWorkbenchContribution { return true; } - private contributeToActivitybar(containers: IUserFriendlyViewsContainerDescriptor[], extension: IExtensionDescription) { + private registerCustomViewContainers(containers: IUserFriendlyViewsContainerDescriptor[], extension: IExtensionDescription) { containers.forEach((descriptor, index) => { - const id = `workbench.view.extension.${descriptor.id}`; - const title = descriptor.title; const cssClass = `extensionViewlet-${descriptor.id}`; - const location: ViewLocation = ViewLocation.register(id); - - // Generate CSS to show the icon in the activity bar - const iconClass = `.monaco-workbench > .activitybar .monaco-action-bar .action-label.${cssClass}`; - const iconPath = join(extension.extensionFolderPath, descriptor.icon); - createCSSRule(iconClass, `-webkit-mask: url('${iconPath}') no-repeat 50% 50%`); - - // Register as viewlet - class CustomViewlet extends PersistentViewsViewlet { - constructor( - @IPartService partService: IPartService, - @ITelemetryService telemetryService: ITelemetryService, - @IWorkspaceContextService contextService: IWorkspaceContextService, - @IStorageService storageService: IStorageService, - @IWorkbenchEditorService editorService: IWorkbenchEditorService, - @IInstantiationService instantiationService: IInstantiationService, - @IContextKeyService contextKeyService: IContextKeyService, - @IThemeService themeService: IThemeService, - @IContextMenuService contextMenuService: IContextMenuService, - @IExtensionService extensionService: IExtensionService - ) { - super(id, location, `${id}.state`, true, partService, telemetryService, storageService, instantiationService, themeService, contextService, contextKeyService, contextMenuService, extensionService); - } - } - const viewletDescriptor = new ViewletDescriptor( - CustomViewlet, - id, - title, - cssClass, - 6 + index - ); - - Registry.as(ViewletExtensions.Viewlets).registerViewlet(viewletDescriptor); - - // Register Action to Open Viewlet - class OpenCustomViewletAction extends ToggleViewletAction { - constructor( - id: string, label: string, - @IViewletService viewletService: IViewletService, - @IWorkbenchEditorService editorService: IWorkbenchEditorService - ) { - super(id, label, id, viewletService, editorService); - } - } - const registry = Registry.as(ActionExtensions.WorkbenchActions); - registry.registerWorkbenchAction( - new SyncActionDescriptor(OpenCustomViewletAction, id, localize('showViewlet', "Show {0}", title)), - 'View: Show {0}', - localize('view', "View") - ); + const icon = join(extension.extensionFolderPath, descriptor.icon); + this.registerCustomViewlet({ id: descriptor.id, title: descriptor.title, icon }, CUSTOM_VIEW_CONTAINER_ORDER + index + 1, cssClass); }); } + + private registerCustomViewlet(descriptor: IUserFriendlyViewsContainerDescriptor, order: number, cssClass: string): void { + const id = `workbench.view.extension.${descriptor.id}`; + const location: ViewLocation = ViewLocation.register(id); + + // Register as viewlet + class CustomViewlet extends PersistentViewsViewlet { + constructor( + @IPartService partService: IPartService, + @ITelemetryService telemetryService: ITelemetryService, + @IWorkspaceContextService contextService: IWorkspaceContextService, + @IStorageService storageService: IStorageService, + @IWorkbenchEditorService editorService: IWorkbenchEditorService, + @IInstantiationService instantiationService: IInstantiationService, + @IContextKeyService contextKeyService: IContextKeyService, + @IThemeService themeService: IThemeService, + @IContextMenuService contextMenuService: IContextMenuService, + @IExtensionService extensionService: IExtensionService + ) { + super(id, location, `${id}.state`, true, partService, telemetryService, storageService, instantiationService, themeService, contextService, contextKeyService, contextMenuService, extensionService); + } + } + const viewletDescriptor = new ViewletDescriptor( + CustomViewlet, + id, + descriptor.title, + cssClass, + order + ); + + Registry.as(ViewletExtensions.Viewlets).registerViewlet(viewletDescriptor); + + // Register Action to Open Viewlet + class OpenCustomViewletAction extends ToggleViewletAction { + constructor( + id: string, label: string, + @IViewletService viewletService: IViewletService, + @IWorkbenchEditorService editorService: IWorkbenchEditorService + ) { + super(id, label, id, viewletService, editorService); + } + } + const registry = Registry.as(ActionExtensions.WorkbenchActions); + registry.registerWorkbenchAction( + new SyncActionDescriptor(OpenCustomViewletAction, id, localize('showViewlet', "Show {0}", descriptor.title)), + 'View: Show {0}', + localize('view', "View") + ); + + // Generate CSS to show the icon in the activity bar + const iconClass = `.monaco-workbench > .activitybar .monaco-action-bar .action-label.${cssClass}`; + createCSSRule(iconClass, `-webkit-mask: url('${descriptor.icon}') no-repeat 50% 50%;`); + } } const workbenchRegistry = Registry.as(WorkbenchExtensions.Workbench); From 4e920c01863e33a4cd4f1873585dea0bd559166b Mon Sep 17 00:00:00 2001 From: Sandeep Somavarapu Date: Wed, 25 Apr 2018 14:05:22 +0200 Subject: [PATCH 054/830] #48529 Handle scm viewlet views --- src/vs/workbench/parts/quickopen/browser/viewPickerHandler.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/vs/workbench/parts/quickopen/browser/viewPickerHandler.ts b/src/vs/workbench/parts/quickopen/browser/viewPickerHandler.ts index 8ec84daa300..715b5428b20 100644 --- a/src/vs/workbench/parts/quickopen/browser/viewPickerHandler.ts +++ b/src/vs/workbench/parts/quickopen/browser/viewPickerHandler.ts @@ -22,6 +22,7 @@ import { matchesFuzzy } from 'vs/base/common/filters'; import { ViewsRegistry, ViewLocation, IViewsService } from 'vs/workbench/common/views'; import { IContextKeyService } from 'vs/platform/contextkey/common/contextkey'; import { ViewletDescriptor } from 'vs/workbench/browser/viewlet'; +import { VIEWLET_ID as SCM_VIEWLET_ID } from 'vs/workbench/parts/scm/common/scm'; export const VIEW_PICKER_PREFIX = 'view '; @@ -144,7 +145,7 @@ export class ViewPickerHandler extends QuickOpenHandler { // Viewlet Views viewlets.forEach((viewlet, index) => { - const viewLocation: ViewLocation = ViewLocation.get(viewlet.id); + const viewLocation: ViewLocation = viewlet.id === SCM_VIEWLET_ID ? ViewLocation.SCM : ViewLocation.get(viewlet.id); if (viewLocation) { const viewEntriesForViewlet: ViewEntry[] = getViewEntriesForViewlet(viewlet, viewLocation); viewEntries.push(...viewEntriesForViewlet); From e572ffc4f6df508069408748029ff24396178ce2 Mon Sep 17 00:00:00 2001 From: Johannes Rieken Date: Wed, 25 Apr 2018 14:12:03 +0200 Subject: [PATCH 055/830] unsure what's happening here... #48662 --- src/vs/base/node/encoding.ts | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/vs/base/node/encoding.ts b/src/vs/base/node/encoding.ts index a600eb25bc3..80da2a7c5c1 100644 --- a/src/vs/base/node/encoding.ts +++ b/src/vs/base/node/encoding.ts @@ -23,7 +23,7 @@ export interface IDecodeStreamOptions { overwriteEncoding?(detectedEncoding: string): string; } -export function toDecodeStream(readable: Readable, options: IDecodeStreamOptions): Promise<{ detected: IDetectedEncodingResult, stream: NodeJS.ReadableStream }> { +export function toDecodeStream(readable: Readable, options: IDecodeStreamOptions): TPromise<{ detected: IDetectedEncodingResult, stream: NodeJS.ReadableStream }> { if (!options.minBytesRequiredForDetection) { options.minBytesRequiredForDetection = options.guessEncoding ? AUTO_GUESS_BUFFER_MAX_LEN : NO_GUESS_BUFFER_MAX_LEN; @@ -33,7 +33,7 @@ export function toDecodeStream(readable: Readable, options: IDecodeStreamOptions options.overwriteEncoding = detected => detected || UTF8; } - return new Promise<{ detected: IDetectedEncodingResult, stream: NodeJS.ReadableStream }>((resolve, reject) => { + return new TPromise<{ detected: IDetectedEncodingResult, stream: NodeJS.ReadableStream }>((resolve, reject) => { readable.pipe(new class extends Writable { private _decodeStream: NodeJS.ReadWriteStream; @@ -76,7 +76,7 @@ export function toDecodeStream(readable: Readable, options: IDecodeStreamOptions _startDecodeStream(callback: Function): void { - this._decodeStreamConstruction = Promise.resolve(detectEncodingFromBuffer({ + this._decodeStreamConstruction = TPromise.as(detectEncodingFromBuffer({ buffer: Buffer.concat(this._buffer), bytesRead: this._bytesBuffered }, options.guessEncoding)).then(detected => { detected.encoding = options.overwriteEncoding(detected.encoding); From 7115b31286cded01f00713ea48342d372e7b47e4 Mon Sep 17 00:00:00 2001 From: Alex Dima Date: Wed, 25 Apr 2018 14:20:35 +0200 Subject: [PATCH 056/830] Fixes #47225 --- src/vs/editor/browser/core/editorState.ts | 30 +++++++++++++++++++ .../editor/browser/widget/diffEditorWidget.ts | 14 +++++++-- .../contrib/codelens/codelensController.ts | 18 ++--------- 3 files changed, 44 insertions(+), 18 deletions(-) diff --git a/src/vs/editor/browser/core/editorState.ts b/src/vs/editor/browser/core/editorState.ts index 06bfc99b35a..c3da7dace30 100644 --- a/src/vs/editor/browser/core/editorState.ts +++ b/src/vs/editor/browser/core/editorState.ts @@ -71,3 +71,33 @@ export class EditorState { return this._equals(new EditorState(editor, this.flags)); } } + +export class StableEditorScrollState { + + public static capture(editor: ICodeEditor): StableEditorScrollState { + let visiblePosition: Position = null; + let visiblePositionScrollDelta = 0; + if (editor.getScrollTop() !== 0) { + const visibleRanges = editor.getVisibleRanges(); + if (visibleRanges.length > 0) { + visiblePosition = visibleRanges[0].getStartPosition(); + const visiblePositionScrollTop = editor.getTopForPosition(visiblePosition.lineNumber, visiblePosition.column); + visiblePositionScrollDelta = editor.getScrollTop() - visiblePositionScrollTop; + } + } + return new StableEditorScrollState(visiblePosition, visiblePositionScrollDelta); + } + + constructor( + private readonly _visiblePosition: Position, + private readonly _visiblePositionScrollDelta: number + ) { + } + + public restore(editor: ICodeEditor): void { + if (this._visiblePosition) { + const visiblePositionScrollTop = editor.getTopForPosition(this._visiblePosition.lineNumber, this._visiblePosition.column); + editor.setScrollTop(visiblePositionScrollTop + this._visiblePositionScrollDelta); + } + } +} diff --git a/src/vs/editor/browser/widget/diffEditorWidget.ts b/src/vs/editor/browser/widget/diffEditorWidget.ts index fd92e00b778..4eb32cd0085 100644 --- a/src/vs/editor/browser/widget/diffEditorWidget.ts +++ b/src/vs/editor/browser/widget/diffEditorWidget.ts @@ -43,6 +43,7 @@ import URI from 'vs/base/common/uri'; import { IStringBuilder, createStringBuilder } from 'vs/editor/common/core/stringBuilder'; import { IModelDeltaDecoration, IModelDecorationsChangeAccessor, ITextModel } from 'vs/editor/common/model'; import { INotificationService } from 'vs/platform/notification/common/notification'; +import { StableEditorScrollState } from 'vs/editor/browser/core/editorState'; interface IEditorDiffDecorations { decorations: IModelDeltaDecoration[]; @@ -102,7 +103,10 @@ class VisualEditorState { this._decorations = editor.deltaDecorations(this._decorations, []); } - public apply(editor: CodeEditor, overviewRuler: editorBrowser.IOverviewRuler, newDecorations: IEditorDiffDecorationsWithZones): void { + public apply(editor: CodeEditor, overviewRuler: editorBrowser.IOverviewRuler, newDecorations: IEditorDiffDecorationsWithZones, restoreScrollState: boolean): void { + + const scrollState = restoreScrollState ? StableEditorScrollState.capture(editor) : null; + // view zones editor.changeViewZones((viewChangeAccessor: editorBrowser.IViewZoneChangeAccessor) => { for (let i = 0, length = this._zones.length; i < length; i++) { @@ -118,6 +122,10 @@ class VisualEditorState { } }); + if (scrollState) { + scrollState.restore(editor); + } + // decorations this._decorations = editor.deltaDecorations(this._decorations, newDecorations.decorations); @@ -916,8 +924,8 @@ export class DiffEditorWidget extends Disposable implements editorBrowser.IDiffE try { this._currentlyChangingViewZones = true; - this._originalEditorState.apply(this.originalEditor, this._originalOverviewRuler, diffDecorations.original); - this._modifiedEditorState.apply(this.modifiedEditor, this._modifiedOverviewRuler, diffDecorations.modified); + this._originalEditorState.apply(this.originalEditor, this._originalOverviewRuler, diffDecorations.original, false); + this._modifiedEditorState.apply(this.modifiedEditor, this._modifiedOverviewRuler, diffDecorations.modified, true); } finally { this._currentlyChangingViewZones = false; } diff --git a/src/vs/editor/contrib/codelens/codelensController.ts b/src/vs/editor/contrib/codelens/codelensController.ts index 1c714b60884..901348a1e27 100644 --- a/src/vs/editor/contrib/codelens/codelensController.ts +++ b/src/vs/editor/contrib/codelens/codelensController.ts @@ -10,7 +10,6 @@ import { onUnexpectedError } from 'vs/base/common/errors'; import { IDisposable, dispose } from 'vs/base/common/lifecycle'; import { TPromise } from 'vs/base/common/winjs.base'; import { ICommandService } from 'vs/platform/commands/common/commands'; -import { Position } from 'vs/editor/common/core/position'; import * as editorCommon from 'vs/editor/common/editorCommon'; import { CodeLensProviderRegistry, ICodeLensSymbol } from 'vs/editor/common/modes'; import * as editorBrowser from 'vs/editor/browser/editorBrowser'; @@ -20,6 +19,7 @@ import { IConfigurationChangedEvent } from 'vs/editor/common/config/editorOption import { CodeLens, CodeLensHelper } from 'vs/editor/contrib/codelens/codelensWidget'; import { IModelDecorationsChangeAccessor } from 'vs/editor/common/model'; import { INotificationService } from 'vs/platform/notification/common/notification'; +import { StableEditorScrollState } from 'vs/editor/browser/core/editorState'; export class CodeLensContribution implements editorCommon.IEditorContribution { @@ -219,16 +219,7 @@ export class CodeLensContribution implements editorCommon.IEditorContribution { } } - let visiblePosition: Position = null; - let visiblePositionScrollDelta = 0; - if (this._editor.getScrollTop() !== 0) { - const visibleRanges = this._editor.getVisibleRanges(); - if (visibleRanges.length > 0) { - visiblePosition = visibleRanges[0].getStartPosition(); - const visiblePositionScrollTop = this._editor.getTopForPosition(visiblePosition.lineNumber, visiblePosition.column); - visiblePositionScrollDelta = this._editor.getScrollTop() - visiblePositionScrollTop; - } - } + const scrollState = StableEditorScrollState.capture(this._editor); this._editor.changeDecorations((changeAccessor) => { this._editor.changeViewZones((accessor) => { @@ -270,10 +261,7 @@ export class CodeLensContribution implements editorCommon.IEditorContribution { }); }); - if (visiblePosition) { - const visiblePositionScrollTop = this._editor.getTopForPosition(visiblePosition.lineNumber, visiblePosition.column); - this._editor.setScrollTop(visiblePositionScrollTop + visiblePositionScrollDelta); - } + scrollState.restore(this._editor); } private _onViewportChanged(): void { From 996ba231a109969400d9a79937929860003c63ec Mon Sep 17 00:00:00 2001 From: Christof Marti Date: Wed, 25 Apr 2018 14:51:07 +0200 Subject: [PATCH 057/830] OSS update --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 620ae7ea445..aba7c5c031c 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "code-oss-dev", "version": "1.23.0", - "distro": "ed36a29ddadc357cdceba6ff5e3e7d5e27893dee", + "distro": "ba59d3ae8e284d5cfe6803e1101e9d86163ab256", "author": { "name": "Microsoft Corporation" }, From aa63600dd2b930b741fb94670cbc0473593f9b7d Mon Sep 17 00:00:00 2001 From: Johannes Rieken Date: Wed, 25 Apr 2018 14:52:48 +0200 Subject: [PATCH 058/830] no optional fields in watch-options, #48527 --- src/vs/platform/files/common/files.ts | 4 ++-- src/vs/vscode.d.ts | 2 +- .../files/electron-browser/remoteFileService.ts | 14 +++++++++----- 3 files changed, 12 insertions(+), 8 deletions(-) diff --git a/src/vs/platform/files/common/files.ts b/src/vs/platform/files/common/files.ts index 256d1e8e899..a43f44887f5 100644 --- a/src/vs/platform/files/common/files.ts +++ b/src/vs/platform/files/common/files.ts @@ -193,8 +193,8 @@ export interface IStat { } export interface IWatchOptions { - recursive?: boolean; - exclude?: string[]; + recursive: boolean; + excludes: string[]; } export enum FileSystemProviderCapabilities { diff --git a/src/vs/vscode.d.ts b/src/vs/vscode.d.ts index 1d637a470a7..5ce1237ebd6 100644 --- a/src/vs/vscode.d.ts +++ b/src/vs/vscode.d.ts @@ -4979,7 +4979,7 @@ declare module 'vscode' { * @param uri * @param options */ - watch(uri: Uri, options: { recursive?: boolean; excludes?: string[] }): Disposable; + watch(uri: Uri, options: { recursive: boolean; excludes: string[] }): Disposable; /** * Retrieve metadata about a file. Throw an [`FileNotFound`](#FileSystemError.FileNotFound)-error diff --git a/src/vs/workbench/services/files/electron-browser/remoteFileService.ts b/src/vs/workbench/services/files/electron-browser/remoteFileService.ts index 835ec80fb14..0d898666576 100644 --- a/src/vs/workbench/services/files/electron-browser/remoteFileService.ts +++ b/src/vs/workbench/services/files/electron-browser/remoteFileService.ts @@ -16,7 +16,7 @@ import { ITextResourceConfigurationService } from 'vs/editor/common/services/res import { localize } from 'vs/nls'; import { IConfigurationService } from 'vs/platform/configuration/common/configuration'; import { IEnvironmentService } from 'vs/platform/environment/common/environment'; -import { FileChangesEvent, FileOperation, FileOperationError, FileOperationEvent, FileOperationResult, FileOptions, FileSystemProviderCapabilities, IContent, ICreateFileOptions, IFileStat, IFileSystemProvider, IFilesConfiguration, IResolveContentOptions, IResolveFileOptions, IResolveFileResult, IStat, IStreamContent, ITextSnapshot, IUpdateContentOptions, StringSnapshot } from 'vs/platform/files/common/files'; +import { FileChangesEvent, FileOperation, FileOperationError, FileOperationEvent, FileOperationResult, FileOptions, FileSystemProviderCapabilities, IContent, ICreateFileOptions, IFileStat, IFileSystemProvider, IFilesConfiguration, IResolveContentOptions, IResolveFileOptions, IResolveFileResult, IStat, IStreamContent, ITextSnapshot, IUpdateContentOptions, StringSnapshot, IWatchOptions } from 'vs/platform/files/common/files'; import { ILifecycleService } from 'vs/platform/lifecycle/common/lifecycle'; import { INotificationService } from 'vs/platform/notification/common/notification'; import { IStorageService } from 'vs/platform/storage/common/storage'; @@ -117,17 +117,17 @@ class WorkspaceWatchLogic { } private _watchWorkspace(resource: URI) { - let exclude: string[] = []; + let excludes: string[] = []; let config = this._configurationService.getValue({ resource }); if (config.files && config.files.watcherExclude) { for (const key in config.files.watcherExclude) { if (config.files.watcherExclude[key] === true) { - exclude.push(key); + excludes.push(key); } } } this._watches.set(resource.toString(), resource); - this._fileService.watchFileChanges(resource, { recursive: true, exclude }); + this._fileService.watchFileChanges(resource, { recursive: true, excludes }); } private _unwatchWorkspace(resource: URI) { @@ -599,11 +599,15 @@ export class RemoteFileService extends FileService { private _activeWatches = new Map, count: number }>(); - public watchFileChanges(resource: URI, opts: { recursive?: boolean, exclude?: string[] } = {}): void { + public watchFileChanges(resource: URI, opts?: IWatchOptions): void { if (resource.scheme === Schemas.file) { return super.watchFileChanges(resource); } + if (!opts) { + opts = { recursive: false, excludes: [] }; + } + const key = resource.toString(); const entry = this._activeWatches.get(key); if (entry) { From d3f749b35d1c057efd57c7094cdea2f8a6256173 Mon Sep 17 00:00:00 2001 From: Dirk Baeumer Date: Wed, 25 Apr 2018 15:02:09 +0200 Subject: [PATCH 059/830] Fixes #48260: `workspace.fetchTasks` throws a `TypeError` --- src/vs/vscode.d.ts | 3 +++ .../api/electron-browser/mainThreadTask.ts | 3 --- src/vs/workbench/api/node/extHostTask.ts | 4 +-- .../tasks/common/taskDefinitionRegistry.ts | 2 +- src/vs/workbench/parts/tasks/common/tasks.ts | 26 ++++++++----------- 5 files changed, 17 insertions(+), 21 deletions(-) diff --git a/src/vs/vscode.d.ts b/src/vs/vscode.d.ts index 5ce1237ebd6..efe3eb07a9b 100644 --- a/src/vs/vscode.d.ts +++ b/src/vs/vscode.d.ts @@ -4471,6 +4471,9 @@ declare module 'vscode' { * script: string; * } * ``` + * + * Note that type identifier starting with a '$' are reserved for internal + * usages and shouldn't be used by extensions. */ readonly type: string; diff --git a/src/vs/workbench/api/electron-browser/mainThreadTask.ts b/src/vs/workbench/api/electron-browser/mainThreadTask.ts index cd32296c9da..75f08197085 100644 --- a/src/vs/workbench/api/electron-browser/mainThreadTask.ts +++ b/src/vs/workbench/api/electron-browser/mainThreadTask.ts @@ -285,9 +285,6 @@ namespace TaskDTO { } } } - if (!result.execution) { - return undefined; - } return result; } diff --git a/src/vs/workbench/api/node/extHostTask.ts b/src/vs/workbench/api/node/extHostTask.ts index 024ad5f56b0..194121f17cc 100644 --- a/src/vs/workbench/api/node/extHostTask.ts +++ b/src/vs/workbench/api/node/extHostTask.ts @@ -610,7 +610,7 @@ namespace TaskDTO { scope = value.scope.uri.toJSON(); } } - if (!execution || !definition || !scope) { + if (!definition || !scope) { return undefined; } let group = (value.group as types.TaskGroup) ? (value.group as types.TaskGroup).id : undefined; @@ -655,7 +655,7 @@ namespace TaskDTO { scope = types.TaskScope.Workspace; } } - if (!execution || !definition || !scope) { + if (!definition || !scope) { return undefined; } let result = new types.Task(definition, scope, value.name, value.source.label, execution, value.problemMatchers); diff --git a/src/vs/workbench/parts/tasks/common/taskDefinitionRegistry.ts b/src/vs/workbench/parts/tasks/common/taskDefinitionRegistry.ts index cc197afc0ce..7a2bab4ba3a 100644 --- a/src/vs/workbench/parts/tasks/common/taskDefinitionRegistry.ts +++ b/src/vs/workbench/parts/tasks/common/taskDefinitionRegistry.ts @@ -22,7 +22,7 @@ const taskDefinitionSchema: IJSONSchema = { properties: { type: { type: 'string', - description: nls.localize('TaskDefinition.description', 'The actual task type') + description: nls.localize('TaskDefinition.description', 'The actual task type. Please note that types starting with a \'$\' are reserved for internal usage.') }, required: { type: 'array', diff --git a/src/vs/workbench/parts/tasks/common/tasks.ts b/src/vs/workbench/parts/tasks/common/tasks.ts index 8fd3e0fc004..bfdbdad02e7 100644 --- a/src/vs/workbench/parts/tasks/common/tasks.ts +++ b/src/vs/workbench/parts/tasks/common/tasks.ts @@ -7,14 +7,12 @@ import * as Types from 'vs/base/common/types'; import { IJSONSchemaMap } from 'vs/base/common/jsonSchema'; import * as Objects from 'vs/base/common/objects'; -import { generateUuid } from 'vs/base/common/uuid'; import { UriComponents } from 'vs/base/common/uri'; import { IExtensionDescription } from 'vs/workbench/services/extensions/common/extensions'; import { ProblemMatcher } from 'vs/workbench/parts/tasks/common/problemMatcher'; import { IWorkspaceFolder } from 'vs/platform/workspace/common/workspace'; - export enum ShellQuoting { /** * Default is character escaping. @@ -445,20 +443,18 @@ export namespace CustomTask { return candidate && candidate.type === 'custom'; } export function getDefinition(task: CustomTask): TaskIdentifier { - if (task.command === void 0) { - return undefined; - } - if (task.command.runtime === RuntimeType.Shell) { - return { - _key: generateUuid(), - type: 'shell' - }; + let type: string; + if (task.command !== void 0) { + type = task.command.runtime === RuntimeType.Shell ? 'shell' : 'process'; } else { - return { - _key: generateUuid(), - type: 'process' - }; + type = '$composite'; } + let result: TaskIdentifier = { + type, + _key: task._id, + id: task._id + }; + return result; } } @@ -617,7 +613,7 @@ export namespace Task { export function getTaskDefinition(task: Task): TaskIdentifier { if (ContributedTask.is(task)) { return task.defines; - } else if (CustomTask.is(task) && task.command !== void 0) { + } else if (CustomTask.is(task)) { return CustomTask.getDefinition(task); } else { return undefined; From 42512b2c59d9d103bcc5ad69b92279b217c9fb74 Mon Sep 17 00:00:00 2001 From: isidor Date: Wed, 25 Apr 2018 15:17:33 +0200 Subject: [PATCH 060/830] debug: fix activation events fixes #47779 --- .../debugConfigurationManager.ts | 109 ++++++++++-------- .../debug/electron-browser/debugService.ts | 21 ++-- 2 files changed, 68 insertions(+), 62 deletions(-) diff --git a/src/vs/workbench/parts/debug/electron-browser/debugConfigurationManager.ts b/src/vs/workbench/parts/debug/electron-browser/debugConfigurationManager.ts index 1428ee55ed1..9614c85cc97 100644 --- a/src/vs/workbench/parts/debug/electron-browser/debugConfigurationManager.ts +++ b/src/vs/workbench/parts/debug/electron-browser/debugConfigurationManager.ts @@ -242,6 +242,7 @@ export class ConfigurationManager implements IConfigurationManager { @ICommandService private commandService: ICommandService, @IStorageService private storageService: IStorageService, @ILifecycleService lifecycleService: ILifecycleService, + @IExtensionService private extensionService: IExtensionService, @IConfigurationResolverService private configurationResolverService: IConfigurationResolverService ) { this.providers = []; @@ -277,19 +278,21 @@ export class ConfigurationManager implements IConfigurationManager { } public resolveConfigurationByProviders(folderUri: uri | undefined, type: string | undefined, debugConfiguration: IConfig): TPromise { - // pipe the config through the promises sequentially. append at the end the '*' types - const providers = this.providers.filter(p => p.type === type && p.resolveDebugConfiguration) - .concat(this.providers.filter(p => p.type === '*' && p.resolveDebugConfiguration)); + return this.extensionService.activateByEvent(`onDebugResolve:${type}`).then(() => { + // pipe the config through the promises sequentially. append at the end the '*' types + const providers = this.providers.filter(p => p.type === type && p.resolveDebugConfiguration) + .concat(this.providers.filter(p => p.type === '*' && p.resolveDebugConfiguration)); - return providers.reduce((promise, provider) => { - return promise.then(config => { - if (config) { - return provider.resolveDebugConfiguration(folderUri, config); - } else { - return Promise.resolve(config); - } - }); - }, TPromise.as(debugConfiguration)); + return providers.reduce((promise, provider) => { + return promise.then(config => { + if (config) { + return provider.resolveDebugConfiguration(folderUri, config); + } else { + return Promise.resolve(config); + } + }); + }, TPromise.as(debugConfiguration)); + }); } public provideDebugConfigurations(folderUri: uri | undefined, type: string): TPromise { @@ -499,41 +502,48 @@ export class ConfigurationManager implements IConfigurationManager { } public guessDebugger(type?: string): TPromise { - if (type) { - const adapter = this.getDebugger(type); - return TPromise.as(adapter); - } + return this.activateDebuggers().then(() => { - const editor = this.editorService.getActiveEditor(); - let candidates: Debugger[]; - if (editor) { - const codeEditor = editor.getControl(); - if (isCodeEditor(codeEditor)) { - const model = codeEditor.getModel(); - const language = model ? model.getLanguageIdentifier().language : undefined; - const adapters = this.debuggers.filter(a => a.languages && a.languages.indexOf(language) >= 0); - if (adapters.length === 1) { - return TPromise.as(adapters[0]); - } - if (adapters.length > 1) { - candidates = adapters; + if (type) { + const adapter = this.getDebugger(type); + return TPromise.as(adapter); + } + + const editor = this.editorService.getActiveEditor(); + let candidates: Debugger[]; + if (editor) { + const codeEditor = editor.getControl(); + if (isCodeEditor(codeEditor)) { + const model = codeEditor.getModel(); + const language = model ? model.getLanguageIdentifier().language : undefined; + const adapters = this.debuggers.filter(a => a.languages && a.languages.indexOf(language) >= 0); + if (adapters.length === 1) { + return TPromise.as(adapters[0]); + } + if (adapters.length > 1) { + candidates = adapters; + } } } - } - if (!candidates) { - candidates = this.debuggers.filter(a => a.hasInitialConfiguration() || a.hasConfigurationProvider); - } - return this.quickOpenService.pick([...candidates, { label: 'More...', separator: { border: true } }], { placeHolder: nls.localize('selectDebug', "Select Environment") }) - .then(picked => { - if (picked instanceof Debugger) { - return picked; - } - if (picked) { - this.commandService.executeCommand('debug.installAdditionalDebuggers'); - } - return undefined; - }); + if (!candidates) { + candidates = this.debuggers.filter(a => a.hasInitialConfiguration() || a.hasConfigurationProvider); + } + return this.quickOpenService.pick([...candidates, { label: 'More...', separator: { border: true } }], { placeHolder: nls.localize('selectDebug', "Select Environment") }) + .then(picked => { + if (picked instanceof Debugger) { + return picked; + } + if (picked) { + this.commandService.executeCommand('debug.installAdditionalDebuggers'); + } + return undefined; + }); + }); + } + + public activateDebuggers(): TPromise { + return this.extensionService.activateByEvent('onDebugInitialConfigurations').then(() => this.extensionService.activateByEvent('onDebug')); } private store(): void { @@ -557,7 +567,6 @@ class Launch implements ILaunch { @IWorkbenchEditorService protected editorService: IWorkbenchEditorService, @IConfigurationService protected configurationService: IConfigurationService, @IWorkspaceContextService protected contextService: IWorkspaceContextService, - @IExtensionService private extensionService: IExtensionService ) { // noop } @@ -615,7 +624,7 @@ class Launch implements ILaunch { } public openConfigFile(sideBySide: boolean, type?: string): TPromise { - return this.extensionService.activateByEvent('onDebugInitialConfigurations').then(() => this.extensionService.activateByEvent('onDebug').then(() => { + return this.configurationManager.activateDebuggers().then(() => { const resource = this.uri; let pinned = false; @@ -668,7 +677,7 @@ class Launch implements ILaunch { }, (error) => { throw new Error(nls.localize('DebugConfig.failed', "Unable to create 'launch.json' file inside the '.vscode' folder ({0}).", error)); }); - })); + }); } } @@ -681,9 +690,8 @@ class WorkspaceLaunch extends Launch implements ILaunch { @IConfigurationService configurationService: IConfigurationService, @IConfigurationResolverService configurationResolverService: IConfigurationResolverService, @IWorkspaceContextService contextService: IWorkspaceContextService, - @IExtensionService extensionService: IExtensionService ) { - super(configurationManager, undefined, fileService, editorService, configurationService, contextService, extensionService); + super(configurationManager, undefined, fileService, editorService, configurationService, contextService); } get uri(): uri { @@ -712,10 +720,9 @@ class UserLaunch extends Launch implements ILaunch { @IConfigurationService configurationService: IConfigurationService, @IConfigurationResolverService configurationResolverService: IConfigurationResolverService, @IPreferencesService private preferencesService: IPreferencesService, - @IWorkspaceContextService contextService: IWorkspaceContextService, - @IExtensionService extensionService: IExtensionService + @IWorkspaceContextService contextService: IWorkspaceContextService ) { - super(configurationManager, undefined, fileService, editorService, configurationService, contextService, extensionService); + super(configurationManager, undefined, fileService, editorService, configurationService, contextService); } get uri(): uri { diff --git a/src/vs/workbench/parts/debug/electron-browser/debugService.ts b/src/vs/workbench/parts/debug/electron-browser/debugService.ts index 183080fc4f4..fafa45301fb 100644 --- a/src/vs/workbench/parts/debug/electron-browser/debugService.ts +++ b/src/vs/workbench/parts/debug/electron-browser/debugService.ts @@ -767,18 +767,17 @@ export class DebugService implements debug.IDebugService { } return (type ? TPromise.as(null) : this.configurationManager.guessDebugger().then(a => type = a && a.type)).then(() => - (type ? this.extensionService.activateByEvent(`onDebugResolve:${type}`) : TPromise.as(null)).then(() => - this.configurationManager.resolveConfigurationByProviders(launch && launch.workspace ? launch.workspace.uri : undefined, type, config).then(config => { - // a falsy config indicates an aborted launch - if (config && config.type) { - return this.createProcess(launch, config, sessionId); - } + this.configurationManager.resolveConfigurationByProviders(launch && launch.workspace ? launch.workspace.uri : undefined, type, config).then(config => { + // a falsy config indicates an aborted launch + if (config && config.type) { + return this.createProcess(launch, config, sessionId); + } - if (launch) { - return launch.openConfigFile(false, type).done(undefined, errors.onUnexpectedError); - } - }) - )).then(() => undefined); + if (launch && type) { + return launch.openConfigFile(false, type).done(undefined, errors.onUnexpectedError); + } + }) + ).then(() => undefined); }) ))).then(() => wrapUpState(), err => { wrapUpState(); From b434cafc6b5d6b8fa683856cc5efe757771245d2 Mon Sep 17 00:00:00 2001 From: Sandeep Somavarapu Date: Wed, 25 Apr 2018 15:32:14 +0200 Subject: [PATCH 061/830] Fix #48525 --- src/vs/workbench/browser/parts/views/customView.ts | 3 ++- .../parts/scm/electron-browser/scmViewlet.ts | 14 ++++++++++++-- 2 files changed, 14 insertions(+), 3 deletions(-) diff --git a/src/vs/workbench/browser/parts/views/customView.ts b/src/vs/workbench/browser/parts/views/customView.ts index 015158a08ee..80f4e237f9b 100644 --- a/src/vs/workbench/browser/parts/views/customView.ts +++ b/src/vs/workbench/browser/parts/views/customView.ts @@ -56,7 +56,8 @@ export class CustomViewsService extends Disposable implements IViewsService { openView(id: string, focus: boolean): TPromise { const viewDescriptor = ViewsRegistry.getView(id); if (viewDescriptor) { - const viewletDescriptor = this.viewletService.getViewlet(viewDescriptor.location.id); + const viewletId = viewDescriptor.location === ViewLocation.SCM ? 'workbench.view.scm' : viewDescriptor.location.id; + const viewletDescriptor = this.viewletService.getViewlet(viewletId); if (viewletDescriptor) { return this.viewletService.openViewlet(viewletDescriptor.id) .then((viewlet: IViewsViewlet) => { diff --git a/src/vs/workbench/parts/scm/electron-browser/scmViewlet.ts b/src/vs/workbench/parts/scm/electron-browser/scmViewlet.ts index c506ab44454..5a9e281008b 100644 --- a/src/vs/workbench/parts/scm/electron-browser/scmViewlet.ts +++ b/src/vs/workbench/parts/scm/electron-browser/scmViewlet.ts @@ -58,7 +58,7 @@ import { ThrottledDelayer } from 'vs/base/common/async'; import { INotificationService } from 'vs/platform/notification/common/notification'; import { IPartService } from 'vs/workbench/services/part/common/partService'; import { IViewDescriptorRef, PersistentContributableViewsModel, IAddedViewDescriptorRef } from 'vs/workbench/browser/parts/views/contributableViews'; -import { ViewLocation, IViewDescriptor } from 'vs/workbench/common/views'; +import { ViewLocation, IViewDescriptor, IViewsViewlet } from 'vs/workbench/common/views'; import { ViewsViewletPanel } from 'vs/workbench/browser/parts/views/viewsViewlet'; import { IPanelDndController, Panel } from 'vs/base/browser/ui/splitview/panelview'; @@ -1038,7 +1038,7 @@ class SCMPanelDndController implements IPanelDndController { } } -export class SCMViewlet extends PanelViewlet implements IViewModel { +export class SCMViewlet extends PanelViewlet implements IViewModel, IViewsViewlet { private el: HTMLElement; private menus: SCMMenus; @@ -1458,6 +1458,16 @@ export class SCMViewlet extends PanelViewlet implements IViewModel { return super.isSingleView() && this.repositoryPanels.length + this.contributedViews.visibleViewDescriptors.length === 1; } + openView(id: string, focus?: boolean): TPromise { + this.contributedViews.setVisible(id, true); + const panel = this.panels.filter(panel => panel instanceof ViewsViewletPanel && panel.id === id)[0]; + if (panel) { + panel.setExpanded(true); + panel.focus(); + } + return TPromise.as(null); + } + hide(repository: ISCMRepository): void { if (!this.mainPanel) { return; From 8b69e6db6b5ccbaeb0ccba57b132acc6602be09c Mon Sep 17 00:00:00 2001 From: Joao Moreno Date: Wed, 25 Apr 2018 15:37:12 +0200 Subject: [PATCH 062/830] fixes #46854 --- extensions/git/src/git.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/extensions/git/src/git.ts b/extensions/git/src/git.ts index 8505ff4b49a..6f016d085f1 100644 --- a/extensions/git/src/git.ts +++ b/extensions/git/src/git.ts @@ -1021,7 +1021,8 @@ export class Repository { err.gitErrorCode = GitErrorCodes.NoUserNameConfigured; } else if (/Could not read from remote repository/.test(err.stderr || '')) { err.gitErrorCode = GitErrorCodes.RemoteConnectionError; - } else if (/Pull is not possible because you have unmerged files|Cannot pull with rebase: You have unstaged changes|Your local changes to the following files would be overwritten|Please, commit your changes before you can merge/.test(err.stderr)) { + } else if (/Pull is not possible because you have unmerged files|Cannot pull with rebase: You have unstaged changes|Your local changes to the following files would be overwritten|Please, commit your changes before you can merge/i.test(err.stderr)) { + err.stderr = err.stderr.replace(/Cannot pull with rebase: You have unstaged changes/i, 'Cannot pull with rebase, you have unstaged changes'); err.gitErrorCode = GitErrorCodes.DirtyWorkTree; } From a7e2e2d7f117f2a05c9ed57e87655a2bce3125e7 Mon Sep 17 00:00:00 2001 From: isidor Date: Wed, 25 Apr 2018 15:47:46 +0200 Subject: [PATCH 063/830] fixes #47551 --- src/vs/workbench/parts/debug/common/debugModel.ts | 4 ++-- .../parts/debug/electron-browser/breakpointWidget.ts | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/vs/workbench/parts/debug/common/debugModel.ts b/src/vs/workbench/parts/debug/common/debugModel.ts index f15a2b56c47..47f1af00e50 100644 --- a/src/vs/workbench/parts/debug/common/debugModel.ts +++ b/src/vs/workbench/parts/debug/common/debugModel.ts @@ -901,7 +901,7 @@ export class Model implements IModel { const ebp = this.exceptionBreakpoints.filter(ebp => ebp.filter === d.filter).pop(); return new ExceptionBreakpoint(d.filter, d.label, ebp ? ebp.enabled : d.default); }); - this._onDidChangeBreakpoints.fire({}); + this._onDidChangeBreakpoints.fire(); } } @@ -911,7 +911,7 @@ export class Model implements IModel { public setBreakpointsActivated(activated: boolean): void { this.breakpointsActivated = activated; - this._onDidChangeBreakpoints.fire({}); + this._onDidChangeBreakpoints.fire(); } public addBreakpoints(uri: uri, rawData: IBreakpointData[], fireEvent = true): IBreakpoint[] { diff --git a/src/vs/workbench/parts/debug/electron-browser/breakpointWidget.ts b/src/vs/workbench/parts/debug/electron-browser/breakpointWidget.ts index 7229bb4bf08..7104aa7254f 100644 --- a/src/vs/workbench/parts/debug/electron-browser/breakpointWidget.ts +++ b/src/vs/workbench/parts/debug/electron-browser/breakpointWidget.ts @@ -80,7 +80,7 @@ export class BreakpointWidget extends ZoneWidget implements IPrivateBreakopintWi } this.toDispose.push(this.debugService.getModel().onDidChangeBreakpoints(e => { - if (this.breakpoint && e.removed && e.removed.indexOf(this.breakpoint) >= 0) { + if (this.breakpoint && e && e.removed && e.removed.indexOf(this.breakpoint) >= 0) { this.dispose(); } })); From 1d2370134f278248b2c268eb51d662380a8b85e4 Mon Sep 17 00:00:00 2001 From: Dirk Baeumer Date: Wed, 25 Apr 2018 16:28:33 +0200 Subject: [PATCH 064/830] Fixes #46439: Task exit code is set to 1 regardless of problem severity --- .../parts/tasks/common/problemCollectors.ts | 23 ++++++++++++--- .../electron-browser/terminalTaskSystem.ts | 28 ++++++++++++------- 2 files changed, 37 insertions(+), 14 deletions(-) diff --git a/src/vs/workbench/parts/tasks/common/problemCollectors.ts b/src/vs/workbench/parts/tasks/common/problemCollectors.ts index 64d5a4b2a3e..bcc398f8d40 100644 --- a/src/vs/workbench/parts/tasks/common/problemCollectors.ts +++ b/src/vs/workbench/parts/tasks/common/problemCollectors.ts @@ -12,7 +12,7 @@ import { IDisposable } from 'vs/base/common/lifecycle'; import { IModelService } from 'vs/editor/common/services/modelService'; import { ILineMatcher, createLineMatcher, ProblemMatcher, ProblemMatch, ApplyToKind, WatchingPattern, getResource } from 'vs/workbench/parts/tasks/common/problemMatcher'; -import { IMarkerService, IMarkerData } from 'vs/platform/markers/common/markers'; +import { IMarkerService, IMarkerData, MarkerSeverity } from 'vs/platform/markers/common/markers'; import { generateUuid } from 'vs/base/common/uuid'; export enum ProblemCollectorEventKind { @@ -39,6 +39,7 @@ export class AbstractProblemCollector implements IDisposable { private matchers: INumberDictionary; private activeMatcher: ILineMatcher; private _numberOfMatches: number; + private _maxMarkerSeverity: MarkerSeverity; private buffer: string[]; private bufferLength: number; private openModels: IStringDictionary; @@ -73,6 +74,7 @@ export class AbstractProblemCollector implements IDisposable { this.buffer = []; this.activeMatcher = null; this._numberOfMatches = 0; + this._maxMarkerSeverity = undefined; this.openModels = Object.create(null); this.modelListeners = []; this.applyToByOwner = new Map(); @@ -110,12 +112,16 @@ export class AbstractProblemCollector implements IDisposable { return this._numberOfMatches; } + public get maxMarkerSeverity(): MarkerSeverity { + return this._maxMarkerSeverity; + } + protected tryFindMarker(line: string): ProblemMatch { let result: ProblemMatch = null; if (this.activeMatcher) { result = this.activeMatcher.next(line); if (result) { - this._numberOfMatches++; + this.captureMatch(result); return result; } this.clearBuffer(); @@ -170,7 +176,7 @@ export class AbstractProblemCollector implements IDisposable { let matcher = candidates[i]; let result = matcher.handle(this.buffer, startIndex); if (result.match) { - this._numberOfMatches++; + this.captureMatch(result.match); if (result.continue) { this.activeMatcher = matcher; } @@ -181,6 +187,13 @@ export class AbstractProblemCollector implements IDisposable { return null; } + private captureMatch(match: ProblemMatch): void { + this._numberOfMatches++; + if (this._maxMarkerSeverity === void 0 || match.marker.severity > this._maxMarkerSeverity) { + this._maxMarkerSeverity = match.marker.severity; + } + } + private clearBuffer(): void { if (this.buffer.length > 0) { this.buffer = []; @@ -300,6 +313,8 @@ export class AbstractProblemCollector implements IDisposable { } protected cleanMarkerCaches(): void { + this._numberOfMatches = 0; + this._maxMarkerSeverity = undefined; this.markers.clear(); this.deliveredMarkers.clear(); } @@ -464,10 +479,10 @@ export class WatchingProblemCollector extends AbstractProblemCollector implement if (matches) { if (this._activeBackgroundMatchers.has(background.key)) { this._activeBackgroundMatchers.delete(background.key); + this.resetCurrentResource(); this._onDidStateChange.fire(ProblemCollectorEvent.create(ProblemCollectorEventKind.BackgroundProcessingEnds)); result = true; let owner = background.matcher.owner; - this.resetCurrentResource(); this.cleanMarkers(owner); this.cleanMarkerCaches(); } diff --git a/src/vs/workbench/parts/tasks/electron-browser/terminalTaskSystem.ts b/src/vs/workbench/parts/tasks/electron-browser/terminalTaskSystem.ts index 9cf72ec9d93..1753670ee47 100644 --- a/src/vs/workbench/parts/tasks/electron-browser/terminalTaskSystem.ts +++ b/src/vs/workbench/parts/tasks/electron-browser/terminalTaskSystem.ts @@ -20,7 +20,7 @@ import { Event, Emitter } from 'vs/base/common/event'; import { IDisposable, dispose } from 'vs/base/common/lifecycle'; import * as TPath from 'vs/base/common/paths'; -import { IMarkerService } from 'vs/platform/markers/common/markers'; +import { IMarkerService, MarkerSeverity } from 'vs/platform/markers/common/markers'; import { IWorkspaceContextService, WorkbenchState } from 'vs/platform/workspace/common/workspace'; import { IModelService } from 'vs/editor/common/services/modelService'; import { ProblemMatcher, ProblemMatcherRegistry /*, ProblemPattern, getResource */ } from 'vs/workbench/parts/tasks/common/problemMatcher'; @@ -290,6 +290,13 @@ export class TerminalTaskSystem implements ITaskSystem { } else if (event.kind === ProblemCollectorEventKind.BackgroundProcessingEnds) { eventCounter--; this._onDidStateChange.fire(TaskEvent.create(TaskEventKind.Inactive, task)); + if (eventCounter === 0) { + let reveal = task.command.presentation.reveal; + if (reveal === RevealKind.Silent && watchingProblemMatcher.numberOfMatches > 0 && watchingProblemMatcher.maxMarkerSeverity >= MarkerSeverity.Error) { + this.terminalService.setActiveInstance(terminal); + this.terminalService.showPanel(false); + } + } } })); watchingProblemMatcher.aboutToStart(); @@ -324,6 +331,11 @@ export class TerminalTaskSystem implements ITaskSystem { this.idleTaskTerminals.set(key, terminal.id.toString(), Touch.AsOld); break; } + let reveal = task.command.presentation.reveal; + if (reveal === RevealKind.Silent && (exitCode !== 0 || watchingProblemMatcher.numberOfMatches > 0 && watchingProblemMatcher.maxMarkerSeverity >= MarkerSeverity.Error)) { + this.terminalService.setActiveInstance(terminal); + this.terminalService.showPanel(false); + } watchingProblemMatcher.done(); watchingProblemMatcher.dispose(); registeredLinkMatchers.forEach(handle => terminal.deregisterLinkMatcher(handle)); @@ -334,11 +346,6 @@ export class TerminalTaskSystem implements ITaskSystem { this._onDidStateChange.fire(event); } eventCounter = 0; - let reveal = task.command.presentation.reveal; - if (exitCode && exitCode === 1 && watchingProblemMatcher.numberOfMatches === 0 && reveal !== RevealKind.Never) { - this.terminalService.setActiveInstance(terminal); - this.terminalService.showPanel(false); - } this._onDidStateChange.fire(TaskEvent.create(TaskEventKind.End, task)); resolve({ exitCode }); }); @@ -371,15 +378,16 @@ export class TerminalTaskSystem implements ITaskSystem { this.idleTaskTerminals.set(key, terminal.id.toString(), Touch.AsOld); break; } + let reveal = task.command.presentation.reveal; + if (reveal === RevealKind.Silent && (exitCode !== 0 || startStopProblemMatcher.numberOfMatches > 0 && startStopProblemMatcher.maxMarkerSeverity >= MarkerSeverity.Error)) { + this.terminalService.setActiveInstance(terminal); + this.terminalService.showPanel(false); + } startStopProblemMatcher.done(); startStopProblemMatcher.dispose(); registeredLinkMatchers.forEach(handle => terminal.deregisterLinkMatcher(handle)); this._onDidStateChange.fire(TaskEvent.create(TaskEventKind.Inactive, task)); this._onDidStateChange.fire(TaskEvent.create(TaskEventKind.End, task)); - // See https://github.com/Microsoft/vscode/issues/31965 - if (exitCode === 0 && startStopProblemMatcher.numberOfMatches > 0) { - exitCode = 1; - } resolve({ exitCode }); }); }); From c2493d71bd5af4068ba4950e33fb161c351a34ae Mon Sep 17 00:00:00 2001 From: Joao Moreno Date: Wed, 25 Apr 2018 16:35:04 +0200 Subject: [PATCH 065/830] update inno_updater v0.4.3 related to #47815 #47804 --- build/win32/OSSREADME.json | 1032 +++++++++++++++++----------------- build/win32/inno_updater.exe | Bin 395264 -> 371200 bytes 2 files changed, 516 insertions(+), 516 deletions(-) diff --git a/build/win32/OSSREADME.json b/build/win32/OSSREADME.json index 10f47d06684..5e1078b9519 100755 --- a/build/win32/OSSREADME.json +++ b/build/win32/OSSREADME.json @@ -1,70 +1,10 @@ [ { - "name": "rust-lang/libc", - "version": "0.2.36", - "repositoryUrl": "https://github.com/rust-lang/libc", + "name": "Amanieu/thread_local-rs", + "version": "0.3.5", + "repositoryUrl": "https://github.com/Amanieu/thread_local-rs", "licenseDetail": [ - "Copyright (c) 2014 The Rust Project Developers", - "", - "Permission is hereby granted, free of charge, to any", - "person obtaining a copy of this software and associated", - "documentation files (the \"Software\"), to deal in the", - "Software without restriction, including without", - "limitation the rights to use, copy, modify, merge,", - "publish, distribute, sublicense, and/or sell copies of", - "the Software, and to permit persons to whom the Software", - "is furnished to do so, subject to the following", - "conditions:", - "", - "The above copyright notice and this permission notice", - "shall be included in all copies or substantial portions", - "of the Software.", - "", - "THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF", - "ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED", - "TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A", - "PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT", - "SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY", - "CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION", - "OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR", - "IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER", - "DEALINGS IN THE SOFTWARE." - ], - "isProd": true - }, - { - "name": "retep998/winapi-rs", - "version": "0.4.0", - "repositoryUrl": "https://github.com/retep998/winapi-rs", - "licenseDetail": [ - "Copyright (c) 2015 The winapi-rs Developers", - "", - "Permission is hereby granted, free of charge, to any person obtaining a copy", - "of this software and associated documentation files (the \"Software\"), to deal", - "in the Software without restriction, including without limitation the rights", - "to use, copy, modify, merge, publish, distribute, sublicense, and/or sell", - "copies of the Software, and to permit persons to whom the Software is", - "furnished to do so, subject to the following conditions:", - "", - "The above copyright notice and this permission notice shall be included in all", - "copies or substantial portions of the Software.", - "", - "THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR", - "IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,", - "FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE", - "AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER", - "LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,", - "OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE", - "SOFTWARE." - ], - "isProd": true - }, - { - "name": "rust-num/num", - "version": "0.1.41", - "repositoryUrl": "https://github.com/rust-num/num", - "licenseDetail": [ - "Copyright (c) 2014 The Rust Project Developers", + "Copyright (c) 2016 The Rust Project Developers", "", "Permission is hereby granted, free of charge, to any", "person obtaining a copy of this software and associated", @@ -121,231 +61,6 @@ ], "isProd": true }, - { - "name": "dtolnay/isatty", - "version": "0.1.6", - "repositoryUrl": "https://github.com/dtolnay/isatty", - "licenseDetail": [ - "Copyright (c) 2016", - "", - "Permission is hereby granted, free of charge, to any", - "person obtaining a copy of this software and associated", - "documentation files (the \"Software\"), to deal in the", - "Software without restriction, including without", - "limitation the rights to use, copy, modify, merge,", - "publish, distribute, sublicense, and/or sell copies of", - "the Software, and to permit persons to whom the Software", - "is furnished to do so, subject to the following", - "conditions:", - "", - "The above copyright notice and this permission notice", - "shall be included in all copies or substantial portions", - "of the Software.", - "", - "THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF", - "ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED", - "TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A", - "PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT", - "SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY", - "CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION", - "OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR", - "IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER", - "DEALINGS IN THE SOFTWARE." - ], - "isProd": true - }, - { - "name": "rust-lang-nursery/lazy-static.rs", - "version": "1.0.0", - "repositoryUrl": "https://github.com/rust-lang-nursery/lazy-static.rs", - "licenseDetail": [ - "Copyright (c) 2010 The Rust Project Developers", - "", - "Permission is hereby granted, free of charge, to any", - "person obtaining a copy of this software and associated", - "documentation files (the \"Software\"), to deal in the", - "Software without restriction, including without", - "limitation the rights to use, copy, modify, merge,", - "publish, distribute, sublicense, and/or sell copies of", - "the Software, and to permit persons to whom the Software", - "is furnished to do so, subject to the following", - "conditions:", - "", - "The above copyright notice and this permission notice", - "shall be included in all copies or substantial portions", - "of the Software.", - "", - "THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF", - "ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED", - "TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A", - "PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT", - "SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY", - "CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION", - "OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR", - "IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER", - "DEALINGS IN THE SOFTWARE." - ], - "isProd": true - }, - { - "name": "rust-num/num-integer", - "version": "0.1.35", - "repositoryUrl": "https://github.com/rust-num/num-integer", - "licenseDetail": [ - "Copyright (c) 2014 The Rust Project Developers", - "", - "Permission is hereby granted, free of charge, to any", - "person obtaining a copy of this software and associated", - "documentation files (the \"Software\"), to deal in the", - "Software without restriction, including without", - "limitation the rights to use, copy, modify, merge,", - "publish, distribute, sublicense, and/or sell copies of", - "the Software, and to permit persons to whom the Software", - "is furnished to do so, subject to the following", - "conditions:", - "", - "The above copyright notice and this permission notice", - "shall be included in all copies or substantial portions", - "of the Software.", - "", - "THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF", - "ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED", - "TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A", - "PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT", - "SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY", - "CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION", - "OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR", - "IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER", - "DEALINGS IN THE SOFTWARE." - ], - "isProd": true - }, - { - "name": "retep998/winapi-rs", - "version": "0.2.2", - "repositoryUrl": "https://github.com/retep998/winapi-rs", - "licenseDetail": [ - "Copyright (c) 2015 The winapi-rs Developers", - "", - "Permission is hereby granted, free of charge, to any person obtaining a copy", - "of this software and associated documentation files (the \"Software\"), to deal", - "in the Software without restriction, including without limitation the rights", - "to use, copy, modify, merge, publish, distribute, sublicense, and/or sell", - "copies of the Software, and to permit persons to whom the Software is", - "furnished to do so, subject to the following conditions:", - "", - "The above copyright notice and this permission notice shall be included in all", - "copies or substantial portions of the Software.", - "", - "THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR", - "IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,", - "FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE", - "AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER", - "LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,", - "OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE", - "SOFTWARE." - ], - "isProd": true - }, - { - "name": "rust-num/num-iter", - "version": "0.1.34", - "repositoryUrl": "https://github.com/rust-num/num-iter", - "licenseDetail": [ - "Copyright (c) 2014 The Rust Project Developers", - "", - "Permission is hereby granted, free of charge, to any", - "person obtaining a copy of this software and associated", - "documentation files (the \"Software\"), to deal in the", - "Software without restriction, including without", - "limitation the rights to use, copy, modify, merge,", - "publish, distribute, sublicense, and/or sell copies of", - "the Software, and to permit persons to whom the Software", - "is furnished to do so, subject to the following", - "conditions:", - "", - "The above copyright notice and this permission notice", - "shall be included in all copies or substantial portions", - "of the Software.", - "", - "THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF", - "ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED", - "TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A", - "PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT", - "SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY", - "CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION", - "OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR", - "IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER", - "DEALINGS IN THE SOFTWARE." - ], - "isProd": true - }, - { - "name": "rust-num/num-traits", - "version": "0.1.42", - "repositoryUrl": "https://github.com/rust-num/num-traits", - "licenseDetail": [ - "Copyright (c) 2014 The Rust Project Developers", - "", - "Permission is hereby granted, free of charge, to any", - "person obtaining a copy of this software and associated", - "documentation files (the \"Software\"), to deal in the", - "Software without restriction, including without", - "limitation the rights to use, copy, modify, merge,", - "publish, distribute, sublicense, and/or sell copies of", - "the Software, and to permit persons to whom the Software", - "is furnished to do so, subject to the following", - "conditions:", - "", - "The above copyright notice and this permission notice", - "shall be included in all copies or substantial portions", - "of the Software.", - "", - "THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF", - "ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED", - "TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A", - "PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT", - "SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY", - "CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION", - "OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR", - "IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER", - "DEALINGS IN THE SOFTWARE." - ], - "isProd": true - }, - { - "name": "slog-rs/slog", - "version": "2.1.1", - "repositoryUrl": "https://github.com/slog-rs/slog", - "licenseDetail": [ - "Copyright (c) 2014 The Rust Project Developers", - "", - "Permission is hereby granted, free of charge, to any", - "person obtaining a copy of this software and associated", - "documentation files (the \"Software\"), to deal in the", - "Software without restriction, including without", - "limitation the rights to use, copy, modify, merge,", - "publish, distribute, sublicense, and/or sell copies of", - "the Software, and to permit persons to whom the Software", - "is furnished to do so, subject to the following", - "conditions:", - "", - "The above copyright notice and this permission notice", - "shall be included in all copies or substantial portions", - "of the Software.", - "", - "THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF", - "ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED", - "TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A", - "PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT", - "SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY", - "CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION", - "OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR", - "IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER", - "DEALINGS IN THE SOFTWARE." - ], - "isProd": true - }, { "name": "Sgeo/take_mut", "version": "0.2.0", @@ -376,99 +91,11 @@ "isProd": true }, { - "name": "redox-os/termios", - "version": "0.1.1", - "repositoryUrl": "https://github.com/redox-os/termios", + "name": "Stebalien/term", + "version": "0.4.6", + "repositoryUrl": "https://github.com/Stebalien/term", "licenseDetail": [ - "MIT License", - "", - "Copyright (c) 2017 Redox OS", - "", - "Permission is hereby granted, free of charge, to any person obtaining a copy", - "of this software and associated documentation files (the \"Software\"), to deal", - "in the Software without restriction, including without limitation the rights", - "to use, copy, modify, merge, publish, distribute, sublicense, and/or sell", - "copies of the Software, and to permit persons to whom the Software is", - "furnished to do so, subject to the following conditions:", - "", - "The above copyright notice and this permission notice shall be included in all", - "copies or substantial portions of the Software.", - "", - "THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR", - "IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,", - "FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE", - "AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER", - "LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,", - "OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE", - "SOFTWARE." - ], - "isProd": true - }, - { - "name": "redox-os/syscall", - "version": "0.1.37", - "repositoryUrl": "https://github.com/redox-os/syscall", - "licenseDetail": [ - "Copyright (c) 2017 Redox OS Developers", - "", - "MIT License", - "", - "Permission is hereby granted, free of charge, to any person obtaining", - "a copy of this software and associated documentation files (the", - "\"Software\"), to deal in the Software without restriction, including", - "without limitation the rights to use, copy, modify, merge, publish,", - "distribute, sublicense, and/or sell copies of the Software, and to", - "permit persons to whom the Software is furnished to do so, subject to", - "the following conditions:", - "", - "The above copyright notice and this permission notice shall be", - "included in all copies or substantial portions of the Software.", - "", - "THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,", - "EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF", - "MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND", - "NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE", - "LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION", - "OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION", - "WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE." - ], - "isProd": true - }, - { - "name": "mrhooray/crc-rs", - "version": "1.7.0", - "repositoryUrl": "https://github.com/mrhooray/crc-rs.git", - "licenseDetail": [ - "MIT License", - "", - "Copyright (c) 2017 crc-rs Developers", - "", - "Permission is hereby granted, free of charge, to any person obtaining a copy", - "of this software and associated documentation files (the \"Software\"), to deal", - "in the Software without restriction, including without limitation the rights", - "to use, copy, modify, merge, publish, distribute, sublicense, and/or sell", - "copies of the Software, and to permit persons to whom the Software is", - "furnished to do so, subject to the following conditions:", - "", - "The above copyright notice and this permission notice shall be included in all", - "copies or substantial portions of the Software.", - "", - "THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR", - "IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,", - "FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE", - "AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER", - "LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,", - "OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE", - "SOFTWARE." - ], - "isProd": true - }, - { - "name": "Amanieu/thread_local-rs", - "version": "0.3.5", - "repositoryUrl": "https://github.com/Amanieu/thread_local-rs", - "licenseDetail": [ - "Copyright (c) 2016 The Rust Project Developers", + "Copyright (c) 2014 The Rust Project Developers", "", "Permission is hereby granted, free of charge, to any", "person obtaining a copy of this software and associated", @@ -496,64 +123,6 @@ ], "isProd": true }, - { - "name": "vitiral/build_const", - "version": "0.2.0", - "repositoryUrl": "https://github.com/vitiral/build_const", - "licenseDetail": [ - "The MIT License (MIT)", - "", - "Copyright (c) 2017 Garrett Berg, vitiral@gmail.com", - "", - "Permission is hereby granted, free of charge, to any person obtaining a copy", - "of this software and associated documentation files (the \"Software\"), to deal", - "in the Software without restriction, including without limitation the rights", - "to use, copy, modify, merge, publish, distribute, sublicense, and/or sell", - "copies of the Software, and to permit persons to whom the Software is", - "furnished to do so, subject to the following conditions:", - "", - "The above copyright notice and this permission notice shall be included in", - "all copies or substantial portions of the Software.", - "", - "THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR", - "IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,", - "FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE", - "AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER", - "LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,", - "OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN", - "THE SOFTWARE." - ], - "isProd": true - }, - { - "name": "ticki/termion", - "version": "1.5.1", - "repositoryUrl": "https://github.com/ticki/termion", - "licenseDetail": [ - "The MIT License (MIT)", - "", - "Copyright (c) 2016 Ticki", - "", - "Permission is hereby granted, free of charge, to any person obtaining a copy", - "of this software and associated documentation files (the \"Software\"), to deal", - "in the Software without restriction, including without limitation the rights", - "to use, copy, modify, merge, publish, distribute, sublicense, and/or sell", - "copies of the Software, and to permit persons to whom the Software is", - "furnished to do so, subject to the following conditions:", - "", - "The above copyright notice and this permission notice shall be included in all", - "copies or substantial portions of the Software.", - "", - "THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR", - "IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,", - "FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE", - "AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER", - "LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,", - "OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE", - "SOFTWARE." - ], - "isProd": true - }, { "name": "chronotope/chrono", "version": "0.4.0", @@ -802,38 +371,11 @@ "isProd": true }, { - "name": "reem/rust-unreachable", - "version": "1.0.0", - "repositoryUrl": "https://github.com/reem/rust-unreachable.git", + "name": "dtolnay/isatty", + "version": "0.1.6", + "repositoryUrl": "https://github.com/dtolnay/isatty", "licenseDetail": [ - "Copyright (c) 2015 The rust-unreachable Developers", - "", - "Permission is hereby granted, free of charge, to any person obtaining a copy", - "of this software and associated documentation files (the \"Software\"), to deal", - "in the Software without restriction, including without limitation the rights", - "to use, copy, modify, merge, publish, distribute, sublicense, and/or sell", - "copies of the Software, and to permit persons to whom the Software is", - "furnished to do so, subject to the following conditions:", - "", - "The above copyright notice and this permission notice shall be included in all", - "copies or substantial portions of the Software.", - "", - "THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR", - "IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,", - "FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE", - "AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER", - "LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,", - "OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE", - "SOFTWARE." - ], - "isProd": true - }, - { - "name": "rust-lang/time", - "version": "0.1.39", - "repositoryUrl": "https://github.com/rust-lang/time", - "licenseDetail": [ - "Copyright (c) 2014 The Rust Project Developers", + "Copyright (c) 2016", "", "Permission is hereby granted, free of charge, to any", "person obtaining a copy of this software and associated", @@ -861,6 +403,121 @@ ], "isProd": true }, + { + "name": "mrhooray/crc-rs", + "version": "1.7.0", + "repositoryUrl": "https://github.com/mrhooray/crc-rs.git", + "licenseDetail": [ + "MIT License", + "", + "Copyright (c) 2017 crc-rs Developers", + "", + "Permission is hereby granted, free of charge, to any person obtaining a copy", + "of this software and associated documentation files (the \"Software\"), to deal", + "in the Software without restriction, including without limitation the rights", + "to use, copy, modify, merge, publish, distribute, sublicense, and/or sell", + "copies of the Software, and to permit persons to whom the Software is", + "furnished to do so, subject to the following conditions:", + "", + "The above copyright notice and this permission notice shall be included in all", + "copies or substantial portions of the Software.", + "", + "THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR", + "IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,", + "FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE", + "AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER", + "LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,", + "OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE", + "SOFTWARE." + ], + "isProd": true + }, + { + "name": "redox-os/syscall", + "version": "0.1.37", + "repositoryUrl": "https://github.com/redox-os/syscall", + "licenseDetail": [ + "Copyright (c) 2017 Redox OS Developers", + "", + "MIT License", + "", + "Permission is hereby granted, free of charge, to any person obtaining", + "a copy of this software and associated documentation files (the", + "\"Software\"), to deal in the Software without restriction, including", + "without limitation the rights to use, copy, modify, merge, publish,", + "distribute, sublicense, and/or sell copies of the Software, and to", + "permit persons to whom the Software is furnished to do so, subject to", + "the following conditions:", + "", + "The above copyright notice and this permission notice shall be", + "included in all copies or substantial portions of the Software.", + "", + "THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,", + "EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF", + "MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND", + "NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE", + "LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION", + "OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION", + "WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE." + ], + "isProd": true + }, + { + "name": "redox-os/termios", + "version": "0.1.1", + "repositoryUrl": "https://github.com/redox-os/termios", + "licenseDetail": [ + "MIT License", + "", + "Copyright (c) 2017 Redox OS", + "", + "Permission is hereby granted, free of charge, to any person obtaining a copy", + "of this software and associated documentation files (the \"Software\"), to deal", + "in the Software without restriction, including without limitation the rights", + "to use, copy, modify, merge, publish, distribute, sublicense, and/or sell", + "copies of the Software, and to permit persons to whom the Software is", + "furnished to do so, subject to the following conditions:", + "", + "The above copyright notice and this permission notice shall be included in all", + "copies or substantial portions of the Software.", + "", + "THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR", + "IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,", + "FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE", + "AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER", + "LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,", + "OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE", + "SOFTWARE." + ], + "isProd": true + }, + { + "name": "reem/rust-unreachable", + "version": "1.0.0", + "repositoryUrl": "https://github.com/reem/rust-unreachable.git", + "licenseDetail": [ + "Copyright (c) 2015 The rust-unreachable Developers", + "", + "Permission is hereby granted, free of charge, to any person obtaining a copy", + "of this software and associated documentation files (the \"Software\"), to deal", + "in the Software without restriction, including without limitation the rights", + "to use, copy, modify, merge, publish, distribute, sublicense, and/or sell", + "copies of the Software, and to permit persons to whom the Software is", + "furnished to do so, subject to the following conditions:", + "", + "The above copyright notice and this permission notice shall be included in all", + "copies or substantial portions of the Software.", + "", + "THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR", + "IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,", + "FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE", + "AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER", + "LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,", + "OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE", + "SOFTWARE." + ], + "isProd": true + }, { "name": "reem/rust-void", "version": "1.0.2", @@ -888,6 +545,33 @@ ], "isProd": true }, + { + "name": "retep998/winapi-rs", + "version": "0.3.4", + "repositoryUrl": "https://github.com/retep998/winapi-rs", + "licenseDetail": [ + "Copyright (c) 2015 The winapi-rs Developers", + "", + "Permission is hereby granted, free of charge, to any person obtaining a copy", + "of this software and associated documentation files (the \"Software\"), to deal", + "in the Software without restriction, including without limitation the rights", + "to use, copy, modify, merge, publish, distribute, sublicense, and/or sell", + "copies of the Software, and to permit persons to whom the Software is", + "furnished to do so, subject to the following conditions:", + "", + "The above copyright notice and this permission notice shall be included in all", + "copies or substantial portions of the Software.", + "", + "THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR", + "IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,", + "FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE", + "AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER", + "LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,", + "OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE", + "SOFTWARE." + ], + "isProd": true + }, { "name": "retep998/winapi-rs", "version": "0.2.8", @@ -917,7 +601,7 @@ }, { "name": "retep998/winapi-rs", - "version": "0.3.4", + "version": "0.1.1", "repositoryUrl": "https://github.com/retep998/winapi-rs", "licenseDetail": [ "Copyright (c) 2015 The winapi-rs Developers", @@ -942,6 +626,318 @@ ], "isProd": true }, + { + "name": "retep998/winapi-rs", + "version": "0.4.0", + "repositoryUrl": "https://github.com/retep998/winapi-rs", + "licenseDetail": [ + "Copyright (c) 2015 The winapi-rs Developers", + "", + "Permission is hereby granted, free of charge, to any person obtaining a copy", + "of this software and associated documentation files (the \"Software\"), to deal", + "in the Software without restriction, including without limitation the rights", + "to use, copy, modify, merge, publish, distribute, sublicense, and/or sell", + "copies of the Software, and to permit persons to whom the Software is", + "furnished to do so, subject to the following conditions:", + "", + "The above copyright notice and this permission notice shall be included in all", + "copies or substantial portions of the Software.", + "", + "THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR", + "IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,", + "FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE", + "AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER", + "LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,", + "OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE", + "SOFTWARE." + ], + "isProd": true + }, + { + "name": "retep998/winapi-rs", + "version": "0.4.0", + "repositoryUrl": "https://github.com/retep998/winapi-rs", + "licenseDetail": [ + "Copyright (c) 2015 The winapi-rs Developers", + "", + "Permission is hereby granted, free of charge, to any person obtaining a copy", + "of this software and associated documentation files (the \"Software\"), to deal", + "in the Software without restriction, including without limitation the rights", + "to use, copy, modify, merge, publish, distribute, sublicense, and/or sell", + "copies of the Software, and to permit persons to whom the Software is", + "furnished to do so, subject to the following conditions:", + "", + "The above copyright notice and this permission notice shall be included in all", + "copies or substantial portions of the Software.", + "", + "THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR", + "IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,", + "FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE", + "AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER", + "LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,", + "OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE", + "SOFTWARE." + ], + "isProd": true + }, + { + "name": "retep998/winapi-rs", + "version": "0.2.2", + "repositoryUrl": "https://github.com/retep998/winapi-rs", + "licenseDetail": [ + "Copyright (c) 2015 The winapi-rs Developers", + "", + "Permission is hereby granted, free of charge, to any person obtaining a copy", + "of this software and associated documentation files (the \"Software\"), to deal", + "in the Software without restriction, including without limitation the rights", + "to use, copy, modify, merge, publish, distribute, sublicense, and/or sell", + "copies of the Software, and to permit persons to whom the Software is", + "furnished to do so, subject to the following conditions:", + "", + "The above copyright notice and this permission notice shall be included in all", + "copies or substantial portions of the Software.", + "", + "THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR", + "IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,", + "FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE", + "AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER", + "LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,", + "OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE", + "SOFTWARE." + ], + "isProd": true + }, + { + "name": "rust-lang-nursery/lazy-static.rs", + "version": "1.0.0", + "repositoryUrl": "https://github.com/rust-lang-nursery/lazy-static.rs", + "licenseDetail": [ + "Copyright (c) 2010 The Rust Project Developers", + "", + "Permission is hereby granted, free of charge, to any", + "person obtaining a copy of this software and associated", + "documentation files (the \"Software\"), to deal in the", + "Software without restriction, including without", + "limitation the rights to use, copy, modify, merge,", + "publish, distribute, sublicense, and/or sell copies of", + "the Software, and to permit persons to whom the Software", + "is furnished to do so, subject to the following", + "conditions:", + "", + "The above copyright notice and this permission notice", + "shall be included in all copies or substantial portions", + "of the Software.", + "", + "THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF", + "ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED", + "TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A", + "PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT", + "SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY", + "CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION", + "OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR", + "IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER", + "DEALINGS IN THE SOFTWARE." + ], + "isProd": true + }, + { + "name": "rust-lang/libc", + "version": "0.2.36", + "repositoryUrl": "https://github.com/rust-lang/libc", + "licenseDetail": [ + "Copyright (c) 2014 The Rust Project Developers", + "", + "Permission is hereby granted, free of charge, to any", + "person obtaining a copy of this software and associated", + "documentation files (the \"Software\"), to deal in the", + "Software without restriction, including without", + "limitation the rights to use, copy, modify, merge,", + "publish, distribute, sublicense, and/or sell copies of", + "the Software, and to permit persons to whom the Software", + "is furnished to do so, subject to the following", + "conditions:", + "", + "The above copyright notice and this permission notice", + "shall be included in all copies or substantial portions", + "of the Software.", + "", + "THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF", + "ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED", + "TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A", + "PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT", + "SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY", + "CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION", + "OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR", + "IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER", + "DEALINGS IN THE SOFTWARE." + ], + "isProd": true + }, + { + "name": "rust-lang/time", + "version": "0.1.39", + "repositoryUrl": "https://github.com/rust-lang/time", + "licenseDetail": [ + "Copyright (c) 2014 The Rust Project Developers", + "", + "Permission is hereby granted, free of charge, to any", + "person obtaining a copy of this software and associated", + "documentation files (the \"Software\"), to deal in the", + "Software without restriction, including without", + "limitation the rights to use, copy, modify, merge,", + "publish, distribute, sublicense, and/or sell copies of", + "the Software, and to permit persons to whom the Software", + "is furnished to do so, subject to the following", + "conditions:", + "", + "The above copyright notice and this permission notice", + "shall be included in all copies or substantial portions", + "of the Software.", + "", + "THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF", + "ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED", + "TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A", + "PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT", + "SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY", + "CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION", + "OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR", + "IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER", + "DEALINGS IN THE SOFTWARE." + ], + "isProd": true + }, + { + "name": "rust-num/num", + "version": "0.1.41", + "repositoryUrl": "https://github.com/rust-num/num", + "licenseDetail": [ + "Copyright (c) 2014 The Rust Project Developers", + "", + "Permission is hereby granted, free of charge, to any", + "person obtaining a copy of this software and associated", + "documentation files (the \"Software\"), to deal in the", + "Software without restriction, including without", + "limitation the rights to use, copy, modify, merge,", + "publish, distribute, sublicense, and/or sell copies of", + "the Software, and to permit persons to whom the Software", + "is furnished to do so, subject to the following", + "conditions:", + "", + "The above copyright notice and this permission notice", + "shall be included in all copies or substantial portions", + "of the Software.", + "", + "THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF", + "ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED", + "TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A", + "PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT", + "SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY", + "CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION", + "OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR", + "IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER", + "DEALINGS IN THE SOFTWARE." + ], + "isProd": true + }, + { + "name": "rust-num/num-integer", + "version": "0.1.35", + "repositoryUrl": "https://github.com/rust-num/num-integer", + "licenseDetail": [ + "Copyright (c) 2014 The Rust Project Developers", + "", + "Permission is hereby granted, free of charge, to any", + "person obtaining a copy of this software and associated", + "documentation files (the \"Software\"), to deal in the", + "Software without restriction, including without", + "limitation the rights to use, copy, modify, merge,", + "publish, distribute, sublicense, and/or sell copies of", + "the Software, and to permit persons to whom the Software", + "is furnished to do so, subject to the following", + "conditions:", + "", + "The above copyright notice and this permission notice", + "shall be included in all copies or substantial portions", + "of the Software.", + "", + "THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF", + "ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED", + "TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A", + "PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT", + "SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY", + "CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION", + "OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR", + "IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER", + "DEALINGS IN THE SOFTWARE." + ], + "isProd": true + }, + { + "name": "rust-num/num-iter", + "version": "0.1.34", + "repositoryUrl": "https://github.com/rust-num/num-iter", + "licenseDetail": [ + "Copyright (c) 2014 The Rust Project Developers", + "", + "Permission is hereby granted, free of charge, to any", + "person obtaining a copy of this software and associated", + "documentation files (the \"Software\"), to deal in the", + "Software without restriction, including without", + "limitation the rights to use, copy, modify, merge,", + "publish, distribute, sublicense, and/or sell copies of", + "the Software, and to permit persons to whom the Software", + "is furnished to do so, subject to the following", + "conditions:", + "", + "The above copyright notice and this permission notice", + "shall be included in all copies or substantial portions", + "of the Software.", + "", + "THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF", + "ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED", + "TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A", + "PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT", + "SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY", + "CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION", + "OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR", + "IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER", + "DEALINGS IN THE SOFTWARE." + ], + "isProd": true + }, + { + "name": "rust-num/num-traits", + "version": "0.1.42", + "repositoryUrl": "https://github.com/rust-num/num-traits", + "licenseDetail": [ + "Copyright (c) 2014 The Rust Project Developers", + "", + "Permission is hereby granted, free of charge, to any", + "person obtaining a copy of this software and associated", + "documentation files (the \"Software\"), to deal in the", + "Software without restriction, including without", + "limitation the rights to use, copy, modify, merge,", + "publish, distribute, sublicense, and/or sell copies of", + "the Software, and to permit persons to whom the Software", + "is furnished to do so, subject to the following", + "conditions:", + "", + "The above copyright notice and this permission notice", + "shall be included in all copies or substantial portions", + "of the Software.", + "", + "THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF", + "ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED", + "TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A", + "PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT", + "SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY", + "CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION", + "OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR", + "IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER", + "DEALINGS IN THE SOFTWARE." + ], + "isProd": true + }, { "name": "slog-rs/async", "version": "2.2.0", @@ -1323,6 +1319,39 @@ ], "isProd": true }, + { + "name": "slog-rs/slog", + "version": "2.1.1", + "repositoryUrl": "https://github.com/slog-rs/slog", + "licenseDetail": [ + "Copyright (c) 2014 The Rust Project Developers", + "", + "Permission is hereby granted, free of charge, to any", + "person obtaining a copy of this software and associated", + "documentation files (the \"Software\"), to deal in the", + "Software without restriction, including without", + "limitation the rights to use, copy, modify, merge,", + "publish, distribute, sublicense, and/or sell copies of", + "the Software, and to permit persons to whom the Software", + "is furnished to do so, subject to the following", + "conditions:", + "", + "The above copyright notice and this permission notice", + "shall be included in all copies or substantial portions", + "of the Software.", + "", + "THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF", + "ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED", + "TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A", + "PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT", + "SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY", + "CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION", + "OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR", + "IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER", + "DEALINGS IN THE SOFTWARE." + ], + "isProd": true + }, { "name": "slog-rs/term", "version": "2.3.0", @@ -1705,11 +1734,13 @@ "isProd": true }, { - "name": "retep998/winapi-rs", - "version": "0.1.1", - "repositoryUrl": "https://github.com/retep998/winapi-rs", + "name": "ticki/termion", + "version": "1.5.1", + "repositoryUrl": "https://github.com/ticki/termion", "licenseDetail": [ - "Copyright (c) 2015 The winapi-rs Developers", + "The MIT License (MIT)", + "", + "Copyright (c) 2016 Ticki", "", "Permission is hereby granted, free of charge, to any person obtaining a copy", "of this software and associated documentation files (the \"Software\"), to deal", @@ -1732,11 +1763,13 @@ "isProd": true }, { - "name": "retep998/winapi-rs", - "version": "0.4.0", - "repositoryUrl": "https://github.com/retep998/winapi-rs", + "name": "vitiral/build_const", + "version": "0.2.0", + "repositoryUrl": "https://github.com/vitiral/build_const", "licenseDetail": [ - "Copyright (c) 2015 The winapi-rs Developers", + "The MIT License (MIT)", + "", + "Copyright (c) 2017 Garrett Berg, vitiral@gmail.com", "", "Permission is hereby granted, free of charge, to any person obtaining a copy", "of this software and associated documentation files (the \"Software\"), to deal", @@ -1745,49 +1778,16 @@ "copies of the Software, and to permit persons to whom the Software is", "furnished to do so, subject to the following conditions:", "", - "The above copyright notice and this permission notice shall be included in all", - "copies or substantial portions of the Software.", + "The above copyright notice and this permission notice shall be included in", + "all copies or substantial portions of the Software.", "", "THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR", "IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,", "FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE", "AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER", "LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,", - "OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE", - "SOFTWARE." - ], - "isProd": true - }, - { - "name": "Stebalien/term", - "version": "0.4.6", - "repositoryUrl": "https://github.com/Stebalien/term", - "licenseDetail": [ - "Copyright (c) 2014 The Rust Project Developers", - "", - "Permission is hereby granted, free of charge, to any", - "person obtaining a copy of this software and associated", - "documentation files (the \"Software\"), to deal in the", - "Software without restriction, including without", - "limitation the rights to use, copy, modify, merge,", - "publish, distribute, sublicense, and/or sell copies of", - "the Software, and to permit persons to whom the Software", - "is furnished to do so, subject to the following", - "conditions:", - "", - "The above copyright notice and this permission notice", - "shall be included in all copies or substantial portions", - "of the Software.", - "", - "THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF", - "ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED", - "TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A", - "PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT", - "SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY", - "CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION", - "OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR", - "IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER", - "DEALINGS IN THE SOFTWARE." + "OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN", + "THE SOFTWARE." ], "isProd": true } diff --git a/build/win32/inno_updater.exe b/build/win32/inno_updater.exe index b69182a7e911c0f18ffa16731fa844a8304bfa06..6d83b2b748b3eafcf10d92e52f84fd1b96e87906 100755 GIT binary patch literal 371200 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

^={*(UB;} z3#bCqb9e6GA8VJ+EBT$o%t7?iRBtZ@{b^~RN%+$V9Hn&v6oWe7Z+5B zS#~lR+z?;->@@c!(!x9y;-#q;OWT<6(?Z`td_%D8R5JogV`T zG9X&m4Fha0!-VR(5DPG36fq1Gr4j3pX4JWYpatbPZxHtaPo9V1iwOESFaUZPZlcT}6}S~ezv-p?xrw+2$A}zS_jo$JT5ifg1RV+0TG;XPa@R0KTtN|< z9x*f=v71F`Ga&AA53L#qaEy`0Oa-Wn3q|TDol^Wb@2CznkS?m187ftvEN9}SOGJe@ zncd1zSg>SRw8&}iTtS_!R?r!xnM!mm@n?rJ@f0X;Whl#M5IbOY1Z__@#;~k##Oyk# zj`o?IlvM;LSKyW9oSjGs4_%}uXpIOVz2PRrepti3hOmDRf1we;(Zs16d@F6+2oe5; z>F#ucZ;I%fZ^XqPHhIJz+<{}DK8te5BaZp<%xad|Td513Y_9_+Nkh>Z7H!(qf`A(x zEb-3x)XG3AdJG5#38$crHo}?}$}6k9d*zjt-Y?~q>!fwkfzp?4zoXK_EN*{d=}OxZ z^n%m4XeT2LjF|?|jU;q=g~wKjWT39Y11bC+hMT`5orE0eB-L^me?3{3*=;`m}zic4wh2=1X!lm7;)OtGN>GS*(r2w%5!+3#t66S#w5K>h^?~sFX$cu z)A1vhEw}v%V2DqD##4EdX#^}HX>zH@hB2I=)Riu`y@UX`*hgMEyf@{qELTcPOTo@! zotPYB(>ZSvCx4e-2o?&+^&qHMO zZh8w{jo=UUH=O9bHSo9dI9Ws<5X+0k^XAKp!uK5Ei)B6YrFBC-!JEAF2!0j6KM*UI zDgDRW1)sUje<KhX^)&==hyoC z?7}r5X+Ah{$gok_=5OtRSVNUk2R2DfN0nWMEu=i%D7FT&aMW;|apELENAu`im5@3Gxfp+lu)tKf0x-g!aZt6Ao8E@q zT$=;_m)r3Z*aSff8*bS%5Lr}RwzG^hQk&e9s>awr9MI4_cy`Hwv#UQ-m!?C+1ZG>> zaU#%x6A?Z*bUqY?`2cY#L@kRMFSuYbcJOYRafFKuTv@X5@y4#9uP6JHn zcYt9=I}8rAK=2xB&k}&w+jBUzXBK|sTtB!%Vog^J3RGddlO{|(yUr_+1eqb|mlN@0 zL}sz5^>SM-Sku5mpsLLTFKtUiA4Ymj7EPURY}0bf@*$jFVgu2e zvYEZx=$%*u;>f%d6~GZ7LDEIWg=FD@Eb7K1B7@{4WVawYUBL)r;XfKN7AG)lRF0js zf^6|0fq}T53&&q%pKnlGca#Ks;a;zR>1izFI*5t+NrPjMxp@E&)mUY zGIzQV!hp&H85f3p+YG7}-kBgI*U&rzt0ZP#0;D}{YIkiL(V&+)fJx}LqdEZU0>2AG z58|cH#Low5M0}ehpN@Dlbpogs@A%Lf)Czd-vUfs@wsnaMKM#dSD6YdWbuGC)<$w9} zpa0x+rLxl>>;bQ9e>sg`w;w7w@Kq@Es81YEj7_eV?Rx^Bl0%82tq^c%P@&q3DXcnQ zq;4b1&4YIZdk9Yt6SXMq55^ld1^%YHqb9&V*RDaS!@wXOw<1zmqp!}9C8UPlAcOQ4 z8D&C(DNWL<(Ec~b+X{?_`$iqn^F(V8_#YcFF}T%zAl?@5Khe{-0OJff`?&w8$a=w& zPng%)q%=1jaEIdLr7O`>jw+}5#JAG`4txnHd&pBkUkQJP&nqVTeNWQ-qIZKla(hWD z1?9&)C>b~etb~1A_Xzf_$`+12)YEq>!~PyTQjYy&hW!KLnENEK-wGIG8TPjr_GVyj zIV$%teUMfAGjjFaCs6H76!*9E zWYf4KsfRe5D!Ug0pIo+#rf}bggN*GAx(^!Mo6-VwA2t#4IuUYFY6ug{fFBe~7~Vh% z=G#e{2OxPZIrCfxx{(fWS>}=-_>!6!aAFBgEJj|<{Xr!S`Y>m{;8hIzs+HYrWaqA) z>E11PcgQ1K<&pJ)jXD7vA&Y8{wKO~d6(qHn`b%2aU~b7npcvN=zocjV4a=(MQZ|+x zph6|BJntNyccGqlAtwGSqu-ULtp zc#a;a=uIpWaJ#UU{u3Z!m%LgrzO=oqPmsUYHbK7iZ8kx^TYl_Xf`@|2ae#Xna5xn0 zWsHX1nA67~7FQ3)BUj0r3>__Syg}wrUK+#8CZ>jzjsDi2B`pNhw;&`xu?!Vslf8i$ zgh-MuhK{L&-vavtjPFDJVR{2=srpefNe%kAikbvHm=zCtCh7O-4WM_LSqhYY8Vb4g z%gMXflA3Qnx>HNtVA$<$F!+zgxa-m~Y8h_%7k)Xn*|5ofu)F^gk)cl5rz7tkxBspEYT95l8n*gB>F)nnOgO2}_jGSR-*dyCPBY)rVXo(G)b5+()hC$Z zUg^@-)Wh5ars)WF@`?p_YS_w(iIkmGw;-!qwVb=heQ;=4sA*abE!Z|ilDM6VeL~=T zB(+O`)pQ^1A84Vb=%L0@)9buwF9B|3U>sz!lDw@c7&hTPdyHYuHtHhhG>={Xb;z(Q zI1Te<=r3Nu&l@Bmf&ZZpjGGWxNg>FNzy_2US&_dBq3Gz8TFF6r)fuh)`=2tHK-*$kDNFby-; zsHHs3xJ`>|JfeR%f@c$WY(hBpEh-F<^8rdIe*tqN%5i`RJQW6G0l&3Bze+1d9aouX ze^xtgHQ+ly%A-XvQ<0wLip1JpCW{vaS6D|o;q#02i%ZEC0&^>R?NiWoZ_FL z*;nZN3|}m$Kk4Ho!{}0X18&wt>thv6v}ve3pima=Fa2qCFjC5WI1Q>NDhFV@$Oigg8HAvl0VlD-!+}_YXPAvjAz<3= zEBTUQ1UCgHG6vXT`=-3XR*7)iEXJ7cG#ylSu^A8lk#2X_WG1g?j(DT8z3Cu^6#hUD zOmPE!T5?TlC2Uo?I#$Hi*>yKF;zSa5BJzFyZlrg(R~z6}{!+O9&UJFm9vHc)@-He4 znr|L>I~B+CFwqZIq$%_GrUEL1xJ1OI1D2Kb1@|Ya57PDeHpFHkHi^v=p+`^}@Rq{f zTCm$f`w-WOvh_Jf{3=7>dPpsH8$8N-Up_1fPjgi}=Cj#O9vhzGs+K)}1%6_NMH@}VvY4xDpKDCOzQu;g4whmL|8Cr z23&XrZJ^QE@OlfhR-DH`O@kA=1WPl#X9gSB8SG0Otb3iEeflLVG!PUKO(&^>Y6{I4 zwc^bTd*m}0?!)xym#owc$bfY#wvq+UiY@qoVrh}wZo$u3hurp(R_ey(rAvu98{zDL zV%q?0IKY#pvgtX%&fin$-Mzm*778JMBE(%%%r>_*f?sb{frzB(5|2-K=ZDi>BX;ikTi}7_F#}(Mi z)gby3v+!}Go792Ykms;#W+E*kFGUEuU#>HRf)?#cyv&_J(Uwm1iqdqs7c040k+9*LovP;bsm8#_9850UZ&Qb2>+jm+GFFy~w$iCKL-6(zh=U+3 zO7d$)Y|=!!Y-~WHQjY>uY?I42)aWX;+YHDb6HN7MeOR*^8(A(C3#WH35`!YK>Lf`y zHd)KSd;km{Xr`;>@qMKIv2l~fVZY_eY=d}eB@*e|J<2idUfc$Ze1Rl5PFxDyhZ7lV z>C;!VrAozftrLXZ9%1D<0fD$?pH7ARi^r~3WoO!HIp2Tkkm(L+m!?`m#Ep| z8W(axfY8t&O#Mm zMZ(@5XiMk@{>`mi{>`l<3>!stsQ%rpRZm09@!hRg@YKJ%^#+32-Y04+DUGz{PZR@S zs|@tHr7=?2f9B1znLhuP2M!dn^?KHcv|p2lK-FQfoh`{n7TcAYrVo6MRP0NTM;`OH z^fzpWPtsLJOmq*+q*-o1a*^r*)fB^a@0ZkVnB{p>7 ziO;#Q4$0iW-!05q;u}E3Xr%Mq3-pnKeAc&Q>fKQm?|x{+WoJ>`w_)88fhf>YcIw?v z-n8k})Sc->nA(U)dW9n$p!bR?`tF4^dPfoJ^N0wGjx@T@(~;7y3L+wt_jzw%7!AR4 zuOp=G&VxaI@ck!Ax70&iz_73q5@By7w;g*c<~2HBVN2gF{k1MsXQNlNXom4(Z<$^ zl%v?agw?BnvXkc2*(z1_oN5}A(u%9^HJO6RwerZOl9Nv&D7#1CmyS4K)(hKxljvWY zxe_ysehf$jmwN{$uKQ5VvS-JP#uoTb#W^+i;JxG{wrsQBH}C3@;T<-IB)ftrQvT1l zyE7CGG;GHzbBj!qZT>m_)i=h#rEPl8_uBasOkQ7c`)B>`l1F~Q76`W~$CInJA2MLC zmQ-@`&A}MvE%gJ~oGQYVTqBn~M%ZC=M5XZ>{4TuY=8{%k1InkTmoU<>zT2p;!?`ii zq@8yDulr{i_9-=(%>7uzeDTpaA>zc4d-3D*+(=(@m2;0l-QtBs$pFSq0@V0&8i(x0 zxOmY8D*U)sHkC@--*;g!8;pUQ4tpxWOJGiZc`0`ND#vFNQQA}ZCISotT$is3F)6^} z7DwVrv4qSg3g$-Qicp&8n-q@I+c!&HU{p3~sE9BfqW}}OAdgk&O7J(0%SH<)H@I55 z$xCUjRxaDHDlRtDm-(wKA@qrQn}oUd(rYn}mpzPt(LVUQBv>~ifR$~p3xxt~8R2U6 zW>Lws`J4vt28>{vh|#kBYuQteEHLxpvWYZUOCzK{tnbNX8$COaiMlqkT>3}QMyDvA zP$@h5M&Ga|cXKz{O(Sv74!P8i3=m~=;6+H4TsFe6Y;=sf(X?!Z6+5$6iGc(vH$nu> zifCIE!>5>e1?HKl0%ZW8EnluzKtX^i@O#9RxghilY{P+@4 zF%Lvu^m-WxZYDrGwiG!{if zEQ-`2ANm2%hWKW1o=Us7P-(>a_s1pFDgMCUQHr^|6GBertQKfXo@ZXis@Ndk5#N?F zPfsy`fhPBQ;~3>WNm*pXo3S*$bh4pzY>W!iKUP$xOM$;(RwQ+Ua#W|=od+ikbf@_n z;u8GS6puUM=}}X-TdcCDh}^!GD;zmE=_K@qO4DeuCN@5B7vK=ve9jnm!%(!SS!vX3 z^Vm-TGoxAd%tdD>mnCH>HSUjw24>(5brc~E1E{k^%h4A=Q8WeriH-!fJOmtsnZ za?#YGdwmQt`0_%^Pi6ZN zZ#ceknHaCsx|`!<_dfsx>v_0EPb{Z?*yM%2qA{Ff(w{XR-wE`D8)2h}~H zUI`LcWbY!lfQpv-sZtyD{Z9}m`KBA_V@v`nYTt)J;zb$Fj=pkPyr;70a(rwqP>;0m z_d*rTwLjL?f;svI#0D0U&|+9#x{fBCT_5((*y%`-%LXa$4Oe!$KOU;2+2pd%GaD8p zvq>H-6l5HCz`FcYPj=WcgErkmU>O(gRz;it_nH1Jg@R zvZk7>p3j=<7<>`A%-G%C(hWTkjyRbB`&ep-zNSk}CjWjn3+_D7)?lsji0u&P%QN3$ zZDxLl+AN_}eg?}_sT%i91!Lvleam}&)6w1c^5OJJl`gS zd})0Zr=W~rXY8yvP%ujwW>_}Uc3J7|vC4y@GENFy15HTXs~lx|2aVt3YHeK5YcS-_ z@qk=5)cwiO;Cv8hq_*KYxgSI7z+IR&PcEybJlro_L=Zn!no%XQ|C6`` z2AZJu1<_`bXh`Q^xy(emcwlJorzFAt{l|_2By5MQh-5Hes&u>Hp|5nM?ofj4d&IEfN}^5qjG6K$(3ZZ1hKzl( z{WDtB{S$KH#q(P{<+51Ad(fCm$?4C%^|KrN!^xI)zTd&#tsNN^J(Kh_WUxEYa`_C#2{ zj++u@NYdhHSB-lwCbc1xsg;c7^6#73bLS^tMr=u~Jfh`t@e3xGnO`uutR>#VY>_I^ z(pbdwf6eLU_7|)T%K}&$VT9~mgL1)#Q79c{1?6kKeR~w!(xK6oNaKF(7zkr5j8Kk{ zVzV!+a)5dZM}eF{Ad@g&-yhGj^hxkj+v@EZmGgS!q?RVRz@`+>RbT*ek^#47Y=h0V zIeN=WTCpzRDn4I;njA$C3dJnELKCHR=;c%JPpZ;4W4pZM&uy81gP;%PP{1U=juWjl zu`x=9GE7{SZ@X-kvd~aEDpt8$R3^Yt%3_X^@}BEJ|BSC4S*)t4s9d(gb)sQGCgO(3 zWsjiEKN(8ZXm*`wT#zvsy)lt4d-9p2Jt81EFdSh_o`d~VcHuhzfw*9ApA$tL0?osyLh4Q~D<7kzdx9jw|dmr>%vgCq;+A%Y_T6}?15 z9CZ|}3ERL9cm|$3K}lc(WCn(4H_MBr(5NZSC({;IO)_sxCH)^86B^Ho#i&f7&S0>X z$!r3V3na=l{X=Oz|OP82WS-wh2jDBDjw_>NTdMOqBm+0VHFlk zg@6%BNH8G*K=+0dJ)cwJ{rK?>H=qx;SCK(^A5I)~$p6CAXZ$G%r((1%>+abgm*T!j z*zp!zh=_uJMFaRAVg*~NAlvSSg3qJivKZe0Rur2kN>8#|^wIU$BMO3>ELHcSjz&^)@)UMXyx`Rxoe@WsC_t$)o!OXsK#- zw>8}&=v;&jjx&`qf*<5$kz6_F1`Z;2bG zV(GXTiouyEOh=X)9GAFGV65Us@2?d+ikXHq8x8;NKrnDGMGkI@97B<}AQCm{85Hpw zw<^qV=VPd_vGl^yn++(v@SehvdjtluVyIn1f@?(Drr;Y*BIYqHU|!tqEr#6-C$ocb|K?Exn<@NWd$ zKn58N?LY<)#XwH%3gm<^NHW!O83TD9f^8tzbp}}#2AR?o$bn&y9)d_p_@qqV6@B|WPtP$b@gK@e;O@vnH{BSoy%1A@_%vedQi->W{z!10sKkf4N zC7tM$mzpww`L6bPZ|XAd2Fkln&--bF@9t7Yg|Pz_WOf3-!4FXpmHV$<=Khd!w|36G zqs!bwi4tls3{*eCI6Kb&NuPwR39Ti7Kq|HgrIex+l zuvoJhfNh)f#a*(nR#;dYm`%%6R!wW5Ek!Iy%8D7=my5Bq|Jx;O;n@lYsNxdTd3F{; z+TCb022wTK7$TtgBV?GxmA7Rspv*UgGjoz!k@w+n-dQUK0O-H*|0(`!@ZTTE$#C3* zUfU8zaP8gayPUbSS$;&qHuik&m9~ zc>W6i!x8R-{4XKA8)16C2=5Jeo{F|xk#_*n_uxr~k#55O?Ff&=lj5ly?Qi=8&sPyY z7vbf4{9L?K`mgZ+5B!fu85iPS$A2;2sXlMv|5?1#ddVa;RoSMF6P07MQ~u=tQo~76 z`^orvN+L#$DHx%r)3_P~r(L9&Sj)$@{snW(g_YMW3LgoDI%9ESPv^sQ8Hd(VQorWn z^RZsazBr!ouF{O2US3W!^~vul8`ly*3_P3OORmGIs}ubV|L(mHx$RXsN}4Sgj~~oZ zN%)febAHTq|E9{i5wq@wcd!{*IaE@`uG2YLvg`SER-6oB*Xew~F9LcB2$UM%3WARd z3Y5>1H@QEc>GF}=;H5uT>D}S`JKIP08^0A_^7b3*(GA;= *ZhR^iHpve=pUq6WT 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�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

)ZbzzKcQcKEofnO2ua~sYlopNoqO|GafHQC{y2S zeETC|Esktia39$10XZVFBSrL{s40`}0&Afd)JkY?6LT75i(o0}h93c5)&rHwUJtH- zZ!GJjM=gv?^?KRjpA^rP+T!CO0eZ(2#nWaN(5ZYS-%({*3=?PX7oEOygC|(1Hp@5= zEu?krJ?A*Nx;5Vg5P4=tk}<29u2C!Uq4caS_esT*eGi{v(k8EP?$gos6;4Akx~_!u z)HCg9aEADaHyl9rO%#eJ!EyQGGp z+I^1{cYqp3CyVQ5xTN^SVJ8;W(8z-dC)uzg{0V)=un3)&$w$69&-|I|9u`aSo34Bg z>Mmg_YZmfjSex%De9_InXwOC-re$G5uBVOQXc=rbhMwYQFrHkmcaLvmNyV zzD*tTBeN42bX3K?CdK70GmjkJC26?-diTvw&8<)#dge6{&l6mAJt@{cJH`}m#YX&` z;c9)HeS$*fepggQ&R=%?&G*I5&51WZ?fWkG-$l!AEUw%)`yGj_?0EB@Wf%{!;xM31 zchJ6Yt}FY2LX}nflKlKz31D=FS{G(=12@jUdPp6Ko8;FByGDDmtW# z;0d9|$mEFY`!$3wxW8*ez7`{J5ED1mdn zcAmgFPhd2E(1~E<@!^ND!HYeJ`GeAejcLUv{QcvDBHTu8Dn8*GaAV-HM6thO@{NQa zn!yD)V{xfyc6gBjX1wAkK+8x|M&ayx)ha;!#f@{m-Q*fnFt&Kp?1S-}Nm3Y}IJUTP zc4oZ#Mm~MxcLf_ykm_qET!SRh;P~*K_+#gtlTF%#b!))<3TwjqHV_KmDNGovoBQrm zY___cD)!6CShLZ3b+3Zwiz*^38By1QUkNpxAYM)IBshECSKi5{o8-^sX#QMHe}dr8 zP0{?hR;Ej~5qd;Ir(}j75dIuIySezCZ)cq_7CnSZ^W|g?p2roOvFHK9;NBg5RWZ+| zHo#XC?v-p7@_o+!F0;P@^*!|hRB`3hG*w)=242z%*(&_G&Y{APYl0z%C0=7)X^z>X zxNu1hTn8LDwgH)OdcJ*|!yWv$yk7h_j-*u0qTVVWmQHo1gaNbTxKkJ~FqUS4Yy1}; zlh1ZWLizJ>rg%&*=)^N>I_LGLEGg1F5ceE@7ms8&*1e_e^9Yr_z%5KAk7g=KED42m zB)JH*hQ0@LXqC!Gs8mV2^5rH`wGD}#QMx+b$IpHsc!G23PdUq*$GX=eR)vYt57P=a zCi(aCi}H9=>Dcs>QB$T`mvM=EZ;RuqZ*4Hkit?OC%T zCQzuIpI6K(YR(6&3&+%*^p}NY(dio%&i!frQ)LdRtszAZg;jmG@I16}ztdsvl6s8a zw+w%Ss!*=e#u(-a@0dfj^ct$s%@yQ0&Dv_`?AhahH!XF*Lne5Bel{n(WzeJfLXQf> zl1EvBy6I79QMoF0D_ZnAnhGtN47$zbd;vw6HF%)PXSL)+54SGM7Lv5Cx%-_=5 zI>Sp{GGN6MU3o^0uJ{eumZB!pr1*sI>(Y^wTu5ZC z!oD8+iKg!^N%FJ${9o$c20p6lPWYcm2AIIW9W<6iVu?Doq{fB&O9Ih?1|fth zDD7IBQfo2H2q=LGlV~o(v^-nd+O6HPE$;es?G`H=AyUaCm;_KsfW`1q2#9*)pbamQ zgkbV~f9KxG3)0>0v-|l!|FtD^?s-4IbI$Ml-p=oYS6lWWbRArjD&1EWB440Becg5e z#PsOMl3z@XYFLVht~L>>Qmv@hX1egWPC*9hUc~!p>yC1q>ASTZb=r>IX^r}!v}PQx zdz-W!5p8O%pt;v2!xrVwj1`F0wJB){Z&0gVKR9<5btM^Fy3`gS3%011tfm(72_{LP zq?dcP63<@Q9;*QX&+5KHl4#0m!UGD$w%}YAeR_dWU}fiOgeju=rsOq;7CX@uWM6`# zwOGTj2@pgd!A=Lw3v~3_lKcAihu##-w)t0xUw{8nans=cesHk}3oR>C5uR=$blqJ%}# zKUrlg0GV8%WC@Fs$-x-1En(4m!B5DCRHp4&Qp|r_Og}y|Z6U;g@}CEVCBLHlN936b7n;k`pDPPenX! zURaY9{m_I$r?y56N81+DREc5oXKZA?2FrUuX_>pk7}3VYR@_BZeOp0ha??!BYBbnbs1op$`m(j0MTgh_V^yUA`(~h z{eOVJ$M@lHo^R~O-y{0YPh1utlZXlrD{_)Vx{zYw^GV(a{p3}&p;+_A_BJQ7bfzS+ z?Z<#2bC>mPNfa)KfWv(4Fr1={oX~ljhn0oTwz5BM9oO3}`Gq}vuX)}u^^dA!R2Z65 zRIP8{B7mM2ogrK*-Ah4`x+X#tM~LL~9@L&ol#K1XOH^J*wajypeRsj)j0cTUG(MC| zg054xYRvT&@OTfq?URY;;%27zUHXATVlj8SB(D z9`M$f-}9~WIB1NA=2-yORF2VAA4tjszjNsc3l#DepKDsBXLNLLjI}O**P^^*=1x}= z(Qhj`WWZO%=s4JyW<*tZ+shkZmo$`xuuD579B+n?O1J}`mBgQyu=uYe?1BMiz+F+-J7wrZGF7`ANr!^TNP}K#q@C( zmi_$|>^UE&%wKKKxl&~wWY2lvkPNfm-V%QmvW`M`g-RTHr*I|9h41iTtv1CODsiz> zoV;zylGDl;lM;Fe#|(-3u>@XyTO>Jqc-WBKqwBRb-{O11N=QS#$4ZGc^NF!{vw3E) zx!hOhdK~|o##*(C2T0IfyDv#U4zYk$Vz9myvMIMy%dK0a!U(6rjg> z$F;o1@U(Uk>nU+u+jPts`Ow)Bp*m8#DHG1`B(;&1M$t|Ok4bmbliE&+@ROIQL9dmn z!#Tes)~0Pb94CFL3E$tNXV_&e{Zr@EukaFz*AaG_JFmUNT z&7UAMh_DwD_kT!ChK!Z52|jY`k((L4jC@gAGstE=^|L8OMz@G#@Of#r@|*Bb7=KgN zNx2m5#h(2iUWj1(-H};pBndgu` z?{?}*xCj+9kCXzf;=TmtiT|o00Yk7xNee*r@GNrwO%tj7683}uSJwFL80t2RQPT$Zf_CZQ--H4EI+mCn6eCB58 z(C5RBK%~_%Wb-Cuj2&2<7u&nHsp9q?|6^a^NF2AEY*-BqCzs~IUVn1*4TFo zxXe~2UDk?6Z&V${gqTeE`hGQxNmPVu8_^_sfla&633CyPh#O0blS^NZR?fmUHlzD_!U9#pH7)^@y zyISqVbNm0i{{!Y*8HoUI*55HxGT_#7FH&!Iu)Y^Z33v^V6^Q7dtXKQ8LJaBDmZQBE zz>9)_)3Iz!u=la0w@J6Sr`DUG{j4tRJ7SOKl=V)Uq9OHr6%wzkcjL2m+cq~y^u;+a6C1{7mKx9U+#l}yf`QzaS(6~m6EtKa*Y<2+&S`+G%s-y;?50c=H*_D~S z9T)V2j*M#hWz$~lATCM4O3MRNoMj%|SJTo2cB+1HENyY*RXVOM`6>dOTrF53Ms-@2|cPa-a>Ek6W`7pVtxZ5NOJpd`Ar%``5ZBOz+Km{*rkVE_pw>{CN7l)mZSadxI*Jv?s5GPicfF7-XsH*l|dOtvV8Hdg|pHn zWANzjmQ2$dtED&7sVA2fGCEEMd&MPK5(PYAM^)G{g^*K5qCGpGVM-O-T3J$v_~*Z4 zktigqO9(fExW=wj2+Re>d5nqweV6@R$`Ckczo<7L8<7prG`c-aRLL@y^yITLK6)t) zi;%>T)}Guo0R+qxWP$3)l%lN>4;pNMR367}XU2lp@(p(Eq(D}n?p79u>oWd=^^=YC z8Sso2D=ZPlIlb>BHC;B{zT;+kv^8 zE;+3AGfrBguVuZxt)C8Ac0*Zj;HS^q-Vl8Dx`ebT$Mj>b4r_Z54nj6bG!GRAqQN)h zR?_PdGIJ!fWk`+)GQTr=XWLG5v5l9-rq-(z9j@=EDcOH=U<=ICk?o=zrx%3|B z@$oi)HpB?98C~Z+tG6U~YHQ>+mFlH6PLy8oQ{i`IB@CXqmn*C+qq0{`h0O-{ov;G?QclDFu*BGyTue zYrThvG=-iD?CnjXyXbGWw?%JccG62qO-odUn4KnzKRx+k+A(^a?rl%r z&9`&u!?c%6dWOEgI*}Fy`ElVWtE%HL=>1V4&EJHU^+{e*cHL1_<4sZxG;AexMi z2XeSzHOI4r3YJ%IHB0*>lG5v}B1R7T7sjCzirrX<@`kWm4vRTvc)W!3&F~}%=a}Jn z63#HgOC;`GYe2Cs&Tdc(enJ1b{Q+=*|z*Vd_=#MFh0dKT$3Cf2DT;49!= zMK2WLC8Job#2K!)1saq3?5<<*m;^ky!KODSM6~i&#EQZsz_6Sk7%WY+Y31(`5*8L4 zTRix}vDE4p!%wyfZ^4y=lWyT#C?rfvqn7t>c$F|MJwohho0`P$OpIxXKuv^;glTyf zPE|Ln zbOWU=elVJ*F zzQ71oE8@J+NT}00p^CYF(y2Fhe7l{u4R|b0FFY06s>pVg_!f!#ag;(jRCwWALLL_$ zg%Itd!Q=563R%106o2h?TWi?DgcilWCKS28;ArN)w02JN9gTX6^1QG6aSO5&`c?Z~ zyU3D4POXDLTll=TRPUz%0c(?_jVOGum2{K}B%HDx`01Z%Z~Bs!jg z)Pnn`(xYWP>a-YB)+1-cHmR%HJT01E879T$VAv){M74QDG{2HS@xUR--DcTM#?6JT zdST;~Mc&;!%AoyFTwUH+x>fvAFKE$r9M*Q6N!y)v4yA*RN7mBB8}qh%yF&|VaFC!) z-K!*fsI}2tFIpd7h8?rs(s5>jKan=Hpxh|YTZr4!aVAvg#?rX7wKDfE%xlDoWrE+( zf*;Fi(V_^~=_c9QJ)B*tH!poo^I2Kc$G!VQ3l8XqlFw+t;~+-#;oSah=M8|guH+W)-sC!sE9syfRFVq}QajQj z$;Z9uQ}YqS?zfC|hLyHG!@1`H;EIe76Hky&>{iis-x`a{!WP&)G(hfnH@6o%H_iMpA;^ZPbpspqUEb-96OK;Q9 zgcHZgU>RoGe!W&-aEjU?+#!h%^Z|i5PEaklQEK6FlRVxJG4w9)VF7!ws`^yg{^Xvt zmgF3 zFmtC+czyaBolB=j717LU(-&-kbZ*95SBoNPJ5Ek0P2?Gp;4{)FPDr4n9h3DlH?l8r z?-99i=5`D%fVTF#`u&CgaVBhNy(6R2;pJWHup=86(5#ZMD-ce+&v(`I39R|1u?(}N zbkc0;^uQhETo>0EN>(x+Hs$LK~{3$_`4BYD5KKKby{g_36h80(Y{<&j)V)~2N% z$qk{rEgdJl^N6g$hr356Kj@P>lPLyrgmk}xSF4_vp+tfNRAc>pD@Gi68<+cY>^P+ z(IzOqUHasQcno?H4=K*jWH&R&3upcWTzHIZ)N(6yg}=&P>@dL+kyATd7FH9YE@H} zxz>WC!Pa}^K?Dw-sy72&ttGc}U6iFcA+Ozcn^u)Hi9;*+-aX(`y)OFI*p13My$}!A zR*|J|15k0@5Q*L^KHl+;F0hruPNGNTwTQR=Bxwc2HS?%9;+w!_buO^7ccQm}g(4?h z3607{Lf`%%>ooISfwXt^!}jCe7Of(QX^N(1?qVh3e<9L(RYIe*e1ewAE>0*$+x)wD z?G*rIsA2&lYLlI&H;W;WYNY6|BWl9Ctwu&(*FnRL|FaZqVC4E4F^4z; zK+?s(DB&1bBwoOBj^E3{B54D`BIWEcSSX;r_m|-zJqDJSgT#9VpzQVC%vkL8`nhnH zQ$N&yo@iCclQU}q@6`mlfl!UT!TS#WMDkAET-v@iKf}Ciy*s}2booACR^Vcs?|N%1 zM{hP4bWyLrwf9N$GH+JfZGf`xR`O}RAvy$p1{I-lEG4kT`pSy0{R+;zF=Uu{)Z@?wxw$GLNs4_3gcyP8pIVp5+ito#rM=W{VTwZbLzpd+k zfLvVDHM5nR#JxV_@4Kw)&rmm=za$rRE&Z?wrMa_XFmlPWv+A<*`4wdV@dG2?T2YkkhAcyQESvocO^hcnAtua*CnK2TO&?+TaLr91uW z%iFYcDEW7+c88buLS6WVBBJYr(CI|wzG7R!-*Nc09FRlN%X4EJ!ZSCab-P5bI1Uu& zpLaCz=kg`4d7y${ZphngdN|nz`P-^(S-I})w#crYMaz&%;SvIY8>1ypqAtL zb3NNgr`x_s_rkb|k;g7%!q=-QZV~v>zs=@^%a@+lH{pd_=#x41+s&!B=2tJ=Y0dj2 zH89mZeBVfUV}|NUzrr`RpP=eoa^%_O!E10~eDRmnRdF|44-XZ?Wna45?ql7s&y)wP zkUKo3BiQ-HWn=Nzv~$)J+YTS4vJixXnpo*t^6mX zO#Zt6d^B#ED?CKv^)ucE{}%1F-LF6U%Us^+T6<&o8GHGu+f@IS$6L^|FO1@`y#~g+27HOR<+a~IJFwnY%6 zNk}WXD!gV-z66IqHB7N_(d+akTqVeYSH9DNjdtyi+`UhUw8aI_3}bGN+36Y9)5trw&k4~BA;+Sc#4c0osqEYBh_!mRmXZ{`VKDr*&X?u@ zfGw)-6M@h>acWW^t9O>Qdc$oK#dAhp`%O|!u+afGpvp!6tv@nOBA=0ZYWgGNCDJdE z{|phXU(_QtC*lGpQucooJgMnT;rlXzHAR7o!?Biwg2tXK;a*0l_#mi{vJnqQ1niimzX)FY{Q4C{ZnY<`EXuRMNj;{kw*e zvG9M_?}G#CkJTx0BJxNA4Sd3HJilUU)sIaq`;qZj`*S`sZ2UvCNkue1V0+d3d!vEguDjEUMtn^ab)Lp7Iwo2|U!0C)^nYYf|~C z$9YLZ-cB<{OyfZ22Y7Wgw8R~nml#^^4B-#ebxijk#RjYp0YEEPLJ;vG0h+l*D?b4c zq5Xw&%)yl=aOPG5wc}FvA%2qf8 zMCdXSLJ8c7S|2L9gjj_;zQKdiL7Yd{l&x$wGhH2WHIr-HK>C9FR*3_@Ll0b166gfP zd>jjn^rT&Sa;Mpoh0>Gn#d@Od%U{-$yH!uV9<$dB6`i;GGwuJfKj-`U^OiodDY&}T z?!PuvB*G&ZrCb1Flwn76ct*1$I!3Y307=fKFz>#K*oH+FF5LcLZ$|HEbv$VmFUvgT zwTolhV1p-EcT}sGEyTc+nfq}0BD+um(Y0`}4~KKiX|2apC!U!dj8C8s7hQR7{r83Q zwu4tL^?pIM$}Mndv7uA=k-AR*n^CC^2~KF{*07_|3*(=1<(ibkC*^;|)B|kW$u1}` zM!ymhmnbT5A9@qCF$YxIr<<*`*!myO`Zx6_8D%}99MRVN13)k}Cj;nBy?xs^#=O>y zSnLeyEm4|8q9easCneG%{pt>sBT7k<7BPj%`mvZ&L)0X@M5VC@UCFY|!ESUV+oT?Z zyeBMONgcY9u}W96UvwpVL{~D?73@w}os9XV=t^=YzEwGY;#(XM=cu9djp%V&R7FVI zBW>(KbMgkgvLOs(4cO)u#8f7SUX`(Dn<|so_;dAlUbP2S@l2n)@)2k6H03lgSLKnH z*taTb{&^0_Z7=Z8* z%F``TkAn!T~Dm^7%N_ZNciSM=3MF>V_8}%fz=!2y@d9k3495hzW4{hfm zJ3=_#8eZwNW5iT?Ann-FyAU6Sc(tuD4SjJ9x$s@GMpP#8rO3MGT=yPz0}C+{NwZz#HzV zSp|Awjd8LOGu6Tx#tSdDz%U;=l?~o653{-zlvl2!UnWzmqroDHF|T(I$e)K~`+%Hh zrKjsBJFz?DO=3HDFg8T!=Y~4xp3r>`|447gQ%@ro4CLIlW7U&$nYn%*_&#p5B*VZ^ zhy7eyhgR_o!AuzzKW!#Zd}bi$_8qIHn_2FVEF;ZUr_roEs>itFEVag~9gJH)WR&u> zi-ta-o#$a-mXBc}3Pj=Rcwf0_uJKOnyYGmO?Vm&uo|bY%pTaL9j!?Op$cr)`Q0rEy zT1n(V~W+L)o=vZ)&yj$0DwrhzS_u1XF@HSOZ+Hfu=xZcza=%f*8Jh>&~v+1f9il%)T)g~ z%y;0VR@8=Y4)NO&gj1_p$$bi;+^UlawfjKb0K2Gk2<8K_+>8!8yqy<&BFF}`#ES&>F(&P%w67Y-?{$vuT@P9*V*LGnS+0GHkpSzl zK)mk@H78<5?uN<>2{SJ#4&HRMhF@gM(b`8tbu3YG=<2HgSOp)%EHeoXZCD^ZWTvsA6*qVIV`XnZ*Annp>kiI zE0pW0oY}igb_RarXFbSk5BPNp?sN}!Hg1k5csj-MU%nLt%mSI@=8yc#?|*6nPndb< z`P28x#EqXyg_n6RSMZTT0DpgeS8s;#nR;_+z^l&+etAv-p@7Z;;{OB)-lm3fIRqKc zVEFwf{J$&H|H~jqeKHxme>$T0ker80;0xtIv}Ue9eN^$OE2r~3g?jWE1;M3o9$ZXI z>aRu4b5vG1T#NbMgxs;PRgWh{{8h`7rSLb_L$;?S&1nAZ<%{23FN&Xmoq=dkk zyA(r@ybx*}ek)i?w__17;x zeaA?Tl()dX9z8W?V2@5m?}*V0{rx%p@ApTw73&X|yX#9fh_0H4KpMQw+H`-rHocj4 zpUV(PEa0LCz6Lp)()r}jdhS+!!zr0K$SXYR``UxEXBqW1&<1Q1j6#Gw@TH>gXhKdq zr8d~h;fCVlDtI@{3Ge{jrmPkql{j>!_nIKsr}sb}2`mAY`J-qiIMsphI39M~*72^r z6ESgc2?!%ztSe4=&uYN}zUTmwDXq%Ezr@kmO-skcm$FV&efmW*MrRI&Z+4SE9q-|& z!nR49(=egsX2BUqSOnLsjpNajLGxkNWn$w6rzRAhMqP_$3m>}JKy>T1VaKqJ!*p)V zgOEGc$Yc@oU*EV|tR=p zf($6y7kuv$+9U1A$R<*xzgkrR`mPKLp_zN)B%h-5y1>7W2-~?>iY+AiJ1B)CkO@zm zB#a{P2apQqAQ_f?45@Gg4b?f+V@p1{pF@M(k~+7+tn=Ill4!=yeb@gZQkuN9wWOAk z(OL)%(RtNS*D8376o$r%Z!6-L@`DGmCp`Vi0~xTMwW=lPGu2=|AS{FVgkN-%eM2A~ zF_<|n8R>t+coqPjD-Fmu)!sdLe<=UWy=uAhoPmB=t>}Sf?Of40gtLtO37y^rZ($Bl z$ZlYc)kcm!WFiFnp0LXc+D5h}^_d1us2q-HFLtXBWr?E}thy1@#VwQt?Fl{J1&03} zcuOkn6*tKSTM9qHm_H)xD{aCEiTd?N#kaNoXqNs!Hi8ztD93srZJAS_4mxVrA8;c) z)Qb`^_0S(k0?Rc_Pm%qoKboo+dGrUy$8=)bvN>MlA?yz}3bBAe#I|`>%z?g`d^v(@ z=Nh$_#S|HvV=Tr{Te1*32VHx$E^r~&h!i$=PNHEvQredkjF*3IBW#9*tsf<42u zX`Lbm`!S0O*8zj@k5-iuhbD=u|8W;0@xH4kdD}~(ZQoVPPx()&ae6zKUK^Sb=NRF_ zsxZKRzK@~_vGalaOGgB9;%qBERp%4MUvB#f#VvY!ZD?0zt}W2z@MR)N)5`w|IEjz# z3h@yT&bPDUl?-WZ%5Y1GTYiEpZDNsZC5z;Lt!p^SCI4^?Io@0n`0UoFZV7blST?Hi zPk}eJz-MvG9Ob)~UmNK9k@lQO5(C}mwTe0dc=cAc58?bcY3MgrO{Vwoir@1Y&X1QA zq0jre;QLnFFI5t~TUw%;ZdFac-x~OAqwlu9rpE<78=;yW7wG!cvV=hQ$A0O^Xvr`= z@Lo@#`xE~?<-1l)Q0*`Ma$gJnJ16Ung49c496|IAG{^cWaOg{%(dn>mGQY6;6E?l>F!21uK6f>H#lB zgJS4{c&8-8G^TBd8PjsBCavy!wP`V#50AfSueB`F3olgPL_ed$t3~h==uTLch`i{H z@qC1HuW72Be@#=`L9ws3L`8WQ-k`HwYNH_CA0Q+8*ME==k^RWPr<7Q|{qmCeP|?EY zzQai$KtSZXdb7Q9nxlT&5W76LF<)`j$V68Su~k3I4%#NNB4jMs0BE_pCy6imyr$3> zF2p(f-w)^U(Gr$dERHH&AFsURostkD>(G5kp$AhM@}94xmWI3+04qNmP0{uy>As%# zQaJDVhP;>MqrmtIPK*GpNQ6Wt(R+tb`bCha&bEgIk35|edME`+4Hl~Pd97T8bcF8W z`8otn_oeC!4y=7BLoaE?#KEtdRgYXJ^K{`j#p zrldi<7}zg?7gwg03=RNF8*Q$!_n1y2D$_qMTOn4DBlvr|o$$MBo?)!>Xb?p?&V#F1_ zf!`R>cG%3d^e|h;G~SwlY~&)k?8t{h6ON0?*60a^Exv2Cs^O|Uwpt@1t*(Ry+&Wy3 zHLzuYrHm_;4VG!8q?Lc2A*~Nj?ojGhaIYv^Q_+jff3i>6+89%|Ud?t;_%hfv9|OM9 z_BJt$023(Z?%H!AIqMe<}Lc)u=p@{WI|*z{QtOg* zCFVFw58E$K%WKb;=h<1ys4&l1>eyz~u`fnPbDj>;(Ecs9gzZ#XZE9(SURrxY_#x5M zjzQV`LjKbD7o!vOmRN%_Wdfimua)9-XXYFh|GRLaJl~|YaI89D+ zb_Q0vAPs*WPyMYqPX%SYre0S(F$79+M1QTR*;Vidd&s+n+^Xo9iw=p4T6t3*OV zvvy4_u$X}j-HJtbnq1>1*Vq1Xp+Ylg}n0gW(2@~rhPnJi>ZrO@&R;EBbo9$7l< z_jbK>r-+m%vf5D8jPbtfyIKq0$`?daAjgYwpy=Q5IWWe1P?E%rhf2yMN!BPRCBD?) zQJVWw3X1f1dzV?#0KvWy+SLyQPQ;6TtVk({p)7n8h0drr&v>BHc;=vI7t{w1g^2*0 zgk0ek_GA3a#@-WU-#%>v_nCU?FPZp7!6%yBx1L34c7!D;_9`2t&Iiy{OD`;(R{k_K zwA~>fn0Y#;Kz2kQLvm+nuVpcsifYX9Vv#7SPn(MBe+h9;K}i04n(8Jr)kD!#H$?*j zT0u>Hy6thAAGjZwa76)64A9w<3}9pofDl2O<}Dnta2%kIKP9Lc=BBYNwA{X`eR zaKUy5h|9*=VQ<9f3BE+8Tjght)9TUk+3US^TE$GnYRoKjxxwTnFU3~MyJPj}2aAk& zbx0uECJ75VzccNky$glTj#GOUk$EsVr>>&fhUc- zLy#n32-3_4 zM8+!#YE1H4%hR+U$*b|-D)V}kJ_4z0fnnPxbb@n` z%vI=xe)==Smi&K2f!_Wz>D=ci&=@__udlU*`ZTt`0v@KuwjUq<&)3(c{nUhnde@Zk z&*g!rveWAsD>OJ{pgclxK|BL4kv|LNPl5cIB!4pGk834! zFS$BUTU0qGYxVt@{(mUcMlJ{P?u=N}0SJ2|FtLn=m);aE&k7LeI2L0Z;)+jzj*OM; zW90bZZ(oA^td=aiUfoeG8(Pt@|Hb~V{e1sxKHq=z%a`|`sK2WJ+c#XH|91}Re~~

0@XH~PP<$Ol`%VcNqyIDyS1Bd_85#X0<$y*R=6t(g)iJp(-2`{8l=uYyOr1&OdYiKd12jQ%T=KcX0!ri}ZR=#28bCyWrJe@W!y?jxc9Yz_y4n zFW=zmxd=K}p=^cu%}< z!rGb6oH+k{*1cAKjEY2ZRlZ9FpfOtsRP=6b$J+b#^ZZeSmzLks_6`Y)XxtemU2x3- zy8OE3I8_ICX7B4_@6uLF1a-gBSA+JmS}t)&n)dvgT7Hj~f6V!B(&&`qP})_W`H}}z zJ8wX>QGb~6iBo2-pcl+F@~YIr;&ntP)Z4SP!$oz3I5-aoc3!2eSxZdYWMI?Z@#xst zSXBG@Es;Nuiw;vA&Fme}?0l@ zS1!rt7`cMS=}B-qS;UA>!2+Kx8QQaTL@h!{uw(bCdvV5O0+RW2rR{#oAI^2<(1Kf{ zVHfzD)ClbP71_B0dup8AsrNA3;}r?h_7JP3@-WbWr?YZSR=SJkf0RC?E@89 zg|DM9rdQ0Ll~Ykwl3hJ!tbBxX2K{EOoI%?*P_xmnNrhjQ@arn9_LBUu@Q3WD03@H< zPr0(6fSz-}o~jAE`t}qOt!8UaU5_ZZJ9r|tr@k<7PelT|*i^4Lq7#RxJ=GgcxAs($ z_F4^VPDZOX)GPKOYCj>Vt6@L&4w3B?IAijlcve_RXJ!DteBd#MLIT|aYa`8D`+_Gx z6j|nDJmy)*e)(1)BK@DlsUXu-DGpcoUCS@uf5Z28O5$FLhgI{<0%@)-b+V@YPXv0| zRdVd%6*cXQNcQ(J7S)U5ps9HLs&p086ou6{Ub#eq!)_u?S`5 zkB&=hp3CZ`Y^VhQKzeJfbz!X)tdi&$n?;#nDA`{>g!{njoA#GV`eG%QQ@ylqPLe>G zi<#a}J8SolI*6`GTx1V(CJGLQ7<{b6(;h+!oI&!0Qnc#~ZN>ku2>53dKN z6YT=G;2J8D@rloVT%N21VaOe2g)sK5TCLYp#Yzhfc$WoLXwNEXzyeozM&e4Ab)ux= z#go4&7Vb!u-bu8F?T=R>mTkH+JMrScMGFQ=O{FJ+N>8^MrgP&h0HntNzyK*_w%2weBQh6C zvV<0b`i+l%CCIH>7BOh=<%)i^*Q8RmDYUm!h5PXxPtF$T?*v!z66-DJv>yx)-S1kY zt)AgQ^SUJR{@Q67p;e9xLote6RVT0f;f&xSze!O)M)fT$-L^ORBa>;p@_5?C;K@!E z=@i0?jqdQo9;NgR+iY*!Ap1)W3hf7Y=*g_9W@Iwu8M0RS&EnHG;F;EXnzN@J(xx2hU< zV3t^>|0M%VJM`3~wRGNtEN%mdtdbNiYvgeAleaKgD#Qu8PFj{%i6bLo+%nmaY84{( zY#YlLt0)6VKS8iShLtCaF!};L%+8onW0e(S$U#JK(v;6(DLP zwU4UU<)0XREMiC^Q?-n}KqEYQrR4G8Z{_Foca={NP4zhdcx>E7e=eyLoMWRg0nUEO#Pi4yCIMF@Klc04DJJ;nv- zp>6Fj?&@3%(K?rr^)7SvE_1YRC} zF=LjwCYMt!l^gE|1dW;WnX)l(uC?20JaJ0=h8C)(_sPTpWB(J0Mg|F1fb$jlyRG|Rwqc4(+iBl-$aYzlN(MJYjwe7t>n%~jI~nKo~j1^ z%A)nIz+HXnQwOqDvqj{on%mY;8-!Y}APMlnydvY&OR^M%a&$wJ{hV}YGU#bs?I{N9 zm&C+agUVI1xcbKt9S3!65>BeKFvM_MpY(BCipaIPVNp*>0`3^MCGHAW;xINq9KBhI zAF*a7h=jgNWTz|s?lGAJpSs|fvA))@2;9#DM z4luWg7SEN-^eX-+MFBq5A{)etL(Ru{#dC?z&kU32nnN2V&t;9oqJp5i%n~W;JWrL$ zl)~c9j>Fk3Jch!G=Q5jQ=u(ODzzqLHjSzxBr|n8nypk!J0FgZ0)~*>_6Br-Y!RWAdpqOm~c_^ zJu_l_*Ok~Zcrga2yhc`XKH;-25#}q2xOoG4G~s7f_VZ)Z?hu}AE`S#ipT(E`K=EaZ zXkYPVUs3_K<*Nj+&x|OFe}^zn)~@W-8!KvL9^o;x3VE%)?Oy&^F~lcX+cZVCsmYjK zP@7UI&S=iO{uATJToo4-m!>$fdYCdeGMD1WxRi$&n9UiV zYS{iDdtUgkME1N0F4*(%*3dR>HGK8Mqz@dvsWN

9ciAsHC!%b3Go@68;W7QgOkA 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 z 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 literal 395264 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%0A!1&0MW^z%@y54E%*u#XnRxDxP1x6-oc~WBy*QA` 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 JcaJpi{{RmiD-Hkv From fb590e6516f313ea729616c225e2f2a3f65f392a Mon Sep 17 00:00:00 2001 From: Johannes Rieken Date: Wed, 25 Apr 2018 16:37:21 +0200 Subject: [PATCH 066/830] have a FileType and make readDirectory slimmer, #48527 --- src/vs/platform/files/common/files.ts | 20 +++++----- src/vs/vscode.d.ts | 38 ++++++++++++++----- .../electron-browser/mainThreadFileSystem.ts | 4 +- src/vs/workbench/api/node/extHost.api.impl.ts | 2 + src/vs/workbench/api/node/extHost.protocol.ts | 4 +- .../workbench/api/node/extHostFileSystem.ts | 26 ++++++------- .../electron-browser/remoteFileService.ts | 23 ++++++++--- 7 files changed, 73 insertions(+), 44 deletions(-) diff --git a/src/vs/platform/files/common/files.ts b/src/vs/platform/files/common/files.ts index a43f44887f5..2eaafd63aa9 100644 --- a/src/vs/platform/files/common/files.ts +++ b/src/vs/platform/files/common/files.ts @@ -155,12 +155,6 @@ export interface IFileService { dispose(): void; } -export enum FileType2 { - File = 1, - Directory = 2, - SymbolicLink = 4, -} - export interface FileOptions { /** * Create a file when it doesn't exists. @@ -184,11 +178,17 @@ export interface FileOptions { write?: boolean; } +export enum FileType { + Unknown = 0, + File = 1, + Directory = 2, + SymbolicLink = 64 +} + export interface IStat { - isFile?: boolean; - isDirectory?: boolean; - isSymbolicLink?: boolean; + type: FileType; mtime: number; + ctime: number; size: number; } @@ -214,7 +214,7 @@ export interface IFileSystemProvider { stat(resource: URI): TPromise; mkdir(resource: URI): TPromise; - readdir(resource: URI): TPromise<[string, IStat][]>; + readdir(resource: URI): TPromise<[string, FileType][]>; delete(resource: URI): TPromise; rename(from: URI, to: URI, opts: FileOptions): TPromise; diff --git a/src/vs/vscode.d.ts b/src/vs/vscode.d.ts index efe3eb07a9b..9a89f22ec55 100644 --- a/src/vs/vscode.d.ts +++ b/src/vs/vscode.d.ts @@ -4823,24 +4823,42 @@ declare module 'vscode' { resolveTask(task: Task, token?: CancellationToken): ProviderResult; } + /** + * Enumeration of file types. + */ + 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 file is a regular file. + * The type of the file, e.g. is a regular file, a directory, or symbolic link + * to a file. */ - isFile?: boolean; + type: FileType; /** - * The file is a directory. + * The creation timestamp in milliseconds. */ - isDirectory?: boolean; - - /** - * The file is symbolic link to another file. - */ - isSymbolicLink?: boolean; + ctime: number; /** * The modification timestamp in milliseconds. @@ -5001,7 +5019,7 @@ declare module 'vscode' { * @param token A cancellation token. * @return A thenable that resolves to an array of tuples of file names and files stats. */ - readDirectory(uri: Uri, options: { /*future: onlyType?*/ }, token: CancellationToken): [string, FileStat][] | Thenable<[string, FileStat][]>; + readDirectory(uri: Uri, options: { /*future: onlyType?*/ }, token: CancellationToken): [string, FileType][] | Thenable<[string, FileType][]>; /** * Create a new directory. *Note* that new files are created via `write`-calls. diff --git a/src/vs/workbench/api/electron-browser/mainThreadFileSystem.ts b/src/vs/workbench/api/electron-browser/mainThreadFileSystem.ts index 2f632a363e8..39e5599f3c0 100644 --- a/src/vs/workbench/api/electron-browser/mainThreadFileSystem.ts +++ b/src/vs/workbench/api/electron-browser/mainThreadFileSystem.ts @@ -8,7 +8,7 @@ import { Emitter, Event } from 'vs/base/common/event'; import { IDisposable, dispose } from 'vs/base/common/lifecycle'; import URI from 'vs/base/common/uri'; import { TPromise } from 'vs/base/common/winjs.base'; -import { FileOptions, FileSystemProviderCapabilities, IFileChange, IFileService, IFileSystemProvider, IStat, IWatchOptions } from 'vs/platform/files/common/files'; +import { FileOptions, FileSystemProviderCapabilities, IFileChange, IFileService, IFileSystemProvider, IStat, IWatchOptions, FileType } from 'vs/platform/files/common/files'; import { extHostNamedCustomer } from 'vs/workbench/api/electron-browser/extHostCustomers'; import { ExtHostContext, ExtHostFileSystemShape, IExtHostContext, IFileChangeDto, MainContext, MainThreadFileSystemShape } from '../node/extHost.protocol'; @@ -115,7 +115,7 @@ class RemoteFileSystemProvider implements IFileSystemProvider { return this._proxy.$mkdir(this._handle, resource); } - readdir(resource: URI): TPromise<[string, IStat][], any> { + readdir(resource: URI): TPromise<[string, FileType][], any> { return this._proxy.$readdir(this._handle, resource); } diff --git a/src/vs/workbench/api/node/extHost.api.impl.ts b/src/vs/workbench/api/node/extHost.api.impl.ts index ee6e7186c07..1599bef1be7 100644 --- a/src/vs/workbench/api/node/extHost.api.impl.ts +++ b/src/vs/workbench/api/node/extHost.api.impl.ts @@ -45,6 +45,7 @@ import { TPromise } from 'vs/base/common/winjs.base'; import { CancellationTokenSource } from 'vs/base/common/cancellation'; import * as vscode from 'vscode'; import * as paths from 'vs/base/common/paths'; +import * as files from 'vs/platform/files/common/files'; import { MainContext, ExtHostContext, IInitData, IExtHostContext } from './extHost.protocol'; import * as languageConfiguration from 'vs/editor/common/modes/languageConfiguration'; import { TextEditorCursorStyle } from 'vs/editor/common/config/editorOptions'; @@ -700,6 +701,7 @@ export function createApiFactory( DeprecatedFileChangeType: extHostTypes.DeprecatedFileChangeType, DeprecatedFileType: extHostTypes.DeprecatedFileType, FileChangeType: extHostTypes.FileChangeType, + FileType: files.FileType, FileSystemError: extHostTypes.FileSystemError, FoldingRange: extHostTypes.FoldingRange, FoldingRangeKind: extHostTypes.FoldingRangeKind diff --git a/src/vs/workbench/api/node/extHost.protocol.ts b/src/vs/workbench/api/node/extHost.protocol.ts index dc7aba45b18..dd0d72b1ba0 100644 --- a/src/vs/workbench/api/node/extHost.protocol.ts +++ b/src/vs/workbench/api/node/extHost.protocol.ts @@ -42,7 +42,7 @@ import { ITreeItem } from 'vs/workbench/common/views'; import { ThemeColor } from 'vs/platform/theme/common/themeService'; import { IDisposable } from 'vs/base/common/lifecycle'; import { SerializedError } from 'vs/base/common/errors'; -import { IStat, FileChangeType, IWatchOptions, FileSystemProviderCapabilities, FileOptions } from 'vs/platform/files/common/files'; +import { IStat, FileChangeType, IWatchOptions, FileSystemProviderCapabilities, FileOptions, FileType } from 'vs/platform/files/common/files'; import { ConfigurationScope } from 'vs/platform/configuration/common/configurationRegistry'; import { CommentRule, CharacterPair, EnterAction } from 'vs/editor/common/modes/languageConfiguration'; import { ISingleEditOperation } from 'vs/editor/common/model'; @@ -582,12 +582,12 @@ export interface ExtHostWorkspaceShape { export interface ExtHostFileSystemShape { $stat(handle: number, resource: UriComponents): TPromise; + $readdir(handle: number, resource: UriComponents): TPromise<[string, FileType][]>; $readFile(handle: number, resource: UriComponents, opts: FileOptions): TPromise; $writeFile(handle: number, resource: UriComponents, base64Encoded: string, opts: FileOptions): TPromise; $rename(handle: number, resource: UriComponents, target: UriComponents, opts: FileOptions): TPromise; $copy(handle: number, resource: UriComponents, target: UriComponents, opts: FileOptions): TPromise; $mkdir(handle: number, resource: UriComponents): TPromise; - $readdir(handle: number, resource: UriComponents): TPromise<[string, IStat][]>; $delete(handle: number, resource: UriComponents): TPromise; $watch(handle: number, session: number, resource: UriComponents, opts: IWatchOptions): void; $unwatch(handle: number, session: number): void; diff --git a/src/vs/workbench/api/node/extHostFileSystem.ts b/src/vs/workbench/api/node/extHostFileSystem.ts index fbf7724536a..330628c339b 100644 --- a/src/vs/workbench/api/node/extHostFileSystem.ts +++ b/src/vs/workbench/api/node/extHostFileSystem.ts @@ -81,31 +81,29 @@ class FileSystemProviderShim implements vscode.FileSystemProvider { rename(oldUri: vscode.Uri, newUri: vscode.Uri): Thenable { return this._delegate.move(oldUri, newUri).then(stat => FileSystemProviderShim._modernizeFileStat(stat)); } - readDirectory(resource: vscode.Uri): Thenable<[string, vscode.FileStat][]> { + readDirectory(resource: vscode.Uri): Thenable<[string, vscode.FileType][]> { return this._delegate.readdir(resource).then(tuples => { - return tuples.map(tuple => <[string, vscode.FileStat]>[path.posix.basename(tuple[0].path), FileSystemProviderShim._modernizeFileStat(tuple[1])]); + return tuples.map(tuple => <[string, vscode.FileType]>[path.posix.basename(tuple[0].path), FileSystemProviderShim._modernizeFileStat(tuple[1]).type]); }); } private static _modernizeFileStat(stat: vscode.DeprecatedFileStat): vscode.FileStat { let { mtime, size, type } = stat; - let isFile = false; - let isDirectory = false; - let isSymbolicLink = false; + let newType: files.FileType; // no support for bitmask, effectively no support for symlinks switch (type) { case DeprecatedFileType.Dir: - isDirectory = true; + newType = files.FileType.Directory; break; case DeprecatedFileType.File: - isFile = true; + newType = files.FileType.File; break; case DeprecatedFileType.Symlink: - isSymbolicLink = true; + newType = files.FileType.File & files.FileType.SymbolicLink; break; } - return { mtime, size, isFile, isDirectory, isSymbolicLink }; + return { type: newType, ctime: 0, mtime, size }; } private static _modernizeFileChange(e: vscode.DeprecatedFileChange): vscode.FileChangeEvent { @@ -246,18 +244,16 @@ export class ExtHostFileSystem implements ExtHostFileSystemShape { } private static _asIStat(stat: vscode.FileStat): files.IStat { - const { isFile, isDirectory, isSymbolicLink, mtime, size } = stat; - return { isFile, isDirectory, isSymbolicLink, mtime, size }; + const { type, ctime, mtime, size } = stat; + return { type, ctime, mtime, size }; } $stat(handle: number, resource: UriComponents): TPromise { return asWinJsPromise(token => this._fsProvider.get(handle).stat(URI.revive(resource), {}, token)).then(ExtHostFileSystem._asIStat); } - $readdir(handle: number, resource: UriComponents): TPromise<[string, files.IStat][], any> { - return asWinJsPromise(token => this._fsProvider.get(handle).readDirectory(URI.revive(resource), {}, token)).then(tuples => { - return tuples.map(([name, stat]) => <[string, files.IStat]>[name, ExtHostFileSystem._asIStat(stat)]); - }); + $readdir(handle: number, resource: UriComponents): TPromise<[string, files.FileType][], any> { + return asWinJsPromise(token => this._fsProvider.get(handle).readDirectory(URI.revive(resource), {}, token)); } $readFile(handle: number, resource: UriComponents, opts: files.FileOptions): TPromise { diff --git a/src/vs/workbench/services/files/electron-browser/remoteFileService.ts b/src/vs/workbench/services/files/electron-browser/remoteFileService.ts index 0d898666576..530188a07a4 100644 --- a/src/vs/workbench/services/files/electron-browser/remoteFileService.ts +++ b/src/vs/workbench/services/files/electron-browser/remoteFileService.ts @@ -16,7 +16,7 @@ import { ITextResourceConfigurationService } from 'vs/editor/common/services/res import { localize } from 'vs/nls'; import { IConfigurationService } from 'vs/platform/configuration/common/configuration'; import { IEnvironmentService } from 'vs/platform/environment/common/environment'; -import { FileChangesEvent, FileOperation, FileOperationError, FileOperationEvent, FileOperationResult, FileOptions, FileSystemProviderCapabilities, IContent, ICreateFileOptions, IFileStat, IFileSystemProvider, IFilesConfiguration, IResolveContentOptions, IResolveFileOptions, IResolveFileResult, IStat, IStreamContent, ITextSnapshot, IUpdateContentOptions, StringSnapshot, IWatchOptions } from 'vs/platform/files/common/files'; +import { FileChangesEvent, FileOperation, FileOperationError, FileOperationEvent, FileOperationResult, FileOptions, FileSystemProviderCapabilities, IContent, ICreateFileOptions, IFileStat, IFileSystemProvider, IFilesConfiguration, IResolveContentOptions, IResolveFileOptions, IResolveFileResult, IStat, IStreamContent, ITextSnapshot, IUpdateContentOptions, StringSnapshot, IWatchOptions, FileType } from 'vs/platform/files/common/files'; import { ILifecycleService } from 'vs/platform/lifecycle/common/lifecycle'; import { INotificationService } from 'vs/platform/notification/common/notification'; import { IStorageService } from 'vs/platform/storage/common/storage'; @@ -25,13 +25,26 @@ import { IExtensionService } from 'vs/workbench/services/extensions/common/exten import { FileService } from 'vs/workbench/services/files/electron-browser/fileService'; import { createReadableOfProvider, createReadableOfSnapshot, createWritableOfProvider } from 'vs/workbench/services/files/electron-browser/streams'; +class TypeOnlyStat implements IStat { + + constructor(readonly type: FileType) { + // + } + + // todo@remote -> make a getter and warn when + // being used in development. + mtime: number = 0; + ctime: number = 0; + size: number = 0; +} + function toIFileStat(provider: IFileSystemProvider, tuple: [URI, IStat], recurse?: (tuple: [URI, IStat]) => boolean): TPromise { const [resource, stat] = tuple; const fileStat: IFileStat = { resource, name: posix.basename(resource.path), - isDirectory: stat.isDirectory, - isSymbolicLink: stat.isSymbolicLink, + isDirectory: (stat.type & FileType.Directory) !== 0, + isSymbolicLink: (stat.type & FileType.SymbolicLink) !== 0, mtime: stat.mtime, size: stat.size, etag: stat.mtime.toString(29) + stat.size.toString(31), @@ -43,9 +56,9 @@ function toIFileStat(provider: IFileSystemProvider, tuple: [URI, IStat], recurse return provider.readdir(resource).then(entries => { // resolve children if requested return TPromise.join(entries.map(tuple => { - const [name, stat] = tuple; + const [name, type] = tuple; const childResource = resource.with({ path: posix.join(resource.path, name) }); - return toIFileStat(provider, [childResource, stat], recurse); + return toIFileStat(provider, [childResource, new TypeOnlyStat(type)], recurse); })).then(children => { fileStat.children = children; return fileStat; From 6dfd02e0892bf2833fdd19a6cf6839d28e827b23 Mon Sep 17 00:00:00 2001 From: Andre Weinand Date: Wed, 25 Apr 2018 17:03:02 +0200 Subject: [PATCH 067/830] make sure that 'runInTerminal' request returns a 'body'; fixes #48680 --- src/vs/workbench/parts/debug/electron-browser/rawDebugSession.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/src/vs/workbench/parts/debug/electron-browser/rawDebugSession.ts b/src/vs/workbench/parts/debug/electron-browser/rawDebugSession.ts index dd96720d946..1a78245b64d 100644 --- a/src/vs/workbench/parts/debug/electron-browser/rawDebugSession.ts +++ b/src/vs/workbench/parts/debug/electron-browser/rawDebugSession.ts @@ -469,6 +469,7 @@ export class RawDebugSession implements debug.ISession { if (request.command === 'runInTerminal') { this._debugger.runInTerminal(request.arguments).then(_ => { + response.body = {}; this.debugAdapter.sendResponse(response); }, err => { response.success = false; From 7973d15abae0acfca6712b55cb80e3469b1c4dd6 Mon Sep 17 00:00:00 2001 From: Sandeep Somavarapu Date: Wed, 25 Apr 2018 19:06:52 +0200 Subject: [PATCH 068/830] #43645 Out of the box test view container --- src/vs/workbench/api/browser/media/test.svg | 10 ++++++++++ .../browser/viewsContainersExtensionPoint.ts | 18 ++++++++++++++---- 2 files changed, 24 insertions(+), 4 deletions(-) create mode 100644 src/vs/workbench/api/browser/media/test.svg diff --git a/src/vs/workbench/api/browser/media/test.svg b/src/vs/workbench/api/browser/media/test.svg new file mode 100644 index 00000000000..57cd408942d --- /dev/null +++ b/src/vs/workbench/api/browser/media/test.svg @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/src/vs/workbench/api/browser/viewsContainersExtensionPoint.ts b/src/vs/workbench/api/browser/viewsContainersExtensionPoint.ts index 5a220bc3886..36f215340ca 100644 --- a/src/vs/workbench/api/browser/viewsContainersExtensionPoint.ts +++ b/src/vs/workbench/api/browser/viewsContainersExtensionPoint.ts @@ -50,7 +50,7 @@ const viewsContainerSchema: IJSONSchema = { type: 'string' }, icon: { - description: localize('vscode.extension.contributes.views.containers.icon', 'Path to the container icon'), + description: localize('vscode.extension.contributes.views.containers.icon', "Path to the container icon. Icons are 24x24 centered on a 50x40 square and have a fill color of 'rgb(215, 218, 224)' or '#d7dae0'. It is recommended that icons be in SVG, though any image file type is accepted."), type: 'string' } } @@ -70,14 +70,24 @@ export const viewsContainersContribution: IJSONSchema = { export const viewsContainersExtensionPoint: IExtensionPoint<{ [loc: string]: IUserFriendlyViewsContainerDescriptor[] }> = ExtensionsRegistry.registerExtensionPoint<{ [loc: string]: IUserFriendlyViewsContainerDescriptor[] }>('viewsContainers', [], viewsContainersContribution); -const CUSTOM_VIEW_CONTAINER_ORDER = 5; +const TEST_VIEW_CONTAINER_ORDER = 6; class ViewsContainersExtensionHandler implements IWorkbenchContribution { constructor() { + this.registerTestViewContainer(); this.handleAndRegisterCustomViewContainers(); } + private registerTestViewContainer(): void { + const id = 'test'; + const title = localize('test', "Test"); + const cssClass = `extensionViewlet-${id}`; + const icon = require.toUrl('./media/test.svg'); + + this.registerCustomViewlet({ id, title, icon }, TEST_VIEW_CONTAINER_ORDER, cssClass); + } + private handleAndRegisterCustomViewContainers() { viewsContainersExtensionPoint.setHandler((extensions) => { for (let extension of extensions) { @@ -132,7 +142,7 @@ class ViewsContainersExtensionHandler implements IWorkbenchContribution { containers.forEach((descriptor, index) => { const cssClass = `extensionViewlet-${descriptor.id}`; const icon = join(extension.extensionFolderPath, descriptor.icon); - this.registerCustomViewlet({ id: descriptor.id, title: descriptor.title, icon }, CUSTOM_VIEW_CONTAINER_ORDER + index + 1, cssClass); + this.registerCustomViewlet({ id: descriptor.id, title: descriptor.title, icon }, TEST_VIEW_CONTAINER_ORDER + index + 1, cssClass); }); } @@ -186,7 +196,7 @@ class ViewsContainersExtensionHandler implements IWorkbenchContribution { // Generate CSS to show the icon in the activity bar const iconClass = `.monaco-workbench > .activitybar .monaco-action-bar .action-label.${cssClass}`; - createCSSRule(iconClass, `-webkit-mask: url('${descriptor.icon}') no-repeat 50% 50%;`); + createCSSRule(iconClass, `-webkit-mask: url('${descriptor.icon}') no-repeat 50% 50%`); } } From d176b34859f804c16cbb9517a3896ac1edb1432b Mon Sep 17 00:00:00 2001 From: Sandeep Somavarapu Date: Wed, 25 Apr 2018 19:15:34 +0200 Subject: [PATCH 069/830] #43645 Update views schema to show 'test' location --- src/vs/workbench/api/browser/viewsExtensionPoint.ts | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/vs/workbench/api/browser/viewsExtensionPoint.ts b/src/vs/workbench/api/browser/viewsExtensionPoint.ts index f52c1e7dad5..d6984d5c4db 100644 --- a/src/vs/workbench/api/browser/viewsExtensionPoint.ts +++ b/src/vs/workbench/api/browser/viewsExtensionPoint.ts @@ -85,6 +85,12 @@ namespace schema { type: 'array', items: viewDescriptor, default: [] + }, + 'test': { + description: localize('views.test', "Contributes views to Test container in the Activity bar"), + type: 'array', + items: viewDescriptor, + default: [] } }, additionalProperties: { From cd677683921ab7238d7ef4c4792e5ab4451987cb Mon Sep 17 00:00:00 2001 From: Rachel Macfarlane Date: Wed, 25 Apr 2018 10:27:13 -0700 Subject: [PATCH 070/830] Left align 'Name' label in process explorer, fixes #48500 --- .../processExplorer/media/processExplorer.css | 6 +++++- .../electron-browser/processExplorer/processExplorerMain.ts | 2 +- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/src/vs/code/electron-browser/processExplorer/media/processExplorer.css b/src/vs/code/electron-browser/processExplorer/media/processExplorer.css index 6f38b441592..90498bdb122 100644 --- a/src/vs/code/electron-browser/processExplorer/media/processExplorer.css +++ b/src/vs/code/electron-browser/processExplorer/media/processExplorer.css @@ -43,7 +43,6 @@ th { border-bottom: 1px solid #cccccc; padding: .5rem; border-top: 1px solid #cccccc; - text-align: center; } td { padding: .25rem; @@ -54,8 +53,13 @@ td { text-align: center; } +.nameLabel{ + text-align: left; +} + .data { white-space: pre; + padding-left: .5rem; } tbody > tr:hover { diff --git a/src/vs/code/electron-browser/processExplorer/processExplorerMain.ts b/src/vs/code/electron-browser/processExplorer/processExplorerMain.ts index 605f48afab8..17a77b37b0f 100644 --- a/src/vs/code/electron-browser/processExplorer/processExplorerMain.ts +++ b/src/vs/code/electron-browser/processExplorer/processExplorerMain.ts @@ -75,7 +75,7 @@ function updateProcessInfo(processList): void { ${localize('cpu', "CPU %")} ${localize('memory', "Memory (MB)")} ${localize('pid', "pid")} - ${localize('name', "Name")} + ${localize('name', "Name")} `; processList.forEach(p => { From 5ded9d963a27370509f2b39a8307197895bdaf41 Mon Sep 17 00:00:00 2001 From: Joao Moreno Date: Wed, 25 Apr 2018 19:31:05 +0200 Subject: [PATCH 071/830] cleanup git clone error fixes #48486 --- extensions/git/src/git.ts | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/extensions/git/src/git.ts b/extensions/git/src/git.ts index 6f016d085f1..77101cf8347 100644 --- a/extensions/git/src/git.ts +++ b/extensions/git/src/git.ts @@ -392,7 +392,18 @@ export class Git { const folderPath = path.join(parentPath, folderName); await mkdirp(parentPath); - await this.exec(parentPath, ['clone', url, folderPath], { cancellationToken }); + + try { + await this.exec(parentPath, ['clone', url, folderPath], { cancellationToken }); + } catch (err) { + if (err.stderr) { + err.stderr = err.stderr.replace(/^Cloning.+$/m, '').trim(); + err.stderr = err.stderr.replace(/^ERROR:\s+/, '').trim(); + } + + throw err; + } + return folderPath; } From bad8d9214b6b53858d5754918fbf26eeee7918b4 Mon Sep 17 00:00:00 2001 From: Daniel Ye Date: Wed, 25 Apr 2018 11:52:20 -0700 Subject: [PATCH 072/830] 2018-04-25. Merged in translations from Transifex. --- i18n/chs/extensions/npm/out/npmView.i18n.json | 11 +++++++++ i18n/chs/extensions/npm/out/tasks.i18n.json | 10 ++++++++ i18n/chs/extensions/npm/package.i18n.json | 10 +++++++- i18n/chs/src/vs/base/node/processes.i18n.json | 3 ++- .../src/vs/code/electron-main/menus.i18n.json | 3 ++- .../browser/widget/diffReview.i18n.json | 4 ++++ .../config/commonEditorConfig.i18n.json | 13 ++++++---- .../common/view/editorColorRegistry.i18n.json | 1 + .../codeAction/codeActionCommands.i18n.json | 3 ++- .../contrib/format/formatActions.i18n.json | 4 +++- .../message/messageController.i18n.json | 3 ++- .../referencesWidget.i18n.json | 3 ++- .../platform/environment/node/argv.i18n.json | 4 +++- .../node/extensionManagementService.i18n.json | 2 ++ .../theme/common/colorRegistry.i18n.json | 5 +--- .../inactiveExtensionUrlHandler.i18n.json | 9 +++++++ .../viewsContainersExtensionPoint.i18n.json | 7 ++++++ .../api/browser/viewsExtensionPoint.i18n.json | 6 +++-- .../mainThreadSaveParticipant.i18n.json | 1 + .../parts/quickinput/quickInput.i18n.json | 2 ++ .../inspectKeybindings.i18n.json | 2 +- .../debug/browser/breakpointsView.i18n.json | 3 +++ .../debug/browser/debugActions.i18n.json | 1 + .../breakpointWidget.i18n.json | 2 +- .../debug.contribution.i18n.json | 3 +-- .../debugEditorContribution.i18n.json | 10 ++++++++ .../browser/extensionsActions.i18n.json | 2 +- .../browser/editors/textFileEditor.i18n.json | 2 +- .../electron-browser/fileActions.i18n.json | 19 ++++++++++----- .../views/explorerViewer.i18n.json | 3 +++ .../localizations.contribution.i18n.json | 23 ++++++++++++++++++ .../localizationsActions.i18n.json | 14 +++++++++++ .../electron-browser/messages.i18n.json | 2 +- .../parts/search/browser/searchView.i18n.json | 4 ++-- .../terminalInstance.i18n.json | 3 ++- .../url.contribution.i18n.json | 11 +++++++++ .../vs_code_welcome_page.i18n.json | 2 +- .../electron-browser/welcomePage.i18n.json | 4 ++-- .../node/variableResolver.i18n.json | 20 ++++++++++++++++ .../remoteFileService.i18n.json | 3 ++- i18n/cht/extensions/npm/out/npmView.i18n.json | 9 +++++++ i18n/cht/extensions/npm/out/tasks.i18n.json | 10 ++++++++ i18n/cht/extensions/npm/package.i18n.json | 5 +++- .../issue/issueReporterMain.i18n.json | 1 + .../issue/issueReporterPage.i18n.json | 2 ++ .../processExplorerMain.i18n.json | 3 +++ .../src/vs/code/electron-main/menus.i18n.json | 1 + .../config/commonEditorConfig.i18n.json | 6 +---- .../codeAction/codeActionCommands.i18n.json | 6 +++++ .../contrib/find/findController.i18n.json | 1 + .../contrib/format/formatActions.i18n.json | 4 +++- .../message/messageController.i18n.json | 3 ++- .../platform/environment/node/argv.i18n.json | 1 - .../theme/common/colorRegistry.i18n.json | 4 ---- .../inactiveExtensionUrlHandler.i18n.json | 9 +++++++ .../api/browser/viewsExtensionPoint.i18n.json | 2 -- .../mainThreadWebview.i18n.json | 3 ++- .../parts/editor/editorStatus.i18n.json | 1 + .../parts/editor/resourceViewer.i18n.json | 1 + .../parts/quickinput/quickInput.i18n.json | 3 +++ .../parts/quickinput/quickInputBox.i18n.json | 3 ++- .../electron-browser/actions.i18n.json | 1 + .../extensionsViewlet.i18n.json | 1 + .../electron-browser/fileActions.i18n.json | 12 +++++----- .../localizations.contribution.i18n.json | 23 ++++++++++++++++++ .../localizationsActions.i18n.json | 14 +++++++++++ .../electron-browser/markersPanel.i18n.json | 4 +++- .../electron-browser/messages.i18n.json | 3 +++ .../search.contribution.i18n.json | 4 +++- .../task.contribution.i18n.json | 2 ++ .../terminalActions.i18n.json | 1 + .../update/electron-browser/update.i18n.json | 2 ++ .../url.contribution.i18n.json | 10 ++++++++ .../overlay/browser/welcomeOverlay.i18n.json | 1 + .../vs_code_welcome_page.i18n.json | 2 ++ .../configurationExtensionPoint.i18n.json | 1 + .../configurationEditingService.i18n.json | 1 + .../node/configurationService.i18n.json | 1 + .../node/variableResolver.i18n.json | 9 +++++++ .../common/extensionsRegistry.i18n.json | 4 ++++ .../extensionService.i18n.json | 2 ++ .../electron-browser/fileService.i18n.json | 1 + i18n/deu/extensions/npm/out/npmView.i18n.json | 9 +++++++ i18n/deu/extensions/npm/out/tasks.i18n.json | 10 ++++++++ i18n/deu/extensions/npm/package.i18n.json | 5 +++- .../config/commonEditorConfig.i18n.json | 10 ++++---- .../common/view/editorColorRegistry.i18n.json | 1 + .../codeAction/codeActionCommands.i18n.json | 5 ++++ .../contrib/format/formatActions.i18n.json | 4 +++- .../vs/editor/contrib/links/links.i18n.json | 2 ++ .../platform/environment/node/argv.i18n.json | 1 - .../node/extensionValidator.i18n.json | 1 + .../electron-main/issueService.i18n.json | 3 ++- .../theme/common/colorRegistry.i18n.json | 4 ---- .../inactiveExtensionUrlHandler.i18n.json | 9 +++++++ .../electron-main/windowsService.i18n.json | 2 +- .../api/browser/viewsExtensionPoint.i18n.json | 2 -- .../parts/quickinput/quickInput.i18n.json | 2 ++ .../electron-browser/fileActions.i18n.json | 12 +++++----- .../localizations.contribution.i18n.json | 23 ++++++++++++++++++ .../localizationsActions.i18n.json | 14 +++++++++++ .../url.contribution.i18n.json | 10 ++++++++ .../node/variableResolver.i18n.json | 9 +++++++ i18n/esn/extensions/npm/out/npmView.i18n.json | 9 +++++++ i18n/esn/extensions/npm/out/tasks.i18n.json | 10 ++++++++ i18n/esn/extensions/npm/package.i18n.json | 5 +++- .../package.i18n.json | 3 ++- i18n/esn/src/vs/base/node/processes.i18n.json | 3 ++- .../browser/widget/diffReview.i18n.json | 4 ++++ .../config/commonEditorConfig.i18n.json | 6 +---- .../common/view/editorColorRegistry.i18n.json | 1 + .../codeAction/codeActionCommands.i18n.json | 3 ++- .../referencesWidget.i18n.json | 3 ++- .../platform/environment/node/argv.i18n.json | 3 ++- .../theme/common/colorRegistry.i18n.json | 4 ---- .../inactiveExtensionUrlHandler.i18n.json | 9 +++++++ .../viewsContainersExtensionPoint.i18n.json | 6 +++++ .../api/browser/viewsExtensionPoint.i18n.json | 3 +-- .../parts/quickinput/quickInput.i18n.json | 2 ++ .../debug/browser/breakpointsView.i18n.json | 3 +++ .../debug/browser/debugActions.i18n.json | 1 + .../breakpointWidget.i18n.json | 1 + .../debugConfigurationManager.i18n.json | 1 + .../debugEditorContribution.i18n.json | 9 +++++++ .../extensionEditor.i18n.json | 1 + .../electron-browser/fileActions.i18n.json | 16 ++++++++----- .../files.contribution.i18n.json | 1 + .../views/explorerViewer.i18n.json | 3 +++ .../localizations.contribution.i18n.json | 23 ++++++++++++++++++ .../localizationsActions.i18n.json | 14 +++++++++++ .../electron-browser/markersPanel.i18n.json | 4 +++- .../markersPanelActions.i18n.json | 3 ++- .../electron-browser/messages.i18n.json | 2 ++ .../task.contribution.i18n.json | 2 ++ .../terminalInstance.i18n.json | 3 ++- .../url.contribution.i18n.json | 11 +++++++++ .../vs_code_welcome_page.i18n.json | 1 + .../node/variableResolver.i18n.json | 15 ++++++++++++ .../electron-browser/fileService.i18n.json | 1 + .../remoteFileService.i18n.json | 3 ++- i18n/fra/extensions/npm/out/npmView.i18n.json | 9 +++++++ i18n/fra/extensions/npm/out/tasks.i18n.json | 10 ++++++++ i18n/fra/extensions/npm/package.i18n.json | 5 +++- i18n/fra/src/vs/base/node/processes.i18n.json | 3 ++- i18n/fra/src/vs/base/node/zip.i18n.json | 1 + .../src/vs/code/electron-main/menus.i18n.json | 1 + .../browser/widget/diffReview.i18n.json | 4 ++++ .../editor/common/commonCodeEditor.i18n.json | 3 ++- .../config/commonEditorConfig.i18n.json | 13 ++++++---- .../common/view/editorColorRegistry.i18n.json | 1 + .../codeAction/codeActionCommands.i18n.json | 3 ++- .../contrib/find/findController.i18n.json | 1 + .../contrib/format/formatActions.i18n.json | 4 +++- .../message/messageController.i18n.json | 3 ++- .../referencesWidget.i18n.json | 3 ++- .../platform/environment/node/argv.i18n.json | 4 +++- .../node/extensionManagementService.i18n.json | 2 ++ .../theme/common/colorRegistry.i18n.json | 4 ---- .../inactiveExtensionUrlHandler.i18n.json | 9 +++++++ .../viewsContainersExtensionPoint.i18n.json | 6 +++++ .../api/browser/viewsExtensionPoint.i18n.json | 6 +++-- .../parts/quickinput/quickInput.i18n.json | 2 ++ .../debug/browser/breakpointsView.i18n.json | 3 +++ .../debug/browser/debugActions.i18n.json | 1 + .../debug.contribution.i18n.json | 3 +-- .../debugEditorContribution.i18n.json | 9 +++++++ .../electron-browser/fileActions.i18n.json | 15 +++++++----- .../views/explorerViewer.i18n.json | 3 +++ .../localizations.contribution.i18n.json | 23 ++++++++++++++++++ .../localizationsActions.i18n.json | 14 +++++++++++ .../electron-browser/messages.i18n.json | 2 +- .../terminalInstance.i18n.json | 3 ++- .../url.contribution.i18n.json | 11 +++++++++ .../node/variableResolver.i18n.json | 19 +++++++++++++++ .../remoteFileService.i18n.json | 3 ++- i18n/hun/extensions/npm/out/npmView.i18n.json | 9 +++++++ i18n/hun/extensions/npm/out/tasks.i18n.json | 10 ++++++++ i18n/hun/extensions/npm/package.i18n.json | 6 ++++- .../findinput/findInputCheckboxes.i18n.json | 2 +- .../src/vs/base/common/errorMessage.i18n.json | 2 +- .../base/common/jsonErrorMessages.i18n.json | 6 ++--- i18n/hun/src/vs/base/node/processes.i18n.json | 3 ++- i18n/hun/src/vs/base/node/zip.i18n.json | 1 + .../src/vs/code/electron-main/menus.i18n.json | 1 + .../browser/widget/diffReview.i18n.json | 4 ++++ .../editor/common/commonCodeEditor.i18n.json | 3 ++- .../config/commonEditorConfig.i18n.json | 21 +++++++++------- .../editor/common/controller/cursor.i18n.json | 2 +- .../common/view/editorColorRegistry.i18n.json | 1 + .../codeAction/codeActionCommands.i18n.json | 3 ++- .../contrib/find/findController.i18n.json | 1 + .../contrib/format/formatActions.i18n.json | 4 +++- .../vs/editor/contrib/links/links.i18n.json | 2 +- .../message/messageController.i18n.json | 3 ++- .../platform/environment/node/argv.i18n.json | 4 +++- .../node/extensionManagementService.i18n.json | 2 ++ .../abstractKeybindingService.i18n.json | 2 +- .../theme/common/colorRegistry.i18n.json | 1 - .../inactiveExtensionUrlHandler.i18n.json | 9 +++++++ .../electron-main/windowsService.i18n.json | 2 +- .../viewsContainersExtensionPoint.i18n.json | 6 +++++ .../api/browser/viewsExtensionPoint.i18n.json | 8 ++++--- .../mainThreadSaveParticipant.i18n.json | 1 + .../parts/quickinput/quickInput.i18n.json | 2 ++ .../debug/browser/breakpointsView.i18n.json | 4 ++++ .../debug/browser/debugActions.i18n.json | 1 + .../debug.contribution.i18n.json | 3 +-- .../debugEditorContribution.i18n.json | 10 ++++++++ .../electron-browser/fileActions.i18n.json | 15 +++++++----- .../views/explorerViewer.i18n.json | 3 +++ .../localizations.contribution.i18n.json | 23 ++++++++++++++++++ .../localizationsActions.i18n.json | 14 +++++++++++ .../electron-browser/markersPanel.i18n.json | 4 +++- .../markersPanelActions.i18n.json | 3 ++- .../electron-browser/messages.i18n.json | 5 ++++ .../browser/gotoLineHandler.i18n.json | 4 ++-- .../search.contribution.i18n.json | 2 +- .../tasks/common/problemMatcher.i18n.json | 2 +- .../terminal.contribution.i18n.json | 2 +- .../terminalInstance.i18n.json | 3 ++- .../terminalLinkHandler.i18n.json | 2 +- .../url.contribution.i18n.json | 11 +++++++++ .../overlay/browser/welcomeOverlay.i18n.json | 1 + .../vs_code_welcome_page.i18n.json | 2 ++ .../configurationEditingService.i18n.json | 1 + .../node/variableResolver.i18n.json | 20 ++++++++++++++++ i18n/ita/extensions/npm/out/npmView.i18n.json | 9 +++++++ i18n/ita/extensions/npm/out/tasks.i18n.json | 10 ++++++++ i18n/ita/extensions/npm/package.i18n.json | 5 +++- .../config/commonEditorConfig.i18n.json | 6 +---- .../platform/environment/node/argv.i18n.json | 1 - .../theme/common/colorRegistry.i18n.json | 4 ---- .../inactiveExtensionUrlHandler.i18n.json | 9 +++++++ .../api/browser/viewsExtensionPoint.i18n.json | 2 -- .../parts/quickinput/quickInput.i18n.json | 2 ++ .../electron-browser/fileActions.i18n.json | 12 +++++----- .../localizations.contribution.i18n.json | 23 ++++++++++++++++++ .../localizationsActions.i18n.json | 14 +++++++++++ .../url.contribution.i18n.json | 10 ++++++++ .../node/variableResolver.i18n.json | 9 +++++++ i18n/jpn/extensions/npm/out/npmView.i18n.json | 11 +++++++++ i18n/jpn/extensions/npm/out/tasks.i18n.json | 10 ++++++++ i18n/jpn/extensions/npm/package.i18n.json | 10 +++++++- i18n/jpn/src/vs/base/node/processes.i18n.json | 3 ++- i18n/jpn/src/vs/base/node/zip.i18n.json | 1 + .../src/vs/code/electron-main/menus.i18n.json | 1 + .../browser/widget/diffReview.i18n.json | 4 ++++ .../editor/common/commonCodeEditor.i18n.json | 3 ++- .../config/commonEditorConfig.i18n.json | 13 ++++++---- .../common/view/editorColorRegistry.i18n.json | 1 + .../codeAction/codeActionCommands.i18n.json | 3 ++- .../contrib/find/findController.i18n.json | 1 + .../contrib/format/formatActions.i18n.json | 3 ++- .../message/messageController.i18n.json | 3 ++- .../referencesWidget.i18n.json | 3 ++- .../platform/environment/node/argv.i18n.json | 2 ++ .../node/extensionManagementService.i18n.json | 2 ++ .../inactiveExtensionUrlHandler.i18n.json | 10 ++++++++ .../viewsContainersExtensionPoint.i18n.json | 7 ++++++ .../api/browser/viewsExtensionPoint.i18n.json | 6 +++-- .../mainThreadSaveParticipant.i18n.json | 1 + .../parts/quickinput/quickInput.i18n.json | 2 ++ .../debug/browser/breakpointsView.i18n.json | 3 +++ .../debug/browser/debugActions.i18n.json | 1 + .../debug.contribution.i18n.json | 3 +-- .../debugEditorContribution.i18n.json | 9 +++++++ .../electron-browser/fileActions.i18n.json | 15 +++++++----- .../views/explorerViewer.i18n.json | 3 +++ .../localizations.contribution.i18n.json | 24 +++++++++++++++++++ .../localizationsActions.i18n.json | 14 +++++++++++ .../terminalInstance.i18n.json | 3 ++- .../url.contribution.i18n.json | 11 +++++++++ .../vs_code_welcome_page.i18n.json | 2 ++ .../node/variableResolver.i18n.json | 20 ++++++++++++++++ .../remoteFileService.i18n.json | 3 ++- i18n/kor/extensions/npm/out/npmView.i18n.json | 9 +++++++ i18n/kor/extensions/npm/out/tasks.i18n.json | 10 ++++++++ i18n/kor/extensions/npm/package.i18n.json | 5 +++- .../config/commonEditorConfig.i18n.json | 6 +---- .../platform/environment/node/argv.i18n.json | 1 - .../theme/common/colorRegistry.i18n.json | 4 ---- .../inactiveExtensionUrlHandler.i18n.json | 9 +++++++ .../api/browser/viewsExtensionPoint.i18n.json | 2 -- .../parts/quickinput/quickInput.i18n.json | 2 ++ .../electron-browser/fileActions.i18n.json | 12 +++++----- .../localizations.contribution.i18n.json | 23 ++++++++++++++++++ .../localizationsActions.i18n.json | 14 +++++++++++ .../url.contribution.i18n.json | 10 ++++++++ .../node/variableResolver.i18n.json | 9 +++++++ i18n/ptb/extensions/npm/out/npmView.i18n.json | 9 +++++++ i18n/ptb/extensions/npm/out/tasks.i18n.json | 9 +++++++ i18n/ptb/extensions/npm/package.i18n.json | 6 ++++- .../package.i18n.json | 1 + i18n/ptb/src/vs/base/node/processes.i18n.json | 3 ++- i18n/ptb/src/vs/base/node/zip.i18n.json | 1 + .../src/vs/code/electron-main/menus.i18n.json | 1 + .../browser/widget/diffReview.i18n.json | 2 ++ .../config/commonEditorConfig.i18n.json | 6 +---- .../platform/environment/node/argv.i18n.json | 1 - .../theme/common/colorRegistry.i18n.json | 4 ---- .../inactiveExtensionUrlHandler.i18n.json | 9 +++++++ .../viewsContainersExtensionPoint.i18n.json | 5 ++++ .../api/browser/viewsExtensionPoint.i18n.json | 2 -- .../parts/quickinput/quickInput.i18n.json | 2 ++ .../debug/browser/breakpointsView.i18n.json | 5 ++++ .../debug/browser/debugActions.i18n.json | 1 + .../browser/debugEditorActions.i18n.json | 1 + .../breakpointWidget.i18n.json | 3 ++- .../debugConfigurationManager.i18n.json | 1 + .../debugEditorContribution.i18n.json | 11 +++++++++ .../electron-browser/debugService.i18n.json | 1 + .../parts/debug/node/debugger.i18n.json | 1 + .../electron-browser/fileActions.i18n.json | 12 +++++----- .../localizations.contribution.i18n.json | 23 ++++++++++++++++++ .../localizationsActions.i18n.json | 14 +++++++++++ .../update/electron-browser/update.i18n.json | 2 ++ .../url.contribution.i18n.json | 11 +++++++++ .../telemetryOptOut.i18n.json | 2 ++ .../node/variableResolver.i18n.json | 9 +++++++ .../electron-browser/TMGrammars.i18n.json | 1 + .../themes/common/colorThemeSchema.i18n.json | 1 + i18n/rus/extensions/emmet/package.i18n.json | 3 ++- i18n/rus/extensions/npm/out/npmView.i18n.json | 9 +++++++ i18n/rus/extensions/npm/out/tasks.i18n.json | 10 ++++++++ i18n/rus/extensions/npm/package.i18n.json | 5 +++- .../src/vs/code/electron-main/menus.i18n.json | 4 ++-- .../config/commonEditorConfig.i18n.json | 6 +---- .../platform/environment/node/argv.i18n.json | 1 - .../theme/common/colorRegistry.i18n.json | 4 ---- .../inactiveExtensionUrlHandler.i18n.json | 9 +++++++ .../api/browser/viewsExtensionPoint.i18n.json | 2 -- .../parts/quickinput/quickInput.i18n.json | 2 ++ .../electron-browser/fileActions.i18n.json | 12 +++++----- .../localizations.contribution.i18n.json | 23 ++++++++++++++++++ .../localizationsActions.i18n.json | 14 +++++++++++ .../url.contribution.i18n.json | 10 ++++++++ .../node/variableResolver.i18n.json | 9 +++++++ i18n/trk/extensions/npm/out/npmView.i18n.json | 9 +++++++ i18n/trk/extensions/npm/out/tasks.i18n.json | 10 ++++++++ i18n/trk/extensions/npm/package.i18n.json | 6 ++++- .../config/commonEditorConfig.i18n.json | 6 +---- .../platform/environment/node/argv.i18n.json | 1 - .../theme/common/colorRegistry.i18n.json | 4 ---- .../inactiveExtensionUrlHandler.i18n.json | 9 +++++++ .../api/browser/viewsExtensionPoint.i18n.json | 2 -- .../parts/quickinput/quickInput.i18n.json | 2 ++ .../electron-browser/fileActions.i18n.json | 12 +++++----- .../localizations.contribution.i18n.json | 23 ++++++++++++++++++ .../localizationsActions.i18n.json | 14 +++++++++++ .../url.contribution.i18n.json | 10 ++++++++ .../node/variableResolver.i18n.json | 9 +++++++ 351 files changed, 1736 insertions(+), 313 deletions(-) create mode 100644 i18n/chs/extensions/npm/out/npmView.i18n.json create mode 100644 i18n/chs/extensions/npm/out/tasks.i18n.json create mode 100644 i18n/chs/src/vs/platform/url/electron-browser/inactiveExtensionUrlHandler.i18n.json create mode 100644 i18n/chs/src/vs/workbench/parts/localizations/electron-browser/localizations.contribution.i18n.json create mode 100644 i18n/chs/src/vs/workbench/parts/localizations/electron-browser/localizationsActions.i18n.json create mode 100644 i18n/chs/src/vs/workbench/parts/url/electron-browser/url.contribution.i18n.json create mode 100644 i18n/chs/src/vs/workbench/services/configurationResolver/node/variableResolver.i18n.json create mode 100644 i18n/cht/extensions/npm/out/npmView.i18n.json create mode 100644 i18n/cht/extensions/npm/out/tasks.i18n.json create mode 100644 i18n/cht/src/vs/platform/url/electron-browser/inactiveExtensionUrlHandler.i18n.json create mode 100644 i18n/cht/src/vs/workbench/parts/localizations/electron-browser/localizations.contribution.i18n.json create mode 100644 i18n/cht/src/vs/workbench/parts/localizations/electron-browser/localizationsActions.i18n.json create mode 100644 i18n/cht/src/vs/workbench/parts/url/electron-browser/url.contribution.i18n.json create mode 100644 i18n/cht/src/vs/workbench/services/configurationResolver/node/variableResolver.i18n.json create mode 100644 i18n/deu/extensions/npm/out/npmView.i18n.json create mode 100644 i18n/deu/extensions/npm/out/tasks.i18n.json create mode 100644 i18n/deu/src/vs/platform/url/electron-browser/inactiveExtensionUrlHandler.i18n.json create mode 100644 i18n/deu/src/vs/workbench/parts/localizations/electron-browser/localizations.contribution.i18n.json create mode 100644 i18n/deu/src/vs/workbench/parts/localizations/electron-browser/localizationsActions.i18n.json create mode 100644 i18n/deu/src/vs/workbench/parts/url/electron-browser/url.contribution.i18n.json create mode 100644 i18n/deu/src/vs/workbench/services/configurationResolver/node/variableResolver.i18n.json create mode 100644 i18n/esn/extensions/npm/out/npmView.i18n.json create mode 100644 i18n/esn/extensions/npm/out/tasks.i18n.json create mode 100644 i18n/esn/src/vs/platform/url/electron-browser/inactiveExtensionUrlHandler.i18n.json create mode 100644 i18n/esn/src/vs/workbench/parts/localizations/electron-browser/localizations.contribution.i18n.json create mode 100644 i18n/esn/src/vs/workbench/parts/localizations/electron-browser/localizationsActions.i18n.json create mode 100644 i18n/esn/src/vs/workbench/parts/url/electron-browser/url.contribution.i18n.json create mode 100644 i18n/esn/src/vs/workbench/services/configurationResolver/node/variableResolver.i18n.json create mode 100644 i18n/fra/extensions/npm/out/npmView.i18n.json create mode 100644 i18n/fra/extensions/npm/out/tasks.i18n.json create mode 100644 i18n/fra/src/vs/platform/url/electron-browser/inactiveExtensionUrlHandler.i18n.json create mode 100644 i18n/fra/src/vs/workbench/parts/localizations/electron-browser/localizations.contribution.i18n.json create mode 100644 i18n/fra/src/vs/workbench/parts/localizations/electron-browser/localizationsActions.i18n.json create mode 100644 i18n/fra/src/vs/workbench/parts/url/electron-browser/url.contribution.i18n.json create mode 100644 i18n/fra/src/vs/workbench/services/configurationResolver/node/variableResolver.i18n.json create mode 100644 i18n/hun/extensions/npm/out/npmView.i18n.json create mode 100644 i18n/hun/extensions/npm/out/tasks.i18n.json create mode 100644 i18n/hun/src/vs/platform/url/electron-browser/inactiveExtensionUrlHandler.i18n.json create mode 100644 i18n/hun/src/vs/workbench/parts/localizations/electron-browser/localizations.contribution.i18n.json create mode 100644 i18n/hun/src/vs/workbench/parts/localizations/electron-browser/localizationsActions.i18n.json create mode 100644 i18n/hun/src/vs/workbench/parts/url/electron-browser/url.contribution.i18n.json create mode 100644 i18n/hun/src/vs/workbench/services/configurationResolver/node/variableResolver.i18n.json create mode 100644 i18n/ita/extensions/npm/out/npmView.i18n.json create mode 100644 i18n/ita/extensions/npm/out/tasks.i18n.json create mode 100644 i18n/ita/src/vs/platform/url/electron-browser/inactiveExtensionUrlHandler.i18n.json create mode 100644 i18n/ita/src/vs/workbench/parts/localizations/electron-browser/localizations.contribution.i18n.json create mode 100644 i18n/ita/src/vs/workbench/parts/localizations/electron-browser/localizationsActions.i18n.json create mode 100644 i18n/ita/src/vs/workbench/parts/url/electron-browser/url.contribution.i18n.json create mode 100644 i18n/ita/src/vs/workbench/services/configurationResolver/node/variableResolver.i18n.json create mode 100644 i18n/jpn/extensions/npm/out/npmView.i18n.json create mode 100644 i18n/jpn/extensions/npm/out/tasks.i18n.json create mode 100644 i18n/jpn/src/vs/platform/url/electron-browser/inactiveExtensionUrlHandler.i18n.json create mode 100644 i18n/jpn/src/vs/workbench/parts/localizations/electron-browser/localizations.contribution.i18n.json create mode 100644 i18n/jpn/src/vs/workbench/parts/localizations/electron-browser/localizationsActions.i18n.json create mode 100644 i18n/jpn/src/vs/workbench/parts/url/electron-browser/url.contribution.i18n.json create mode 100644 i18n/jpn/src/vs/workbench/services/configurationResolver/node/variableResolver.i18n.json create mode 100644 i18n/kor/extensions/npm/out/npmView.i18n.json create mode 100644 i18n/kor/extensions/npm/out/tasks.i18n.json create mode 100644 i18n/kor/src/vs/platform/url/electron-browser/inactiveExtensionUrlHandler.i18n.json create mode 100644 i18n/kor/src/vs/workbench/parts/localizations/electron-browser/localizations.contribution.i18n.json create mode 100644 i18n/kor/src/vs/workbench/parts/localizations/electron-browser/localizationsActions.i18n.json create mode 100644 i18n/kor/src/vs/workbench/parts/url/electron-browser/url.contribution.i18n.json create mode 100644 i18n/kor/src/vs/workbench/services/configurationResolver/node/variableResolver.i18n.json create mode 100644 i18n/ptb/extensions/npm/out/npmView.i18n.json create mode 100644 i18n/ptb/extensions/npm/out/tasks.i18n.json create mode 100644 i18n/ptb/src/vs/platform/url/electron-browser/inactiveExtensionUrlHandler.i18n.json create mode 100644 i18n/ptb/src/vs/workbench/parts/localizations/electron-browser/localizations.contribution.i18n.json create mode 100644 i18n/ptb/src/vs/workbench/parts/localizations/electron-browser/localizationsActions.i18n.json create mode 100644 i18n/ptb/src/vs/workbench/parts/url/electron-browser/url.contribution.i18n.json create mode 100644 i18n/ptb/src/vs/workbench/services/configurationResolver/node/variableResolver.i18n.json create mode 100644 i18n/rus/extensions/npm/out/npmView.i18n.json create mode 100644 i18n/rus/extensions/npm/out/tasks.i18n.json create mode 100644 i18n/rus/src/vs/platform/url/electron-browser/inactiveExtensionUrlHandler.i18n.json create mode 100644 i18n/rus/src/vs/workbench/parts/localizations/electron-browser/localizations.contribution.i18n.json create mode 100644 i18n/rus/src/vs/workbench/parts/localizations/electron-browser/localizationsActions.i18n.json create mode 100644 i18n/rus/src/vs/workbench/parts/url/electron-browser/url.contribution.i18n.json create mode 100644 i18n/rus/src/vs/workbench/services/configurationResolver/node/variableResolver.i18n.json create mode 100644 i18n/trk/extensions/npm/out/npmView.i18n.json create mode 100644 i18n/trk/extensions/npm/out/tasks.i18n.json create mode 100644 i18n/trk/src/vs/platform/url/electron-browser/inactiveExtensionUrlHandler.i18n.json create mode 100644 i18n/trk/src/vs/workbench/parts/localizations/electron-browser/localizations.contribution.i18n.json create mode 100644 i18n/trk/src/vs/workbench/parts/localizations/electron-browser/localizationsActions.i18n.json create mode 100644 i18n/trk/src/vs/workbench/parts/url/electron-browser/url.contribution.i18n.json create mode 100644 i18n/trk/src/vs/workbench/services/configurationResolver/node/variableResolver.i18n.json diff --git a/i18n/chs/extensions/npm/out/npmView.i18n.json b/i18n/chs/extensions/npm/out/npmView.i18n.json new file mode 100644 index 00000000000..5978906c3fb --- /dev/null +++ b/i18n/chs/extensions/npm/out/npmView.i18n.json @@ -0,0 +1,11 @@ +{ + "": [ + "--------------------------------------------------------------------------------------------", + "Copyright (c) Microsoft Corporation. All rights reserved.", + "Licensed under the MIT License. See License.txt in the project root for license information.", + "--------------------------------------------------------------------------------------------", + "Do not edit this file. It is machine generated." + ], + "npm.noDebugOptions": "无法启动“{0}”并进行调试。此脚本需要包含 node 调试选项: \"--nolazy --inspect-brk=端口号\",[了解更多](https://code.visualstudio.com/docs/nodejs/nodejs-debugging#_launch-configuration-support-for-npm-and-other-tools)。", + "npm.scriptInvalid": "找不到脚本“{0}”。请尝试刷新视图。" +} \ No newline at end of file diff --git a/i18n/chs/extensions/npm/out/tasks.i18n.json b/i18n/chs/extensions/npm/out/tasks.i18n.json new file mode 100644 index 00000000000..e0f67df3bad --- /dev/null +++ b/i18n/chs/extensions/npm/out/tasks.i18n.json @@ -0,0 +1,10 @@ +{ + "": [ + "--------------------------------------------------------------------------------------------", + "Copyright (c) Microsoft Corporation. All rights reserved.", + "Licensed under the MIT License. See License.txt in the project root for license information.", + "--------------------------------------------------------------------------------------------", + "Do not edit this file. It is machine generated." + ], + "npm.parseError": "Npm 任务检测: 无法分析文件 {0}" +} \ No newline at end of file diff --git a/i18n/chs/extensions/npm/package.i18n.json b/i18n/chs/extensions/npm/package.i18n.json index 452c6ca9d2f..b0c78e7ec44 100644 --- a/i18n/chs/extensions/npm/package.i18n.json +++ b/i18n/chs/extensions/npm/package.i18n.json @@ -12,7 +12,15 @@ "config.npm.runSilent": "使用 \"--silent\" 选项运行 npm 命令。", "config.npm.packageManager": "用于运行脚本的程序包管理器。", "config.npm.exclude": "配置应从自动脚本检测中排除的文件夹的 glob 模式。", + "config.npm.enableScriptExplorer": "当工作区包含 \"package.json\" 文件时,启用 npm 脚本资源管理器视图。", "npm.parseError": "Npm 任务检测: 无法分析文件 {0}", "taskdef.script": "要自定义的 npm 脚本。", - "taskdef.path": "包含 package.json 文件的文件夹路径,其中 package.json 文件提供脚本。可以省略。" + "taskdef.path": "包含 package.json 文件的文件夹路径,其中 package.json 文件提供脚本。可以省略。", + "view.name": "Npm 脚本", + "command.refresh": "刷新", + "command.run": "运行", + "command.debug": "调试", + "command.openScript": "开放", + "npm.scriptInvalid": "找不到脚本“{0}”。请尝试刷新视图。", + "npm.noDebugOptions": "无法启动“{0}”并进行调试。此脚本需要包含 node 调试选项: \"--nolazy --inspect-brk=端口号\",[了解更多](https://code.visualstudio.com/docs/nodejs/nodejs-debugging#_launch-configuration-support-for-npm-and-other-tools)。" } \ No newline at end of file diff --git a/i18n/chs/src/vs/base/node/processes.i18n.json b/i18n/chs/src/vs/base/node/processes.i18n.json index 35229bd6699..a4ef2b86290 100644 --- a/i18n/chs/src/vs/base/node/processes.i18n.json +++ b/i18n/chs/src/vs/base/node/processes.i18n.json @@ -5,5 +5,6 @@ "Licensed under the MIT License. See License.txt in the project root for license information.", "--------------------------------------------------------------------------------------------", "Do not edit this file. It is machine generated." - ] + ], + "TaskRunner.UNC": "无法在 UNC 驱动器上执行 Shell 命令。" } \ No newline at end of file diff --git a/i18n/chs/src/vs/code/electron-main/menus.i18n.json b/i18n/chs/src/vs/code/electron-main/menus.i18n.json index 4f71710a76a..1a8ea044c9f 100644 --- a/i18n/chs/src/vs/code/electron-main/menus.i18n.json +++ b/i18n/chs/src/vs/code/electron-main/menus.i18n.json @@ -42,7 +42,7 @@ "miExit": "退出(&&X)", "miOpenSettings": "设置(&&S)", "miOpenKeymap": "键盘快捷方式(&&K)", - "miOpenKeymapExtensions": "键映射扩展(&&K)", + "miOpenKeymapExtensions": "按键映射扩展(&&K)", "miOpenSnippets": "用户代码片段(&&S)", "miSelectColorTheme": "颜色主题(&&C)", "miSelectIconTheme": "文件图标主题(&&I)", @@ -146,6 +146,7 @@ "miConditionalBreakpoint": "条件断点(&&C)...", "miColumnBreakpoint": "列断点(&&O)", "miFunctionBreakpoint": "函数断点(&&F)...", + "miLogPoint": "记录点(&&L)...", "miNewBreakpoint": "新建断点(&&N)", "miEnableAllBreakpoints": "启用所有断点", "miDisableAllBreakpoints": "禁用所有断点(&&L)", diff --git a/i18n/chs/src/vs/editor/browser/widget/diffReview.i18n.json b/i18n/chs/src/vs/editor/browser/widget/diffReview.i18n.json index 2397f44f074..7fb45c01a5b 100644 --- a/i18n/chs/src/vs/editor/browser/widget/diffReview.i18n.json +++ b/i18n/chs/src/vs/editor/browser/widget/diffReview.i18n.json @@ -7,6 +7,10 @@ "Do not edit this file. It is machine generated." ], "label.close": "关闭", + "no_lines": "无内容", + "one_line": "1 行", + "more_lines": "{0} 行", + "header": "差异 {0},总共 {1}: 原始,{2},{3};改后,{4},{5}", "blankLine": "空白", "equalLine": "未修改 {0},已修改 {1}: {2}", "insertLine": "+ 已修改 {0}: {1}", diff --git a/i18n/chs/src/vs/editor/common/config/commonEditorConfig.i18n.json b/i18n/chs/src/vs/editor/common/config/commonEditorConfig.i18n.json index f3c51a42e64..446507bbe40 100644 --- a/i18n/chs/src/vs/editor/common/config/commonEditorConfig.i18n.json +++ b/i18n/chs/src/vs/editor/common/config/commonEditorConfig.i18n.json @@ -16,7 +16,7 @@ "lineNumbers.on": "将行号显示为绝对行数。", "lineNumbers.relative": "将行号显示为与光标相隔的行数。", "lineNumbers.interval": "每 10 行显示一次行号。", - "lineNumbers": "控制行号的显示。可选值为 \"on\"、\"off\"、\"relative\" 和 \"interval\"。", + "lineNumbers": "控制行号的显示。", "rulers": "在一定数量的等宽字符后显示垂直标尺。输入多个值,显示多个标尺。若数组为空,则不绘制标尺。", "wordSeparators": "执行文字相关的导航或操作时将用作文字分隔符的字符", "tabSize": "一个制表符等于的空格数。该设置在 \"editor.detectIndentation\" 启用时根据文件内容可能会被覆盖。", @@ -28,8 +28,8 @@ "scrollBeyondLastLine": "控制编辑器是否可以滚动到最后一行之后", "smoothScrolling": "控制编辑器是否在滚动时使用动画", "minimap.enabled": "控制是否显示 minimap", - "minimap.side": "控制在哪一侧显示小地图。可选值为 \"right\" (右) 和 \"left\" (左)", - "minimap.showSlider": "控制是否自动隐藏小地图滑块。可选值为 \"always\" 和 \"mouseover\"", + "minimap.side": "控制在哪一侧显示小地图。", + "minimap.showSlider": "控制是否自动隐藏迷你地图滑块。 ", "minimap.renderCharacters": "呈现某行上的实际字符(与颜色块相反)", "minimap.maxColumn": "限制最小映射的宽度,尽量多地呈现特定数量的列", "find.seedSearchStringFromSelection": "控制是否将编辑器的选中内容作为搜索词填入到查找组件", @@ -77,7 +77,7 @@ "occurrencesHighlight": "控制编辑器是否应该突出显示语义符号次数", "overviewRulerLanes": "控制可在概述标尺同一位置显示的效果数量", "overviewRulerBorder": "控制概述标尺周围是否要绘制边框。", - "cursorBlinking": "控制光标动画样式,可能的值为 \"blink\"、\"smooth\"、\"phase\"、\"expand\" 和 \"solid\"", + "cursorBlinking": "控制光标的动画样式。", "mouseWheelZoom": "通过使用鼠标滚轮同时按住 Ctrl 可缩放编辑器的字体", "cursorStyle": "控制光标样式,接受的值为 \"block\"、\"block-outline\"、\"line\"、\"line-thin\" 、\"underline\" 和 \"underline-thin\"", "cursorWidth": "当 editor.cursorStyle 设置为 \"line\" 时控制光标的宽度。", @@ -87,7 +87,7 @@ "renderControlCharacters": "控制编辑器是否应呈现控制字符", "renderIndentGuides": "控制编辑器是否应呈现缩进参考线", "renderLineHighlight": "控制编辑器应如何呈现当前行突出显示,可能为“无”、“装订线”、“线”和“全部”。", - "codeLens": "控制编辑器是否显示 CodeLens", + "codeLens": "控制是否在编辑器中显示 CodeLens", "folding": "控制编辑器是否启用代码折叠功能", "foldingStrategyAuto": "若语言特定的折叠策略可用,将直接使用;否则,将回退到基于缩进的折叠策略。", "foldingStrategyIndentation": "始终使用基于缩进的折叠策略", @@ -106,6 +106,9 @@ "links": "控制编辑器是否应检测链接并使它们可被点击", "colorDecorators": "控制编辑器是否显示内联颜色修饰器和颜色选取器。", "codeActions": "启用代码操作小灯泡提示", + "codeActionsOnSave.organizeImports": "是否在保存时整理 import 语句?", + "codeActionsOnSave": "在保存时运行的代码操作类型。", + "codeActionsOnSaveTimeout": "在保存时运行的代码操作的超时时间。", "selectionClipboard": "控制是否支持 Linux 主剪贴板。", "sideBySide": "控制 Diff 编辑器以并排或内联形式显示差异", "ignoreTrimWhitespace": "控制差异编辑器是否将对前导空格或尾随空格的更改显示为差异", diff --git a/i18n/chs/src/vs/editor/common/view/editorColorRegistry.i18n.json b/i18n/chs/src/vs/editor/common/view/editorColorRegistry.i18n.json index 30fcc2ac988..4aca4791379 100644 --- a/i18n/chs/src/vs/editor/common/view/editorColorRegistry.i18n.json +++ b/i18n/chs/src/vs/editor/common/view/editorColorRegistry.i18n.json @@ -14,6 +14,7 @@ "editorCursorBackground": "编辑器光标的背景色。可以自定义块型光标覆盖字符的颜色。", "editorWhitespaces": "编辑器中空白字符的颜色。", "editorIndentGuides": "编辑器缩进参考线的颜色。", + "editorActiveIndentGuide": "活动编辑器缩进参考线的颜色。", "editorLineNumbers": "编辑器行号的颜色。", "editorActiveLineNumber": "编辑器活动行号的颜色", "deprecatedEditorActiveLineNumber": "\"Id\" 已被弃用,请改用 \"editorLineNumber.activeForeground\"。", diff --git a/i18n/chs/src/vs/editor/contrib/codeAction/codeActionCommands.i18n.json b/i18n/chs/src/vs/editor/contrib/codeAction/codeActionCommands.i18n.json index e3436f18367..d034836e1c7 100644 --- a/i18n/chs/src/vs/editor/contrib/codeAction/codeActionCommands.i18n.json +++ b/i18n/chs/src/vs/editor/contrib/codeAction/codeActionCommands.i18n.json @@ -14,5 +14,6 @@ "editor.action.refactor.noneMessage": "没有可用的重构操作", "source.label": "源代码操作...", "editor.action.source.noneMessage": "没有可用的源代码操作", - "organizeImports.label": "整理 import 语句" + "organizeImports.label": "整理 import 语句", + "editor.action.organize.noneMessage": "没有可用的整理 import 语句操作" } \ No newline at end of file diff --git a/i18n/chs/src/vs/editor/contrib/format/formatActions.i18n.json b/i18n/chs/src/vs/editor/contrib/format/formatActions.i18n.json index db151c67452..2c87f057c00 100644 --- a/i18n/chs/src/vs/editor/contrib/format/formatActions.i18n.json +++ b/i18n/chs/src/vs/editor/contrib/format/formatActions.i18n.json @@ -12,5 +12,7 @@ "hintnn": "第 {1} 行到第 {2} 行间进行了 {0} 次格式编辑", "no.provider": "当前没有安装“{0}”文件的格式化程序。", "formatDocument.label": "格式化文件", - "formatSelection.label": "格式化选定代码" + "no.documentprovider": "当前没有安装“{0}”文件的文档格式化程序。", + "formatSelection.label": "格式化选定代码", + "no.selectionprovider": "当前没有安装“{0}”文件的选定项格式化程序。" } \ No newline at end of file diff --git a/i18n/chs/src/vs/editor/contrib/message/messageController.i18n.json b/i18n/chs/src/vs/editor/contrib/message/messageController.i18n.json index 35229bd6699..7f7e56c0130 100644 --- a/i18n/chs/src/vs/editor/contrib/message/messageController.i18n.json +++ b/i18n/chs/src/vs/editor/contrib/message/messageController.i18n.json @@ -5,5 +5,6 @@ "Licensed under the MIT License. See License.txt in the project root for license information.", "--------------------------------------------------------------------------------------------", "Do not edit this file. It is machine generated." - ] + ], + "editor.readonly": "无法在只读编辑器中编辑" } \ No newline at end of file diff --git a/i18n/chs/src/vs/editor/contrib/referenceSearch/referencesWidget.i18n.json b/i18n/chs/src/vs/editor/contrib/referenceSearch/referencesWidget.i18n.json index 16b739bff86..b08100f3e5c 100644 --- a/i18n/chs/src/vs/editor/contrib/referenceSearch/referencesWidget.i18n.json +++ b/i18n/chs/src/vs/editor/contrib/referenceSearch/referencesWidget.i18n.json @@ -25,5 +25,6 @@ "peekViewEditorBackground": "速览视图编辑器背景颜色。", "peekViewEditorGutterBackground": "速览视图编辑器中导航线的背景颜色。", "peekViewResultsMatchHighlight": "在速览视图结果列表中匹配突出显示颜色。", - "peekViewEditorMatchHighlight": "在速览视图编辑器中匹配突出显示颜色。" + "peekViewEditorMatchHighlight": "在速览视图编辑器中匹配突出显示颜色。", + "peekViewEditorMatchHighlightBorder": "在速览视图编辑器中匹配项的突出显示边框。" } \ No newline at end of file diff --git a/i18n/chs/src/vs/platform/environment/node/argv.i18n.json b/i18n/chs/src/vs/platform/environment/node/argv.i18n.json index 53a94cfbcad..1571b950704 100644 --- a/i18n/chs/src/vs/platform/environment/node/argv.i18n.json +++ b/i18n/chs/src/vs/platform/environment/node/argv.i18n.json @@ -22,13 +22,15 @@ "showVersions": "使用 --list-extension 时,显示已安装扩展的版本。", "installExtension": "安装扩展。", "uninstallExtension": "卸载扩展。", - "experimentalApis": "启用扩展程序实验性 api 功能。", + "experimentalApis": "为扩展启用实验性 API 功能。", "verbose": "打印详细输出(隐含 --wait 参数)。", "log": "使用的日志级别。默认值为 \"info\"。允许的值为 \"critical\" (关键)、\"error\" (错误)、\"warn\" (警告)、\"info\" (信息)、\"debug\" (调试)、\"trace\" (跟踪) 和 \"off\" (关闭)。", "status": "打印进程使用情况和诊断信息。", "performance": "通过启用 \"Developer: Startup Performance\" 命令开始。", "prof-startup": "启动期间运行 CPU 探查器", "disableExtensions": "禁用所有已安装的扩展。", + "inspect-extensions": "允许调试和分析扩展。您可以在开发人员工具中找到连接 URI 。", + "inspect-brk-extensions": "允许扩展宿主在启动后暂停时进行扩展的调试和分析。您可以在开发人员工具中找到连接 URI 。", "disableGPU": "禁用 GPU 硬件加速。", "uploadLogs": "将当前会话的日志上传到安全端点。", "maxMemory": "单个窗口最大内存大小 (单位为 MB)。", diff --git a/i18n/chs/src/vs/platform/extensionManagement/node/extensionManagementService.i18n.json b/i18n/chs/src/vs/platform/extensionManagement/node/extensionManagementService.i18n.json index 4405f580f16..9a006505317 100644 --- a/i18n/chs/src/vs/platform/extensionManagement/node/extensionManagementService.i18n.json +++ b/i18n/chs/src/vs/platform/extensionManagement/node/extensionManagementService.i18n.json @@ -7,6 +7,7 @@ "Do not edit this file. It is machine generated." ], "invalidManifest": "扩展无效: package.json 不是 JSON 文件。", + "incompatible": "无法安装扩展“{0}”,它与 Code “{1}”不兼容。", "restartCode": "请先重启 Code 再重新安装 {0}。", "installingOutdatedExtension": "您已安装此扩展的新版程序。是否要使用旧版覆盖?", "override": "覆盖", @@ -20,6 +21,7 @@ "notFoundCompatibleDependency": "无法安装。找不到与 VS Code 当前版本 ({1}) 兼容的依赖扩展“{0}”。", "quitCode": "无法安装扩展。请在重启 VS Code 后重新安装。", "exitCode": "无法安装扩展。请在重启 VS Code 后重新安装。", + "renameError": "将 {0} 重命名为 {1} 时发生未知错误", "uninstallDependeciesConfirmation": "要仅卸载“{0}”或者其依赖项也一起卸载?", "uninstallOnly": "仅此扩展", "uninstallAll": "全部卸载", diff --git a/i18n/chs/src/vs/platform/theme/common/colorRegistry.i18n.json b/i18n/chs/src/vs/platform/theme/common/colorRegistry.i18n.json index c7001f8f909..66eb4736c07 100644 --- a/i18n/chs/src/vs/platform/theme/common/colorRegistry.i18n.json +++ b/i18n/chs/src/vs/platform/theme/common/colorRegistry.i18n.json @@ -29,7 +29,7 @@ "inputPlaceholderForeground": "输入框中占位符的前景色。", "inputValidationInfoBackground": "输入验证结果为信息级别时的背景色。", "inputValidationInfoBorder": "严重性为信息时输入验证的边框颜色。", - "inputValidationWarningBackground": "输入验证结果为警告级别时的背景色。", + "inputValidationWarningBackground": "严重性为警告时输入验证的背景色。", "inputValidationWarningBorder": "严重性为警告时输入验证的边框颜色。", "inputValidationErrorBackground": "输入验证结果为错误级别时的背景色。", "inputValidationErrorBorder": "严重性为错误时输入验证的边框颜色。", @@ -71,10 +71,8 @@ "editorSelectionHighlightBorder": "与所选项内容相同的区域的边框颜色。", "editorFindMatch": "当前搜索匹配项的颜色。", "findMatchHighlight": "其他搜索匹配项的颜色。颜色必须透明,使其不会挡住下方的其他元素。", - "findRangeHighlight": "搜索限制范围的颜色。颜色必须透明,使其不会挡住下方的其他元素。", "editorFindMatchBorder": "当前搜索匹配项的边框颜色。", "findMatchHighlightBorder": "其他搜索匹配项的边框颜色。", - "findRangeHighlightBorder": "搜索限制范围的边框颜色。颜色必须透明,使其不会挡住下方的其他元素。", "hoverHighlight": "文本在悬停提示显示时的高亮颜色。颜色必须透明,使其不会挡住下方的其他元素。", "hoverBackground": "编辑器悬停提示的背景颜色。", "hoverBorder": "光标悬停时编辑器的边框颜色。", @@ -88,7 +86,6 @@ "mergeIncomingHeaderBackground": "内嵌的合并冲突处理器中传入版本区域头部的背景色。颜色必须透明,使其不会挡住下方的其他元素。", "mergeIncomingContentBackground": "内嵌的合并冲突处理器中传入版本区域内容的背景色。颜色必须透明,使其不会挡住下方的其他元素。", "mergeCommonHeaderBackground": "内嵌的合并冲突处理器中共同上级区域头部的背景色。颜色必须透明,使其不会挡住下方的其他元素。", - "mergeCommonContentBackground": "内嵌的合并冲突处理器中共同上级区域内容的背景色。颜色必须透明,使其不会挡住下方的其他元素。", "mergeBorder": "内联合并冲突中标头和分割线的边框颜色。", "overviewRulerCurrentContentForeground": "内联合并冲突中当前版本区域的概览标尺前景色。", "overviewRulerIncomingContentForeground": "内联合并冲突中传入的版本区域的概览标尺前景色。", diff --git a/i18n/chs/src/vs/platform/url/electron-browser/inactiveExtensionUrlHandler.i18n.json b/i18n/chs/src/vs/platform/url/electron-browser/inactiveExtensionUrlHandler.i18n.json new file mode 100644 index 00000000000..35229bd6699 --- /dev/null +++ b/i18n/chs/src/vs/platform/url/electron-browser/inactiveExtensionUrlHandler.i18n.json @@ -0,0 +1,9 @@ +{ + "": [ + "--------------------------------------------------------------------------------------------", + "Copyright (c) Microsoft Corporation. All rights reserved.", + "Licensed under the MIT License. See License.txt in the project root for license information.", + "--------------------------------------------------------------------------------------------", + "Do not edit this file. It is machine generated." + ] +} \ No newline at end of file diff --git a/i18n/chs/src/vs/workbench/api/browser/viewsContainersExtensionPoint.i18n.json b/i18n/chs/src/vs/workbench/api/browser/viewsContainersExtensionPoint.i18n.json index 962583508c2..7d9f143a9ac 100644 --- a/i18n/chs/src/vs/workbench/api/browser/viewsContainersExtensionPoint.i18n.json +++ b/i18n/chs/src/vs/workbench/api/browser/viewsContainersExtensionPoint.i18n.json @@ -6,6 +6,13 @@ "--------------------------------------------------------------------------------------------", "Do not edit this file. It is machine generated." ], + "vscode.extension.contributes.views.containers.id": "用于标识容器的唯一 ID,视图能在容器内通过 \"view\" 参与点提供。", + "vscode.extension.contributes.views.containers.title": "人类可读的用于表示此容器的字符串", + "vscode.extension.contributes.views.containers.icon": "容器图标的路径", + "vscode.extension.contributes.viewsContainer": "向编辑器提供视图容器", + "views.container.activitybar": "向活动栏提供视图容器", + "proposed": "\"viewsContainer\" 参与点仅在以开发模式运行时或附加命令行开关: --enable-proposed-api {1} 时可用", + "requirearray": "视图容器必须为数组", "requirestring": "属性“{0}”是必要属性,其类型必须是 \"string\"", "showViewlet": "显示 {0}", "view": "查看" diff --git a/i18n/chs/src/vs/workbench/api/browser/viewsExtensionPoint.i18n.json b/i18n/chs/src/vs/workbench/api/browser/viewsExtensionPoint.i18n.json index e6fa52bd0f9..4af73da086f 100644 --- a/i18n/chs/src/vs/workbench/api/browser/viewsExtensionPoint.i18n.json +++ b/i18n/chs/src/vs/workbench/api/browser/viewsExtensionPoint.i18n.json @@ -13,8 +13,10 @@ "vscode.extension.contributes.view.name": "人类可读的视图名称。将会被显示", "vscode.extension.contributes.view.when": "显示此视图必须为真的条件", "vscode.extension.contributes.views": "向编辑器提供视图", - "views.explorer": "资源管理器视图", - "views.debug": "调试视图", + "views.explorer": "向活动栏中的“资源管理器”容器提供视图", + "views.debug": "向活动栏中的“调试”容器提供视图", + "views.scm": "向活动栏中的“源代码管理”容器提供视图", + "views.contributed": "在扩展提供的视图容器中提供视图。", "duplicateView1": "无法在位置“{1}”注册多个 ID 同为“{0}”的视图。", "duplicateView2": "ID 为“{0}”的视图在位置“{1}”已被注册" } \ No newline at end of file diff --git a/i18n/chs/src/vs/workbench/api/electron-browser/mainThreadSaveParticipant.i18n.json b/i18n/chs/src/vs/workbench/api/electron-browser/mainThreadSaveParticipant.i18n.json index 7481ffd0270..8117f5f86ff 100644 --- a/i18n/chs/src/vs/workbench/api/electron-browser/mainThreadSaveParticipant.i18n.json +++ b/i18n/chs/src/vs/workbench/api/electron-browser/mainThreadSaveParticipant.i18n.json @@ -7,6 +7,7 @@ "Do not edit this file. It is machine generated." ], "timeout.formatOnSave": "在 {0}ms 后终止了保存时进行的格式设置", + "codeActionsOnSave.didTimeout": "在 {0}ms 后终止了 codeActionsOnSave ", "timeout.onWillSave": "在 1750ms 后终止了 onWillSaveTextDocument 事件", "saveParticipants": "正在运行保存参与程序..." } \ No newline at end of file diff --git a/i18n/chs/src/vs/workbench/browser/parts/quickinput/quickInput.i18n.json b/i18n/chs/src/vs/workbench/browser/parts/quickinput/quickInput.i18n.json index 47373efa523..856821d9b96 100644 --- a/i18n/chs/src/vs/workbench/browser/parts/quickinput/quickInput.i18n.json +++ b/i18n/chs/src/vs/workbench/browser/parts/quickinput/quickInput.i18n.json @@ -6,6 +6,8 @@ "--------------------------------------------------------------------------------------------", "Do not edit this file. It is machine generated." ], + "inputModeEntryDescription": "{0} (按 \"Enter\" 以确认或按 \"Esc\" 以取消)", + "inputModeEntry": "按 \"Enter\" 以确认或按 \"Esc\" 以取消", "quickInput.countSelected": "已选 {0} 项", "ok": "确定" } \ No newline at end of file diff --git a/i18n/chs/src/vs/workbench/parts/codeEditor/electron-browser/inspectKeybindings.i18n.json b/i18n/chs/src/vs/workbench/parts/codeEditor/electron-browser/inspectKeybindings.i18n.json index 703a60921a1..8bec2cf0968 100644 --- a/i18n/chs/src/vs/workbench/parts/codeEditor/electron-browser/inspectKeybindings.i18n.json +++ b/i18n/chs/src/vs/workbench/parts/codeEditor/electron-browser/inspectKeybindings.i18n.json @@ -6,5 +6,5 @@ "--------------------------------------------------------------------------------------------", "Do not edit this file. It is machine generated." ], - "workbench.action.inspectKeyMap": "开发者: 检查键映射" + "workbench.action.inspectKeyMap": "开发者: 检查按键映射" } \ No newline at end of file diff --git a/i18n/chs/src/vs/workbench/parts/debug/browser/breakpointsView.i18n.json b/i18n/chs/src/vs/workbench/parts/debug/browser/breakpointsView.i18n.json index ab823eb2338..37748eebebc 100644 --- a/i18n/chs/src/vs/workbench/parts/debug/browser/breakpointsView.i18n.json +++ b/i18n/chs/src/vs/workbench/parts/debug/browser/breakpointsView.i18n.json @@ -6,7 +6,10 @@ "--------------------------------------------------------------------------------------------", "Do not edit this file. It is machine generated." ], + "logPoint": "记录点", "breakpoint": "断点", + "editBreakpoint": "编辑 {0}...", + "removeBreakpoint": "删除 {0}", "functionBreakpointsNotSupported": "此调试类型不支持函数断点", "functionBreakpointPlaceholder": "要断开的函数", "functionBreakPointInputAriaLabel": "键入函数断点", diff --git a/i18n/chs/src/vs/workbench/parts/debug/browser/debugActions.i18n.json b/i18n/chs/src/vs/workbench/parts/debug/browser/debugActions.i18n.json index 13779c68478..1bbf2950cba 100644 --- a/i18n/chs/src/vs/workbench/parts/debug/browser/debugActions.i18n.json +++ b/i18n/chs/src/vs/workbench/parts/debug/browser/debugActions.i18n.json @@ -21,6 +21,7 @@ "disconnectDebug": "断开连接", "continueDebug": "继续", "pauseDebug": "暂停", + "terminateThread": "终止线程", "restartFrame": "重新启动框架", "removeBreakpoint": "删除断点", "removeAllBreakpoints": "删除所有断点", diff --git a/i18n/chs/src/vs/workbench/parts/debug/electron-browser/breakpointWidget.i18n.json b/i18n/chs/src/vs/workbench/parts/debug/electron-browser/breakpointWidget.i18n.json index b5164359e2a..f13fb148e68 100644 --- a/i18n/chs/src/vs/workbench/parts/debug/electron-browser/breakpointWidget.i18n.json +++ b/i18n/chs/src/vs/workbench/parts/debug/electron-browser/breakpointWidget.i18n.json @@ -6,7 +6,7 @@ "--------------------------------------------------------------------------------------------", "Do not edit this file. It is machine generated." ], - "breakpointWidgetLogMessagePlaceholder": "断点命中时记录的消息。{} 内的表达式将被替换。“Enter”键确认,“Esc”键取消。", + "breakpointWidgetLogMessagePlaceholder": "断点命中时记录的消息。{} 内的表达式将被替换。按 \"Enter\" 键确认,\"Esc\" 键取消。", "breakpointWidgetHitCountPlaceholder": "在满足命中次数条件时中断。按 \"Enter\" 表示接受,\"Esc\" 表示取消。", "breakpointWidgetExpressionPlaceholder": "在表达式计算结果为 true 时中断。按 \"Enter\" 表示接受,\"Esc\" 表示取消。", "expression": "表达式", diff --git a/i18n/chs/src/vs/workbench/parts/debug/electron-browser/debug.contribution.i18n.json b/i18n/chs/src/vs/workbench/parts/debug/electron-browser/debug.contribution.i18n.json index 9c53ac4e9d4..f853c73cc83 100644 --- a/i18n/chs/src/vs/workbench/parts/debug/electron-browser/debug.contribution.i18n.json +++ b/i18n/chs/src/vs/workbench/parts/debug/electron-browser/debug.contribution.i18n.json @@ -27,6 +27,5 @@ "onFirstSessionStart": "仅于第一次启动调试后在状态栏中显示调试", "showInStatusBar": "控制何时显示调试状态栏", "openDebug": "控制是否在调试会话开始时打开调试视图。", - "launch": "全局的调试启动配置。应用作跨工作区共享的 \"launch.json\" 的替代。", - "extensionHostDebugAdapter": "在扩展主机中运行调试适配器" + "launch": "全局的调试启动配置。应用作跨工作区共享的 \"launch.json\" 的替代。" } \ No newline at end of file diff --git a/i18n/chs/src/vs/workbench/parts/debug/electron-browser/debugEditorContribution.i18n.json b/i18n/chs/src/vs/workbench/parts/debug/electron-browser/debugEditorContribution.i18n.json index d32e1d3481b..1006d749641 100644 --- a/i18n/chs/src/vs/workbench/parts/debug/electron-browser/debugEditorContribution.i18n.json +++ b/i18n/chs/src/vs/workbench/parts/debug/electron-browser/debugEditorContribution.i18n.json @@ -6,7 +6,12 @@ "--------------------------------------------------------------------------------------------", "Do not edit this file. It is machine generated." ], + "logPoint": "记录点", "breakpoint": "断点", + "removeBreakpoint": "删除 {0}", + "editBreakpoint": "编辑 {0}...", + "disableBreakpoint": "禁用 {0}", + "enableBreakpoint": "启用 {0}", "removeBreakpoints": "删除断点", "removeBreakpointOnColumn": "在列 {0} 上删除断点", "removeLineBreakpoint": "删除行断点", @@ -21,6 +26,11 @@ "addBreakpoint": "添加断点", "addConditionalBreakpoint": "添加条件断点...", "addLogPoint": "添加记录点...", + "breakpointHasCondition": "此{0}的{1}将在删除后丢失。请考虑仅禁用此{0}。", + "message": "消息", + "condition": "条件", + "removeLogPoint": "删除 {0}", + "disableLogPoint": "禁用 {0}", "cancel": "取消", "addConfiguration": "添加配置..." } \ No newline at end of file diff --git a/i18n/chs/src/vs/workbench/parts/extensions/browser/extensionsActions.i18n.json b/i18n/chs/src/vs/workbench/parts/extensions/browser/extensionsActions.i18n.json index 2a4e9d7f43f..d7e48510561 100644 --- a/i18n/chs/src/vs/workbench/parts/extensions/browser/extensionsActions.i18n.json +++ b/i18n/chs/src/vs/workbench/parts/extensions/browser/extensionsActions.i18n.json @@ -50,7 +50,7 @@ "allExtensionsInstalled": "已安装根据工作区推荐的所有扩展", "installRecommendedExtension": "安装推荐的扩展", "extensionInstalled": "您已经安装过此推荐扩展", - "showRecommendedKeymapExtensionsShort": "键映射", + "showRecommendedKeymapExtensionsShort": "按键映射", "showLanguageExtensionsShort": "语言扩展", "showAzureExtensionsShort": "Azure 扩展", "OpenExtensionsFile.failed": "无法在 \".vscode\" 文件夹({0})内创建 \"extensions.json\" 文件。", diff --git a/i18n/chs/src/vs/workbench/parts/files/browser/editors/textFileEditor.i18n.json b/i18n/chs/src/vs/workbench/parts/files/browser/editors/textFileEditor.i18n.json index 97c7ad980da..021d6bf5787 100644 --- a/i18n/chs/src/vs/workbench/parts/files/browser/editors/textFileEditor.i18n.json +++ b/i18n/chs/src/vs/workbench/parts/files/browser/editors/textFileEditor.i18n.json @@ -8,7 +8,7 @@ ], "textFileEditor": "文本文件编辑器", "createFile": "创建文件", - "relaunchWithIncreasedMemoryLimit": "以 {0} MB 重启", + "relaunchWithIncreasedMemoryLimit": "以 {0}MB 重启", "configureMemoryLimit": "配置内存限制", "fileEditorWithInputAriaLabel": "{0}。文本文件编辑器。", "fileEditorAriaLabel": "文本文件编辑器。" diff --git a/i18n/chs/src/vs/workbench/parts/files/electron-browser/fileActions.i18n.json b/i18n/chs/src/vs/workbench/parts/files/electron-browser/fileActions.i18n.json index e836660825f..edb35081d5b 100644 --- a/i18n/chs/src/vs/workbench/parts/files/electron-browser/fileActions.i18n.json +++ b/i18n/chs/src/vs/workbench/parts/files/electron-browser/fileActions.i18n.json @@ -13,6 +13,7 @@ "copyFile": "复制", "pasteFile": "粘贴", "retry": "重试", + "renameWhenSourcePathIsParentOfTargetError": "请使用“新建文件夹”或“新建文件”命令来向已有文件夹添加子项", "newUntitledFile": "新的无标题文件", "createNewFile": "新建文件", "createNewFolder": "新建文件夹", @@ -24,20 +25,24 @@ "dirtyMessageFolderDelete": "你正在删除的文件夹有 {0} 个文件具有未保存的更改。是否继续?", "dirtyMessageFileDelete": "你正在删除的文件具有未保存的更改。是否继续?", "dirtyWarning": "如果不保存,更改将丢失。", - "confirmMoveTrashMessageMultiple": "是否确定要删除以下 {0} 个文件?", - "confirmMoveTrashMessageFolder": "是否确实要删除“{0}”及其内容?", - "confirmMoveTrashMessageFile": "是否确实要删除“{0}”?", "undoBin": "可以从回收站还原。", "undoTrash": "可以从废纸篓还原。", "doNotAskAgain": "不再询问", - "confirmDeleteMessageMultiple": "是否确定要永久删除以下 {0} 个文件?", - "confirmDeleteMessageFolder": "是否确定要永久删除“{0}”及其内容?", - "confirmDeleteMessageFile": "是否确定要永久删除“{0}”?", "irreversible": "此操作不可逆!", "binFailed": "无法删除到回收站。是否永久删除?", "trashFailed": "无法删除到废纸篓。是否永久删除?", "deletePermanentlyButtonLabel": "永久删除(&&D)", "retryButtonLabel": "重试(&&R)", + "confirmMoveTrashMessageFilesAndDirectories": "是否确定要删除以下 {0} 个文件或文件夹 (包括其内容)?", + "confirmMoveTrashMessageMultipleDirectories": "是否确定要删除以下 {0} 个文件夹及其内容?", + "confirmMoveTrashMessageMultiple": "是否确定要删除以下 {0} 个文件?", + "confirmMoveTrashMessageFolder": "是否确实要删除“{0}”及其内容?", + "confirmMoveTrashMessageFile": "是否确实要删除“{0}”?", + "confirmDeleteMessageFilesAndDirectories": "是否确定要永久删除以下 {0} 个文件或文件夹 (包括其内容)?", + "confirmDeleteMessageMultipleDirectories": "是否确定要永久删除以下 {0} 个目录及其内容?", + "confirmDeleteMessageMultiple": "是否确定要永久删除以下 {0} 个文件?", + "confirmDeleteMessageFolder": "是否确定要永久删除“{0}”及其内容?", + "confirmDeleteMessageFile": "是否确定要永久删除“{0}”?", "addFiles": "添加文件", "confirmOverwrite": "目标文件夹中已存在具有相同名称的文件或文件夹。是否要替换它?", "replaceButtonLabel": "替换(&&R)", @@ -58,7 +63,9 @@ "openFileToShowInNewWindow": "请先打开要在新窗口中打开的文件", "copyPath": "复制路径", "emptyFileNameError": "必须提供文件或文件夹名。", + "fileNameStartsWithSlashError": "文件或文件夹名称不能以斜线开头。", "fileNameExistsError": "此位置已存在文件或文件夹 **{0}**。请选择其他名称。", + "fileUsedAsFolderError": "**{0}** 是一个文件,不能含有子项。", "invalidFileNameError": "名称 **{0}** 作为文件或文件夹名无效。请选择其他名称。", "filePathTooLongError": "名称 **{0}** 导致路径太长。请选择更短的名称。", "compareWithClipboard": "比较活动文件与剪贴板", diff --git a/i18n/chs/src/vs/workbench/parts/files/electron-browser/views/explorerViewer.i18n.json b/i18n/chs/src/vs/workbench/parts/files/electron-browser/views/explorerViewer.i18n.json index 805d10ae124..ab62245ce28 100644 --- a/i18n/chs/src/vs/workbench/parts/files/electron-browser/views/explorerViewer.i18n.json +++ b/i18n/chs/src/vs/workbench/parts/files/electron-browser/views/explorerViewer.i18n.json @@ -7,6 +7,9 @@ "Do not edit this file. It is machine generated." ], "fileInputAriaLabel": "键入文件名。按 Enter 以确认或按 Esc 以取消。", + "createFileFromExplorerInfoMessage": "在 **{1}** 中创建文件 **{0}**", + "renameFileFromExplorerInfoMessage": "移动并重命名为 **{0}**", + "createFolderFromExplorerInfoMessage": "在 **{1}** 中创建文件夹 **{0}**", "filesExplorerViewerAriaLabel": "{0},文件资源管理器", "dropFolders": "你是否要将文件夹添加到工作区?", "dropFolder": "你是否要将文件夹添加到工作区?", diff --git a/i18n/chs/src/vs/workbench/parts/localizations/electron-browser/localizations.contribution.i18n.json b/i18n/chs/src/vs/workbench/parts/localizations/electron-browser/localizations.contribution.i18n.json new file mode 100644 index 00000000000..1803ba349c0 --- /dev/null +++ b/i18n/chs/src/vs/workbench/parts/localizations/electron-browser/localizations.contribution.i18n.json @@ -0,0 +1,23 @@ +{ + "": [ + "--------------------------------------------------------------------------------------------", + "Copyright (c) Microsoft Corporation. All rights reserved.", + "Licensed under the MIT License. See License.txt in the project root for license information.", + "--------------------------------------------------------------------------------------------", + "Do not edit this file. It is machine generated." + ], + "updateLocale": "是否将 VS Code 的界面语言更换为 {0} 并重新启动?", + "yes": "是", + "no": "否", + "neverAgain": "不再显示", + "install": "安装", + "JsonSchema.locale": "使用的界面语言。", + "vscode.extension.contributes.localizations": "向编辑器提供本地化内容", + "vscode.extension.contributes.localizations.languageId": "显示字符串翻译的目标语言 ID。", + "vscode.extension.contributes.localizations.languageName": "语言的英文名称。", + "vscode.extension.contributes.localizations.languageNameLocalized": "提供语言的名称。", + "vscode.extension.contributes.localizations.translations": "与语言关联的翻译的列表。", + "vscode.extension.contributes.localizations.translations.id": "使用此翻译的 VS Code 或扩展的 ID。VS Code 的 ID 总为 \"vscode\",扩展的 ID 的格式应为 \"publisherId.extensionName\"。", + "vscode.extension.contributes.localizations.translations.id.pattern": "翻译 VS Code 或者扩展,ID 分别应为 \"vscode\" 或格式为 \"publisherId.extensionName\"。", + "vscode.extension.contributes.localizations.translations.path": "包含语言翻译的文件的相对路径。" +} \ No newline at end of file diff --git a/i18n/chs/src/vs/workbench/parts/localizations/electron-browser/localizationsActions.i18n.json b/i18n/chs/src/vs/workbench/parts/localizations/electron-browser/localizationsActions.i18n.json new file mode 100644 index 00000000000..3e746df31e0 --- /dev/null +++ b/i18n/chs/src/vs/workbench/parts/localizations/electron-browser/localizationsActions.i18n.json @@ -0,0 +1,14 @@ +{ + "": [ + "--------------------------------------------------------------------------------------------", + "Copyright (c) Microsoft Corporation. All rights reserved.", + "Licensed under the MIT License. See License.txt in the project root for license information.", + "--------------------------------------------------------------------------------------------", + "Do not edit this file. It is machine generated." + ], + "configureLocale": "配置语言", + "displayLanguage": "定义 VSCode 的显示语言。", + "doc": "请参阅 {0},了解支持的语言列表。", + "restart": "更改此值需要重启 VSCode。", + "fail.createSettings": "无法创建“{0}”({1})。" +} \ No newline at end of file diff --git a/i18n/chs/src/vs/workbench/parts/markers/electron-browser/messages.i18n.json b/i18n/chs/src/vs/workbench/parts/markers/electron-browser/messages.i18n.json index 86939d328ca..5e32356a724 100644 --- a/i18n/chs/src/vs/workbench/parts/markers/electron-browser/messages.i18n.json +++ b/i18n/chs/src/vs/workbench/parts/markers/electron-browser/messages.i18n.json @@ -15,7 +15,7 @@ "markers.panel.aria.label.problems.tree": "按文件分组的问题", "markers.panel.no.problems.build": "目前尚未在工作区检测到问题。", "markers.panel.no.problems.filters": "在给定的筛选条件下,没有找到结果。", - "markers.panel.no.problems.file.exclusions": "在启用排除筛选器的情况下,所有问题已隐藏。", + "markers.panel.no.problems.file.exclusions": "由于启用了文件排除筛选器,所有问题均已隐藏。", "markers.panel.action.useFilesExclude": "使用文件排除设置进行筛选", "markers.panel.action.donotUseFilesExclude": "不使用文件排除设置", "markers.panel.action.filter": "筛选器问题", diff --git a/i18n/chs/src/vs/workbench/parts/search/browser/searchView.i18n.json b/i18n/chs/src/vs/workbench/parts/search/browser/searchView.i18n.json index e6d06592621..8ce29ea8045 100644 --- a/i18n/chs/src/vs/workbench/parts/search/browser/searchView.i18n.json +++ b/i18n/chs/src/vs/workbench/parts/search/browser/searchView.i18n.json @@ -7,9 +7,9 @@ "Do not edit this file. It is machine generated." ], "moreSearch": "切换搜索详细信息", - "searchScope.includes": "要包含的文件", + "searchScope.includes": "包含的文件", "label.includes": "搜索包含模式", - "searchScope.excludes": "要排除的文件", + "searchScope.excludes": "排除的文件", "label.excludes": "搜索排除模式", "replaceAll.confirmation.title": "全部替换", "replaceAll.confirm.button": "替换(&&R)", diff --git a/i18n/chs/src/vs/workbench/parts/terminal/electron-browser/terminalInstance.i18n.json b/i18n/chs/src/vs/workbench/parts/terminal/electron-browser/terminalInstance.i18n.json index 3d750304ebb..1ad1381b7bd 100644 --- a/i18n/chs/src/vs/workbench/parts/terminal/electron-browser/terminalInstance.i18n.json +++ b/i18n/chs/src/vs/workbench/parts/terminal/electron-browser/terminalInstance.i18n.json @@ -12,5 +12,6 @@ "terminal.integrated.copySelection.noSelection": "没有在终端中选择要复制的内容", "terminal.integrated.exitedWithCode": "通过退出代码 {0} 终止的终端进程", "terminal.integrated.waitOnExit": "按任意键以关闭终端", - "terminal.integrated.launchFailed": "终端进程命令“{0} {1}”无法启动 (退出代码: {2})" + "terminal.integrated.launchFailed": "终端进程命令“{0} {1}”无法启动 (退出代码: {2})", + "terminal.integrated.launchFailedExtHost": "无法启动终端进程 (退出代码: {0})" } \ No newline at end of file diff --git a/i18n/chs/src/vs/workbench/parts/url/electron-browser/url.contribution.i18n.json b/i18n/chs/src/vs/workbench/parts/url/electron-browser/url.contribution.i18n.json new file mode 100644 index 00000000000..7e8fa2b4d60 --- /dev/null +++ b/i18n/chs/src/vs/workbench/parts/url/electron-browser/url.contribution.i18n.json @@ -0,0 +1,11 @@ +{ + "": [ + "--------------------------------------------------------------------------------------------", + "Copyright (c) Microsoft Corporation. All rights reserved.", + "Licensed under the MIT License. See License.txt in the project root for license information.", + "--------------------------------------------------------------------------------------------", + "Do not edit this file. It is machine generated." + ], + "openUrl": "打开 URL", + "developer": "开发者" +} \ No newline at end of file diff --git a/i18n/chs/src/vs/workbench/parts/welcome/page/electron-browser/vs_code_welcome_page.i18n.json b/i18n/chs/src/vs/workbench/parts/welcome/page/electron-browser/vs_code_welcome_page.i18n.json index ce47605351f..e799257937a 100644 --- a/i18n/chs/src/vs/workbench/parts/welcome/page/electron-browser/vs_code_welcome_page.i18n.json +++ b/i18n/chs/src/vs/workbench/parts/welcome/page/electron-browser/vs_code_welcome_page.i18n.json @@ -27,7 +27,7 @@ "welcomePage.installExtensionPacks": "工具和语言", "welcomePage.installExtensionPacksDescription": "安装对 {0} 和 {1} 的支持", "welcomePage.moreExtensions": "更多", - "welcomePage.installKeymapDescription": "设置与按键绑定", + "welcomePage.installKeymapDescription": "设置和按键绑定", "welcomePage.installKeymapExtension": "安装 {0} 和 {1} 的设置和快捷键", "welcomePage.others": "其他", "welcomePage.colorTheme": "颜色主题", diff --git a/i18n/chs/src/vs/workbench/parts/welcome/page/electron-browser/welcomePage.i18n.json b/i18n/chs/src/vs/workbench/parts/welcome/page/electron-browser/welcomePage.i18n.json index e18e52f51ad..a4d5faf6286 100644 --- a/i18n/chs/src/vs/workbench/parts/welcome/page/electron-browser/welcomePage.i18n.json +++ b/i18n/chs/src/vs/workbench/parts/welcome/page/electron-browser/welcomePage.i18n.json @@ -28,9 +28,9 @@ "welcome.title": "欢迎使用", "welcomePage.openFolderWithPath": "打开路径为 {1} 的文件夹 {0}", "welcomePage.extensionListSeparator": "、", - "welcomePage.installKeymap": "安装 {0} 键映射", + "welcomePage.installKeymap": "安装 {0} 按键映射", "welcomePage.installExtensionPack": "安装对 {0} 的额外支持", - "welcomePage.installedKeymap": "已安装 {0} 键映射", + "welcomePage.installedKeymap": "已安装 {0} 按键映射", "welcomePage.installedExtensionPack": "已安装 {0} 支持", "ok": "确定", "details": "详细信息", diff --git a/i18n/chs/src/vs/workbench/services/configurationResolver/node/variableResolver.i18n.json b/i18n/chs/src/vs/workbench/services/configurationResolver/node/variableResolver.i18n.json new file mode 100644 index 00000000000..9742dac3db3 --- /dev/null +++ b/i18n/chs/src/vs/workbench/services/configurationResolver/node/variableResolver.i18n.json @@ -0,0 +1,20 @@ +{ + "": [ + "--------------------------------------------------------------------------------------------", + "Copyright (c) Microsoft Corporation. All rights reserved.", + "Licensed under the MIT License. See License.txt in the project root for license information.", + "--------------------------------------------------------------------------------------------", + "Do not edit this file. It is machine generated." + ], + "missingEnvVarName": "未给出环境变量名称,因此无法解析“{0}”。", + "configNotFound": "未能找到设置“{1}”,因此无法解析“{0}”。", + "configNoString": "“{1}”为结构类型值,因此无法解析“{0}”。", + "missingConfigName": "未给出设置名称,因此无法解析“{0}”。", + "noValueForCommand": "命令不含值,因此无法解析“{0}”。", + "canNotFindFolder": "找不到文件夹“{1}”,因此无法解析“{0}”。", + "canNotResolveWorkspaceFolderMultiRoot": "无法在多文件夹工作区中解析“{0}”。使用 \":\" 和工作区文件夹名称来限定此变量的作用域。", + "canNotResolveWorkspaceFolder": "无法解析“{0}”。请打开一个文件夹。", + "canNotResolveFile": "无法解析“{0}”。请打开一个编辑器。", + "canNotResolveLineNumber": "无法解析“{0}”。请确保已在活动编辑器中选择一行内容。", + "canNotResolveSelectedText": "无法解析“{0}”。请确保已在活动编辑器中选择一些文字。" +} \ No newline at end of file diff --git a/i18n/chs/src/vs/workbench/services/files/electron-browser/remoteFileService.i18n.json b/i18n/chs/src/vs/workbench/services/files/electron-browser/remoteFileService.i18n.json index 9cc3a9437e2..c87de21c8fa 100644 --- a/i18n/chs/src/vs/workbench/services/files/electron-browser/remoteFileService.i18n.json +++ b/i18n/chs/src/vs/workbench/services/files/electron-browser/remoteFileService.i18n.json @@ -9,5 +9,6 @@ "fileNotFoundError": "找不到文件({0})", "fileIsDirectoryError": "文件是目录", "fileNotModifiedError": "自以下时间未修改的文件:", - "fileBinaryError": "文件似乎是二进制文件,无法作为文档打开" + "fileBinaryError": "文件似乎是二进制文件,无法作为文档打开", + "err.create": "未能创建文件 {0}" } \ No newline at end of file diff --git a/i18n/cht/extensions/npm/out/npmView.i18n.json b/i18n/cht/extensions/npm/out/npmView.i18n.json new file mode 100644 index 00000000000..35229bd6699 --- /dev/null +++ b/i18n/cht/extensions/npm/out/npmView.i18n.json @@ -0,0 +1,9 @@ +{ + "": [ + "--------------------------------------------------------------------------------------------", + "Copyright (c) Microsoft Corporation. All rights reserved.", + "Licensed under the MIT License. See License.txt in the project root for license information.", + "--------------------------------------------------------------------------------------------", + "Do not edit this file. It is machine generated." + ] +} \ No newline at end of file diff --git a/i18n/cht/extensions/npm/out/tasks.i18n.json b/i18n/cht/extensions/npm/out/tasks.i18n.json new file mode 100644 index 00000000000..f0e654540ce --- /dev/null +++ b/i18n/cht/extensions/npm/out/tasks.i18n.json @@ -0,0 +1,10 @@ +{ + "": [ + "--------------------------------------------------------------------------------------------", + "Copyright (c) Microsoft Corporation. All rights reserved.", + "Licensed under the MIT License. See License.txt in the project root for license information.", + "--------------------------------------------------------------------------------------------", + "Do not edit this file. It is machine generated." + ], + "npm.parseError": "Npm 工作刪除: 解析檔案 {0} 失敗" +} \ No newline at end of file diff --git a/i18n/cht/extensions/npm/package.i18n.json b/i18n/cht/extensions/npm/package.i18n.json index 0f02eca2d43..4ffedea8e58 100644 --- a/i18n/cht/extensions/npm/package.i18n.json +++ b/i18n/cht/extensions/npm/package.i18n.json @@ -14,5 +14,8 @@ "config.npm.exclude": "為應從自動指令碼偵測排除的資料夾設定 Glob 模式。", "npm.parseError": "Npm 工作刪除: 解析檔案 {0} 失敗", "taskdef.script": "要自訂的 npm 指令碼。", - "taskdef.path": "提供指令碼之 package.json 檔案的資料夾路徑。可以省略。" + "taskdef.path": "提供指令碼之 package.json 檔案的資料夾路徑。可以省略。", + "command.refresh": "重新整理", + "command.debug": "偵錯", + "command.openScript": "開啟" } \ No newline at end of file diff --git a/i18n/cht/src/vs/code/electron-browser/issue/issueReporterMain.i18n.json b/i18n/cht/src/vs/code/electron-browser/issue/issueReporterMain.i18n.json index b51abfd46f9..fa03418d628 100644 --- a/i18n/cht/src/vs/code/electron-browser/issue/issueReporterMain.i18n.json +++ b/i18n/cht/src/vs/code/electron-browser/issue/issueReporterMain.i18n.json @@ -12,6 +12,7 @@ "similarIssues": "相似的問題", "open": "開啟", "closed": "已關閉", + "noSimilarIssues": "未發現相似的問題", "settingsSearchIssue": "設定值搜尋問題", "bugReporter": "臭蟲回報", "featureRequest": "功能要求", diff --git a/i18n/cht/src/vs/code/electron-browser/issue/issueReporterPage.i18n.json b/i18n/cht/src/vs/code/electron-browser/issue/issueReporterPage.i18n.json index a03e5ae0f53..17f3a9f8d2c 100644 --- a/i18n/cht/src/vs/code/electron-browser/issue/issueReporterPage.i18n.json +++ b/i18n/cht/src/vs/code/electron-browser/issue/issueReporterPage.i18n.json @@ -9,6 +9,8 @@ "completeInEnglish": "請用英語填寫這張表格。", "issueTypeLabel": "這是一個", "vscode": "Visual Studio Code", + "extension": "擴充功能", + "disableExtensionsLabelText": "嘗試在 {0} 之後重現問題。如果問題僅在使用中的擴充功能時重現,則可能是擴充功能的問題。", "disableExtensions": "停用所有延伸模組並重新載入視窗", "chooseExtension": "擴充功能", "issueTitleLabel": "標題", diff --git a/i18n/cht/src/vs/code/electron-browser/processExplorer/processExplorerMain.i18n.json b/i18n/cht/src/vs/code/electron-browser/processExplorer/processExplorerMain.i18n.json index 5ad17302606..00f7c8ffb1d 100644 --- a/i18n/cht/src/vs/code/electron-browser/processExplorer/processExplorerMain.i18n.json +++ b/i18n/cht/src/vs/code/electron-browser/processExplorer/processExplorerMain.i18n.json @@ -6,6 +6,9 @@ "--------------------------------------------------------------------------------------------", "Do not edit this file. It is machine generated." ], + "cpu": "CPU %", + "memory": "記憶體 (MB)", + "pid": "pid", "name": "名稱", "killProcess": "關閉處理序", "forceKillProcess": "強制關閉處理序" diff --git a/i18n/cht/src/vs/code/electron-main/menus.i18n.json b/i18n/cht/src/vs/code/electron-main/menus.i18n.json index a0a1e927719..f8df21acfda 100644 --- a/i18n/cht/src/vs/code/electron-main/menus.i18n.json +++ b/i18n/cht/src/vs/code/electron-main/menus.i18n.json @@ -161,6 +161,7 @@ "mMergeAllWindows": "合併所有視窗", "miToggleDevTools": "切換開發人員工具(&&T)", "miAccessibilityOptions": "協助工具選項(&&O)", + "miOpenProcessExplorerer": "開啟處理序總管 (&&P)", "miReportIssue": "回報問題 (&&I)", "miWelcome": "歡迎使用(&&W)", "miInteractivePlayground": "Interactive Playground(&&I)", diff --git a/i18n/cht/src/vs/editor/common/config/commonEditorConfig.i18n.json b/i18n/cht/src/vs/editor/common/config/commonEditorConfig.i18n.json index 1ffb558df45..24534faf582 100644 --- a/i18n/cht/src/vs/editor/common/config/commonEditorConfig.i18n.json +++ b/i18n/cht/src/vs/editor/common/config/commonEditorConfig.i18n.json @@ -16,7 +16,6 @@ "lineNumbers.on": "行號以絕對值顯示。", "lineNumbers.relative": "行號以目前游標的相對值顯示。", "lineNumbers.interval": "每 10 行顯示行號。", - "lineNumbers": "控制行號的顯示方式。允許的設定值為 'on'、 'off'、'relative' 及 'interval'", "rulers": "在特定的等寬字元數之後轉譯垂直尺規。有多個尺規就使用多個值。若陣列為空,則不繪製任何尺規。", "wordSeparators": "執行文字相關導覽或作業時將作為文字分隔符號的字元", "tabSize": "與 Tab 相等的空格數量。當 `editor.detectIndentation` 已開啟時,會根據檔案內容覆寫此設定。", @@ -28,8 +27,7 @@ "scrollBeyondLastLine": "控制編輯器是否會捲動到最後一行之後", "smoothScrolling": "控制編輯器是否會使用動畫捲動", "minimap.enabled": "控制是否會顯示迷你地圖", - "minimap.side": "控制要轉譯迷你地圖的方向。可能的值為 'right' 與 'left'", - "minimap.showSlider": "控制是否會自動隱藏迷你地圖滑桿。可能的值為 'always' 與 'mouseover'", + "minimap.showSlider": "自動隱藏迷你地圖滑桿", "minimap.renderCharacters": "呈現行內的實際字元 (而不是彩色區塊)", "minimap.maxColumn": "限制迷你地圖的寬度,以呈現最多的資料行", "find.seedSearchStringFromSelection": "控制編譯器選取範圍是否預設為尋找工具的搜尋字串", @@ -77,7 +75,6 @@ "occurrencesHighlight": "控制編輯器是否應反白顯示出現的語意符號", "overviewRulerLanes": "控制可在概觀尺規中相同位置顯示的裝飾項目數", "overviewRulerBorder": "控制是否應在概觀尺規周圍繪製邊框。", - "cursorBlinking": "控制游標動畫樣式,可能的值為 'blink'、'smooth'、'phase'、'expand' 和 'solid'", "mouseWheelZoom": "使用滑鼠滾輪並按住 Ctrl 時,縮放編輯器的字型", "cursorStyle": "控制游標樣式。接受的值為 'block'、'block-outline'、'line'、'line-thin'、'underline' 及 'underline-thin'", "cursorWidth": "控制游標寬度,當 editor.cursorStyle 設定為 'line' 時。", @@ -87,7 +84,6 @@ "renderControlCharacters": "控制編輯器是否應顯示控制字元", "renderIndentGuides": "控制編輯器是否應顯示縮排輔助線", "renderLineHighlight": "控制編輯器應如何轉譯目前反白的行,可能的值有 'none'、'gutter'、'line' 和 'all'。", - "codeLens": "控制編輯器是否顯示程式碼濾鏡", "folding": "控制編輯器是否已啟用程式碼摺疊功能", "showFoldingControls": "自動隱藏摺疊控制向", "matchBrackets": "當選取某側的括號時,強調顯示另一側的配對括號。", diff --git a/i18n/cht/src/vs/editor/contrib/codeAction/codeActionCommands.i18n.json b/i18n/cht/src/vs/editor/contrib/codeAction/codeActionCommands.i18n.json index 7a628e7ee2b..0852f2e6e0b 100644 --- a/i18n/cht/src/vs/editor/contrib/codeAction/codeActionCommands.i18n.json +++ b/i18n/cht/src/vs/editor/contrib/codeAction/codeActionCommands.i18n.json @@ -8,5 +8,11 @@ ], "quickFixWithKb": "顯示修正 ({0})", "quickFix": "顯示修正", + "quickfix.trigger.label": "快速修復...", + "editor.action.quickFix.noneMessage": "沒有可用的程式碼操作", + "refactor.label": "重構...", + "editor.action.refactor.noneMessage": "沒有可用的重構", + "source.label": "來源動作...", + "editor.action.source.noneMessage": "沒有可用的來源動作", "organizeImports.label": "組織匯入" } \ No newline at end of file diff --git a/i18n/cht/src/vs/editor/contrib/find/findController.i18n.json b/i18n/cht/src/vs/editor/contrib/find/findController.i18n.json index 43275e24096..204b3af146d 100644 --- a/i18n/cht/src/vs/editor/contrib/find/findController.i18n.json +++ b/i18n/cht/src/vs/editor/contrib/find/findController.i18n.json @@ -7,6 +7,7 @@ "Do not edit this file. It is machine generated." ], "startFindAction": "尋找", + "startFindWithSelectionAction": "尋找選取項目", "findNextMatchAction": "尋找下一個", "findPreviousMatchAction": "尋找上一個", "nextSelectionMatchFindAction": "尋找下一個選取項目", diff --git a/i18n/cht/src/vs/editor/contrib/format/formatActions.i18n.json b/i18n/cht/src/vs/editor/contrib/format/formatActions.i18n.json index b6a36665220..16fb9e10b1a 100644 --- a/i18n/cht/src/vs/editor/contrib/format/formatActions.i18n.json +++ b/i18n/cht/src/vs/editor/contrib/format/formatActions.i18n.json @@ -12,5 +12,7 @@ "hintnn": "在行 {1} 與行 {2} 之間編輯了 {0} 項格式", "no.provider": "尚無安裝適用於 '{0}' 檔案的格式器", "formatDocument.label": "將文件格式化", - "formatSelection.label": "將選取項目格式化" + "no.documentprovider": "未安裝 '{0}' 檔案的文件格式器。", + "formatSelection.label": "將選取項目格式化", + "no.selectionprovider": "未安裝 '{0}' 檔案的選擇格式器。" } \ No newline at end of file diff --git a/i18n/cht/src/vs/editor/contrib/message/messageController.i18n.json b/i18n/cht/src/vs/editor/contrib/message/messageController.i18n.json index 35229bd6699..f6fa676ddd7 100644 --- a/i18n/cht/src/vs/editor/contrib/message/messageController.i18n.json +++ b/i18n/cht/src/vs/editor/contrib/message/messageController.i18n.json @@ -5,5 +5,6 @@ "Licensed under the MIT License. See License.txt in the project root for license information.", "--------------------------------------------------------------------------------------------", "Do not edit this file. It is machine generated." - ] + ], + "editor.readonly": "無法在唯讀編輯器中編輯" } \ No newline at end of file diff --git a/i18n/cht/src/vs/platform/environment/node/argv.i18n.json b/i18n/cht/src/vs/platform/environment/node/argv.i18n.json index fea1fa5538f..cba85befb07 100644 --- a/i18n/cht/src/vs/platform/environment/node/argv.i18n.json +++ b/i18n/cht/src/vs/platform/environment/node/argv.i18n.json @@ -22,7 +22,6 @@ "showVersions": "使用 --list-extension 時,顯示安裝的擴充功能版本。", "installExtension": "安裝擴充功能。", "uninstallExtension": "解除安裝擴充功能。", - "experimentalApis": "為延伸模組啟用建議的 API 功能。", "verbose": "列印詳細資訊輸出 (表示 --wait)。", "log": "使用的日誌級別。預設為\"訊息\"。允許的值是 \"關鍵\"、\"錯誤\"、\"警告\"、\"訊息\"、\"偵錯\"、\"追蹤\"、\"關閉\"。", "status": "列印進程使用方式和診斷資訊。", diff --git a/i18n/cht/src/vs/platform/theme/common/colorRegistry.i18n.json b/i18n/cht/src/vs/platform/theme/common/colorRegistry.i18n.json index 1633b008b0b..6e1858c0029 100644 --- a/i18n/cht/src/vs/platform/theme/common/colorRegistry.i18n.json +++ b/i18n/cht/src/vs/platform/theme/common/colorRegistry.i18n.json @@ -29,7 +29,6 @@ "inputPlaceholderForeground": "文字輸入替代字符的前景顏色。", "inputValidationInfoBackground": "資訊嚴重性的輸入驗證背景色彩。", "inputValidationInfoBorder": "資訊嚴重性的輸入驗證邊界色彩。", - "inputValidationWarningBackground": "資訊警告的輸入驗證背景色彩。", "inputValidationWarningBorder": "警告嚴重性的輸入驗證邊界色彩。", "inputValidationErrorBackground": "錯誤嚴重性的輸入驗證背景色彩。", "inputValidationErrorBorder": "錯誤嚴重性的輸入驗證邊界色彩。", @@ -71,10 +70,8 @@ "editorSelectionHighlightBorder": "選取時,內容相同之區域的框線色彩。", "editorFindMatch": "符合目前搜尋的色彩。", "findMatchHighlight": "符合搜尋條件的其他項目的顏色。不能使用非透明的顏色來隱藏底層的樣式。", - "findRangeHighlight": "為限制搜索的範圍著色。不能使用非透明的顏色來隱藏底層的樣式。", "editorFindMatchBorder": "符合目前搜尋的框線色彩。", "findMatchHighlightBorder": "符合其他搜尋的框線色彩。", - "findRangeHighlightBorder": "限制搜尋範圍的邊框顏色。不能使用非透明的顏色來隱藏底層的樣式。", "hoverHighlight": "突顯懸停顯示的文字。不能使用非透明的顏色來隱藏底層的樣式。", "hoverBackground": "編輯器動態顯示的背景色彩。", "hoverBorder": "編輯器動態顯示的框線色彩。", @@ -88,7 +85,6 @@ "mergeIncomingHeaderBackground": "傳入內嵌合併衝突中的深色標題背景。不能使用非透明的顏色來隱藏底層的樣式。", "mergeIncomingContentBackground": "傳入內嵌合併衝突中的內容背景。不能使用非透明的顏色來隱藏底層的樣式。", "mergeCommonHeaderBackground": "內嵌合併衝突中的共同始祖標題背景。不能使用非透明的顏色來隱藏底層的樣式。", - "mergeCommonContentBackground": "內嵌合併衝突中的共同始祖內容背景。不能使用非透明的顏色來隱藏底層的樣式。", "mergeBorder": "內嵌合併衝突中標頭及分隔器的邊界色彩。", "overviewRulerCurrentContentForeground": "目前內嵌合併衝突的概觀尺規前景。", "overviewRulerIncomingContentForeground": "傳入內嵌合併衝突的概觀尺規前景。", diff --git a/i18n/cht/src/vs/platform/url/electron-browser/inactiveExtensionUrlHandler.i18n.json b/i18n/cht/src/vs/platform/url/electron-browser/inactiveExtensionUrlHandler.i18n.json new file mode 100644 index 00000000000..35229bd6699 --- /dev/null +++ b/i18n/cht/src/vs/platform/url/electron-browser/inactiveExtensionUrlHandler.i18n.json @@ -0,0 +1,9 @@ +{ + "": [ + "--------------------------------------------------------------------------------------------", + "Copyright (c) Microsoft Corporation. All rights reserved.", + "Licensed under the MIT License. See License.txt in the project root for license information.", + "--------------------------------------------------------------------------------------------", + "Do not edit this file. It is machine generated." + ] +} \ No newline at end of file diff --git a/i18n/cht/src/vs/workbench/api/browser/viewsExtensionPoint.i18n.json b/i18n/cht/src/vs/workbench/api/browser/viewsExtensionPoint.i18n.json index 97fd8a138b1..7113fc08c8b 100644 --- a/i18n/cht/src/vs/workbench/api/browser/viewsExtensionPoint.i18n.json +++ b/i18n/cht/src/vs/workbench/api/browser/viewsExtensionPoint.i18n.json @@ -13,8 +13,6 @@ "vscode.extension.contributes.view.name": "使用人性化顯示名稱.", "vscode.extension.contributes.view.when": "必須為 true 以顯示此檢視的條件", "vscode.extension.contributes.views": "提供意見給編輯者", - "views.explorer": "檔案總管檢視", - "views.debug": "偵錯檢視", "duplicateView1": "無法在位置 '{1}' 使用相同的識別碼 '{0}' 註冊多個檢視", "duplicateView2": "識別碼為 '{0}' 的檢視已在位置 '{1}' 註冊" } \ No newline at end of file diff --git a/i18n/cht/src/vs/workbench/api/electron-browser/mainThreadWebview.i18n.json b/i18n/cht/src/vs/workbench/api/electron-browser/mainThreadWebview.i18n.json index 35229bd6699..55b794aa4c0 100644 --- a/i18n/cht/src/vs/workbench/api/electron-browser/mainThreadWebview.i18n.json +++ b/i18n/cht/src/vs/workbench/api/electron-browser/mainThreadWebview.i18n.json @@ -5,5 +5,6 @@ "Licensed under the MIT License. See License.txt in the project root for license information.", "--------------------------------------------------------------------------------------------", "Do not edit this file. It is machine generated." - ] + ], + "errorMessage": "還原 view:{0} 時發生錯誤" } \ No newline at end of file diff --git a/i18n/cht/src/vs/workbench/browser/parts/editor/editorStatus.i18n.json b/i18n/cht/src/vs/workbench/browser/parts/editor/editorStatus.i18n.json index 7dc8700e978..e388b64bded 100644 --- a/i18n/cht/src/vs/workbench/browser/parts/editor/editorStatus.i18n.json +++ b/i18n/cht/src/vs/workbench/browser/parts/editor/editorStatus.i18n.json @@ -17,6 +17,7 @@ "screenReaderDetectedExtra": "若您不打算使用螢幕助讀程式,請將設定 `editor.accessibilitySupport` 變更為 \"off\"。", "disableTabMode": "停用協助工具模式", "gotoLine": "移至行", + "selectIndentation": "選擇縮排", "selectEncoding": "選取編碼", "selectEOL": "選取行尾順序", "selectLanguageMode": "選取語言模式", diff --git a/i18n/cht/src/vs/workbench/browser/parts/editor/resourceViewer.i18n.json b/i18n/cht/src/vs/workbench/browser/parts/editor/resourceViewer.i18n.json index 3c1c3df6d55..bf4efe8a202 100644 --- a/i18n/cht/src/vs/workbench/browser/parts/editor/resourceViewer.i18n.json +++ b/i18n/cht/src/vs/workbench/browser/parts/editor/resourceViewer.i18n.json @@ -12,6 +12,7 @@ "sizeGB": "{0}GB", "sizeTB": "{0}TB", "resourceOpenExternalButton": "要使用外部程式打開影像嗎?", + "openAsText": "是否確定要開啟?", "zoom.action.fit.label": "整個影像", "imgMeta": "{0}x{1} {2}" } \ No newline at end of file diff --git a/i18n/cht/src/vs/workbench/browser/parts/quickinput/quickInput.i18n.json b/i18n/cht/src/vs/workbench/browser/parts/quickinput/quickInput.i18n.json index e7e11a078b1..34f0faed819 100644 --- a/i18n/cht/src/vs/workbench/browser/parts/quickinput/quickInput.i18n.json +++ b/i18n/cht/src/vs/workbench/browser/parts/quickinput/quickInput.i18n.json @@ -6,5 +6,8 @@ "--------------------------------------------------------------------------------------------", "Do not edit this file. It is machine generated." ], + "inputModeEntryDescription": "{0} (按 'Enter' 鍵確認或按 'Esc' 鍵取消)", + "inputModeEntry": "按 'Enter' 鍵確認您的輸入或按 'Esc' 鍵取消", + "quickInput.countSelected": "已選擇 {0}", "ok": "確定" } \ No newline at end of file diff --git a/i18n/cht/src/vs/workbench/browser/parts/quickinput/quickInputBox.i18n.json b/i18n/cht/src/vs/workbench/browser/parts/quickinput/quickInputBox.i18n.json index 35229bd6699..28e300993c3 100644 --- a/i18n/cht/src/vs/workbench/browser/parts/quickinput/quickInputBox.i18n.json +++ b/i18n/cht/src/vs/workbench/browser/parts/quickinput/quickInputBox.i18n.json @@ -5,5 +5,6 @@ "Licensed under the MIT License. See License.txt in the project root for license information.", "--------------------------------------------------------------------------------------------", "Do not edit this file. It is machine generated." - ] + ], + "quickInputBox.ariaLabel": "輸入以縮小結果範圍。" } \ No newline at end of file diff --git a/i18n/cht/src/vs/workbench/electron-browser/actions.i18n.json b/i18n/cht/src/vs/workbench/electron-browser/actions.i18n.json index f55037e4c3b..8c04c44fd8a 100644 --- a/i18n/cht/src/vs/workbench/electron-browser/actions.i18n.json +++ b/i18n/cht/src/vs/workbench/electron-browser/actions.i18n.json @@ -32,6 +32,7 @@ "openRecent": "開啟最近使用的檔案...", "quickOpenRecent": "快速開啟最近使用的檔案...", "reportIssueInEnglish": "回報問題", + "openProcessExplorer": "開啟處理序總管", "reportPerformanceIssue": "回報效能問題", "keybindingsReference": "鍵盤快速鍵參考", "openDocumentationUrl": "文件", diff --git a/i18n/cht/src/vs/workbench/parts/extensions/electron-browser/extensionsViewlet.i18n.json b/i18n/cht/src/vs/workbench/parts/extensions/electron-browser/extensionsViewlet.i18n.json index 14b49f43b71..6233388a065 100644 --- a/i18n/cht/src/vs/workbench/parts/extensions/electron-browser/extensionsViewlet.i18n.json +++ b/i18n/cht/src/vs/workbench/parts/extensions/electron-browser/extensionsViewlet.i18n.json @@ -14,6 +14,7 @@ "workspaceRecommendedExtensions": "工作區建議", "builtInExtensions": "功能", "builtInThemesExtensions": "主題", + "builtInBasicsExtensions": "程式語言", "searchExtensions": "在 Marketplace 中搜尋擴充功能", "sort by installs": "排序依據: 安裝計數", "sort by rating": "排序依據: 評等", diff --git a/i18n/cht/src/vs/workbench/parts/files/electron-browser/fileActions.i18n.json b/i18n/cht/src/vs/workbench/parts/files/electron-browser/fileActions.i18n.json index 79ad427acdd..d431d7870ce 100644 --- a/i18n/cht/src/vs/workbench/parts/files/electron-browser/fileActions.i18n.json +++ b/i18n/cht/src/vs/workbench/parts/files/electron-browser/fileActions.i18n.json @@ -24,20 +24,20 @@ "dirtyMessageFolderDelete": "您要刪除的資料夾中 {0} 個檔案有未儲存的變更。要繼續嗎?", "dirtyMessageFileDelete": "您要刪除的檔案有未儲存的變更。要繼續嗎?", "dirtyWarning": "如果您不儲存變更,這些變更將會遺失。", - "confirmMoveTrashMessageMultiple": "確定要刪除以下 {0} 個檔案嗎?", - "confirmMoveTrashMessageFolder": "您確定要刪除 '{0}' 及其內容嗎?", - "confirmMoveTrashMessageFile": "您確定要刪除 '{0}' 嗎?", "undoBin": "您可以從資源回收筒還原。", "undoTrash": "您可以從垃圾筒還原。", "doNotAskAgain": "不要再詢問我", - "confirmDeleteMessageMultiple": "確定要永久地刪除以下 {0} 個檔案嗎?", - "confirmDeleteMessageFolder": "您確定要永久刪除 '{0}' 和其中的內容嗎?", - "confirmDeleteMessageFile": "您確定要永久刪除 '{0}' 嗎?", "irreversible": "此動作無法回復!", "binFailed": "無法使用資源回收筒刪除。您要改為永久刪除嗎? ", "trashFailed": "無法使用垃圾筒刪除。您要改為永久刪除嗎?", "deletePermanentlyButtonLabel": "永久刪除(&&D)", "retryButtonLabel": "重試(&&R)", + "confirmMoveTrashMessageMultiple": "確定要刪除以下 {0} 個檔案嗎?", + "confirmMoveTrashMessageFolder": "您確定要刪除 '{0}' 及其內容嗎?", + "confirmMoveTrashMessageFile": "您確定要刪除 '{0}' 嗎?", + "confirmDeleteMessageMultiple": "確定要永久地刪除以下 {0} 個檔案嗎?", + "confirmDeleteMessageFolder": "您確定要永久刪除 '{0}' 和其中的內容嗎?", + "confirmDeleteMessageFile": "您確定要永久刪除 '{0}' 嗎?", "confirmOverwrite": "目的資料夾中已有同名的檔案或資料夾。要取代它嗎?", "replaceButtonLabel": "取代(&&R)", "fileIsAncestor": "要貼上的檔案是在目地資料夾的上層 ", diff --git a/i18n/cht/src/vs/workbench/parts/localizations/electron-browser/localizations.contribution.i18n.json b/i18n/cht/src/vs/workbench/parts/localizations/electron-browser/localizations.contribution.i18n.json new file mode 100644 index 00000000000..f2ac4c2136b --- /dev/null +++ b/i18n/cht/src/vs/workbench/parts/localizations/electron-browser/localizations.contribution.i18n.json @@ -0,0 +1,23 @@ +{ + "": [ + "--------------------------------------------------------------------------------------------", + "Copyright (c) Microsoft Corporation. All rights reserved.", + "Licensed under the MIT License. See License.txt in the project root for license information.", + "--------------------------------------------------------------------------------------------", + "Do not edit this file. It is machine generated." + ], + "updateLocale": "您想要變更 VS Code 的 UI 語言為 {0} 並重新啟動嗎?", + "yes": "是", + "no": "否", + "neverAgain": "不要再顯示", + "install": "安裝", + "JsonSchema.locale": "要使用的 UI 語言。", + "vscode.extension.contributes.localizations": "提供在地化服務給編輯者", + "vscode.extension.contributes.localizations.languageId": "顯示已翻譯字串的語言 Id", + "vscode.extension.contributes.localizations.languageName": "語言名稱 (英文)。", + "vscode.extension.contributes.localizations.languageNameLocalized": "語言名稱 (提供的語言)。", + "vscode.extension.contributes.localizations.translations": "與該語言相關的翻譯列表。", + "vscode.extension.contributes.localizations.translations.id": "此翻譯提供之目標的 VS Code 或延伸模組識別碼。VS Code 的識別碼一律為 `vscode`,且延伸模組的格式應為 `publisherId.extensionName`。", + "vscode.extension.contributes.localizations.translations.id.pattern": "轉譯 VS 程式碼或延伸模組時,識別碼應分別使用 `vscode` 或 `publisherId.extensionName` 的格式。", + "vscode.extension.contributes.localizations.translations.path": "包含語言翻譯的檔案相對路徑。" +} \ No newline at end of file diff --git a/i18n/cht/src/vs/workbench/parts/localizations/electron-browser/localizationsActions.i18n.json b/i18n/cht/src/vs/workbench/parts/localizations/electron-browser/localizationsActions.i18n.json new file mode 100644 index 00000000000..a5e6bfeb6f1 --- /dev/null +++ b/i18n/cht/src/vs/workbench/parts/localizations/electron-browser/localizationsActions.i18n.json @@ -0,0 +1,14 @@ +{ + "": [ + "--------------------------------------------------------------------------------------------", + "Copyright (c) Microsoft Corporation. All rights reserved.", + "Licensed under the MIT License. See License.txt in the project root for license information.", + "--------------------------------------------------------------------------------------------", + "Do not edit this file. It is machine generated." + ], + "configureLocale": "設定語言", + "displayLanguage": "定義 VSCode 的顯示語言。", + "doc": "如需支援的語言清單,請參閱 {0}。", + "restart": "改變設定值後需要重新啟動 VSCode.", + "fail.createSettings": "無法建立 '{0}' ({1})。" +} \ No newline at end of file diff --git a/i18n/cht/src/vs/workbench/parts/markers/electron-browser/markersPanel.i18n.json b/i18n/cht/src/vs/workbench/parts/markers/electron-browser/markersPanel.i18n.json index 35229bd6699..a8abc1bfbac 100644 --- a/i18n/cht/src/vs/workbench/parts/markers/electron-browser/markersPanel.i18n.json +++ b/i18n/cht/src/vs/workbench/parts/markers/electron-browser/markersPanel.i18n.json @@ -5,5 +5,7 @@ "Licensed under the MIT License. See License.txt in the project root for license information.", "--------------------------------------------------------------------------------------------", "Do not edit this file. It is machine generated." - ] + ], + "disableFilesExclude": "停用檔案排除。", + "clearFilter": "清除篩選。" } \ No newline at end of file diff --git a/i18n/cht/src/vs/workbench/parts/markers/electron-browser/messages.i18n.json b/i18n/cht/src/vs/workbench/parts/markers/electron-browser/messages.i18n.json index cc0be28b025..5e31f17aa84 100644 --- a/i18n/cht/src/vs/workbench/parts/markers/electron-browser/messages.i18n.json +++ b/i18n/cht/src/vs/workbench/parts/markers/electron-browser/messages.i18n.json @@ -14,6 +14,9 @@ "markers.panel.title.problems": "問題", "markers.panel.aria.label.problems.tree": "依檔案分組的問題", "markers.panel.no.problems.build": "目前在工作區中未偵測到任何問題。", + "markers.panel.no.problems.filters": "使用提供的篩選準則找不到任何結果。", + "markers.panel.action.useFilesExclude": "使用檔案排除設定進行篩選", + "markers.panel.action.donotUseFilesExclude": "不使用檔案排除設定", "markers.panel.action.filter": "篩選問題", "markers.panel.filter.ariaLabel": "篩選問題", "markers.panel.filter.errors": "錯誤", diff --git a/i18n/cht/src/vs/workbench/parts/search/electron-browser/search.contribution.i18n.json b/i18n/cht/src/vs/workbench/parts/search/electron-browser/search.contribution.i18n.json index 1ab677e6ae2..d9a4412446c 100644 --- a/i18n/cht/src/vs/workbench/parts/search/electron-browser/search.contribution.i18n.json +++ b/i18n/cht/src/vs/workbench/parts/search/electron-browser/search.contribution.i18n.json @@ -10,6 +10,7 @@ "copyMatchLabel": "複製", "copyPathLabel": "複製路徑", "copyAllLabel": "全部複製", + "toggleSearchViewPositionLabel": "切換搜尋檢視位置", "findInFolder": "在資料夾中尋找...", "findInWorkspace": "在工作區中尋找...", "showTriggerActions": "前往工作區中的符號...", @@ -28,5 +29,6 @@ "search.quickOpen.includeSymbols": "設定以將全域符號搜尋的結果納入 Quick Open 的檔案結果中。", "search.followSymlinks": "控制是否要在搜尋時遵循 symlink。", "search.smartCase": "如果搜尋式為全部小寫,則用不分大小寫的搜尋,否則用分大小寫的搜尋", - "search.globalFindClipboard": "控制搜尋檢視是否應讀取或修改 macOS 上的共用尋找剪貼簿 (shared find clipboard)" + "search.globalFindClipboard": "控制搜尋檢視是否應讀取或修改 macOS 上的共用尋找剪貼簿 (shared find clipboard)", + "search.location": "控制搜尋是否在資訊看板會顯示為檢視,或為了更多水平空間,以面板方式在面板區域顯示。下個版本在面板上的搜尋將具有更好的水平版面配置,而此項目將不再處於預覽階段。" } \ No newline at end of file diff --git a/i18n/cht/src/vs/workbench/parts/tasks/electron-browser/task.contribution.i18n.json b/i18n/cht/src/vs/workbench/parts/tasks/electron-browser/task.contribution.i18n.json index 06b20143d00..a13d5229d23 100644 --- a/i18n/cht/src/vs/workbench/parts/tasks/electron-browser/task.contribution.i18n.json +++ b/i18n/cht/src/vs/workbench/parts/tasks/electron-browser/task.contribution.i18n.json @@ -31,6 +31,8 @@ "selectProblemMatcher": "選取錯誤和警告的種類以掃描工作輸出", "customizeParseErrors": "當前的工作組態存在錯誤.請更正錯誤再執行工作.", "moreThanOneBuildTask": "定義了很多建置工作於tasks.json.執行第一個.", + "TaskSystem.activeSame.background": "工作 '{0}' 已在使用中並且處於背景模式。", + "TaskSystem.activeSame.noBackground": "工作 '{0}' 已在使用中。", "terminateTask": "終止工作", "restartTask": "重新啟動工作", "TaskSystem.active": "已有工作在執行。請先終止該工作,然後再執行其他工作。", diff --git a/i18n/cht/src/vs/workbench/parts/terminal/electron-browser/terminalActions.i18n.json b/i18n/cht/src/vs/workbench/parts/terminal/electron-browser/terminalActions.i18n.json index 5ca89988fe2..4d4ea71717f 100644 --- a/i18n/cht/src/vs/workbench/parts/terminal/electron-browser/terminalActions.i18n.json +++ b/i18n/cht/src/vs/workbench/parts/terminal/electron-browser/terminalActions.i18n.json @@ -21,6 +21,7 @@ "workbench.action.terminal.newWorkspacePlaceholder": "為新的終端機選擇目前的工作目錄", "workbench.action.terminal.newInActiveWorkspace": "建立新的整合式終端機 (於目前工作區)", "workbench.action.terminal.split": "分割終端機", + "workbench.action.terminal.splitInActiveWorkspace": "分割終端機 (於使用中的工作區)", "workbench.action.terminal.focusPreviousPane": "聚焦上一個窗格", "workbench.action.terminal.focusNextPane": "聚焦下一個窗格", "workbench.action.terminal.resizePaneLeft": "調整窗格左側", diff --git a/i18n/cht/src/vs/workbench/parts/update/electron-browser/update.i18n.json b/i18n/cht/src/vs/workbench/parts/update/electron-browser/update.i18n.json index bc2c29afc58..d6df33a190e 100644 --- a/i18n/cht/src/vs/workbench/parts/update/electron-browser/update.i18n.json +++ b/i18n/cht/src/vs/workbench/parts/update/electron-browser/update.i18n.json @@ -18,8 +18,10 @@ "thereIsUpdateAvailable": "已有更新可用。", "download now": "立即下載", "later": "稍後", + "updateAvailable": "已有可用的更新:{0} {1}", "installUpdate": "安裝更新", "updateInstalling": "{0} {1} 正在背景執行安裝,完成後我們會通知您。", + "updateAvailableAfterRestart": "重啟 {0} 以套用最新的更新。", "updateNow": "立即更新", "commandPalette": "命令選擇區...", "settings": "設定", diff --git a/i18n/cht/src/vs/workbench/parts/url/electron-browser/url.contribution.i18n.json b/i18n/cht/src/vs/workbench/parts/url/electron-browser/url.contribution.i18n.json new file mode 100644 index 00000000000..8e9c4235dcd --- /dev/null +++ b/i18n/cht/src/vs/workbench/parts/url/electron-browser/url.contribution.i18n.json @@ -0,0 +1,10 @@ +{ + "": [ + "--------------------------------------------------------------------------------------------", + "Copyright (c) Microsoft Corporation. All rights reserved.", + "Licensed under the MIT License. See License.txt in the project root for license information.", + "--------------------------------------------------------------------------------------------", + "Do not edit this file. It is machine generated." + ], + "developer": "開發人員" +} \ No newline at end of file diff --git a/i18n/cht/src/vs/workbench/parts/welcome/overlay/browser/welcomeOverlay.i18n.json b/i18n/cht/src/vs/workbench/parts/welcome/overlay/browser/welcomeOverlay.i18n.json index b0060547934..4167cd11d5f 100644 --- a/i18n/cht/src/vs/workbench/parts/welcome/overlay/browser/welcomeOverlay.i18n.json +++ b/i18n/cht/src/vs/workbench/parts/welcome/overlay/browser/welcomeOverlay.i18n.json @@ -13,6 +13,7 @@ "welcomeOverlay.extensions": "管理延伸模組", "welcomeOverlay.problems": "檢視錯誤和警告", "welcomeOverlay.commandPalette": "尋找及執行所有命令", + "welcomeOverlay.notifications": "顯示通知", "welcomeOverlay": "使用者介面概觀", "hideWelcomeOverlay": "隱藏介面概觀", "help": "說明" diff --git a/i18n/cht/src/vs/workbench/parts/welcome/page/electron-browser/vs_code_welcome_page.i18n.json b/i18n/cht/src/vs/workbench/parts/welcome/page/electron-browser/vs_code_welcome_page.i18n.json index c1ac321018a..bdcaab4106d 100644 --- a/i18n/cht/src/vs/workbench/parts/welcome/page/electron-browser/vs_code_welcome_page.i18n.json +++ b/i18n/cht/src/vs/workbench/parts/welcome/page/electron-browser/vs_code_welcome_page.i18n.json @@ -27,6 +27,8 @@ "welcomePage.installExtensionPacks": "工具與語言", "welcomePage.installExtensionPacksDescription": "安裝{0}與{1}的支援功能。", "welcomePage.moreExtensions": "更多", + "welcomePage.installKeymapDescription": "設定及按鍵對應", + "welcomePage.installKeymapExtension": "安裝 {0} 和 {1} 的設定及鍵盤快速鍵", "welcomePage.others": "其他", "welcomePage.colorTheme": "彩色佈景主題", "welcomePage.colorThemeDescription": "將編輯器及您的程式碼設定成您喜愛的外觀", diff --git a/i18n/cht/src/vs/workbench/services/configuration/common/configurationExtensionPoint.i18n.json b/i18n/cht/src/vs/workbench/services/configuration/common/configurationExtensionPoint.i18n.json index b267af20f42..5638af899f8 100644 --- a/i18n/cht/src/vs/workbench/services/configuration/common/configurationExtensionPoint.i18n.json +++ b/i18n/cht/src/vs/workbench/services/configuration/common/configurationExtensionPoint.i18n.json @@ -8,6 +8,7 @@ ], "vscode.extension.contributes.configuration.title": "設定的摘要。此標籤將會在設定檔中作為分隔註解使用。", "vscode.extension.contributes.configuration.properties": "組態屬性的描述。", + "scope.application.description": "應用程式特定設置,只能在使用者設定中進行設置。", "scope.window.description": "視窗特定組態,可在使用者或工作區設定中予以設定。", "scope.resource.description": "資源特定設定,可在使用者、工作區或資料夾設定中予以設定。", "scope.description": "組態適用的範圍。可用的範圍為「視窗」和「資源」。", diff --git a/i18n/cht/src/vs/workbench/services/configuration/node/configurationEditingService.i18n.json b/i18n/cht/src/vs/workbench/services/configuration/node/configurationEditingService.i18n.json index bc7974eeca9..d8a57b177d1 100644 --- a/i18n/cht/src/vs/workbench/services/configuration/node/configurationEditingService.i18n.json +++ b/i18n/cht/src/vs/workbench/services/configuration/node/configurationEditingService.i18n.json @@ -11,6 +11,7 @@ "open": "開啟設定", "saveAndRetry": "儲存並重試", "errorUnknownKey": "因為 {1} 非已註冊的組態,所以無法寫入至 {0}。", + "errorInvalidWorkspaceConfigurationApplication": "無法寫入 {0} 至工作區設定。此設定只能寫入使用者設定中。", "errorInvalidFolderConfiguration": "因為 {0} 不支援資料夾資源範圍,所以無法寫入至資料夾設定。", "errorInvalidUserTarget": "因為 {0} 不支援全域範圍,所以無法寫入至使用者設定。", "errorInvalidWorkspaceTarget": "因為 {0} 不支援多資料夾工作區中使用工作區範圍,所以無法寫入工作區設定。", diff --git a/i18n/cht/src/vs/workbench/services/configuration/node/configurationService.i18n.json b/i18n/cht/src/vs/workbench/services/configuration/node/configurationService.i18n.json index b292db4923f..98e383c286e 100644 --- a/i18n/cht/src/vs/workbench/services/configuration/node/configurationService.i18n.json +++ b/i18n/cht/src/vs/workbench/services/configuration/node/configurationService.i18n.json @@ -6,5 +6,6 @@ "--------------------------------------------------------------------------------------------", "Do not edit this file. It is machine generated." ], + "unsupportedApplicationSetting": "此設定只能在使用者設定中套用", "unsupportedWindowSetting": "目前無法套用此設定。要在您直接開啟此資料夾時才會套用。" } \ No newline at end of file diff --git a/i18n/cht/src/vs/workbench/services/configurationResolver/node/variableResolver.i18n.json b/i18n/cht/src/vs/workbench/services/configurationResolver/node/variableResolver.i18n.json new file mode 100644 index 00000000000..35229bd6699 --- /dev/null +++ b/i18n/cht/src/vs/workbench/services/configurationResolver/node/variableResolver.i18n.json @@ -0,0 +1,9 @@ +{ + "": [ + "--------------------------------------------------------------------------------------------", + "Copyright (c) Microsoft Corporation. All rights reserved.", + "Licensed under the MIT License. See License.txt in the project root for license information.", + "--------------------------------------------------------------------------------------------", + "Do not edit this file. It is machine generated." + ] +} \ No newline at end of file diff --git a/i18n/cht/src/vs/workbench/services/extensions/common/extensionsRegistry.i18n.json b/i18n/cht/src/vs/workbench/services/extensions/common/extensionsRegistry.i18n.json index b25bfc89872..573550a7a6f 100644 --- a/i18n/cht/src/vs/workbench/services/extensions/common/extensionsRegistry.i18n.json +++ b/i18n/cht/src/vs/workbench/services/extensions/common/extensionsRegistry.i18n.json @@ -6,10 +6,12 @@ "--------------------------------------------------------------------------------------------", "Do not edit this file. It is machine generated." ], + "vscode.extension.engines": "引擎相容性。", "vscode.extension.engines.vscode": "若是 VS Code 延伸模組,則指定與延伸模組相容的 VS Code 版本。不得為 *。例如: ^0.10.5 表示與最低 VS Code 版本 0.10.5 相容。", "vscode.extension.publisher": "VS Code 擴充功能的發行者。", "vscode.extension.displayName": "VS Code 資源庫中使用的擴充功能顯示名稱。", "vscode.extension.categories": "VS Code 資源庫用來將擴充功能歸類的分類。", + "vscode.extension.category.languages.deprecated": "使用 '程式語言' 代替", "vscode.extension.galleryBanner": "用於 VS Code Marketplace 的橫幅。", "vscode.extension.galleryBanner.color": "VS Code Marketplace 頁首的橫幅色彩。", "vscode.extension.galleryBanner.theme": "橫幅中使用的字型色彩佈景主題。", @@ -28,6 +30,8 @@ "vscode.extension.badges.url": "徽章映像 URL。", "vscode.extension.badges.href": "徽章連結。", "vscode.extension.badges.description": "徽章描述。", + "vscode.extension.markdown": "控制使用市集中的 Markdown 轉譯引擎。可為 github (預設) 或標準。", + "vscode.extension.qna": "控制市集中 Q & A 的連結。設定為 marketplace 來啟用預設市集 Q & A 網站。設定字串以提供自訂的 Q & A 網站 URL。設定為 false 則禁用 Q & A。", "vscode.extension.extensionDependencies": "其它擴充功能的相依性。擴充功能的識別碼一律為 ${publisher}.${name}。例如: vscode.csharp。", "vscode.extension.scripts.prepublish": "在封裝作為 VS Code 擴充功能發行前所執行的指令碼。", "vscode.extension.scripts.uninstall": "VS Code 延伸模組的解除安裝勾點。當延伸模組完全從 VS Code 解除安裝時,會在延伸模組解除安裝並重新啟動 (關機並啟動) 時執行的程式碼。僅支援 Node 指令碼。", diff --git a/i18n/cht/src/vs/workbench/services/extensions/electron-browser/extensionService.i18n.json b/i18n/cht/src/vs/workbench/services/extensions/electron-browser/extensionService.i18n.json index 4d5641feb37..1b176d67b9e 100644 --- a/i18n/cht/src/vs/workbench/services/extensions/electron-browser/extensionService.i18n.json +++ b/i18n/cht/src/vs/workbench/services/extensions/electron-browser/extensionService.i18n.json @@ -6,8 +6,10 @@ "--------------------------------------------------------------------------------------------", "Do not edit this file. It is machine generated." ], + "extensionsDisabled": "所有擴充功能已停用。", "extensionHostProcess.crash": "延伸主機意外終止。", "extensionHostProcess.unresponsiveCrash": "因為延伸主機沒有回應,所以意外終止。", + "devTools": "開啟開發人員工具", "restart": "重新啟動延伸主機", "overwritingExtension": "正在以 {1} 覆寫延伸模組 {0}。", "extensionUnderDevelopment": "正在載入位於 {0} 的開發延伸模組", diff --git a/i18n/cht/src/vs/workbench/services/files/electron-browser/fileService.i18n.json b/i18n/cht/src/vs/workbench/services/files/electron-browser/fileService.i18n.json index 5f4414cf665..fc04da73b94 100644 --- a/i18n/cht/src/vs/workbench/services/files/electron-browser/fileService.i18n.json +++ b/i18n/cht/src/vs/workbench/services/files/electron-browser/fileService.i18n.json @@ -14,6 +14,7 @@ "fileInvalidPath": "檔案資源 ({0}) 無效", "fileIsDirectoryError": "檔案是目錄", "fileNotModifiedError": "未修改檔案的時間", + "fileTooLargeForHeapError": " 欲開啟此大小的檔案,需要重啟 VS Code,並且允許可使用更多記憶體", "fileTooLargeError": "檔案太大無法開啟", "fileNotFoundError": "找不到檔案 ({0})", "fileBinaryError": "檔案似乎是二進位檔,因此無法當做文字開啟", diff --git a/i18n/deu/extensions/npm/out/npmView.i18n.json b/i18n/deu/extensions/npm/out/npmView.i18n.json new file mode 100644 index 00000000000..35229bd6699 --- /dev/null +++ b/i18n/deu/extensions/npm/out/npmView.i18n.json @@ -0,0 +1,9 @@ +{ + "": [ + "--------------------------------------------------------------------------------------------", + "Copyright (c) Microsoft Corporation. All rights reserved.", + "Licensed under the MIT License. See License.txt in the project root for license information.", + "--------------------------------------------------------------------------------------------", + "Do not edit this file. It is machine generated." + ] +} \ No newline at end of file diff --git a/i18n/deu/extensions/npm/out/tasks.i18n.json b/i18n/deu/extensions/npm/out/tasks.i18n.json new file mode 100644 index 00000000000..a918970a630 --- /dev/null +++ b/i18n/deu/extensions/npm/out/tasks.i18n.json @@ -0,0 +1,10 @@ +{ + "": [ + "--------------------------------------------------------------------------------------------", + "Copyright (c) Microsoft Corporation. All rights reserved.", + "Licensed under the MIT License. See License.txt in the project root for license information.", + "--------------------------------------------------------------------------------------------", + "Do not edit this file. It is machine generated." + ], + "npm.parseError": "NPM-Aufgabenerkennung: Fehler beim Analysieren der Datei {0}" +} \ No newline at end of file diff --git a/i18n/deu/extensions/npm/package.i18n.json b/i18n/deu/extensions/npm/package.i18n.json index 76fc1f862d4..91063ce0648 100644 --- a/i18n/deu/extensions/npm/package.i18n.json +++ b/i18n/deu/extensions/npm/package.i18n.json @@ -14,5 +14,8 @@ "config.npm.exclude": "Konfigurieren Sie Globmuster für Ordner, die von der automatischen Skripterkennung ausgeschlossen werden sollen.", "npm.parseError": "NPM-Aufgabenerkennung: Fehler beim Analysieren der Datei {0}", "taskdef.script": "Das anzupassende NPM-Skript.", - "taskdef.path": "Der Pfad zu dem Ordner der Datei vom Typ \"package.json\", die das Skript bereitstellt. Kann ausgelassen werden." + "taskdef.path": "Der Pfad zu dem Ordner der Datei vom Typ \"package.json\", die das Skript bereitstellt. Kann ausgelassen werden.", + "command.refresh": "Aktualisieren", + "command.debug": "Debuggen", + "command.openScript": "Öffnen" } \ No newline at end of file diff --git a/i18n/deu/src/vs/editor/common/config/commonEditorConfig.i18n.json b/i18n/deu/src/vs/editor/common/config/commonEditorConfig.i18n.json index 880b210f63a..37cc27767cd 100644 --- a/i18n/deu/src/vs/editor/common/config/commonEditorConfig.i18n.json +++ b/i18n/deu/src/vs/editor/common/config/commonEditorConfig.i18n.json @@ -16,7 +16,6 @@ "lineNumbers.on": "Zeilennummern werden als absolute Zahl dargestellt.", "lineNumbers.relative": "Zeilennummern werden als Abstand in Zeilen an Cursorposition dargestellt.", "lineNumbers.interval": "Zeilennummern werden alle 10 Zeilen dargestellt.", - "lineNumbers": "Steuert die Anzeige von Zeilennummern. Mögliche Werte sind \"on\", \"off\", \"relative\" und \"interval\".", "rulers": "Vertikale Linien nach einer bestimmten Anzahl von Monospace Zeichen zeichnen. Verwenden Sie mehrere Werte für mehrere Linien. Keine Linie wird gezeichnet, wenn das Array leer ist.", "wordSeparators": "Zeichen, die als Worttrennzeichen verwendet werden, wenn wortbezogene Navigationen oder Vorgänge ausgeführt werden.", "tabSize": "Die Anzahl der Leerzeichen, denen ein Tabstopp entspricht. Diese Einstellung wird basierend auf dem Inhalt der Datei überschrieben, wenn \"editor.detectIndentation\" aktiviert ist.", @@ -28,8 +27,7 @@ "scrollBeyondLastLine": "Legt fest, ob der Editor Bildläufe über die letzte Zeile hinaus ausführt.", "smoothScrolling": "Legt fest, ob der Editor Bildläufe animiert ausführt.", "minimap.enabled": "Steuert, ob die Minikarte angezeigt wird", - "minimap.side": "Steuert die Seite, wo die Minikarte gerendert wird. Mögliche Werte sind \"rechts\" und \"links\".", - "minimap.showSlider": "Steuert, ob der Minimap-Schieberegler automatisch ausgeblendet wird. Mögliche Werte sind \"always\" und \"mouseover\".", + "minimap.showSlider": "Steuert, ob der Minimap-Schieberegler automatisch ausgeblendet wird.", "minimap.renderCharacters": "Die tatsächlichen Zeichen in einer Zeile rendern (im Gegensatz zu Farbblöcken)", "minimap.maxColumn": "Breite der Minikarte beschränken, um höchstens eine bestimmte Anzahl von Spalten zu rendern", "find.seedSearchStringFromSelection": "Steuert, ob wir für die Suchzeichenfolge im Suchwidget aus der Editorauswahl ein Seeding ausführen.", @@ -46,6 +44,7 @@ "multiCursorModifier.ctrlCmd": "Ist unter Windows und Linux der Taste \"STRG\" und unter macOSX der Befehlstaste zugeordnet.", "multiCursorModifier.alt": "Ist unter Windows und Linux der Taste \"Alt\" und unter macOSX der Wahltaste zugeordnet. ", "multiCursorModifier": "Der Modifizierer, der zum Hinzufügen mehrerer Cursor mit der Maus verwendet wird. \"ctrlCmd\" wird unter Windows und Linux der Taste \"STRG\" und unter macOSX der Befehlstaste zugeordnet. Die Mausbewegungen \"Gehe zu Definition\" und \"Link öffnen\" werden so angepasst, dass kein Konflikt mit dem Multi-Cursor-Modifizierer entsteht.", + "multiCursorMergeOverlapping": "Mehrere Cursor zusammenführen, wenn sie sich überlappen.", "quickSuggestions.strings": "Schnellvorschläge innerhalb von Zeichenfolgen aktivieren.", "quickSuggestions.comments": "Schnellvorschläge innerhalb von Kommentaren aktivieren.", "quickSuggestions.other": "Schnellvorschläge außerhalb von Zeichenfolgen und Kommentaren aktivieren.", @@ -76,7 +75,6 @@ "occurrencesHighlight": "Steuert, ob der Editor das Vorkommen semantischer Symbole markieren soll.", "overviewRulerLanes": "Steuert die Anzahl von Dekorationen, die an derselben Position im Übersichtslineal angezeigt werden.", "overviewRulerBorder": "Steuert, ob um das Übersichtslineal ein Rahmen gezeichnet werden soll.", - "cursorBlinking": "Steuert den Cursoranimationsstil. Gültige Werte sind \"blink\", \"smooth\", \"phase\", \"expand\" und \"solid\".", "mouseWheelZoom": "Schriftart des Editors vergrößern, wenn das Mausrad verwendet und die STRG-TASTE gedrückt wird", "cursorStyle": "Steuert den Cursorstil. Gültige Werte sind \"block\", \"block-outline\", \"line\", \"line-thin\", \"underline\" und \"underline-thin\".", "cursorWidth": "Steuert die Breite des Cursors, falls editor.cursorStyle auf \"line\" gestellt ist.", @@ -86,8 +84,9 @@ "renderControlCharacters": "Steuert, ob der Editor Steuerzeichen rendern soll.", "renderIndentGuides": "Steuert, ob der Editor Einzugsführungslinien rendern soll.", "renderLineHighlight": "Steuert, wie der Editor die aktuelle Zeilenhervorhebung rendern soll. Mögliche Werte sind \"none\", \"gutter\", \"line\" und \"all\".", - "codeLens": "Steuert, ob der Editor CodeLenses anzeigt.", "folding": "Steuert, ob für den Editor Codefaltung aktiviert ist.", + "foldingStrategyAuto": "Falls vorhanden, eine sprachspezifische Strategie für das Codefaltung verwenden, ansonsten wird die einrückungsbasierte Strategie genutzt.", + "foldingStrategyIndentation": "Immer die einrückungsbasierte Strategie zur Codefaltung nutzen", "showFoldingControls": "Steuert, ob die Falt-Steuerelemente an der Leiste automatisch ausgeblendet werden.", "matchBrackets": "Übereinstimmende Klammern hervorheben, wenn eine davon ausgewählt wird.", "glyphMargin": "Steuert, ob der Editor den vertikalen Glyphenrand rendert. Der Glyphenrand wird hauptsächlich zum Debuggen verwendet.", @@ -105,5 +104,6 @@ "selectionClipboard": "Steuert, ob die primäre Linux-Zwischenablage unterstützt werden soll.", "sideBySide": "Steuert, ob der Diff-Editor das Diff nebeneinander oder inline anzeigt.", "ignoreTrimWhitespace": "Steuert, ob der Diff-Editor Änderungen in führenden oder nachgestellten Leerzeichen als Diffs anzeigt.", + "largeFileLineCount": "Steuert den Schwellenwert für Dateigröße in Bezug auf die Zeilenanzahl, ab dem spezielle Optimierungsregeln angewendet werden", "renderIndicators": "Steuert, ob der Diff-Editor die Indikatoren \"+\" und \"-\" für hinzugefügte/entfernte Änderungen anzeigt." } \ No newline at end of file diff --git a/i18n/deu/src/vs/editor/common/view/editorColorRegistry.i18n.json b/i18n/deu/src/vs/editor/common/view/editorColorRegistry.i18n.json index fc7ba3f58b4..ae336794beb 100644 --- a/i18n/deu/src/vs/editor/common/view/editorColorRegistry.i18n.json +++ b/i18n/deu/src/vs/editor/common/view/editorColorRegistry.i18n.json @@ -16,6 +16,7 @@ "editorIndentGuides": "Farbe der Führungslinien für Einzüge im Editor.", "editorLineNumbers": "Zeilennummernfarbe im Editor.", "editorActiveLineNumber": "Zeilennummernfarbe der aktiven Editorzeile.", + "deprecatedEditorActiveLineNumber": "ID ist veraltet. Verwenden Sie stattdessen \"editorLineNumber.activeForeground\".", "editorRuler": "Farbe des Editor-Lineals.", "editorCodeLensForeground": "Vordergrundfarbe der CodeLens-Links im Editor", "editorBracketMatchBackground": "Hintergrundfarbe für zusammengehörige Klammern", diff --git a/i18n/deu/src/vs/editor/contrib/codeAction/codeActionCommands.i18n.json b/i18n/deu/src/vs/editor/contrib/codeAction/codeActionCommands.i18n.json index cd90a9fdc29..707ff28811b 100644 --- a/i18n/deu/src/vs/editor/contrib/codeAction/codeActionCommands.i18n.json +++ b/i18n/deu/src/vs/editor/contrib/codeAction/codeActionCommands.i18n.json @@ -8,5 +8,10 @@ ], "quickFixWithKb": "Korrekturen anzeigen ({0})", "quickFix": "Korrekturen anzeigen", + "editor.action.quickFix.noneMessage": "Keine Code-Aktionen verfügbar", + "refactor.label": "Umgestalten...", + "editor.action.refactor.noneMessage": "Keine Refactorings verfügbar", + "source.label": "Quellaktion…", + "editor.action.source.noneMessage": "Keine Quellaktionen verfügbar", "organizeImports.label": "Importe organisieren" } \ No newline at end of file diff --git a/i18n/deu/src/vs/editor/contrib/format/formatActions.i18n.json b/i18n/deu/src/vs/editor/contrib/format/formatActions.i18n.json index f495c419464..65620b73913 100644 --- a/i18n/deu/src/vs/editor/contrib/format/formatActions.i18n.json +++ b/i18n/deu/src/vs/editor/contrib/format/formatActions.i18n.json @@ -12,5 +12,7 @@ "hintnn": "{0} Formatierungen zwischen Zeilen {1} und {2} vorgenommen", "no.provider": "Es ist kein Formatierer für \"{0}\"-Dateien installiert. ", "formatDocument.label": "Dokument formatieren", - "formatSelection.label": "Auswahl formatieren" + "no.documentprovider": "Es ist kein Dokument-Formatierer für \"{0}\"-Dateien installiert.", + "formatSelection.label": "Auswahl formatieren", + "no.selectionprovider": "Es ist kein Auswahl-Formatierer für \"{0}\"-Dateien installiert. " } \ No newline at end of file diff --git a/i18n/deu/src/vs/editor/contrib/links/links.i18n.json b/i18n/deu/src/vs/editor/contrib/links/links.i18n.json index fd721f743c2..050c34c0463 100644 --- a/i18n/deu/src/vs/editor/contrib/links/links.i18n.json +++ b/i18n/deu/src/vs/editor/contrib/links/links.i18n.json @@ -10,7 +10,9 @@ "links.navigate": "STRG + Mausklick zum Aufrufen des Links", "links.command.mac": "Cmd + Klick um Befehl auszuführen", "links.command": "Ctrl + Klick um Befehl auszuführen.", + "links.navigate.al.mac": "WAHLTASTE + Klicken, um Link zu folgen", "links.navigate.al": "ALT + Mausklick zum Aufrufen des Links", + "links.command.al.mac": "WAHLTASTE + Klicken, um Befehl auszuführen", "links.command.al": "Alt + Klick um Befehl auszuführen.", "invalid.url": "Fehler beim Öffnen dieses Links, weil er nicht wohlgeformt ist: {0}", "missing.url": "Fehler beim Öffnen dieses Links, weil das Ziel fehlt.", diff --git a/i18n/deu/src/vs/platform/environment/node/argv.i18n.json b/i18n/deu/src/vs/platform/environment/node/argv.i18n.json index e0ac23f5587..34795e135e8 100644 --- a/i18n/deu/src/vs/platform/environment/node/argv.i18n.json +++ b/i18n/deu/src/vs/platform/environment/node/argv.i18n.json @@ -22,7 +22,6 @@ "showVersions": "Zeigt Versionen der installierten Erweiterungen an, wenn \"--list-extension\" verwendet wird.", "installExtension": "Installiert eine Extension.", "uninstallExtension": "Deinstalliert eine Extension.", - "experimentalApis": "Aktiviert vorgeschlagene API-Features für eine Erweiterung.", "verbose": "Ausführliche Ausgabe (impliziert \"-wait\").", "log": "Log-Level zu verwenden. Standardwert ist \"Info\". Zulässige Werte sind \"kritisch\", \"Fehler\", \"warnen\", \"Info\", \"debug\", \"verfolgen\", \"aus\".", "status": "Prozessnutzungs- und Diagnose-Informationen ausgeben.", diff --git a/i18n/deu/src/vs/platform/extensions/node/extensionValidator.i18n.json b/i18n/deu/src/vs/platform/extensions/node/extensionValidator.i18n.json index 0ef3a16d232..97dee45e12c 100644 --- a/i18n/deu/src/vs/platform/extensions/node/extensionValidator.i18n.json +++ b/i18n/deu/src/vs/platform/extensions/node/extensionValidator.i18n.json @@ -6,6 +6,7 @@ "--------------------------------------------------------------------------------------------", "Do not edit this file. It is machine generated." ], + "versionSyntax": "`engines.vscode`-Wert {0} konnte nicht analysiert werden. Bitte z. B. folgende verwenden: ^1.22.0, ^1.22.x usw.", "versionSpecificity1": "Die in \"engines.vscode\" ({0}) angegebene Version ist nicht spezifisch genug. Definieren Sie für VS Code-Versionen vor Version 1.0.0 bitte mindestens die gewünschte Haupt- und Nebenversion, z. B. ^0.10.0, 0.10.x, 0.11.0 usw.", "versionSpecificity2": "Die in \"engines.vscode\" ({0}) angegebene Version ist nicht spezifisch genug. Definieren Sie für VS Code-Versionen nach Version 1.0.0 bitte mindestens die gewünschte Hauptversion, z. B. ^1.10.0, 1.10.x, 1.x.x, 2.x.x usw.", "versionMismatch": "Die Extension ist nicht mit dem Code {0} kompatibel. Die Extension erfordert {1}." diff --git a/i18n/deu/src/vs/platform/issue/electron-main/issueService.i18n.json b/i18n/deu/src/vs/platform/issue/electron-main/issueService.i18n.json index 91ee9e32e4a..e05db0db192 100644 --- a/i18n/deu/src/vs/platform/issue/electron-main/issueService.i18n.json +++ b/i18n/deu/src/vs/platform/issue/electron-main/issueService.i18n.json @@ -6,5 +6,6 @@ "--------------------------------------------------------------------------------------------", "Do not edit this file. It is machine generated." ], - "issueReporter": "Problembericht" + "issueReporter": "Problembericht", + "processExplorer": "Prozess-Explorer" } \ No newline at end of file diff --git a/i18n/deu/src/vs/platform/theme/common/colorRegistry.i18n.json b/i18n/deu/src/vs/platform/theme/common/colorRegistry.i18n.json index d703cc6af77..f5a116e6036 100644 --- a/i18n/deu/src/vs/platform/theme/common/colorRegistry.i18n.json +++ b/i18n/deu/src/vs/platform/theme/common/colorRegistry.i18n.json @@ -29,7 +29,6 @@ "inputPlaceholderForeground": "Input box - Vordergrundfarbe für Platzhalter-Text.", "inputValidationInfoBackground": "Hintergrundfarbe bei der Eingabevalidierung für den Schweregrad der Information.", "inputValidationInfoBorder": "Rahmenfarbe bei der Eingabevalidierung für den Schweregrad der Information.", - "inputValidationWarningBackground": "Hintergrundfarbe bei der Eingabevalidierung für eine Warnung zur Information.", "inputValidationWarningBorder": "Rahmenfarbe bei der Eingabevalidierung für den Schweregrad der Warnung.", "inputValidationErrorBackground": "Hintergrundfarbe bei der Eingabevalidierung für den Schweregrad des Fehlers.", "inputValidationErrorBorder": "Rahmenfarbe bei der Eingabevalidierung für den Schweregrad des Fehlers.", @@ -71,10 +70,8 @@ "editorSelectionHighlightBorder": "Randfarbe für Bereiche, deren Inhalt der Auswahl entspricht.", "editorFindMatch": "Farbe des aktuellen Suchergebnisses.", "findMatchHighlight": "Farbe der anderen Suchergebnisse. Die Farbe muss durchsichtig sein, um dahinterliegende Dekorationen nicht zu verbergen. ", - "findRangeHighlight": "Farbe des einschränkenden Suchbereichs. Die Farbe muss durchsichtig sein, um dahinterliegende Dekorationen nicht zu verbergen. ", "editorFindMatchBorder": "Randfarbe des aktuellen Suchergebnisses.", "findMatchHighlightBorder": "Randfarbe der anderen Suchtreffer.", - "findRangeHighlightBorder": "Randfarbe des einschränkenden Suchbereichs. Die Farbe muss durchsichtig sein, um dahinterliegende Dekorationen nicht zu verbergen. ", "hoverHighlight": "Hervorhebung eines Worts, unter dem ein Mauszeiger angezeigt wird. Die Farbe muss durchsichtig sein, um dahinterliegende Dekorationen nicht zu verbergen. ", "hoverBackground": "Background color of the editor hover.", "hoverBorder": "Rahmenfarbe des Editor-Mauszeigers.", @@ -88,7 +85,6 @@ "mergeIncomingHeaderBackground": "Hintergrund für eingehende Kopfzeile in Inline-Mergingkonflikten. Die Farbe muss durchsichtig sein, um dahinterliegende Dekorationen nicht zu verbergen. ", "mergeIncomingContentBackground": "Hintergrund für eingehenden Inhalt in Inline-Mergingkonflikten. Die Farbe muss durchsichtig sein, um dahinterliegende Dekorationen nicht zu verbergen. ", "mergeCommonHeaderBackground": "Inhaltshintergrund des gemeinsamen übergeordneten Elements bei Inline-Mergingkonflikten. Die Farbe muss durchsichtig sein, um dahinterliegende Dekorationen nicht zu verbergen.", - "mergeCommonContentBackground": "Inhaltshintergrund des gemeinsamen übergeordneten Elements bei Inline-Mergingkonflikten. Die Farbe muss durchsichtig sein, um dahinterliegende Dekorationen nicht zu verbergen. ", "mergeBorder": "Rahmenfarbe für Kopfzeilen und die Aufteilung in Inline-Mergingkonflikten.", "overviewRulerCurrentContentForeground": "Aktueller Übersichtslineal-Vordergrund für Inline-Mergingkonflikte.", "overviewRulerIncomingContentForeground": "Eingehender Übersichtslineal-Vordergrund für Inline-Mergingkonflikte. ", diff --git a/i18n/deu/src/vs/platform/url/electron-browser/inactiveExtensionUrlHandler.i18n.json b/i18n/deu/src/vs/platform/url/electron-browser/inactiveExtensionUrlHandler.i18n.json new file mode 100644 index 00000000000..35229bd6699 --- /dev/null +++ b/i18n/deu/src/vs/platform/url/electron-browser/inactiveExtensionUrlHandler.i18n.json @@ -0,0 +1,9 @@ +{ + "": [ + "--------------------------------------------------------------------------------------------", + "Copyright (c) Microsoft Corporation. All rights reserved.", + "Licensed under the MIT License. See License.txt in the project root for license information.", + "--------------------------------------------------------------------------------------------", + "Do not edit this file. It is machine generated." + ] +} \ No newline at end of file diff --git a/i18n/deu/src/vs/platform/windows/electron-main/windowsService.i18n.json b/i18n/deu/src/vs/platform/windows/electron-main/windowsService.i18n.json index 9e0dff36edf..80bc78667c0 100644 --- a/i18n/deu/src/vs/platform/windows/electron-main/windowsService.i18n.json +++ b/i18n/deu/src/vs/platform/windows/electron-main/windowsService.i18n.json @@ -6,7 +6,7 @@ "--------------------------------------------------------------------------------------------", "Do not edit this file. It is machine generated." ], - "aboutDetail": "\nVersion {0}\nCommit {1}\nDatum {2}\nShell {3}\nRenderer {4}\nNode {5}\nArchitektur {6}", + "aboutDetail": "Version {0}\nCommit {1}\nDatum {2}\nShell {3}\nRenderer {4}\nNode {5}\nArchitektur {6}", "okButton": "OK", "copy": "&&Kopieren" } \ No newline at end of file diff --git a/i18n/deu/src/vs/workbench/api/browser/viewsExtensionPoint.i18n.json b/i18n/deu/src/vs/workbench/api/browser/viewsExtensionPoint.i18n.json index 10d819ab539..501b08d9c6f 100644 --- a/i18n/deu/src/vs/workbench/api/browser/viewsExtensionPoint.i18n.json +++ b/i18n/deu/src/vs/workbench/api/browser/viewsExtensionPoint.i18n.json @@ -13,8 +13,6 @@ "vscode.extension.contributes.view.name": "Der visuell lesbare Name der Ansicht. Wird angezeigt", "vscode.extension.contributes.view.when": "Bedingung, die zum Anzeigen dieser Ansicht erfüllt sein muss", "vscode.extension.contributes.views": "Trägt Ansichten zum Editor bei.", - "views.explorer": "Explorer-Ansicht", - "views.debug": "Debugansicht", "duplicateView1": "Mehrere Ansichten können nicht mit derselben ID \"{0}\" am Speicherort \"{1}\" registriert werden.", "duplicateView2": "Eine Ansicht mit der ID \"{0}\" ist am Speicherort \"{1}\" bereits registriert." } \ No newline at end of file diff --git a/i18n/deu/src/vs/workbench/browser/parts/quickinput/quickInput.i18n.json b/i18n/deu/src/vs/workbench/browser/parts/quickinput/quickInput.i18n.json index bcdf56e4849..5144aeab151 100644 --- a/i18n/deu/src/vs/workbench/browser/parts/quickinput/quickInput.i18n.json +++ b/i18n/deu/src/vs/workbench/browser/parts/quickinput/quickInput.i18n.json @@ -6,5 +6,7 @@ "--------------------------------------------------------------------------------------------", "Do not edit this file. It is machine generated." ], + "inputModeEntryDescription": "{0} (Drücken Sie die EINGABETASTE zur Bestätigung oder ESC, um den Vorgang abzubrechen.)", + "inputModeEntry": "Drücken Sie die EINGABETASTE, um Ihre Eingabe zu bestätigen, oder ESC, um den Vorgang abzubrechen.", "ok": "OK" } \ No newline at end of file diff --git a/i18n/deu/src/vs/workbench/parts/files/electron-browser/fileActions.i18n.json b/i18n/deu/src/vs/workbench/parts/files/electron-browser/fileActions.i18n.json index 2736ae43b6c..9f68b999300 100644 --- a/i18n/deu/src/vs/workbench/parts/files/electron-browser/fileActions.i18n.json +++ b/i18n/deu/src/vs/workbench/parts/files/electron-browser/fileActions.i18n.json @@ -24,20 +24,20 @@ "dirtyMessageFolderDelete": "Sie löschen einen Ordner mit nicht gespeicherten Änderungen in {0} Dateien. Möchten Sie den Vorgang fortsetzen?", "dirtyMessageFileDelete": "Sie löschen eine Datei mit nicht gespeicherten Änderungen. Möchten Sie den Vorgang fortsetzen?", "dirtyWarning": "Ihre Änderungen gehen verloren, wenn Sie diese nicht speichern.", - "confirmMoveTrashMessageMultiple": "Möchten Sie die folgenden {0} Dateien löschen?", - "confirmMoveTrashMessageFolder": "Möchten Sie \"{0}\" samt Inhalt wirklich löschen?", - "confirmMoveTrashMessageFile": "Möchten Sie \"{0}\" wirklich löschen?", "undoBin": "Die Wiederherstellung kann aus dem Papierkorb erfolgen.", "undoTrash": "Die Wiederherstellung kann aus dem Papierkorb erfolgen.", "doNotAskAgain": "Nicht erneut fragen", - "confirmDeleteMessageMultiple": "Möchten Sie die folgenden {0} Dateien endgültig löschen?", - "confirmDeleteMessageFolder": "Möchten Sie \"{0}\" samt Inhalt wirklich endgültig löschen?", - "confirmDeleteMessageFile": "Möchten Sie \"{0}\" wirklich endgültig löschen?", "irreversible": "Diese Aktion kann nicht rückgängig gemacht werden.", "binFailed": "Fehler beim Löschen über den Papierkorb. Möchten Sie den Löschvorgang stattdessen dauerhaft ausführen?", "trashFailed": "Fehler beim Löschen über den Papierkorb. Möchten Sie den Löschvorgang stattdessen dauerhaft ausführen?", "deletePermanentlyButtonLabel": "En&&dgültig löschen", "retryButtonLabel": "Wiede&&rholen", + "confirmMoveTrashMessageMultiple": "Möchten Sie die folgenden {0} Dateien löschen?", + "confirmMoveTrashMessageFolder": "Möchten Sie \"{0}\" samt Inhalt wirklich löschen?", + "confirmMoveTrashMessageFile": "Möchten Sie \"{0}\" wirklich löschen?", + "confirmDeleteMessageMultiple": "Möchten Sie die folgenden {0} Dateien endgültig löschen?", + "confirmDeleteMessageFolder": "Möchten Sie \"{0}\" samt Inhalt wirklich endgültig löschen?", + "confirmDeleteMessageFile": "Möchten Sie \"{0}\" wirklich endgültig löschen?", "confirmOverwrite": "Im Zielordner ist bereits eine Datei oder ein Ordner mit dem gleichen Namen vorhanden. Möchten Sie sie bzw. ihn ersetzen?", "replaceButtonLabel": "&&Ersetzen", "fileIsAncestor": "Die einzufügende Datei ist ein Vorgänger des Zielordners", diff --git a/i18n/deu/src/vs/workbench/parts/localizations/electron-browser/localizations.contribution.i18n.json b/i18n/deu/src/vs/workbench/parts/localizations/electron-browser/localizations.contribution.i18n.json new file mode 100644 index 00000000000..d69e7a77b17 --- /dev/null +++ b/i18n/deu/src/vs/workbench/parts/localizations/electron-browser/localizations.contribution.i18n.json @@ -0,0 +1,23 @@ +{ + "": [ + "--------------------------------------------------------------------------------------------", + "Copyright (c) Microsoft Corporation. All rights reserved.", + "Licensed under the MIT License. See License.txt in the project root for license information.", + "--------------------------------------------------------------------------------------------", + "Do not edit this file. It is machine generated." + ], + "updateLocale": "Möchten Sie die Sprache der Benutzeroberfläche von VS Code in {0} ändern und einen Neustart durchführen?", + "yes": "Ja", + "no": "Nein", + "neverAgain": "Nicht mehr anzeigen", + "install": "Installieren", + "JsonSchema.locale": "Die zu verwendende Sprache der Benutzeroberfläche.", + "vscode.extension.contributes.localizations": "Trägt Lokalisierungen zum Editor bei", + "vscode.extension.contributes.localizations.languageId": "ID der Sprache, in die Anzeigezeichenfolgen übersetzt werden.", + "vscode.extension.contributes.localizations.languageName": "Englischer Name der Sprache.", + "vscode.extension.contributes.localizations.languageNameLocalized": "Name der Sprache in beigetragener Sprache.", + "vscode.extension.contributes.localizations.translations": "Liste der Übersetzungen, die der Sprache zugeordnet sind.", + "vscode.extension.contributes.localizations.translations.id": "ID von VS Code oder der Erweiterung, für die diese Übersetzung beigetragen wird. Die ID von VS Code ist immer \"vscode\", und die ID einer Erweiterung muss im Format \"publisherId.extensionName\" vorliegen.", + "vscode.extension.contributes.localizations.translations.id.pattern": "Die ID muss \"vscode\" sein oder im Format \"publisherId.extensionName\" vorliegen, um VS Code bzw. eine Erweiterung zu übersetzen.", + "vscode.extension.contributes.localizations.translations.path": "Ein relativer Pfad zu einer Datei mit Übersetzungen für die Sprache." +} \ No newline at end of file diff --git a/i18n/deu/src/vs/workbench/parts/localizations/electron-browser/localizationsActions.i18n.json b/i18n/deu/src/vs/workbench/parts/localizations/electron-browser/localizationsActions.i18n.json new file mode 100644 index 00000000000..ecb522366f2 --- /dev/null +++ b/i18n/deu/src/vs/workbench/parts/localizations/electron-browser/localizationsActions.i18n.json @@ -0,0 +1,14 @@ +{ + "": [ + "--------------------------------------------------------------------------------------------", + "Copyright (c) Microsoft Corporation. All rights reserved.", + "Licensed under the MIT License. See License.txt in the project root for license information.", + "--------------------------------------------------------------------------------------------", + "Do not edit this file. It is machine generated." + ], + "configureLocale": "Sprache konfigurieren", + "displayLanguage": "Definiert die Anzeigesprache von VSCode.", + "doc": "Unter {0} finden Sie eine Liste der unterstützten Sprachen.", + "restart": "Das Ändern dieses Wertes erfordert einen Neustart von VSCode.", + "fail.createSettings": "{0} ({1}) kann nicht erstellt werden." +} \ No newline at end of file diff --git a/i18n/deu/src/vs/workbench/parts/url/electron-browser/url.contribution.i18n.json b/i18n/deu/src/vs/workbench/parts/url/electron-browser/url.contribution.i18n.json new file mode 100644 index 00000000000..0c1f5497f13 --- /dev/null +++ b/i18n/deu/src/vs/workbench/parts/url/electron-browser/url.contribution.i18n.json @@ -0,0 +1,10 @@ +{ + "": [ + "--------------------------------------------------------------------------------------------", + "Copyright (c) Microsoft Corporation. All rights reserved.", + "Licensed under the MIT License. See License.txt in the project root for license information.", + "--------------------------------------------------------------------------------------------", + "Do not edit this file. It is machine generated." + ], + "developer": "Entwickler" +} \ No newline at end of file diff --git a/i18n/deu/src/vs/workbench/services/configurationResolver/node/variableResolver.i18n.json b/i18n/deu/src/vs/workbench/services/configurationResolver/node/variableResolver.i18n.json new file mode 100644 index 00000000000..35229bd6699 --- /dev/null +++ b/i18n/deu/src/vs/workbench/services/configurationResolver/node/variableResolver.i18n.json @@ -0,0 +1,9 @@ +{ + "": [ + "--------------------------------------------------------------------------------------------", + "Copyright (c) Microsoft Corporation. All rights reserved.", + "Licensed under the MIT License. See License.txt in the project root for license information.", + "--------------------------------------------------------------------------------------------", + "Do not edit this file. It is machine generated." + ] +} \ No newline at end of file diff --git a/i18n/esn/extensions/npm/out/npmView.i18n.json b/i18n/esn/extensions/npm/out/npmView.i18n.json new file mode 100644 index 00000000000..35229bd6699 --- /dev/null +++ b/i18n/esn/extensions/npm/out/npmView.i18n.json @@ -0,0 +1,9 @@ +{ + "": [ + "--------------------------------------------------------------------------------------------", + "Copyright (c) Microsoft Corporation. All rights reserved.", + "Licensed under the MIT License. See License.txt in the project root for license information.", + "--------------------------------------------------------------------------------------------", + "Do not edit this file. It is machine generated." + ] +} \ No newline at end of file diff --git a/i18n/esn/extensions/npm/out/tasks.i18n.json b/i18n/esn/extensions/npm/out/tasks.i18n.json new file mode 100644 index 00000000000..888ecbd58c8 --- /dev/null +++ b/i18n/esn/extensions/npm/out/tasks.i18n.json @@ -0,0 +1,10 @@ +{ + "": [ + "--------------------------------------------------------------------------------------------", + "Copyright (c) Microsoft Corporation. All rights reserved.", + "Licensed under the MIT License. See License.txt in the project root for license information.", + "--------------------------------------------------------------------------------------------", + "Do not edit this file. It is machine generated." + ], + "npm.parseError": "Detección de tareas de la NMP: error al analizar el archivo {0}" +} \ No newline at end of file diff --git a/i18n/esn/extensions/npm/package.i18n.json b/i18n/esn/extensions/npm/package.i18n.json index 76e4d49bacf..57d6dcb65e8 100644 --- a/i18n/esn/extensions/npm/package.i18n.json +++ b/i18n/esn/extensions/npm/package.i18n.json @@ -14,5 +14,8 @@ "config.npm.exclude": "Configura patrones globales para carpetas que deben excluirse de la detección automática de scripts. ", "npm.parseError": "Detección de tareas de nueva gestión pública: no se pudo analizar el archivo {0}", "taskdef.script": "Script npm que debe personalizarse.", - "taskdef.path": "Ruta de acceso a la carpeta del archivo package.json que proporciona el script. Se puede omitir." + "taskdef.path": "Ruta de acceso a la carpeta del archivo package.json que proporciona el script. Se puede omitir.", + "command.refresh": "Actualizar", + "command.debug": "Depurar", + "command.openScript": "Abrir" } \ No newline at end of file diff --git a/i18n/esn/extensions/typescript-language-features/package.i18n.json b/i18n/esn/extensions/typescript-language-features/package.i18n.json index 60682458562..4963282d83a 100644 --- a/i18n/esn/extensions/typescript-language-features/package.i18n.json +++ b/i18n/esn/extensions/typescript-language-features/package.i18n.json @@ -60,5 +60,6 @@ "typescript.autoImportSuggestions.enabled": "Habilita o deshabilita sugerencias de importación automática.  Requiere TypeScript >= 2.6.1.", "typescript.experimental.syntaxFolding": "Habilita/deshabilita los marcadores de plegado sensibles a la sintaxis.", "taskDefinition.tsconfig.description": "Archivo tsconfig que define la compilación de TS.", - "javascript.suggestionActions.enabled": "Habilitar/deshabilitar sugerencias de diagnóstico para los archivos JavaScript en el editor. Requiere TypeScript > = 2.8 " + "javascript.suggestionActions.enabled": "Habilitar/deshabilitar sugerencias de diagnóstico para los archivos JavaScript en el editor. Requiere TypeScript > = 2.8 ", + "typescript.suggestionActions.enabled": "Habilitar/deshabilitar sugerencias de diagnóstico para los archivos JavaScript en el editor. Requiere TypeScript > = 2.8 " } \ No newline at end of file diff --git a/i18n/esn/src/vs/base/node/processes.i18n.json b/i18n/esn/src/vs/base/node/processes.i18n.json index 35229bd6699..8b8b8a887e4 100644 --- a/i18n/esn/src/vs/base/node/processes.i18n.json +++ b/i18n/esn/src/vs/base/node/processes.i18n.json @@ -5,5 +5,6 @@ "Licensed under the MIT License. See License.txt in the project root for license information.", "--------------------------------------------------------------------------------------------", "Do not edit this file. It is machine generated." - ] + ], + "TaskRunner.UNC": "No se puede ejecutar un comando shell en una unidad UNC. " } \ No newline at end of file diff --git a/i18n/esn/src/vs/editor/browser/widget/diffReview.i18n.json b/i18n/esn/src/vs/editor/browser/widget/diffReview.i18n.json index 44586570582..945fa71e9e6 100644 --- a/i18n/esn/src/vs/editor/browser/widget/diffReview.i18n.json +++ b/i18n/esn/src/vs/editor/browser/widget/diffReview.i18n.json @@ -7,6 +7,10 @@ "Do not edit this file. It is machine generated." ], "label.close": "Cerrar", + "no_lines": "sin líneas", + "one_line": "1 línea", + "more_lines": "{0} líneas", + "header": "Diferencia {0} de {1}: original {2}, {3}, modificado {4}, {5}", "blankLine": "vacío", "equalLine": "original {0}, modificado {1}: {2}", "insertLine": "+ modificado {0}: {1}", diff --git a/i18n/esn/src/vs/editor/common/config/commonEditorConfig.i18n.json b/i18n/esn/src/vs/editor/common/config/commonEditorConfig.i18n.json index 385993cc48e..d841bf48f91 100644 --- a/i18n/esn/src/vs/editor/common/config/commonEditorConfig.i18n.json +++ b/i18n/esn/src/vs/editor/common/config/commonEditorConfig.i18n.json @@ -16,7 +16,6 @@ "lineNumbers.on": "Los números de línea se muestran como un número absoluto.", "lineNumbers.relative": "Los números de línea se muestran como distancia en líneas a la posición del cursor.", "lineNumbers.interval": "Los números de línea se muestran cada 10 líneas.", - "lineNumbers": "Controla la visualización de números de línea. Los valores posibles son 'on', 'off', 'relative' e 'interval'.", "rulers": "Representar reglas verticales después de un cierto número de caracteres monoespacio. Usar multiples valores para multiples reglas. No se dibuja ninguna regla si la matriz esta vacía.", "wordSeparators": "Caracteres que se usarán como separadores de palabras al realizar operaciones o navegaciones relacionadas con palabras.", "tabSize": "El número de espacios a los que equivale una tabulación. Este valor se invalida según el contenido del archivo cuando `editor.detectIndentation` está activado.", @@ -28,8 +27,7 @@ "scrollBeyondLastLine": "Controla si el editor se seguirá desplazando después de la última línea", "smoothScrolling": "Controla si el editor se desplaza con una animación", "minimap.enabled": "Controla si se muestra el minimapa", - "minimap.side": "Controla el lado dónde rendir el minimapa. Los valores posibles son 'derecha' e 'izquierda'", - "minimap.showSlider": "Controla si se oculta automáticamente el control deslizante del minimapa. Los valores posibles son \"always\" y \"mouseover\".", + "minimap.showSlider": "Controla si el control deslizante del minimapa es ocultado automáticamente.", "minimap.renderCharacters": "Presentar los caracteres reales en una línea (por oposición a bloques de color)", "minimap.maxColumn": "Limitar el ancho del minimapa para presentar como mucho un número de columnas determinado", "find.seedSearchStringFromSelection": "Controla si se inicializa la cadena de búsqueda en Buscar widget en la selección del editor", @@ -77,7 +75,6 @@ "occurrencesHighlight": "Controla si el editor debe resaltar los símbolos semánticos.", "overviewRulerLanes": "Controla el número de decoraciones que pueden aparecer en la misma posición en la regla de visión general", "overviewRulerBorder": "Controla si debe dibujarse un borde alrededor de la regla de información general.", - "cursorBlinking": "Controlar el estilo de animación del cursor. Los valores posibles son \"blink\", \"smooth\", \"phase\", \"expand\" y \"solid\".", "mouseWheelZoom": "Ampliar la fuente del editor cuando se use la rueda del mouse mientras se presiona Ctrl", "cursorStyle": "Controla el estilo del cursor. Los valores aceptados son \"block\", \"block-outline\", \"line\", \"line-thin\", \"underline\" y \"underline-thin\"", "cursorWidth": "Controla el ancho del cursor cuando editor.cursorStyle se establece a 'line'", @@ -87,7 +84,6 @@ "renderControlCharacters": "Controla si el editor debe representar caracteres de control", "renderIndentGuides": "Controla si el editor debe representar guías de sangría.", "renderLineHighlight": "Controla cómo el editor debe presentar el resaltado de línea. Las posibilidades son \"ninguno\", \"margen\", \"línea\" y \"todo\".", - "codeLens": "Controla si el editor muestra lentes de código", "folding": "Controla si el editor tiene habilitado el plegado de código.", "foldingStrategyAuto": "Si está disponible, utilice una estrategia de plegado específica del idioma, de lo contrario volverá a la estrategia basada en sangría.", "foldingStrategyIndentation": "Utilice siempre la estrategia de plegado basado en sangría.", diff --git a/i18n/esn/src/vs/editor/common/view/editorColorRegistry.i18n.json b/i18n/esn/src/vs/editor/common/view/editorColorRegistry.i18n.json index 1da3081cf27..aef2eb00455 100644 --- a/i18n/esn/src/vs/editor/common/view/editorColorRegistry.i18n.json +++ b/i18n/esn/src/vs/editor/common/view/editorColorRegistry.i18n.json @@ -14,6 +14,7 @@ "editorCursorBackground": "Color de fondo del cursor de edición. Permite personalizar el color del caracter solapado por el bloque del cursor.", "editorWhitespaces": "Color de los caracteres de espacio en blanco del editor.", "editorIndentGuides": "Color de las guías de sangría del editor.", + "editorActiveIndentGuide": "Color de las guías de sangría activas del editor.", "editorLineNumbers": "Color de números de línea del editor.", "editorActiveLineNumber": "Color del número de línea activa en el editor", "deprecatedEditorActiveLineNumber": "ID es obsoleto. Usar en lugar 'editorLineNumber.activeForeground'. ", diff --git a/i18n/esn/src/vs/editor/contrib/codeAction/codeActionCommands.i18n.json b/i18n/esn/src/vs/editor/contrib/codeAction/codeActionCommands.i18n.json index 8a8848e3498..961af167c9a 100644 --- a/i18n/esn/src/vs/editor/contrib/codeAction/codeActionCommands.i18n.json +++ b/i18n/esn/src/vs/editor/contrib/codeAction/codeActionCommands.i18n.json @@ -13,5 +13,6 @@ "refactor.label": "Refactorizar...", "editor.action.refactor.noneMessage": "No hay refactorizaciones disponibles", "source.label": "Acción de la fuente...", - "editor.action.source.noneMessage": "No hay acciones de fuente disponibles" + "editor.action.source.noneMessage": "No hay acciones de fuente disponibles", + "organizeImports.label": "Organizar Importaciones" } \ No newline at end of file diff --git a/i18n/esn/src/vs/editor/contrib/referenceSearch/referencesWidget.i18n.json b/i18n/esn/src/vs/editor/contrib/referenceSearch/referencesWidget.i18n.json index e01084d567b..918112214f9 100644 --- a/i18n/esn/src/vs/editor/contrib/referenceSearch/referencesWidget.i18n.json +++ b/i18n/esn/src/vs/editor/contrib/referenceSearch/referencesWidget.i18n.json @@ -25,5 +25,6 @@ "peekViewEditorBackground": "Color de fondo del editor de vista de inspección.", "peekViewEditorGutterBackground": "Color de fondo del margen en el editor de vista de inspección.", "peekViewResultsMatchHighlight": "Buscar coincidencia con el color de resaltado de la lista de resultados de vista de inspección.", - "peekViewEditorMatchHighlight": "Buscar coincidencia del color de resultado del editor de vista de inspección." + "peekViewEditorMatchHighlight": "Buscar coincidencia del color de resultado del editor de vista de inspección.", + "peekViewEditorMatchHighlightBorder": "Hacer coincidir el borde resaltado en el editor de vista previa." } \ No newline at end of file diff --git a/i18n/esn/src/vs/platform/environment/node/argv.i18n.json b/i18n/esn/src/vs/platform/environment/node/argv.i18n.json index 386d85b039d..4ebff806833 100644 --- a/i18n/esn/src/vs/platform/environment/node/argv.i18n.json +++ b/i18n/esn/src/vs/platform/environment/node/argv.i18n.json @@ -22,13 +22,14 @@ "showVersions": "Muestra las versiones de las extensiones instaladas cuando se usa --list-extension.", "installExtension": "Instala una extensión.", "uninstallExtension": "Desinstala una extensión.", - "experimentalApis": "Habilita características de API propuestas para una extensión.", "verbose": "Imprima salidas detalladas (implica --wait).", "log": "Nivel de registro a utilizar. Por defecto es 'info'. Los valores permitidos son 'critical', 'error', 'warn', 'info', 'debug', 'trace', 'off'.", "status": "Imprimir el uso del proceso y la información de diagnóstico.", "performance": "Comience con el comando 'Developer: Startup Performance' habilitado.", "prof-startup": "Ejecutar generador de perfiles de CPU durante el inicio", "disableExtensions": "Deshabilite todas las extensiones instaladas.", + "inspect-extensions": "Permite perfilar y depurar las extensiones. Revise las herramientas de desarrollador para la conexión URI.", + "inspect-brk-extensions": "Permite perfilar y depurar las extensiones con el host de la extensión pausado después de iniciar. Revise las herramientas de desarrollador para la conexión URI. ", "disableGPU": "Deshabilita la aceleración de hardware de GPU.", "uploadLogs": "Carga los registros de la sesión actual a un extremo.", "maxMemory": "Tamaño máximo de memoria para una ventana (en Mbytes).", diff --git a/i18n/esn/src/vs/platform/theme/common/colorRegistry.i18n.json b/i18n/esn/src/vs/platform/theme/common/colorRegistry.i18n.json index 39139e04743..ecbee1e78da 100644 --- a/i18n/esn/src/vs/platform/theme/common/colorRegistry.i18n.json +++ b/i18n/esn/src/vs/platform/theme/common/colorRegistry.i18n.json @@ -29,7 +29,6 @@ "inputPlaceholderForeground": "Color de primer plano para el marcador de posición de texto", "inputValidationInfoBackground": "Color de fondo de validación de entrada para gravedad de información.", "inputValidationInfoBorder": "Color de borde de validación de entrada para gravedad de información.", - "inputValidationWarningBackground": "Color de fondo de validación de entrada para advertencia de información.", "inputValidationWarningBorder": "Color de borde de validación de entrada para gravedad de advertencia.", "inputValidationErrorBackground": "Color de fondo de validación de entrada para gravedad de error.", "inputValidationErrorBorder": "Color de borde de valdación de entrada para gravedad de error.", @@ -71,10 +70,8 @@ "editorSelectionHighlightBorder": "Color de borde de las regiones con el mismo contenido que la selección.", "editorFindMatch": "Color de la coincidencia de búsqueda actual.", "findMatchHighlight": "Color de las otras coincidencias de búsqueda. El color no debe ser opaco para no ocultar las decoraciones subyacentes.", - "findRangeHighlight": "Colorea el rango limitando la búsqueda. El color no debe ser opaco para no ocultar las decoraciones subyacentes.", "editorFindMatchBorder": "Color de borde de la coincidencia de búsqueda actual.", "findMatchHighlightBorder": "Color de borde de otra búsqueda que coincide.", - "findRangeHighlightBorder": "Color de borde del rango limitando a la búsqueda. El color no debe ser opaco para no ocultar las decoraciones subyacentes.", "hoverHighlight": "Resalte debajo de la palabra para la cual se muestra un Hover. El color no debe ser opaco para no ocultar las decoraciones subyacentes.", "hoverBackground": "Color de fondo al mantener el puntero en el editor.", "hoverBorder": "Color del borde al mantener el puntero en el editor.", @@ -88,7 +85,6 @@ "mergeIncomingHeaderBackground": "Fondo de encabezado entrante en conflictos de fusión en línea. El color no debe ser opaco para no ocultar las decoraciones subyacentes.", "mergeIncomingContentBackground": "Fondo de contenido entrante en conflictos de fusión en línea. El color no debe ser opaco para no ocultar las decoraciones subyacentes.", "mergeCommonHeaderBackground": "Fondo de encabezado de ancestro común en conflictos de fusión en línea. El color no debe ser opaco para no ocultar las decoraciones subyacentes.", - "mergeCommonContentBackground": "Fondo de contenido de ancester común en conflictos de fusión en línea. El color no debe ser opaco para no ocultar las decoraciones subyacentes.", "mergeBorder": "Color del borde en los encabezados y el divisor en conflictos de combinación alineados.", "overviewRulerCurrentContentForeground": "Primer plano de la regla de visión general actual para conflictos de combinación alineados.", "overviewRulerIncomingContentForeground": "Primer plano de regla de visión general de entrada para conflictos de combinación alineados.", diff --git a/i18n/esn/src/vs/platform/url/electron-browser/inactiveExtensionUrlHandler.i18n.json b/i18n/esn/src/vs/platform/url/electron-browser/inactiveExtensionUrlHandler.i18n.json new file mode 100644 index 00000000000..35229bd6699 --- /dev/null +++ b/i18n/esn/src/vs/platform/url/electron-browser/inactiveExtensionUrlHandler.i18n.json @@ -0,0 +1,9 @@ +{ + "": [ + "--------------------------------------------------------------------------------------------", + "Copyright (c) Microsoft Corporation. All rights reserved.", + "Licensed under the MIT License. See License.txt in the project root for license information.", + "--------------------------------------------------------------------------------------------", + "Do not edit this file. It is machine generated." + ] +} \ No newline at end of file diff --git a/i18n/esn/src/vs/workbench/api/browser/viewsContainersExtensionPoint.i18n.json b/i18n/esn/src/vs/workbench/api/browser/viewsContainersExtensionPoint.i18n.json index 1dcbde980fd..9a768d6ca82 100644 --- a/i18n/esn/src/vs/workbench/api/browser/viewsContainersExtensionPoint.i18n.json +++ b/i18n/esn/src/vs/workbench/api/browser/viewsContainersExtensionPoint.i18n.json @@ -6,6 +6,12 @@ "--------------------------------------------------------------------------------------------", "Do not edit this file. It is machine generated." ], + "vscode.extension.contributes.views.containers.id": "Identificador único utilizado para identificar el contenedor en el que se pueden aportar vistas mediante el punto de contribución \"vistas\"", + "vscode.extension.contributes.views.containers.title": "Cadena de texto en lenguaje natural usada para mostrar el contenedor. ", + "vscode.extension.contributes.views.containers.icon": "Ruta para el icono de contenedor", + "vscode.extension.contributes.viewsContainer": "Contribuye con vistas de contenedores al editor ", + "views.container.activitybar": "Contribuir vistas de contenedores a la barra de actividades", + "requirearray": "contenedores de vistas deben ser una matriz", "requirestring": "la propiedad `{0}` es obligatoria y debe ser de tipo \"string\"", "showViewlet": "Mostrar {0}", "view": "Ver" diff --git a/i18n/esn/src/vs/workbench/api/browser/viewsExtensionPoint.i18n.json b/i18n/esn/src/vs/workbench/api/browser/viewsExtensionPoint.i18n.json index fed60fe1bf0..f643547c401 100644 --- a/i18n/esn/src/vs/workbench/api/browser/viewsExtensionPoint.i18n.json +++ b/i18n/esn/src/vs/workbench/api/browser/viewsExtensionPoint.i18n.json @@ -13,8 +13,7 @@ "vscode.extension.contributes.view.name": "Nombre de la vista en lenguaje natural. Será mostrado", "vscode.extension.contributes.view.when": "Condición que se debe cumplir para mostrar esta vista", "vscode.extension.contributes.views": "Aporta vistas al editor", - "views.explorer": "Vista del explorador", - "views.debug": "Vista de depuración", + "views.explorer": "Aporta vistas al contenedor del explorador en la barra de actividades", "duplicateView1": "No se pueden registrar múltiples vistas con el mismo identificador '{0}' en la ubicación '{1}'", "duplicateView2": "Una vista con el identificador '{0}' ya está registrada en la ubicación '{1}'" } \ No newline at end of file diff --git a/i18n/esn/src/vs/workbench/browser/parts/quickinput/quickInput.i18n.json b/i18n/esn/src/vs/workbench/browser/parts/quickinput/quickInput.i18n.json index 232be4ece69..8a0f29393fc 100644 --- a/i18n/esn/src/vs/workbench/browser/parts/quickinput/quickInput.i18n.json +++ b/i18n/esn/src/vs/workbench/browser/parts/quickinput/quickInput.i18n.json @@ -6,6 +6,8 @@ "--------------------------------------------------------------------------------------------", "Do not edit this file. It is machine generated." ], + "inputModeEntryDescription": "{0} (Presione \"Entrar\" para confirmar o \"Esc\" para cancelar)", + "inputModeEntry": "Presione \"Entrar\" para confirmar su entrada o \"Esc\" para cancelar", "quickInput.countSelected": "{0} seleccionadas", "ok": "Aceptar" } \ No newline at end of file diff --git a/i18n/esn/src/vs/workbench/parts/debug/browser/breakpointsView.i18n.json b/i18n/esn/src/vs/workbench/parts/debug/browser/breakpointsView.i18n.json index bde7768bba1..37e9aafcaca 100644 --- a/i18n/esn/src/vs/workbench/parts/debug/browser/breakpointsView.i18n.json +++ b/i18n/esn/src/vs/workbench/parts/debug/browser/breakpointsView.i18n.json @@ -6,7 +6,10 @@ "--------------------------------------------------------------------------------------------", "Do not edit this file. It is machine generated." ], + "logPoint": "Punto de registro", "breakpoint": "Punto de interrupción", + "editBreakpoint": "Editar {0}...", + "removeBreakpoint": "Quitar {0}", "functionBreakpointsNotSupported": "Este tipo de depuración no admite puntos de interrupción en funciones", "functionBreakpointPlaceholder": "Función donde interrumpir", "functionBreakPointInputAriaLabel": "Escribir punto de interrupción de función", diff --git a/i18n/esn/src/vs/workbench/parts/debug/browser/debugActions.i18n.json b/i18n/esn/src/vs/workbench/parts/debug/browser/debugActions.i18n.json index eee54fa1f1c..c076750fb73 100644 --- a/i18n/esn/src/vs/workbench/parts/debug/browser/debugActions.i18n.json +++ b/i18n/esn/src/vs/workbench/parts/debug/browser/debugActions.i18n.json @@ -21,6 +21,7 @@ "disconnectDebug": "Desconectar", "continueDebug": "Continuar", "pauseDebug": "Pausar", + "terminateThread": "Terminar hilo de ejecución", "restartFrame": "Reiniciar marco", "removeBreakpoint": "Quitar punto de interrupción", "removeAllBreakpoints": "Quitar todos los puntos de interrupción", diff --git a/i18n/esn/src/vs/workbench/parts/debug/electron-browser/breakpointWidget.i18n.json b/i18n/esn/src/vs/workbench/parts/debug/electron-browser/breakpointWidget.i18n.json index 3da9af08237..b238709d15f 100644 --- a/i18n/esn/src/vs/workbench/parts/debug/electron-browser/breakpointWidget.i18n.json +++ b/i18n/esn/src/vs/workbench/parts/debug/electron-browser/breakpointWidget.i18n.json @@ -6,6 +6,7 @@ "--------------------------------------------------------------------------------------------", "Do not edit this file. It is machine generated." ], + "breakpointWidgetLogMessagePlaceholder": "Mensaje para registrar cuando se alcanza el punto de interrupción. Las expresiones entre {} son interpoladas. 'Enter' para aceptar, 'esc' para cancelar. ", "breakpointWidgetHitCountPlaceholder": "Interrumpir cuando se alcance el número de llamadas. Presione \"ENTRAR\" para aceptar o \"Esc\" para cancelar.", "breakpointWidgetExpressionPlaceholder": "Interrumpir cuando la expresión se evalúa como true. Presione \"ENTRAR\" para aceptar o \"Esc\" para cancelar.", "expression": "Expresión", diff --git a/i18n/esn/src/vs/workbench/parts/debug/electron-browser/debugConfigurationManager.i18n.json b/i18n/esn/src/vs/workbench/parts/debug/electron-browser/debugConfigurationManager.i18n.json index 779210b4ba7..ed0291ca11b 100644 --- a/i18n/esn/src/vs/workbench/parts/debug/electron-browser/debugConfigurationManager.i18n.json +++ b/i18n/esn/src/vs/workbench/parts/debug/electron-browser/debugConfigurationManager.i18n.json @@ -35,6 +35,7 @@ "useUniqueNames": "Por favor utilice nombres de configuración exclusivos.", "app.launch.json.compound.folder": "Nombre de la carpeta en la que se encuentra el compuesto.", "app.launch.json.compounds.configurations": "Nombres de las configuraciones que se iniciarán como parte de este elemento compuesto.", + "debugNoType": "El 'tipo' de depurador no se puede omitir y debe ser de tipo 'cadena'. ", "selectDebug": "Seleccionar entorno", "DebugConfig.failed": "No se puede crear el archivo \"launch.json\" dentro de la carpeta \".vscode\" ({0}).", "workspace": "espacio de trabajo", diff --git a/i18n/esn/src/vs/workbench/parts/debug/electron-browser/debugEditorContribution.i18n.json b/i18n/esn/src/vs/workbench/parts/debug/electron-browser/debugEditorContribution.i18n.json index 3ff917571be..42d36b69237 100644 --- a/i18n/esn/src/vs/workbench/parts/debug/electron-browser/debugEditorContribution.i18n.json +++ b/i18n/esn/src/vs/workbench/parts/debug/electron-browser/debugEditorContribution.i18n.json @@ -6,7 +6,12 @@ "--------------------------------------------------------------------------------------------", "Do not edit this file. It is machine generated." ], + "logPoint": "Punto de registro", "breakpoint": "Punto de interrupción", + "removeBreakpoint": "Quitar {0}", + "editBreakpoint": "Editar {0}...", + "disableBreakpoint": "Desactivar {0}", + "enableBreakpoint": "Activar {0}", "removeBreakpoints": "Quitar puntos de interrupción", "removeBreakpointOnColumn": "Quitar punto de interrupción en la columna {0}", "removeLineBreakpoint": "Quitar punto de interrupción de línea", @@ -21,6 +26,10 @@ "addBreakpoint": "Agregar punto de interrupción", "addConditionalBreakpoint": "Agregar punto de interrupción condicional...", "addLogPoint": "Agregar punto de registro...", + "message": "mensaje", + "condition": "condición", + "removeLogPoint": "Quitar {0}", + "disableLogPoint": "Desactivar {0}", "cancel": "Cancelar", "addConfiguration": "Agregar configuración..." } \ No newline at end of file diff --git a/i18n/esn/src/vs/workbench/parts/extensions/electron-browser/extensionEditor.i18n.json b/i18n/esn/src/vs/workbench/parts/extensions/electron-browser/extensionEditor.i18n.json index 9945b32ea23..cfe207de40c 100644 --- a/i18n/esn/src/vs/workbench/parts/extensions/electron-browser/extensionEditor.i18n.json +++ b/i18n/esn/src/vs/workbench/parts/extensions/electron-browser/extensionEditor.i18n.json @@ -36,6 +36,7 @@ "view location": "Donde", "localizations": "Localizaciones ({0}) ", "localizations language id": "ID. de idioma", + "localizations localized language name": "Nombre de idioma (localizado)", "colorThemes": "Temas de color ({0})", "iconThemes": "Temas de icono ({0})", "colors": "Colores ({0})", diff --git a/i18n/esn/src/vs/workbench/parts/files/electron-browser/fileActions.i18n.json b/i18n/esn/src/vs/workbench/parts/files/electron-browser/fileActions.i18n.json index 9cb57c08e43..6b6e51838a6 100644 --- a/i18n/esn/src/vs/workbench/parts/files/electron-browser/fileActions.i18n.json +++ b/i18n/esn/src/vs/workbench/parts/files/electron-browser/fileActions.i18n.json @@ -13,6 +13,7 @@ "copyFile": "Copiar", "pasteFile": "Pegar", "retry": "Reintentar", + "renameWhenSourcePathIsParentOfTargetError": "Utilice el comando 'Nueva carpeta' o 'Nuevo archivo' para agregar elementos a una carpeta existente ", "newUntitledFile": "Nuevo archivo sin título", "createNewFile": "Nuevo archivo", "createNewFolder": "Nueva carpeta", @@ -24,20 +25,21 @@ "dirtyMessageFolderDelete": "Va a eliminar una carpeta con cambios sin guardar en {0} archivos. ¿Desea continuar?", "dirtyMessageFileDelete": "Va a eliminar un archivo con cambios sin guardar. ¿Desea continuar?", "dirtyWarning": "Los cambios se perderán si no se guardan.", - "confirmMoveTrashMessageMultiple": "¿Está seguro de que desea eliminar los siguientes archivos {0}?", - "confirmMoveTrashMessageFolder": "¿Está seguro de que desea eliminar '{0}' y su contenido?", - "confirmMoveTrashMessageFile": "¿Está seguro de que desea eliminar '{0}'?", "undoBin": "Se puede restaurar de la papelera de reciclaje.", "undoTrash": "Se puede restaurar de la papelera.", "doNotAskAgain": "No volver a preguntarme", - "confirmDeleteMessageMultiple": "¿Está seguro de que desea eliminar de forma permanente los siguientes archivos {0}?", - "confirmDeleteMessageFolder": "¿Está seguro de que desea eliminar '{0}' y su contenido de forma permanente?", - "confirmDeleteMessageFile": "¿Está seguro de que desea eliminar '{0}' de forma permanente?", "irreversible": "Esta acción es irreversible.", "binFailed": "Error al eliminar usando la papelera de reciclaje. ¿Desea eliminar de forma permanente en su lugar?", "trashFailed": "No se pudo eliminar usando la papelera. ¿Desea eliminar de forma permanente?", "deletePermanentlyButtonLabel": "&&Eliminar de forma permanente", "retryButtonLabel": "&&Reintentar", + "confirmMoveTrashMessageMultiple": "¿Está seguro de que desea eliminar los siguientes archivos {0}?", + "confirmMoveTrashMessageFolder": "¿Está seguro de que desea eliminar '{0}' y su contenido?", + "confirmMoveTrashMessageFile": "¿Está seguro de que desea eliminar '{0}'?", + "confirmDeleteMessageMultiple": "¿Está seguro de que desea eliminar de forma permanente los siguientes archivos {0}?", + "confirmDeleteMessageFolder": "¿Está seguro de que desea eliminar '{0}' y su contenido de forma permanente?", + "confirmDeleteMessageFile": "¿Está seguro de que desea eliminar '{0}' de forma permanente?", + "addFiles": "Agregar archivos", "confirmOverwrite": "Ya existe un archivo o carpeta con el mismo nombre en la carpeta de destino. ¿Quiere reemplazarlo?", "replaceButtonLabel": "&&Reemplazar", "fileIsAncestor": "El archivo que se va a pegar es un antecesor de la carpeta de destino", @@ -57,7 +59,9 @@ "openFileToShowInNewWindow": "Abrir un archivo antes para abrirlo en una nueva ventana", "copyPath": "Copiar ruta de acceso", "emptyFileNameError": "Debe especificarse un nombre de archivo o carpeta.", + "fileNameStartsWithSlashError": "El nombre de archivo o carpeta no puede comenzar con el carácter barra. ", "fileNameExistsError": "Ya existe el archivo o carpeta **{0}** en esta ubicación. Elija un nombre diferente.", + "fileUsedAsFolderError": "** {0} ** es un archivo y no puede tener elementos descendientes. ", "invalidFileNameError": "El nombre **{0}** no es válido para el archivo o la carpeta. Elija un nombre diferente.", "filePathTooLongError": "El nombre **{0}** da como resultado una ruta de acceso demasiado larga. Elija un nombre más corto.", "compareWithClipboard": "Comparar archivo activo con portapapeles", diff --git a/i18n/esn/src/vs/workbench/parts/files/electron-browser/files.contribution.i18n.json b/i18n/esn/src/vs/workbench/parts/files/electron-browser/files.contribution.i18n.json index 6a280847cb6..530360de300 100644 --- a/i18n/esn/src/vs/workbench/parts/files/electron-browser/files.contribution.i18n.json +++ b/i18n/esn/src/vs/workbench/parts/files/electron-browser/files.contribution.i18n.json @@ -35,6 +35,7 @@ "hotExit": "Controla si los archivos no guardados se recuerdan entre las sesiones, lo que permite omitir el mensaje para guardar al salir del editor.", "useExperimentalFileWatcher": "Utilice el nuevo monitor de archivo experimental.", "defaultLanguage": "El modo de lenguaje predeterminado que se asigna a nuevos archivos.", + "maxMemoryForLargeFilesMB": "Controla la memoria disponible para VS Code después de reiniciar, cuando se intenta abrir archivos de gran tamaño. Afecta de la misma manera si se especifica --max-memory = NUEVOTAMAÑO en la línea de comandos. ", "editorConfigurationTitle": "Editor", "formatOnSave": "Formatea un archivo al guardarlo. Debe haber un formateador disponible, el archivo no debe guardarse automáticamente y el editor no debe estar cerrándose.", "formatOnSaveTimeout": "Tiempo de espera de aplicación de formato al guardar. Especifica un límite de tiempo en milisegundos para los comandos formatOnSave. Los comandos que tarden más del tiempo de espera especificado se cancelarán.", diff --git a/i18n/esn/src/vs/workbench/parts/files/electron-browser/views/explorerViewer.i18n.json b/i18n/esn/src/vs/workbench/parts/files/electron-browser/views/explorerViewer.i18n.json index 2a357906cfb..d9af20c9554 100644 --- a/i18n/esn/src/vs/workbench/parts/files/electron-browser/views/explorerViewer.i18n.json +++ b/i18n/esn/src/vs/workbench/parts/files/electron-browser/views/explorerViewer.i18n.json @@ -7,6 +7,9 @@ "Do not edit this file. It is machine generated." ], "fileInputAriaLabel": "Escriba el nombre de archivo. Presione ENTRAR para confirmar o Esc para cancelar", + "createFileFromExplorerInfoMessage": "Crear archivo ** {0} ** en ** {1} **", + "renameFileFromExplorerInfoMessage": "Mover y renombrar a ** {0} **", + "createFolderFromExplorerInfoMessage": "Crear carpeta ** {0} ** en ** {1} **", "filesExplorerViewerAriaLabel": "{0}, Explorador de archivos", "dropFolders": "¿Quiere agregar las carpetas al área de trabajo?", "dropFolder": "¿Quiere agregar la carpeta al área de trabajo?", diff --git a/i18n/esn/src/vs/workbench/parts/localizations/electron-browser/localizations.contribution.i18n.json b/i18n/esn/src/vs/workbench/parts/localizations/electron-browser/localizations.contribution.i18n.json new file mode 100644 index 00000000000..d591b463a2e --- /dev/null +++ b/i18n/esn/src/vs/workbench/parts/localizations/electron-browser/localizations.contribution.i18n.json @@ -0,0 +1,23 @@ +{ + "": [ + "--------------------------------------------------------------------------------------------", + "Copyright (c) Microsoft Corporation. All rights reserved.", + "Licensed under the MIT License. See License.txt in the project root for license information.", + "--------------------------------------------------------------------------------------------", + "Do not edit this file. It is machine generated." + ], + "updateLocale": "¿Desea cambiar el idioma de la interfaz de usuario de VS Code a {0} y reiniciar la aplicación?", + "yes": "Sí", + "no": "No", + "neverAgain": "No volver a mostrar", + "install": "Instalar", + "JsonSchema.locale": "Idioma de la interfaz de usuario que debe usarse.", + "vscode.extension.contributes.localizations": "Contribuye a la localización del editor", + "vscode.extension.contributes.localizations.languageId": "Identificador del idioma en el que se traducen las cadenas de visualización.", + "vscode.extension.contributes.localizations.languageName": "Nombre del idioma en Inglés.", + "vscode.extension.contributes.localizations.languageNameLocalized": "Nombre de la lengua en el idioma contribuido.", + "vscode.extension.contributes.localizations.translations": "Lista de traducciones asociadas al idioma.", + "vscode.extension.contributes.localizations.translations.id": "ID de VS Code o extensión a la que se ha contribuido esta traducción. ID de código vs es siempre ' vscode ' y de extensión debe ser en formato ' publisherID. extensionName '.", + "vscode.extension.contributes.localizations.translations.id.pattern": "ID debe ser ' vscode ' o en formato ' publisherId.extensionName ' para traducer VS Code o una extensión respectivamente.", + "vscode.extension.contributes.localizations.translations.path": "Una ruta de acceso relativa a un archivo que contiene traducciones para el idioma." +} \ No newline at end of file diff --git a/i18n/esn/src/vs/workbench/parts/localizations/electron-browser/localizationsActions.i18n.json b/i18n/esn/src/vs/workbench/parts/localizations/electron-browser/localizationsActions.i18n.json new file mode 100644 index 00000000000..e5e5ab4cfb0 --- /dev/null +++ b/i18n/esn/src/vs/workbench/parts/localizations/electron-browser/localizationsActions.i18n.json @@ -0,0 +1,14 @@ +{ + "": [ + "--------------------------------------------------------------------------------------------", + "Copyright (c) Microsoft Corporation. All rights reserved.", + "Licensed under the MIT License. See License.txt in the project root for license information.", + "--------------------------------------------------------------------------------------------", + "Do not edit this file. It is machine generated." + ], + "configureLocale": "Configurar idioma", + "displayLanguage": "Define el lenguaje para mostrar de VSCode.", + "doc": "Consulte {0} para obtener una lista de idiomas compatibles.", + "restart": "Al cambiar el valor se requiere reiniciar VSCode.", + "fail.createSettings": "No se puede crear '{0}' ({1})." +} \ No newline at end of file diff --git a/i18n/esn/src/vs/workbench/parts/markers/electron-browser/markersPanel.i18n.json b/i18n/esn/src/vs/workbench/parts/markers/electron-browser/markersPanel.i18n.json index 35229bd6699..a3e789a9af7 100644 --- a/i18n/esn/src/vs/workbench/parts/markers/electron-browser/markersPanel.i18n.json +++ b/i18n/esn/src/vs/workbench/parts/markers/electron-browser/markersPanel.i18n.json @@ -5,5 +5,7 @@ "Licensed under the MIT License. See License.txt in the project root for license information.", "--------------------------------------------------------------------------------------------", "Do not edit this file. It is machine generated." - ] + ], + "disableFilesExclude": "Desactivar la exclusión de archivos.", + "clearFilter": "Borrar el filtro." } \ No newline at end of file diff --git a/i18n/esn/src/vs/workbench/parts/markers/electron-browser/markersPanelActions.i18n.json b/i18n/esn/src/vs/workbench/parts/markers/electron-browser/markersPanelActions.i18n.json index 35229bd6699..cd0f382c88c 100644 --- a/i18n/esn/src/vs/workbench/parts/markers/electron-browser/markersPanelActions.i18n.json +++ b/i18n/esn/src/vs/workbench/parts/markers/electron-browser/markersPanelActions.i18n.json @@ -5,5 +5,6 @@ "Licensed under the MIT License. See License.txt in the project root for license information.", "--------------------------------------------------------------------------------------------", "Do not edit this file. It is machine generated." - ] + ], + "showing filtered problems": "Mostrando {0} de {1}" } \ No newline at end of file diff --git a/i18n/esn/src/vs/workbench/parts/markers/electron-browser/messages.i18n.json b/i18n/esn/src/vs/workbench/parts/markers/electron-browser/messages.i18n.json index e7f7ed6b7d1..6a0bda8b6c1 100644 --- a/i18n/esn/src/vs/workbench/parts/markers/electron-browser/messages.i18n.json +++ b/i18n/esn/src/vs/workbench/parts/markers/electron-browser/messages.i18n.json @@ -14,8 +14,10 @@ "markers.panel.title.problems": "Problemas", "markers.panel.aria.label.problems.tree": "Problemas agrupados por archivos", "markers.panel.no.problems.build": "Hasta el momento, no se encontraron problemas en el área de trabajo.", + "markers.panel.no.problems.filters": "No se encontraron resultados con los criterios de filtro proporcionados.", "markers.panel.action.filter": "Filtrar problemas", "markers.panel.filter.ariaLabel": "Filtrar problemas", + "markers.panel.filter.placeholder": "Filtro. Por ejemplo: text, **/*.ts, !**/node_modules/**", "markers.panel.filter.errors": "errores", "markers.panel.filter.warnings": "advertencias", "markers.panel.filter.infos": "informaciones", diff --git a/i18n/esn/src/vs/workbench/parts/tasks/electron-browser/task.contribution.i18n.json b/i18n/esn/src/vs/workbench/parts/tasks/electron-browser/task.contribution.i18n.json index 870798c942c..7024547e7bb 100644 --- a/i18n/esn/src/vs/workbench/parts/tasks/electron-browser/task.contribution.i18n.json +++ b/i18n/esn/src/vs/workbench/parts/tasks/electron-browser/task.contribution.i18n.json @@ -31,6 +31,8 @@ "selectProblemMatcher": "Seleccione qué tipo de errores y advertencias deben buscarse durante el examen de la salida de la tarea", "customizeParseErrors": "La configuración actual de tareas contiene errores. Antes de personalizar una tarea, corrija los errores.", "moreThanOneBuildTask": "Hay muchas tareas de compilación definidas en el archivo tasks.json. Se ejecutará la primera.\n", + "TaskSystem.activeSame.background": "La tarea '{0}' ya está activa y en segundo plano.", + "TaskSystem.activeSame.noBackground": "La tarea '{0}' ya está activa.", "terminateTask": "Finalizar tarea", "restartTask": "Reiniciar tarea", "TaskSystem.active": "Ya hay una tarea en ejecución. Finalícela antes de ejecutar otra tarea.", diff --git a/i18n/esn/src/vs/workbench/parts/terminal/electron-browser/terminalInstance.i18n.json b/i18n/esn/src/vs/workbench/parts/terminal/electron-browser/terminalInstance.i18n.json index 9b9c6d0cbc3..e6b32d074fe 100644 --- a/i18n/esn/src/vs/workbench/parts/terminal/electron-browser/terminalInstance.i18n.json +++ b/i18n/esn/src/vs/workbench/parts/terminal/electron-browser/terminalInstance.i18n.json @@ -12,5 +12,6 @@ "terminal.integrated.copySelection.noSelection": "El terminal no tiene ninguna selección para copiar", "terminal.integrated.exitedWithCode": "El proceso del terminal finalizó con el código de salida: {0}", "terminal.integrated.waitOnExit": "Presione cualquier tecla para cerrar el terminar", - "terminal.integrated.launchFailed": "No se pudo iniciar el comando de proceso del terminal \"{0}{1}\" (código de salida: {2})" + "terminal.integrated.launchFailed": "No se pudo iniciar el comando de proceso del terminal \"{0}{1}\" (código de salida: {2})", + "terminal.integrated.launchFailedExtHost": "El proceso terminal no pudo iniciarse (código de salida: {0})" } \ No newline at end of file diff --git a/i18n/esn/src/vs/workbench/parts/url/electron-browser/url.contribution.i18n.json b/i18n/esn/src/vs/workbench/parts/url/electron-browser/url.contribution.i18n.json new file mode 100644 index 00000000000..5ce816dbcbe --- /dev/null +++ b/i18n/esn/src/vs/workbench/parts/url/electron-browser/url.contribution.i18n.json @@ -0,0 +1,11 @@ +{ + "": [ + "--------------------------------------------------------------------------------------------", + "Copyright (c) Microsoft Corporation. All rights reserved.", + "Licensed under the MIT License. See License.txt in the project root for license information.", + "--------------------------------------------------------------------------------------------", + "Do not edit this file. It is machine generated." + ], + "openUrl": "Abrir URL", + "developer": "Desarrollador" +} \ No newline at end of file diff --git a/i18n/esn/src/vs/workbench/parts/welcome/page/electron-browser/vs_code_welcome_page.i18n.json b/i18n/esn/src/vs/workbench/parts/welcome/page/electron-browser/vs_code_welcome_page.i18n.json index dfe6cefe425..c28887631f1 100644 --- a/i18n/esn/src/vs/workbench/parts/welcome/page/electron-browser/vs_code_welcome_page.i18n.json +++ b/i18n/esn/src/vs/workbench/parts/welcome/page/electron-browser/vs_code_welcome_page.i18n.json @@ -27,6 +27,7 @@ "welcomePage.installExtensionPacks": "Herramientas y lenguajes", "welcomePage.installExtensionPacksDescription": "Instalar soporte para {0} y {1}", "welcomePage.moreExtensions": "más", + "welcomePage.installKeymapExtension": "Instalar la configuración y los métodos abreviados de teclado de {0} y {1}", "welcomePage.others": "otros", "welcomePage.colorTheme": "Tema de color", "welcomePage.colorThemeDescription": "Modifique a su gusto la apariencia del editor y el código", diff --git a/i18n/esn/src/vs/workbench/services/configurationResolver/node/variableResolver.i18n.json b/i18n/esn/src/vs/workbench/services/configurationResolver/node/variableResolver.i18n.json new file mode 100644 index 00000000000..1f9de833c22 --- /dev/null +++ b/i18n/esn/src/vs/workbench/services/configurationResolver/node/variableResolver.i18n.json @@ -0,0 +1,15 @@ +{ + "": [ + "--------------------------------------------------------------------------------------------", + "Copyright (c) Microsoft Corporation. All rights reserved.", + "Licensed under the MIT License. See License.txt in the project root for license information.", + "--------------------------------------------------------------------------------------------", + "Do not edit this file. It is machine generated." + ], + "missingEnvVarName": "'{0}' no puede resolverse porque no se asignó nombre de variable de entorno. ", + "configNotFound": "'{0}' puede no resolverse porque la configuración '{1}' no fué encontrada. ", + "configNoString": "'{0}' puede no resolverse porque '{1}' es un valor estructurado.", + "missingConfigName": "'{0}' no puede resolverse porque no tiene asignado un nombre de configuración . ", + "canNotResolveWorkspaceFolderMultiRoot": "'{0}' no puede ser resuelto en un espacio de trabajo multicarpeta. Defina el alcance de esta variable utilizando ':' y un nombre de carpeta del espacio de trabajo. ", + "canNotResolveWorkspaceFolder": "'{0}' no puede ser resuelto. Por favor, abra una carpeta." +} \ No newline at end of file diff --git a/i18n/esn/src/vs/workbench/services/files/electron-browser/fileService.i18n.json b/i18n/esn/src/vs/workbench/services/files/electron-browser/fileService.i18n.json index ecc3269c8a1..36c012260a5 100644 --- a/i18n/esn/src/vs/workbench/services/files/electron-browser/fileService.i18n.json +++ b/i18n/esn/src/vs/workbench/services/files/electron-browser/fileService.i18n.json @@ -14,6 +14,7 @@ "fileInvalidPath": "Recurso de archivo no válido ({0})", "fileIsDirectoryError": "El archivo es un directorio", "fileNotModifiedError": "Archivo no modificado desde", + "fileTooLargeForHeapError": "Para abrir un archivo de este tamaño, es necesario reiniciar VS Code y permitirle utilizar más memoria", "fileTooLargeError": "Archivo demasiado grande para abrirlo", "fileNotFoundError": "Archivo no encontrado ({0})", "fileBinaryError": "El archivo parece ser binario y no se puede abrir como texto", diff --git a/i18n/esn/src/vs/workbench/services/files/electron-browser/remoteFileService.i18n.json b/i18n/esn/src/vs/workbench/services/files/electron-browser/remoteFileService.i18n.json index 33d664310eb..656532917aa 100644 --- a/i18n/esn/src/vs/workbench/services/files/electron-browser/remoteFileService.i18n.json +++ b/i18n/esn/src/vs/workbench/services/files/electron-browser/remoteFileService.i18n.json @@ -9,5 +9,6 @@ "fileNotFoundError": "Archivo no encontrado ({0})", "fileIsDirectoryError": "El archivo es un directorio", "fileNotModifiedError": "Archivo no modificado desde", - "fileBinaryError": "El archivo parece ser binario y no se puede abrir como texto" + "fileBinaryError": "El archivo parece ser binario y no se puede abrir como texto", + "err.create": "No se pudo crear el archivo {0}" } \ No newline at end of file diff --git a/i18n/fra/extensions/npm/out/npmView.i18n.json b/i18n/fra/extensions/npm/out/npmView.i18n.json new file mode 100644 index 00000000000..35229bd6699 --- /dev/null +++ b/i18n/fra/extensions/npm/out/npmView.i18n.json @@ -0,0 +1,9 @@ +{ + "": [ + "--------------------------------------------------------------------------------------------", + "Copyright (c) Microsoft Corporation. All rights reserved.", + "Licensed under the MIT License. See License.txt in the project root for license information.", + "--------------------------------------------------------------------------------------------", + "Do not edit this file. It is machine generated." + ] +} \ No newline at end of file diff --git a/i18n/fra/extensions/npm/out/tasks.i18n.json b/i18n/fra/extensions/npm/out/tasks.i18n.json new file mode 100644 index 00000000000..18fa5992ad7 --- /dev/null +++ b/i18n/fra/extensions/npm/out/tasks.i18n.json @@ -0,0 +1,10 @@ +{ + "": [ + "--------------------------------------------------------------------------------------------", + "Copyright (c) Microsoft Corporation. All rights reserved.", + "Licensed under the MIT License. See License.txt in the project root for license information.", + "--------------------------------------------------------------------------------------------", + "Do not edit this file. It is machine generated." + ], + "npm.parseError": "Détection de tâche Npm : impossible d’analyser le fichier {0}" +} \ No newline at end of file diff --git a/i18n/fra/extensions/npm/package.i18n.json b/i18n/fra/extensions/npm/package.i18n.json index e469e500438..372b90c5172 100644 --- a/i18n/fra/extensions/npm/package.i18n.json +++ b/i18n/fra/extensions/npm/package.i18n.json @@ -14,5 +14,8 @@ "config.npm.exclude": "Configurer les profils glob pour les dossiers qui doivent être exclus de la détection de script automatique.", "npm.parseError": "Détection de tâche Npm : impossible d’analyser le fichier {0}", "taskdef.script": "Le script npm à personnaliser.", - "taskdef.path": "Le chemin d’accès au dossier du fichier package.json qui fournit le script. Peut être oublié." + "taskdef.path": "Le chemin d’accès au dossier du fichier package.json qui fournit le script. Peut être oublié.", + "command.refresh": "Actualiser", + "command.debug": "Déboguer", + "command.openScript": "Ouvrir" } \ No newline at end of file diff --git a/i18n/fra/src/vs/base/node/processes.i18n.json b/i18n/fra/src/vs/base/node/processes.i18n.json index 35229bd6699..ca243cc3f48 100644 --- a/i18n/fra/src/vs/base/node/processes.i18n.json +++ b/i18n/fra/src/vs/base/node/processes.i18n.json @@ -5,5 +5,6 @@ "Licensed under the MIT License. See License.txt in the project root for license information.", "--------------------------------------------------------------------------------------------", "Do not edit this file. It is machine generated." - ] + ], + "TaskRunner.UNC": "Impossible d’exécuter une commande shell sur un lecteur UNC." } \ No newline at end of file diff --git a/i18n/fra/src/vs/base/node/zip.i18n.json b/i18n/fra/src/vs/base/node/zip.i18n.json index 88642f448bb..403f7ab5807 100644 --- a/i18n/fra/src/vs/base/node/zip.i18n.json +++ b/i18n/fra/src/vs/base/node/zip.i18n.json @@ -6,5 +6,6 @@ "--------------------------------------------------------------------------------------------", "Do not edit this file. It is machine generated." ], + "incompleteExtract": "Incomplète. {0} sur {1} entrées extraites", "notFound": "{0} introuvable dans le zip." } \ No newline at end of file diff --git a/i18n/fra/src/vs/code/electron-main/menus.i18n.json b/i18n/fra/src/vs/code/electron-main/menus.i18n.json index 021a8b5c68b..96efb700a07 100644 --- a/i18n/fra/src/vs/code/electron-main/menus.i18n.json +++ b/i18n/fra/src/vs/code/electron-main/menus.i18n.json @@ -146,6 +146,7 @@ "miConditionalBreakpoint": "Point d'arrêt &&conditionnel...", "miColumnBreakpoint": "P&&oint d'arrêt de la colonne", "miFunctionBreakpoint": "Point d'arrêt sur &&fonction...", + "miLogPoint": "&&Log Point...", "miNewBreakpoint": "&&Nouveau point d'arrêt", "miEnableAllBreakpoints": "Activer tous les points d'arrêt", "miDisableAllBreakpoints": "Désacti&&ver tous les points d'arrêt", diff --git a/i18n/fra/src/vs/editor/browser/widget/diffReview.i18n.json b/i18n/fra/src/vs/editor/browser/widget/diffReview.i18n.json index cb044b0dca6..8aa1ed51f9e 100644 --- a/i18n/fra/src/vs/editor/browser/widget/diffReview.i18n.json +++ b/i18n/fra/src/vs/editor/browser/widget/diffReview.i18n.json @@ -7,6 +7,10 @@ "Do not edit this file. It is machine generated." ], "label.close": "Fermer", + "no_lines": "aucune ligne", + "one_line": "1 ligne", + "more_lines": "{0} lignes", + "header": "Différence {0} sur {1} : original {2}, {3}, modifié {4}, {5}", "blankLine": "vide", "equalLine": "{0} d'origine, {1} modifiées : {2}", "insertLine": "+ {0} modifiées : {1}", diff --git a/i18n/fra/src/vs/editor/common/commonCodeEditor.i18n.json b/i18n/fra/src/vs/editor/common/commonCodeEditor.i18n.json index 35229bd6699..973f68f5229 100644 --- a/i18n/fra/src/vs/editor/common/commonCodeEditor.i18n.json +++ b/i18n/fra/src/vs/editor/common/commonCodeEditor.i18n.json @@ -5,5 +5,6 @@ "Licensed under the MIT License. See License.txt in the project root for license information.", "--------------------------------------------------------------------------------------------", "Do not edit this file. It is machine generated." - ] + ], + "cursors.maximum": "Le nombre de curseurs a été limité à {0}." } \ No newline at end of file diff --git a/i18n/fra/src/vs/editor/common/config/commonEditorConfig.i18n.json b/i18n/fra/src/vs/editor/common/config/commonEditorConfig.i18n.json index ef46fe72220..5be70689027 100644 --- a/i18n/fra/src/vs/editor/common/config/commonEditorConfig.i18n.json +++ b/i18n/fra/src/vs/editor/common/config/commonEditorConfig.i18n.json @@ -16,7 +16,7 @@ "lineNumbers.on": "Les numéros de ligne sont affichés en nombre absolu.", "lineNumbers.relative": "Les numéros de ligne sont affichés sous la forme de distance en lignes à la position du curseur.", "lineNumbers.interval": "Les numéros de ligne sont affichés toutes les 10 lignes.", - "lineNumbers": "Contrôle l’affichage des numéros de ligne. Les valeurs possibles sont 'on', 'off', 'relative' et 'interval'.", + "lineNumbers": "Contrôle l’affichage des numéros de ligne.", "rulers": "Afficher les règles verticales après un certain nombre de caractères à espacement fixe. Utiliser plusieurs valeurs pour plusieurs règles. Aucune règle n'est dessinée si le tableau est vide", "wordSeparators": "Caractères utilisés comme séparateurs de mots durant la navigation ou les opérations basées sur les mots", "tabSize": "Le nombre d'espaces correspondant à une tabulation. Ce paramètre est remplacé en fonction du contenu du fichier quand 'editor.detectIndentation' est activé.", @@ -28,8 +28,8 @@ "scrollBeyondLastLine": "Contrôle si l'éditeur défile au-delà de la dernière ligne", "smoothScrolling": "Contrôle si l'éditeur défilera en utilisant une animation", "minimap.enabled": "Contrôle si la minicarte est affichée", - "minimap.side": "Contrôle le côté où afficher la minicarte. Les valeurs possibles sont 'right' et 'left'", - "minimap.showSlider": "Contrôle si le curseur de la minicarte est automatiquement masqué. Les valeurs possibles sont 'always' et 'mouseover'", + "minimap.side": "Contrôle le côté où afficher la minicarte.", + "minimap.showSlider": "Contrôle si le curseur de la minicarte est automatiquement masqué", "minimap.renderCharacters": "Afficher les caractères réels sur une ligne (par opposition aux blocs de couleurs)", "minimap.maxColumn": "Limiter la largeur de la minicarte pour afficher au maximum un certain nombre de colonnes", "find.seedSearchStringFromSelection": "Contrôle si nous remplissons la chaîne à rechercher dans le Widget Recherche à partir de la sélection de l'éditeur", @@ -77,7 +77,7 @@ "occurrencesHighlight": "Contrôle si l'éditeur doit mettre en surbrillance les occurrences de symboles sémantiques", "overviewRulerLanes": "Contrôle le nombre d'ornements pouvant s'afficher à la même position dans la règle d'aperçu", "overviewRulerBorder": "Contrôle si une bordure doit être dessinée autour de la règle d'aperçu.", - "cursorBlinking": "Contrôle le style d'animation du curseur. Valeurs possibles : 'blink', 'smooth', 'phase', 'expand' et 'solid'", + "cursorBlinking": "Contrôler le style d’animation du curseur.", "mouseWheelZoom": "Agrandir ou réduire la police de l'éditeur quand l'utilisateur fait tourner la roulette de la souris tout en maintenant la touche Ctrl enfoncée", "cursorStyle": "Contrôle le style du curseur. Les valeurs acceptées sont 'block', 'block-outline', 'line', 'line-thin', 'underline' et 'underline-thin'", "cursorWidth": "Contrôle la largeur du curseur quand editor.cursorStyle est à 'line'", @@ -87,7 +87,7 @@ "renderControlCharacters": "Contrôle si l'éditeur doit afficher les caractères de contrôle", "renderIndentGuides": "Contrôle si l'éditeur doit afficher les repères de mise en retrait", "renderLineHighlight": "Contrôle la façon dont l'éditeur doit afficher la surbrillance de la ligne active. Les différentes possibilités sont 'none', 'gutter', 'line' et 'all'.", - "codeLens": "Contrôle si l'éditeur affiche les indicateurs CodeLens", + "codeLens": "Contrôle si l’éditeur affiche CodeLens", "folding": "Contrôle si le pliage de code est activé dans l'éditeur", "foldingStrategyAuto": "Si disponible, utilisez une stratégie de présentation langage-spécifique, sinon la stratégie d'indentation s'applique.", "foldingStrategyIndentation": "Utilisez toujours l'indentation basée sur la stratégie de présentation", @@ -106,6 +106,9 @@ "links": "Contrôle si l'éditeur doit détecter les liens et les rendre cliquables", "colorDecorators": "Contrôle si l'éditeur doit afficher les éléments décoratifs de couleurs inline et le sélecteur de couleurs.", "codeActions": "Active l'ampoule d'action de code", + "codeActionsOnSave.organizeImports": "Exécuter organiser les importations lors de l'enregistrement ?", + "codeActionsOnSave": "Types d'actions de code à exécuter lors de l'enregistrement.", + "codeActionsOnSaveTimeout": "Délai d'attente pour les actions de code exécutées lors de l'enregistrement.", "selectionClipboard": "Contrôle si le presse-papiers primaire Linux doit être pris en charge.", "sideBySide": "Contrôle si l'éditeur de différences affiche les différences en mode côte à côte ou inline", "ignoreTrimWhitespace": "Contrôle si l'éditeur de différences affiche les changements liés aux espaces blancs de début ou de fin comme des différences", diff --git a/i18n/fra/src/vs/editor/common/view/editorColorRegistry.i18n.json b/i18n/fra/src/vs/editor/common/view/editorColorRegistry.i18n.json index d368519c5fb..b8e49f2deb0 100644 --- a/i18n/fra/src/vs/editor/common/view/editorColorRegistry.i18n.json +++ b/i18n/fra/src/vs/editor/common/view/editorColorRegistry.i18n.json @@ -14,6 +14,7 @@ "editorCursorBackground": "La couleur de fond du curseur de l'éditeur. Permet de personnaliser la couleur d'un caractère survolé par un curseur de bloc.", "editorWhitespaces": "Couleur des espaces blancs dans l'éditeur.", "editorIndentGuides": "Couleur des repères de retrait de l'éditeur.", + "editorActiveIndentGuide": "Couleur des guides d'indentation de l'éditeur actif", "editorLineNumbers": "Couleur des numéros de ligne de l'éditeur.", "editorActiveLineNumber": "Couleur des numéros de lignes actives de l'éditeur", "deprecatedEditorActiveLineNumber": "Id est obsolète. Utilisez à la place 'editorLineNumber.activeForeground'. ", diff --git a/i18n/fra/src/vs/editor/contrib/codeAction/codeActionCommands.i18n.json b/i18n/fra/src/vs/editor/contrib/codeAction/codeActionCommands.i18n.json index 9e350d183dc..f04b6d13162 100644 --- a/i18n/fra/src/vs/editor/contrib/codeAction/codeActionCommands.i18n.json +++ b/i18n/fra/src/vs/editor/contrib/codeAction/codeActionCommands.i18n.json @@ -14,5 +14,6 @@ "editor.action.refactor.noneMessage": "Aucune refactorisation disponible", "source.label": "Action de la source", "editor.action.source.noneMessage": "Aucune action n'est disponible", - "organizeImports.label": "Organiser les Imports" + "organizeImports.label": "Organiser les Imports", + "editor.action.organize.noneMessage": "Aucune action organiser les imports disponible" } \ No newline at end of file diff --git a/i18n/fra/src/vs/editor/contrib/find/findController.i18n.json b/i18n/fra/src/vs/editor/contrib/find/findController.i18n.json index 86b36fb04c0..834e6c369c6 100644 --- a/i18n/fra/src/vs/editor/contrib/find/findController.i18n.json +++ b/i18n/fra/src/vs/editor/contrib/find/findController.i18n.json @@ -7,6 +7,7 @@ "Do not edit this file. It is machine generated." ], "startFindAction": "Rechercher", + "startFindWithSelectionAction": "Trouver avec la sélection", "findNextMatchAction": "Rechercher suivant", "findPreviousMatchAction": "Rechercher précédent", "nextSelectionMatchFindAction": "Sélection suivante", diff --git a/i18n/fra/src/vs/editor/contrib/format/formatActions.i18n.json b/i18n/fra/src/vs/editor/contrib/format/formatActions.i18n.json index 33b54d72399..24bb87dbeb0 100644 --- a/i18n/fra/src/vs/editor/contrib/format/formatActions.i18n.json +++ b/i18n/fra/src/vs/editor/contrib/format/formatActions.i18n.json @@ -12,5 +12,7 @@ "hintnn": "{0} modifications de format effectuées entre les lignes {1} et {2}", "no.provider": "Il n’y a aucun formateur installé pour les fichiers '{0}'.", "formatDocument.label": "Mettre en forme le document", - "formatSelection.label": "Mettre en forme la sélection" + "no.documentprovider": "Il n’y a aucun formateur de document installé pour les fichiers '{0}'.", + "formatSelection.label": "Mettre en forme la sélection", + "no.selectionprovider": "Il n’y a aucun formateur de sélection installé pour les fichiers '{0}'." } \ No newline at end of file diff --git a/i18n/fra/src/vs/editor/contrib/message/messageController.i18n.json b/i18n/fra/src/vs/editor/contrib/message/messageController.i18n.json index 35229bd6699..8f37ab47ec7 100644 --- a/i18n/fra/src/vs/editor/contrib/message/messageController.i18n.json +++ b/i18n/fra/src/vs/editor/contrib/message/messageController.i18n.json @@ -5,5 +5,6 @@ "Licensed under the MIT License. See License.txt in the project root for license information.", "--------------------------------------------------------------------------------------------", "Do not edit this file. It is machine generated." - ] + ], + "editor.readonly": "Impossible de modifier dans l’éditeur en lecture seule" } \ No newline at end of file diff --git a/i18n/fra/src/vs/editor/contrib/referenceSearch/referencesWidget.i18n.json b/i18n/fra/src/vs/editor/contrib/referenceSearch/referencesWidget.i18n.json index a66398d0a76..247ec48b5dd 100644 --- a/i18n/fra/src/vs/editor/contrib/referenceSearch/referencesWidget.i18n.json +++ b/i18n/fra/src/vs/editor/contrib/referenceSearch/referencesWidget.i18n.json @@ -25,5 +25,6 @@ "peekViewEditorBackground": "Couleur d'arrière-plan de l'éditeur d'affichage d'aperçu.", "peekViewEditorGutterBackground": "Couleur d'arrière-plan de la bordure de l'éditeur d'affichage d'aperçu.", "peekViewResultsMatchHighlight": "Couleur de mise en surbrillance d'une correspondance dans la liste des résultats de l'affichage d'aperçu.", - "peekViewEditorMatchHighlight": "Couleur de mise en surbrillance d'une correspondance dans l'éditeur de l'affichage d'aperçu." + "peekViewEditorMatchHighlight": "Couleur de mise en surbrillance d'une correspondance dans l'éditeur de l'affichage d'aperçu.", + "peekViewEditorMatchHighlightBorder": "Bordure de mise en surbrillance d'une correspondance dans l'éditeur de l'affichage d'aperçu." } \ No newline at end of file diff --git a/i18n/fra/src/vs/platform/environment/node/argv.i18n.json b/i18n/fra/src/vs/platform/environment/node/argv.i18n.json index a68fecd7d97..3a6ec15a4d0 100644 --- a/i18n/fra/src/vs/platform/environment/node/argv.i18n.json +++ b/i18n/fra/src/vs/platform/environment/node/argv.i18n.json @@ -22,13 +22,15 @@ "showVersions": "Affichez les versions des extensions installées, quand --list-extension est utilisé.", "installExtension": "Installe une extension.", "uninstallExtension": "Désinstalle une extension.", - "experimentalApis": "Active les fonctionnalités d'API proposées pour une extension.", + "experimentalApis": "Active les fonctionnalités de l’API proposées pour une extension.", "verbose": "Affichez la sortie détaillée (implique --wait).", "log": "Niveau de journalisation à utiliser. La valeur par défaut est 'info'. Les valeurs autorisées sont 'critical', 'error', 'warn', 'info', 'debug', 'trace', 'off.", "status": "Imprimer l'utilisation de processus et l'information des diagnostics.", "performance": "Démarrez avec la commande 'Développeur : performance de démarrage' activée.", "prof-startup": "Exécuter le profileur d'UC au démarrage", "disableExtensions": "Désactivez toutes les extensions installées.", + "inspect-extensions": "Permettre le débogage et le profilage d’extensions. Vérifier les outils de développement pour l'URI de connexion.", + "inspect-brk-extensions": "Permettre le débogage et le profilage d’extensions avec l’hôte de l’extension étant suspendu après le démarrage. Vérifier les outils de développement pour l'URI de connexion.", "disableGPU": "Désactivez l'accélération matérielle du GPU.", "uploadLogs": "Upload les logs depuis la session actuelle vers le endpoint sécurisé.", "maxMemory": "Taille mémoire maximale pour une fenêtre (En Megaoctêts)", diff --git a/i18n/fra/src/vs/platform/extensionManagement/node/extensionManagementService.i18n.json b/i18n/fra/src/vs/platform/extensionManagement/node/extensionManagementService.i18n.json index 65d0af43d0c..a975f63332b 100644 --- a/i18n/fra/src/vs/platform/extensionManagement/node/extensionManagementService.i18n.json +++ b/i18n/fra/src/vs/platform/extensionManagement/node/extensionManagementService.i18n.json @@ -7,6 +7,7 @@ "Do not edit this file. It is machine generated." ], "invalidManifest": "Extension non valide : package.json n'est pas un fichier JSON.", + "incompatible": "Impossible d’installer l’Extension '{0}' car elle n’est pas compatible avec VS Code '{1}'.", "restartCode": "Redémarrez Code avant de réinstaller {0}.", "installingOutdatedExtension": "Une version plus récente de cette extension est déjà installée. Voulez-vous remplacer celle-ci avec l'ancienne version ?", "override": "Remplacer", @@ -20,6 +21,7 @@ "notFoundCompatibleDependency": "Installation impossible car l'extension dépendante '{0}' compatible avec la version actuelle '{1}' de VS Code est introuvable.", "quitCode": "Impossible d’installer l’extension. Veuillez s’il vous plaît quitter et redémarrer VS Code avant de le réinstaller.", "exitCode": "Impossible d’installer l’extension. Veuillez s’il vous plaît sortir et redémarrer VS Code avant de le réinstaller.", + "renameError": "Erreur inconnue en renommant {0} en {1}", "uninstallDependeciesConfirmation": "Voulez-vous désinstaller uniquement '{0}' ou également ses dépendances ?", "uninstallOnly": "Extension uniquement", "uninstallAll": "Tout désinstaller", diff --git a/i18n/fra/src/vs/platform/theme/common/colorRegistry.i18n.json b/i18n/fra/src/vs/platform/theme/common/colorRegistry.i18n.json index 23d1737cd7a..7d6e9ec8360 100644 --- a/i18n/fra/src/vs/platform/theme/common/colorRegistry.i18n.json +++ b/i18n/fra/src/vs/platform/theme/common/colorRegistry.i18n.json @@ -29,7 +29,6 @@ "inputPlaceholderForeground": "Couleur de premier plan de la zone d'entrée pour le texte d'espace réservé.", "inputValidationInfoBackground": "Couleur d'arrière-plan de la validation d'entrée pour la gravité des informations.", "inputValidationInfoBorder": "Couleur de bordure de la validation d'entrée pour la gravité des informations.", - "inputValidationWarningBackground": "Couleur d'arrière-plan de la validation d'entrée pour l'avertissement sur les informations.", "inputValidationWarningBorder": "Couleur de bordure de la validation d'entrée pour la gravité de l'avertissement.", "inputValidationErrorBackground": "Couleur d'arrière-plan de la validation d'entrée pour la gravité de l'erreur.", "inputValidationErrorBorder": "Couleur de bordure de la validation d'entrée pour la gravité de l'erreur. ", @@ -71,10 +70,8 @@ "editorSelectionHighlightBorder": "Couleur de bordure des régions dont le contenu est identique à la sélection.", "editorFindMatch": "Couleur du résultat de recherche actif.", "findMatchHighlight": "Couleur des autres résultats de recherche correspondants. La couleur doit ne pas être opaque afin de ne pas masquer les décorations sous-jacentes.", - "findRangeHighlight": "Couleur de la plage limitant la recherche. La couleur doit ne pas être opaque afin de ne pas masquer les décorations sous-jacentes.", "editorFindMatchBorder": "Couleur de bordure du résultat de recherche actif.", "findMatchHighlightBorder": "Couleur de bordure des autres résultats de recherche.", - "findRangeHighlightBorder": "La couleur de bordure définit l'étendue de la recherche. La couleur doit ne pas être opaque pour ne pas masquer les décorations du dessous. ", "hoverHighlight": "Mettre en surbrillance ci-dessous le mot pour lequel un survol est affiché. La couleur doit ne pas être opaque afin de ne pas masquer les décorations sous-jacentes.", "hoverBackground": "Couleur d'arrière-plan du pointage de l'éditeur.", "hoverBorder": "Couleur de bordure du pointage de l'éditeur.", @@ -88,7 +85,6 @@ "mergeIncomingHeaderBackground": "Arrière-plan de l'en-tête qui arrive dans les conflits de fusion inline. La couleur doit ne pas être opaque afin de ne pas masquer les décorations sous-jacentes.", "mergeIncomingContentBackground": "Arrière-plan du contenu qui arrive dans les conflits de fusion inline. La couleur doit ne pas être opaque afin de ne pas masquer les décorations sous-jacentes.", "mergeCommonHeaderBackground": "Arrière-plan de l'en-tête de l'ancêtre commun dans les conflits de fusion inline. La couleur doit ne pas être opaque afin de ne pas masquer les décorations sous-jacentes.", - "mergeCommonContentBackground": "Arrière-plan du contenu de l'ancêtre commun dans les conflits de fusion inline. La couleur doit ne pas être opaque afin de ne pas masquer les décorations sous-jacentes.", "mergeBorder": "Couleur de bordure des en-têtes et du séparateur dans les conflits de fusion inline.", "overviewRulerCurrentContentForeground": "Premier plan de la règle d'aperçu actuelle pour les conflits de fusion inline.", "overviewRulerIncomingContentForeground": "Premier plan de la règle d'aperçu entrante pour les conflits de fusion inline.", diff --git a/i18n/fra/src/vs/platform/url/electron-browser/inactiveExtensionUrlHandler.i18n.json b/i18n/fra/src/vs/platform/url/electron-browser/inactiveExtensionUrlHandler.i18n.json new file mode 100644 index 00000000000..35229bd6699 --- /dev/null +++ b/i18n/fra/src/vs/platform/url/electron-browser/inactiveExtensionUrlHandler.i18n.json @@ -0,0 +1,9 @@ +{ + "": [ + "--------------------------------------------------------------------------------------------", + "Copyright (c) Microsoft Corporation. All rights reserved.", + "Licensed under the MIT License. See License.txt in the project root for license information.", + "--------------------------------------------------------------------------------------------", + "Do not edit this file. It is machine generated." + ] +} \ No newline at end of file diff --git a/i18n/fra/src/vs/workbench/api/browser/viewsContainersExtensionPoint.i18n.json b/i18n/fra/src/vs/workbench/api/browser/viewsContainersExtensionPoint.i18n.json index 7dd67c3300c..2f2efe76489 100644 --- a/i18n/fra/src/vs/workbench/api/browser/viewsContainersExtensionPoint.i18n.json +++ b/i18n/fra/src/vs/workbench/api/browser/viewsContainersExtensionPoint.i18n.json @@ -6,6 +6,12 @@ "--------------------------------------------------------------------------------------------", "Do not edit this file. It is machine generated." ], + "vscode.extension.contributes.views.containers.id": "Identificateur unique utilisé pour identifier le conteneur dans lequel les vues peuvent être contribuées en utilisant le point de contribution 'views'.", + "vscode.extension.contributes.views.containers.title": "Chaîne lisible par un humain permettant d'afficher le conteneur", + "vscode.extension.contributes.views.containers.icon": "Chemin d’accès à l’icône de conteneur", + "vscode.extension.contributes.viewsContainer": "Contribue aux conteneurs de vues vers l’éditeur", + "views.container.activitybar": "Les conteneurs visuels contribuent à la barre d'activité", + "requirearray": "les conteneurs de vues doivent être un tableau", "requirestring": "la propriété '{0}' est obligatoire et doit être de type 'string'", "showViewlet": "Afficher {0}", "view": "Affichage" diff --git a/i18n/fra/src/vs/workbench/api/browser/viewsExtensionPoint.i18n.json b/i18n/fra/src/vs/workbench/api/browser/viewsExtensionPoint.i18n.json index ed3d04c14e5..89809f57278 100644 --- a/i18n/fra/src/vs/workbench/api/browser/viewsExtensionPoint.i18n.json +++ b/i18n/fra/src/vs/workbench/api/browser/viewsExtensionPoint.i18n.json @@ -13,8 +13,10 @@ "vscode.extension.contributes.view.name": "Nom de la vue, contrôlable de visu. Affiché", "vscode.extension.contributes.view.when": "Condition qui doit être vraie pour afficher cette vue", "vscode.extension.contributes.views": "Ajoute des vues à l'éditeur", - "views.explorer": "Mode Explorateur", - "views.debug": "Debug View", + "views.explorer": "Les vues dans le conteneur \"Explorer\" contribuent à la barre d'activité", + "views.debug": "Les vues dans le conteneur de débogage contribuent à la barre d'activité", + "views.scm": "Les vues dans le conteneur \"SCM\" contribuent à la barre d'activité", + "views.contributed": "Les vues contribuent au conteneur de vues contributives", "duplicateView1": "Impossible d’enregistrer des vues multiples avec le même id '{0}'» dans l’emplacement '{1}'", "duplicateView2": "Une vue avec l’id `{0}` est déjà enregistrée à l’emplacement `{1}`" } \ No newline at end of file diff --git a/i18n/fra/src/vs/workbench/browser/parts/quickinput/quickInput.i18n.json b/i18n/fra/src/vs/workbench/browser/parts/quickinput/quickInput.i18n.json index 3eb1fd9f03c..161084b3bea 100644 --- a/i18n/fra/src/vs/workbench/browser/parts/quickinput/quickInput.i18n.json +++ b/i18n/fra/src/vs/workbench/browser/parts/quickinput/quickInput.i18n.json @@ -6,6 +6,8 @@ "--------------------------------------------------------------------------------------------", "Do not edit this file. It is machine generated." ], + "inputModeEntryDescription": "{0} (Appuyez sur 'Entrée' pour confirmer ou sur 'Échap' pour annuler)", + "inputModeEntry": "Appuyez sur 'Entrée' pour confirmer votre saisie, ou sur 'Échap' pour l'annuler", "quickInput.countSelected": "{0} Sélectionnés", "ok": "OK" } \ No newline at end of file diff --git a/i18n/fra/src/vs/workbench/parts/debug/browser/breakpointsView.i18n.json b/i18n/fra/src/vs/workbench/parts/debug/browser/breakpointsView.i18n.json index 41453556314..fb0dbefa590 100644 --- a/i18n/fra/src/vs/workbench/parts/debug/browser/breakpointsView.i18n.json +++ b/i18n/fra/src/vs/workbench/parts/debug/browser/breakpointsView.i18n.json @@ -6,7 +6,10 @@ "--------------------------------------------------------------------------------------------", "Do not edit this file. It is machine generated." ], + "logPoint": "Log Point", "breakpoint": "Point d'arrêt", + "editBreakpoint": "Modifier {0}...", + "removeBreakpoint": "Supprimer {0}", "functionBreakpointsNotSupported": "Les points d'arrêt de fonction ne sont pas pris en charge par ce type de débogage", "functionBreakpointPlaceholder": "Fonction où effectuer un point d'arrêt", "functionBreakPointInputAriaLabel": "Point d'arrêt sur fonction de type", diff --git a/i18n/fra/src/vs/workbench/parts/debug/browser/debugActions.i18n.json b/i18n/fra/src/vs/workbench/parts/debug/browser/debugActions.i18n.json index c216d242008..906b1e9ddc6 100644 --- a/i18n/fra/src/vs/workbench/parts/debug/browser/debugActions.i18n.json +++ b/i18n/fra/src/vs/workbench/parts/debug/browser/debugActions.i18n.json @@ -21,6 +21,7 @@ "disconnectDebug": "Déconnecter", "continueDebug": "Continuer", "pauseDebug": "Suspendre", + "terminateThread": "Terminer le thread", "restartFrame": "Redémarrer le frame", "removeBreakpoint": "Supprimer un point d'arrêt", "removeAllBreakpoints": "Supprimer tous les points d'arrêt", diff --git a/i18n/fra/src/vs/workbench/parts/debug/electron-browser/debug.contribution.i18n.json b/i18n/fra/src/vs/workbench/parts/debug/electron-browser/debug.contribution.i18n.json index f960d2726e7..899866a157c 100644 --- a/i18n/fra/src/vs/workbench/parts/debug/electron-browser/debug.contribution.i18n.json +++ b/i18n/fra/src/vs/workbench/parts/debug/electron-browser/debug.contribution.i18n.json @@ -27,6 +27,5 @@ "onFirstSessionStart": "Afficher debug dans seule la barre d’état après que le débogage a été lancé pour la première fois", "showInStatusBar": "Contrôle quand la barre d’état de débogage doit être visible", "openDebug": "Contrôle si la vue de débogage doit être ouverte au démarrage de la session de débogage.", - "launch": "Configuration du lancement du débogage global. Doit être utilisée comme alternative à 'launch.json' qui est partagé entre les espaces de travail", - "extensionHostDebugAdapter": "Exécuter l'adaptateur de débogage dans l'hôte d'extension" + "launch": "Configuration du lancement du débogage global. Doit être utilisée comme alternative à 'launch.json' qui est partagé entre les espaces de travail" } \ No newline at end of file diff --git a/i18n/fra/src/vs/workbench/parts/debug/electron-browser/debugEditorContribution.i18n.json b/i18n/fra/src/vs/workbench/parts/debug/electron-browser/debugEditorContribution.i18n.json index 7ba8fc67a9e..b483f4e8224 100644 --- a/i18n/fra/src/vs/workbench/parts/debug/electron-browser/debugEditorContribution.i18n.json +++ b/i18n/fra/src/vs/workbench/parts/debug/electron-browser/debugEditorContribution.i18n.json @@ -6,7 +6,12 @@ "--------------------------------------------------------------------------------------------", "Do not edit this file. It is machine generated." ], + "logPoint": "Log Point", "breakpoint": "Point d'arrêt", + "removeBreakpoint": "Supprimer {0}", + "editBreakpoint": "Modifier {0}...", + "disableBreakpoint": "Désactiver {0}", + "enableBreakpoint": "Activer {0}", "removeBreakpoints": "Supprimer les points d'arrêt", "removeBreakpointOnColumn": "Supprimer le point d'arrêt de la colonne {0}", "removeLineBreakpoint": "Supprimer le point d'arrêt de la ligne", @@ -21,6 +26,10 @@ "addBreakpoint": "Ajouter un point d'arrêt", "addConditionalBreakpoint": "Ajouter un point d'arrêt conditionnel...", "addLogPoint": "Ajouter un Log Point", + "message": "message", + "condition": "condition", + "removeLogPoint": "Supprimer {0}", + "disableLogPoint": "Désactiver {0}", "cancel": "Annuler", "addConfiguration": "Ajouter une configuration..." } \ No newline at end of file diff --git a/i18n/fra/src/vs/workbench/parts/files/electron-browser/fileActions.i18n.json b/i18n/fra/src/vs/workbench/parts/files/electron-browser/fileActions.i18n.json index 0e64e0d6d54..5c5c91482ed 100644 --- a/i18n/fra/src/vs/workbench/parts/files/electron-browser/fileActions.i18n.json +++ b/i18n/fra/src/vs/workbench/parts/files/electron-browser/fileActions.i18n.json @@ -13,6 +13,7 @@ "copyFile": "Copier", "pasteFile": "Coller", "retry": "Réessayer", + "renameWhenSourcePathIsParentOfTargetError": "Veuillez utiliser la commande 'Nouveau dossier' ou 'Nouveau fichier\" pour ajouter des enfants à un dossier existant", "newUntitledFile": "Nouveau fichier sans titre", "createNewFile": "Nouveau fichier", "createNewFolder": "Nouveau dossier", @@ -24,20 +25,20 @@ "dirtyMessageFolderDelete": "Vous supprimez un dossier contenant {0} fichiers dont les changements n'ont pas été enregistrés. Voulez-vous continuer ?", "dirtyMessageFileDelete": "Vous supprimez un fichier dont les changements n'ont pas été enregistrés. Voulez-vous continuer ?", "dirtyWarning": "Vous perdrez vos modifications, si vous ne les enregistrez pas.", - "confirmMoveTrashMessageMultiple": "Êtes-vous sûr de vouloir supprimer les fichiers {0} suivants ?", - "confirmMoveTrashMessageFolder": "Voulez-vous vraiment supprimer '{0}' et son contenu ?", - "confirmMoveTrashMessageFile": "Voulez-vous vraiment supprimer '{0}' ?", "undoBin": "Vous pouvez restaurer à partir de la Corbeille.", "undoTrash": "Vous pouvez restaurer à partir de la Poubelle.", "doNotAskAgain": "Ne plus me demander", - "confirmDeleteMessageMultiple": "Êtes-vous sûr de vouloir supprimer définitivement les fichiers {0} suivants ?", - "confirmDeleteMessageFolder": "Voulez-vous vraiment supprimer définitivement '{0}' et son contenu ?", - "confirmDeleteMessageFile": "Voulez-vous vraiment supprimer définitivement '{0}' ?", "irreversible": "Cette action est irréversible !", "binFailed": "Impossible de supprimer en utilisant la corbeille. Voulez-vous supprimer définitivement à la place ?", "trashFailed": "Impossible de supprimer en utilisant la corbeille. Voulez-vous supprimer définitivement à la place?", "deletePermanentlyButtonLabel": "Supprimer &&définitivement", "retryButtonLabel": "&&Réessayer", + "confirmMoveTrashMessageMultiple": "Êtes-vous sûr de vouloir supprimer les fichiers {0} suivants ?", + "confirmMoveTrashMessageFolder": "Voulez-vous vraiment supprimer '{0}' et son contenu ?", + "confirmMoveTrashMessageFile": "Voulez-vous vraiment supprimer '{0}' ?", + "confirmDeleteMessageMultiple": "Êtes-vous sûr de vouloir supprimer définitivement les fichiers {0} suivants ?", + "confirmDeleteMessageFolder": "Voulez-vous vraiment supprimer définitivement '{0}' et son contenu ?", + "confirmDeleteMessageFile": "Voulez-vous vraiment supprimer définitivement '{0}' ?", "addFiles": "Ajouter des fichiers", "confirmOverwrite": "Un fichier ou dossier portant le même nom existe déjà dans le dossier de destination. Voulez-vous le remplacer ?", "replaceButtonLabel": "&&Remplacer", @@ -58,7 +59,9 @@ "openFileToShowInNewWindow": "Ouvrir d'abord un fichier à ouvrir dans une nouvelle fenêtre", "copyPath": "Copier le chemin", "emptyFileNameError": "Un nom de fichier ou de dossier doit être fourni.", + "fileNameStartsWithSlashError": "Un nom de fichier ou de dossier ne peut commencer par une barre oblique.", "fileNameExistsError": "Un fichier ou dossier **{0}** existe déjà à cet emplacement. Choisissez un autre nom.", + "fileUsedAsFolderError": "**{0}** est un fichier et ne peut pas avoir de descendant.", "invalidFileNameError": "Le nom **{0}** est non valide en tant que nom de fichier ou de dossier. Choisissez un autre nom.", "filePathTooLongError": "Le nom **{0}** correspond à un chemin d'accès trop long. Choisissez un nom plus court.", "compareWithClipboard": "Compare le fichier actif avec le presse-papiers", diff --git a/i18n/fra/src/vs/workbench/parts/files/electron-browser/views/explorerViewer.i18n.json b/i18n/fra/src/vs/workbench/parts/files/electron-browser/views/explorerViewer.i18n.json index c86f735842b..41c3a1d6050 100644 --- a/i18n/fra/src/vs/workbench/parts/files/electron-browser/views/explorerViewer.i18n.json +++ b/i18n/fra/src/vs/workbench/parts/files/electron-browser/views/explorerViewer.i18n.json @@ -7,6 +7,9 @@ "Do not edit this file. It is machine generated." ], "fileInputAriaLabel": "Tapez le nom du fichier. Appuyez sur Entrée pour confirmer ou sur Échap pour annuler.", + "createFileFromExplorerInfoMessage": "Créer le fichier **{0}** à **{1}**", + "renameFileFromExplorerInfoMessage": "Déplacer et renommer en **{0}**", + "createFolderFromExplorerInfoMessage": "Créer le dossier **{0}** en **{1}**", "filesExplorerViewerAriaLabel": "{0}, Explorateur de fichiers", "dropFolders": "Voulez-vous ajouter les dossiers à l’espace de travail ?", "dropFolder": "Voulez-vous ajouter le dossier à l’espace de travail ?", diff --git a/i18n/fra/src/vs/workbench/parts/localizations/electron-browser/localizations.contribution.i18n.json b/i18n/fra/src/vs/workbench/parts/localizations/electron-browser/localizations.contribution.i18n.json new file mode 100644 index 00000000000..708807fba13 --- /dev/null +++ b/i18n/fra/src/vs/workbench/parts/localizations/electron-browser/localizations.contribution.i18n.json @@ -0,0 +1,23 @@ +{ + "": [ + "--------------------------------------------------------------------------------------------", + "Copyright (c) Microsoft Corporation. All rights reserved.", + "Licensed under the MIT License. See License.txt in the project root for license information.", + "--------------------------------------------------------------------------------------------", + "Do not edit this file. It is machine generated." + ], + "updateLocale": "Souhaitez-vous changer la langue de l’interface de VS Code en {0} et redémarrer ?", + "yes": "Oui", + "no": "Non", + "neverAgain": "Ne plus afficher", + "install": "Installer", + "JsonSchema.locale": "Langue d'interface utilisateur (IU) à utiliser.", + "vscode.extension.contributes.localizations": "Contribuer aux localisations de l’éditeur", + "vscode.extension.contributes.localizations.languageId": "Id de la langue dans laquelle les chaînes d’affichage sont traduites.", + "vscode.extension.contributes.localizations.languageName": "Nom de la langue en anglais.", + "vscode.extension.contributes.localizations.languageNameLocalized": "Nom de la langue dans la langue contribuée.", + "vscode.extension.contributes.localizations.translations": "Liste des traductions associées à la langue.", + "vscode.extension.contributes.localizations.translations.id": "Id de VS Code ou Extension pour lesquels cette traduction contribue. L'Id de VS Code est toujours `vscode` et d’extension doit être au format `publisherId.extensionName`.", + "vscode.extension.contributes.localizations.translations.id.pattern": "L’Id doit être `vscode` ou au format `publisherId.extensionName` pour traduire respectivement VS code ou une extension.", + "vscode.extension.contributes.localizations.translations.path": "Un chemin relatif vers un fichier contenant les traductions du langage." +} \ No newline at end of file diff --git a/i18n/fra/src/vs/workbench/parts/localizations/electron-browser/localizationsActions.i18n.json b/i18n/fra/src/vs/workbench/parts/localizations/electron-browser/localizationsActions.i18n.json new file mode 100644 index 00000000000..5144212e713 --- /dev/null +++ b/i18n/fra/src/vs/workbench/parts/localizations/electron-browser/localizationsActions.i18n.json @@ -0,0 +1,14 @@ +{ + "": [ + "--------------------------------------------------------------------------------------------", + "Copyright (c) Microsoft Corporation. All rights reserved.", + "Licensed under the MIT License. See License.txt in the project root for license information.", + "--------------------------------------------------------------------------------------------", + "Do not edit this file. It is machine generated." + ], + "configureLocale": "Configurer la langue", + "displayLanguage": "Définit le langage affiché par VSCode.", + "doc": "Consultez {0} pour connaître la liste des langues prises en charge.", + "restart": "Le changement de la valeur nécessite le redémarrage de VS Code.", + "fail.createSettings": "Impossible de créer '{0}' ({1})." +} \ No newline at end of file diff --git a/i18n/fra/src/vs/workbench/parts/markers/electron-browser/messages.i18n.json b/i18n/fra/src/vs/workbench/parts/markers/electron-browser/messages.i18n.json index 9b347a7669b..0c1cb04ba64 100644 --- a/i18n/fra/src/vs/workbench/parts/markers/electron-browser/messages.i18n.json +++ b/i18n/fra/src/vs/workbench/parts/markers/electron-browser/messages.i18n.json @@ -15,7 +15,7 @@ "markers.panel.aria.label.problems.tree": "Problèmes regroupés par fichiers", "markers.panel.no.problems.build": "Aucun problème n'a été détecté dans l'espace de travail jusqu'à présent.", "markers.panel.no.problems.filters": "Aucun résultat trouvé avec les critères de filtre fourni.", - "markers.panel.no.problems.file.exclusions": "Tous les problèmes sont masqués car le filtre d'exclusion de fichiers est activé.", + "markers.panel.no.problems.file.exclusions": "Tous les problèmes sont cachés parce que le filtre d’exclusion de fichiers est activé.", "markers.panel.action.useFilesExclude": "Filtrer en utilisant le paramètre d’exclusion de fichiers", "markers.panel.action.donotUseFilesExclude": "Ne pas utiliser le paramètre d’exclusion de fichiers", "markers.panel.action.filter": "Filtrer les problèmes", diff --git a/i18n/fra/src/vs/workbench/parts/terminal/electron-browser/terminalInstance.i18n.json b/i18n/fra/src/vs/workbench/parts/terminal/electron-browser/terminalInstance.i18n.json index 96e9b0fe397..62f306efab2 100644 --- a/i18n/fra/src/vs/workbench/parts/terminal/electron-browser/terminalInstance.i18n.json +++ b/i18n/fra/src/vs/workbench/parts/terminal/electron-browser/terminalInstance.i18n.json @@ -12,5 +12,6 @@ "terminal.integrated.copySelection.noSelection": "Le terminal n'a aucune sélection à copier", "terminal.integrated.exitedWithCode": "Le processus du terminal s'est achevé avec le code de sortie {0}", "terminal.integrated.waitOnExit": "Appuyez sur une touche pour fermer le terminal", - "terminal.integrated.launchFailed": "Échec du lancement de la commande de traitement du terminal '{0}{1}' (code de sortie : {2})" + "terminal.integrated.launchFailed": "Échec du lancement de la commande de traitement du terminal '{0}{1}' (code de sortie : {2})", + "terminal.integrated.launchFailedExtHost": "Impossible de démarrer le processus du terminal (code de sortie : {0})" } \ No newline at end of file diff --git a/i18n/fra/src/vs/workbench/parts/url/electron-browser/url.contribution.i18n.json b/i18n/fra/src/vs/workbench/parts/url/electron-browser/url.contribution.i18n.json new file mode 100644 index 00000000000..de2f45279f3 --- /dev/null +++ b/i18n/fra/src/vs/workbench/parts/url/electron-browser/url.contribution.i18n.json @@ -0,0 +1,11 @@ +{ + "": [ + "--------------------------------------------------------------------------------------------", + "Copyright (c) Microsoft Corporation. All rights reserved.", + "Licensed under the MIT License. See License.txt in the project root for license information.", + "--------------------------------------------------------------------------------------------", + "Do not edit this file. It is machine generated." + ], + "openUrl": "Ouvrir le lien", + "developer": "Développeur" +} \ No newline at end of file diff --git a/i18n/fra/src/vs/workbench/services/configurationResolver/node/variableResolver.i18n.json b/i18n/fra/src/vs/workbench/services/configurationResolver/node/variableResolver.i18n.json new file mode 100644 index 00000000000..287dfd1851a --- /dev/null +++ b/i18n/fra/src/vs/workbench/services/configurationResolver/node/variableResolver.i18n.json @@ -0,0 +1,19 @@ +{ + "": [ + "--------------------------------------------------------------------------------------------", + "Copyright (c) Microsoft Corporation. All rights reserved.", + "Licensed under the MIT License. See License.txt in the project root for license information.", + "--------------------------------------------------------------------------------------------", + "Do not edit this file. It is machine generated." + ], + "missingEnvVarName": "'{0}' ne peut pas être résolu car aucun nom de variable d’environnement n’est donné.", + "configNotFound": "'{0}' ne peut pas être résolu car le paramètre '{1}' est introuvable.", + "configNoString": "'{0}' ne peut pas être résolu car '{1}' est une valeur structurée.", + "missingConfigName": "'{0}' ne peut pas être résolu car aucun nom de paramètre n'est donné.", + "canNotFindFolder": "'{0}' ne peut pas être résolu. Aucun dossier '{1}'.", + "canNotResolveWorkspaceFolderMultiRoot": "'{0}' ne peut pas être résolu dans un espace de travail de dossiers multiples. Gérer la portée cette variable en utilisant ':' et un nom de dossier d’espace de travail.", + "canNotResolveWorkspaceFolder": "'{0}' ne peut pas être résolu. Veuillez ouvrir un dossier.", + "canNotResolveFile": "'{0}' ne peut pas être résolu. Veuillez ouvrir un éditeur.", + "canNotResolveLineNumber": "'{0}' ne peut pas être résolu. Assurez-vous d’avoir une ligne sélectionnée dans l’éditeur actif.", + "canNotResolveSelectedText": "'{0}' ne peut pas être résolu. Assurez-vous que vous avez du texte sélectionné dans l’éditeur actif." +} \ No newline at end of file diff --git a/i18n/fra/src/vs/workbench/services/files/electron-browser/remoteFileService.i18n.json b/i18n/fra/src/vs/workbench/services/files/electron-browser/remoteFileService.i18n.json index d783ab341de..d4eb257e24d 100644 --- a/i18n/fra/src/vs/workbench/services/files/electron-browser/remoteFileService.i18n.json +++ b/i18n/fra/src/vs/workbench/services/files/electron-browser/remoteFileService.i18n.json @@ -9,5 +9,6 @@ "fileNotFoundError": "Fichier introuvable ({0})", "fileIsDirectoryError": "Le fichier est un répertoire", "fileNotModifiedError": "Fichier non modifié depuis", - "fileBinaryError": "Il semble que le fichier soit binaire. Impossible de l'ouvrir en tant que texte" + "fileBinaryError": "Il semble que le fichier soit binaire. Impossible de l'ouvrir en tant que texte", + "err.create": "Impossible de créer le fichier {0}" } \ No newline at end of file diff --git a/i18n/hun/extensions/npm/out/npmView.i18n.json b/i18n/hun/extensions/npm/out/npmView.i18n.json new file mode 100644 index 00000000000..35229bd6699 --- /dev/null +++ b/i18n/hun/extensions/npm/out/npmView.i18n.json @@ -0,0 +1,9 @@ +{ + "": [ + "--------------------------------------------------------------------------------------------", + "Copyright (c) Microsoft Corporation. All rights reserved.", + "Licensed under the MIT License. See License.txt in the project root for license information.", + "--------------------------------------------------------------------------------------------", + "Do not edit this file. It is machine generated." + ] +} \ No newline at end of file diff --git a/i18n/hun/extensions/npm/out/tasks.i18n.json b/i18n/hun/extensions/npm/out/tasks.i18n.json new file mode 100644 index 00000000000..7c22848110f --- /dev/null +++ b/i18n/hun/extensions/npm/out/tasks.i18n.json @@ -0,0 +1,10 @@ +{ + "": [ + "--------------------------------------------------------------------------------------------", + "Copyright (c) Microsoft Corporation. All rights reserved.", + "Licensed under the MIT License. See License.txt in the project root for license information.", + "--------------------------------------------------------------------------------------------", + "Do not edit this file. It is machine generated." + ], + "npm.parseError": "Npm-feladatok felderítése: nem sikerült beolvasni a következő fájlt: {0}" +} \ No newline at end of file diff --git a/i18n/hun/extensions/npm/package.i18n.json b/i18n/hun/extensions/npm/package.i18n.json index bdac8dc69e3..e4c268ef1d7 100644 --- a/i18n/hun/extensions/npm/package.i18n.json +++ b/i18n/hun/extensions/npm/package.i18n.json @@ -14,5 +14,9 @@ "config.npm.exclude": "Azokat a mappákat leíró globális minta, amelyek ne legyenek vizsgálva az automatikus parancsfájlkeresés közben.", "npm.parseError": "Npm-feladatok felderítése: nem sikerült beolvasni a következő fájlt: {0}", "taskdef.script": "A testreszabott npm parancsfájl.", - "taskdef.path": "Azon mappa elérési útja, amely a parancsfájlt szolgáltató package.json fájlt tartalmazza. Elhagyható." + "taskdef.path": "Azon mappa elérési útja, amely a parancsfájlt szolgáltató package.json fájlt tartalmazza. Elhagyható.", + "command.refresh": "Frissítés", + "command.run": "Futtatás", + "command.debug": "Hibakeresés", + "command.openScript": "Megnyitás" } \ No newline at end of file diff --git a/i18n/hun/src/vs/base/browser/ui/findinput/findInputCheckboxes.i18n.json b/i18n/hun/src/vs/base/browser/ui/findinput/findInputCheckboxes.i18n.json index a1b0602763e..e66e5704d8c 100644 --- a/i18n/hun/src/vs/base/browser/ui/findinput/findInputCheckboxes.i18n.json +++ b/i18n/hun/src/vs/base/browser/ui/findinput/findInputCheckboxes.i18n.json @@ -7,6 +7,6 @@ "Do not edit this file. It is machine generated." ], "caseDescription": "Kis- és nagybetűk megkülönböztetése", - "wordsDescription": "Csak teljes szavas egyezés", + "wordsDescription": "Teljes szavas egyezés vizsgálata", "regexDescription": "Reguláris kifejezés használata" } \ No newline at end of file diff --git a/i18n/hun/src/vs/base/common/errorMessage.i18n.json b/i18n/hun/src/vs/base/common/errorMessage.i18n.json index fa80b58bea8..4778d3e8fee 100644 --- a/i18n/hun/src/vs/base/common/errorMessage.i18n.json +++ b/i18n/hun/src/vs/base/common/errorMessage.i18n.json @@ -7,7 +7,7 @@ "Do not edit this file. It is machine generated." ], "stackTrace.format": "{0}: {1}", - "error.defaultMessage": "Ismeretlen hiba történt. Részletek a naplóban.", + "error.defaultMessage": "Ismeretlen hiba történt. Részleteket a naplóban találhat.", "nodeExceptionMessage": "Rendszerhiba történt ({0})", "error.moreErrors": "{0} (összesen {1} hiba)" } \ No newline at end of file diff --git a/i18n/hun/src/vs/base/common/jsonErrorMessages.i18n.json b/i18n/hun/src/vs/base/common/jsonErrorMessages.i18n.json index 656a14313c8..b7ea235e4ab 100644 --- a/i18n/hun/src/vs/base/common/jsonErrorMessages.i18n.json +++ b/i18n/hun/src/vs/base/common/jsonErrorMessages.i18n.json @@ -9,10 +9,10 @@ "error.invalidSymbol": "Érvénytelen szimbólum", "error.invalidNumberFormat": "Érvénytelen számformátum.", "error.propertyNameExpected": "Hiányzó tulajdonságnév", - "error.valueExpected": "Hiányzó érték.", - "error.colonExpected": "Hiányzó kettőspont.", + "error.valueExpected": "Hiányzó érték", + "error.colonExpected": "Hiányzó kettőspont", "error.commaExpected": "Hiányzó vessző", "error.closeBraceExpected": "Hiányzó záró kapcsos zárójel", "error.closeBracketExpected": "Hiányzó záró szögletes zárójel", - "error.endOfFileExpected": "Itt fájlvége jelnek kellene szerepelnie." + "error.endOfFileExpected": "Hiányzó fájlvégjel" } \ No newline at end of file diff --git a/i18n/hun/src/vs/base/node/processes.i18n.json b/i18n/hun/src/vs/base/node/processes.i18n.json index 35229bd6699..807d77dbcc0 100644 --- a/i18n/hun/src/vs/base/node/processes.i18n.json +++ b/i18n/hun/src/vs/base/node/processes.i18n.json @@ -5,5 +5,6 @@ "Licensed under the MIT License. See License.txt in the project root for license information.", "--------------------------------------------------------------------------------------------", "Do not edit this file. It is machine generated." - ] + ], + "TaskRunner.UNC": "Rendszerparancsok nem hajthatók végre UNC-meghajtókon." } \ No newline at end of file diff --git a/i18n/hun/src/vs/base/node/zip.i18n.json b/i18n/hun/src/vs/base/node/zip.i18n.json index 3d6ec96981a..d53e8c83c9b 100644 --- a/i18n/hun/src/vs/base/node/zip.i18n.json +++ b/i18n/hun/src/vs/base/node/zip.i18n.json @@ -6,5 +6,6 @@ "--------------------------------------------------------------------------------------------", "Do not edit this file. It is machine generated." ], + "incompleteExtract": "Hiányos. {0} bejegyzés feldolgozva a(z) {0} bejegyzésből.", "notFound": "{0} nem található a zipen belül." } \ No newline at end of file diff --git a/i18n/hun/src/vs/code/electron-main/menus.i18n.json b/i18n/hun/src/vs/code/electron-main/menus.i18n.json index 5b81e432f54..c567d565c93 100644 --- a/i18n/hun/src/vs/code/electron-main/menus.i18n.json +++ b/i18n/hun/src/vs/code/electron-main/menus.i18n.json @@ -146,6 +146,7 @@ "miConditionalBreakpoint": "Feltételes törés&&pont", "miColumnBreakpoint": "Töréspont &&oszlopnál", "miFunctionBreakpoint": "Töréspont&&funkció...", + "miLogPoint": "Nap&&lózási pont...", "miNewBreakpoint": "Ú&&j töréspont", "miEnableAllBreakpoints": "Összes töréspont engedélyezése", "miDisableAllBreakpoints": "Összes töréspont leti&<ása", diff --git a/i18n/hun/src/vs/editor/browser/widget/diffReview.i18n.json b/i18n/hun/src/vs/editor/browser/widget/diffReview.i18n.json index 61a892df8cb..66449b7bec5 100644 --- a/i18n/hun/src/vs/editor/browser/widget/diffReview.i18n.json +++ b/i18n/hun/src/vs/editor/browser/widget/diffReview.i18n.json @@ -7,6 +7,10 @@ "Do not edit this file. It is machine generated." ], "label.close": "Bezárás", + "no_lines": "nincsenek sorok", + "one_line": "1 sor", + "more_lines": "{0} sor", + "header": "{0}. eltérés, összesen: {1}. Eredeti: {2}, {3}, módosított: {4}, {5}", "blankLine": "üres", "equalLine": "eredeti {0}., módosított {1}.: {2}", "insertLine": "+ módosított {0}.: {1}", diff --git a/i18n/hun/src/vs/editor/common/commonCodeEditor.i18n.json b/i18n/hun/src/vs/editor/common/commonCodeEditor.i18n.json index 35229bd6699..6e1b7fcb7c8 100644 --- a/i18n/hun/src/vs/editor/common/commonCodeEditor.i18n.json +++ b/i18n/hun/src/vs/editor/common/commonCodeEditor.i18n.json @@ -5,5 +5,6 @@ "Licensed under the MIT License. See License.txt in the project root for license information.", "--------------------------------------------------------------------------------------------", "Do not edit this file. It is machine generated." - ] + ], + "cursors.maximum": "A kurzorok száma legfeljebb {0} lehet." } \ No newline at end of file diff --git a/i18n/hun/src/vs/editor/common/config/commonEditorConfig.i18n.json b/i18n/hun/src/vs/editor/common/config/commonEditorConfig.i18n.json index 0dfc2d84ed4..6121ff296fe 100644 --- a/i18n/hun/src/vs/editor/common/config/commonEditorConfig.i18n.json +++ b/i18n/hun/src/vs/editor/common/config/commonEditorConfig.i18n.json @@ -7,7 +7,7 @@ "Do not edit this file. It is machine generated." ], "editorConfigurationTitle": "Szerkesztőablak", - "fontFamily": "Ez a beállítás a betűkészletet határozza meg.", + "fontFamily": "Meghatározza a betűkészletet.", "fontWeight": "Meghatározza a betűvastagságot.", "fontSize": "Meghatározza a betű méretét, pixelekben.", "lineHeight": "Meghatározza a sormagasságot. A 0 érték használata esetén a sormagasság a fontSize értékéből van számolva.", @@ -16,7 +16,7 @@ "lineNumbers.on": "A sorszámok abszolút értékként jelennek meg.", "lineNumbers.relative": "A sorszámok a kurzortól való távolságuk alapján jelennek meg.", "lineNumbers.interval": "A sorszámok minden 10. sorban jelennek meg.", - "lineNumbers": "Meghatározza a sorszámok megjelenését. A lehetséges értékek: 'on', 'off', 'relative' és 'interval'.", + "lineNumbers": "Meghatározza a sorszámok megjelenítési módját.", "rulers": "Függőleges vonalzók kirajzolása bizonyos számú fix szélességű karakter után. Több vonalzó használatához adjon meg több értéket. Nincs kirajzolva semmi, ha a tömb üres.", "wordSeparators": "Azon karakterek listája, amelyek szóelválasztónak vannak tekintve szavakkal kapcsolatos navigáció vagy műveletek során.", "tabSize": "Egy tabulátor hány szóköznek felel meg. Ez a beállítás felülírásra kerül a fájl tartalma alapján, ha az `editor.detectIndentation` beállítás aktív.", @@ -24,12 +24,12 @@ "insertSpaces": "Szóközök beszúrása a tabulátor billentyű lenyomása esetén. Ez a beállítás felülíródik a fájl tartalma alapján, ha az `editor.detectIndentation` beállítás aktív.", "insertSpaces.errorMessage": "A várt érték 'boolean' típusú. Megjegyzés: az \"auto\" értéket az 'editor.detectIndentation' beállítás helyettesíti.", "detectIndentation": "Fájl megnyitásakor az `editor.tabSize` és az `editor.insertSpaces` értéke a fájl tartalma alapján lesz meghatározva.", - "roundedSelection": "Itt adható meg, hogy a kijelölt elemek sarkai lekerekítettek legyenek-e", + "roundedSelection": "Meghatározza, hogy a kijelölések sarkai le legyenek-e kerekítve.", "scrollBeyondLastLine": "Meghatározza, hogy a szerkesztőablak görgethető-e az utolsó sor után.", "smoothScrolling": "Meghatározza, hogy a szerkesztőablak animálva van-e görgetve.", "minimap.enabled": "Meghatározza, hogy megjelenjen-e a kódtérkép.", - "minimap.side": "Meghatározza, hogy melyik oldalon jelenjen meg a kódtérkép. Lehetséges értékek: 'right' és 'left'.", - "minimap.showSlider": "Meghatározza, hogy automatikusan el legyen-e rejtve a kódtérképes görgetősáv. Lehetséges értékek: 'always' és 'mouseover'.", + "minimap.side": "Meghatározza, hogy melyik oldalon jelenjen meg a kódtérkép.", + "minimap.showSlider": "Meghatározza, hogy automatikusan el legyen-e rejtve a kódtérképes görgetősáv.", "minimap.renderCharacters": "Meghatározza, hogy a tényleges karakterek legyenek-e megjelenítve (színes téglalapok helyett)", "minimap.maxColumn": "Meghatározza, hogy a kódtérképen legfeljebb hány oszlop legyen kirajzolva.", "find.seedSearchStringFromSelection": "Meghatározza, hogy a keresés modulba automatikusan bekerüljön-e a szerkesztőablakban kiválasztott szöveg.", @@ -57,7 +57,7 @@ "formatOnType": "Meghatározza, hogy a szerkesztő automatikusan formázza-e a sort a gépelés után", "formatOnPaste": "Meghatározza, hogy a szerkesztő automatikusan formázza-e a beillesztett tartalmat. Ehhez szükség van egy formázóra, illetve a formázónak tudnia kell a dokumentum egy részét formázni.", "autoIndent": "Meghatározza, hogy a szerkesztőablak automatikusan állítsa-e az indentálást miközben a felhasználó gépel, beilleszt vagy mozgatja a sorokat. Az adott nyelv indentálási szabályainak rendelkezésre kell állnia.", - "suggestOnTriggerCharacters": "Itt adható meg, hogy eseményindító karakterek beírásakor automatikusan megjelenjenek-e a javaslatok", + "suggestOnTriggerCharacters": "Meghatározza, hogy eseménykiváltó karakterek beírásakor automatikusan megjelenjenek-e a javaslatok", "acceptSuggestionOnEnter": "Meghatározza, hogy a javaslatok az 'Enter' gomb leütésére is el legyenek fogadva a 'Tab' mellett. Segít feloldani a bizonytalanságot az új sorok beillesztése és a javaslatok elfogadása között. A 'smart' érték azt jelenti, hogy csak akkor fogadja el a javaslatot az Enter leütése esetén, ha az módosítja a szöveget.", "acceptSuggestionOnCommitCharacter": "Meghatározza, hogy a javaslaok a zárókarakterek leütésére is el legyenek fogadva. A JavaScriptben például a pontosvessző (';') számít zárókarakternek, leütésére a javaslat elfogadásra kerül és beillesztődik az adott karakter. ", "snippetSuggestions.top": "A javasolt kódrészletek a többi javaslat előtt jelenjenek meg.", @@ -73,11 +73,11 @@ "suggestSelection": "Meghatározza, mely javaslat van előre kiválasztva a javaslatok listájából.", "suggestFontSize": "Az ajánlásokat tartalmazó modul betűmérete", "suggestLineHeight": "Az ajánlásokat tartalmazó modul sormagassága", - "selectionHighlight": "Itt adható meg, hogy a szerkesztő kiemelje-e a kijelöléshez hasonló találatokat", + "selectionHighlight": "Meghatározza, hogy a szerkesztőablakban ki legyenek-e emelve a kijelöléshez hasonló találatok", "occurrencesHighlight": "Meghatározza, hogy a szerkesztőablakban ki legyenek-e emelve a szimbólum szemantikailag hozzá tartozó előfordulásai.", "overviewRulerLanes": "Meghatározza, hogy hány dekoráció jelenhet meg azonos pozícióban az áttekintő sávon.", "overviewRulerBorder": "Meghatározza, hogy legyen-e kerete az áttekintő sávnak.", - "cursorBlinking": "Meghatározza a kurzor animációjának stílusát. Lehetséges értékek: 'blink', 'smooth', 'phase', 'expand' vagy 'solid'", + "cursorBlinking": "Meghatározza a kurzor animációjának stílusát.", "mouseWheelZoom": "A szerkesztőablak betűtípusának nagyítása vagy kicsinyítése az egérgörgő Ctrl lenyomása mellett történő használata esetén", "cursorStyle": "Meghatározza a kurzor stílusát. Lehetséges értékek: 'block', 'block-outline', 'line', 'line-thin', 'underline' vagy 'underline-thin'", "cursorWidth": "Meghatározza a kurzor szélességét, ha az editor.cursorStyle értéke 'line'.", @@ -87,7 +87,7 @@ "renderControlCharacters": "Meghatározza, hogy a szerkesztőablakban ki legyenek-e rajzolva a vezérlőkarakterek.", "renderIndentGuides": "Meghatározza, hogy a szerkesztőablakban ki legyenek-e rajzolva az indentálási segédvonalak.", "renderLineHighlight": "Meghatározza, hogy a szerkesztőablakban hogyan legyen kirajzolva az aktuális sor kiemelése. Lehetséges értékek: 'none', 'gutter', 'line', vagy 'all'.", - "codeLens": "Meghatározza, hogy megjelenjenek-e a kódlencsék", + "codeLens": "Meghatározza, hogy megjelenjenek-e a kódlencsék a szerkesztőablakban.", "folding": "Meghatározza, hogy engedélyezve van-e a kódrészletek bezárása a szerkesztőablakban.", "foldingStrategyAuto": "Nyelvspecifikus kódrész-bezárási stratégia használata, ha az rendelkezésre áll. Ha nem, akkor tartalékmegoldásként az indentálásalapú kódrész-bezárási stratégia használata.", "foldingStrategyIndentation": "A kódrészek bezárása mindig az indentálásalapú kódrész-bezárási stratégia alapján történjen.", @@ -106,6 +106,9 @@ "links": "Meghatározza, hogy a szerkesztőablak érzékelje-e a hivatkozásokat, és kattinthatóvá tegye-e őket.", "colorDecorators": "Meghatározza, hogy a szerkesztőablakban ki legyenek-e rajzolva a színdekorátorok és színválasztók.", "codeActions": "Engedélyezi a kódműveletek végrehajtásához használható villanykörtét", + "codeActionsOnSave.organizeImports": "Importálások rendezése mentés során", + "codeActionsOnSave": "A mentés során futtatott kódműveletek.", + "codeActionsOnSaveTimeout": "A mentés során futtatott kódműveletek futási időkorlátja.", "selectionClipboard": "Meghatározza-e, hogy támogatva van-e az elsődleges vágólap Linux alatt", "sideBySide": "Meghatározza, hogy a differenciaszerkesztő ablakban egymás mellett vagy a sorban jelenjenek meg az eltérések", "ignoreTrimWhitespace": "Meghatározza, hogy a differenciaszerkesztő ablakban megjelenjenek-e a sor elején vagy végén a szóközökben talált különbségek", diff --git a/i18n/hun/src/vs/editor/common/controller/cursor.i18n.json b/i18n/hun/src/vs/editor/common/controller/cursor.i18n.json index 5b5570efe19..dbbde3698d1 100644 --- a/i18n/hun/src/vs/editor/common/controller/cursor.i18n.json +++ b/i18n/hun/src/vs/editor/common/controller/cursor.i18n.json @@ -6,5 +6,5 @@ "--------------------------------------------------------------------------------------------", "Do not edit this file. It is machine generated." ], - "corrupt.commands": "Váratlan kivétel egy parancs végrehajtása során." + "corrupt.commands": "Váratlan kivétel történt a parancs végrehajtása közben." } \ No newline at end of file diff --git a/i18n/hun/src/vs/editor/common/view/editorColorRegistry.i18n.json b/i18n/hun/src/vs/editor/common/view/editorColorRegistry.i18n.json index 05e0c0c13f7..845d69339fc 100644 --- a/i18n/hun/src/vs/editor/common/view/editorColorRegistry.i18n.json +++ b/i18n/hun/src/vs/editor/common/view/editorColorRegistry.i18n.json @@ -14,6 +14,7 @@ "editorCursorBackground": "A szerkesztőablak kurzorának háttérszíne. Lehetővé teszik az olyan karakterek színének módosítását, amelyek fölött egy blokk-típusú kurzor áll.", "editorWhitespaces": "A szerkesztőablakban található szóköz karakterek színe.", "editorIndentGuides": "A szerkesztőablak segédvonalainak színe.", + "editorActiveIndentGuide": "Az aktív szerkesztőablak segédvonalainak színe.", "editorLineNumbers": "A szerkesztőablak sorszámainak színe.", "editorActiveLineNumber": "A szerkesztőablak aktív sorához tartozó sorszám színe.", "deprecatedEditorActiveLineNumber": "Az Id elavult. Használja helyette az 'editorLineNumber.activeForeground' beállítást!", diff --git a/i18n/hun/src/vs/editor/contrib/codeAction/codeActionCommands.i18n.json b/i18n/hun/src/vs/editor/contrib/codeAction/codeActionCommands.i18n.json index ca792d8bea6..5132aa7d400 100644 --- a/i18n/hun/src/vs/editor/contrib/codeAction/codeActionCommands.i18n.json +++ b/i18n/hun/src/vs/editor/contrib/codeAction/codeActionCommands.i18n.json @@ -14,5 +14,6 @@ "editor.action.refactor.noneMessage": "Nem áll rendelkezésre refaktorálási lehetőség", "source.label": "Forrásművelet...", "editor.action.source.noneMessage": "Nem áll rendelkezésre forrásművelet", - "organizeImports.label": "Importálások rendezése" + "organizeImports.label": "Importálások rendezése", + "editor.action.organize.noneMessage": "Nem áll rendelkezésre importálások rendezésére szolgáló művelet" } \ No newline at end of file diff --git a/i18n/hun/src/vs/editor/contrib/find/findController.i18n.json b/i18n/hun/src/vs/editor/contrib/find/findController.i18n.json index ee749aec484..7615f069af8 100644 --- a/i18n/hun/src/vs/editor/contrib/find/findController.i18n.json +++ b/i18n/hun/src/vs/editor/contrib/find/findController.i18n.json @@ -7,6 +7,7 @@ "Do not edit this file. It is machine generated." ], "startFindAction": "Keresés", + "startFindWithSelectionAction": "Keresés kijelöléssel", "findNextMatchAction": "Következő találat", "findPreviousMatchAction": "Előző találat", "nextSelectionMatchFindAction": "Következő kijelölés", diff --git a/i18n/hun/src/vs/editor/contrib/format/formatActions.i18n.json b/i18n/hun/src/vs/editor/contrib/format/formatActions.i18n.json index 57716c70c1c..0fa3827f356 100644 --- a/i18n/hun/src/vs/editor/contrib/format/formatActions.i18n.json +++ b/i18n/hun/src/vs/editor/contrib/format/formatActions.i18n.json @@ -12,5 +12,7 @@ "hintnn": "{0} formázást végzett a(z) {1}. és {2}. sorok között", "no.provider": "Nincs formázó telepítve a(z) '{0}' típusú fájlokhoz.", "formatDocument.label": "Dokumentum formázása", - "formatSelection.label": "Kijelölt tartalom formázása" + "no.documentprovider": "Nincs dokumentumformázó telepítve a(z) '{0}' típusú fájlokhoz.", + "formatSelection.label": "Kijelölt tartalom formázása", + "no.selectionprovider": "Nincs kijelölésformázó telepítve a(z) '{0}' típusú fájlokhoz." } \ No newline at end of file diff --git a/i18n/hun/src/vs/editor/contrib/links/links.i18n.json b/i18n/hun/src/vs/editor/contrib/links/links.i18n.json index 9ca7de76bcf..30783c4f104 100644 --- a/i18n/hun/src/vs/editor/contrib/links/links.i18n.json +++ b/i18n/hun/src/vs/editor/contrib/links/links.i18n.json @@ -6,7 +6,7 @@ "--------------------------------------------------------------------------------------------", "Do not edit this file. It is machine generated." ], - "links.navigate.mac": "Hivatkozott oldal megnyitása Cmd + kattintás paranccsal", + "links.navigate.mac": "Hivatkozás megnyitása Ctrl + kattintás paranccsal", "links.navigate": "Hivatkozott oldal megnyitása Ctrl + kattintás paranccsal", "links.command.mac": "Cmd + kattintás a parancs végrehajtásához", "links.command": "Ctrl + kattintás a parancs végrehajtásához", diff --git a/i18n/hun/src/vs/editor/contrib/message/messageController.i18n.json b/i18n/hun/src/vs/editor/contrib/message/messageController.i18n.json index 35229bd6699..4b62af37a2b 100644 --- a/i18n/hun/src/vs/editor/contrib/message/messageController.i18n.json +++ b/i18n/hun/src/vs/editor/contrib/message/messageController.i18n.json @@ -5,5 +5,6 @@ "Licensed under the MIT License. See License.txt in the project root for license information.", "--------------------------------------------------------------------------------------------", "Do not edit this file. It is machine generated." - ] + ], + "editor.readonly": "Nem lehet szerkeszteni egy csak olvasható szerkesztőablakban" } \ No newline at end of file diff --git a/i18n/hun/src/vs/platform/environment/node/argv.i18n.json b/i18n/hun/src/vs/platform/environment/node/argv.i18n.json index 19039e5513a..77c071af2b9 100644 --- a/i18n/hun/src/vs/platform/environment/node/argv.i18n.json +++ b/i18n/hun/src/vs/platform/environment/node/argv.i18n.json @@ -22,13 +22,15 @@ "showVersions": "Telepített kiegészítők verziójának megjelenítése a --list-extension kapcsoló használata esetén.", "installExtension": "Kiegészítő telepítése.", "uninstallExtension": "Kiegészítő eltávolítása.", - "experimentalApis": "Tervezett API-funkciók engedélyezése egy kiegészítő számára.", + "experimentalApis": "Tervezett API-funkciók engedélyezése a kiegészítők számára.", "verbose": "Részletes kimenet kiírása (magába foglalja a --wait kapcsolót)", "log": "A naplózott események szintje.Az 'info' az alapértelmezett értéke. Lehetséges értékek: 'critical', 'error', 'warn', 'info', 'debug', 'trace', 'off'.", "status": "Folyamatok erőforrás-használati és diagnosztikai adatinak kiíratása.", "performance": "Indítás a 'Developer: Startup Performance' parancs engedélyezésével.", "prof-startup": "Processzorhasználat profilozása induláskor", "disableExtensions": "Összes telepített kiegészítő letiltása.", + "inspect-extensions": "Hibakeresés és profilozás engedélyezése a kiegészítőkben. A csatlakozási URI-t a fejlesztői eszközöknél találja meg.", + "inspect-brk-extensions": "Hibakeresés és profilozás engedélyezése a kiegészítőkben, úgy, hogy a kiegészítő gazdafolyamata szüneteltetve lesz az indítás után. A csatlakozási URI-t a fejlesztői eszközöknél találja meg.", "disableGPU": "Hardveres gyorsítás letiltása.", "uploadLogs": "Az aktuális munkamenet naplóinak feltöltése egy biztonságos végpontra.", "maxMemory": "Egy ablak maximális memóriamérete (megabájtban).", diff --git a/i18n/hun/src/vs/platform/extensionManagement/node/extensionManagementService.i18n.json b/i18n/hun/src/vs/platform/extensionManagement/node/extensionManagementService.i18n.json index c2eaf97d09f..2c206b7274f 100644 --- a/i18n/hun/src/vs/platform/extensionManagement/node/extensionManagementService.i18n.json +++ b/i18n/hun/src/vs/platform/extensionManagement/node/extensionManagementService.i18n.json @@ -7,6 +7,7 @@ "Do not edit this file. It is machine generated." ], "invalidManifest": "A kiegészítő érvénytelen: a package.json nem egy JSON-fájl.", + "incompatible": "A(z) '{0}' kiegészítő nem telepíthető, mivel nem kompatibilis a Code '{1}' verziójával.", "restartCode": "Indítsa újra a Code-ot a(z) {0} újratelepítése előtt.", "installingOutdatedExtension": "A kiegészítő egy újabb verziója már telepítve van. Szeretné felülírni a régebbi verzióval?", "override": "Felülírás", @@ -20,6 +21,7 @@ "notFoundCompatibleDependency": "A telepítés nem sikerült, mert a(z) '{0}' kiegészítő függőség VS Code '{1}' verziójával kompatibilis változata nem található. ", "quitCode": "A kiegészítő telepítése nem sikerült. Lépjen ki és indítsa el a VS Code-ot az újratelepítés előtt!", "exitCode": "A kiegészítő telepítése nem sikerült. Lépjen ki és indítsa el a VS Code-ot az újratelepítés előtt!", + "renameError": "Ismeretlen hiba történt a(z) {0} {1} névre való átnevezése közben", "uninstallDependeciesConfirmation": "Csak a(z) '{0}' kiegészítőt szeretné eltávolítani vagy annak függőségeit is?", "uninstallOnly": "Csak a kiegészítőt", "uninstallAll": "Az összes eltávolítása", diff --git a/i18n/hun/src/vs/platform/keybinding/common/abstractKeybindingService.i18n.json b/i18n/hun/src/vs/platform/keybinding/common/abstractKeybindingService.i18n.json index 3e3c3c0311b..36c0c154ad2 100644 --- a/i18n/hun/src/vs/platform/keybinding/common/abstractKeybindingService.i18n.json +++ b/i18n/hun/src/vs/platform/keybinding/common/abstractKeybindingService.i18n.json @@ -6,6 +6,6 @@ "--------------------------------------------------------------------------------------------", "Do not edit this file. It is machine generated." ], - "first.chord": "Lenyomta a következőt: ({0}). Várakozás a kombináció második billentyűjére...", + "first.chord": "Lenyomott billentyű: ({0}) Várakozás a kombináció második billentyűjére...", "missing.chord": "A(z) ({0}, {1}) billentyűkombináció nem egy parancs." } \ No newline at end of file diff --git a/i18n/hun/src/vs/platform/theme/common/colorRegistry.i18n.json b/i18n/hun/src/vs/platform/theme/common/colorRegistry.i18n.json index a470002b64a..37b143d1111 100644 --- a/i18n/hun/src/vs/platform/theme/common/colorRegistry.i18n.json +++ b/i18n/hun/src/vs/platform/theme/common/colorRegistry.i18n.json @@ -29,7 +29,6 @@ "inputPlaceholderForeground": "A beviteli mezőkben használt helykitöltő szövegek előtérszíne.", "inputValidationInfoBackground": "Beviteli mezők háttérszíne információs szintű validációs állapot esetén.", "inputValidationInfoBorder": "Beviteli mezők keretszíne információs szintű validációs állapot esetén.", - "inputValidationWarningBackground": "Beviteli mezők háttérszíne figyelmeztetés szintű validációs állapot esetén.", "inputValidationWarningBorder": "Beviteli mezők keretszíne figyelmeztetés szintű validációs állapot esetén.", "inputValidationErrorBackground": "Beviteli mezők háttérszíne hiba szintű validációs állapot esetén.", "inputValidationErrorBorder": "Beviteli mezők keretszíne hiba szintű validációs állapot esetén.", diff --git a/i18n/hun/src/vs/platform/url/electron-browser/inactiveExtensionUrlHandler.i18n.json b/i18n/hun/src/vs/platform/url/electron-browser/inactiveExtensionUrlHandler.i18n.json new file mode 100644 index 00000000000..35229bd6699 --- /dev/null +++ b/i18n/hun/src/vs/platform/url/electron-browser/inactiveExtensionUrlHandler.i18n.json @@ -0,0 +1,9 @@ +{ + "": [ + "--------------------------------------------------------------------------------------------", + "Copyright (c) Microsoft Corporation. All rights reserved.", + "Licensed under the MIT License. See License.txt in the project root for license information.", + "--------------------------------------------------------------------------------------------", + "Do not edit this file. It is machine generated." + ] +} \ No newline at end of file diff --git a/i18n/hun/src/vs/platform/windows/electron-main/windowsService.i18n.json b/i18n/hun/src/vs/platform/windows/electron-main/windowsService.i18n.json index c2b1e9193a6..6b754ae6899 100644 --- a/i18n/hun/src/vs/platform/windows/electron-main/windowsService.i18n.json +++ b/i18n/hun/src/vs/platform/windows/electron-main/windowsService.i18n.json @@ -6,7 +6,7 @@ "--------------------------------------------------------------------------------------------", "Do not edit this file. It is machine generated." ], - "aboutDetail": "Verzió: {0}\nCommit: {1}\nDátum: {2}\nShell: {3}\nRendelő: {4}\nNode: {5}\nArchitektúra: {6}", + "aboutDetail": "\nVerzió: {0}\nCommit: {1}\nDátum: {2}\nShell: {3}\nRenderelő: {4}\nNode: {5}\nArchitektúra: {6}", "okButton": "OK", "copy": "&&Másolás" } \ No newline at end of file diff --git a/i18n/hun/src/vs/workbench/api/browser/viewsContainersExtensionPoint.i18n.json b/i18n/hun/src/vs/workbench/api/browser/viewsContainersExtensionPoint.i18n.json index 3046160ac08..01cbe639634 100644 --- a/i18n/hun/src/vs/workbench/api/browser/viewsContainersExtensionPoint.i18n.json +++ b/i18n/hun/src/vs/workbench/api/browser/viewsContainersExtensionPoint.i18n.json @@ -6,6 +6,12 @@ "--------------------------------------------------------------------------------------------", "Do not edit this file. It is machine generated." ], + "vscode.extension.contributes.views.containers.id": "A gyűjtemény egyedi azonosítója, mellyel nézetek rendelhetők hozzá a 'views' értékeivel.", + "vscode.extension.contributes.views.containers.title": "A gyűjtemény megjelenítésénél használt, emberek számára szánt neve", + "vscode.extension.contributes.views.containers.icon": "A gyűjtemény ikonjának elérési útja", + "vscode.extension.contributes.viewsContainer": "Nézetgyűjteményeket szolgáltat a szerkesztőhöz", + "views.container.activitybar": "Nézetgyűjteményeket szolgáltat a tevékenységsávra", + "requirearray": "a nézetgyűjteményeket tömbként kell megadni", "requirestring": "a(z) `{0}` tulajdonság kötelező és `string` típusúnak kell lennie", "showViewlet": "{0} megjelenítése", "view": "Nézet" diff --git a/i18n/hun/src/vs/workbench/api/browser/viewsExtensionPoint.i18n.json b/i18n/hun/src/vs/workbench/api/browser/viewsExtensionPoint.i18n.json index 2c12ec27c2c..b04ad867931 100644 --- a/i18n/hun/src/vs/workbench/api/browser/viewsExtensionPoint.i18n.json +++ b/i18n/hun/src/vs/workbench/api/browser/viewsExtensionPoint.i18n.json @@ -10,11 +10,13 @@ "requirestring": "a(z) `{0}` tulajdonság kötelező és `string` típusúnak kell lennie", "optstring": "a(z) `{0}` tulajdonság elhagyható vagy `string` típusúnak kell lennie", "vscode.extension.contributes.view.id": "A nézet azonosítója. Ez használható az adatszolgáltató regisztrálásához a `vscode.window.registerTreeDataProviderForView` API-n keresztül. Ezen túl a kiegészítő aktiválásához regisztrálni kell az `onView:${id}` eseményt az `activationEvents`-nél.", - "vscode.extension.contributes.view.name": "A nézet emberek számára olvasható neve. Meg fog jelenni", + "vscode.extension.contributes.view.name": "A nézet emberek számára szánt neve. Megjelenik a felületen.", "vscode.extension.contributes.view.when": "A nézet megjelenítésének feltétele", "vscode.extension.contributes.views": "Nézeteket szolgáltat a szerkesztőhöz", - "views.explorer": "Fájlkezelő-nézet", - "views.debug": "Hibakeresési nézet", + "views.explorer": "Nézeteket szolgáltat a tevékenységsávon található Fájlkezelő gyűjteményhez.", + "views.debug": "Nézeteket szolgáltat a tevékenységsávon található Hibakeresés gyűjteményhez.", + "views.scm": "Nézeteket szolgáltat a tevékenységsávon található Verziókezelő rendszer gyűjteményhez.", + "views.contributed": "Nézeteket szolgáltat a szolgáltatott nézetek gyűjteményhez.", "duplicateView1": "Nem regisztrálható több nézet `{0}` azonosítóval a következő helyen: `{1}`", "duplicateView2": "Már van `{0}` azonosítójú nézet regisztrálva a következő helyen: `{1}`" } \ No newline at end of file diff --git a/i18n/hun/src/vs/workbench/api/electron-browser/mainThreadSaveParticipant.i18n.json b/i18n/hun/src/vs/workbench/api/electron-browser/mainThreadSaveParticipant.i18n.json index 1a6a8a26fbe..d0aa3c15e34 100644 --- a/i18n/hun/src/vs/workbench/api/electron-browser/mainThreadSaveParticipant.i18n.json +++ b/i18n/hun/src/vs/workbench/api/electron-browser/mainThreadSaveParticipant.i18n.json @@ -7,6 +7,7 @@ "Do not edit this file. It is machine generated." ], "timeout.formatOnSave": "Mentéskor végzett formázás megszakítva {0}ms után", + "codeActionsOnSave.didTimeout": "codeActionsOnSave megszakítva {0}ms után", "timeout.onWillSave": "OnWillSaveTextDocument-esemény megszakítva 1750ms után", "saveParticipants": "Mentési események futtatása..." } \ No newline at end of file diff --git a/i18n/hun/src/vs/workbench/browser/parts/quickinput/quickInput.i18n.json b/i18n/hun/src/vs/workbench/browser/parts/quickinput/quickInput.i18n.json index 21a3c1fb10f..614736ffe77 100644 --- a/i18n/hun/src/vs/workbench/browser/parts/quickinput/quickInput.i18n.json +++ b/i18n/hun/src/vs/workbench/browser/parts/quickinput/quickInput.i18n.json @@ -6,6 +6,8 @@ "--------------------------------------------------------------------------------------------", "Do not edit this file. It is machine generated." ], + "inputModeEntryDescription": "{0} (Nyomjon 'Enter'-t a megerősítéshez vagy 'Escape'-et a megszakításhoz)", + "inputModeEntry": "Nyomjon 'Enter'-t a megerősítéshez vagy 'Escape'-et a megszakításhoz", "quickInput.countSelected": "{0} kiválasztva", "ok": "OK" } \ No newline at end of file diff --git a/i18n/hun/src/vs/workbench/parts/debug/browser/breakpointsView.i18n.json b/i18n/hun/src/vs/workbench/parts/debug/browser/breakpointsView.i18n.json index 5c3b0b5f63e..48dd335d261 100644 --- a/i18n/hun/src/vs/workbench/parts/debug/browser/breakpointsView.i18n.json +++ b/i18n/hun/src/vs/workbench/parts/debug/browser/breakpointsView.i18n.json @@ -6,6 +6,10 @@ "--------------------------------------------------------------------------------------------", "Do not edit this file. It is machine generated." ], + "logPoint": "Naplózási pont", + "breakpoint": "Töréspont", + "editBreakpoint": "{0} szerkesztése...", + "removeBreakpoint": "{0} eltávolítása", "functionBreakpointsNotSupported": "Ez a hibakereső nem támogatja a függvénytöréspontokat", "functionBreakpointPlaceholder": "A függvény, amin meg kell állni", "functionBreakPointInputAriaLabel": "Adja meg a függvénytöréspontot", diff --git a/i18n/hun/src/vs/workbench/parts/debug/browser/debugActions.i18n.json b/i18n/hun/src/vs/workbench/parts/debug/browser/debugActions.i18n.json index 621a6e08120..f333f59a793 100644 --- a/i18n/hun/src/vs/workbench/parts/debug/browser/debugActions.i18n.json +++ b/i18n/hun/src/vs/workbench/parts/debug/browser/debugActions.i18n.json @@ -21,6 +21,7 @@ "disconnectDebug": "Kapcsolat bontása", "continueDebug": "Folytatás", "pauseDebug": "Szüneteltetés", + "terminateThread": "Szál megszüntetése", "restartFrame": "Keret újraindítása", "removeBreakpoint": "Töréspont eltávolítása", "removeAllBreakpoints": "Összes töréspont eltávolítása", diff --git a/i18n/hun/src/vs/workbench/parts/debug/electron-browser/debug.contribution.i18n.json b/i18n/hun/src/vs/workbench/parts/debug/electron-browser/debug.contribution.i18n.json index 2654914b2b8..8f5ebe5ec40 100644 --- a/i18n/hun/src/vs/workbench/parts/debug/electron-browser/debug.contribution.i18n.json +++ b/i18n/hun/src/vs/workbench/parts/debug/electron-browser/debug.contribution.i18n.json @@ -27,6 +27,5 @@ "onFirstSessionStart": "A hibakeresés csak akkor jelenjen meg az állapotsoron, miután először el lett indítva a hibakeresés", "showInStatusBar": "Meghatározza, hogy megjelenjen-e a hibakeresési állapotsáv", "openDebug": "Meghatározza, hogy megnyíljon-e a hibakeresési modul a hibakeresési munkamenet indulásakor.", - "launch": "Globális hibakeresés indítási konfiguráció. Használható a 'launch.json' alternatívájaként, ami meg van osztva több munkaterület között", - "extensionHostDebugAdapter": "Hibakeresési illesztő futtatása egy kiegészítős gazdafolyamatban" + "launch": "Globális hibakeresés indítási konfiguráció. Használható a 'launch.json' alternatívájaként, ami meg van osztva több munkaterület között" } \ No newline at end of file diff --git a/i18n/hun/src/vs/workbench/parts/debug/electron-browser/debugEditorContribution.i18n.json b/i18n/hun/src/vs/workbench/parts/debug/electron-browser/debugEditorContribution.i18n.json index f8b204c30b7..7c65da736d7 100644 --- a/i18n/hun/src/vs/workbench/parts/debug/electron-browser/debugEditorContribution.i18n.json +++ b/i18n/hun/src/vs/workbench/parts/debug/electron-browser/debugEditorContribution.i18n.json @@ -6,6 +6,12 @@ "--------------------------------------------------------------------------------------------", "Do not edit this file. It is machine generated." ], + "logPoint": "Naplózási pont", + "breakpoint": "Töréspont", + "removeBreakpoint": "{0} eltávolítása", + "editBreakpoint": "{0} szerkesztése...", + "disableBreakpoint": "{0} letiltása", + "enableBreakpoint": "{0} engedélyezése", "removeBreakpoints": "Töréspontok eltávolítása", "removeBreakpointOnColumn": "{0}. oszlopban található töréspont eltávolítása", "removeLineBreakpoint": "Sorra vonatkozó töréspont eltávolítása", @@ -20,6 +26,10 @@ "addBreakpoint": "Töréspont hozzáadása", "addConditionalBreakpoint": "Feltételes töréspont hozzáadása...", "addLogPoint": "Naplózási pont hozzáadása...", + "message": "üzenettel", + "condition": "feltétellel", + "removeLogPoint": "{0} eltávolítása", + "disableLogPoint": "{0} letiltása", "cancel": "Mégse", "addConfiguration": "Konfiguráció hozzáadása..." } \ No newline at end of file diff --git a/i18n/hun/src/vs/workbench/parts/files/electron-browser/fileActions.i18n.json b/i18n/hun/src/vs/workbench/parts/files/electron-browser/fileActions.i18n.json index 27080d41e6c..c9fcc7b9a6b 100644 --- a/i18n/hun/src/vs/workbench/parts/files/electron-browser/fileActions.i18n.json +++ b/i18n/hun/src/vs/workbench/parts/files/electron-browser/fileActions.i18n.json @@ -13,6 +13,7 @@ "copyFile": "Másolás", "pasteFile": "Beillesztés", "retry": "Újrapróbálkozás", + "renameWhenSourcePathIsParentOfTargetError": "Létező mappában az „Új mappa” vagy „Új fájl” parancsokkal hozhat lére új elemeket.", "newUntitledFile": "Új, névtelen fájl", "createNewFile": "Új fájl", "createNewFolder": "Új mappa", @@ -24,20 +25,20 @@ "dirtyMessageFolderDelete": "Törölni készül egy olyan mappát, melyben {0} nem mentett változtatásokat tartalmazó fájl van. Folytatja?", "dirtyMessageFileDelete": "Törölni készül egy olyan fájlt, amely nem mentett változtatásokat tartalmaz. Folytatja?", "dirtyWarning": "A módosítások elvesznek, ha nem menti őket.", - "confirmMoveTrashMessageMultiple": "Törli a következő {0} fájlt?", - "confirmMoveTrashMessageFolder": "Törli a(z) '{0}' nevű mappát és a teljes tartalmát?", - "confirmMoveTrashMessageFile": "Törli a(z) '{0}' nevű fájlt?", "undoBin": "Helyreállíthatja a lomtárból.", "undoTrash": "Helyreállíthatja a kukából.", "doNotAskAgain": "Ne kérdezze meg újra", - "confirmDeleteMessageMultiple": "Véglegesen törli a következő {0} fájlt?", - "confirmDeleteMessageFolder": "Törli a(z) '{0}' nevű mappát és annak teljes tartalmát? ", - "confirmDeleteMessageFile": "Véglegesen törli a(z) '{0}' nevű fájlt?", "irreversible": "A művelet nem vonható vissza!", "binFailed": "Nem sikerült törölni a lomtár használatával. Szeretné helyette véglegesen törölni?", "trashFailed": "Nem sikerült törölni a kuka használatával. Szeretné helyette véglegesen törölni?", "deletePermanentlyButtonLabel": "&&Törlés véglegesen", "retryButtonLabel": "Új&&rapróbálkozás", + "confirmMoveTrashMessageMultiple": "Törli a következő {0} fájlt?", + "confirmMoveTrashMessageFolder": "Törli a(z) '{0}' nevű mappát és a teljes tartalmát?", + "confirmMoveTrashMessageFile": "Törli a(z) '{0}' nevű fájlt?", + "confirmDeleteMessageMultiple": "Véglegesen törli a következő {0} fájlt?", + "confirmDeleteMessageFolder": "Törli a(z) '{0}' nevű mappát és annak teljes tartalmát? ", + "confirmDeleteMessageFile": "Véglegesen törli a(z) '{0}' nevű fájlt?", "addFiles": "Fájlok hozzáadása", "confirmOverwrite": "A célmappában már van ilyen nevű mappa vagy fájl. Le szeretné cserélni?", "replaceButtonLabel": "&&Csere", @@ -58,7 +59,9 @@ "openFileToShowInNewWindow": "Fájl új ablakban történő megnyitásához először nyisson meg egy fájlt", "copyPath": "Elérési út másolása", "emptyFileNameError": "Meg kell adni egy fájl vagy mappa nevét.", + "fileNameStartsWithSlashError": "A fájlok és mappák neve nem kezdődhet perjellel.", "fileNameExistsError": "Már létezik **{0}** nevű fájl vagy mappa ezen a helyszínen. Adjon meg egy másik nevet!", + "fileUsedAsFolderError": "A(z) **{0}** egy fájl, és nem rendelkezhet alelemekkel.", "invalidFileNameError": "A(z) **{0}** név nem érvényes fájl- vagy mappanév. Adjon meg egy másik nevet!", "filePathTooLongError": "A(z) **{0}** név egy olyan elérési utat eredményez, ami túl hosszú. Adjon meg egy másik nevet!", "compareWithClipboard": "Aktív fájl összehasonlítása a vágólap tartalmával", diff --git a/i18n/hun/src/vs/workbench/parts/files/electron-browser/views/explorerViewer.i18n.json b/i18n/hun/src/vs/workbench/parts/files/electron-browser/views/explorerViewer.i18n.json index 9db90ff7ab2..cf15f7edd90 100644 --- a/i18n/hun/src/vs/workbench/parts/files/electron-browser/views/explorerViewer.i18n.json +++ b/i18n/hun/src/vs/workbench/parts/files/electron-browser/views/explorerViewer.i18n.json @@ -7,6 +7,9 @@ "Do not edit this file. It is machine generated." ], "fileInputAriaLabel": "Adja meg a fájl nevét. Nyomjon 'Enter'-t a megerősítéshez vagy 'Escape'-et a megszakításhoz.", + "createFileFromExplorerInfoMessage": "**{0}** fájl létrehozva a következő helyen: **{1}**", + "renameFileFromExplorerInfoMessage": "Áthelyezés és átnevezés a következőre: **{0}**", + "createFolderFromExplorerInfoMessage": "**{0}** mappa létrehozása a következő helyen: **{1}**", "filesExplorerViewerAriaLabel": "{0}, Fájlkezelő", "dropFolders": "Szeretné hozzáadni a mappákat a munkaterülethez?", "dropFolder": "Szeretné hozzáadni a mappát a munkaterülethez?", diff --git a/i18n/hun/src/vs/workbench/parts/localizations/electron-browser/localizations.contribution.i18n.json b/i18n/hun/src/vs/workbench/parts/localizations/electron-browser/localizations.contribution.i18n.json new file mode 100644 index 00000000000..6bd71c5eb71 --- /dev/null +++ b/i18n/hun/src/vs/workbench/parts/localizations/electron-browser/localizations.contribution.i18n.json @@ -0,0 +1,23 @@ +{ + "": [ + "--------------------------------------------------------------------------------------------", + "Copyright (c) Microsoft Corporation. All rights reserved.", + "Licensed under the MIT License. See License.txt in the project root for license information.", + "--------------------------------------------------------------------------------------------", + "Do not edit this file. It is machine generated." + ], + "updateLocale": "Szeretné a VS Code felületét {0} nyelvűre állítani és újraindítani az alkalmazást?", + "yes": "Igen", + "no": "Nem", + "neverAgain": "Ne jelenítse meg újra", + "install": "Telepítés", + "JsonSchema.locale": "A felhasználói felületen használt nyelv.", + "vscode.extension.contributes.localizations": "Lokalizációkat szolgáltat a szerkesztőhöz", + "vscode.extension.contributes.localizations.languageId": "Annak a nyelvnek az azonosítója, amelyre a megjelenített szövegek fordítva vannak.", + "vscode.extension.contributes.localizations.languageName": "A nyelv neve angolul.", + "vscode.extension.contributes.localizations.languageNameLocalized": "A nyelv neve a szolgáltatott nyelven.", + "vscode.extension.contributes.localizations.translations": "A nyelvhez rendelt fordítások listája.", + "vscode.extension.contributes.localizations.translations.id": "Azonosító, ami a VS Code-ra vagy arra a kiegészítőre hivatkozik, amihez a fordítás szolgáltatva van. A VS Code azonosítója mindig `vscode`, kiegészítők esetén pedig a `publisherId.extensionName` formátumban kell megadni.", + "vscode.extension.contributes.localizations.translations.id.pattern": "Az id értéke VS Code fordítása esetében `vscode`, egy kiegészítő esetében pedig `publisherId.extensionName` formátumú lehet.", + "vscode.extension.contributes.localizations.translations.path": "A nyelvhez tartozó fordításokat tartalmazó fájl relatív elérési útja." +} \ No newline at end of file diff --git a/i18n/hun/src/vs/workbench/parts/localizations/electron-browser/localizationsActions.i18n.json b/i18n/hun/src/vs/workbench/parts/localizations/electron-browser/localizationsActions.i18n.json new file mode 100644 index 00000000000..8181e5ce9e2 --- /dev/null +++ b/i18n/hun/src/vs/workbench/parts/localizations/electron-browser/localizationsActions.i18n.json @@ -0,0 +1,14 @@ +{ + "": [ + "--------------------------------------------------------------------------------------------", + "Copyright (c) Microsoft Corporation. All rights reserved.", + "Licensed under the MIT License. See License.txt in the project root for license information.", + "--------------------------------------------------------------------------------------------", + "Do not edit this file. It is machine generated." + ], + "configureLocale": "Nyelv beállítása", + "displayLanguage": "Meghatározza a VSCode felületének nyelvét.", + "doc": "Az elérhető nyelvek listája a következő címen tekinthető meg: {0}", + "restart": "Az érték módosítása után újra kell indítani a VSCode-ot.", + "fail.createSettings": "Nem sikerült a(z) '{0}' létrehozás ({1})." +} \ No newline at end of file diff --git a/i18n/hun/src/vs/workbench/parts/markers/electron-browser/markersPanel.i18n.json b/i18n/hun/src/vs/workbench/parts/markers/electron-browser/markersPanel.i18n.json index 35229bd6699..6230ddd7379 100644 --- a/i18n/hun/src/vs/workbench/parts/markers/electron-browser/markersPanel.i18n.json +++ b/i18n/hun/src/vs/workbench/parts/markers/electron-browser/markersPanel.i18n.json @@ -5,5 +5,7 @@ "Licensed under the MIT License. See License.txt in the project root for license information.", "--------------------------------------------------------------------------------------------", "Do not edit this file. It is machine generated." - ] + ], + "disableFilesExclude": "Fájlkizárási beállítások használatának kikapcsolása", + "clearFilter": "Szűrő törlése" } \ No newline at end of file diff --git a/i18n/hun/src/vs/workbench/parts/markers/electron-browser/markersPanelActions.i18n.json b/i18n/hun/src/vs/workbench/parts/markers/electron-browser/markersPanelActions.i18n.json index 35229bd6699..9b95cf1be7f 100644 --- a/i18n/hun/src/vs/workbench/parts/markers/electron-browser/markersPanelActions.i18n.json +++ b/i18n/hun/src/vs/workbench/parts/markers/electron-browser/markersPanelActions.i18n.json @@ -5,5 +5,6 @@ "Licensed under the MIT License. See License.txt in the project root for license information.", "--------------------------------------------------------------------------------------------", "Do not edit this file. It is machine generated." - ] + ], + "showing filtered problems": "{0} megjelenítve (összesen: {1})" } \ No newline at end of file diff --git a/i18n/hun/src/vs/workbench/parts/markers/electron-browser/messages.i18n.json b/i18n/hun/src/vs/workbench/parts/markers/electron-browser/messages.i18n.json index 04de19e7bab..e2f7dbb8aea 100644 --- a/i18n/hun/src/vs/workbench/parts/markers/electron-browser/messages.i18n.json +++ b/i18n/hun/src/vs/workbench/parts/markers/electron-browser/messages.i18n.json @@ -14,8 +14,13 @@ "markers.panel.title.problems": "Problémák", "markers.panel.aria.label.problems.tree": "Problémák fájlonként csoportosítva", "markers.panel.no.problems.build": "A munkaterületen eddig egyetlen hiba sem lett érzékelve.", + "markers.panel.no.problems.filters": "A megadott szűrőfeltételeknek egyetlen elem sem felel meg.", + "markers.panel.no.problems.file.exclusions": "Az összes probléma el van rejtve, mert a fájlkizárási szűrő engedélyezve van.", + "markers.panel.action.useFilesExclude": "Fájlkizárási beállítások használata", + "markers.panel.action.donotUseFilesExclude": " Ne legyenek használva a fájlkizárási beállítások", "markers.panel.action.filter": "Problémák szűrése", "markers.panel.filter.ariaLabel": "Problémák szűrése", + "markers.panel.filter.placeholder": "Szűrő, pl.: szöveg, **/*.ts, !**/node_modules/**", "markers.panel.filter.errors": "hibák", "markers.panel.filter.warnings": "figyelmeztetések", "markers.panel.filter.infos": "információk", diff --git a/i18n/hun/src/vs/workbench/parts/quickopen/browser/gotoLineHandler.i18n.json b/i18n/hun/src/vs/workbench/parts/quickopen/browser/gotoLineHandler.i18n.json index 7aa31cc650e..63860d80e36 100644 --- a/i18n/hun/src/vs/workbench/parts/quickopen/browser/gotoLineHandler.i18n.json +++ b/i18n/hun/src/vs/workbench/parts/quickopen/browser/gotoLineHandler.i18n.json @@ -7,8 +7,8 @@ "Do not edit this file. It is machine generated." ], "gotoLine": "Sor megkeresése...", - "gotoLineLabelEmptyWithLimit": "A keresett sor 1 és {0} közötti sorszáma", - "gotoLineLabelEmpty": "A keresett sor száma", + "gotoLineLabelEmptyWithLimit": "Adja meg a keresett sor számát 1 és {0} között!", + "gotoLineLabelEmpty": "Adja meg a keresett sor számát!", "gotoLineColumnLabel": "Ugrás a(z) {0}. sor {1}. oszlopára", "gotoLineLabel": "Sor megkeresése {0}", "gotoLineHandlerAriaLabel": "Adja meg a keresett sor számát!", diff --git a/i18n/hun/src/vs/workbench/parts/search/electron-browser/search.contribution.i18n.json b/i18n/hun/src/vs/workbench/parts/search/electron-browser/search.contribution.i18n.json index d229aa88582..84dfc238f59 100644 --- a/i18n/hun/src/vs/workbench/parts/search/electron-browser/search.contribution.i18n.json +++ b/i18n/hun/src/vs/workbench/parts/search/electron-browser/search.contribution.i18n.json @@ -21,7 +21,7 @@ "openAnythingHandlerDescription": "Fájl megkeresése", "openSymbolDescriptionNormal": "Szimbólum megkeresése a munkaterületen", "searchConfigurationTitle": "Keresés", - "exclude": "Globális minták konfigurálása fájlok és mappák keresésből való kizárásához. Örökli az összes globális mintát a fliex.exclude beállításból.", + "exclude": "Fájlok és mappák keresésből való kizárására szolgáló globális minták. Örökli az összes globális mintát a fliex.exclude beállításból.", "exclude.boolean": "A globális minta, amire illesztve lesznek a fájlok elérési útjai. A minta engedélyezéséhez vagy letiltásához állítsa igaz vagy hamis értékre.", "exclude.when": "További ellenőrzés elvégzése az illeszkedő fájlok testvérein. Az illeszkedő fájl nevéhez használja a $(basename) változót!", "useRipgrep": "Meghatározza, hogy a szövegben és fájlokban való kereséshez a ripgrep van-e használva.", diff --git a/i18n/hun/src/vs/workbench/parts/tasks/common/problemMatcher.i18n.json b/i18n/hun/src/vs/workbench/parts/tasks/common/problemMatcher.i18n.json index 45757d97a23..8012cefbb20 100644 --- a/i18n/hun/src/vs/workbench/parts/tasks/common/problemMatcher.i18n.json +++ b/i18n/hun/src/vs/workbench/parts/tasks/common/problemMatcher.i18n.json @@ -45,7 +45,7 @@ "PatternTypeSchema.description": "Egy problémaminta vagy egy szolgáltatott vagy elődefiniált problémaminta neve. Elhagyható, ha az alapként használandó minta meg van adva.", "ProblemMatcherSchema.base": "A alapként használni kívánt problémaillesztő neve.", "ProblemMatcherSchema.owner": "A probléma tulajdonosa a Code-on belül. Elhagyható, ha az alapként használt minta meg van adva. Alapértelmezett értéke 'external', ha nem létezik és az alapként használt minta nincs meghatározva.", - "ProblemMatcherSchema.source": "A diagnosztika forrásának emberek által is értelmezhető leírása, pl. 'typescript' vagy 'super lint'.", + "ProblemMatcherSchema.source": "A diagnosztika forrásának emberek számára szánt leírása, pl. 'typescript' vagy 'super lint'.", "ProblemMatcherSchema.severity": "Az elkapott problémák alapértelmezett súlyossága. Ez az érték van használva, ha a minta nem definiál illesztési csoportot a súlyossághoz.", "ProblemMatcherSchema.applyTo": "Meghatározza, hogy a szöveges dokumentumhoz jelentett probléma megnyitott, bezárt vagy minden dokumentumra legyen alkalmazva.", "ProblemMatcherSchema.fileLocation": "Meghatározza, hogy a problémamintában talált fájlnevek hogyan legyenek értelmezve.", diff --git a/i18n/hun/src/vs/workbench/parts/terminal/electron-browser/terminal.contribution.i18n.json b/i18n/hun/src/vs/workbench/parts/terminal/electron-browser/terminal.contribution.i18n.json index ffeedfbd5f0..ad9a3df4cdc 100644 --- a/i18n/hun/src/vs/workbench/parts/terminal/electron-browser/terminal.contribution.i18n.json +++ b/i18n/hun/src/vs/workbench/parts/terminal/electron-browser/terminal.contribution.i18n.json @@ -28,7 +28,7 @@ "terminal.integrated.setLocaleVariables": "Meghatározza, hogy a lokálváltozók be vannak-e állítva a terminál indításánál. Alapértelmezett értéke igaz OS X-en, hamis más platformokon.", "terminal.integrated.rightClickBehavior": "Meghatározza, hogy a terminál hogyan reagál a jobb kattintásra. Lehetséges értékek: 'default', 'copyPaste' és 'selectWord'. 'default' esetén megjelenik a helyi menü, 'copyPaste' esetén másolja a kijelölt szöveget, ha van, egyébként beilleszt, 'selectWord' esetén pedig kijelöli a kurzor alatti szót és megjeleníti a helyi menüt.", "terminal.integrated.cwd": "Explicit elérési út, ahol a terminál indítva lesz. Ez a shellfolyamat munkakönyvtára (cwd) lesz. Ez a beállítás nagyon hasznos olyan munkaterületeken, ahol a gyökérkönyvtár nem felel meg munkakönyvtárnak.", - "terminal.integrated.confirmOnExit": "Meghatározza, hogy megerősítést kér-e az alkalamzás, ha van aktív terminál-munkafolyamat.", + "terminal.integrated.confirmOnExit": "Az alkalmazás kérjen-e megerősítést kilépéskor, ha van aktív terminál-munkafolyamat.", "terminal.integrated.enableBell": "Meghatározza, hogy engedélyezve van-e a csengő a terminálba.", "terminal.integrated.commandsToSkipShell": "Olyan parancsazonosítók listája, melyek nem lesznek elküldve a shellnek, és ehelyett mindig a Code kezeli le őket. Ez lehetővé teszi, hogy az olyan billentyűparancsok, melyeket normál esetben a shell dolgozna fel, ugyanúgy működjenek, mint mikor a terminálon nincs fókusz. Például ilyen a gyorsmegnyitás indításához használt Ctrl+P.", "terminal.integrated.env.osx": "A VS Code folyamatához hozzáadott környezeti változókat tartalmazó objektum, amit az OS X-es terminál használ.", diff --git a/i18n/hun/src/vs/workbench/parts/terminal/electron-browser/terminalInstance.i18n.json b/i18n/hun/src/vs/workbench/parts/terminal/electron-browser/terminalInstance.i18n.json index 40b09afbc89..3f9d9405573 100644 --- a/i18n/hun/src/vs/workbench/parts/terminal/electron-browser/terminalInstance.i18n.json +++ b/i18n/hun/src/vs/workbench/parts/terminal/electron-browser/terminalInstance.i18n.json @@ -12,5 +12,6 @@ "terminal.integrated.copySelection.noSelection": "A terminálban nincs semmi kijelölve a másoláshoz", "terminal.integrated.exitedWithCode": "A terminálfolyamat a következő kilépési kóddal állt le: {0}", "terminal.integrated.waitOnExit": "A folytatáshoz nyomjon meg egy billentyűt...", - "terminal.integrated.launchFailed": "A(z) '{0}{1}' terminálfolyamat-parancsot nem sikerült elindítani (kilépési kód: {2})" + "terminal.integrated.launchFailed": "A(z) '{0}{1}' terminálfolyamat-parancsot nem sikerült elindítani (kilépési kód: {2})", + "terminal.integrated.launchFailedExtHost": "A terminálfolyamat nem tudott elindulni (kilépési kód: {0})" } \ No newline at end of file diff --git a/i18n/hun/src/vs/workbench/parts/terminal/electron-browser/terminalLinkHandler.i18n.json b/i18n/hun/src/vs/workbench/parts/terminal/electron-browser/terminalLinkHandler.i18n.json index 656feeee535..8f6a95dc2ec 100644 --- a/i18n/hun/src/vs/workbench/parts/terminal/electron-browser/terminalLinkHandler.i18n.json +++ b/i18n/hun/src/vs/workbench/parts/terminal/electron-browser/terminalLinkHandler.i18n.json @@ -7,6 +7,6 @@ "Do not edit this file. It is machine generated." ], "terminalLinkHandler.followLinkAlt": "Hivatkozás megnyitása Alt + kattintás paranccsal", - "terminalLinkHandler.followLinkCmd": "Hivatkozott oldal megnyitása Cmd + kattintás paranccsal", + "terminalLinkHandler.followLinkCmd": "Hivatkozás megnyitása Cmd + kattintás paranccsal", "terminalLinkHandler.followLinkCtrl": "Hivatkozott oldal megnyitása Ctrl + kattintás paranccsal" } \ No newline at end of file diff --git a/i18n/hun/src/vs/workbench/parts/url/electron-browser/url.contribution.i18n.json b/i18n/hun/src/vs/workbench/parts/url/electron-browser/url.contribution.i18n.json new file mode 100644 index 00000000000..4fc157d384a --- /dev/null +++ b/i18n/hun/src/vs/workbench/parts/url/electron-browser/url.contribution.i18n.json @@ -0,0 +1,11 @@ +{ + "": [ + "--------------------------------------------------------------------------------------------", + "Copyright (c) Microsoft Corporation. All rights reserved.", + "Licensed under the MIT License. See License.txt in the project root for license information.", + "--------------------------------------------------------------------------------------------", + "Do not edit this file. It is machine generated." + ], + "openUrl": "URL megnyitása", + "developer": "Fejlesztői" +} \ No newline at end of file diff --git a/i18n/hun/src/vs/workbench/parts/welcome/overlay/browser/welcomeOverlay.i18n.json b/i18n/hun/src/vs/workbench/parts/welcome/overlay/browser/welcomeOverlay.i18n.json index d1a80f30de0..0fb4b450576 100644 --- a/i18n/hun/src/vs/workbench/parts/welcome/overlay/browser/welcomeOverlay.i18n.json +++ b/i18n/hun/src/vs/workbench/parts/welcome/overlay/browser/welcomeOverlay.i18n.json @@ -13,6 +13,7 @@ "welcomeOverlay.extensions": "Kiterjesztések kezelése", "welcomeOverlay.problems": "Hibák és figyelmeztetések megtekintése", "welcomeOverlay.commandPalette": "Összes parancs megkeresése és futtatása", + "welcomeOverlay.notifications": "Értesítések megjelenítése", "welcomeOverlay": "Felhasználói felület áttekintése", "hideWelcomeOverlay": "Felület áttekintésének elrejtése", "help": "Segítség" diff --git a/i18n/hun/src/vs/workbench/parts/welcome/page/electron-browser/vs_code_welcome_page.i18n.json b/i18n/hun/src/vs/workbench/parts/welcome/page/electron-browser/vs_code_welcome_page.i18n.json index 8e4e5a7201f..e777fa951c0 100644 --- a/i18n/hun/src/vs/workbench/parts/welcome/page/electron-browser/vs_code_welcome_page.i18n.json +++ b/i18n/hun/src/vs/workbench/parts/welcome/page/electron-browser/vs_code_welcome_page.i18n.json @@ -27,6 +27,8 @@ "welcomePage.installExtensionPacks": "Eszközök és nyelvek", "welcomePage.installExtensionPacksDescription": "{0} és {1} fejlesztőkörnyezetek telepítése ", "welcomePage.moreExtensions": "további", + "welcomePage.installKeymapDescription": "Beállítások és billentyűkombinációk", + "welcomePage.installKeymapExtension": "{0} és {1} billentyűparancsok és beállítások telepítése ", "welcomePage.others": "további", "welcomePage.colorTheme": "Színtéma", "welcomePage.colorThemeDescription": "Alakítsa át szeretett szerkesztőjét úgy, ahogyan szeretné!", diff --git a/i18n/hun/src/vs/workbench/services/configuration/node/configurationEditingService.i18n.json b/i18n/hun/src/vs/workbench/services/configuration/node/configurationEditingService.i18n.json index 33560af61d7..8838896ef92 100644 --- a/i18n/hun/src/vs/workbench/services/configuration/node/configurationEditingService.i18n.json +++ b/i18n/hun/src/vs/workbench/services/configuration/node/configurationEditingService.i18n.json @@ -11,6 +11,7 @@ "open": "Beállítások megnyitása", "saveAndRetry": "Mentés és újrapróbálkozás", "errorUnknownKey": "Nem sikerült írni a következőbe: {0}. A(z) {1} nem regisztrált beállítás.", + "errorInvalidWorkspaceConfigurationApplication": "Nem sikerült írni a munkaterület beállításaiba, mert ez a beállítás csak a felhasználói beállításokban használható. ", "errorInvalidFolderConfiguration": "Nem sikerült írni a mappa beállításaiba, mert a(z) {0} nem támogatott mappa típusú erőforrások hatókörében.", "errorInvalidUserTarget": "Nem sikerült írni a felhasználói beállításokba, mert a(z) {0} nem támogatott globális hatókörben.", "errorInvalidWorkspaceTarget": "Nem sikerült írni a munkaterület beállításaiba, mert a(z) {0} nem támogatott munkaterületi hatókörben egy több mappát tartalmazó munkaterületen.", diff --git a/i18n/hun/src/vs/workbench/services/configurationResolver/node/variableResolver.i18n.json b/i18n/hun/src/vs/workbench/services/configurationResolver/node/variableResolver.i18n.json new file mode 100644 index 00000000000..978a6d116b1 --- /dev/null +++ b/i18n/hun/src/vs/workbench/services/configurationResolver/node/variableResolver.i18n.json @@ -0,0 +1,20 @@ +{ + "": [ + "--------------------------------------------------------------------------------------------", + "Copyright (c) Microsoft Corporation. All rights reserved.", + "Licensed under the MIT License. See License.txt in the project root for license information.", + "--------------------------------------------------------------------------------------------", + "Do not edit this file. It is machine generated." + ], + "missingEnvVarName": "A(z) '{0}' értékét nem lehet feloldani, mert nincs megadva a környezeti változó neve.", + "configNotFound": "A(z) '{0}' értékét nem lehet feloldani, mert a(z) '{1}' beállítás nem található.", + "configNoString": "A(z) '{0}' értékét nem lehet feloldani, mert a(z) '{1}' strukturált értékkel rendelkezik.", + "missingConfigName": "A(z) '{0}' értékét nem lehet feloldani, mert nincs megadva a beállítás neve.", + "noValueForCommand": "A(z) '{0}' értékét nem lehet feloldani, mert a parancsnak nincs értéke.", + "canNotFindFolder": "A(z) '{0}' értékét nem lehet feloldani, mert nincs '{1}' nevű mappa.", + "canNotResolveWorkspaceFolderMultiRoot": "Az) '{0}' értékét nem lehet feloldani egy többmappás munkaterületen. Pontosítsa a változó hatókörét a : karakterrel és a mappa nevének megadásával!", + "canNotResolveWorkspaceFolder": "A(z) '{0}' értékét nem lehet feloldani. Nyisson meg egy mappát!", + "canNotResolveFile": "A(z) '{0}' értékét nem lehet feloldani. Nyisson meg egy szerkesztőablakot!", + "canNotResolveLineNumber": "A(z) '{0}' értékét nem lehet feloldani. Jelöljön ki egy sort az aktív szerkesztőablakban!", + "canNotResolveSelectedText": "A(z) '{0}' értékét nem lehet feloldani. Jelöljön ki szöveget az aktív szerkesztőablakban!" +} \ No newline at end of file diff --git a/i18n/ita/extensions/npm/out/npmView.i18n.json b/i18n/ita/extensions/npm/out/npmView.i18n.json new file mode 100644 index 00000000000..35229bd6699 --- /dev/null +++ b/i18n/ita/extensions/npm/out/npmView.i18n.json @@ -0,0 +1,9 @@ +{ + "": [ + "--------------------------------------------------------------------------------------------", + "Copyright (c) Microsoft Corporation. All rights reserved.", + "Licensed under the MIT License. See License.txt in the project root for license information.", + "--------------------------------------------------------------------------------------------", + "Do not edit this file. It is machine generated." + ] +} \ No newline at end of file diff --git a/i18n/ita/extensions/npm/out/tasks.i18n.json b/i18n/ita/extensions/npm/out/tasks.i18n.json new file mode 100644 index 00000000000..c3dbec06958 --- /dev/null +++ b/i18n/ita/extensions/npm/out/tasks.i18n.json @@ -0,0 +1,10 @@ +{ + "": [ + "--------------------------------------------------------------------------------------------", + "Copyright (c) Microsoft Corporation. All rights reserved.", + "Licensed under the MIT License. See License.txt in the project root for license information.", + "--------------------------------------------------------------------------------------------", + "Do not edit this file. It is machine generated." + ], + "npm.parseError": "Rilevamento attività npm: non è stato possibile analizzare il file {0}" +} \ No newline at end of file diff --git a/i18n/ita/extensions/npm/package.i18n.json b/i18n/ita/extensions/npm/package.i18n.json index b541b36c365..8b390aaf942 100644 --- a/i18n/ita/extensions/npm/package.i18n.json +++ b/i18n/ita/extensions/npm/package.i18n.json @@ -14,5 +14,8 @@ "config.npm.exclude": "Configura i modelli glob per le cartelle che dovrebbero essere escluse dalla rilevazione automatica di script.", "npm.parseError": "Rilevamento attività NPM: Impossibile analizzare il file {0}", "taskdef.script": "Lo script di npm da personalizzare.", - "taskdef.path": "Il percorso della cartella del file package.json che fornisce lo script. Può essere omesso." + "taskdef.path": "Il percorso della cartella del file package.json che fornisce lo script. Può essere omesso.", + "command.refresh": "Aggiorna", + "command.debug": "Debug", + "command.openScript": "Apri" } \ No newline at end of file diff --git a/i18n/ita/src/vs/editor/common/config/commonEditorConfig.i18n.json b/i18n/ita/src/vs/editor/common/config/commonEditorConfig.i18n.json index 214bd3b8cab..c3b6c0b2a85 100644 --- a/i18n/ita/src/vs/editor/common/config/commonEditorConfig.i18n.json +++ b/i18n/ita/src/vs/editor/common/config/commonEditorConfig.i18n.json @@ -16,7 +16,6 @@ "lineNumbers.on": "I numeri di riga vengono visualizzati come numeri assoluti.", "lineNumbers.relative": "I numeri di riga vengono visualizzati come distanza in linee alla posizione del cursore.", "lineNumbers.interval": "I numeri di riga vengono visualizzati ogni 10 righe.", - "lineNumbers": "Controlla la visualizzazione dei numeri di riga. I valori possibili sono 'on', 'off', 'relativi' ed 'intervallo'.", "rulers": "Mostra righelli verticali dopo un certo numero di caratteri a spaziatura fissa. Utilizza più valori per più righelli. Nessun righello viene disegnati se la matrice è vuota", "wordSeparators": "Caratteri che verranno usati come separatori di parola quando si eseguono operazioni o spostamenti correlati a parole", "tabSize": "Il numero di spazi corrispondenti ad un carattere Tab. Questa impostazione viene sottoposta a override in base al contenuto dei file quando 'editor.detectIndentation' è 'on'.", @@ -28,8 +27,7 @@ "scrollBeyondLastLine": "Controlla se l'editor scorrerà oltre l'ultima riga", "smoothScrolling": "Controlla se per lo scorrimento dell'editor verrà usata un'animazione.", "minimap.enabled": "Controlla se la mini mappa è visualizzata", - "minimap.side": "Definisce il lato in cui viene mostrata la mini mappa. I possibili valori sono 'destra' o 'sinistra'", - "minimap.showSlider": "Controlla se il dispositivo di scorrimento della mini mappa viene nascosto automaticamente. I valori possibili sono 'always' e 'mouseover'", + "minimap.showSlider": "Controlla se lo slider della mini mappa viene nascosto automaticamente.", "minimap.renderCharacters": "Esegue il rendering dei caratteri effettivi di una riga (in contrapposizione ai blocchi colore)", "minimap.maxColumn": "Limita la larghezza della mini mappa in modo da eseguire il rendering al massimo di un certo numero di colonne", "find.seedSearchStringFromSelection": "Controlla se inizializzare la stringa di ricerca nel Widget Trova con il testo selezionato nell'editor", @@ -77,7 +75,6 @@ "occurrencesHighlight": "Controlla se l'editor deve evidenziare le occorrenze di simboli semantici", "overviewRulerLanes": "Controlla il numero di effetti che possono essere visualizzati nella stessa posizione nel righello delle annotazioni", "overviewRulerBorder": "Controlla se deve essere disegnato un bordo intorno al righello delle annotazioni.", - "cursorBlinking": "Controlla lo stile di animazione del cursore. I valori possibili sono: 'blink', 'smooth', 'phase', 'expand' e 'solid'", "mouseWheelZoom": "Ingrandisce il carattere dell'editor quando si usa la rotellina del mouse e si tiene premuto CTRL", "cursorStyle": "Controlla lo stile del cursore. I valori accettati sono 'block', 'block-outline', 'line', 'line-thin', 'underline' e 'underline-thin'", "cursorWidth": "Controlla la larghezza del cursore quando editor.cursorSyle è impostato a 'line'", @@ -87,7 +84,6 @@ "renderControlCharacters": "Controlla se l'editor deve eseguire il rendering dei caratteri di controllo", "renderIndentGuides": "Controlla se l'editor deve eseguire il rendering delle guide con rientro", "renderLineHighlight": "Consente di controllare in che modo l'editor deve eseguire il rendering dell'evidenziazione di riga corrente. Le opzioni possibili sono 'none', 'gutter', 'line' e 'all'.", - "codeLens": "Controlla se nell'editor sono visualizzate le finestre di CodeLens", "folding": "Controlla se per l'editor è abilitata la riduzione del codice", "showFoldingControls": "Controlla se i controlli di riduzione sul margine della barra di scorrimento sono automaticamente nascosti.", "matchBrackets": "Evidenzia le parentesi corrispondenti quando se ne seleziona una.", diff --git a/i18n/ita/src/vs/platform/environment/node/argv.i18n.json b/i18n/ita/src/vs/platform/environment/node/argv.i18n.json index 320bbcac4d1..0b775b31aee 100644 --- a/i18n/ita/src/vs/platform/environment/node/argv.i18n.json +++ b/i18n/ita/src/vs/platform/environment/node/argv.i18n.json @@ -22,7 +22,6 @@ "showVersions": "Mostra le versioni delle estensioni installate, quando si usa --list-extension.", "installExtension": "Installa un'estensione.", "uninstallExtension": "Disinstalla un'estensione.", - "experimentalApis": "Abilita funzionalità di API proposte per un'estensione specifica.", "verbose": "Visualizza l'output dettagliato (implica --wait).", "log": "Livello di logging da utilizzare. Il valore predefinito è 'info'. I valori consentiti sono 'critical, 'error', 'warn', 'info', 'debug', 'trace', 'off'.", "status": "Stampare le informazioni di utilizzo e diagnostica di processo.", diff --git a/i18n/ita/src/vs/platform/theme/common/colorRegistry.i18n.json b/i18n/ita/src/vs/platform/theme/common/colorRegistry.i18n.json index ff2aecc6fe1..13f14b0041a 100644 --- a/i18n/ita/src/vs/platform/theme/common/colorRegistry.i18n.json +++ b/i18n/ita/src/vs/platform/theme/common/colorRegistry.i18n.json @@ -29,7 +29,6 @@ "inputPlaceholderForeground": "Colore primo piano di casella di input per il testo segnaposto.", "inputValidationInfoBackground": "Colore di sfondo di convalida dell'input di tipo Informazione.", "inputValidationInfoBorder": "Colore bordo di convalida dell'input di tipo Informazione.", - "inputValidationWarningBackground": "Colore di sfondo di convalida dell'input di tipo Avviso.", "inputValidationWarningBorder": "Colore bordo di convalida dell'input di tipo Avviso.", "inputValidationErrorBackground": "Colore di sfondo di convalida dell'input di tipo Errore.", "inputValidationErrorBorder": "Colore bordo di convalida dell'input di tipo Errore.", @@ -71,10 +70,8 @@ "editorSelectionHighlightBorder": "Colore del bordo delle regioni con lo stesso contenuto della selezione.", "editorFindMatch": "Colore della corrispondenza di ricerca corrente.", "findMatchHighlight": "Colore degli altri risultati della ricerca. Il colore non deve essere opaco per evitare di nascondere le decorazioni sottostanti.", - "findRangeHighlight": "Colore dell'intervallo limite della ricerca. Il colore non deve essere opaco per evitare di nascondere le decorazioni sottostanti.", "editorFindMatchBorder": "Colore del bordo della corrispondenza della ricerca corrente.", "findMatchHighlightBorder": "Colore del bordo delle altre corrispondenze della ricerca.", - "findRangeHighlightBorder": "Colore del bordo dell'intervallo che delimita la ricerca. Il colore non deve essere opaco per non nascondere decorazioni sottostanti.", "hoverHighlight": "Evidenziazione sotto la parola per cui è visualizzata un'area sensibile al passaggio del mouse. Il colore non deve essere opaco per evitare di nascondere le decorazioni sottostanti.", "hoverBackground": "Colore di sfondo dell'area sensibile al passaggio del mouse dell'editor.", "hoverBorder": "Colore del bordo dell'area sensibile al passaggio del mouse dell'editor.", @@ -88,7 +85,6 @@ "mergeIncomingHeaderBackground": "Sfondo intestazione modifica in ingresso in conflitti di merge in linea. Il colore non deve essere opaco per evitare di nascondere le decorazioni sottostanti.", "mergeIncomingContentBackground": "Sfondo contenuto modifica in ingresso in conflitti di merge in linea. Il colore non deve essere opaco per evitare di nascondere le decorazioni sottostanti.", "mergeCommonHeaderBackground": "Sfondo dell'intestazione dell'antenato comune nei conflitti di merge in linea. Il colore non deve essere opaco per evitare di nascondere le decorazioni sottostanti.", - "mergeCommonContentBackground": "Sfondo del contenuto dell'antenato comune nei conflitti di merge in linea. Il colore non deve essere opaco per evitare di nascondere le decorazioni sottostanti.", "mergeBorder": "Colore bordo su intestazioni e sulla barra di divisione di conflitti di merge in linea.", "overviewRulerCurrentContentForeground": "Colore primo piano righello panoramica attuale per i conflitti di merge in linea.", "overviewRulerIncomingContentForeground": "Colore primo piano del righello panoramica modifiche in arrivo per i conflitti di merge in linea.", diff --git a/i18n/ita/src/vs/platform/url/electron-browser/inactiveExtensionUrlHandler.i18n.json b/i18n/ita/src/vs/platform/url/electron-browser/inactiveExtensionUrlHandler.i18n.json new file mode 100644 index 00000000000..35229bd6699 --- /dev/null +++ b/i18n/ita/src/vs/platform/url/electron-browser/inactiveExtensionUrlHandler.i18n.json @@ -0,0 +1,9 @@ +{ + "": [ + "--------------------------------------------------------------------------------------------", + "Copyright (c) Microsoft Corporation. All rights reserved.", + "Licensed under the MIT License. See License.txt in the project root for license information.", + "--------------------------------------------------------------------------------------------", + "Do not edit this file. It is machine generated." + ] +} \ No newline at end of file diff --git a/i18n/ita/src/vs/workbench/api/browser/viewsExtensionPoint.i18n.json b/i18n/ita/src/vs/workbench/api/browser/viewsExtensionPoint.i18n.json index bad682f1630..076c2427869 100644 --- a/i18n/ita/src/vs/workbench/api/browser/viewsExtensionPoint.i18n.json +++ b/i18n/ita/src/vs/workbench/api/browser/viewsExtensionPoint.i18n.json @@ -13,8 +13,6 @@ "vscode.extension.contributes.view.name": "Il nome della visualizzazione. Verrà mostrato", "vscode.extension.contributes.view.when": "Condizione che deve essere vera per mostrare questa visualizzazione", "vscode.extension.contributes.views": "Contribuisce visualizzazioni all'editor", - "views.explorer": "Visualizzazione di esplorazione", - "views.debug": "Visualizzazione Debug", "duplicateView1": "Non è possibile registrare più visualizzazioni con stesso ID `{0}` nel percorso `{1}`", "duplicateView2": "Nel percorso `{1}` è già registrata una visualizzazione con ID `{0}` " } \ No newline at end of file diff --git a/i18n/ita/src/vs/workbench/browser/parts/quickinput/quickInput.i18n.json b/i18n/ita/src/vs/workbench/browser/parts/quickinput/quickInput.i18n.json index bcdf56e4849..ba5d6919fd1 100644 --- a/i18n/ita/src/vs/workbench/browser/parts/quickinput/quickInput.i18n.json +++ b/i18n/ita/src/vs/workbench/browser/parts/quickinput/quickInput.i18n.json @@ -6,5 +6,7 @@ "--------------------------------------------------------------------------------------------", "Do not edit this file. It is machine generated." ], + "inputModeEntryDescription": "{0} (premere 'INVIO' per confermare oppure 'ESC' per annullare)", + "inputModeEntry": "Premere 'INVIO' per confermare l'input oppure 'ESC' per annullare", "ok": "OK" } \ No newline at end of file diff --git a/i18n/ita/src/vs/workbench/parts/files/electron-browser/fileActions.i18n.json b/i18n/ita/src/vs/workbench/parts/files/electron-browser/fileActions.i18n.json index 70fd8e87f6c..1e7be78fff2 100644 --- a/i18n/ita/src/vs/workbench/parts/files/electron-browser/fileActions.i18n.json +++ b/i18n/ita/src/vs/workbench/parts/files/electron-browser/fileActions.i18n.json @@ -24,20 +24,20 @@ "dirtyMessageFolderDelete": "Si sta per eliminare una cartella con modifiche non salvate in {0} file. Continuare?", "dirtyMessageFileDelete": "Si sta per eliminare un file con modifiche non salvate. Continuare?", "dirtyWarning": "Le modifiche apportate andranno perse se non vengono salvate.", - "confirmMoveTrashMessageMultiple": "Sei sicuro di voler eliminarei seguenti {0} file?", - "confirmMoveTrashMessageFolder": "Eliminare '{0}' e il relativo contenuto?", - "confirmMoveTrashMessageFile": "Eliminare '{0}'?", "undoBin": "È possibile ripristinare dal Cestino.", "undoTrash": "È possibile ripristinare dal Cestino.", "doNotAskAgain": "Non chiedermelo di nuovo", - "confirmDeleteMessageMultiple": "Sei sicuro di voler eliminare permanentemente i seguenti {0} file?", - "confirmDeleteMessageFolder": "Eliminare definitivamente '{0}' e il relativo contenuto?", - "confirmDeleteMessageFile": "Eliminare definitivamente '{0}'?", "irreversible": "Questa azione è irreversibile.", "binFailed": "Impossibile eliminare utilizzando il Cestino. Si desidera eliminare definitivamente invece?", "trashFailed": "Impossibile eliminare utilizzando il Cestino. Si desidera eliminare definitivamente invece?", "deletePermanentlyButtonLabel": "&& Eliminare in modo permanente", "retryButtonLabel": "&& Riprova", + "confirmMoveTrashMessageMultiple": "Sei sicuro di voler eliminarei seguenti {0} file?", + "confirmMoveTrashMessageFolder": "Eliminare '{0}' e il relativo contenuto?", + "confirmMoveTrashMessageFile": "Eliminare '{0}'?", + "confirmDeleteMessageMultiple": "Sei sicuro di voler eliminare permanentemente i seguenti {0} file?", + "confirmDeleteMessageFolder": "Eliminare definitivamente '{0}' e il relativo contenuto?", + "confirmDeleteMessageFile": "Eliminare definitivamente '{0}'?", "confirmOverwrite": "Nella cartella di destinazione esiste già un file o una cartella con lo stesso nome. Sovrascrivere?", "replaceButtonLabel": "&&Sostituisci", "fileIsAncestor": "Il file da incollare è un predecessore della cartella di destinazione", diff --git a/i18n/ita/src/vs/workbench/parts/localizations/electron-browser/localizations.contribution.i18n.json b/i18n/ita/src/vs/workbench/parts/localizations/electron-browser/localizations.contribution.i18n.json new file mode 100644 index 00000000000..f0565a5e515 --- /dev/null +++ b/i18n/ita/src/vs/workbench/parts/localizations/electron-browser/localizations.contribution.i18n.json @@ -0,0 +1,23 @@ +{ + "": [ + "--------------------------------------------------------------------------------------------", + "Copyright (c) Microsoft Corporation. All rights reserved.", + "Licensed under the MIT License. See License.txt in the project root for license information.", + "--------------------------------------------------------------------------------------------", + "Do not edit this file. It is machine generated." + ], + "updateLocale": "Cambiare la lingua dell'interfaccia utente di VS Code in {0} e riavviare?", + "yes": "Sì", + "no": "No", + "neverAgain": "Non visualizzare più questo messaggio", + "install": "Installa", + "JsonSchema.locale": "Linguaggio dell'interfaccia utente da usare.", + "vscode.extension.contributes.localizations": "Contribuisce traduzioni all'editor", + "vscode.extension.contributes.localizations.languageId": "Id della lingua in cui sono tradotte le stringhe visualizzate.", + "vscode.extension.contributes.localizations.languageName": "Nome della lingua in inglese.", + "vscode.extension.contributes.localizations.languageNameLocalized": "Nome della lingua nella lingua stessa.", + "vscode.extension.contributes.localizations.translations": "Lista delle traduzioni associate alla lingua.", + "vscode.extension.contributes.localizations.translations.id": "ID di VS Code o dell'estensione cui si riferisce questa traduzione. L'ID di VS Code è sempre 'vscode' e quello di un'estensione deve essere nel formato 'publisherId.extensionName'.", + "vscode.extension.contributes.localizations.translations.id.pattern": "L'ID deve essere 'vscode' o essere nel formato 'publisherId.extensionName' per tradurre rispettivamente VS Code o un'estensione.", + "vscode.extension.contributes.localizations.translations.path": "Percorso relativo di un file che contiene le traduzioni per la lingua." +} \ No newline at end of file diff --git a/i18n/ita/src/vs/workbench/parts/localizations/electron-browser/localizationsActions.i18n.json b/i18n/ita/src/vs/workbench/parts/localizations/electron-browser/localizationsActions.i18n.json new file mode 100644 index 00000000000..339538154c0 --- /dev/null +++ b/i18n/ita/src/vs/workbench/parts/localizations/electron-browser/localizationsActions.i18n.json @@ -0,0 +1,14 @@ +{ + "": [ + "--------------------------------------------------------------------------------------------", + "Copyright (c) Microsoft Corporation. All rights reserved.", + "Licensed under the MIT License. See License.txt in the project root for license information.", + "--------------------------------------------------------------------------------------------", + "Do not edit this file. It is machine generated." + ], + "configureLocale": "Configura lingua", + "displayLanguage": "Definisce la lingua visualizzata di VSCode.", + "doc": "Per un elenco delle lingue supportate, vedere {0}.", + "restart": "Se si modifica il valore, è necessario riavviare VSCode.", + "fail.createSettings": "Non è possibile creare '{0}' ({1})." +} \ No newline at end of file diff --git a/i18n/ita/src/vs/workbench/parts/url/electron-browser/url.contribution.i18n.json b/i18n/ita/src/vs/workbench/parts/url/electron-browser/url.contribution.i18n.json new file mode 100644 index 00000000000..2011975d153 --- /dev/null +++ b/i18n/ita/src/vs/workbench/parts/url/electron-browser/url.contribution.i18n.json @@ -0,0 +1,10 @@ +{ + "": [ + "--------------------------------------------------------------------------------------------", + "Copyright (c) Microsoft Corporation. All rights reserved.", + "Licensed under the MIT License. See License.txt in the project root for license information.", + "--------------------------------------------------------------------------------------------", + "Do not edit this file. It is machine generated." + ], + "developer": "Sviluppatore" +} \ No newline at end of file diff --git a/i18n/ita/src/vs/workbench/services/configurationResolver/node/variableResolver.i18n.json b/i18n/ita/src/vs/workbench/services/configurationResolver/node/variableResolver.i18n.json new file mode 100644 index 00000000000..35229bd6699 --- /dev/null +++ b/i18n/ita/src/vs/workbench/services/configurationResolver/node/variableResolver.i18n.json @@ -0,0 +1,9 @@ +{ + "": [ + "--------------------------------------------------------------------------------------------", + "Copyright (c) Microsoft Corporation. All rights reserved.", + "Licensed under the MIT License. See License.txt in the project root for license information.", + "--------------------------------------------------------------------------------------------", + "Do not edit this file. It is machine generated." + ] +} \ No newline at end of file diff --git a/i18n/jpn/extensions/npm/out/npmView.i18n.json b/i18n/jpn/extensions/npm/out/npmView.i18n.json new file mode 100644 index 00000000000..66b27154854 --- /dev/null +++ b/i18n/jpn/extensions/npm/out/npmView.i18n.json @@ -0,0 +1,11 @@ +{ + "": [ + "--------------------------------------------------------------------------------------------", + "Copyright (c) Microsoft Corporation. All rights reserved.", + "Licensed under the MIT License. See License.txt in the project root for license information.", + "--------------------------------------------------------------------------------------------", + "Do not edit this file. It is machine generated." + ], + "npm.noDebugOptions": "\"{0}\"のデバッグを起動できませんでした。スクリプトに node debug オプションを含める必要があります: \"--nolazy --inspect-brk=port\"、[詳細](https://code.visualstudio.com/docs/nodejs/nodejs-debugging#_launch-configuration-support-for-npm-and-other-tools)。", + "npm.scriptInvalid": "スクリプト '{0}' が見つかりませんでした。ビューを更新してください。" +} \ No newline at end of file diff --git a/i18n/jpn/extensions/npm/out/tasks.i18n.json b/i18n/jpn/extensions/npm/out/tasks.i18n.json new file mode 100644 index 00000000000..3995a9c7f9b --- /dev/null +++ b/i18n/jpn/extensions/npm/out/tasks.i18n.json @@ -0,0 +1,10 @@ +{ + "": [ + "--------------------------------------------------------------------------------------------", + "Copyright (c) Microsoft Corporation. All rights reserved.", + "Licensed under the MIT License. See License.txt in the project root for license information.", + "--------------------------------------------------------------------------------------------", + "Do not edit this file. It is machine generated." + ], + "npm.parseError": "npmタスク検出: ファイル {0} の解析に失敗しました" +} \ No newline at end of file diff --git a/i18n/jpn/extensions/npm/package.i18n.json b/i18n/jpn/extensions/npm/package.i18n.json index 30c35404674..30a98e70711 100644 --- a/i18n/jpn/extensions/npm/package.i18n.json +++ b/i18n/jpn/extensions/npm/package.i18n.json @@ -12,7 +12,15 @@ "config.npm.runSilent": "`--silent` オプションを使用して npm コマンドを実行する。", "config.npm.packageManager": "スクリプトを実行するために使用するパッケージ マネージャー。", "config.npm.exclude": "自動スクリプト検出から除外するフォルダーの glob パターンを構成します。", + "config.npm.enableScriptExplorer": "'package.json' ファイルがワークスペースに含まれている場合、npm スクリプトのエクスプ ローラー ビューを有効にします。", "npm.parseError": "npmタスク検出: ファイル {0} の解析に失敗しました", "taskdef.script": "カスタマイズする npm スクリプト。", - "taskdef.path": "スクリプトを提供する package.json ファイルのフォルダーへのパス。省略をすることができます。" + "taskdef.path": "スクリプトを提供する package.json ファイルのフォルダーへのパス。省略をすることができます。", + "view.name": "Npm スクリプト", + "command.refresh": "最新の情報に更新", + "command.run": "実行", + "command.debug": "デバッグ", + "command.openScript": "Open", + "npm.scriptInvalid": "スクリプト '{0}' が見つかりませんでした。ビューを更新してください。", + "npm.noDebugOptions": "'{0}' のデバッグを起動できませんでした。スクリプトに node debug オプションを含める必要があります: '--nolazy --inspect-brk=port'、[詳細](https://code.visualstudio.com/docs/nodejs/nodejs-debugging#_launch-configuration-support-for-npm-and-other-tools)`" } \ No newline at end of file diff --git a/i18n/jpn/src/vs/base/node/processes.i18n.json b/i18n/jpn/src/vs/base/node/processes.i18n.json index 35229bd6699..5df4b9ee390 100644 --- a/i18n/jpn/src/vs/base/node/processes.i18n.json +++ b/i18n/jpn/src/vs/base/node/processes.i18n.json @@ -5,5 +5,6 @@ "Licensed under the MIT License. See License.txt in the project root for license information.", "--------------------------------------------------------------------------------------------", "Do not edit this file. It is machine generated." - ] + ], + "TaskRunner.UNC": "UNC ドライブ上のシェル コマンドを実行できません。" } \ No newline at end of file diff --git a/i18n/jpn/src/vs/base/node/zip.i18n.json b/i18n/jpn/src/vs/base/node/zip.i18n.json index 4be9e884ca9..3c12457ddc1 100644 --- a/i18n/jpn/src/vs/base/node/zip.i18n.json +++ b/i18n/jpn/src/vs/base/node/zip.i18n.json @@ -6,5 +6,6 @@ "--------------------------------------------------------------------------------------------", "Do not edit this file. It is machine generated." ], + "incompleteExtract": "不完全。{0} / {1} 個のエントリが抽出されました", "notFound": "zip ファイルの中に {0} が見つかりません。" } \ No newline at end of file diff --git a/i18n/jpn/src/vs/code/electron-main/menus.i18n.json b/i18n/jpn/src/vs/code/electron-main/menus.i18n.json index 64e268008b7..67126552f23 100644 --- a/i18n/jpn/src/vs/code/electron-main/menus.i18n.json +++ b/i18n/jpn/src/vs/code/electron-main/menus.i18n.json @@ -146,6 +146,7 @@ "miConditionalBreakpoint": "条件付きブレークポイント(&&C)...", "miColumnBreakpoint": "列のブレークポイント(&&O)", "miFunctionBreakpoint": "関数のブレークポイント(&&F)...", + "miLogPoint": "ログ ポイント(&&L)...", "miNewBreakpoint": "新しいブレークポイント(&&N)", "miEnableAllBreakpoints": "すべてのブレークポイントを有効にする", "miDisableAllBreakpoints": "すべてのブレークポイントを無効にする(&&L)", diff --git a/i18n/jpn/src/vs/editor/browser/widget/diffReview.i18n.json b/i18n/jpn/src/vs/editor/browser/widget/diffReview.i18n.json index fde5f743633..a7429f0232b 100644 --- a/i18n/jpn/src/vs/editor/browser/widget/diffReview.i18n.json +++ b/i18n/jpn/src/vs/editor/browser/widget/diffReview.i18n.json @@ -7,6 +7,10 @@ "Do not edit this file. It is machine generated." ], "label.close": "閉じる", + "no_lines": "行なし", + "one_line": "1 行", + "more_lines": "{0} 行", + "header": "{1} の差異 {0}: 変更前 {2}, {3}, 変更後 {4}, {5}", "blankLine": "空白", "equalLine": "変更前の {0}、変更後の {1}: {2}", "insertLine": "+ 変更後の {0}: {1}", diff --git a/i18n/jpn/src/vs/editor/common/commonCodeEditor.i18n.json b/i18n/jpn/src/vs/editor/common/commonCodeEditor.i18n.json index 35229bd6699..f29a4df99e0 100644 --- a/i18n/jpn/src/vs/editor/common/commonCodeEditor.i18n.json +++ b/i18n/jpn/src/vs/editor/common/commonCodeEditor.i18n.json @@ -5,5 +5,6 @@ "Licensed under the MIT License. See License.txt in the project root for license information.", "--------------------------------------------------------------------------------------------", "Do not edit this file. It is machine generated." - ] + ], + "cursors.maximum": "カーソルの数は {0} 個に制限されています。" } \ No newline at end of file diff --git a/i18n/jpn/src/vs/editor/common/config/commonEditorConfig.i18n.json b/i18n/jpn/src/vs/editor/common/config/commonEditorConfig.i18n.json index f0fdce2980a..61fb3badc1a 100644 --- a/i18n/jpn/src/vs/editor/common/config/commonEditorConfig.i18n.json +++ b/i18n/jpn/src/vs/editor/common/config/commonEditorConfig.i18n.json @@ -16,7 +16,7 @@ "lineNumbers.on": "行番号は、絶対数として表示されます。", "lineNumbers.relative": "行番号は、カーソル位置までの行数として表示されます。", "lineNumbers.interval": "行番号は 10 行ごとに表示されます。", - "lineNumbers": "行番号の表示を制御します。使用可能な値は、'on'、'off'、'relative'、'interval' です。", + "lineNumbers": "行番号の表示を制御します。", "rulers": "等幅フォントの特定番号の後ろに垂直ルーラーを表示します。複数のルーラーには複数の値を使用します。配列が空の場合はルーラーを表示しません。", "wordSeparators": "単語に関連したナビゲーションまたは操作を実行するときに、単語の区切り文字として使用される文字", "tabSize": "1 つのタブに相当するスペースの数。`editor.detectIndentation` がオンの場合、この設定はファイル コンテンツに基づいて上書きされます。", @@ -28,8 +28,8 @@ "scrollBeyondLastLine": "エディターで最後の行を越えてスクロールするかどうかを制御します", "smoothScrolling": "アニメーションでエディターをスクロールするかどうかを制御します", "minimap.enabled": "ミニマップを表示するかどうかを制御します", - "minimap.side": "ミニマップの表示を制御します。使用可能な値は 'right'、および 'left' です。", - "minimap.showSlider": "ミニマップのスライダーを自動的に非表示にするかどうかを制御します。指定できる値は 'always' と 'mouseover' です", + "minimap.side": "ミニマップを表示する場所を制御します。", + "minimap.showSlider": "ミニマップのスライダーを自動的に非表示にするかどうかを制御します。", "minimap.renderCharacters": "行に (カラー ブロックではなく) 実際の文字を表示します", "minimap.maxColumn": "表示するミニマップの最大幅を特定の桁数に制限します", "find.seedSearchStringFromSelection": "エディターの選択から検索ウィジェット内の検索文字列を与えるかどうかを制御します", @@ -77,7 +77,7 @@ "occurrencesHighlight": "エディターでセマンティック シンボルの出現箇所を強調表示するかどうかを制御します", "overviewRulerLanes": "概要ルーラーの同じ位置に表示できる装飾の数を制御します", "overviewRulerBorder": "概要ルーラーの周囲に境界線が描画されるかどうかを制御します。", - "cursorBlinking": "カーソルのアニメーション スタイルを制御します。指定できる値は 'blink'、'smooth'、'phase'、'expand'、'solid' です", + "cursorBlinking": "カーソルのアニメーション方式を制御します。", "mouseWheelZoom": "Ctrl キーを押しながらマウス ホイールを使用してエディターのフォントをズームします", "cursorStyle": "カーソルのスタイルを制御します。指定できる値は 'block'、'block-outline'、'line'、'line-thin'、'underline'、'underline-thin' です", "cursorWidth": "editor.cursorStyle が 'line' に設定されている場合、カーソルの幅を制御する", @@ -87,7 +87,7 @@ "renderControlCharacters": "エディターで制御文字を表示する必要があるかどうかを制御します", "renderIndentGuides": "エディターでインデントのガイドを表示する必要があるかどうかを制御します", "renderLineHighlight": "エディターが現在の行をどのように強調表示するかを制御します。考えられる値は 'none'、'gutter'、'line'、'all' です。", - "codeLens": "エディターで CodeLens を表示するかどうかを制御する", + "codeLens": "エディターが CodeLens を表示するかどうかを制御します", "folding": "エディターでコードの折りたたみを有効にするかどうかを制御します", "foldingStrategyAuto": "利用可能であれば、言語に特有の折りたたみ方式を使用して、そうでない場合はインデント方式に戻ります。", "foldingStrategyIndentation": "常にインデントに基づく折りたたみ方式を使用します", @@ -106,6 +106,9 @@ "links": "エディターがリンクを検出してクリック可能な状態にするかどうかを制御します", "colorDecorators": "エディターでインライン カラー デコレーターと色の選択を表示する必要があるかどうかを制御します。", "codeActions": "コード アクション (lightbulb) を有効にする", + "codeActionsOnSave.organizeImports": "保存時にインポートの整理を実行しますか?", + "codeActionsOnSave": "保存時に実行されるコード アクションの種類。", + "codeActionsOnSaveTimeout": "保存時に実行されるコード アクションのタイムアウト値。", "selectionClipboard": "Linux の PRIMARY クリップボードをサポートするかどうかを制御します。", "sideBySide": "差分エディターが差分を横に並べて表示するか、行内に表示するかを制御します", "ignoreTrimWhitespace": "差分エディターが、先頭または末尾の空白の変更を差分として表示するかどうかを制御します。", diff --git a/i18n/jpn/src/vs/editor/common/view/editorColorRegistry.i18n.json b/i18n/jpn/src/vs/editor/common/view/editorColorRegistry.i18n.json index 3edd17c221f..8b4fd79645a 100644 --- a/i18n/jpn/src/vs/editor/common/view/editorColorRegistry.i18n.json +++ b/i18n/jpn/src/vs/editor/common/view/editorColorRegistry.i18n.json @@ -14,6 +14,7 @@ "editorCursorBackground": "選択された文字列の背景色です。選択された文字列の背景色をカスタマイズ出来ます。", "editorWhitespaces": "エディターのスペース文字の色。", "editorIndentGuides": "エディター インデント ガイドの色。", + "editorActiveIndentGuide": "アクティブなエディターのインデント ガイドの色。", "editorLineNumbers": "エディターの行番号の色。", "editorActiveLineNumber": "エディターのアクティブ行番号の色", "deprecatedEditorActiveLineNumber": "id は使用しないでください。代わりに 'EditorLineNumber.activeForeground' を使用してください。", diff --git a/i18n/jpn/src/vs/editor/contrib/codeAction/codeActionCommands.i18n.json b/i18n/jpn/src/vs/editor/contrib/codeAction/codeActionCommands.i18n.json index 8afb4eaf750..7e60a39f1ef 100644 --- a/i18n/jpn/src/vs/editor/contrib/codeAction/codeActionCommands.i18n.json +++ b/i18n/jpn/src/vs/editor/contrib/codeAction/codeActionCommands.i18n.json @@ -14,5 +14,6 @@ "editor.action.refactor.noneMessage": "利用可能なリファクタリングはありません", "source.label": "ソース アクション...", "editor.action.source.noneMessage": "利用可能なソース アクションはありません", - "organizeImports.label": "インポートを整理" + "organizeImports.label": "インポートを整理", + "editor.action.organize.noneMessage": "利用可能なインポートの整理アクションはありません" } \ No newline at end of file diff --git a/i18n/jpn/src/vs/editor/contrib/find/findController.i18n.json b/i18n/jpn/src/vs/editor/contrib/find/findController.i18n.json index 8e6b5036fc3..50b54839cc5 100644 --- a/i18n/jpn/src/vs/editor/contrib/find/findController.i18n.json +++ b/i18n/jpn/src/vs/editor/contrib/find/findController.i18n.json @@ -7,6 +7,7 @@ "Do not edit this file. It is machine generated." ], "startFindAction": "検索", + "startFindWithSelectionAction": "選択範囲を検索", "findNextMatchAction": "次を検索", "findPreviousMatchAction": "前を検索", "nextSelectionMatchFindAction": "次の選択項目を検索", diff --git a/i18n/jpn/src/vs/editor/contrib/format/formatActions.i18n.json b/i18n/jpn/src/vs/editor/contrib/format/formatActions.i18n.json index a95eddbcb87..eed5820f47f 100644 --- a/i18n/jpn/src/vs/editor/contrib/format/formatActions.i18n.json +++ b/i18n/jpn/src/vs/editor/contrib/format/formatActions.i18n.json @@ -13,5 +13,6 @@ "no.provider": "インストールされた '{0}'ファイル用のフォーマッターが存在しません。", "formatDocument.label": "ドキュメントのフォーマット", "no.documentprovider": "インストールされた '{0}'ファイル用のドキュメント フォーマッターが存在しません。", - "formatSelection.label": "選択範囲のフォーマット" + "formatSelection.label": "選択範囲のフォーマット", + "no.selectionprovider": "インストールされた '{0}' ファイル用の選択範囲フォーマッターが存在しません。" } \ No newline at end of file diff --git a/i18n/jpn/src/vs/editor/contrib/message/messageController.i18n.json b/i18n/jpn/src/vs/editor/contrib/message/messageController.i18n.json index 35229bd6699..b11769a8241 100644 --- a/i18n/jpn/src/vs/editor/contrib/message/messageController.i18n.json +++ b/i18n/jpn/src/vs/editor/contrib/message/messageController.i18n.json @@ -5,5 +5,6 @@ "Licensed under the MIT License. See License.txt in the project root for license information.", "--------------------------------------------------------------------------------------------", "Do not edit this file. It is machine generated." - ] + ], + "editor.readonly": "読み取り専用のエディターは編集できません" } \ No newline at end of file diff --git a/i18n/jpn/src/vs/editor/contrib/referenceSearch/referencesWidget.i18n.json b/i18n/jpn/src/vs/editor/contrib/referenceSearch/referencesWidget.i18n.json index 4859d3c0b63..e13c2a22eca 100644 --- a/i18n/jpn/src/vs/editor/contrib/referenceSearch/referencesWidget.i18n.json +++ b/i18n/jpn/src/vs/editor/contrib/referenceSearch/referencesWidget.i18n.json @@ -25,5 +25,6 @@ "peekViewEditorBackground": "ピーク ビュー エディターの背景色。", "peekViewEditorGutterBackground": "ピーク ビュー エディターの余白の背景色。", "peekViewResultsMatchHighlight": "ピーク ビュー結果リストの一致した強調表示色。", - "peekViewEditorMatchHighlight": "ピーク ビュー エディターの一致した強調表示色。" + "peekViewEditorMatchHighlight": "ピーク ビュー エディターの一致した強調表示色。", + "peekViewEditorMatchHighlightBorder": "ピーク ビュー エディターの一致した強調境界色。" } \ No newline at end of file diff --git a/i18n/jpn/src/vs/platform/environment/node/argv.i18n.json b/i18n/jpn/src/vs/platform/environment/node/argv.i18n.json index 80c47f9bca0..dd4553b6a25 100644 --- a/i18n/jpn/src/vs/platform/environment/node/argv.i18n.json +++ b/i18n/jpn/src/vs/platform/environment/node/argv.i18n.json @@ -29,6 +29,8 @@ "performance": "'Developer: Startup Performance' コマンドを有効にして開始します。", "prof-startup": "起動中に CPU プロファイラーを実行する", "disableExtensions": "インストールされたすべての拡張機能を無効にします。", + "inspect-extensions": "拡張機能のデバッグとプロファイリングを許可します。connection URI を開発者ツールで確認します。", + "inspect-brk-extensions": "起動後に一時停止されている拡張ホストとの拡張機能のデバッグとプロファイリングを許可します。connection URI を開発者ツールで確認ます。", "disableGPU": "GPU ハードウェア アクセラレータを無効にします。", "uploadLogs": "現在のセッションから安全なエンドポイントにログをアップロードします。", "maxMemory": "ウィンドウの最大メモリ サイズ (バイト単位)。", diff --git a/i18n/jpn/src/vs/platform/extensionManagement/node/extensionManagementService.i18n.json b/i18n/jpn/src/vs/platform/extensionManagement/node/extensionManagementService.i18n.json index 9b0afc0667c..91e8cedc8a4 100644 --- a/i18n/jpn/src/vs/platform/extensionManagement/node/extensionManagementService.i18n.json +++ b/i18n/jpn/src/vs/platform/extensionManagement/node/extensionManagementService.i18n.json @@ -7,6 +7,7 @@ "Do not edit this file. It is machine generated." ], "invalidManifest": "正しくない拡張機能: package.json は JSON ファイルではありません。", + "incompatible": "Code '{1}' と互換性のない拡張機能 '{0}' をインストールできません。", "restartCode": "{0} を再インストールする前に、Code を再起動してください。", "installingOutdatedExtension": "この拡張機能の新しいバージョンが既にインストールされています。古いバージョンでこれを上書きしますか?", "override": "上書き", @@ -20,6 +21,7 @@ "notFoundCompatibleDependency": "VS Code の現在のバージョン '{1}' と互換性を持つ、依存関係がある拡張機能 '{0}' が見つからないため、インストールできません。", "quitCode": "拡張機能をインストールできません。再インストールの前に VS Code の終了と起動を実施してください。", "exitCode": "拡張機能をインストールできません。再インストールの前に VS Code の終了と起動を実施してください。", + "renameError": "{0} から {1} に名前変更中に不明なエラーが発生しました", "uninstallDependeciesConfirmation": "'{0}' のみをアンインストールしますか、または依存関係もアンインストールしますか?", "uninstallOnly": "拡張機能のみ", "uninstallAll": "すべてアンインストール", diff --git a/i18n/jpn/src/vs/platform/url/electron-browser/inactiveExtensionUrlHandler.i18n.json b/i18n/jpn/src/vs/platform/url/electron-browser/inactiveExtensionUrlHandler.i18n.json new file mode 100644 index 00000000000..710b493051f --- /dev/null +++ b/i18n/jpn/src/vs/platform/url/electron-browser/inactiveExtensionUrlHandler.i18n.json @@ -0,0 +1,10 @@ +{ + "": [ + "--------------------------------------------------------------------------------------------", + "Copyright (c) Microsoft Corporation. All rights reserved.", + "Licensed under the MIT License. See License.txt in the project root for license information.", + "--------------------------------------------------------------------------------------------", + "Do not edit this file. It is machine generated." + ], + "confirmUrl": "{0} 拡張機能に次の URL を開かせますか?" +} \ No newline at end of file diff --git a/i18n/jpn/src/vs/workbench/api/browser/viewsContainersExtensionPoint.i18n.json b/i18n/jpn/src/vs/workbench/api/browser/viewsContainersExtensionPoint.i18n.json index badee921d01..258ab3ea248 100644 --- a/i18n/jpn/src/vs/workbench/api/browser/viewsContainersExtensionPoint.i18n.json +++ b/i18n/jpn/src/vs/workbench/api/browser/viewsContainersExtensionPoint.i18n.json @@ -6,6 +6,13 @@ "--------------------------------------------------------------------------------------------", "Do not edit this file. It is machine generated." ], + "vscode.extension.contributes.views.containers.id": "'views' コントリビューション ポイントを使用して提供できるコンテナを識別するための一意の ID", + "vscode.extension.contributes.views.containers.title": "コンテナーの表示に使用する、人が判別できる文字列", + "vscode.extension.contributes.views.containers.icon": "コンテナー アイコンへのパス", + "vscode.extension.contributes.viewsContainer": "ビュー コンテナをエディターに提供します", + "views.container.activitybar": "アクティビティ バーにビュー コンテナを提供します", + "proposed": "'viewsContainer' コントリビューションは dev または次のコマンド ライン スイッチを使用しているときのみ使用できます: --enable-proposed-api {1}", + "requirearray": "ビュー コンテナは配列である必要があります", "requirestring": " `{0}` プロパティは必須で、`string` 型でなければなりません", "showViewlet": "{0} を表示", "view": "表示" diff --git a/i18n/jpn/src/vs/workbench/api/browser/viewsExtensionPoint.i18n.json b/i18n/jpn/src/vs/workbench/api/browser/viewsExtensionPoint.i18n.json index d69af0170e1..eedb0cdb4ef 100644 --- a/i18n/jpn/src/vs/workbench/api/browser/viewsExtensionPoint.i18n.json +++ b/i18n/jpn/src/vs/workbench/api/browser/viewsExtensionPoint.i18n.json @@ -13,8 +13,10 @@ "vscode.extension.contributes.view.name": "ビューの判読できる名前。表示されます", "vscode.extension.contributes.view.when": "このビューを表示するために満たす必要がある条件", "vscode.extension.contributes.views": "ビューをエディターに提供します", - "views.explorer": "エクスプローラー ビュー", - "views.debug": "デバッグ ビュー", + "views.explorer": "アクション バーのエクスプローラー コンテナにビューを提供します", + "views.debug": "アクション バーのデバッグ コンテナにビューを提供します", + "views.scm": "アクション バーのSCM コンテナにビューを提供します", + "views.contributed": "コントリビューション ビュー コンテナにビューを提供します", "duplicateView1": "location `{1}` で同じ id `{0}` を使用する複数のビューを登録できません", "duplicateView2": "location `{1}` で id `{0}` のビューが既に登録されています" } \ No newline at end of file diff --git a/i18n/jpn/src/vs/workbench/api/electron-browser/mainThreadSaveParticipant.i18n.json b/i18n/jpn/src/vs/workbench/api/electron-browser/mainThreadSaveParticipant.i18n.json index 68ec7e9afd8..2cc93b19315 100644 --- a/i18n/jpn/src/vs/workbench/api/electron-browser/mainThreadSaveParticipant.i18n.json +++ b/i18n/jpn/src/vs/workbench/api/electron-browser/mainThreadSaveParticipant.i18n.json @@ -7,6 +7,7 @@ "Do not edit this file. It is machine generated." ], "timeout.formatOnSave": "保存時のフォーマットは {0}ms 後に中止されました", + "codeActionsOnSave.didTimeout": "codeActionsOnSave は {0} ms 後に中止されました", "timeout.onWillSave": "onWillSaveTextDocument-event は 1750ms 後に中止されました", "saveParticipants": "Save Participants が実行中です..." } \ No newline at end of file diff --git a/i18n/jpn/src/vs/workbench/browser/parts/quickinput/quickInput.i18n.json b/i18n/jpn/src/vs/workbench/browser/parts/quickinput/quickInput.i18n.json index 82b9f0d836c..39a84641d99 100644 --- a/i18n/jpn/src/vs/workbench/browser/parts/quickinput/quickInput.i18n.json +++ b/i18n/jpn/src/vs/workbench/browser/parts/quickinput/quickInput.i18n.json @@ -6,6 +6,8 @@ "--------------------------------------------------------------------------------------------", "Do not edit this file. It is machine generated." ], + "inputModeEntryDescription": "{0} ('Enter' を押して確認するか 'Escape' を押して取り消します)", + "inputModeEntry": "'Enter' を押して入力を確認するか 'Escape' を押して取り消します", "quickInput.countSelected": "{0} 個選択済み", "ok": "OK" } \ No newline at end of file diff --git a/i18n/jpn/src/vs/workbench/parts/debug/browser/breakpointsView.i18n.json b/i18n/jpn/src/vs/workbench/parts/debug/browser/breakpointsView.i18n.json index 0338237fdd3..08d132073bb 100644 --- a/i18n/jpn/src/vs/workbench/parts/debug/browser/breakpointsView.i18n.json +++ b/i18n/jpn/src/vs/workbench/parts/debug/browser/breakpointsView.i18n.json @@ -6,7 +6,10 @@ "--------------------------------------------------------------------------------------------", "Do not edit this file. It is machine generated." ], + "logPoint": "ログ ポイント", "breakpoint": "ブレークポイント", + "editBreakpoint": "{0} を編集", + "removeBreakpoint": "{0} を削除", "functionBreakpointsNotSupported": "このデバッグの種類では関数ブレークポイントはサポートされていません", "functionBreakpointPlaceholder": "中断対象の関数", "functionBreakPointInputAriaLabel": "関数ブレークポイントを入力します", diff --git a/i18n/jpn/src/vs/workbench/parts/debug/browser/debugActions.i18n.json b/i18n/jpn/src/vs/workbench/parts/debug/browser/debugActions.i18n.json index f3b08e50093..50201bfeaec 100644 --- a/i18n/jpn/src/vs/workbench/parts/debug/browser/debugActions.i18n.json +++ b/i18n/jpn/src/vs/workbench/parts/debug/browser/debugActions.i18n.json @@ -21,6 +21,7 @@ "disconnectDebug": "切断", "continueDebug": "続行", "pauseDebug": "一時停止", + "terminateThread": "スレッドを終了", "restartFrame": "フレームの再起動", "removeBreakpoint": "ブレークポイントの削除", "removeAllBreakpoints": "すべてのブレークポイントを削除する", diff --git a/i18n/jpn/src/vs/workbench/parts/debug/electron-browser/debug.contribution.i18n.json b/i18n/jpn/src/vs/workbench/parts/debug/electron-browser/debug.contribution.i18n.json index 87ac8b86e6a..54068276642 100644 --- a/i18n/jpn/src/vs/workbench/parts/debug/electron-browser/debug.contribution.i18n.json +++ b/i18n/jpn/src/vs/workbench/parts/debug/electron-browser/debug.contribution.i18n.json @@ -27,6 +27,5 @@ "onFirstSessionStart": "初めてデバッグが開始されたときのみステータス バーにデバッグを表示する", "showInStatusBar": "デバッグのステータス バーが表示されるタイミングを制御", "openDebug": "デバッグ ビューを開くか、デバッグ セッションを開始するかを制御します。", - "launch": "グローバル デバッグ起動構成。ワークスペース間で共有される 'launch.json' の代わりとして使用する必要があります", - "extensionHostDebugAdapter": "拡張機能ホストのデバッグ アダプターを実行します" + "launch": "グローバル デバッグ起動構成。ワークスペース間で共有される 'launch.json' の代わりとして使用する必要があります" } \ No newline at end of file diff --git a/i18n/jpn/src/vs/workbench/parts/debug/electron-browser/debugEditorContribution.i18n.json b/i18n/jpn/src/vs/workbench/parts/debug/electron-browser/debugEditorContribution.i18n.json index 8856e9d9942..f370c5a7367 100644 --- a/i18n/jpn/src/vs/workbench/parts/debug/electron-browser/debugEditorContribution.i18n.json +++ b/i18n/jpn/src/vs/workbench/parts/debug/electron-browser/debugEditorContribution.i18n.json @@ -6,7 +6,12 @@ "--------------------------------------------------------------------------------------------", "Do not edit this file. It is machine generated." ], + "logPoint": "ログ ポイント", "breakpoint": "ブレークポイント", + "removeBreakpoint": "{0} を削除", + "editBreakpoint": "{0} を編集...", + "disableBreakpoint": "{0} を無効にする", + "enableBreakpoint": "{0} を有効にする", "removeBreakpoints": "ブレークポイントの削除", "removeBreakpointOnColumn": "列 {0} のブレークポイントの削除", "removeLineBreakpoint": "行のブレークポイントの削除", @@ -21,6 +26,10 @@ "addBreakpoint": "ブレークポイントの追加", "addConditionalBreakpoint": "条件付きブレークポイントの追加...", "addLogPoint": "ログ ポイントを追加...", + "message": "メッセージ", + "condition": "条件", + "removeLogPoint": "{0} を削除", + "disableLogPoint": "{0} を無効にする", "cancel": "キャンセル", "addConfiguration": "構成の追加..." } \ No newline at end of file diff --git a/i18n/jpn/src/vs/workbench/parts/files/electron-browser/fileActions.i18n.json b/i18n/jpn/src/vs/workbench/parts/files/electron-browser/fileActions.i18n.json index 9887d214dcb..952d29529a3 100644 --- a/i18n/jpn/src/vs/workbench/parts/files/electron-browser/fileActions.i18n.json +++ b/i18n/jpn/src/vs/workbench/parts/files/electron-browser/fileActions.i18n.json @@ -13,6 +13,7 @@ "copyFile": "コピー", "pasteFile": "貼り付け", "retry": "再試行", + "renameWhenSourcePathIsParentOfTargetError": "既存のフォルダーに子を追加するには 'New Folder' や 'New File' コマンドを使用してください", "newUntitledFile": "無題の新規ファイル", "createNewFile": "新しいファイル", "createNewFolder": "新しいフォルダー", @@ -24,20 +25,20 @@ "dirtyMessageFolderDelete": "保存されていない変更があるファイルを {0} 個含むフォルダーを削除します。続行しますか?", "dirtyMessageFileDelete": "保存されていない変更があるファイルを削除します。続行しますか?", "dirtyWarning": "保存しないと変更内容が失われます。", - "confirmMoveTrashMessageMultiple": "次の {0} 個のファイルを削除してもよろしいですか?", - "confirmMoveTrashMessageFolder": "'{0}' とその内容を削除しますか?", - "confirmMoveTrashMessageFile": "'{0}' を削除しますか?", "undoBin": "ごみ箱から復元できます。", "undoTrash": "ごみ箱から復元できます。", "doNotAskAgain": "再度表示しない", - "confirmDeleteMessageMultiple": "次の {0} 個のファイルを完全に削除してもよろしいですか?", - "confirmDeleteMessageFolder": "'{0}' とその内容を完全に削除してもよろしいですか?", - "confirmDeleteMessageFile": "'{0}' を完全に削除してもよろしいですか?", "irreversible": "このアクションは元に戻すことができません。", "binFailed": "ごみ箱を使用した削除に失敗しました。代わりに完全に削除しますか?", "trashFailed": "ごみ箱を使用した削除に失敗しました。代わりに完全に削除しますか?", "deletePermanentlyButtonLabel": "完全に削除(&&D)", "retryButtonLabel": "再試行(&&R)", + "confirmMoveTrashMessageMultiple": "次の {0} 個のファイルを削除してもよろしいですか?", + "confirmMoveTrashMessageFolder": "'{0}' とその内容を削除しますか?", + "confirmMoveTrashMessageFile": "'{0}' を削除しますか?", + "confirmDeleteMessageMultiple": "次の {0} 個のファイルを完全に削除してもよろしいですか?", + "confirmDeleteMessageFolder": "'{0}' とその内容を完全に削除してもよろしいですか?", + "confirmDeleteMessageFile": "'{0}' を完全に削除してもよろしいですか?", "addFiles": "ファイルを追加", "confirmOverwrite": "保存先のフォルダーに同じ名前のファイルまたはフォルダーが既に存在します。置き換えてもよろしいですか?", "replaceButtonLabel": "置換(&&R)", @@ -58,7 +59,9 @@ "openFileToShowInNewWindow": "まずファイルを開いてから新しいウィンドウで開きます", "copyPath": "パスのコピー", "emptyFileNameError": "ファイルまたはフォルダーの名前を指定する必要があります。", + "fileNameStartsWithSlashError": "ファイルまたはフォルダーの名前はスラッシュで始めることができません。", "fileNameExistsError": "**{0}** というファイルまたはフォルダーはこの場所に既に存在します。別の名前を指定してください。", + "fileUsedAsFolderError": "**{0}** はファイルのため階層構造を持つことはできません。", "invalidFileNameError": "名前 **{0}** がファイル名またはフォルダー名として無効です。別の名前を指定してください。", "filePathTooLongError": "名前 **{0}** のパスが長すぎます。名前を短くしてください。", "compareWithClipboard": "クリップボードとアクティブ ファイルを比較", diff --git a/i18n/jpn/src/vs/workbench/parts/files/electron-browser/views/explorerViewer.i18n.json b/i18n/jpn/src/vs/workbench/parts/files/electron-browser/views/explorerViewer.i18n.json index 49eca2ec9c5..4d56ec46874 100644 --- a/i18n/jpn/src/vs/workbench/parts/files/electron-browser/views/explorerViewer.i18n.json +++ b/i18n/jpn/src/vs/workbench/parts/files/electron-browser/views/explorerViewer.i18n.json @@ -7,6 +7,9 @@ "Do not edit this file. It is machine generated." ], "fileInputAriaLabel": "ファイル名を入力します。Enter キーを押して確認するか、Esc キーを押して取り消します。", + "createFileFromExplorerInfoMessage": "**{1}** にファイル **{0}** を作成", + "renameFileFromExplorerInfoMessage": "**{0}** に移動と名前変更", + "createFolderFromExplorerInfoMessage": "**{1}** にフォルダー **{0}** を作成", "filesExplorerViewerAriaLabel": "{0}、ファイル エクスプローラー", "dropFolders": "ワークスペースにフォルダーを追加しますか?", "dropFolder": "ワークスペースにフォルダーを追加しますか?", diff --git a/i18n/jpn/src/vs/workbench/parts/localizations/electron-browser/localizations.contribution.i18n.json b/i18n/jpn/src/vs/workbench/parts/localizations/electron-browser/localizations.contribution.i18n.json new file mode 100644 index 00000000000..1b654ebed35 --- /dev/null +++ b/i18n/jpn/src/vs/workbench/parts/localizations/electron-browser/localizations.contribution.i18n.json @@ -0,0 +1,24 @@ +{ + "": [ + "--------------------------------------------------------------------------------------------", + "Copyright (c) Microsoft Corporation. All rights reserved.", + "Licensed under the MIT License. See License.txt in the project root for license information.", + "--------------------------------------------------------------------------------------------", + "Do not edit this file. It is machine generated." + ], + "updateLocale": "VS Code の UI 言語を {0} にして再起動しますか?", + "yes": "はい", + "no": "いいえ", + "neverAgain": "今後は表示しない", + "install": "インストール", + "more information": "詳細情報...", + "JsonSchema.locale": "使用する UI 言語。", + "vscode.extension.contributes.localizations": "ローカリゼーションをエディターに提供します", + "vscode.extension.contributes.localizations.languageId": "表示文字列が翻訳される言語の id。", + "vscode.extension.contributes.localizations.languageName": "英語での言語の名前。", + "vscode.extension.contributes.localizations.languageNameLocalized": "提供された言語での言語の名前。", + "vscode.extension.contributes.localizations.translations": "言語に関連付けられている翻訳のリスト。", + "vscode.extension.contributes.localizations.translations.id": "この翻訳が提供される VS Code または拡張機能の ID。VS Code は常に `vscode` で、拡張機能の形式は `publisherId.extensionName` になります。", + "vscode.extension.contributes.localizations.translations.id.pattern": "VS Code または拡張機能を変換するための ID はそれぞれ、`vscode` か、`publisherId.extensionName` の形式になります。", + "vscode.extension.contributes.localizations.translations.path": "言語の翻訳を含むファイルへの相対パス。" +} \ No newline at end of file diff --git a/i18n/jpn/src/vs/workbench/parts/localizations/electron-browser/localizationsActions.i18n.json b/i18n/jpn/src/vs/workbench/parts/localizations/electron-browser/localizationsActions.i18n.json new file mode 100644 index 00000000000..3b68fb6c14d --- /dev/null +++ b/i18n/jpn/src/vs/workbench/parts/localizations/electron-browser/localizationsActions.i18n.json @@ -0,0 +1,14 @@ +{ + "": [ + "--------------------------------------------------------------------------------------------", + "Copyright (c) Microsoft Corporation. All rights reserved.", + "Licensed under the MIT License. See License.txt in the project root for license information.", + "--------------------------------------------------------------------------------------------", + "Do not edit this file. It is machine generated." + ], + "configureLocale": "言語を構成する", + "displayLanguage": "VSCode の表示言語を定義します。", + "doc": "サポートされている言語の一覧については、{0} をご覧ください。", + "restart": "値を変更するには VS Code の再起動が必要です。", + "fail.createSettings": "'{0}' ({1}) を作成できません。" +} \ No newline at end of file diff --git a/i18n/jpn/src/vs/workbench/parts/terminal/electron-browser/terminalInstance.i18n.json b/i18n/jpn/src/vs/workbench/parts/terminal/electron-browser/terminalInstance.i18n.json index 5b244dd7b26..8562eec22a3 100644 --- a/i18n/jpn/src/vs/workbench/parts/terminal/electron-browser/terminalInstance.i18n.json +++ b/i18n/jpn/src/vs/workbench/parts/terminal/electron-browser/terminalInstance.i18n.json @@ -12,5 +12,6 @@ "terminal.integrated.copySelection.noSelection": "ターミナルにコピー対象の選択範囲がありません", "terminal.integrated.exitedWithCode": "ターミナルの処理が終了しました (終了コード: {0})", "terminal.integrated.waitOnExit": "任意のキーを押して端末を終了します", - "terminal.integrated.launchFailed": "ターミナルのプロセス コマンド '{0}{1}' を起動できませんでした (終了コード: {2})" + "terminal.integrated.launchFailed": "ターミナルのプロセス コマンド '{0}{1}' を起動できませんでした (終了コード: {2})", + "terminal.integrated.launchFailedExtHost": "ターミナル プロセスが起動に失敗しました (終了コード: {0})" } \ No newline at end of file diff --git a/i18n/jpn/src/vs/workbench/parts/url/electron-browser/url.contribution.i18n.json b/i18n/jpn/src/vs/workbench/parts/url/electron-browser/url.contribution.i18n.json new file mode 100644 index 00000000000..d4807e12215 --- /dev/null +++ b/i18n/jpn/src/vs/workbench/parts/url/electron-browser/url.contribution.i18n.json @@ -0,0 +1,11 @@ +{ + "": [ + "--------------------------------------------------------------------------------------------", + "Copyright (c) Microsoft Corporation. All rights reserved.", + "Licensed under the MIT License. See License.txt in the project root for license information.", + "--------------------------------------------------------------------------------------------", + "Do not edit this file. It is machine generated." + ], + "openUrl": "URL を開く", + "developer": "開発者" +} \ No newline at end of file diff --git a/i18n/jpn/src/vs/workbench/parts/welcome/page/electron-browser/vs_code_welcome_page.i18n.json b/i18n/jpn/src/vs/workbench/parts/welcome/page/electron-browser/vs_code_welcome_page.i18n.json index f7166ecfc88..946723a6712 100644 --- a/i18n/jpn/src/vs/workbench/parts/welcome/page/electron-browser/vs_code_welcome_page.i18n.json +++ b/i18n/jpn/src/vs/workbench/parts/welcome/page/electron-browser/vs_code_welcome_page.i18n.json @@ -27,6 +27,8 @@ "welcomePage.installExtensionPacks": "ツールと言語", "welcomePage.installExtensionPacksDescription": "{0} と {1} のサポートをインストールする ", "welcomePage.moreExtensions": "その他", + "welcomePage.installKeymapDescription": "設定とキーバインド", + "welcomePage.installKeymapExtension": "{0} と {1} の設定とキーボード ショートカットをインストールします", "welcomePage.others": "その他", "welcomePage.colorTheme": "配色テーマ", "welcomePage.colorThemeDescription": "エディターとコードの外観を自由に設定します", diff --git a/i18n/jpn/src/vs/workbench/services/configurationResolver/node/variableResolver.i18n.json b/i18n/jpn/src/vs/workbench/services/configurationResolver/node/variableResolver.i18n.json new file mode 100644 index 00000000000..bd28d12355f --- /dev/null +++ b/i18n/jpn/src/vs/workbench/services/configurationResolver/node/variableResolver.i18n.json @@ -0,0 +1,20 @@ +{ + "": [ + "--------------------------------------------------------------------------------------------", + "Copyright (c) Microsoft Corporation. All rights reserved.", + "Licensed under the MIT License. See License.txt in the project root for license information.", + "--------------------------------------------------------------------------------------------", + "Do not edit this file. It is machine generated." + ], + "missingEnvVarName": "環境変数名が指定されていないため、'{0}' を解決できません。", + "configNotFound": "設定 '{1}' が見つからないため、'{0}' を解決できません。", + "configNoString": "'{1}' は構造化された値であるため、'{0}' を解決できません。", + "missingConfigName": "設定名が指定されていないため、'{0}' を解決できません。", + "noValueForCommand": "コマンドに値がないため '{0}' を解決できません。", + "canNotFindFolder": "'{0}' を解決できません。フォルダー '{1}' がありません。", + "canNotResolveWorkspaceFolderMultiRoot": "'{0}' はマルチ フォルダー ワークスペースで解決できません。 ':' とフォルダー名を使用して、この変数のスコープを指定してください。", + "canNotResolveWorkspaceFolder": "'{0}' を解決できません。フォルダーを開いてください。", + "canNotResolveFile": "'{0}' を解決できません。エディターを開いてください。", + "canNotResolveLineNumber": "'{0}' を解決できません。アクティブなエディターに選択済みの行があることを確認してください。", + "canNotResolveSelectedText": "'{0}' を解決できません。アクティブなエディターに選択済みのテキストがあることを確認してください。" +} \ No newline at end of file diff --git a/i18n/jpn/src/vs/workbench/services/files/electron-browser/remoteFileService.i18n.json b/i18n/jpn/src/vs/workbench/services/files/electron-browser/remoteFileService.i18n.json index 660883f87f6..aa930ebf26b 100644 --- a/i18n/jpn/src/vs/workbench/services/files/electron-browser/remoteFileService.i18n.json +++ b/i18n/jpn/src/vs/workbench/services/files/electron-browser/remoteFileService.i18n.json @@ -9,5 +9,6 @@ "fileNotFoundError": "ファイルが見つかりません ({0})", "fileIsDirectoryError": "ファイルはディレクトリです", "fileNotModifiedError": "ファイルは次の時点以後に変更されていません:", - "fileBinaryError": "ファイルはバイナリのようなので、テキストとして開くことができません" + "fileBinaryError": "ファイルはバイナリのようなので、テキストとして開くことができません", + "err.create": "ファイル {0} を作成できませんでした" } \ No newline at end of file diff --git a/i18n/kor/extensions/npm/out/npmView.i18n.json b/i18n/kor/extensions/npm/out/npmView.i18n.json new file mode 100644 index 00000000000..35229bd6699 --- /dev/null +++ b/i18n/kor/extensions/npm/out/npmView.i18n.json @@ -0,0 +1,9 @@ +{ + "": [ + "--------------------------------------------------------------------------------------------", + "Copyright (c) Microsoft Corporation. All rights reserved.", + "Licensed under the MIT License. See License.txt in the project root for license information.", + "--------------------------------------------------------------------------------------------", + "Do not edit this file. It is machine generated." + ] +} \ No newline at end of file diff --git a/i18n/kor/extensions/npm/out/tasks.i18n.json b/i18n/kor/extensions/npm/out/tasks.i18n.json new file mode 100644 index 00000000000..c60d6694a03 --- /dev/null +++ b/i18n/kor/extensions/npm/out/tasks.i18n.json @@ -0,0 +1,10 @@ +{ + "": [ + "--------------------------------------------------------------------------------------------", + "Copyright (c) Microsoft Corporation. All rights reserved.", + "Licensed under the MIT License. See License.txt in the project root for license information.", + "--------------------------------------------------------------------------------------------", + "Do not edit this file. It is machine generated." + ], + "npm.parseError": "Npm 작업 검색: {0} 파일을 구문 분석하지 못했습니다. " +} \ No newline at end of file diff --git a/i18n/kor/extensions/npm/package.i18n.json b/i18n/kor/extensions/npm/package.i18n.json index 316421231ad..9d5b756e7da 100644 --- a/i18n/kor/extensions/npm/package.i18n.json +++ b/i18n/kor/extensions/npm/package.i18n.json @@ -14,5 +14,8 @@ "config.npm.exclude": "자동 스크립트 검색에서 제외할 폴더에 대한 Glob 패턴을 구성합니다.", "npm.parseError": "Npm 작업 검색: {0} 파일을 구문 분석하지 못했습니다.", "taskdef.script": "사용자 지정할 npm 스크립트입니다.", - "taskdef.path": "스크립트를 제공하는 package.json 파일의 폴더에 대한 경로이며 생략할 수 있습니다." + "taskdef.path": "스크립트를 제공하는 package.json 파일의 폴더에 대한 경로이며 생략할 수 있습니다.", + "command.refresh": "새로 고침", + "command.debug": "디버그", + "command.openScript": "열기" } \ No newline at end of file diff --git a/i18n/kor/src/vs/editor/common/config/commonEditorConfig.i18n.json b/i18n/kor/src/vs/editor/common/config/commonEditorConfig.i18n.json index 85ef5c5304e..79e5d8e03e7 100644 --- a/i18n/kor/src/vs/editor/common/config/commonEditorConfig.i18n.json +++ b/i18n/kor/src/vs/editor/common/config/commonEditorConfig.i18n.json @@ -16,7 +16,6 @@ "lineNumbers.on": "줄 번호는 절대값으로 렌더링 됩니다.", "lineNumbers.relative": "줄 번호는 커서 위치에서 줄 간격 거리로 렌더링 됩니다.", "lineNumbers.interval": "줄 번호는 매 10 줄마다 렌더링이 이루어집니다.", - "lineNumbers": "줄 번호의 표시 방식을 제어합니다. 가능한 값은 'on', 'off', 'relative', 'interval' 입니다.", "rulers": "특정 수의 고정 폭 문자 뒤에 세로 눈금자를 렌더링합니다. 여러 눈금자의 경우 여러 값을 사용합니다. 배열이 비어 있는 경우 눈금자가 그려져 있지 않습니다.", "wordSeparators": "단어 관련 탐색 또는 작업을 수행할 때 단어 구분 기호로 사용되는 문자입니다.", "tabSize": "탭 한 개에 해당하는 공백 수입니다. `editor.detectIndentation`이 켜져 있는 경우 이 설정은 파일 콘텐츠에 따라 재정의됩니다.", @@ -28,8 +27,7 @@ "scrollBeyondLastLine": "편집기에서 마지막 줄 이후로 스크롤할지 여부를 제어합니다.", "smoothScrolling": "편집기에서 애니메이션을 사용하여 스크롤할지 여부를 제어합니다.", "minimap.enabled": "미니맵 표시 여부를 제어합니다.", - "minimap.side": "미니맵이 표시될 곳을 결정합니다. '오른쪽'과 '왼쪽'이 선택 가능합니다.", - "minimap.showSlider": "미니맵 슬라이더를 자동으로 숨길지 결정합니다. 가능한 값은 'always' 및 'mouseover'입니다.", + "minimap.showSlider": "미니맵 슬라이더를 자동으로 숨길지 결정합니다.", "minimap.renderCharacters": "줄의 실제 문자(색 블록 아님) 렌더링", "minimap.maxColumn": "최대 특정 수의 열을 렌더링하도록 미니맵의 너비를 제한합니다.", "find.seedSearchStringFromSelection": "편집기 선택에서 Find Widget의 검색 문자열을 시딩할지 설정합니다.", @@ -76,7 +74,6 @@ "occurrencesHighlight": "편집기에서 의미 체계 기호 항목을 강조 표시할지 여부를 제어합니다.", "overviewRulerLanes": "개요 눈금자에서 동일한 위치에 표시될 수 있는 장식 수를 제어합니다.", "overviewRulerBorder": "개요 눈금자 주위에 테두리를 그릴지 여부를 제어합니다.", - "cursorBlinking": "커서 애니메이션 스타일을 제어합니다. 가능한 값은 'blink', 'smooth', 'phase', 'expand' 및 'solid'입니다.", "mouseWheelZoom": "마우스 휠을 사용할 때 Ctrl 키를 누르고 있으면 편집기의 글꼴 확대/축소", "cursorStyle": "커서 스타일을 제어합니다. 허용되는 값은 '블록', '블록-윤곽', '줄', '줄-가늘게', '밑줄' 및 '밑줄-가늘게'입니다.", "cursorWidth": "editor.cursorStyle 설정이 'line'으로 설정되어 있을 때 커서의 넓이를 조절합니다.", @@ -86,7 +83,6 @@ "renderControlCharacters": "편집기에서 제어 문자를 렌더링할지를 제어합니다.", "renderIndentGuides": "편집기에서 들여쓰기 가이드를 렌더링할지를 제어합니다.", "renderLineHighlight": "편집기가 현재 줄 강조 표시를 렌더링하는 방식을 제어합니다. 가능한 값은 'none', 'gutter', 'line' 및 'all'입니다.", - "codeLens": "편집기에서 코드 필터를 표시하는지 여부를 제어합니다.", "folding": "편집기에서 코드 접기를 사용할지 여부를 제어합니다.", "showFoldingControls": "거터의 폴드 컨트롤을 자동으로 숨길지 결정합니다.", "matchBrackets": "대괄호 중 하나를 선택할 때 일치하는 대괄호를 강조 표시합니다.", diff --git a/i18n/kor/src/vs/platform/environment/node/argv.i18n.json b/i18n/kor/src/vs/platform/environment/node/argv.i18n.json index 9fa2e539d0c..27ec01dd140 100644 --- a/i18n/kor/src/vs/platform/environment/node/argv.i18n.json +++ b/i18n/kor/src/vs/platform/environment/node/argv.i18n.json @@ -22,7 +22,6 @@ "showVersions": "#NAME?", "installExtension": "확장을 설치합니다.", "uninstallExtension": "확장을 제거합니다.", - "experimentalApis": "확장에 대해 제안된 API 기능을 사용하도록 설정합니다.", "verbose": "자세한 정보 표시를 출력합니다(--wait를 의미).", "log": "사용할 로그 수준이며 기본값은 'info'입니다. 허용되는 값은 'critical', 'error', 'warn', 'info', 'debug', 'trace', 'off'입니다.", "status": "프로세스 사용 및 진단 정보를 인쇄합니다.", diff --git a/i18n/kor/src/vs/platform/theme/common/colorRegistry.i18n.json b/i18n/kor/src/vs/platform/theme/common/colorRegistry.i18n.json index 2e819fd951d..082b43917c9 100644 --- a/i18n/kor/src/vs/platform/theme/common/colorRegistry.i18n.json +++ b/i18n/kor/src/vs/platform/theme/common/colorRegistry.i18n.json @@ -29,7 +29,6 @@ "inputPlaceholderForeground": "위치 표시자 텍스트에 대한 입력 상자 전경색입니다.", "inputValidationInfoBackground": "정보 심각도의 입력 유효성 검사 배경색입니다.", "inputValidationInfoBorder": "정보 심각도의 입력 유효성 검사 테두리 색입니다.", - "inputValidationWarningBackground": "정보 경고의 입력 유효성 검사 배경색입니다.", "inputValidationWarningBorder": "경고 심각도의 입력 유효성 검사 테두리 색입니다.", "inputValidationErrorBackground": "오류 심각도의 입력 유효성 검사 배경색입니다.", "inputValidationErrorBorder": "오류 심각도의 입력 유효성 검사 테두리 색입니다.", @@ -71,10 +70,8 @@ "editorSelectionHighlightBorder": "선택 영역과 동일한 콘텐츠가 있는 영역의 테두리 색입니다.", "editorFindMatch": "현재 검색 일치 항목의 색입니다.", "findMatchHighlight": "기타 일치하는 검색의 색상. 색상은 밑의 꾸밈을 가리지 않도록 반드시 불투명이 아니어야 합니다.", - "findRangeHighlight": "범위 제한 검색의 색상. 색상은 밑의 꾸밈을 가리지 않도록 반드시 불투명이 아니어야 합니다.", "editorFindMatchBorder": "현재 검색과 일치하는 테두리 색입니다.", "findMatchHighlightBorder": "다른 검색과 일치하는 테두리 색입니다.", - "findRangeHighlightBorder": "범위 제한 검색의 테두리 색. 색상은 밑의 꾸밈을 가리지 않도록 반드시 불투명이 아니어야 합니다.", "hoverHighlight": "호버가 표시된 단어 아래를 강조 표시합니다. 색상은 밑의 꾸밈을 가리지 않도록 반드시 불투명이 아니어야 합니다.", "hoverBackground": "편집기 호버의 배경색.", "hoverBorder": "편집기 호버의 테두리 색입니다.", @@ -88,7 +85,6 @@ "mergeIncomingHeaderBackground": "인라인 병합 충돌에서 수신 헤더 배경입니다. 색상은 밑의 꾸밈을 가리지 않도록 반드시 불투명이 아니어야 합니다.", "mergeIncomingContentBackground": "인라인 병합 충돌에서 수신 콘텐츠 배경입니다. 색상은 밑의 꾸밈을 가리지 않도록 반드시 불투명이 아니어야 합니다.", "mergeCommonHeaderBackground": "인라인 병합 충돌의 공통 과거 헤더 배경입니다. 색상은 밑의 꾸밈을 가리지 않도록 반드시 불투명이 아니어야 합니다.", - "mergeCommonContentBackground": "인라인 병합 충돌의 공통 과거 콘텐츠 배경입니다. 색상은 밑의 꾸밈을 가리지 않도록 반드시 불투명이 아니어야 합니다.", "mergeBorder": "인라인 병합 충돌에서 헤더 및 스플리터의 테두리 색입니다.", "overviewRulerCurrentContentForeground": "인라인 병합 충돌에서 현재 개요 눈금 전경색입니다.", "overviewRulerIncomingContentForeground": "인라인 병합 충돌에서 수신 개요 눈금 전경색입니다.", diff --git a/i18n/kor/src/vs/platform/url/electron-browser/inactiveExtensionUrlHandler.i18n.json b/i18n/kor/src/vs/platform/url/electron-browser/inactiveExtensionUrlHandler.i18n.json new file mode 100644 index 00000000000..35229bd6699 --- /dev/null +++ b/i18n/kor/src/vs/platform/url/electron-browser/inactiveExtensionUrlHandler.i18n.json @@ -0,0 +1,9 @@ +{ + "": [ + "--------------------------------------------------------------------------------------------", + "Copyright (c) Microsoft Corporation. All rights reserved.", + "Licensed under the MIT License. See License.txt in the project root for license information.", + "--------------------------------------------------------------------------------------------", + "Do not edit this file. It is machine generated." + ] +} \ No newline at end of file diff --git a/i18n/kor/src/vs/workbench/api/browser/viewsExtensionPoint.i18n.json b/i18n/kor/src/vs/workbench/api/browser/viewsExtensionPoint.i18n.json index 224d3705a5f..3312b002664 100644 --- a/i18n/kor/src/vs/workbench/api/browser/viewsExtensionPoint.i18n.json +++ b/i18n/kor/src/vs/workbench/api/browser/viewsExtensionPoint.i18n.json @@ -13,8 +13,6 @@ "vscode.extension.contributes.view.name": "사용자가 읽을 수 있는 뷰 이름입니다. 표시됩니다.", "vscode.extension.contributes.view.when": "이 보기를 표시하기 위해 true여야 하는 조건입니다.", "vscode.extension.contributes.views": "뷰를 에디터에 적용합니다.", - "views.explorer": "탐색기 뷰", - "views.debug": "디버그 보기", "duplicateView1": "위치 '{1}'에서 동일한 ID '{0}'(으)로된 여러 개의 보기를 등록할 수 없습니다.", "duplicateView2": "ID `{0}`이(가) 포함된 뷰가 위치 `{1}`에 이미 등록되어 있습니다." } \ No newline at end of file diff --git a/i18n/kor/src/vs/workbench/browser/parts/quickinput/quickInput.i18n.json b/i18n/kor/src/vs/workbench/browser/parts/quickinput/quickInput.i18n.json index e9877e526b5..78d00430e3c 100644 --- a/i18n/kor/src/vs/workbench/browser/parts/quickinput/quickInput.i18n.json +++ b/i18n/kor/src/vs/workbench/browser/parts/quickinput/quickInput.i18n.json @@ -6,5 +6,7 @@ "--------------------------------------------------------------------------------------------", "Do not edit this file. It is machine generated." ], + "inputModeEntryDescription": "{0}(확인하려면 'Enter' 키를 누르고, 취소하려면 'Escape' 키를 누름)", + "inputModeEntry": "입력을 확인하려면 'Enter' 키를 누르고, 취소하려면 'Esc' 키를 누르세요.", "ok": "확인" } \ No newline at end of file diff --git a/i18n/kor/src/vs/workbench/parts/files/electron-browser/fileActions.i18n.json b/i18n/kor/src/vs/workbench/parts/files/electron-browser/fileActions.i18n.json index 9e37e959f54..2c49994a801 100644 --- a/i18n/kor/src/vs/workbench/parts/files/electron-browser/fileActions.i18n.json +++ b/i18n/kor/src/vs/workbench/parts/files/electron-browser/fileActions.i18n.json @@ -24,20 +24,20 @@ "dirtyMessageFolderDelete": "{0}개 파일에 저장되지 않은 변경 내용이 있는 폴더를 삭제하려고 합니다. 계속하시겠습니까?", "dirtyMessageFileDelete": "저장되지 않은 변경 내용이 있는 파일을 삭제하려고 합니다. 계속하시겠습니까?", "dirtyWarning": "변경 내용을 저장하지 않은 경우 변경 내용이 손실됩니다.", - "confirmMoveTrashMessageMultiple": "다음 {0}개 파일을 삭제하시겠습니까?", - "confirmMoveTrashMessageFolder": "'{0}'과(와) 해당 내용을 삭제할까요?", - "confirmMoveTrashMessageFile": "'{0}'을(를) 삭제할까요?", "undoBin": "휴지통에서 복원할 수 있습니다.", "undoTrash": "휴지통에서 복원할 수 있습니다.", "doNotAskAgain": "이 메시지를 다시 표시 안 함", - "confirmDeleteMessageMultiple": "다음 {0}개 파일을 영구히 삭제하시겠습니까?", - "confirmDeleteMessageFolder": "'{0}'과(와) 해당 내용을 영구히 삭제할까요?", - "confirmDeleteMessageFile": "'{0}'을(를) 영구히 삭제할까요?", "irreversible": "이 작업은 취소할 수 없습니다.", "binFailed": "휴지통을 사용하여 삭제하지 못했습니다. 대신 영구히 삭제하시겠습니까?", "trashFailed": "휴지통을 사용하여 삭제하지 못했습니다. 대신 영구히 삭제하시겠습니까?", "deletePermanentlyButtonLabel": "영구 삭제 (&&D)", "retryButtonLabel": "다시 시도 (&&R)", + "confirmMoveTrashMessageMultiple": "다음 {0}개 파일을 삭제하시겠습니까?", + "confirmMoveTrashMessageFolder": "'{0}'과(와) 해당 내용을 삭제할까요?", + "confirmMoveTrashMessageFile": "'{0}'을(를) 삭제할까요?", + "confirmDeleteMessageMultiple": "다음 {0}개 파일을 영구히 삭제하시겠습니까?", + "confirmDeleteMessageFolder": "'{0}'과(와) 해당 내용을 영구히 삭제할까요?", + "confirmDeleteMessageFile": "'{0}'을(를) 영구히 삭제할까요?", "confirmOverwrite": "이름이 같은 파일 또는 폴더가 대상 폴더에 이미 있습니다. 덮어쓸까요?", "replaceButtonLabel": "바꾸기(&&R)", "fileIsAncestor": "붙여 넣을 파일이 대상 폴더의 상위 항목입니다.", diff --git a/i18n/kor/src/vs/workbench/parts/localizations/electron-browser/localizations.contribution.i18n.json b/i18n/kor/src/vs/workbench/parts/localizations/electron-browser/localizations.contribution.i18n.json new file mode 100644 index 00000000000..89a77ea28d7 --- /dev/null +++ b/i18n/kor/src/vs/workbench/parts/localizations/electron-browser/localizations.contribution.i18n.json @@ -0,0 +1,23 @@ +{ + "": [ + "--------------------------------------------------------------------------------------------", + "Copyright (c) Microsoft Corporation. All rights reserved.", + "Licensed under the MIT License. See License.txt in the project root for license information.", + "--------------------------------------------------------------------------------------------", + "Do not edit this file. It is machine generated." + ], + "updateLocale": "VS Code의 UI 언어를 {0}(으)로 변경하고 다시 시작하시겠습니까?", + "yes": "예", + "no": "아니요", + "neverAgain": "다시 표시 안 함", + "install": "설치", + "JsonSchema.locale": "사용할 UI 언어입니다.", + "vscode.extension.contributes.localizations": "편집기에 지역화를 적용합니다.", + "vscode.extension.contributes.localizations.languageId": "표시 문자열이 번역되는 언어의 ID입니다.", + "vscode.extension.contributes.localizations.languageName": "영어로 된 언어 이름입니다.", + "vscode.extension.contributes.localizations.languageNameLocalized": "적용된 언어로 된 언어 이름입니다.", + "vscode.extension.contributes.localizations.translations": "해당 언어에 연결된 번역 목록입니다.", + "vscode.extension.contributes.localizations.translations.id": "이 변환이 적용되는 VS Code 또는 확장의 ID입니다. VS Code의 ID는 항상 `vscode`이고 확장의 ID는 `publisherId.extensionName` 형식이어야 합니다.", + "vscode.extension.contributes.localizations.translations.id.pattern": "ID는 VS Code를 변환하거나 확장을 변환하는 경우 각각 `vscode` 또는 `publisherId.extensionName` 형식이어야 합니다.", + "vscode.extension.contributes.localizations.translations.path": "언어에 대한 변환을 포함하는 파일의 상대 경로입니다." +} \ No newline at end of file diff --git a/i18n/kor/src/vs/workbench/parts/localizations/electron-browser/localizationsActions.i18n.json b/i18n/kor/src/vs/workbench/parts/localizations/electron-browser/localizationsActions.i18n.json new file mode 100644 index 00000000000..e8656093b5c --- /dev/null +++ b/i18n/kor/src/vs/workbench/parts/localizations/electron-browser/localizationsActions.i18n.json @@ -0,0 +1,14 @@ +{ + "": [ + "--------------------------------------------------------------------------------------------", + "Copyright (c) Microsoft Corporation. All rights reserved.", + "Licensed under the MIT License. See License.txt in the project root for license information.", + "--------------------------------------------------------------------------------------------", + "Do not edit this file. It is machine generated." + ], + "configureLocale": "언어 구성", + "displayLanguage": "VSCode의 표시 언어를 정의합니다.", + "doc": "지원되는 언어 목록은 {0} 을(를) 참조하세요.", + "restart": "값을 변경하려면 VSCode를 다시 시작해야 합니다.", + "fail.createSettings": "{0}'({1})을(를) 만들 수 없습니다." +} \ No newline at end of file diff --git a/i18n/kor/src/vs/workbench/parts/url/electron-browser/url.contribution.i18n.json b/i18n/kor/src/vs/workbench/parts/url/electron-browser/url.contribution.i18n.json new file mode 100644 index 00000000000..73fa26c6394 --- /dev/null +++ b/i18n/kor/src/vs/workbench/parts/url/electron-browser/url.contribution.i18n.json @@ -0,0 +1,10 @@ +{ + "": [ + "--------------------------------------------------------------------------------------------", + "Copyright (c) Microsoft Corporation. All rights reserved.", + "Licensed under the MIT License. See License.txt in the project root for license information.", + "--------------------------------------------------------------------------------------------", + "Do not edit this file. It is machine generated." + ], + "developer": "개발자" +} \ No newline at end of file diff --git a/i18n/kor/src/vs/workbench/services/configurationResolver/node/variableResolver.i18n.json b/i18n/kor/src/vs/workbench/services/configurationResolver/node/variableResolver.i18n.json new file mode 100644 index 00000000000..35229bd6699 --- /dev/null +++ b/i18n/kor/src/vs/workbench/services/configurationResolver/node/variableResolver.i18n.json @@ -0,0 +1,9 @@ +{ + "": [ + "--------------------------------------------------------------------------------------------", + "Copyright (c) Microsoft Corporation. All rights reserved.", + "Licensed under the MIT License. See License.txt in the project root for license information.", + "--------------------------------------------------------------------------------------------", + "Do not edit this file. It is machine generated." + ] +} \ No newline at end of file diff --git a/i18n/ptb/extensions/npm/out/npmView.i18n.json b/i18n/ptb/extensions/npm/out/npmView.i18n.json new file mode 100644 index 00000000000..35229bd6699 --- /dev/null +++ b/i18n/ptb/extensions/npm/out/npmView.i18n.json @@ -0,0 +1,9 @@ +{ + "": [ + "--------------------------------------------------------------------------------------------", + "Copyright (c) Microsoft Corporation. All rights reserved.", + "Licensed under the MIT License. See License.txt in the project root for license information.", + "--------------------------------------------------------------------------------------------", + "Do not edit this file. It is machine generated." + ] +} \ No newline at end of file diff --git a/i18n/ptb/extensions/npm/out/tasks.i18n.json b/i18n/ptb/extensions/npm/out/tasks.i18n.json new file mode 100644 index 00000000000..35229bd6699 --- /dev/null +++ b/i18n/ptb/extensions/npm/out/tasks.i18n.json @@ -0,0 +1,9 @@ +{ + "": [ + "--------------------------------------------------------------------------------------------", + "Copyright (c) Microsoft Corporation. All rights reserved.", + "Licensed under the MIT License. See License.txt in the project root for license information.", + "--------------------------------------------------------------------------------------------", + "Do not edit this file. It is machine generated." + ] +} \ No newline at end of file diff --git a/i18n/ptb/extensions/npm/package.i18n.json b/i18n/ptb/extensions/npm/package.i18n.json index 7eb2870be29..1e4935decbe 100644 --- a/i18n/ptb/extensions/npm/package.i18n.json +++ b/i18n/ptb/extensions/npm/package.i18n.json @@ -14,5 +14,9 @@ "config.npm.exclude": "Configure padrões glob para pastas que devem ser excluídos da detecção automática de script.", "npm.parseError": "Deteção de tarefa NPM: falha ao analisar o arquivo {0}", "taskdef.script": "O script npm para personalizar.", - "taskdef.path": "O caminho para a pasta do arquivo package.json que fornece o script. Pode ser omitido." + "taskdef.path": "O caminho para a pasta do arquivo package.json que fornece o script. Pode ser omitido.", + "command.refresh": "Atualizar", + "command.run": "Executar", + "command.debug": "Depurar", + "command.openScript": "Abrir" } \ No newline at end of file diff --git a/i18n/ptb/extensions/typescript-language-features/package.i18n.json b/i18n/ptb/extensions/typescript-language-features/package.i18n.json index 97dd0af87e4..fbb3ef5c005 100644 --- a/i18n/ptb/extensions/typescript-language-features/package.i18n.json +++ b/i18n/ptb/extensions/typescript-language-features/package.i18n.json @@ -30,6 +30,7 @@ "format.insertSpaceBeforeFunctionParenthesis": "Define a manipulação de espaços antes de parênteses do argumento de função. Requer TypeScript > = 2.1.5.", "format.insertSpaceAfterOpeningAndBeforeClosingNonemptyParenthesis": "Define a manipulação de espaços após abrir e antes de fechar parênteses não vazios.", "format.insertSpaceAfterOpeningAndBeforeClosingNonemptyBrackets": "Define a manipulação de espaços após abrir e antes de fechar colchetes não vazios.", + "format.insertSpaceAfterOpeningAndBeforeClosingNonemptyBraces": "Define o espaço de manipulação após a abertura e antes de fechar chaves não vazias. Requer TypeScript >= 2.3.0.", "format.insertSpaceAfterOpeningAndBeforeClosingTemplateStringBraces": "Define a manipulação de espaços após abrir e antes de fechar chaves de cadeias de caracteres de modelos. Requer TypeScript >= 2.0.6.", "format.insertSpaceAfterOpeningAndBeforeClosingJsxExpressionBraces": "Define a manipulação de espaços após abrir e antes de fechar chaves de expressões JSX. Requer TypeScript >= 2.0.6.", "format.insertSpaceAfterTypeAssertion": "Define a manipulação de espaços após asserções de tipo em TypeScript. Requer TypeScript >= 2,4.", diff --git a/i18n/ptb/src/vs/base/node/processes.i18n.json b/i18n/ptb/src/vs/base/node/processes.i18n.json index 35229bd6699..19c9978965a 100644 --- a/i18n/ptb/src/vs/base/node/processes.i18n.json +++ b/i18n/ptb/src/vs/base/node/processes.i18n.json @@ -5,5 +5,6 @@ "Licensed under the MIT License. See License.txt in the project root for license information.", "--------------------------------------------------------------------------------------------", "Do not edit this file. It is machine generated." - ] + ], + "TaskRunner.UNC": "Não é possível executar um comando shell em uma unidade UNC." } \ No newline at end of file diff --git a/i18n/ptb/src/vs/base/node/zip.i18n.json b/i18n/ptb/src/vs/base/node/zip.i18n.json index bc03a8ff837..feccb96f8b0 100644 --- a/i18n/ptb/src/vs/base/node/zip.i18n.json +++ b/i18n/ptb/src/vs/base/node/zip.i18n.json @@ -6,5 +6,6 @@ "--------------------------------------------------------------------------------------------", "Do not edit this file. It is machine generated." ], + "incompleteExtract": "Incompleto. Extraído {0} de {1} entradas", "notFound": "{0} não encontrado dentro do zip." } \ No newline at end of file diff --git a/i18n/ptb/src/vs/code/electron-main/menus.i18n.json b/i18n/ptb/src/vs/code/electron-main/menus.i18n.json index 68f544d5457..c7b251d9765 100644 --- a/i18n/ptb/src/vs/code/electron-main/menus.i18n.json +++ b/i18n/ptb/src/vs/code/electron-main/menus.i18n.json @@ -146,6 +146,7 @@ "miConditionalBreakpoint": "Ponto de Parada &&Condicional...", "miColumnBreakpoint": "Ponto de Parada de C&&oluna", "miFunctionBreakpoint": "Ponto de Parada de &&Função...", + "miLogPoint": "Ponto de &&Log...", "miNewBreakpoint": "&&Novo Ponto de Parada", "miEnableAllBreakpoints": "Habilitar Todos os Pontos de Parada", "miDisableAllBreakpoints": "Desabilitar T&&odos os Pontos de Parada", diff --git a/i18n/ptb/src/vs/editor/browser/widget/diffReview.i18n.json b/i18n/ptb/src/vs/editor/browser/widget/diffReview.i18n.json index fd79f520ec4..61dea0788af 100644 --- a/i18n/ptb/src/vs/editor/browser/widget/diffReview.i18n.json +++ b/i18n/ptb/src/vs/editor/browser/widget/diffReview.i18n.json @@ -7,6 +7,8 @@ "Do not edit this file. It is machine generated." ], "label.close": "Fechar", + "no_lines": "sem linhas", + "one_line": "1 linha", "blankLine": "branco", "equalLine": "original {0}, modificados {1}: {2}", "insertLine": "+ modificado {0}: {1}", diff --git a/i18n/ptb/src/vs/editor/common/config/commonEditorConfig.i18n.json b/i18n/ptb/src/vs/editor/common/config/commonEditorConfig.i18n.json index 0b3fe531920..f47bef212db 100644 --- a/i18n/ptb/src/vs/editor/common/config/commonEditorConfig.i18n.json +++ b/i18n/ptb/src/vs/editor/common/config/commonEditorConfig.i18n.json @@ -16,7 +16,6 @@ "lineNumbers.on": "Números de linhas são renderizados em números absolutos.", "lineNumbers.relative": "Números de linhas são renderizadas como distância em linhas até a posição do cursor.", "lineNumbers.interval": "Números de linhas são renderizados a cada 10 linhas.", - "lineNumbers": "Controla a exibição dos números de linha. Os valores possíveis são 'on', 'off', 'relative' e 'interval'.", "rulers": "Renderiza réguas verticais após um certo número de caracteres de espaço. Use vários valores para várias réguas. Réguas não serão desenhadas se a matriz estiver vazia", "wordSeparators": "Caracteres que serão usados como separadores de palavras ao fazer navegação relacionada a palavras ou operações", "tabSize": "O número de espaços equivalentes a uma tabulação. Esta configuração é sobreposta com base no conteúdo do arquivo quando `editor.detectIndentation` está ligado.", @@ -28,8 +27,7 @@ "scrollBeyondLastLine": "Controla se o editor rolará além da última linha", "smoothScrolling": "Controla se o editor irá rolar usando uma animação", "minimap.enabled": "Controla se o mini mapa é exibido", - "minimap.side": "Controla o lado onde processar o minimap. Os valores possíveis são 'direita' e 'esquerda'", - "minimap.showSlider": "Controla se o controle deslizante minimap é automaticamente escondido. Os valores possíveis são 'sempre' e 'mouseover'", + "minimap.showSlider": "Controla se o controle deslizante minimap é oculto automaticamente.", "minimap.renderCharacters": "Renderizar os caracteres em uma linha (em oposição a blocos de caracteres)", "minimap.maxColumn": "Limitar o tamanho de um mini-mapa para renderizar no máximo um número determinado de colunas", "find.seedSearchStringFromSelection": "Controla se nós inicializamos a string de pesquisa na Ferramenta de Pesquisa a partir da seleção do editor", @@ -77,7 +75,6 @@ "occurrencesHighlight": "Controla se o editor deve realçar ocorrências de símbolos semânticos.", "overviewRulerLanes": "Controla o número de decorações que podem ser exibidas na mesma posição na régua de visão geral", "overviewRulerBorder": "Controla se deve desenhar uma borda ao redor da régua de visão geral.", - "cursorBlinking": "Controla o estilo de animação do cursor, os valores possíveis são 'blink', 'smooth', 'phase', 'expand' e 'solid'", "mouseWheelZoom": "Alterar o zoom da fonte editor quando utilizada a roda do mouse e pressionando Ctrl", "cursorStyle": "Controla o estilo do cursor, os valores aceitos são 'block', 'block-outline', 'line', 'line-thin', 'underline' e 'underline-thin'", "cursorWidth": "Controla a largura do cursor quando editor.cursorStyle está definido como 'line'", @@ -87,7 +84,6 @@ "renderControlCharacters": "Controla se o editor deve renderizar caracteres de controle", "renderIndentGuides": "Controla se o editor deve renderizar guias de identação", "renderLineHighlight": "Controla como o editor deve renderizar a linha atual, as possibilidades são 'none', 'gutter', 'line' e 'all'.", - "codeLens": "Controla se o editor exibirá a lente de códigos.", "folding": "Controla se o editor tem codigo colapsível hablitado", "foldingStrategyAuto": "Se disponível, use uma estratégia de dobramento específica de idioma, caso contrário, recua para a estratégia baseada na indentação.", "foldingStrategyIndentation": "Sempre use a estratégia de dobragem baseada no indentação ", diff --git a/i18n/ptb/src/vs/platform/environment/node/argv.i18n.json b/i18n/ptb/src/vs/platform/environment/node/argv.i18n.json index 768ee3289ce..03aa5886022 100644 --- a/i18n/ptb/src/vs/platform/environment/node/argv.i18n.json +++ b/i18n/ptb/src/vs/platform/environment/node/argv.i18n.json @@ -22,7 +22,6 @@ "showVersions": "Exibir versões de extensões instaladas, quando estiver usando --list-extension", "installExtension": "Instala uma extensão.", "uninstallExtension": "Desinstala uma extensão.", - "experimentalApis": "Permite recursos de api propostos para uma extensão.", "verbose": "Imprimir a saída detalhada (Implica -- esperar).", "log": "Nível de log a ser utilizado. O padrão é 'info'. Os valores permitidos são 'critical', 'error', 'warn', 'info', 'debug', 'trace', 'off'.", "status": "Utilização do processo de impressão e informações de diagnóstico.", diff --git a/i18n/ptb/src/vs/platform/theme/common/colorRegistry.i18n.json b/i18n/ptb/src/vs/platform/theme/common/colorRegistry.i18n.json index a33d1357414..9d38a8641bd 100644 --- a/i18n/ptb/src/vs/platform/theme/common/colorRegistry.i18n.json +++ b/i18n/ptb/src/vs/platform/theme/common/colorRegistry.i18n.json @@ -29,7 +29,6 @@ "inputPlaceholderForeground": "Cor de primeiro plano da caixa de entrada para o texto de espaço reservado.", "inputValidationInfoBackground": "Cor de fundo de validação de entrada para a severidade de informações.", "inputValidationInfoBorder": "Cor da borda de validação de entrada para a severidade de informações.", - "inputValidationWarningBackground": "Cor de fundo de validação de entrada para avisos.", "inputValidationWarningBorder": "Cor da borda de validação para a severidade de avisos.", "inputValidationErrorBackground": "Cor de fundo de validação de entrada para a severidade do erro.", "inputValidationErrorBorder": "Cor da borda de validação de entrada para a severidade do erro.", @@ -71,10 +70,8 @@ "editorSelectionHighlightBorder": "Cor da borda para regiões com o mesmo conteúdo da seleção.", "editorFindMatch": "Cor da correspondência de pesquisa atual.", "findMatchHighlight": "Cor dos outros termos que correspondem ao da pesquisa. A cor não deve ser opaca para não esconder as decorações subjacentes.", - "findRangeHighlight": "Cor do intervalo limitando a pesquisa. A cor não deve ser opaca para não esconder decorações subjacentes.", "editorFindMatchBorder": "Cor da borda da correspondência de pesquisa atual.", "findMatchHighlightBorder": "Cor da borda dos outros resultados de pesquisa.", - "findRangeHighlightBorder": "Cor da borda do intervalo limitando a pesquisa. A cor não deve ser opaca para não esconder decorações subjacentes.", "hoverHighlight": "Destaque abaixo da palavra para qual um flutuador é mostrado. A cor não deve ser opaca para não esconder decorações subjacentes.", "hoverBackground": "Cor de fundo para o item flutuante do editor", "hoverBorder": "Cor da borda para o item flutuante do editor.", @@ -88,7 +85,6 @@ "mergeIncomingHeaderBackground": "Fundo do cabeçalho entrante em conflitos de merge inline. A cor não deve ser opaca para não esconder decorações subjacentes.", "mergeIncomingContentBackground": "Fundo do conteúdo entrante em conflitos de merge inline. A cor não deve ser opaca para não esconder decorações subjacentes.", "mergeCommonHeaderBackground": "Fundo comum do cabeçalho antepassado em conflitos de merge inline. A cor não deve ser opaca para não esconder decorações subjacentes.", - "mergeCommonContentBackground": "Fundo comum do conteúdo antepassado em conflitos de merge inline. A cor não deve ser opaca para não esconder decorações subjacentes.", "mergeBorder": "Cor da borda dos cabeçalhos e separadores estão em conflito de mesclagem em linha.", "overviewRulerCurrentContentForeground": "Cor de fundo de régua de visuaização atual em conflito de mesclagem em linha.", "overviewRulerIncomingContentForeground": "Cor de fundo de régua de visuaização de entrada em conflito de mesclagem em linha.", diff --git a/i18n/ptb/src/vs/platform/url/electron-browser/inactiveExtensionUrlHandler.i18n.json b/i18n/ptb/src/vs/platform/url/electron-browser/inactiveExtensionUrlHandler.i18n.json new file mode 100644 index 00000000000..35229bd6699 --- /dev/null +++ b/i18n/ptb/src/vs/platform/url/electron-browser/inactiveExtensionUrlHandler.i18n.json @@ -0,0 +1,9 @@ +{ + "": [ + "--------------------------------------------------------------------------------------------", + "Copyright (c) Microsoft Corporation. All rights reserved.", + "Licensed under the MIT License. See License.txt in the project root for license information.", + "--------------------------------------------------------------------------------------------", + "Do not edit this file. It is machine generated." + ] +} \ No newline at end of file diff --git a/i18n/ptb/src/vs/workbench/api/browser/viewsContainersExtensionPoint.i18n.json b/i18n/ptb/src/vs/workbench/api/browser/viewsContainersExtensionPoint.i18n.json index b25f4fe2939..30196062981 100644 --- a/i18n/ptb/src/vs/workbench/api/browser/viewsContainersExtensionPoint.i18n.json +++ b/i18n/ptb/src/vs/workbench/api/browser/viewsContainersExtensionPoint.i18n.json @@ -6,6 +6,11 @@ "--------------------------------------------------------------------------------------------", "Do not edit this file. It is machine generated." ], + "vscode.extension.contributes.views.containers.id": "ID exclusivo usado para identificar o contêiner no qual as visualizações podem ser contribuídas usando o ponto de contribuição \"visualizações\"", + "vscode.extension.contributes.views.containers.title": "Sequência legível humana usada para renderizar o contêiner", + "vscode.extension.contributes.views.containers.icon": "Caminho para o ícone do contêiner", + "vscode.extension.contributes.viewsContainer": "Contribui com os contêineres de visualizações para o editor", + "requirearray": "visualizações de contêineres devem ser uma matriz", "requirestring": "a propriedade `{0}` é obrigatória e deve ser do tipo `string`", "showViewlet": "Mostrar {0}", "view": "Exibir" diff --git a/i18n/ptb/src/vs/workbench/api/browser/viewsExtensionPoint.i18n.json b/i18n/ptb/src/vs/workbench/api/browser/viewsExtensionPoint.i18n.json index dfe343c9d2b..cd8962aa3a7 100644 --- a/i18n/ptb/src/vs/workbench/api/browser/viewsExtensionPoint.i18n.json +++ b/i18n/ptb/src/vs/workbench/api/browser/viewsExtensionPoint.i18n.json @@ -13,8 +13,6 @@ "vscode.extension.contributes.view.name": "O nome legível da visualização. Será mostrado", "vscode.extension.contributes.view.when": "Condição que deve ser verdadeira para mostrar esta visualização", "vscode.extension.contributes.views": "Contribui visualizações ao editor", - "views.explorer": "Visualização do explorador", - "views.debug": "Visualizar Depurador", "duplicateView1": "Não é possível registrar vários modos de exibição com a mesma id '{0}' no local '{1}'", "duplicateView2": "Uma exibição com id '{0}' já está registrada no local '{1}'" } \ No newline at end of file diff --git a/i18n/ptb/src/vs/workbench/browser/parts/quickinput/quickInput.i18n.json b/i18n/ptb/src/vs/workbench/browser/parts/quickinput/quickInput.i18n.json index bcdf56e4849..9d17b283ca6 100644 --- a/i18n/ptb/src/vs/workbench/browser/parts/quickinput/quickInput.i18n.json +++ b/i18n/ptb/src/vs/workbench/browser/parts/quickinput/quickInput.i18n.json @@ -6,5 +6,7 @@ "--------------------------------------------------------------------------------------------", "Do not edit this file. It is machine generated." ], + "inputModeEntryDescription": "{0} (Pressione 'Enter' para confirmar ou 'Esc' para cancelar)", + "inputModeEntry": "Pressione 'Enter' para confirmar o texto digitado ou 'Esc' para cancelar", "ok": "OK" } \ No newline at end of file diff --git a/i18n/ptb/src/vs/workbench/parts/debug/browser/breakpointsView.i18n.json b/i18n/ptb/src/vs/workbench/parts/debug/browser/breakpointsView.i18n.json index 4aab0d24a42..bbabad6f63f 100644 --- a/i18n/ptb/src/vs/workbench/parts/debug/browser/breakpointsView.i18n.json +++ b/i18n/ptb/src/vs/workbench/parts/debug/browser/breakpointsView.i18n.json @@ -6,6 +6,10 @@ "--------------------------------------------------------------------------------------------", "Do not edit this file. It is machine generated." ], + "logPoint": "Ponto de log", + "breakpoint": "Ponto de interrupção", + "editBreakpoint": "Editar {0}...", + "removeBreakpoint": "Remover {0}", "functionBreakpointsNotSupported": "Pontos de parada de função não são suportados por este tipo de depuração", "functionBreakpointPlaceholder": "Função de parada", "functionBreakPointInputAriaLabel": "Digitar Ponto de Parada de Função", @@ -13,6 +17,7 @@ "breakpointUnverifieddHover": "Ponto de Parada não Verificado", "functionBreakpointUnsupported": "Função de ponto de parada não é suportado por este tipo de debug", "breakpointDirtydHover": "Ponto de parada não verificado. O arquivo foi modificado, por favor reinicie a sessão de depuração.", + "logBreakpointUnsupported": "Pontos de log não suportados por este tipo de depuração", "conditionalBreakpointUnsupported": "Pontos de parada condicionais não são suportados por esse tipo de depurador", "hitBreakpointUnsupported": "Pontos de parada condicionais não são suportados por este tipo de debug" } \ No newline at end of file diff --git a/i18n/ptb/src/vs/workbench/parts/debug/browser/debugActions.i18n.json b/i18n/ptb/src/vs/workbench/parts/debug/browser/debugActions.i18n.json index 7bffbd36c2c..dd87def8a21 100644 --- a/i18n/ptb/src/vs/workbench/parts/debug/browser/debugActions.i18n.json +++ b/i18n/ptb/src/vs/workbench/parts/debug/browser/debugActions.i18n.json @@ -21,6 +21,7 @@ "disconnectDebug": "Desconectar", "continueDebug": "Continuar", "pauseDebug": "Pausa", + "terminateThread": "Finalizar Tarefa", "restartFrame": "Reiniciar o Frame", "removeBreakpoint": "Remover Ponto de Parada", "removeAllBreakpoints": "Remover Todos os Pontos de Parada", diff --git a/i18n/ptb/src/vs/workbench/parts/debug/browser/debugEditorActions.i18n.json b/i18n/ptb/src/vs/workbench/parts/debug/browser/debugEditorActions.i18n.json index d1c7af084af..30d5ee61d18 100644 --- a/i18n/ptb/src/vs/workbench/parts/debug/browser/debugEditorActions.i18n.json +++ b/i18n/ptb/src/vs/workbench/parts/debug/browser/debugEditorActions.i18n.json @@ -8,6 +8,7 @@ ], "toggleBreakpointAction": "Depurar: Alternar Ponto de Parada", "conditionalBreakpointEditorAction": "Depurar: Adicionar Ponto de Interrupção Condicional...", + "logPointEditorAction": "Depuração: Adicionar ponto ao Log...", "runToCursor": "Executar até o Cursor", "debugEvaluate": "Depurar: Avaliar", "debugAddToWatch": "Depurar: Adicionar ao monitoramento", diff --git a/i18n/ptb/src/vs/workbench/parts/debug/electron-browser/breakpointWidget.i18n.json b/i18n/ptb/src/vs/workbench/parts/debug/electron-browser/breakpointWidget.i18n.json index 0e03569a94f..1770196e491 100644 --- a/i18n/ptb/src/vs/workbench/parts/debug/electron-browser/breakpointWidget.i18n.json +++ b/i18n/ptb/src/vs/workbench/parts/debug/electron-browser/breakpointWidget.i18n.json @@ -9,5 +9,6 @@ "breakpointWidgetHitCountPlaceholder": "Parar quando contagem de ocorrências condição for alcançada. 'Enter' para aceitar, 'esc' para cancelar.", "breakpointWidgetExpressionPlaceholder": "Parar quando a expressão for avaliada como true. 'Enter' para aceitar, 'esc' para cancelar.", "expression": "Expressão", - "hitCount": "Contagem de ocorrências" + "hitCount": "Contagem de ocorrências", + "logMessage": "Mensagem de log" } \ No newline at end of file diff --git a/i18n/ptb/src/vs/workbench/parts/debug/electron-browser/debugConfigurationManager.i18n.json b/i18n/ptb/src/vs/workbench/parts/debug/electron-browser/debugConfigurationManager.i18n.json index 7d73da69fcf..a9516303634 100644 --- a/i18n/ptb/src/vs/workbench/parts/debug/electron-browser/debugConfigurationManager.i18n.json +++ b/i18n/ptb/src/vs/workbench/parts/debug/electron-browser/debugConfigurationManager.i18n.json @@ -35,6 +35,7 @@ "useUniqueNames": "Por favor, use nomes únicos de configuração.", "app.launch.json.compound.folder": "Nome da pasta em que o composto se encontra.", "app.launch.json.compounds.configurations": "Nomes das configurações que serão iniciadas como parte deste composto.", + "debugNoType": "Depurador 'tipo' não pode ser omitido e deve ser do tipo 'string'.", "selectDebug": "Selecione o ambiente", "DebugConfig.failed": "Não é possível criar o arquivo 'launch.json' dentro da pasta '.vscode' ({0}).", "workspace": "espaço de trabalho", diff --git a/i18n/ptb/src/vs/workbench/parts/debug/electron-browser/debugEditorContribution.i18n.json b/i18n/ptb/src/vs/workbench/parts/debug/electron-browser/debugEditorContribution.i18n.json index 3e8dc5d2303..7863bd02c76 100644 --- a/i18n/ptb/src/vs/workbench/parts/debug/electron-browser/debugEditorContribution.i18n.json +++ b/i18n/ptb/src/vs/workbench/parts/debug/electron-browser/debugEditorContribution.i18n.json @@ -6,6 +6,12 @@ "--------------------------------------------------------------------------------------------", "Do not edit this file. It is machine generated." ], + "logPoint": "Ponto de log", + "breakpoint": "Ponto de interrupção", + "removeBreakpoint": "Remover {0}", + "editBreakpoint": "Editar {0}...", + "disableBreakpoint": "Desabilitar {0}", + "enableBreakpoint": "Habilitar {0}", "removeBreakpoints": "Remover pontos de interrupção", "removeBreakpointOnColumn": "Remover ponto de interrupção na coluna {0}", "removeLineBreakpoint": "Remover ponto de interrupção de linha", @@ -19,6 +25,11 @@ "enableBreakpointOnLine": "Habilitar o ponto de interrupção de linha", "addBreakpoint": "Adicionar ponto de interrupção", "addConditionalBreakpoint": "Adicionar Ponto de Parada Condicional...", + "addLogPoint": "Adicione ponto Log...", + "message": "Mensagem", + "condition": "condição", + "removeLogPoint": "Remover {0}", + "disableLogPoint": "Desabilitar {0}", "cancel": "Cancelar", "addConfiguration": "Adicionar Configuração..." } \ No newline at end of file diff --git a/i18n/ptb/src/vs/workbench/parts/debug/electron-browser/debugService.i18n.json b/i18n/ptb/src/vs/workbench/parts/debug/electron-browser/debugService.i18n.json index 1551a564cda..7ae7f7f9b75 100644 --- a/i18n/ptb/src/vs/workbench/parts/debug/electron-browser/debugService.i18n.json +++ b/i18n/ptb/src/vs/workbench/parts/debug/electron-browser/debugService.i18n.json @@ -29,5 +29,6 @@ "showErrors": "Mostrar erros", "noFolderWorkspaceDebugError": "O arquivo ativo não pode ser depurado. Certifique-se de que ele está salvo no disco e que tem uma extensão de depuração instalada para esse tipo de arquivo.", "cancel": "Cancelar", + "DebugTaskNotFound": "Não foi possível encontrar a tarefa '{0}'.", "taskNotTracked": "A tarefa '{0}' não pode ser rastreada." } \ No newline at end of file diff --git a/i18n/ptb/src/vs/workbench/parts/debug/node/debugger.i18n.json b/i18n/ptb/src/vs/workbench/parts/debug/node/debugger.i18n.json index ddf29b94374..f91926ec3d7 100644 --- a/i18n/ptb/src/vs/workbench/parts/debug/node/debugger.i18n.json +++ b/i18n/ptb/src/vs/workbench/parts/debug/node/debugger.i18n.json @@ -6,6 +6,7 @@ "--------------------------------------------------------------------------------------------", "Do not edit this file. It is machine generated." ], + "launch.config.comment1": "Use o IntelliSense para aprender sobre possíveis atributos.", "launch.config.comment2": "Passe o mouse para ver as descrições dos atributos existentes.", "launch.config.comment3": "Para obter mais informações, visite: {0}", "debugType": "Tipo de configuração.", diff --git a/i18n/ptb/src/vs/workbench/parts/files/electron-browser/fileActions.i18n.json b/i18n/ptb/src/vs/workbench/parts/files/electron-browser/fileActions.i18n.json index bb320e7128c..6f4dc9047cd 100644 --- a/i18n/ptb/src/vs/workbench/parts/files/electron-browser/fileActions.i18n.json +++ b/i18n/ptb/src/vs/workbench/parts/files/electron-browser/fileActions.i18n.json @@ -24,16 +24,16 @@ "dirtyMessageFolderDelete": "Você está excluindo uma pasta com alterações não salvas em {0} arquivos. Você quer continuar?", "dirtyMessageFileDelete": "Você está excluindo um arquivo com alterações não salvas. Você quer continuar?", "dirtyWarning": "Suas alterações serão perdidas se você não salvá-las.", - "confirmMoveTrashMessageMultiple": "Você tem certeza que deseja excluir os seguintes {0} arquivos?", - "confirmMoveTrashMessageFolder": "Tem certeza de que deseja excluir '{0}' e seu conteúdo?", - "confirmMoveTrashMessageFile": "Tem certeza de que deseja excluir '{0}'?", "doNotAskAgain": "Não me pergunte novamente", - "confirmDeleteMessageMultiple": "Você tem certeza que deseja excluir permanentemente os seguintes {0} arquivos?", - "confirmDeleteMessageFolder": "Tem certeza de que deseja excluir permanentemente '{0}' e seu conteúdo?", - "confirmDeleteMessageFile": "Tem certeza de que deseja excluir permanentemente '{0}'?", "irreversible": "Esta ação é irreversível!", "deletePermanentlyButtonLabel": "&&Excluir Permanentemente", "retryButtonLabel": "&&Tentar Novamente", + "confirmMoveTrashMessageMultiple": "Você tem certeza que deseja excluir os seguintes {0} arquivos?", + "confirmMoveTrashMessageFolder": "Tem certeza de que deseja excluir '{0}' e seu conteúdo?", + "confirmMoveTrashMessageFile": "Tem certeza de que deseja excluir '{0}'?", + "confirmDeleteMessageMultiple": "Você tem certeza que deseja excluir permanentemente os seguintes {0} arquivos?", + "confirmDeleteMessageFolder": "Tem certeza de que deseja excluir permanentemente '{0}' e seu conteúdo?", + "confirmDeleteMessageFile": "Tem certeza de que deseja excluir permanentemente '{0}'?", "confirmOverwrite": "Um arquivo ou pasta com o mesmo nome já existe na pasta de destino. Você quer substituí-lo?", "replaceButtonLabel": "&&Substituir", "fileDeleted": "Arquivo para colar foi excluído ou movido no meio-tempo", diff --git a/i18n/ptb/src/vs/workbench/parts/localizations/electron-browser/localizations.contribution.i18n.json b/i18n/ptb/src/vs/workbench/parts/localizations/electron-browser/localizations.contribution.i18n.json new file mode 100644 index 00000000000..804ed1a7c8c --- /dev/null +++ b/i18n/ptb/src/vs/workbench/parts/localizations/electron-browser/localizations.contribution.i18n.json @@ -0,0 +1,23 @@ +{ + "": [ + "--------------------------------------------------------------------------------------------", + "Copyright (c) Microsoft Corporation. All rights reserved.", + "Licensed under the MIT License. See License.txt in the project root for license information.", + "--------------------------------------------------------------------------------------------", + "Do not edit this file. It is machine generated." + ], + "updateLocale": "Gostaria de alternar o idioma da interface do usuário do VS Code para {0} e reiniciar?", + "yes": "Sim", + "no": "Não", + "neverAgain": "Não mostrar novamente", + "install": "Instalar", + "JsonSchema.locale": "O idioma da interface do usuário a ser usada.", + "vscode.extension.contributes.localizations": "Contribui localizações ao editor", + "vscode.extension.contributes.localizations.languageId": "Id do idioma em que as strings de exibição estão traduzidas.", + "vscode.extension.contributes.localizations.languageName": "Nome do idioma em Inglês.", + "vscode.extension.contributes.localizations.languageNameLocalized": "Nome do idioma no idioma de contribuição.", + "vscode.extension.contributes.localizations.translations": "Lista de traduções associadas ao idioma.", + "vscode.extension.contributes.localizations.translations.id": "Id do VS Code ou Extensão para o qual essa tradução teve contribuição. Id do VS Code é sempre `vscode` e da extensão deve ser no formato `publisherId.extensionName`.", + "vscode.extension.contributes.localizations.translations.id.pattern": "Id deve ser `vscode` ou no formato `publisherId.extensionName` para traduzir VS code ou uma extensão, respectivamente.", + "vscode.extension.contributes.localizations.translations.path": "Um caminho relativo para um arquivo contendo traduções para o idioma." +} \ No newline at end of file diff --git a/i18n/ptb/src/vs/workbench/parts/localizations/electron-browser/localizationsActions.i18n.json b/i18n/ptb/src/vs/workbench/parts/localizations/electron-browser/localizationsActions.i18n.json new file mode 100644 index 00000000000..3490c90bd29 --- /dev/null +++ b/i18n/ptb/src/vs/workbench/parts/localizations/electron-browser/localizationsActions.i18n.json @@ -0,0 +1,14 @@ +{ + "": [ + "--------------------------------------------------------------------------------------------", + "Copyright (c) Microsoft Corporation. All rights reserved.", + "Licensed under the MIT License. See License.txt in the project root for license information.", + "--------------------------------------------------------------------------------------------", + "Do not edit this file. It is machine generated." + ], + "configureLocale": "Configurar Idioma", + "displayLanguage": "Define o idioma de exibição do VSCode.", + "doc": "Veja {0} para obter uma lista dos idiomas suportados.", + "restart": "Modificar o valor requer reinicialização do VSCode.", + "fail.createSettings": "Não foi possível criar '{0}' ({1})." +} \ No newline at end of file diff --git a/i18n/ptb/src/vs/workbench/parts/update/electron-browser/update.i18n.json b/i18n/ptb/src/vs/workbench/parts/update/electron-browser/update.i18n.json index 0f2f852e685..0fbbffad2c1 100644 --- a/i18n/ptb/src/vs/workbench/parts/update/electron-browser/update.i18n.json +++ b/i18n/ptb/src/vs/workbench/parts/update/electron-browser/update.i18n.json @@ -18,8 +18,10 @@ "thereIsUpdateAvailable": "Há uma atualização disponível.", "download now": "Baixar agora", "later": "Mais tarde", + "updateAvailable": "Há uma atualização disponível: {0} {1}", "installUpdate": "Instalar Atualização", "updateInstalling": "{0} {1} está sendo instalado no plano de fundo, nós te avisaremos quando estiver pronto.", + "updateAvailableAfterRestart": "Reinicie o {0} para aplicar a atualização mais recente.", "updateNow": "Atualizar Agora", "commandPalette": "Paleta de comandos...", "settings": "Configurações", diff --git a/i18n/ptb/src/vs/workbench/parts/url/electron-browser/url.contribution.i18n.json b/i18n/ptb/src/vs/workbench/parts/url/electron-browser/url.contribution.i18n.json new file mode 100644 index 00000000000..549c77a4531 --- /dev/null +++ b/i18n/ptb/src/vs/workbench/parts/url/electron-browser/url.contribution.i18n.json @@ -0,0 +1,11 @@ +{ + "": [ + "--------------------------------------------------------------------------------------------", + "Copyright (c) Microsoft Corporation. All rights reserved.", + "Licensed under the MIT License. See License.txt in the project root for license information.", + "--------------------------------------------------------------------------------------------", + "Do not edit this file. It is machine generated." + ], + "openUrl": "Abrir URL", + "developer": "Desenvolvedor" +} \ No newline at end of file diff --git a/i18n/ptb/src/vs/workbench/parts/welcome/gettingStarted/electron-browser/telemetryOptOut.i18n.json b/i18n/ptb/src/vs/workbench/parts/welcome/gettingStarted/electron-browser/telemetryOptOut.i18n.json index 960ae0c5c98..69d43b6f302 100644 --- a/i18n/ptb/src/vs/workbench/parts/welcome/gettingStarted/electron-browser/telemetryOptOut.i18n.json +++ b/i18n/ptb/src/vs/workbench/parts/welcome/gettingStarted/electron-browser/telemetryOptOut.i18n.json @@ -6,5 +6,7 @@ "--------------------------------------------------------------------------------------------", "Do not edit this file. It is machine generated." ], + "telemetryOptOut.optOutNotice": "Ajude a melhorar o VS Code permitindo que a Microsoft colete dados de uso. Leia nossa [política de privacidade]({0}) e saiba como [optar por sair]({1}).", + "telemetryOptOut.optInNotice": "Ajude a melhorar o VS Code permitindo que a Microsoft colete dados de uso. Leia nossa [política de privacidade]({0}) e saiba como [optar por isso]({1}).", "telemetryOptOut.readMore": "Ler Mais" } \ No newline at end of file diff --git a/i18n/ptb/src/vs/workbench/services/configurationResolver/node/variableResolver.i18n.json b/i18n/ptb/src/vs/workbench/services/configurationResolver/node/variableResolver.i18n.json new file mode 100644 index 00000000000..35229bd6699 --- /dev/null +++ b/i18n/ptb/src/vs/workbench/services/configurationResolver/node/variableResolver.i18n.json @@ -0,0 +1,9 @@ +{ + "": [ + "--------------------------------------------------------------------------------------------", + "Copyright (c) Microsoft Corporation. All rights reserved.", + "Licensed under the MIT License. See License.txt in the project root for license information.", + "--------------------------------------------------------------------------------------------", + "Do not edit this file. It is machine generated." + ] +} \ No newline at end of file diff --git a/i18n/ptb/src/vs/workbench/services/textMate/electron-browser/TMGrammars.i18n.json b/i18n/ptb/src/vs/workbench/services/textMate/electron-browser/TMGrammars.i18n.json index a564a24d6c4..c681b9ec189 100644 --- a/i18n/ptb/src/vs/workbench/services/textMate/electron-browser/TMGrammars.i18n.json +++ b/i18n/ptb/src/vs/workbench/services/textMate/electron-browser/TMGrammars.i18n.json @@ -11,5 +11,6 @@ "vscode.extension.contributes.grammars.scopeName": "Nome do escopo Textmate usado pelo arquivo tmLanguage.", "vscode.extension.contributes.grammars.path": "Caminho para o arquivo tmLanguage. O caminho é relativo a pasta da extensão e geralmente começa com './syntaxes/'.", "vscode.extension.contributes.grammars.embeddedLanguages": "Um mapeamento no nome do escopo para o Id da linguagem se esta gramática contenha linguagens embutidas.", + "vscode.extension.contributes.grammars.tokenTypes": "Um mapa do nome do escopo para tipos de token.", "vscode.extension.contributes.grammars.injectTo": "Lista de nomes de escopos de linguagem aos quais esta gramática é injetada." } \ No newline at end of file diff --git a/i18n/ptb/src/vs/workbench/services/themes/common/colorThemeSchema.i18n.json b/i18n/ptb/src/vs/workbench/services/themes/common/colorThemeSchema.i18n.json index a1c9ed8158f..76671d7901f 100644 --- a/i18n/ptb/src/vs/workbench/services/themes/common/colorThemeSchema.i18n.json +++ b/i18n/ptb/src/vs/workbench/services/themes/common/colorThemeSchema.i18n.json @@ -10,6 +10,7 @@ "schema.token.foreground": "Cor do primeiro plano para o token.", "schema.token.background.warning": "Atualmente as cores de fundo do token não são suportadas.", "schema.token.fontStyle": "Estilo da fonte da regra: 'itálico', 'negrito', 'sublinhado' ou uma combinação. Cadeia de caracteres vazia desfaz configurações herdadas.", + "schema.fontStyle.error": "O estilo da fonte deve ser 'itálico', 'negrito' ou 'sublinhado', uma combinação ou cadeia de caracteres vazia.", "schema.token.fontStyle.none": "Nenhum (limpar estilo herdado)", "schema.properties.name": "Descrição da regra.", "schema.properties.scope": "Seletor de escopo que bate com esta regra.", diff --git a/i18n/rus/extensions/emmet/package.i18n.json b/i18n/rus/extensions/emmet/package.i18n.json index c6570b949da..8afc68af2e9 100644 --- a/i18n/rus/extensions/emmet/package.i18n.json +++ b/i18n/rus/extensions/emmet/package.i18n.json @@ -59,5 +59,6 @@ "emmetPreferencesCssMozProperties": "Разделенный запятыми список свойств CSS, которые получают префикс разработчика \"moz\" при использовании в сокращениях Emmet, которые начинаются с \"-\". Чтобы префикс \"moz\" никогда не подставлялся, установите в качестве этого параметра пустое значение. ", "emmetPreferencesCssOProperties": "Разделенный запятыми список свойств CSS, которые получают префикс разработчика \"o\" при использовании в сокращениях Emmet, которые начинаются с \"-\". Чтобы префикс \"o\" никогда не подставлялся, установите в качестве этого параметра пустое значение. ", "emmetPreferencesCssMsProperties": "Разделенный запятыми список свойств CSS, которые получают префикс разработчика \"ms\" при использовании в сокращениях Emmet, которые начинаются с \"-\". Чтобы префикс \"ms\" никогда не подставлялся, установите в качестве этого параметра пустое значение. ", - "emmetPreferencesCssFuzzySearchMinScore": "Минимальное количество очков для нечеткого соответствия сокращения (от 0 до 1). При указании более низких значений возможно увеличение числа ложных срабатываний, при указании более высоких значений - уменьшение числа возможных соответствий." + "emmetPreferencesCssFuzzySearchMinScore": "Минимальное количество очков для нечеткого соответствия сокращения (от 0 до 1). При указании более низких значений возможно увеличение числа ложных срабатываний, при указании более высоких значений - уменьшение числа возможных соответствий.", + "emmetOptimizeStylesheetParsing": "Если значение равно false, весь файл анализируется для определения, является ли текущая позиция допустимой для расширения сокращений Emmet. Когда присвоено значение true, только содержимое вокруг текущей позиции в файлах css/scss/less подвергается синтаксическому анализу." } \ No newline at end of file diff --git a/i18n/rus/extensions/npm/out/npmView.i18n.json b/i18n/rus/extensions/npm/out/npmView.i18n.json new file mode 100644 index 00000000000..35229bd6699 --- /dev/null +++ b/i18n/rus/extensions/npm/out/npmView.i18n.json @@ -0,0 +1,9 @@ +{ + "": [ + "--------------------------------------------------------------------------------------------", + "Copyright (c) Microsoft Corporation. All rights reserved.", + "Licensed under the MIT License. See License.txt in the project root for license information.", + "--------------------------------------------------------------------------------------------", + "Do not edit this file. It is machine generated." + ] +} \ No newline at end of file diff --git a/i18n/rus/extensions/npm/out/tasks.i18n.json b/i18n/rus/extensions/npm/out/tasks.i18n.json new file mode 100644 index 00000000000..df41ba3c218 --- /dev/null +++ b/i18n/rus/extensions/npm/out/tasks.i18n.json @@ -0,0 +1,10 @@ +{ + "": [ + "--------------------------------------------------------------------------------------------", + "Copyright (c) Microsoft Corporation. All rights reserved.", + "Licensed under the MIT License. See License.txt in the project root for license information.", + "--------------------------------------------------------------------------------------------", + "Do not edit this file. It is machine generated." + ], + "npm.parseError": "Определение задач npm: не удалось проанализировать файл {0} " +} \ No newline at end of file diff --git a/i18n/rus/extensions/npm/package.i18n.json b/i18n/rus/extensions/npm/package.i18n.json index 1d335e1d832..667c4b2fe28 100644 --- a/i18n/rus/extensions/npm/package.i18n.json +++ b/i18n/rus/extensions/npm/package.i18n.json @@ -14,5 +14,8 @@ "config.npm.exclude": "Настройте стандартные маски для папок, которые должны быть обработаны с помощью автоматического определения сценария.", "npm.parseError": "Определение задач npm: не удалось проанализировать файл {0}", "taskdef.script": "Скрипт npm для изменения.", - "taskdef.path": "Путь к папке с файлом package.json, который содержит сценарий. Можно опустить." + "taskdef.path": "Путь к папке с файлом package.json, который содержит сценарий. Можно опустить.", + "command.refresh": "Обновить", + "command.debug": "Отладка", + "command.openScript": "Открыть" } \ No newline at end of file diff --git a/i18n/rus/src/vs/code/electron-main/menus.i18n.json b/i18n/rus/src/vs/code/electron-main/menus.i18n.json index eadf56cd717..c3ddca62e92 100644 --- a/i18n/rus/src/vs/code/electron-main/menus.i18n.json +++ b/i18n/rus/src/vs/code/electron-main/menus.i18n.json @@ -9,8 +9,8 @@ "mFile": "&&Файл", "mEdit": "&&Правка", "mSelection": "&&Выделение", - "mView": "&&Вид", - "mGoto": "&&Перейти", + "mView": "В&&ид", + "mGoto": "Перей&&ти", "mDebug": "&&Отладка", "mWindow": "Окно", "mHelp": "&&Справка", diff --git a/i18n/rus/src/vs/editor/common/config/commonEditorConfig.i18n.json b/i18n/rus/src/vs/editor/common/config/commonEditorConfig.i18n.json index 9ae0f49c855..6ddcb60bb18 100644 --- a/i18n/rus/src/vs/editor/common/config/commonEditorConfig.i18n.json +++ b/i18n/rus/src/vs/editor/common/config/commonEditorConfig.i18n.json @@ -16,7 +16,6 @@ "lineNumbers.on": "Отображаются абсолютные номера строк.", "lineNumbers.relative": "Отображаемые номера строк вычисляются как расстояние в строках до положения курсора.", "lineNumbers.interval": "Номера строк отображаются каждые 10 строк.", - "lineNumbers": "Управляет отображением номеров строк. Возможные значения: 'on', 'off', 'relative' и 'interval'.", "rulers": "Отображать вертикальные линейки после определенного числа моноширинных символов. Для отображения нескольких линеек укажите несколько значений. Если не указано ни одного значения, вертикальные линейки отображаться не будут.", "wordSeparators": "Символы, которые будут использоваться как разделители слов при выполнении навигации или других операций, связанных со словами.", "tabSize": "Число пробелов в табуляции. Этот параметр переопределяется на основе содержимого файла, если установлен параметр \"editor.detectIndentation\".", @@ -28,8 +27,7 @@ "scrollBeyondLastLine": "Определяет, будет ли содержимое редактора прокручиваться за последнюю строку.", "smoothScrolling": "Определяет, будет ли использоваться анимация при прокрутке содержимого редактора", "minimap.enabled": "Определяет, отображается ли мини-карта", - "minimap.side": "Определяет, с какой стороны будет отображаться мини-карта. Возможные значения: \"right\" и \"left\"", - "minimap.showSlider": "Определяет, будет ли автоматически скрываться ползунок мини-карты. Возможные значения: 'always' (всегда) и 'mouseover' (при наведении курсора мыши)", + "minimap.showSlider": "Определяет, будет ли автоматически скрываться ползунок мини-карты", "minimap.renderCharacters": "Отображает фактические символы в строке вместо цветных блоков.", "minimap.maxColumn": "Ограничивает ширину мини-карты для отображения числа столбцов не больше определенного.", "find.seedSearchStringFromSelection": "Определяет, можно ли передать строку поиска в мини-приложение поиска из текста, выделенного в редакторе", @@ -76,7 +74,6 @@ "occurrencesHighlight": "Определяет, должен ли редактор выделять экземпляры семантических символов.", "overviewRulerLanes": "Определяет, сколько украшений могут отображаться на одном месте в обзорной линейке.", "overviewRulerBorder": "Определяет, следует ли рисовать границу на обзорной линейке.", - "cursorBlinking": "Управляет стилем анимации курсора. Допустимые значения: \"blink\", \"smooth\", \"phase\", \"expand\" и \"solid\"", "mouseWheelZoom": "Изменение размера шрифта в редакторе при нажатой клавише CTRL и движении колесика мыши", "cursorStyle": "Определяет стиль курсора. Допустимые значения: \"block\", \"block-outline\", \"line\", \"line-thin\", \"underline\" и \"underline-thin\"", "cursorWidth": "Управляет шириной курсора, когда для параметра editor.cursorStyle установлено значение 'line'", @@ -86,7 +83,6 @@ "renderControlCharacters": "Определяет, должны ли в редакторе отображаться управляющие символы.", "renderIndentGuides": "Определяет, должны ли в редакторе отображаться направляющие отступа.", "renderLineHighlight": "Определяет, должен ли редактор выделять текущую строку. Возможные значения: none, gutter, line и all.", - "codeLens": "Управляет показом групп связанных элементов кода в редакторе", "folding": "Определяет, включено ли сворачивание кода в редакторе.", "showFoldingControls": "Определяет, будут ли автоматически скрываться элементы управления свертыванием на полях.", "matchBrackets": "Выделяет соответствующие скобки при выборе одной из них.", diff --git a/i18n/rus/src/vs/platform/environment/node/argv.i18n.json b/i18n/rus/src/vs/platform/environment/node/argv.i18n.json index d214cf140db..da140596e53 100644 --- a/i18n/rus/src/vs/platform/environment/node/argv.i18n.json +++ b/i18n/rus/src/vs/platform/environment/node/argv.i18n.json @@ -22,7 +22,6 @@ "showVersions": "Показать версии установленных расширений при указании параметра --list-extension.", "installExtension": "Устанавливает расширение.", "uninstallExtension": "Удаляет расширение.", - "experimentalApis": "Включает предложенные функции API для расширения.", "verbose": "Печать подробного вывода (подразумевает использование параметра \"--wait\").", "log": "Используемый уровень ведения журнала. Значение по умолчанию — \"info\". Допустимые значения: \"critical\", \"error\", \"warn\", \"info\", \"debug\", \"trace\", \"off\".", "status": "Выводить сведения об использовании процесса и диагностическую информацию.", diff --git a/i18n/rus/src/vs/platform/theme/common/colorRegistry.i18n.json b/i18n/rus/src/vs/platform/theme/common/colorRegistry.i18n.json index 681bcf8d8ed..3df40ef2fa2 100644 --- a/i18n/rus/src/vs/platform/theme/common/colorRegistry.i18n.json +++ b/i18n/rus/src/vs/platform/theme/common/colorRegistry.i18n.json @@ -29,7 +29,6 @@ "inputPlaceholderForeground": "Цвет фона поясняющего текста в элементе ввода.", "inputValidationInfoBackground": "Фоновый цвет проверки ввода для уровня серьезности \"Сведения\".", "inputValidationInfoBorder": "Цвет границы проверки ввода для уровня серьезности \"Сведения\".", - "inputValidationWarningBackground": "Фоновый цвет проверки ввода для уровня серьезности \"Предупреждение\".", "inputValidationWarningBorder": "Цвет границы проверки ввода для уровня серьезности \"Предупреждение\".", "inputValidationErrorBackground": "Фоновый цвет проверки ввода для уровня серьезности \"Ошибка\".", "inputValidationErrorBorder": "Цвет границы проверки ввода для уровня серьезности \"Ошибка\".", @@ -71,10 +70,8 @@ "editorSelectionHighlightBorder": "Цвет границы регионов с тем же содержимым, что и в выделении.", "editorFindMatch": "Цвет текущего поиска совпадений.", "findMatchHighlight": "Цвет для других результатов поиска. Цвет должен быть прозрачным, чтобы не перекрывать основные знаки отличия.", - "findRangeHighlight": "Выделите диапазон для ограничения поиска. Цвет должен быть прозрачным, чтобы не перекрывать основные знаки отличия.", "editorFindMatchBorder": "Цвет границы текущего результата поиска.", "findMatchHighlightBorder": "Цвет границы других результатов поиска.", - "findRangeHighlightBorder": "Цвет границы диапазона для ограничения поиска. Цвет должен быть прозрачным, чтобы не перекрывать основные знаки отличия.", "hoverHighlight": "Выделение под словом, для которого показано наведение. Цвет должен быть прозрачным, чтобы не перекрывать основные знаки отличия.", "hoverBackground": "Цвет фона при наведении указателя на редактор.", "hoverBorder": "Цвет границ при наведении указателя на редактор.", @@ -88,7 +85,6 @@ "mergeIncomingHeaderBackground": "Фон измененного заголовка при конфликтах встроенного слияния. Цвет должен быть прозрачным, чтобы не перекрывать основные знаки отличия.", "mergeIncomingContentBackground": "Фон измененного содержания при конфликтах встроенного слияния. Цвет должен быть прозрачным, чтобы не перекрывать основные знаки отличия.", "mergeCommonHeaderBackground": "Фон заголовка для общего предшественника при конфликтах внутреннего слияния. Цвет должен быть прозрачным, чтобы не перекрывать основные знаки отличия.", - "mergeCommonContentBackground": "Фон содержания общего предшественника при конфликтах внутреннего слияния. Цвет должен быть прозрачным, чтобы не перекрывать основные знаки отличия.", "mergeBorder": "Цвет границы заголовков и разделителя во внутренних конфликтах слияния.", "overviewRulerCurrentContentForeground": "Цвет переднего плана линейки текущего окна во внутренних конфликтах слияния.", "overviewRulerIncomingContentForeground": "Цвет переднего плана линейки входящего окна во внутренних конфликтах слияния.", diff --git a/i18n/rus/src/vs/platform/url/electron-browser/inactiveExtensionUrlHandler.i18n.json b/i18n/rus/src/vs/platform/url/electron-browser/inactiveExtensionUrlHandler.i18n.json new file mode 100644 index 00000000000..35229bd6699 --- /dev/null +++ b/i18n/rus/src/vs/platform/url/electron-browser/inactiveExtensionUrlHandler.i18n.json @@ -0,0 +1,9 @@ +{ + "": [ + "--------------------------------------------------------------------------------------------", + "Copyright (c) Microsoft Corporation. All rights reserved.", + "Licensed under the MIT License. See License.txt in the project root for license information.", + "--------------------------------------------------------------------------------------------", + "Do not edit this file. It is machine generated." + ] +} \ No newline at end of file diff --git a/i18n/rus/src/vs/workbench/api/browser/viewsExtensionPoint.i18n.json b/i18n/rus/src/vs/workbench/api/browser/viewsExtensionPoint.i18n.json index ea28349cd88..823516db715 100644 --- a/i18n/rus/src/vs/workbench/api/browser/viewsExtensionPoint.i18n.json +++ b/i18n/rus/src/vs/workbench/api/browser/viewsExtensionPoint.i18n.json @@ -13,8 +13,6 @@ "vscode.extension.contributes.view.name": "Понятное имя представления. Будет отображаться на экране", "vscode.extension.contributes.view.when": "Условие, которое должно иметь значение 'true', чтобы отображалось это представление", "vscode.extension.contributes.views": "Добавляет представления в редактор", - "views.explorer": "Представление проводника", - "views.debug": "Представление отладки", "duplicateView1": "Не удается зарегистрировать несколько представлений с одинаковым идентификатором '{0}' в расположении '{1}'", "duplicateView2": "Представление с идентификатором '{0}' уже зарегистрировано в расположении '{1}'" } \ No newline at end of file diff --git a/i18n/rus/src/vs/workbench/browser/parts/quickinput/quickInput.i18n.json b/i18n/rus/src/vs/workbench/browser/parts/quickinput/quickInput.i18n.json index c7537efab64..4fd7b9c3cf9 100644 --- a/i18n/rus/src/vs/workbench/browser/parts/quickinput/quickInput.i18n.json +++ b/i18n/rus/src/vs/workbench/browser/parts/quickinput/quickInput.i18n.json @@ -6,5 +6,7 @@ "--------------------------------------------------------------------------------------------", "Do not edit this file. It is machine generated." ], + "inputModeEntryDescription": "{0} (нажмите клавишу ВВОД, чтобы подтвердить введенные данные, или ESCAPE для отмены)", + "inputModeEntry": "Нажмите клавишу ВВОД, чтобы подтвердить введенные данные, или ESCAPE для отмены", "ok": "ОК" } \ No newline at end of file diff --git a/i18n/rus/src/vs/workbench/parts/files/electron-browser/fileActions.i18n.json b/i18n/rus/src/vs/workbench/parts/files/electron-browser/fileActions.i18n.json index e5c218fb1d5..861f3074111 100644 --- a/i18n/rus/src/vs/workbench/parts/files/electron-browser/fileActions.i18n.json +++ b/i18n/rus/src/vs/workbench/parts/files/electron-browser/fileActions.i18n.json @@ -24,20 +24,20 @@ "dirtyMessageFolderDelete": "Вы удаляете папку с несохраненными изменениями в нескольких файлах ({0}). Вы хотите продолжить?", "dirtyMessageFileDelete": "Вы удаляете файл с несохраненными изменениями. Вы хотите продолжить?", "dirtyWarning": "Если не сохранить изменения, они будут утеряны.", - "confirmMoveTrashMessageMultiple": "Вы действительно хотите удалить следующие файлы ({0})?", - "confirmMoveTrashMessageFolder": "Вы действительно хотите удалить папку \"{0}\" и ее содержимое?", - "confirmMoveTrashMessageFile": "Вы действительно хотите удалить \"{0}\"?", "undoBin": "Вы можете выполнить восстановление из корзины.", "undoTrash": "Вы можете выполнить восстановление из корзины.", "doNotAskAgain": "Больше не спрашивать", - "confirmDeleteMessageMultiple": "Вы действительно хотите удалить следующие файлы ({0}) без возможности восстановления?", - "confirmDeleteMessageFolder": "Вы действительно хотите удалить папку \"{0}\" и ее содержимое без возможности восстановления?", - "confirmDeleteMessageFile": "Вы действительно хотите удалить \"{0}\" без возможности восстановления?", "irreversible": "Это действие необратимо.", "binFailed": "Не удалось выполнить удаление в корзину. Вы хотите выполнить удаление навсегда?", "trashFailed": "Не удалось выполнить удаление в корзину. Вы действительно хотите выполнить удаление навсегда?", "deletePermanentlyButtonLabel": "&&Удалить навсегда", "retryButtonLabel": "&&Повторить", + "confirmMoveTrashMessageMultiple": "Вы действительно хотите удалить следующие файлы ({0})?", + "confirmMoveTrashMessageFolder": "Вы действительно хотите удалить папку \"{0}\" и ее содержимое?", + "confirmMoveTrashMessageFile": "Вы действительно хотите удалить \"{0}\"?", + "confirmDeleteMessageMultiple": "Вы действительно хотите удалить следующие файлы ({0}) без возможности восстановления?", + "confirmDeleteMessageFolder": "Вы действительно хотите удалить папку \"{0}\" и ее содержимое без возможности восстановления?", + "confirmDeleteMessageFile": "Вы действительно хотите удалить \"{0}\" без возможности восстановления?", "confirmOverwrite": "Файл или папка с таким именем уже существует в конечной папке. Заменить их?", "replaceButtonLabel": "Заменить", "fileIsAncestor": "Файл для вставки является предком папки назначения", diff --git a/i18n/rus/src/vs/workbench/parts/localizations/electron-browser/localizations.contribution.i18n.json b/i18n/rus/src/vs/workbench/parts/localizations/electron-browser/localizations.contribution.i18n.json new file mode 100644 index 00000000000..06cc07ec6c8 --- /dev/null +++ b/i18n/rus/src/vs/workbench/parts/localizations/electron-browser/localizations.contribution.i18n.json @@ -0,0 +1,23 @@ +{ + "": [ + "--------------------------------------------------------------------------------------------", + "Copyright (c) Microsoft Corporation. All rights reserved.", + "Licensed under the MIT License. See License.txt in the project root for license information.", + "--------------------------------------------------------------------------------------------", + "Do not edit this file. It is machine generated." + ], + "updateLocale": "Вы хотели бы изменить язык пользовательского интерфейса VS Code на {0} и перезапустить VS Code?", + "yes": "Да", + "no": "Нет", + "neverAgain": "Больше не показывать", + "install": "Установить", + "JsonSchema.locale": "Язык пользовательского интерфейса.", + "vscode.extension.contributes.localizations": "Добавляет локализации в редактор", + "vscode.extension.contributes.localizations.languageId": "Идентификатор языка, на который будут переведены отображаемые строки.", + "vscode.extension.contributes.localizations.languageName": "Название языка на английском языке.", + "vscode.extension.contributes.localizations.languageNameLocalized": "Название языка на предоставленном языке.", + "vscode.extension.contributes.localizations.translations": "Список переводов, связанных с языком.", + "vscode.extension.contributes.localizations.translations.id": "Идентификатор VS Code или расширения, для которого предоставляется этот перевод. Идентификатор VS Code всегда имеет формат \"vscode\", а идентификатор расширения должен иметь формат \"publisherId.extensionName\".", + "vscode.extension.contributes.localizations.translations.id.pattern": "Идентификатор должен иметь формат \"vscode\" или \"publisherId.extensionName\" для перевода VS Code или расширения соответственно.", + "vscode.extension.contributes.localizations.translations.path": "Относительный путь к файлу, содержащему переводы для языка." +} \ No newline at end of file diff --git a/i18n/rus/src/vs/workbench/parts/localizations/electron-browser/localizationsActions.i18n.json b/i18n/rus/src/vs/workbench/parts/localizations/electron-browser/localizationsActions.i18n.json new file mode 100644 index 00000000000..d4a882b6b25 --- /dev/null +++ b/i18n/rus/src/vs/workbench/parts/localizations/electron-browser/localizationsActions.i18n.json @@ -0,0 +1,14 @@ +{ + "": [ + "--------------------------------------------------------------------------------------------", + "Copyright (c) Microsoft Corporation. All rights reserved.", + "Licensed under the MIT License. See License.txt in the project root for license information.", + "--------------------------------------------------------------------------------------------", + "Do not edit this file. It is machine generated." + ], + "configureLocale": "Настроить язык", + "displayLanguage": "Определяет язык интерфейса VSCode.", + "doc": "Список поддерживаемых языков см. в {0}.", + "restart": "Для изменения значения требуется перезапуск VSCode.", + "fail.createSettings": "Невозможно создать \"{0}\" ({1})." +} \ No newline at end of file diff --git a/i18n/rus/src/vs/workbench/parts/url/electron-browser/url.contribution.i18n.json b/i18n/rus/src/vs/workbench/parts/url/electron-browser/url.contribution.i18n.json new file mode 100644 index 00000000000..e4db582c42e --- /dev/null +++ b/i18n/rus/src/vs/workbench/parts/url/electron-browser/url.contribution.i18n.json @@ -0,0 +1,10 @@ +{ + "": [ + "--------------------------------------------------------------------------------------------", + "Copyright (c) Microsoft Corporation. All rights reserved.", + "Licensed under the MIT License. See License.txt in the project root for license information.", + "--------------------------------------------------------------------------------------------", + "Do not edit this file. It is machine generated." + ], + "developer": "Разработчик" +} \ No newline at end of file diff --git a/i18n/rus/src/vs/workbench/services/configurationResolver/node/variableResolver.i18n.json b/i18n/rus/src/vs/workbench/services/configurationResolver/node/variableResolver.i18n.json new file mode 100644 index 00000000000..35229bd6699 --- /dev/null +++ b/i18n/rus/src/vs/workbench/services/configurationResolver/node/variableResolver.i18n.json @@ -0,0 +1,9 @@ +{ + "": [ + "--------------------------------------------------------------------------------------------", + "Copyright (c) Microsoft Corporation. All rights reserved.", + "Licensed under the MIT License. See License.txt in the project root for license information.", + "--------------------------------------------------------------------------------------------", + "Do not edit this file. It is machine generated." + ] +} \ No newline at end of file diff --git a/i18n/trk/extensions/npm/out/npmView.i18n.json b/i18n/trk/extensions/npm/out/npmView.i18n.json new file mode 100644 index 00000000000..35229bd6699 --- /dev/null +++ b/i18n/trk/extensions/npm/out/npmView.i18n.json @@ -0,0 +1,9 @@ +{ + "": [ + "--------------------------------------------------------------------------------------------", + "Copyright (c) Microsoft Corporation. All rights reserved.", + "Licensed under the MIT License. See License.txt in the project root for license information.", + "--------------------------------------------------------------------------------------------", + "Do not edit this file. It is machine generated." + ] +} \ No newline at end of file diff --git a/i18n/trk/extensions/npm/out/tasks.i18n.json b/i18n/trk/extensions/npm/out/tasks.i18n.json new file mode 100644 index 00000000000..30e9e07e3ad --- /dev/null +++ b/i18n/trk/extensions/npm/out/tasks.i18n.json @@ -0,0 +1,10 @@ +{ + "": [ + "--------------------------------------------------------------------------------------------", + "Copyright (c) Microsoft Corporation. All rights reserved.", + "Licensed under the MIT License. See License.txt in the project root for license information.", + "--------------------------------------------------------------------------------------------", + "Do not edit this file. It is machine generated." + ], + "npm.parseError": "Npm görev algılama: {0} dosyası ayrıştırılamadı" +} \ No newline at end of file diff --git a/i18n/trk/extensions/npm/package.i18n.json b/i18n/trk/extensions/npm/package.i18n.json index 12bf174d1ff..806970ea348 100644 --- a/i18n/trk/extensions/npm/package.i18n.json +++ b/i18n/trk/extensions/npm/package.i18n.json @@ -14,5 +14,9 @@ "config.npm.exclude": "Otomatik betik algılamadan hariç tutulacak klasörler için glob desenlerini yapılandırın.", "npm.parseError": "Npm görev algılama: {0} dosyası ayrıştırılamadı", "taskdef.script": "Özelleştirilecek npm betiği.", - "taskdef.path": "Betiği sağlayan package.json dosyasını içeren klasör yolu. Atlanabilir." + "taskdef.path": "Betiği sağlayan package.json dosyasını içeren klasör yolu. Atlanabilir.", + "command.refresh": "Yenile", + "command.run": "Çalıştır", + "command.debug": "Hata Ayıklama", + "command.openScript": "Aç" } \ No newline at end of file diff --git a/i18n/trk/src/vs/editor/common/config/commonEditorConfig.i18n.json b/i18n/trk/src/vs/editor/common/config/commonEditorConfig.i18n.json index a5bd635fbcf..8ef3a74cede 100644 --- a/i18n/trk/src/vs/editor/common/config/commonEditorConfig.i18n.json +++ b/i18n/trk/src/vs/editor/common/config/commonEditorConfig.i18n.json @@ -16,7 +16,6 @@ "lineNumbers.on": "Satır numaraları mutlak sayı olarak gösterilir.", "lineNumbers.relative": "Satır numaraları imlecin konumuna olan uzaklık olarak gösterilir.", "lineNumbers.interval": "Satır numaraları her 10 satırda bir gösterilir.", - "lineNumbers": "Satır numaralarının görüntülenmesini denetler. Olası değerler 'on', 'off', 'relative' ve 'interval'dir.\n", "rulers": "Belirli bir eşit genişlikli karakterlerden sonra dikey cetveller göster. Birden çok cetvel için birden çok değer kullanın. Dizi boş ise cetvel gösterilmez", "wordSeparators": "Sözcüklerle ilgili gezinti veya işlem yaparken kelime ayırıcı olarak kullanılacak karakterler", "tabSize": "Bir sekmenin eşit olduğu boşluk sayısı. Bu ayar, `editor.detectIndentation` açıkken dosya içeriğine bağlı olarak geçersiz kılınır.", @@ -28,8 +27,7 @@ "scrollBeyondLastLine": "Düzenleyicinin son satırın ötesine ilerleyip ilerlemeyeceğini denetler", "smoothScrolling": "Düzenleyicinin bir animasyon kullanarak kaydırıp kaydırmayacağını denetler", "minimap.enabled": "Mini haritanın gösterilip gösterilmeyeceğini denetler", - "minimap.side": "Mini haritanın görüntüleneceği tarafı denetler. Olası değerler 'right' ve 'left'tir", - "minimap.showSlider": "Mini harita kaydıracının otomatik olarak gizlenip gizlenmeyeceğini denetler. Alabileceği değerler 'always' ve 'mouseover'dır.", + "minimap.showSlider": "Mini harita kaydıracının otomatik olarak gizlenip gizlenmeyeceğini denetler.", "minimap.renderCharacters": "(Renk blokları yerine) Bir satırdaki gerçek harfleri göster", "minimap.maxColumn": "Hazırlanacak mini haritanın azami genişliğini belirli sayıda sütunla sınırla", "find.seedSearchStringFromSelection": "Bulma Araç Çubuğu'ndaki arama metninin, düzenleyicideki seçili alandan beslenmesini denetler", @@ -76,7 +74,6 @@ "occurrencesHighlight": "Düzenleyicinin semantik sembol tekrarlamalarını vurgulayıp vurgulamayacağını denetler", "overviewRulerLanes": "Genel bakış cetvelinde aynı konumda gösterilebilecek süsleme sayısını denetler", "overviewRulerBorder": "Genel bakış cetvelinin etrafına bir kenarlık çizilmesi gerekip gerekmediğini denetler.", - "cursorBlinking": "İmleç animasyon stilini denetler, olası değerler 'blink', 'smooth', 'phase', 'expand' ve 'solid'dir", "mouseWheelZoom": "Ctrl tuşuna basarken fare tekerleği ile düzenleyici yazı tipini yakınlaştırın", "cursorStyle": "İmleç stilini denetler, kabul edilen değerler: 'block', 'block-outline', 'line', 'line-thin', 'underline' ve 'underline-thin'", "cursorWidth": "editor.cursorStyle, 'line' olarak ayarlandığında imlecin genişliğini denetler", @@ -86,7 +83,6 @@ "renderControlCharacters": "Düzenleyicinin kontrol karakterlerini gösterip göstermemesini denetler", "renderIndentGuides": "Düzenleyicinin girinti kılavuzlarını gösterip göstermemesini denetler", "renderLineHighlight": "Düzenleyicinin geçerli satır vurgusunu nasıl göstereceğini denetler, seçenekler: 'none', 'gutter', 'line', ve 'all'.", - "codeLens": "Düzenleyicinin kod objektiflerini gösterip göstermediğini denetler", "folding": "Düzenleyicide kod katlamanın etkin olup olmadığını denetler", "showFoldingControls": "Oluktaki kat kontrollerinin otomatik olarak gizlenip gizlenmeyeceğini denetler.", "matchBrackets": "Eşleşen ayraçları, onlardan biri seçildiğinde vurgula.", diff --git a/i18n/trk/src/vs/platform/environment/node/argv.i18n.json b/i18n/trk/src/vs/platform/environment/node/argv.i18n.json index 66361e3eb27..990899fc55d 100644 --- a/i18n/trk/src/vs/platform/environment/node/argv.i18n.json +++ b/i18n/trk/src/vs/platform/environment/node/argv.i18n.json @@ -22,7 +22,6 @@ "showVersions": "--list-extensions'u kullanırken, yüklü eklentilerin sürümlerini gösterir.", "installExtension": "Bir eklenti yükler.", "uninstallExtension": "Bir eklentiyi kaldırır.", - "experimentalApis": "Bir eklenti için önerilen API özelliklerini etkinleştirir.", "verbose": "Ayrıntılı çıktı oluştur (--wait anlamına gelir).", "log": "Kullanılacak günlüğe yazma düzeyi. Varsayılan değer 'info'dur. İzin verilen değerler 'critical', 'error', 'warn', 'info', 'debug', 'trace', 'off' şeklindedir.", "status": "İşlem kullanımını ve tanılama bilgilerini yazdır.", diff --git a/i18n/trk/src/vs/platform/theme/common/colorRegistry.i18n.json b/i18n/trk/src/vs/platform/theme/common/colorRegistry.i18n.json index 4b0f1b56d92..584c401d554 100644 --- a/i18n/trk/src/vs/platform/theme/common/colorRegistry.i18n.json +++ b/i18n/trk/src/vs/platform/theme/common/colorRegistry.i18n.json @@ -29,7 +29,6 @@ "inputPlaceholderForeground": "Yer tutucu metin için girdi kutusu ön plan rengi.", "inputValidationInfoBackground": "Bilgi önem derecesi için girdi doğrulama arka plan rengi.", "inputValidationInfoBorder": "Bilgi önem derecesi için girdi doğrulama kenarlık rengi.", - "inputValidationWarningBackground": "Bilgi uyarısı için girdi doğrulama arka plan rengi.", "inputValidationWarningBorder": "Uyarı önem derecesi için girdi doğrulama kenarlık rengi.", "inputValidationErrorBackground": "Hata önem derecesi için girdi doğrulama arka plan rengi.", "inputValidationErrorBorder": "Hata önem derecesi için girdi doğrulama kenarlık rengi.", @@ -71,10 +70,8 @@ "editorSelectionHighlightBorder": "Seçimle aynı içeriğe sahip bölgelerin kenarlık rengi.", "editorFindMatch": "Geçerli arama eşleşmesinin rengi.", "findMatchHighlight": "Diğer arama eşleşmelerinin rengi. Altta yer alan süslemeleri gizlememek için renk opak olmamalıdır.", - "findRangeHighlight": "Aramayı sınırlandıran aralığın rengi. Altta yer alan süslemeleri gizlememek için renk opak olmamalıdır.", "editorFindMatchBorder": "Geçerli arama eşleşmesinin kenarlık rengi.", "findMatchHighlightBorder": "Diğer arama eşleşmelerinin kenarlık rengi.", - "findRangeHighlightBorder": "Aramayı sınırlandıran aralığın kenarlık rengi. Altta yer alan süslemeleri gizlememek için renk opak olmamalıdır.", "hoverHighlight": "Sözcüğün altında yer alan bağlantı vurgusu. Altta yer alan süslemeleri gizlememek için renk opak olmamalıdır.", "hoverBackground": "Düzenleyici bağlantı vurgusunun arka plan rengi.", "hoverBorder": "Düzenleyici bağlantı vurgusunun kenarlık rengi.", @@ -88,7 +85,6 @@ "mergeIncomingHeaderBackground": "Satır içi birleştirme çakışmalarında \"gelen değişiklik\" üstbilgisi arka planı. Altta yer alan süslemeleri gizlememek için renk opak olmamalıdır.", "mergeIncomingContentBackground": "Satır içi birleştirme çakışmalarında gelen değişiklik içeriğinin arka planı. Altta yer alan süslemeleri gizlememek için renk opak olmamalıdır.", "mergeCommonHeaderBackground": "Satır içi birleştirme çakışmalarında ortak ata üstbilgisi arka planı. Altta yer alan süslemeleri gizlememek için renk opak olmamalıdır.", - "mergeCommonContentBackground": "Satır içi birleştirme çakışmalarında ortak ata içeriğinin arka planı. Altta yer alan süslemeleri gizlememek için renk opak olmamalıdır.", "mergeBorder": "Satır içi birleştirme çakışmalarında üst bilgi ve ayırıcıdaki kenarlık rengi.", "overviewRulerCurrentContentForeground": "Satır içi birleştirme çakışmalarında \"mevcut olan\" için genel bakış cetveli ön planı.", "overviewRulerIncomingContentForeground": "Satır içi birleştirme çakışmalarında gelen genel bakış cetveli ön planı.", diff --git a/i18n/trk/src/vs/platform/url/electron-browser/inactiveExtensionUrlHandler.i18n.json b/i18n/trk/src/vs/platform/url/electron-browser/inactiveExtensionUrlHandler.i18n.json new file mode 100644 index 00000000000..35229bd6699 --- /dev/null +++ b/i18n/trk/src/vs/platform/url/electron-browser/inactiveExtensionUrlHandler.i18n.json @@ -0,0 +1,9 @@ +{ + "": [ + "--------------------------------------------------------------------------------------------", + "Copyright (c) Microsoft Corporation. All rights reserved.", + "Licensed under the MIT License. See License.txt in the project root for license information.", + "--------------------------------------------------------------------------------------------", + "Do not edit this file. It is machine generated." + ] +} \ No newline at end of file diff --git a/i18n/trk/src/vs/workbench/api/browser/viewsExtensionPoint.i18n.json b/i18n/trk/src/vs/workbench/api/browser/viewsExtensionPoint.i18n.json index 0369e1260ea..c7811e33fab 100644 --- a/i18n/trk/src/vs/workbench/api/browser/viewsExtensionPoint.i18n.json +++ b/i18n/trk/src/vs/workbench/api/browser/viewsExtensionPoint.i18n.json @@ -13,8 +13,6 @@ "vscode.extension.contributes.view.name": "Görünümün insanlar tarafından okunabilir adı. Gösterilecektir", "vscode.extension.contributes.view.when": "Bu görünümü göstermek için doğru olması gereken koşul", "vscode.extension.contributes.views": "Görünümleri düzenleyiciye ekler.", - "views.explorer": "Gezgin Görünümü", - "views.debug": "Hata Ayıklama Görünümü", "duplicateView1": "`{1}` konumunda aynı `{0}` id'sine sahip birden çok görünüm kaydedilemiyor", "duplicateView2": "`{0}` id'sine sahip bir görünüm `{1}` konumunda zaten kayıtlı" } \ No newline at end of file diff --git a/i18n/trk/src/vs/workbench/browser/parts/quickinput/quickInput.i18n.json b/i18n/trk/src/vs/workbench/browser/parts/quickinput/quickInput.i18n.json index 205a210e0cd..49f60e07233 100644 --- a/i18n/trk/src/vs/workbench/browser/parts/quickinput/quickInput.i18n.json +++ b/i18n/trk/src/vs/workbench/browser/parts/quickinput/quickInput.i18n.json @@ -6,5 +6,7 @@ "--------------------------------------------------------------------------------------------", "Do not edit this file. It is machine generated." ], + "inputModeEntryDescription": "{0} (Onaylamak için 'Enter' veya iptal etmek için 'Escape' tuşuna basın)", + "inputModeEntry": "Girdinizi onaylamak için 'Enter' veya iptal etmek için 'Escape' tuşuna basın", "ok": "Tamam" } \ No newline at end of file diff --git a/i18n/trk/src/vs/workbench/parts/files/electron-browser/fileActions.i18n.json b/i18n/trk/src/vs/workbench/parts/files/electron-browser/fileActions.i18n.json index 5867f17bd1f..d5012160947 100644 --- a/i18n/trk/src/vs/workbench/parts/files/electron-browser/fileActions.i18n.json +++ b/i18n/trk/src/vs/workbench/parts/files/electron-browser/fileActions.i18n.json @@ -24,20 +24,20 @@ "dirtyMessageFolderDelete": "{0} dosyada kaydedilmemiş değişiklik barındıran bir klasörü siliyorsunuz. Devam etmek istiyor musunuz?", "dirtyMessageFileDelete": "Kaydedilmemiş değişiklik barındıran bir dosyayı siliyorsunuz. Devam etmek istiyor musunuz?", "dirtyWarning": "Değişiklikleriniz, kaydetmezseniz kaybolur.", - "confirmMoveTrashMessageMultiple": "Aşağıdaki {0} dosyayı silmek istediğinizden emin misiniz?", - "confirmMoveTrashMessageFolder": "'{0}' ve içindekileri silmek istediğinizden emin misiniz?", - "confirmMoveTrashMessageFile": "'{0}' öğesini silmek istediğinize emin misiniz?", "undoBin": "Geri Dönüşüm Kutusu'ndan geri alabilirsiniz.", "undoTrash": "Çöp Kutusu'ndan geri alabilirsiniz.", "doNotAskAgain": "Bir daha sorma", - "confirmDeleteMessageMultiple": "Aşağıdaki {0} dosyayı kalıcı olarak silmek istediğinizden emin misiniz?", - "confirmDeleteMessageFolder": "'{0}' öğesini ve içindekileri kalıcı olarak silmek istediğinizden emin misiniz?", - "confirmDeleteMessageFile": "'{0}' öğesini kalıcı olarak silmek istediğinizden emin misiniz?", "irreversible": "Bu eylem geri döndürülemez!", "binFailed": "Geri Dönüşüm Kutusu'nu kullanarak silme başarısız oldu. Bunun yerine, kalıcı olarak silmek ister misiniz?", "trashFailed": "Çöp Kutusu'nu kullanarak silme başarısız oldu. Bunun yerine, kalıcı olarak silmek ister misiniz?", "deletePermanentlyButtonLabel": "&&Kalıcı Olarak Sil", "retryButtonLabel": "&&Yeniden Dene", + "confirmMoveTrashMessageMultiple": "Aşağıdaki {0} dosyayı silmek istediğinizden emin misiniz?", + "confirmMoveTrashMessageFolder": "'{0}' ve içindekileri silmek istediğinizden emin misiniz?", + "confirmMoveTrashMessageFile": "'{0}' öğesini silmek istediğinize emin misiniz?", + "confirmDeleteMessageMultiple": "Aşağıdaki {0} dosyayı kalıcı olarak silmek istediğinizden emin misiniz?", + "confirmDeleteMessageFolder": "'{0}' öğesini ve içindekileri kalıcı olarak silmek istediğinizden emin misiniz?", + "confirmDeleteMessageFile": "'{0}' öğesini kalıcı olarak silmek istediğinizden emin misiniz?", "confirmOverwrite": "Hedef klasörde aynı ada sahip bir dosya veya klasör zaten var. Değiştirmek istiyor musunuz?", "replaceButtonLabel": "&&Değiştir", "fileIsAncestor": "Yapıştırılacak dosya hedef klasörün atalarından biridir", diff --git a/i18n/trk/src/vs/workbench/parts/localizations/electron-browser/localizations.contribution.i18n.json b/i18n/trk/src/vs/workbench/parts/localizations/electron-browser/localizations.contribution.i18n.json new file mode 100644 index 00000000000..7e7b61fe5ed --- /dev/null +++ b/i18n/trk/src/vs/workbench/parts/localizations/electron-browser/localizations.contribution.i18n.json @@ -0,0 +1,23 @@ +{ + "": [ + "--------------------------------------------------------------------------------------------", + "Copyright (c) Microsoft Corporation. All rights reserved.", + "Licensed under the MIT License. See License.txt in the project root for license information.", + "--------------------------------------------------------------------------------------------", + "Do not edit this file. It is machine generated." + ], + "updateLocale": "VS Code'un kullanıcı arayüzü dilini {0} olarak değiştirip yeniden başlatmak ister misiniz?", + "yes": "Evet", + "no": "Hayır", + "neverAgain": "Tekrar Gösterme", + "install": "Yükle", + "JsonSchema.locale": "Kullanılacak Kullanıcı Arayüzü Dili.", + "vscode.extension.contributes.localizations": "Düzenleyiciye yerelleştirmeleri ekler", + "vscode.extension.contributes.localizations.languageId": "Görüntülenen dizelerin çevrileceği dilin id'si.", + "vscode.extension.contributes.localizations.languageName": "Dilin İngilizcedeki adı.", + "vscode.extension.contributes.localizations.languageNameLocalized": "Dilin eklenen dildeki adı.", + "vscode.extension.contributes.localizations.translations": "Bu dille ilişkili çevirilerin listesi.", + "vscode.extension.contributes.localizations.translations.id": "Bu çevirinin ekleneceği VS Code veya Eklenti id'si. VS Code id'si her zaman`vscode` şeklindedir ve eklenti `yayinciAdi.eklentiAdi` formatında olmalıdır.", + "vscode.extension.contributes.localizations.translations.id.pattern": "Id, VS Code çevirisi için `vscode` olmalı veya eklenti çevirisi için `yayinciAdi.eklentiAdi` biçiminde olmalıdır.", + "vscode.extension.contributes.localizations.translations.path": "Dilin çevirilerini içeren dosyaya göreli yol." +} \ No newline at end of file diff --git a/i18n/trk/src/vs/workbench/parts/localizations/electron-browser/localizationsActions.i18n.json b/i18n/trk/src/vs/workbench/parts/localizations/electron-browser/localizationsActions.i18n.json new file mode 100644 index 00000000000..9cd3515ce98 --- /dev/null +++ b/i18n/trk/src/vs/workbench/parts/localizations/electron-browser/localizationsActions.i18n.json @@ -0,0 +1,14 @@ +{ + "": [ + "--------------------------------------------------------------------------------------------", + "Copyright (c) Microsoft Corporation. All rights reserved.", + "Licensed under the MIT License. See License.txt in the project root for license information.", + "--------------------------------------------------------------------------------------------", + "Do not edit this file. It is machine generated." + ], + "configureLocale": "Dili Yapılandır", + "displayLanguage": "VSCode'un görüntüleme dilini tanımlar.", + "doc": "Desteklenen dillerin listesi için göz atın: {0}", + "restart": "Değeri değiştirirseniz VSCode'u yeniden başlatmanız gerekir.", + "fail.createSettings": " '{0}' oluşturulamadı ({1})." +} \ No newline at end of file diff --git a/i18n/trk/src/vs/workbench/parts/url/electron-browser/url.contribution.i18n.json b/i18n/trk/src/vs/workbench/parts/url/electron-browser/url.contribution.i18n.json new file mode 100644 index 00000000000..af6d69fa60e --- /dev/null +++ b/i18n/trk/src/vs/workbench/parts/url/electron-browser/url.contribution.i18n.json @@ -0,0 +1,10 @@ +{ + "": [ + "--------------------------------------------------------------------------------------------", + "Copyright (c) Microsoft Corporation. All rights reserved.", + "Licensed under the MIT License. See License.txt in the project root for license information.", + "--------------------------------------------------------------------------------------------", + "Do not edit this file. It is machine generated." + ], + "developer": "Geliştirici" +} \ No newline at end of file diff --git a/i18n/trk/src/vs/workbench/services/configurationResolver/node/variableResolver.i18n.json b/i18n/trk/src/vs/workbench/services/configurationResolver/node/variableResolver.i18n.json new file mode 100644 index 00000000000..35229bd6699 --- /dev/null +++ b/i18n/trk/src/vs/workbench/services/configurationResolver/node/variableResolver.i18n.json @@ -0,0 +1,9 @@ +{ + "": [ + "--------------------------------------------------------------------------------------------", + "Copyright (c) Microsoft Corporation. All rights reserved.", + "Licensed under the MIT License. See License.txt in the project root for license information.", + "--------------------------------------------------------------------------------------------", + "Do not edit this file. It is machine generated." + ] +} \ No newline at end of file From edc3bbe603682c3fb15e12e2799f4a6e69b86b9e Mon Sep 17 00:00:00 2001 From: Matt Bierner Date: Wed, 25 Apr 2018 10:37:27 -0700 Subject: [PATCH 073/830] Use string symbol kind for markdown symbols --- .../src/features/documentSymbolProvider.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/extensions/markdown-language-features/src/features/documentSymbolProvider.ts b/extensions/markdown-language-features/src/features/documentSymbolProvider.ts index c40a62b352d..5c5e6de1956 100644 --- a/extensions/markdown-language-features/src/features/documentSymbolProvider.ts +++ b/extensions/markdown-language-features/src/features/documentSymbolProvider.ts @@ -4,10 +4,10 @@ *--------------------------------------------------------------------------------------------*/ import * as vscode from 'vscode'; - import { MarkdownEngine } from '../markdownEngine'; import { TableOfContentsProvider } from '../tableOfContentsProvider'; + export default class MDDocumentSymbolProvider implements vscode.DocumentSymbolProvider { constructor( @@ -17,7 +17,7 @@ export default class MDDocumentSymbolProvider implements vscode.DocumentSymbolPr public async provideDocumentSymbols(document: vscode.TextDocument): Promise { const toc = await new TableOfContentsProvider(this.engine, document).getToc(); return toc.map(entry => { - return new vscode.SymbolInformation('#'.repeat(entry.level) + ' ' + entry.text, vscode.SymbolKind.Namespace, '', entry.location); + return new vscode.SymbolInformation('#'.repeat(entry.level) + ' ' + entry.text, vscode.SymbolKind.String, '', entry.location); }); } } \ No newline at end of file From 2fca1331507b1b399250f6b19f04f03f25fab42f Mon Sep 17 00:00:00 2001 From: Matt Bierner Date: Wed, 25 Apr 2018 10:54:57 -0700 Subject: [PATCH 074/830] Make sure we still delete the webview handle when the extension event has an error --- .../workbench/api/electron-browser/mainThreadWebview.ts | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/vs/workbench/api/electron-browser/mainThreadWebview.ts b/src/vs/workbench/api/electron-browser/mainThreadWebview.ts index 08911045ce0..e5fdf06f5ad 100644 --- a/src/vs/workbench/api/electron-browser/mainThreadWebview.ts +++ b/src/vs/workbench/api/electron-browser/mainThreadWebview.ts @@ -2,11 +2,11 @@ * Copyright (c) Microsoft Corporation. All rights reserved. * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import { localize } from 'vs/nls'; import { IDisposable, dispose } from 'vs/base/common/lifecycle'; import * as map from 'vs/base/common/map'; import URI from 'vs/base/common/uri'; import { TPromise } from 'vs/base/common/winjs.base'; +import { localize } from 'vs/nls'; import { IContextKeyService } from 'vs/platform/contextkey/common/contextkey'; import { Position } from 'vs/platform/editor/common/editor'; import { ILifecycleService } from 'vs/platform/lifecycle/common/lifecycle'; @@ -179,9 +179,9 @@ export class MainThreadWebviews implements MainThreadWebviewsShape, WebviewReviv onDidClickLink: uri => this.onDidClickLink(handle, uri), onMessage: message => this._proxy.$onMessage(handle, message), onDispose: () => { - this._proxy.$onDidDisposeWebviewPanel(handle).then(() => { - this._webviews.delete(handle); - }); + this._proxy.$onDidDisposeWebviewPanel(handle).then( + () => this._webviews.delete(handle), + () => this._webviews.delete(handle)); } }; } From 856c9cacd8869754df2860460f2a2b5dfe4d7ad3 Mon Sep 17 00:00:00 2001 From: Matt Bierner Date: Wed, 25 Apr 2018 11:16:16 -0700 Subject: [PATCH 075/830] Handle a few edge cases where extension host may try accessing a disposed webview --- .../workbench/api/electron-browser/mainThreadWebview.ts | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/src/vs/workbench/api/electron-browser/mainThreadWebview.ts b/src/vs/workbench/api/electron-browser/mainThreadWebview.ts index e5fdf06f5ad..5c24b3a33d7 100644 --- a/src/vs/workbench/api/electron-browser/mainThreadWebview.ts +++ b/src/vs/workbench/api/electron-browser/mainThreadWebview.ts @@ -100,6 +100,10 @@ export class MainThreadWebviews implements MainThreadWebviewsShape, WebviewReviv $reveal(handle: WebviewPanelHandle, column: Position | undefined): void { const webview = this.getWebview(handle); + if (webview.isDisposed()) { + return; + } + this._webviewService.revealWebview(webview, column); } @@ -140,6 +144,10 @@ export class MainThreadWebviews implements MainThreadWebviewsShape, WebviewReviv } canRevive(webview: WebviewEditorInput): boolean { + if (webview.isDisposed()) { + return false; + } + return this._revivers.has(webview.viewType) || webview.reviver !== null; } From 6091135ee5e32f4782a649580ce5c055b0905f1f Mon Sep 17 00:00:00 2001 From: Matt Bierner Date: Wed, 25 Apr 2018 12:42:40 -0700 Subject: [PATCH 076/830] Correctly handle when webview.reveal is called without any args Fixes #48707 --- .../workbench/api/electron-browser/mainThreadWebview.ts | 2 +- .../webview/electron-browser/webviewEditorService.ts | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/src/vs/workbench/api/electron-browser/mainThreadWebview.ts b/src/vs/workbench/api/electron-browser/mainThreadWebview.ts index 5c24b3a33d7..d6255bc4454 100644 --- a/src/vs/workbench/api/electron-browser/mainThreadWebview.ts +++ b/src/vs/workbench/api/electron-browser/mainThreadWebview.ts @@ -98,7 +98,7 @@ export class MainThreadWebviews implements MainThreadWebviewsShape, WebviewReviv webview.html = value; } - $reveal(handle: WebviewPanelHandle, column: Position | undefined): void { + $reveal(handle: WebviewPanelHandle, column: Position | null): void { const webview = this.getWebview(handle); if (webview.isDisposed()) { return; diff --git a/src/vs/workbench/parts/webview/electron-browser/webviewEditorService.ts b/src/vs/workbench/parts/webview/electron-browser/webviewEditorService.ts index 1d0f11200ca..bb51f95542b 100644 --- a/src/vs/workbench/parts/webview/electron-browser/webviewEditorService.ts +++ b/src/vs/workbench/parts/webview/electron-browser/webviewEditorService.ts @@ -37,7 +37,7 @@ export interface IWebviewEditorService { revealWebview( webview: WebviewEditorInput, - column: Position | undefined + column: Position | null ): void; registerReviver( @@ -98,10 +98,10 @@ export class WebviewEditorService implements IWebviewEditorService { revealWebview( webview: WebviewEditorInput, - column: Position | undefined + column: Position | null ): void { - if (typeof column === 'undefined' || webview.position === column) { - this._editorService.openEditor(webview, { preserveFocus: false }, column); + if (!column || webview.position === column) { + this._editorService.openEditor(webview, { preserveFocus: false }, column || webview.position); } else { this._editorGroupService.moveEditor(webview, webview.position, column, { preserveFocus: false }); } From 9cbc16294771dd09d8f1872a0bbdc969a6f68af6 Mon Sep 17 00:00:00 2001 From: Alex Dima Date: Wed, 25 Apr 2018 21:31:09 +0200 Subject: [PATCH 077/830] Don't track selections if tracking is not needed (#42317) --- src/vs/editor/common/controller/cursor.ts | 10 +++++++ .../common/controller/cursorCollection.ts | 14 ++++++++++ src/vs/editor/common/controller/oneCursor.ts | 26 ++++++++++++++++++- 3 files changed, 49 insertions(+), 1 deletion(-) diff --git a/src/vs/editor/common/controller/cursor.ts b/src/vs/editor/common/controller/cursor.ts index 36833531a0a..9f0403c294b 100644 --- a/src/vs/editor/common/controller/cursor.ts +++ b/src/vs/editor/common/controller/cursor.ts @@ -476,6 +476,12 @@ export class Cursor extends viewEvents.ViewEventEmitter implements ICursors { const oldState = new CursorModelState(this._model, this); let cursorChangeReason = CursorChangeReason.NotSet; + if (handlerId !== H.Undo && handlerId !== H.Redo) { + // TODO@Alex: if the undo/redo stack contains non-null selections + // it would also be OK to stop tracking selections here + this._cursors.stopTrackingSelections(); + } + // ensure valid state on all cursors this._cursors.ensureValidState(); @@ -524,6 +530,10 @@ export class Cursor extends viewEvents.ViewEventEmitter implements ICursors { this._isHandling = false; + if (handlerId !== H.Undo && handlerId !== H.Redo) { + this._cursors.startTrackingSelections(); + } + if (this._emitStateChangedIfNecessary(source, cursorChangeReason, oldState)) { this._revealRange(RevealTarget.Primary, viewEvents.VerticalRevealType.Simple, true, editorCommon.ScrollType.Smooth); } diff --git a/src/vs/editor/common/controller/cursorCollection.ts b/src/vs/editor/common/controller/cursorCollection.ts index c50e7d3e4e6..515ca3fbf6d 100644 --- a/src/vs/editor/common/controller/cursorCollection.ts +++ b/src/vs/editor/common/controller/cursorCollection.ts @@ -31,6 +31,20 @@ export class CursorCollection { this.killSecondaryCursors(); } + public startTrackingSelections(): void { + this.primaryCursor.startTrackingSelection(this.context); + for (let i = 0, len = this.secondaryCursors.length; i < len; i++) { + this.secondaryCursors[i].startTrackingSelection(this.context); + } + } + + public stopTrackingSelections(): void { + this.primaryCursor.stopTrackingSelection(this.context); + for (let i = 0, len = this.secondaryCursors.length; i < len; i++) { + this.secondaryCursors[i].stopTrackingSelection(this.context); + } + } + public updateContext(context: CursorContext): void { this.context = context; } diff --git a/src/vs/editor/common/controller/oneCursor.ts b/src/vs/editor/common/controller/oneCursor.ts index 363cda5bb40..51ee75626fd 100644 --- a/src/vs/editor/common/controller/oneCursor.ts +++ b/src/vs/editor/common/controller/oneCursor.ts @@ -16,12 +16,14 @@ export class OneCursor { public viewState: SingleCursorState; private _selTrackedRange: string; + private _trackSelection: boolean; constructor(context: CursorContext) { this.modelState = null; this.viewState = null; this._selTrackedRange = null; + this._trackSelection = true; this._setState( context, @@ -31,6 +33,28 @@ export class OneCursor { } public dispose(context: CursorContext): void { + this._removeTrackedRange(context); + } + + public startTrackingSelection(context: CursorContext): void { + this._trackSelection = true; + this._updateTrackedRange(context); + } + + public stopTrackingSelection(context: CursorContext): void { + this._trackSelection = false; + this._removeTrackedRange(context); + } + + private _updateTrackedRange(context: CursorContext): void { + if (!this._trackSelection) { + // don't track the selection + return; + } + this._selTrackedRange = context.model._setTrackedRange(this._selTrackedRange, this.modelState.selection, TrackedRangeStickiness.AlwaysGrowsWhenTypingAtEdges); + } + + private _removeTrackedRange(context: CursorContext): void { this._selTrackedRange = context.model._setTrackedRange(this._selTrackedRange, null, TrackedRangeStickiness.AlwaysGrowsWhenTypingAtEdges); } @@ -96,6 +120,6 @@ export class OneCursor { this.modelState = modelState; this.viewState = viewState; - this._selTrackedRange = context.model._setTrackedRange(this._selTrackedRange, this.modelState.selection, TrackedRangeStickiness.AlwaysGrowsWhenTypingAtEdges); + this._updateTrackedRange(context); } } From b58327d483f9ea1032155fbf8b87984f57ea5e3f Mon Sep 17 00:00:00 2001 From: Alex Dima Date: Wed, 25 Apr 2018 21:55:57 +0200 Subject: [PATCH 078/830] Update the height only after processing all the change events (#42317) --- src/vs/editor/common/viewLayout/viewLayout.ts | 3 --- src/vs/editor/common/viewModel/viewModelImpl.ts | 1 + 2 files changed, 1 insertion(+), 3 deletions(-) diff --git a/src/vs/editor/common/viewLayout/viewLayout.ts b/src/vs/editor/common/viewLayout/viewLayout.ts index a7e1f091386..b43776b2eeb 100644 --- a/src/vs/editor/common/viewLayout/viewLayout.ts +++ b/src/vs/editor/common/viewLayout/viewLayout.ts @@ -75,15 +75,12 @@ export class ViewLayout extends Disposable implements IViewLayout { } public onFlushed(lineCount: number): void { this._linesLayout.onFlushed(lineCount); - this._updateHeight(); } public onLinesDeleted(fromLineNumber: number, toLineNumber: number): void { this._linesLayout.onLinesDeleted(fromLineNumber, toLineNumber); - this._updateHeight(); } public onLinesInserted(fromLineNumber: number, toLineNumber: number): void { this._linesLayout.onLinesInserted(fromLineNumber, toLineNumber); - this._updateHeight(); } // ---- end view event handlers diff --git a/src/vs/editor/common/viewModel/viewModelImpl.ts b/src/vs/editor/common/viewModel/viewModelImpl.ts index 8fbfa9939e7..5c41e95fffb 100644 --- a/src/vs/editor/common/viewModel/viewModelImpl.ts +++ b/src/vs/editor/common/viewModel/viewModelImpl.ts @@ -231,6 +231,7 @@ export class ViewModel extends viewEvents.ViewEventEmitter implements IViewModel } } this.lines.acceptVersionId(versionId); + this.viewLayout.onHeightMaybeChanged(); if (!hadOtherModelChange && hadModelLineChangeThatChangedLineMapping) { eventsCollector.emit(new viewEvents.ViewLineMappingChangedEvent()); From c935020a8aead42e97614ca875853d26089d5e1a Mon Sep 17 00:00:00 2001 From: Alex Dima Date: Wed, 25 Apr 2018 22:23:54 +0200 Subject: [PATCH 079/830] Fixes #22688: Always use CRLF for clipboard on Windows --- src/vs/editor/browser/controller/textAreaHandler.ts | 2 +- src/vs/editor/common/viewModel/viewModel.ts | 2 +- src/vs/editor/common/viewModel/viewModelImpl.ts | 6 +++--- .../test/common/viewModel/viewModelImpl.test.ts | 11 ++++++++++- 4 files changed, 15 insertions(+), 6 deletions(-) diff --git a/src/vs/editor/browser/controller/textAreaHandler.ts b/src/vs/editor/browser/controller/textAreaHandler.ts index 098af888c20..fb902c2a458 100644 --- a/src/vs/editor/browser/controller/textAreaHandler.ts +++ b/src/vs/editor/browser/controller/textAreaHandler.ts @@ -164,7 +164,7 @@ export class TextAreaHandler extends ViewPart { const textAreaInputHost: ITextAreaInputHost = { getPlainTextToCopy: (): string => { - const rawWhatToCopy = this._context.model.getPlainTextToCopy(this._selections, this._emptySelectionClipboard); + const rawWhatToCopy = this._context.model.getPlainTextToCopy(this._selections, this._emptySelectionClipboard, platform.isWindows); const newLineCharacter = this._context.model.getEOL(); const isFromEmptySelection = (this._emptySelectionClipboard && this._selections.length === 1 && this._selections[0].isEmpty()); diff --git a/src/vs/editor/common/viewModel/viewModel.ts b/src/vs/editor/common/viewModel/viewModel.ts index c97d919393a..d19255a2ae5 100644 --- a/src/vs/editor/common/viewModel/viewModel.ts +++ b/src/vs/editor/common/viewModel/viewModel.ts @@ -147,7 +147,7 @@ export interface IViewModel { deduceModelPositionRelativeToViewPosition(viewAnchorPosition: Position, deltaOffset: number, lineFeedCnt: number): Position; getEOL(): string; - getPlainTextToCopy(ranges: Range[], emptySelectionClipboard: boolean): string | string[]; + getPlainTextToCopy(ranges: Range[], emptySelectionClipboard: boolean, forceCRLF: boolean): string | string[]; getHTMLToCopy(ranges: Range[], emptySelectionClipboard: boolean): string; } diff --git a/src/vs/editor/common/viewModel/viewModelImpl.ts b/src/vs/editor/common/viewModel/viewModelImpl.ts index 5c41e95fffb..4bb9fb3bd76 100644 --- a/src/vs/editor/common/viewModel/viewModelImpl.ts +++ b/src/vs/editor/common/viewModel/viewModelImpl.ts @@ -570,8 +570,8 @@ export class ViewModel extends viewEvents.ViewEventEmitter implements IViewModel return this.model.getEOL(); } - public getPlainTextToCopy(ranges: Range[], emptySelectionClipboard: boolean): string | string[] { - const newLineCharacter = this.model.getEOL(); + public getPlainTextToCopy(ranges: Range[], emptySelectionClipboard: boolean, forceCRLF: boolean): string | string[] { + const newLineCharacter = forceCRLF ? '\r\n' : this.model.getEOL(); ranges = ranges.slice(0); ranges.sort(Range.compareRangesUsingStarts); @@ -599,7 +599,7 @@ export class ViewModel extends viewEvents.ViewEventEmitter implements IViewModel let result: string[] = []; for (let i = 0; i < nonEmptyRanges.length; i++) { - result.push(this.getValueInRange(nonEmptyRanges[i], EndOfLinePreference.TextDefined)); + result.push(this.getValueInRange(nonEmptyRanges[i], forceCRLF ? EndOfLinePreference.CRLF : EndOfLinePreference.TextDefined)); } return result.length === 1 ? result[0] : result; } diff --git a/src/vs/editor/test/common/viewModel/viewModelImpl.test.ts b/src/vs/editor/test/common/viewModel/viewModelImpl.test.ts index 41a7a8d0f7b..e6ee98daa42 100644 --- a/src/vs/editor/test/common/viewModel/viewModelImpl.test.ts +++ b/src/vs/editor/test/common/viewModel/viewModelImpl.test.ts @@ -7,6 +7,7 @@ import * as assert from 'assert'; import { Range } from 'vs/editor/common/core/range'; import { testViewModel } from 'vs/editor/test/common/viewModel/testViewModel'; +import { EndOfLineSequence } from 'vs/editor/common/model'; suite('ViewModel', () => { @@ -109,7 +110,7 @@ suite('ViewModel', () => { function assertGetPlainTextToCopy(text: string[], ranges: Range[], emptySelectionClipboard: boolean, expected: string | string[]): void { testViewModel(text, {}, (viewModel, model) => { - let actual = viewModel.getPlainTextToCopy(ranges, emptySelectionClipboard); + let actual = viewModel.getPlainTextToCopy(ranges, emptySelectionClipboard, false); assert.deepEqual(actual, expected); }); } @@ -250,4 +251,12 @@ suite('ViewModel', () => { 'line2\nline3\n' ); }); + + test('issue #22688 - always use CRLF for clipboard on Windows', () => { + testViewModel(USUAL_TEXT, {}, (viewModel, model) => { + model.setEOL(EndOfLineSequence.LF); + let actual = viewModel.getPlainTextToCopy([new Range(2, 1, 5, 1)], true, true); + assert.deepEqual(actual, 'line2\r\nline3\r\nline4\r\n'); + }); + }); }); From 2c876371f581ad48cc0b58af28616f331513cc77 Mon Sep 17 00:00:00 2001 From: Alex Dima Date: Wed, 25 Apr 2018 22:42:35 +0200 Subject: [PATCH 080/830] Fixes #20578: Maintain scroll state when disabling code lens --- src/vs/editor/contrib/codelens/codelensController.ts | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/vs/editor/contrib/codelens/codelensController.ts b/src/vs/editor/contrib/codelens/codelensController.ts index 901348a1e27..3a122545b63 100644 --- a/src/vs/editor/contrib/codelens/codelensController.ts +++ b/src/vs/editor/contrib/codelens/codelensController.ts @@ -171,11 +171,13 @@ export class CodeLensContribution implements editorCommon.IEditorContribution { this._localToDispose.push({ dispose: () => { if (this._editor.getModel()) { + const scrollState = StableEditorScrollState.capture(this._editor); this._editor.changeDecorations((changeAccessor) => { this._editor.changeViewZones((accessor) => { this._disposeAllLenses(changeAccessor, accessor); }); }); + scrollState.restore(this._editor); } else { // No accessors available this._disposeAllLenses(null, null); From 361741afae8f603dca1c3a987204e5698082b17c Mon Sep 17 00:00:00 2001 From: Alex Dima Date: Wed, 25 Apr 2018 23:13:55 +0200 Subject: [PATCH 081/830] Fixes #30202: Use token style to paint character in block cursor --- .../browser/viewParts/viewCursors/viewCursor.ts | 16 +++++++++++----- src/vs/editor/common/core/lineTokens.ts | 5 +++++ src/vs/editor/common/viewModel/viewModel.ts | 1 + src/vs/editor/common/viewModel/viewModelImpl.ts | 6 +++++- src/vs/editor/test/common/core/viewLineToken.ts | 4 ++++ 5 files changed, 26 insertions(+), 6 deletions(-) diff --git a/src/vs/editor/browser/viewParts/viewCursors/viewCursor.ts b/src/vs/editor/browser/viewParts/viewCursors/viewCursor.ts index 1ecec7c6f75..b1fe737071e 100644 --- a/src/vs/editor/browser/viewParts/viewCursors/viewCursor.ts +++ b/src/vs/editor/browser/viewParts/viewCursors/viewCursor.ts @@ -28,7 +28,8 @@ class ViewCursorRenderData { public readonly left: number, public readonly width: number, public readonly height: number, - public readonly textContent: string + public readonly textContent: string, + public readonly textContentClassName: string ) { } } @@ -118,6 +119,7 @@ export class ViewCursor { private _prepareRender(ctx: RenderingContext): ViewCursorRenderData { let textContent = ''; + let textContentClassName = ''; if (this._cursorStyle === TextEditorCursorStyle.Line || this._cursorStyle === TextEditorCursorStyle.LineThin) { const visibleRange = ctx.visibleRangeForPosition(this._position); @@ -136,7 +138,7 @@ export class ViewCursor { width = dom.computeScreenAwareSize(1); } const top = ctx.getVerticalOffsetForLineNumber(this._position.lineNumber) - ctx.bigNumbersDelta; - return new ViewCursorRenderData(top, visibleRange.left, width, this._lineHeight, textContent); + return new ViewCursorRenderData(top, visibleRange.left, width, this._lineHeight, textContent, textContentClassName); } const visibleRangeForCharacter = ctx.linesVisibleRangesForRange(new Range(this._position.lineNumber, this._position.column, this._position.lineNumber, this._position.column + 1), false); @@ -150,8 +152,10 @@ export class ViewCursor { const width = range.width < 1 ? this._typicalHalfwidthCharacterWidth : range.width; if (this._cursorStyle === TextEditorCursorStyle.Block) { - const lineContent = this._context.model.getLineContent(this._position.lineNumber); - textContent = lineContent.charAt(this._position.column - 1); + const lineData = this._context.model.getViewLineData(this._position.lineNumber); + textContent = lineData.content.charAt(this._position.column - 1); + const tokenIndex = lineData.tokens.findTokenIndexAtOffset(this._position.column - 1); + textContentClassName = lineData.tokens.getClassName(tokenIndex); } let top = ctx.getVerticalOffsetForLineNumber(this._position.lineNumber) - ctx.bigNumbersDelta; @@ -163,7 +167,7 @@ export class ViewCursor { height = 2; } - return new ViewCursorRenderData(top, range.left, width, height, textContent); + return new ViewCursorRenderData(top, range.left, width, height, textContent, textContentClassName); } public prepareRender(ctx: RenderingContext): void { @@ -181,6 +185,8 @@ export class ViewCursor { this._domNode.domNode.textContent = this._lastRenderedContent; } + this._domNode.setClassName('cursor ' + this._renderData.textContentClassName); + this._domNode.setDisplay('block'); this._domNode.setTop(this._renderData.top); this._domNode.setLeft(this._renderData.left); diff --git a/src/vs/editor/common/core/lineTokens.ts b/src/vs/editor/common/core/lineTokens.ts index 81c2737f462..cf1e60b248c 100644 --- a/src/vs/editor/common/core/lineTokens.ts +++ b/src/vs/editor/common/core/lineTokens.ts @@ -13,6 +13,7 @@ export interface IViewLineTokens { getEndOffset(tokenIndex: number): number; getClassName(tokenIndex: number): string; getInlineStyle(tokenIndex: number, colorMap: string[]): string; + findTokenIndexAtOffset(offset: number): number; } export class LineTokens implements IViewLineTokens { @@ -207,4 +208,8 @@ export class SlicedLineTokens implements IViewLineTokens { public getInlineStyle(tokenIndex: number, colorMap: string[]): string { return this._source.getInlineStyle(this._firstTokenIndex + tokenIndex, colorMap); } + + public findTokenIndexAtOffset(offset: number): number { + return this._source.findTokenIndexAtOffset(offset + this._startOffset - this._deltaOffset) - this._firstTokenIndex; + } } diff --git a/src/vs/editor/common/viewModel/viewModel.ts b/src/vs/editor/common/viewModel/viewModel.ts index d19255a2ae5..e4239fcd5e3 100644 --- a/src/vs/editor/common/viewModel/viewModel.ts +++ b/src/vs/editor/common/viewModel/viewModel.ts @@ -124,6 +124,7 @@ export interface IViewModel { getDecorationsInViewport(visibleRange: Range): ViewModelDecoration[]; getViewLineRenderingData(visibleRange: Range, lineNumber: number): ViewLineRenderingData; + getViewLineData(lineNumber: number): ViewLineData; getMinimapLinesRenderingData(startLineNumber: number, endLineNumber: number, needed: boolean[]): MinimapLinesRenderingData; getCompletelyVisibleViewRange(): Range; getCompletelyVisibleViewRangeAtScrollTop(scrollTop: number): Range; diff --git a/src/vs/editor/common/viewModel/viewModelImpl.ts b/src/vs/editor/common/viewModel/viewModelImpl.ts index 4bb9fb3bd76..434615d824d 100644 --- a/src/vs/editor/common/viewModel/viewModelImpl.ts +++ b/src/vs/editor/common/viewModel/viewModelImpl.ts @@ -11,7 +11,7 @@ import * as editorCommon from 'vs/editor/common/editorCommon'; import { TokenizationRegistry, ColorId, LanguageId } from 'vs/editor/common/modes'; import { tokenizeLineToHTML } from 'vs/editor/common/modes/textToHtmlTokenizer'; import { ViewModelDecorations } from 'vs/editor/common/viewModel/viewModelDecorations'; -import { MinimapLinesRenderingData, ViewLineRenderingData, ViewModelDecoration, IViewModel, ICoordinatesConverter, IOverviewRulerDecorations } from 'vs/editor/common/viewModel/viewModel'; +import { MinimapLinesRenderingData, ViewLineRenderingData, ViewModelDecoration, IViewModel, ICoordinatesConverter, IOverviewRulerDecorations, ViewLineData } from 'vs/editor/common/viewModel/viewModel'; import { SplitLinesCollection, IViewModelLinesCollection, IdentityLinesCollection } from 'vs/editor/common/viewModel/splitLinesCollection'; import * as viewEvents from 'vs/editor/common/view/viewEvents'; import { MinimapTokensColorTracker } from 'vs/editor/common/view/minimapCharRenderer'; @@ -516,6 +516,10 @@ export class ViewModel extends viewEvents.ViewEventEmitter implements IViewModel ); } + public getViewLineData(lineNumber: number): ViewLineData { + return this.lines.getViewLineData(lineNumber); + } + public getMinimapLinesRenderingData(startLineNumber: number, endLineNumber: number, needed: boolean[]): MinimapLinesRenderingData { let result = this.lines.getViewLinesData(startLineNumber, endLineNumber, needed); return new MinimapLinesRenderingData( diff --git a/src/vs/editor/test/common/core/viewLineToken.ts b/src/vs/editor/test/common/core/viewLineToken.ts index 625126c2531..c254de7ac47 100644 --- a/src/vs/editor/test/common/core/viewLineToken.ts +++ b/src/vs/editor/test/common/core/viewLineToken.ts @@ -92,6 +92,10 @@ export class ViewLineTokens implements IViewLineTokens { public getInlineStyle(tokenIndex: number, colorMap: string[]): string { return this._actual[tokenIndex].getInlineStyle(colorMap); } + + public findTokenIndexAtOffset(offset: number): number { + throw new Error('Not implemented'); + } } export class ViewLineTokenFactory { From 38f1eddf382e508e8be605ba6ef39c8a97e03a61 Mon Sep 17 00:00:00 2001 From: Ramya Achutha Rao Date: Wed, 25 Apr 2018 14:17:10 -0700 Subject: [PATCH 082/830] Revert "added the key bindings for first and last selection in suggestions." as per user feedback in #43511 This reverts commit be5030b70ca62a1a05ad070743d1452614a4a7bb. --- src/vs/editor/contrib/suggest/suggestController.ts | 14 ++------------ 1 file changed, 2 insertions(+), 12 deletions(-) diff --git a/src/vs/editor/contrib/suggest/suggestController.ts b/src/vs/editor/contrib/suggest/suggestController.ts index bba5c8bb188..7ed9c0c2af5 100644 --- a/src/vs/editor/contrib/suggest/suggestController.ts +++ b/src/vs/editor/contrib/suggest/suggestController.ts @@ -406,12 +406,7 @@ registerEditorCommand(new SuggestCommand({ registerEditorCommand(new SuggestCommand({ id: 'selectLastSuggestion', precondition: ContextKeyExpr.and(SuggestContext.Visible, SuggestContext.MultipleSuggestions), - handler: c => c.selectLastSuggestion(), - kbOpts: { - weight: weight, - kbExpr: EditorContextKeys.textInputFocus, - primary: KeyCode.End - } + handler: c => c.selectLastSuggestion() })); registerEditorCommand(new SuggestCommand({ @@ -442,12 +437,7 @@ registerEditorCommand(new SuggestCommand({ registerEditorCommand(new SuggestCommand({ id: 'selectFirstSuggestion', precondition: ContextKeyExpr.and(SuggestContext.Visible, SuggestContext.MultipleSuggestions), - handler: c => c.selectFirstSuggestion(), - kbOpts: { - weight: weight, - kbExpr: EditorContextKeys.textInputFocus, - primary: KeyCode.Home - } + handler: c => c.selectFirstSuggestion() })); registerEditorCommand(new SuggestCommand({ From abd00e0e2b9b608aea3452e0e2902f606b3e5f15 Mon Sep 17 00:00:00 2001 From: Alex Dima Date: Wed, 25 Apr 2018 23:29:37 +0200 Subject: [PATCH 083/830] Fixes #35339 --- src/vs/editor/browser/viewParts/viewCursors/viewCursor.ts | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/vs/editor/browser/viewParts/viewCursors/viewCursor.ts b/src/vs/editor/browser/viewParts/viewCursors/viewCursor.ts index b1fe737071e..93ef2052bce 100644 --- a/src/vs/editor/browser/viewParts/viewCursors/viewCursor.ts +++ b/src/vs/editor/browser/viewParts/viewCursors/viewCursor.ts @@ -13,6 +13,7 @@ import { ViewContext } from 'vs/editor/common/view/viewContext'; import { RenderingContext, RestrictedRenderingContext } from 'vs/editor/common/view/renderingContext'; import * as viewEvents from 'vs/editor/common/view/viewEvents'; import * as dom from 'vs/base/browser/dom'; +import * as strings from 'vs/base/common/strings'; export interface IViewCursorRenderData { domNode: HTMLElement; @@ -154,6 +155,9 @@ export class ViewCursor { if (this._cursorStyle === TextEditorCursorStyle.Block) { const lineData = this._context.model.getViewLineData(this._position.lineNumber); textContent = lineData.content.charAt(this._position.column - 1); + if (strings.isHighSurrogate(lineData.content.charCodeAt(this._position.column - 1))) { + textContent += lineData.content.charAt(this._position.column); + } const tokenIndex = lineData.tokens.findTokenIndexAtOffset(this._position.column - 1); textContentClassName = lineData.tokens.getClassName(tokenIndex); } From 1139de12c0d05b690700b7592d00d7c9e625438a Mon Sep 17 00:00:00 2001 From: Ramya Achutha Rao Date: Wed, 25 Apr 2018 15:21:15 -0700 Subject: [PATCH 084/830] Create appInsights client only if user has opt-in to telemetry --- extensions/git/package.json | 2 +- extensions/git/yarn.lock | 6 +++--- extensions/html-language-features/package.json | 2 +- extensions/html-language-features/yarn.lock | 6 +++--- extensions/json-language-features/package.json | 2 +- extensions/json-language-features/yarn.lock | 6 +++--- extensions/markdown-language-features/package.json | 2 +- extensions/markdown-language-features/yarn.lock | 6 +++--- extensions/typescript-language-features/package.json | 2 +- extensions/typescript-language-features/yarn.lock | 6 +++--- 10 files changed, 20 insertions(+), 20 deletions(-) diff --git a/extensions/git/package.json b/extensions/git/package.json index f6d86f0a91b..c2851ea34c2 100644 --- a/extensions/git/package.json +++ b/extensions/git/package.json @@ -1114,7 +1114,7 @@ "file-type": "^7.2.0", "iconv-lite": "0.4.19", "jschardet": "^1.6.0", - "vscode-extension-telemetry": "0.0.16", + "vscode-extension-telemetry": "0.0.17", "vscode-nls": "^3.2.1", "which": "^1.3.0" }, diff --git a/extensions/git/yarn.lock b/extensions/git/yarn.lock index 6708fb651fc..3fb8a6f087a 100644 --- a/extensions/git/yarn.lock +++ b/extensions/git/yarn.lock @@ -257,9 +257,9 @@ supports-color@3.1.2: dependencies: has-flag "^1.0.0" -vscode-extension-telemetry@0.0.16: - version "0.0.16" - resolved "https://registry.yarnpkg.com/vscode-extension-telemetry/-/vscode-extension-telemetry-0.0.16.tgz#506cb49d7a8c90982019434651e5e3871b81c178" +vscode-extension-telemetry@0.0.17: + version "0.0.17" + resolved "https://registry.yarnpkg.com/vscode-extension-telemetry/-/vscode-extension-telemetry-0.0.17.tgz#15123e7edb34e7b9724b6056f54a869bbb922cb7" dependencies: applicationinsights "1.0.1" diff --git a/extensions/html-language-features/package.json b/extensions/html-language-features/package.json index 2de21c20bd7..1ac0a8f6c1e 100644 --- a/extensions/html-language-features/package.json +++ b/extensions/html-language-features/package.json @@ -172,7 +172,7 @@ } }, "dependencies": { - "vscode-extension-telemetry": "0.0.16", + "vscode-extension-telemetry": "0.0.17", "vscode-languageclient": "^4.0.0", "vscode-languageserver-protocol-foldingprovider": "^2.0.0-next.2", "vscode-nls": "^3.2.2" diff --git a/extensions/html-language-features/yarn.lock b/extensions/html-language-features/yarn.lock index dc4158605c2..6b64b12d4de 100644 --- a/extensions/html-language-features/yarn.lock +++ b/extensions/html-language-features/yarn.lock @@ -28,9 +28,9 @@ semver@^5.3.0: version "5.5.0" resolved "https://registry.yarnpkg.com/semver/-/semver-5.5.0.tgz#dc4bbc7a6ca9d916dee5d43516f0092b58f7b8ab" -vscode-extension-telemetry@0.0.16: - version "0.0.16" - resolved "https://registry.yarnpkg.com/vscode-extension-telemetry/-/vscode-extension-telemetry-0.0.16.tgz#506cb49d7a8c90982019434651e5e3871b81c178" +vscode-extension-telemetry@0.0.17: + version "0.0.17" + resolved "https://registry.yarnpkg.com/vscode-extension-telemetry/-/vscode-extension-telemetry-0.0.17.tgz#15123e7edb34e7b9724b6056f54a869bbb922cb7" dependencies: applicationinsights "1.0.1" diff --git a/extensions/json-language-features/package.json b/extensions/json-language-features/package.json index 9d4028b62fc..53ff50c6a8e 100644 --- a/extensions/json-language-features/package.json +++ b/extensions/json-language-features/package.json @@ -100,7 +100,7 @@ } }, "dependencies": { - "vscode-extension-telemetry": "0.0.16", + "vscode-extension-telemetry": "0.0.17", "vscode-languageclient": "^4.0.0", "vscode-languageserver-protocol-foldingprovider": "^2.0.0-next.2", "vscode-nls": "^3.2.2" diff --git a/extensions/json-language-features/yarn.lock b/extensions/json-language-features/yarn.lock index d6b9902f6f4..ccfd30a4ce1 100644 --- a/extensions/json-language-features/yarn.lock +++ b/extensions/json-language-features/yarn.lock @@ -28,9 +28,9 @@ semver@^5.3.0: version "5.5.0" resolved "https://registry.yarnpkg.com/semver/-/semver-5.5.0.tgz#dc4bbc7a6ca9d916dee5d43516f0092b58f7b8ab" -vscode-extension-telemetry@0.0.16: - version "0.0.16" - resolved "https://registry.yarnpkg.com/vscode-extension-telemetry/-/vscode-extension-telemetry-0.0.16.tgz#506cb49d7a8c90982019434651e5e3871b81c178" +vscode-extension-telemetry@0.0.17: + version "0.0.17" + resolved "https://registry.yarnpkg.com/vscode-extension-telemetry/-/vscode-extension-telemetry-0.0.17.tgz#15123e7edb34e7b9724b6056f54a869bbb922cb7" dependencies: applicationinsights "1.0.1" diff --git a/extensions/markdown-language-features/package.json b/extensions/markdown-language-features/package.json index 54338021532..491dfe08393 100644 --- a/extensions/markdown-language-features/package.json +++ b/extensions/markdown-language-features/package.json @@ -288,7 +288,7 @@ "highlight.js": "9.5.0", "markdown-it": "^8.4.0", "markdown-it-named-headers": "0.0.4", - "vscode-extension-telemetry": "0.0.16", + "vscode-extension-telemetry": "0.0.17", "vscode-nls": "^3.2.1" }, "devDependencies": { diff --git a/extensions/markdown-language-features/yarn.lock b/extensions/markdown-language-features/yarn.lock index 4225e3f21f7..915ae941b89 100644 --- a/extensions/markdown-language-features/yarn.lock +++ b/extensions/markdown-language-features/yarn.lock @@ -5415,9 +5415,9 @@ vm-browserify@0.0.4: dependencies: indexof "0.0.1" -vscode-extension-telemetry@0.0.16: - version "0.0.16" - resolved "https://registry.yarnpkg.com/vscode-extension-telemetry/-/vscode-extension-telemetry-0.0.16.tgz#506cb49d7a8c90982019434651e5e3871b81c178" +vscode-extension-telemetry@0.0.17: + version "0.0.17" + resolved "https://registry.yarnpkg.com/vscode-extension-telemetry/-/vscode-extension-telemetry-0.0.17.tgz#15123e7edb34e7b9724b6056f54a869bbb922cb7" dependencies: applicationinsights "1.0.1" diff --git a/extensions/typescript-language-features/package.json b/extensions/typescript-language-features/package.json index 64a2132a32c..56ecdf7b32e 100644 --- a/extensions/typescript-language-features/package.json +++ b/extensions/typescript-language-features/package.json @@ -17,7 +17,7 @@ ], "dependencies": { "semver": "4.3.6", - "vscode-extension-telemetry": "0.0.16", + "vscode-extension-telemetry": "0.0.17", "vscode-nls": "^3.2.1" }, "devDependencies": { diff --git a/extensions/typescript-language-features/yarn.lock b/extensions/typescript-language-features/yarn.lock index 40b09e92104..ec56dbc96f3 100644 --- a/extensions/typescript-language-features/yarn.lock +++ b/extensions/typescript-language-features/yarn.lock @@ -36,9 +36,9 @@ semver@^5.3.0: version "5.5.0" resolved "https://registry.yarnpkg.com/semver/-/semver-5.5.0.tgz#dc4bbc7a6ca9d916dee5d43516f0092b58f7b8ab" -vscode-extension-telemetry@0.0.16: - version "0.0.16" - resolved "https://registry.yarnpkg.com/vscode-extension-telemetry/-/vscode-extension-telemetry-0.0.16.tgz#506cb49d7a8c90982019434651e5e3871b81c178" +vscode-extension-telemetry@0.0.17: + version "0.0.17" + resolved "https://registry.yarnpkg.com/vscode-extension-telemetry/-/vscode-extension-telemetry-0.0.17.tgz#15123e7edb34e7b9724b6056f54a869bbb922cb7" dependencies: applicationinsights "1.0.1" From 2272f36e5921f1a3b8bf631f0f4b8888b9476d01 Mon Sep 17 00:00:00 2001 From: Rob Lourens Date: Wed, 25 Apr 2018 15:21:04 -0700 Subject: [PATCH 085/830] Fix #47157 - "Toggle query details" should focus include/exclude box --- src/vs/workbench/parts/search/browser/searchView.ts | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/vs/workbench/parts/search/browser/searchView.ts b/src/vs/workbench/parts/search/browser/searchView.ts index a2aab9a43d0..3b61bb35014 100644 --- a/src/vs/workbench/parts/search/browser/searchView.ts +++ b/src/vs/workbench/parts/search/browser/searchView.ts @@ -226,13 +226,13 @@ export class SearchView extends Viewlet implements IViewlet, IPanel { builder.div({ 'class': 'more', 'tabindex': 0, 'role': 'button', 'title': nls.localize('moreSearch', "Toggle Search Details") }) .on(dom.EventType.CLICK, (e) => { dom.EventHelper.stop(e); - this.toggleQueryDetails(true); + this.toggleQueryDetails(); }).on(dom.EventType.KEY_UP, (e: KeyboardEvent) => { let event = new StandardKeyboardEvent(e); if (event.equals(KeyCode.Enter) || event.equals(KeyCode.Space)) { dom.EventHelper.stop(e); - this.toggleQueryDetails(); + this.toggleQueryDetails(false); } }); @@ -943,7 +943,7 @@ export class SearchView extends Viewlet implements IViewlet, IPanel { this.onQueryChanged(true, true); } - public toggleQueryDetails(moveFocus?: boolean, show?: boolean, skipLayout?: boolean, reverse?: boolean): void { + public toggleQueryDetails(moveFocus = true, show?: boolean, skipLayout?: boolean, reverse?: boolean): void { let cls = 'more'; show = typeof show === 'undefined' ? !dom.hasClass(this.queryDetails, cls) : Boolean(show); this.viewletSettings['query.queryDetailsExpanded'] = show; From f36cae36dc9cdd2ae8ea2f2b2316ad63cb62d370 Mon Sep 17 00:00:00 2001 From: Matt Bierner Date: Wed, 25 Apr 2018 15:33:30 -0700 Subject: [PATCH 086/830] Add vscode namespace in webview From discussion around #48540 --- .../markdown-language-features/media/index.js | 6 ++--- .../markdown-language-features/media/pre.js | 6 ++--- .../preview-src/messaging.ts | 6 +++-- .../webview/electron-browser/webview-pre.js | 24 ++++++++++++++++++- 4 files changed, 33 insertions(+), 9 deletions(-) diff --git a/extensions/markdown-language-features/media/index.js b/extensions/markdown-language-features/media/index.js index 567245df45d..cba62281adf 100644 --- a/extensions/markdown-language-features/media/index.js +++ b/extensions/markdown-language-features/media/index.js @@ -759,11 +759,11 @@ const settings_1 = __webpack_require__(/*! ./settings */ "./preview-src/settings * Post a message to the markdown extension */ function postMessage(type, body) { - window.parent.postMessage({ + vscode.postMessage({ type, source: settings_1.getSettings().source, body - }, '*'); + }); } exports.postMessage = postMessage; /** @@ -940,4 +940,4 @@ exports.getSettings = getSettings; /***/ }) /******/ }); -//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vd2VicGFjay9ib290c3RyYXAiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC50aHJvdHRsZS9pbmRleC5qcyIsIndlYnBhY2s6Ly8vKHdlYnBhY2spL2J1aWxkaW4vZ2xvYmFsLmpzIiwid2VicGFjazovLy8uL3ByZXZpZXctc3JjL2FjdGl2ZUxpbmVNYXJrZXIudHMiLCJ3ZWJwYWNrOi8vLy4vcHJldmlldy1zcmMvZXZlbnRzLnRzIiwid2VicGFjazovLy8uL3ByZXZpZXctc3JjL2luZGV4LnRzIiwid2VicGFjazovLy8uL3ByZXZpZXctc3JjL21lc3NhZ2luZy50cyIsIndlYnBhY2s6Ly8vLi9wcmV2aWV3LXNyYy9zY3JvbGwtc3luYy50cyIsIndlYnBhY2s6Ly8vLi9wcmV2aWV3LXNyYy9zZXR0aW5ncy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7OztBQUdBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQUs7QUFDTDtBQUNBOztBQUVBO0FBQ0E7QUFDQSx5REFBaUQsY0FBYztBQUMvRDs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxtQ0FBMkIsMEJBQTBCLEVBQUU7QUFDdkQseUNBQWlDLGVBQWU7QUFDaEQ7QUFDQTtBQUNBOztBQUVBO0FBQ0EsOERBQXNELCtEQUErRDs7QUFFckg7QUFDQTs7O0FBR0E7QUFDQTs7Ozs7Ozs7Ozs7O0FDbkVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNB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RCxNQUFNLElBQUksS0FBSyxDQUFDLHlCQUF5QixDQUFDLENBQUM7QUFDNUMsQ0FBQztBQWZELGtDQWVDIiwiZmlsZSI6ImluZGV4LmpzIiwic291cmNlc0NvbnRlbnQiOlsiIFx0Ly8gVGhlIG1vZHVsZSBjYWNoZVxuIFx0dmFyIGluc3RhbGxlZE1vZHVsZXMgPSB7fTtcblxuIFx0Ly8gVGhlIHJlcXVpcmUgZnVuY3Rpb25cbiBcdGZ1bmN0aW9uIF9fd2VicGFja19yZXF1aXJlX18obW9kdWxlSWQpIHtcblxuIFx0XHQvLyBDaGVjayBpZiBtb2R1bGUgaXMgaW4gY2FjaGVcbiBcdFx0aWYoaW5zdGFsbGVkTW9kdWxlc1ttb2R1bGVJZF0pIHtcbiBcdFx0XHRyZXR1cm4gaW5zdGFsbGVkTW9kdWxlc1ttb2R1bGVJZF0uZXhwb3J0cztcbiBcdFx0fVxuIFx0XHQvLyBDcmVhdGUgYSBuZXcgbW9kdWxlIChhbmQgcHV0IGl0IGludG8gdGhlIGNhY2hlKVxuIFx0XHR2YXIgbW9kdWxlID0gaW5zdGFsbGVkTW9kdWxlc1ttb2R1bGVJZF0gPSB7XG4gXHRcdFx0aTogbW9kdWxlSWQsXG4gXHRcdFx0bDogZmFsc2UsXG4gXHRcdFx0ZXhwb3J0czoge31cbiBcdFx0fTtcblxuIFx0XHQvLyBFeGVjdXRlIHRoZSBtb2R1bGUgZnVuY3Rpb25cbiBcdFx0bW9kdWxlc1ttb2R1bGVJZF0uY2FsbChtb2R1bGUuZXhwb3J0cywgbW9kdWxlLCBtb2R1bGUuZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXyk7XG5cbiBcdFx0Ly8gRmxhZyB0aGUgbW9kdWxlIGFzIGxvYWRlZFxuIFx0XHRtb2R1bGUubCA9IHRydWU7XG5cbiBcdFx0Ly8gUmV0dXJuIHRoZSBleHBvcnRzIG9mIHRoZSBtb2R1bGVcbiBcdFx0cmV0dXJuIG1vZHVsZS5leHBvcnRzO1xuIFx0fVxuXG5cbiBcdC8vIGV4cG9zZSB0aGUgbW9kdWxlcyBvYmplY3QgKF9fd2VicGFja19tb2R1bGVzX18pXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLm0gPSBtb2R1bGVzO1xuXG4gXHQvLyBleHBvc2UgdGhlIG1vZHVsZSBjYWNoZVxuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5jID0gaW5zdGFsbGVkTW9kdWxlcztcblxuIFx0Ly8gZGVmaW5lIGdldHRlciBmdW5jdGlvbiBmb3IgaGFybW9ueSBleHBvcnRzXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLmQgPSBmdW5jdGlvbihleHBvcnRzLCBuYW1lLCBnZXR0ZXIpIHtcbiBcdFx0aWYoIV9fd2VicGFja19yZXF1aXJlX18ubyhleHBvcnRzLCBuYW1lKSkge1xuIFx0XHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBuYW1lLCB7XG4gXHRcdFx0XHRjb25maWd1cmFibGU6IGZhbHNlLFxuIFx0XHRcdFx0ZW51bWVyYWJsZTogdHJ1ZSxcbiBcdFx0XHRcdGdldDogZ2V0dGVyXG4gXHRcdFx0fSk7XG4gXHRcdH1cbiBcdH07XG5cbiBcdC8vIGRlZmluZSBfX2VzTW9kdWxlIG9uIGV4cG9ydHNcbiBcdF9fd2VicGFja19yZXF1aXJlX18uciA9IGZ1bmN0aW9uKGV4cG9ydHMpIHtcbiBcdFx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsICdfX2VzTW9kdWxlJywgeyB2YWx1ZTogdHJ1ZSB9KTtcbiBcdH07XG5cbiBcdC8vIGdldERlZmF1bHRFeHBvcnQgZnVuY3Rpb24gZm9yIGNvbXBhdGliaWxpdHkgd2l0aCBub24taGFybW9ueSBtb2R1bGVzXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLm4gPSBmdW5jdGlvbihtb2R1bGUpIHtcbiBcdFx0dmFyIGdldHRlciA9IG1vZHVsZSAmJiBtb2R1bGUuX19lc01vZHVsZSA/XG4gXHRcdFx0ZnVuY3Rpb24gZ2V0RGVmYXVsdCgpIHsgcmV0dXJuIG1vZHVsZVsnZGVmYXVsdCddOyB9IDpcbiBcdFx0XHRmdW5jdGlvbiBnZXRNb2R1bGVFeHBvcnRzKCkgeyByZXR1cm4gbW9kdWxlOyB9O1xuIFx0XHRfX3dlYnBhY2tfcmVxdWlyZV9fLmQoZ2V0dGVyLCAnYScsIGdldHRlcik7XG4gXHRcdHJldHVybiBnZXR0ZXI7XG4gXHR9O1xuXG4gXHQvLyBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGxcbiBcdF9fd2VicGFja19yZXF1aXJlX18ubyA9IGZ1bmN0aW9uKG9iamVjdCwgcHJvcGVydHkpIHsgcmV0dXJuIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChvYmplY3QsIHByb3BlcnR5KTsgfTtcblxuIFx0Ly8gX193ZWJwYWNrX3B1YmxpY19wYXRoX19cbiBcdF9fd2VicGFja19yZXF1aXJlX18ucCA9IFwiXCI7XG5cblxuIFx0Ly8gTG9hZCBlbnRyeSBtb2R1bGUgYW5kIHJldHVybiBleHBvcnRzXG4gXHRyZXR1cm4gX193ZWJwYWNrX3JlcXVpcmVfXyhfX3dlYnBhY2tfcmVxdWlyZV9fLnMgPSBcIi4vcHJldmlldy1zcmMvaW5kZXgudHNcIik7XG4iLCIvKipcbiAqIGxvZGFzaCAoQ3VzdG9tIEJ1aWxkKSA8aHR0cHM6Ly9sb2Rhc2guY29tLz5cbiAqIEJ1aWxkOiBgbG9kYXNoIG1vZHVsYXJpemUgZXhwb3J0cz1cIm5wbVwiIC1vIC4vYFxuICogQ29weXJpZ2h0IGpRdWVyeSBGb3VuZGF0aW9uIGFuZCBvdGhlciBjb250cmlidXRvcnMgPGh0dHBzOi8vanF1ZXJ5Lm9yZy8+XG4gKiBSZWxlYXNlZCB1bmRlciBNSVQgbGljZW5zZSA8aHR0cHM6Ly9sb2Rhc2guY29tL2xpY2Vuc2U+XG4gKiBCYXNlZCBvbiBVbmRlcnNjb3JlLmpzIDEuOC4zIDxodHRwOi8vdW5kZXJzY29yZWpzLm9yZy9MSUNFTlNFPlxuICogQ29weXJpZ2h0IEplcmVteSBBc2hrZW5hcywgRG9jdW1lbnRDbG91ZCBhbmQgSW52ZXN0aWdhdGl2ZSBSZXBvcnRlcnMgJiBFZGl0b3JzXG4gKi9cblxuLyoqIFVzZWQgYXMgdGhlIGBUeXBlRXJyb3JgIG1lc3NhZ2UgZm9yIFwiRnVuY3Rpb25zXCIgbWV0aG9kcy4gKi9cbnZhciBGVU5DX0VSUk9SX1RFWFQgPSAnRXhwZWN0ZWQgYSBmdW5jdGlvbic7XG5cbi8qKiBVc2VkIGFzIHJlZmVyZW5jZXMgZm9yIHZhcmlvdXMgYE51bWJlcmAgY29uc3RhbnRzLiAqL1xudmFyIE5BTiA9IDAgLyAwO1xuXG4vKiogYE9iamVjdCN0b1N0cmluZ2AgcmVzdWx0IHJlZmVyZW5jZXMuICovXG52YXIgc3ltYm9sVGFnID0gJ1tvYmplY3QgU3ltYm9sXSc7XG5cbi8qKiBVc2VkIHRvIG1hdGNoIGxlYWRpbmcgYW5kIHRyYWlsaW5nIHdoaXRlc3BhY2UuICovXG52YXIgcmVUcmltID0gL15cXHMrfFxccyskL2c7XG5cbi8qKiBVc2VkIHRvIGRldGVjdCBiYWQgc2lnbmVkIGhleGFkZWNpbWFsIHN0cmluZyB2YWx1ZXMuICovXG52YXIgcmVJc0JhZEhleCA9IC9eWy0rXTB4WzAtOWEtZl0rJC9pO1xuXG4vKiogVXNlZCB0byBkZXRlY3QgYmluYXJ5IHN0cmluZyB2YWx1ZXMuICovXG52YXIgcmVJc0JpbmFyeSA9IC9eMGJbMDFdKyQvaTtcblxuLyoqIFVzZWQgdG8gZGV0ZWN0IG9jdGFsIHN0cmluZyB2YWx1ZXMuICovXG52YXIgcmVJc09jdGFsID0gL14wb1swLTddKyQvaTtcblxuLyoqIEJ1aWx0LWluIG1ldGhvZCByZWZlcmVuY2VzIHdpdGhvdXQgYSBkZXBlbmRlbmN5IG9uIGByb290YC4gKi9cbnZhciBmcmVlUGFyc2VJbnQgPSBwYXJzZUludDtcblxuLyoqIERldGVjdCBmcmVlIHZhcmlhYmxlIGBnbG9iYWxgIGZyb20gTm9kZS5qcy4gKi9cbnZhciBmcmVlR2xvYmFsID0gdHlwZW9mIGdsb2JhbCA9PSAnb2JqZWN0JyAmJiBnbG9iYWwgJiYgZ2xvYmFsLk9iamVjdCA9PT0gT2JqZWN0ICYmIGdsb2JhbDtcblxuLyoqIERldGVjdCBmcmVlIHZhcmlhYmxlIGBzZWxmYC4gKi9cbnZhciBmcmVlU2VsZiA9IHR5cGVvZiBzZWxmID09ICdvYmplY3QnICYmIHNlbGYgJiYgc2VsZi5PYmplY3QgPT09IE9iamVjdCAmJiBzZWxmO1xuXG4vKiogVXNlZCBhcyBhIHJlZmVyZW5jZSB0byB0aGUgZ2xvYmFsIG9iamVjdC4gKi9cbnZhciByb290ID0gZnJlZUdsb2JhbCB8fCBmcmVlU2VsZiB8fCBGdW5jdGlvbigncmV0dXJuIHRoaXMnKSgpO1xuXG4vKiogVXNlZCBmb3IgYnVpbHQtaW4gbWV0aG9kIHJlZmVyZW5jZXMuICovXG52YXIgb2JqZWN0UHJvdG8gPSBPYmplY3QucHJvdG90eXBlO1xuXG4vKipcbiAqIFVzZWQgdG8gcmVzb2x2ZSB0aGVcbiAqIFtgdG9TdHJpbmdUYWdgXShodHRwOi8vZWNtYS1pbnRlcm5hdGlvbmFsLm9yZy9lY21hLTI2Mi83LjAvI3NlYy1vYmplY3QucHJvdG90eXBlLnRvc3RyaW5nKVxuICogb2YgdmFsdWVzLlxuICovXG52YXIgb2JqZWN0VG9TdHJpbmcgPSBvYmplY3RQcm90by50b1N0cmluZztcblxuLyogQnVpbHQtaW4gbWV0aG9kIHJlZmVyZW5jZXMgZm9yIHRob3NlIHdpdGggdGhlIHNhbWUgbmFtZSBhcyBvdGhlciBgbG9kYXNoYCBtZXRob2RzLiAqL1xudmFyIG5hdGl2ZU1heCA9IE1hdGgubWF4LFxuICAgIG5hdGl2ZU1pbiA9IE1hdGgubWluO1xuXG4vKipcbiAqIEdldHMgdGhlIHRpbWVzdGFtcCBvZiB0aGUgbnVtYmVyIG9mIG1pbGxpc2Vjb25kcyB0aGF0IGhhdmUgZWxhcHNlZCBzaW5jZVxuICogdGhlIFVuaXggZXBvY2ggKDEgSmFudWFyeSAxOTcwIDAwOjAwOjAwIFVUQykuXG4gKlxuICogQHN0YXRpY1xuICogQG1lbWJlck9mIF9cbiAqIEBzaW5jZSAyLjQuMFxuICogQGNhdGVnb3J5IERhdGVcbiAqIEByZXR1cm5zIHtudW1iZXJ9IFJldHVybnMgdGhlIHRpbWVzdGFtcC5cbiAqIEBleGFtcGxlXG4gKlxuICogXy5kZWZlcihmdW5jdGlvbihzdGFtcCkge1xuICogICBjb25zb2xlLmxvZyhfLm5vdygpIC0gc3RhbXApO1xuICogfSwgXy5ub3coKSk7XG4gKiAvLyA9PiBMb2dzIHRoZSBudW1iZXIgb2YgbWlsbGlzZWNvbmRzIGl0IHRvb2sgZm9yIHRoZSBkZWZlcnJlZCBpbnZvY2F0aW9uLlxuICovXG52YXIgbm93ID0gZnVuY3Rpb24oKSB7XG4gIHJldHVybiByb290LkRhdGUubm93KCk7XG59O1xuXG4vKipcbiAqIENyZWF0ZXMgYSBkZWJvdW5jZWQgZnVuY3Rpb24gdGhhdCBkZWxheXMgaW52b2tpbmcgYGZ1bmNgIHVudGlsIGFmdGVyIGB3YWl0YFxuICogbWlsbGlzZWNvbmRzIGhhdmUgZWxhcHNlZCBzaW5jZSB0aGUgbGFzdCB0aW1lIHRoZSBkZWJvdW5jZWQgZnVuY3Rpb24gd2FzXG4gKiBpbnZva2VkLiBUaGUgZGVib3VuY2VkIGZ1bmN0aW9uIGNvbWVzIHdpdGggYSBgY2FuY2VsYCBtZXRob2QgdG8gY2FuY2VsXG4gKiBkZWxheWVkIGBmdW5jYCBpbnZvY2F0aW9ucyBhbmQgYSBgZmx1c2hgIG1ldGhvZCB0byBpbW1lZGlhdGVseSBpbnZva2UgdGhlbS5cbiAqIFByb3ZpZGUgYG9wdGlvbnNgIHRvIGluZGljYXRlIHdoZXRoZXIgYGZ1bmNgIHNob3VsZCBiZSBpbnZva2VkIG9uIHRoZVxuICogbGVhZGluZyBhbmQvb3IgdHJhaWxpbmcgZWRnZSBvZiB0aGUgYHdhaXRgIHRpbWVvdXQuIFRoZSBgZnVuY2AgaXMgaW52b2tlZFxuICogd2l0aCB0aGUgbGFzdCBhcmd1bWVudHMgcHJvdmlkZWQgdG8gdGhlIGRlYm91bmNlZCBmdW5jdGlvbi4gU3Vic2VxdWVudFxuICogY2FsbHMgdG8gdGhlIGRlYm91bmNlZCBmdW5jdGlvbiByZXR1cm4gdGhlIHJlc3VsdCBvZiB0aGUgbGFzdCBgZnVuY2BcbiAqIGludm9jYXRpb24uXG4gKlxuICogKipOb3RlOioqIElmIGBsZWFkaW5nYCBhbmQgYHRyYWlsaW5nYCBvcHRpb25zIGFyZSBgdHJ1ZWAsIGBmdW5jYCBpc1xuICogaW52b2tlZCBvbiB0aGUgdHJhaWxpbmcgZWRnZSBvZiB0aGUgdGltZW91dCBvbmx5IGlmIHRoZSBkZWJvdW5jZWQgZnVuY3Rpb25cbiAqIGlzIGludm9rZWQgbW9yZSB0aGFuIG9uY2UgZHVyaW5nIHRoZSBgd2FpdGAgdGltZW91dC5cbiAqXG4gKiBJZiBgd2FpdGAgaXMgYDBgIGFuZCBgbGVhZGluZ2AgaXMgYGZhbHNlYCwgYGZ1bmNgIGludm9jYXRpb24gaXMgZGVmZXJyZWRcbiAqIHVudGlsIHRvIHRoZSBuZXh0IHRpY2ssIHNpbWlsYXIgdG8gYHNldFRpbWVvdXRgIHdpdGggYSB0aW1lb3V0IG9mIGAwYC5cbiAqXG4gKiBTZWUgW0RhdmlkIENvcmJhY2hvJ3MgYXJ0aWNsZV0oaHR0cHM6Ly9jc3MtdHJpY2tzLmNvbS9kZWJvdW5jaW5nLXRocm90dGxpbmctZXhwbGFpbmVkLWV4YW1wbGVzLylcbiAqIGZvciBkZXRhaWxzIG92ZXIgdGhlIGRpZmZlcmVuY2VzIGJldHdlZW4gYF8uZGVib3VuY2VgIGFuZCBgXy50aHJvdHRsZWAuXG4gKlxuICogQHN0YXRpY1xuICogQG1lbWJlck9mIF9cbiAqIEBzaW5jZSAwLjEuMFxuICogQGNhdGVnb3J5IEZ1bmN0aW9uXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBmdW5jIFRoZSBmdW5jdGlvbiB0byBkZWJvdW5jZS5cbiAqIEBwYXJhbSB7bnVtYmVyfSBbd2FpdD0wXSBUaGUgbnVtYmVyIG9mIG1pbGxpc2Vjb25kcyB0byBkZWxheS5cbiAqIEBwYXJhbSB7T2JqZWN0fSBbb3B0aW9ucz17fV0gVGhlIG9wdGlvbnMgb2JqZWN0LlxuICogQHBhcmFtIHtib29sZWFufSBbb3B0aW9ucy5sZWFkaW5nPWZhbHNlXVxuICogIFNwZWNpZnkgaW52b2tpbmcgb24gdGhlIGxlYWRpbmcgZWRnZSBvZiB0aGUgdGltZW91dC5cbiAqIEBwYXJhbSB7bnVtYmVyfSBbb3B0aW9ucy5tYXhXYWl0XVxuICogIFRoZSBtYXhpbXVtIHRpbWUgYGZ1bmNgIGlzIGFsbG93ZWQgdG8gYmUgZGVsYXllZCBiZWZvcmUgaXQncyBpbnZva2VkLlxuICogQHBhcmFtIHtib29sZWFufSBbb3B0aW9ucy50cmFpbGluZz10cnVlXVxuICogIFNwZWNpZnkgaW52b2tpbmcgb24gdGhlIHRyYWlsaW5nIGVkZ2Ugb2YgdGhlIHRpbWVvdXQuXG4gKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIG5ldyBkZWJvdW5jZWQgZnVuY3Rpb24uXG4gKiBAZXhhbXBsZVxuICpcbiAqIC8vIEF2b2lkIGNvc3RseSBjYWxjdWxhdGlvbnMgd2hpbGUgdGhlIHdpbmRvdyBzaXplIGlzIGluIGZsdXguXG4gKiBqUXVlcnkod2luZG93KS5vbigncmVzaXplJywgXy5kZWJvdW5jZShjYWxjdWxhdGVMYXlvdXQsIDE1MCkpO1xuICpcbiAqIC8vIEludm9rZSBgc2VuZE1haWxgIHdoZW4gY2xpY2tlZCwgZGVib3VuY2luZyBzdWJzZXF1ZW50IGNhbGxzLlxuICogalF1ZXJ5KGVsZW1lbnQpLm9uKCdjbGljaycsIF8uZGVib3VuY2Uoc2VuZE1haWwsIDMwMCwge1xuICogICAnbGVhZGluZyc6IHRydWUsXG4gKiAgICd0cmFpbGluZyc6IGZhbHNlXG4gKiB9KSk7XG4gKlxuICogLy8gRW5zdXJlIGBiYXRjaExvZ2AgaXMgaW52b2tlZCBvbmNlIGFmdGVyIDEgc2Vjb25kIG9mIGRlYm91bmNlZCBjYWxscy5cbiAqIHZhciBkZWJvdW5jZWQgPSBfLmRlYm91bmNlKGJhdGNoTG9nLCAyNTAsIHsgJ21heFdhaXQnOiAxMDAwIH0pO1xuICogdmFyIHNvdXJjZSA9IG5ldyBFdmVudFNvdXJjZSgnL3N0cmVhbScpO1xuICogalF1ZXJ5KHNvdXJjZSkub24oJ21lc3NhZ2UnLCBkZWJvdW5jZWQpO1xuICpcbiAqIC8vIENhbmNlbCB0aGUgdHJhaWxpbmcgZGVib3VuY2VkIGludm9jYXRpb24uXG4gKiBqUXVlcnkod2luZG93KS5vbigncG9wc3RhdGUnLCBkZWJvdW5jZWQuY2FuY2VsKTtcbiAqL1xuZnVuY3Rpb24gZGVib3VuY2UoZnVuYywgd2FpdCwgb3B0aW9ucykge1xuICB2YXIgbGFzdEFyZ3MsXG4gICAgICBsYXN0VGhpcyxcbiAgICAgIG1heFdhaXQsXG4gICAgICByZXN1bHQsXG4gICAgICB0aW1lcklkLFxuICAgICAgbGFzdENhbGxUaW1lLFxuICAgICAgbGFzdEludm9rZVRpbWUgPSAwLFxuICAgICAgbGVhZGluZyA9IGZhbHNlLFxuICAgICAgbWF4aW5nID0gZmFsc2UsXG4gICAgICB0cmFpbGluZyA9IHRydWU7XG5cbiAgaWYgKHR5cGVvZiBmdW5jICE9ICdmdW5jdGlvbicpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKEZVTkNfRVJST1JfVEVYVCk7XG4gIH1cbiAgd2FpdCA9IHRvTnVtYmVyKHdhaXQpIHx8IDA7XG4gIGlmIChpc09iamVjdChvcHRpb25zKSkge1xuICAgIGxlYWRpbmcgPSAhIW9wdGlvbnMubGVhZGluZztcbiAgICBtYXhpbmcgPSAnbWF4V2FpdCcgaW4gb3B0aW9ucztcbiAgICBtYXhXYWl0ID0gbWF4aW5nID8gbmF0aXZlTWF4KHRvTnVtYmVyKG9wdGlvbnMubWF4V2FpdCkgfHwgMCwgd2FpdCkgOiBtYXhXYWl0O1xuICAgIHRyYWlsaW5nID0gJ3RyYWlsaW5nJyBpbiBvcHRpb25zID8gISFvcHRpb25zLnRyYWlsaW5nIDogdHJhaWxpbmc7XG4gIH1cblxuICBmdW5jdGlvbiBpbnZva2VGdW5jKHRpbWUpIHtcbiAgICB2YXIgYXJncyA9IGxhc3RBcmdzLFxuICAgICAgICB0aGlzQXJnID0gbGFzdFRoaXM7XG5cbiAgICBsYXN0QXJncyA9IGxhc3RUaGlzID0gdW5kZWZpbmVkO1xuICAgIGxhc3RJbnZva2VUaW1lID0gdGltZTtcbiAgICByZXN1bHQgPSBmdW5jLmFwcGx5KHRoaXNBcmcsIGFyZ3MpO1xuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cblxuICBmdW5jdGlvbiBsZWFkaW5nRWRnZSh0aW1lKSB7XG4gICAgLy8gUmVzZXQgYW55IGBtYXhXYWl0YCB0aW1lci5cbiAgICBsYXN0SW52b2tlVGltZSA9IHRpbWU7XG4gICAgLy8gU3RhcnQgdGhlIHRpbWVyIGZvciB0aGUgdHJhaWxpbmcgZWRnZS5cbiAgICB0aW1lcklkID0gc2V0VGltZW91dCh0aW1lckV4cGlyZWQsIHdhaXQpO1xuICAgIC8vIEludm9rZSB0aGUgbGVhZGluZyBlZGdlLlxuICAgIHJldHVybiBsZWFkaW5nID8gaW52b2tlRnVuYyh0aW1lKSA6IHJlc3VsdDtcbiAgfVxuXG4gIGZ1bmN0aW9uIHJlbWFpbmluZ1dhaXQodGltZSkge1xuICAgIHZhciB0aW1lU2luY2VMYXN0Q2FsbCA9IHRpbWUgLSBsYXN0Q2FsbFRpbWUsXG4gICAgICAgIHRpbWVTaW5jZUxhc3RJbnZva2UgPSB0aW1lIC0gbGFzdEludm9rZVRpbWUsXG4gICAgICAgIHJlc3VsdCA9IHdhaXQgLSB0aW1lU2luY2VMYXN0Q2FsbDtcblxuICAgIHJldHVybiBtYXhpbmcgPyBuYXRpdmVNaW4ocmVzdWx0LCBtYXhXYWl0IC0gdGltZVNpbmNlTGFzdEludm9rZSkgOiByZXN1bHQ7XG4gIH1cblxuICBmdW5jdGlvbiBzaG91bGRJbnZva2UodGltZSkge1xuICAgIHZhciB0aW1lU2luY2VMYXN0Q2FsbCA9IHRpbWUgLSBsYXN0Q2FsbFRpbWUsXG4gICAgICAgIHRpbWVTaW5jZUxhc3RJbnZva2UgPSB0aW1lIC0gbGFzdEludm9rZVRpbWU7XG5cbiAgICAvLyBFaXRoZXIgdGhpcyBpcyB0aGUgZmlyc3QgY2FsbCwgYWN0aXZpdHkgaGFzIHN0b3BwZWQgYW5kIHdlJ3JlIGF0IHRoZVxuICAgIC8vIHRyYWlsaW5nIGVkZ2UsIHRoZSBzeXN0ZW0gdGltZSBoYXMgZ29uZSBiYWNrd2FyZHMgYW5kIHdlJ3JlIHRyZWF0aW5nXG4gICAgLy8gaXQgYXMgdGhlIHRyYWlsaW5nIGVkZ2UsIG9yIHdlJ3ZlIGhpdCB0aGUgYG1heFdhaXRgIGxpbWl0LlxuICAgIHJldHVybiAobGFzdENhbGxUaW1lID09PSB1bmRlZmluZWQgfHwgKHRpbWVTaW5jZUxhc3RDYWxsID49IHdhaXQpIHx8XG4gICAgICAodGltZVNpbmNlTGFzdENhbGwgPCAwKSB8fCAobWF4aW5nICYmIHRpbWVTaW5jZUxhc3RJbnZva2UgPj0gbWF4V2FpdCkpO1xuICB9XG5cbiAgZnVuY3Rpb24gdGltZXJFeHBpcmVkKCkge1xuICAgIHZhciB0aW1lID0gbm93KCk7XG4gICAgaWYgKHNob3VsZEludm9rZSh0aW1lKSkge1xuICAgICAgcmV0dXJuIHRyYWlsaW5nRWRnZSh0aW1lKTtcbiAgICB9XG4gICAgLy8gUmVzdGFydCB0aGUgdGltZXIuXG4gICAgdGltZXJJZCA9IHNldFRpbWVvdXQodGltZXJFeHBpcmVkLCByZW1haW5pbmdXYWl0KHRpbWUpKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIHRyYWlsaW5nRWRnZSh0aW1lKSB7XG4gICAgdGltZXJJZCA9IHVuZGVmaW5lZDtcblxuICAgIC8vIE9ubHkgaW52b2tlIGlmIHdlIGhhdmUgYGxhc3RBcmdzYCB3aGljaCBtZWFucyBgZnVuY2AgaGFzIGJlZW5cbiAgICAvLyBkZWJvdW5jZWQgYXQgbGVhc3Qgb25jZS5cbiAgICBpZiAodHJhaWxpbmcgJiYgbGFzdEFyZ3MpIHtcbiAgICAgIHJldHVybiBpbnZva2VGdW5jKHRpbWUpO1xuICAgIH1cbiAgICBsYXN0QXJncyA9IGxhc3RUaGlzID0gdW5kZWZpbmVkO1xuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cblxuICBmdW5jdGlvbiBjYW5jZWwoKSB7XG4gICAgaWYgKHRpbWVySWQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgY2xlYXJUaW1lb3V0KHRpbWVySWQpO1xuICAgIH1cbiAgICBsYXN0SW52b2tlVGltZSA9IDA7XG4gICAgbGFzdEFyZ3MgPSBsYXN0Q2FsbFRpbWUgPSBsYXN0VGhpcyA9IHRpbWVySWQgPSB1bmRlZmluZWQ7XG4gIH1cblxuICBmdW5jdGlvbiBmbHVzaCgpIHtcbiAgICByZXR1cm4gdGltZXJJZCA9PT0gdW5kZWZpbmVkID8gcmVzdWx0IDogdHJhaWxpbmdFZGdlKG5vdygpKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGRlYm91bmNlZCgpIHtcbiAgICB2YXIgdGltZSA9IG5vdygpLFxuICAgICAgICBpc0ludm9raW5nID0gc2hvdWxkSW52b2tlKHRpbWUpO1xuXG4gICAgbGFzdEFyZ3MgPSBhcmd1bWVudHM7XG4gICAgbGFzdFRoaXMgPSB0aGlzO1xuICAgIGxhc3RDYWxsVGltZSA9IHRpbWU7XG5cbiAgICBpZiAoaXNJbnZva2luZykge1xuICAgICAgaWYgKHRpbWVySWQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICByZXR1cm4gbGVhZGluZ0VkZ2UobGFzdENhbGxUaW1lKTtcbiAgICAgIH1cbiAgICAgIGlmIChtYXhpbmcpIHtcbiAgICAgICAgLy8gSGFuZGxlIGludm9jYXRpb25zIGluIGEgdGlnaHQgbG9vcC5cbiAgICAgICAgdGltZXJJZCA9IHNldFRpbWVvdXQodGltZXJFeHBpcmVkLCB3YWl0KTtcbiAgICAgICAgcmV0dXJuIGludm9rZUZ1bmMobGFzdENhbGxUaW1lKTtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKHRpbWVySWQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgdGltZXJJZCA9IHNldFRpbWVvdXQodGltZXJFeHBpcmVkLCB3YWl0KTtcbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuICBkZWJvdW5jZWQuY2FuY2VsID0gY2FuY2VsO1xuICBkZWJvdW5jZWQuZmx1c2ggPSBmbHVzaDtcbiAgcmV0dXJuIGRlYm91bmNlZDtcbn1cblxuLyoqXG4gKiBDcmVhdGVzIGEgdGhyb3R0bGVkIGZ1bmN0aW9uIHRoYXQgb25seSBpbnZva2VzIGBmdW5jYCBhdCBtb3N0IG9uY2UgcGVyXG4gKiBldmVyeSBgd2FpdGAgbWlsbGlzZWNvbmRzLiBUaGUgdGhyb3R0bGVkIGZ1bmN0aW9uIGNvbWVzIHdpdGggYSBgY2FuY2VsYFxuICogbWV0aG9kIHRvIGNhbmNlbCBkZWxheWVkIGBmdW5jYCBpbnZvY2F0aW9ucyBhbmQgYSBgZmx1c2hgIG1ldGhvZCB0b1xuICogaW1tZWRpYXRlbHkgaW52b2tlIHRoZW0uIFByb3ZpZGUgYG9wdGlvbnNgIHRvIGluZGljYXRlIHdoZXRoZXIgYGZ1bmNgXG4gKiBzaG91bGQgYmUgaW52b2tlZCBvbiB0aGUgbGVhZGluZyBhbmQvb3IgdHJhaWxpbmcgZWRnZSBvZiB0aGUgYHdhaXRgXG4gKiB0aW1lb3V0LiBUaGUgYGZ1bmNgIGlzIGludm9rZWQgd2l0aCB0aGUgbGFzdCBhcmd1bWVudHMgcHJvdmlkZWQgdG8gdGhlXG4gKiB0aHJvdHRsZWQgZnVuY3Rpb24uIFN1YnNlcXVlbnQgY2FsbHMgdG8gdGhlIHRocm90dGxlZCBmdW5jdGlvbiByZXR1cm4gdGhlXG4gKiByZXN1bHQgb2YgdGhlIGxhc3QgYGZ1bmNgIGludm9jYXRpb24uXG4gKlxuICogKipOb3RlOioqIElmIGBsZWFkaW5nYCBhbmQgYHRyYWlsaW5nYCBvcHRpb25zIGFyZSBgdHJ1ZWAsIGBmdW5jYCBpc1xuICogaW52b2tlZCBvbiB0aGUgdHJhaWxpbmcgZWRnZSBvZiB0aGUgdGltZW91dCBvbmx5IGlmIHRoZSB0aHJvdHRsZWQgZnVuY3Rpb25cbiAqIGlzIGludm9rZWQgbW9yZSB0aGFuIG9uY2UgZHVyaW5nIHRoZSBgd2FpdGAgdGltZW91dC5cbiAqXG4gKiBJZiBgd2FpdGAgaXMgYDBgIGFuZCBgbGVhZGluZ2AgaXMgYGZhbHNlYCwgYGZ1bmNgIGludm9jYXRpb24gaXMgZGVmZXJyZWRcbiAqIHVudGlsIHRvIHRoZSBuZXh0IHRpY2ssIHNpbWlsYXIgdG8gYHNldFRpbWVvdXRgIHdpdGggYSB0aW1lb3V0IG9mIGAwYC5cbiAqXG4gKiBTZWUgW0RhdmlkIENvcmJhY2hvJ3MgYXJ0aWNsZV0oaHR0cHM6Ly9jc3MtdHJpY2tzLmNvbS9kZWJvdW5jaW5nLXRocm90dGxpbmctZXhwbGFpbmVkLWV4YW1wbGVzLylcbiAqIGZvciBkZXRhaWxzIG92ZXIgdGhlIGRpZmZlcmVuY2VzIGJldHdlZW4gYF8udGhyb3R0bGVgIGFuZCBgXy5kZWJvdW5jZWAuXG4gKlxuICogQHN0YXRpY1xuICogQG1lbWJlck9mIF9cbiAqIEBzaW5jZSAwLjEuMFxuICogQGNhdGVnb3J5IEZ1bmN0aW9uXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBmdW5jIFRoZSBmdW5jdGlvbiB0byB0aHJvdHRsZS5cbiAqIEBwYXJhbSB7bnVtYmVyfSBbd2FpdD0wXSBUaGUgbnVtYmVyIG9mIG1pbGxpc2Vjb25kcyB0byB0aHJvdHRsZSBpbnZvY2F0aW9ucyB0by5cbiAqIEBwYXJhbSB7T2JqZWN0fSBbb3B0aW9ucz17fV0gVGhlIG9wdGlvbnMgb2JqZWN0LlxuICogQHBhcmFtIHtib29sZWFufSBbb3B0aW9ucy5sZWFkaW5nPXRydWVdXG4gKiAgU3BlY2lmeSBpbnZva2luZyBvbiB0aGUgbGVhZGluZyBlZGdlIG9mIHRoZSB0aW1lb3V0LlxuICogQHBhcmFtIHtib29sZWFufSBbb3B0aW9ucy50cmFpbGluZz10cnVlXVxuICogIFNwZWNpZnkgaW52b2tpbmcgb24gdGhlIHRyYWlsaW5nIGVkZ2Ugb2YgdGhlIHRpbWVvdXQuXG4gKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIG5ldyB0aHJvdHRsZWQgZnVuY3Rpb24uXG4gKiBAZXhhbXBsZVxuICpcbiAqIC8vIEF2b2lkIGV4Y2Vzc2l2ZWx5IHVwZGF0aW5nIHRoZSBwb3NpdGlvbiB3aGlsZSBzY3JvbGxpbmcuXG4gKiBqUXVlcnkod2luZG93KS5vbignc2Nyb2xsJywgXy50aHJvdHRsZSh1cGRhdGVQb3NpdGlvbiwgMTAwKSk7XG4gKlxuICogLy8gSW52b2tlIGByZW5ld1Rva2VuYCB3aGVuIHRoZSBjbGljayBldmVudCBpcyBmaXJlZCwgYnV0IG5vdCBtb3JlIHRoYW4gb25jZSBldmVyeSA1IG1pbnV0ZXMuXG4gKiB2YXIgdGhyb3R0bGVkID0gXy50aHJvdHRsZShyZW5ld1Rva2VuLCAzMDAwMDAsIHsgJ3RyYWlsaW5nJzogZmFsc2UgfSk7XG4gKiBqUXVlcnkoZWxlbWVudCkub24oJ2NsaWNrJywgdGhyb3R0bGVkKTtcbiAqXG4gKiAvLyBDYW5jZWwgdGhlIHRyYWlsaW5nIHRocm90dGxlZCBpbnZvY2F0aW9uLlxuICogalF1ZXJ5KHdpbmRvdykub24oJ3BvcHN0YXRlJywgdGhyb3R0bGVkLmNhbmNlbCk7XG4gKi9cbmZ1bmN0aW9uIHRocm90dGxlKGZ1bmMsIHdhaXQsIG9wdGlvbnMpIHtcbiAgdmFyIGxlYWRpbmcgPSB0cnVlLFxuICAgICAgdHJhaWxpbmcgPSB0cnVlO1xuXG4gIGlmICh0eXBlb2YgZnVuYyAhPSAnZnVuY3Rpb24nKSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcihGVU5DX0VSUk9SX1RFWFQpO1xuICB9XG4gIGlmIChpc09iamVjdChvcHRpb25zKSkge1xuICAgIGxlYWRpbmcgPSAnbGVhZGluZycgaW4gb3B0aW9ucyA/ICEhb3B0aW9ucy5sZWFkaW5nIDogbGVhZGluZztcbiAgICB0cmFpbGluZyA9ICd0cmFpbGluZycgaW4gb3B0aW9ucyA/ICEhb3B0aW9ucy50cmFpbGluZyA6IHRyYWlsaW5nO1xuICB9XG4gIHJldHVybiBkZWJvdW5jZShmdW5jLCB3YWl0LCB7XG4gICAgJ2xlYWRpbmcnOiBsZWFkaW5nLFxuICAgICdtYXhXYWl0Jzogd2FpdCxcbiAgICAndHJhaWxpbmcnOiB0cmFpbGluZ1xuICB9KTtcbn1cblxuLyoqXG4gKiBDaGVja3MgaWYgYHZhbHVlYCBpcyB0aGVcbiAqIFtsYW5ndWFnZSB0eXBlXShodHRwOi8vd3d3LmVjbWEtaW50ZXJuYXRpb25hbC5vcmcvZWNtYS0yNjIvNy4wLyNzZWMtZWNtYXNjcmlwdC1sYW5ndWFnZS10eXBlcylcbiAqIG9mIGBPYmplY3RgLiAoZS5nLiBhcnJheXMsIGZ1bmN0aW9ucywgb2JqZWN0cywgcmVnZXhlcywgYG5ldyBOdW1iZXIoMClgLCBhbmQgYG5ldyBTdHJpbmcoJycpYClcbiAqXG4gKiBAc3RhdGljXG4gKiBAbWVtYmVyT2YgX1xuICogQHNpbmNlIDAuMS4wXG4gKiBAY2F0ZWdvcnkgTGFuZ1xuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBhbiBvYmplY3QsIGVsc2UgYGZhbHNlYC5cbiAqIEBleGFtcGxlXG4gKlxuICogXy5pc09iamVjdCh7fSk7XG4gKiAvLyA9PiB0cnVlXG4gKlxuICogXy5pc09iamVjdChbMSwgMiwgM10pO1xuICogLy8gPT4gdHJ1ZVxuICpcbiAqIF8uaXNPYmplY3QoXy5ub29wKTtcbiAqIC8vID0+IHRydWVcbiAqXG4gKiBfLmlzT2JqZWN0KG51bGwpO1xuICogLy8gPT4gZmFsc2VcbiAqL1xuZnVuY3Rpb24gaXNPYmplY3QodmFsdWUpIHtcbiAgdmFyIHR5cGUgPSB0eXBlb2YgdmFsdWU7XG4gIHJldHVybiAhIXZhbHVlICYmICh0eXBlID09ICdvYmplY3QnIHx8IHR5cGUgPT0gJ2Z1bmN0aW9uJyk7XG59XG5cbi8qKlxuICogQ2hlY2tzIGlmIGB2YWx1ZWAgaXMgb2JqZWN0LWxpa2UuIEEgdmFsdWUgaXMgb2JqZWN0LWxpa2UgaWYgaXQncyBub3QgYG51bGxgXG4gKiBhbmQgaGFzIGEgYHR5cGVvZmAgcmVzdWx0IG9mIFwib2JqZWN0XCIuXG4gKlxuICogQHN0YXRpY1xuICogQG1lbWJlck9mIF9cbiAqIEBzaW5jZSA0LjAuMFxuICogQGNhdGVnb3J5IExhbmdcbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrLlxuICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgb2JqZWN0LWxpa2UsIGVsc2UgYGZhbHNlYC5cbiAqIEBleGFtcGxlXG4gKlxuICogXy5pc09iamVjdExpa2Uoe30pO1xuICogLy8gPT4gdHJ1ZVxuICpcbiAqIF8uaXNPYmplY3RMaWtlKFsxLCAyLCAzXSk7XG4gKiAvLyA9PiB0cnVlXG4gKlxuICogXy5pc09iamVjdExpa2UoXy5ub29wKTtcbiAqIC8vID0+IGZhbHNlXG4gKlxuICogXy5pc09iamVjdExpa2UobnVsbCk7XG4gKiAvLyA9PiBmYWxzZVxuICovXG5mdW5jdGlvbiBpc09iamVjdExpa2UodmFsdWUpIHtcbiAgcmV0dXJuICEhdmFsdWUgJiYgdHlwZW9mIHZhbHVlID09ICdvYmplY3QnO1xufVxuXG4vKipcbiAqIENoZWNrcyBpZiBgdmFsdWVgIGlzIGNsYXNzaWZpZWQgYXMgYSBgU3ltYm9sYCBwcmltaXRpdmUgb3Igb2JqZWN0LlxuICpcbiAqIEBzdGF0aWNcbiAqIEBtZW1iZXJPZiBfXG4gKiBAc2luY2UgNC4wLjBcbiAqIEBjYXRlZ29yeSBMYW5nXG4gKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay5cbiAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIGEgc3ltYm9sLCBlbHNlIGBmYWxzZWAuXG4gKiBAZXhhbXBsZVxuICpcbiAqIF8uaXNTeW1ib2woU3ltYm9sLml0ZXJhdG9yKTtcbiAqIC8vID0+IHRydWVcbiAqXG4gKiBfLmlzU3ltYm9sKCdhYmMnKTtcbiAqIC8vID0+IGZhbHNlXG4gKi9cbmZ1bmN0aW9uIGlzU3ltYm9sKHZhbHVlKSB7XG4gIHJldHVybiB0eXBlb2YgdmFsdWUgPT0gJ3N5bWJvbCcgfHxcbiAgICAoaXNPYmplY3RMaWtlKHZhbHVlKSAmJiBvYmplY3RUb1N0cmluZy5jYWxsKHZhbHVlKSA9PSBzeW1ib2xUYWcpO1xufVxuXG4vKipcbiAqIENvbnZlcnRzIGB2YWx1ZWAgdG8gYSBudW1iZXIuXG4gKlxuICogQHN0YXRpY1xuICogQG1lbWJlck9mIF9cbiAqIEBzaW5jZSA0LjAuMFxuICogQGNhdGVnb3J5IExhbmdcbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIHByb2Nlc3MuXG4gKiBAcmV0dXJucyB7bnVtYmVyfSBSZXR1cm5zIHRoZSBudW1iZXIuXG4gKiBAZXhhbXBsZVxuICpcbiAqIF8udG9OdW1iZXIoMy4yKTtcbiAqIC8vID0+IDMuMlxuICpcbiAqIF8udG9OdW1iZXIoTnVtYmVyLk1JTl9WQUxVRSk7XG4gKiAvLyA9PiA1ZS0zMjRcbiAqXG4gKiBfLnRvTnVtYmVyKEluZmluaXR5KTtcbiAqIC8vID0+IEluZmluaXR5XG4gKlxuICogXy50b051bWJlcignMy4yJyk7XG4gKiAvLyA9PiAzLjJcbiAqL1xuZnVuY3Rpb24gdG9OdW1iZXIodmFsdWUpIHtcbiAgaWYgKHR5cGVvZiB2YWx1ZSA9PSAnbnVtYmVyJykge1xuICAgIHJldHVybiB2YWx1ZTtcbiAgfVxuICBpZiAoaXNTeW1ib2wodmFsdWUpKSB7XG4gICAgcmV0dXJuIE5BTjtcbiAgfVxuICBpZiAoaXNPYmplY3QodmFsdWUpKSB7XG4gICAgdmFyIG90aGVyID0gdHlwZW9mIHZhbHVlLnZhbHVlT2YgPT0gJ2Z1bmN0aW9uJyA/IHZhbHVlLnZhbHVlT2YoKSA6IHZhbHVlO1xuICAgIHZhbHVlID0gaXNPYmplY3Qob3RoZXIpID8gKG90aGVyICsgJycpIDogb3RoZXI7XG4gIH1cbiAgaWYgKHR5cGVvZiB2YWx1ZSAhPSAnc3RyaW5nJykge1xuICAgIHJldHVybiB2YWx1ZSA9PT0gMCA/IHZhbHVlIDogK3ZhbHVlO1xuICB9XG4gIHZhbHVlID0gdmFsdWUucmVwbGFjZShyZVRyaW0sICcnKTtcbiAgdmFyIGlzQmluYXJ5ID0gcmVJc0JpbmFyeS50ZXN0KHZhbHVlKTtcbiAgcmV0dXJuIChpc0JpbmFyeSB8fCByZUlzT2N0YWwudGVzdCh2YWx1ZSkpXG4gICAgPyBmcmVlUGFyc2VJbnQodmFsdWUuc2xpY2UoMiksIGlzQmluYXJ5ID8gMiA6IDgpXG4gICAgOiAocmVJc0JhZEhleC50ZXN0KHZhbHVlKSA/IE5BTiA6ICt2YWx1ZSk7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gdGhyb3R0bGU7XG4iLCJ2YXIgZztcclxuXHJcbi8vIFRoaXMgd29ya3MgaW4gbm9uLXN0cmljdCBtb2RlXHJcbmcgPSAoZnVuY3Rpb24oKSB7XHJcblx0cmV0dXJuIHRoaXM7XHJcbn0pKCk7XHJcblxyXG50cnkge1xyXG5cdC8vIFRoaXMgd29ya3MgaWYgZXZhbCBpcyBhbGxvd2VkIChzZWUgQ1NQKVxyXG5cdGcgPSBnIHx8IEZ1bmN0aW9uKFwicmV0dXJuIHRoaXNcIikoKSB8fCAoMSwgZXZhbCkoXCJ0aGlzXCIpO1xyXG59IGNhdGNoIChlKSB7XHJcblx0Ly8gVGhpcyB3b3JrcyBpZiB0aGUgd2luZG93IHJlZmVyZW5jZSBpcyBhdmFpbGFibGVcclxuXHRpZiAodHlwZW9mIHdpbmRvdyA9PT0gXCJvYmplY3RcIikgZyA9IHdpbmRvdztcclxufVxyXG5cclxuLy8gZyBjYW4gc3RpbGwgYmUgdW5kZWZpbmVkLCBidXQgbm90aGluZyB0byBkbyBhYm91dCBpdC4uLlxyXG4vLyBXZSByZXR1cm4gdW5kZWZpbmVkLCBpbnN0ZWFkIG9mIG5vdGhpbmcgaGVyZSwgc28gaXQnc1xyXG4vLyBlYXNpZXIgdG8gaGFuZGxlIHRoaXMgY2FzZS4gaWYoIWdsb2JhbCkgeyAuLi59XHJcblxyXG5tb2R1bGUuZXhwb3J0cyA9IGc7XHJcbiIsIi8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gKiAgQ29weXJpZ2h0IChjKSBNaWNyb3NvZnQgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKiAgTGljZW5zZWQgdW5kZXIgdGhlIE1JVCBMaWNlbnNlLiBTZWUgTGljZW5zZS50eHQgaW4gdGhlIHByb2plY3Qgcm9vdCBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbi5cbiAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qL1xuaW1wb3J0IHsgZ2V0RWxlbWVudHNGb3JTb3VyY2VMaW5lIH0gZnJvbSAnLi9zY3JvbGwtc3luYyc7XG5cbmV4cG9ydCBjbGFzcyBBY3RpdmVMaW5lTWFya2VyIHtcblx0cHJpdmF0ZSBfY3VycmVudDogYW55O1xuXG5cdG9uRGlkQ2hhbmdlVGV4dEVkaXRvclNlbGVjdGlvbihsaW5lOiBudW1iZXIpIHtcblx0XHRjb25zdCB7IHByZXZpb3VzIH0gPSBnZXRFbGVtZW50c0ZvclNvdXJjZUxpbmUobGluZSk7XG5cdFx0dGhpcy5fdXBkYXRlKHByZXZpb3VzICYmIHByZXZpb3VzLmVsZW1lbnQpO1xuXHR9XG5cblx0X3VwZGF0ZShiZWZvcmU6IEhUTUxFbGVtZW50IHwgdW5kZWZpbmVkKSB7XG5cdFx0dGhpcy5fdW5tYXJrQWN0aXZlRWxlbWVudCh0aGlzLl9jdXJyZW50KTtcblx0XHR0aGlzLl9tYXJrQWN0aXZlRWxlbWVudChiZWZvcmUpO1xuXHRcdHRoaXMuX2N1cnJlbnQgPSBiZWZvcmU7XG5cdH1cblxuXHRfdW5tYXJrQWN0aXZlRWxlbWVudChlbGVtZW50OiBIVE1MRWxlbWVudCB8IHVuZGVmaW5lZCkge1xuXHRcdGlmICghZWxlbWVudCkge1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblx0XHRlbGVtZW50LmNsYXNzTmFtZSA9IGVsZW1lbnQuY2xhc3NOYW1lLnJlcGxhY2UoL1xcYmNvZGUtYWN0aXZlLWxpbmVcXGIvZywgJycpO1xuXHR9XG5cblx0X21hcmtBY3RpdmVFbGVtZW50KGVsZW1lbnQ6IEhUTUxFbGVtZW50IHwgdW5kZWZpbmVkKSB7XG5cdFx0aWYgKCFlbGVtZW50KSB7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXHRcdGVsZW1lbnQuY2xhc3NOYW1lICs9ICcgY29kZS1hY3RpdmUtbGluZSc7XG5cdH1cbn0iLCIvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICogIENvcHlyaWdodCAoYykgTWljcm9zb2Z0IENvcnBvcmF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICogIExpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgTGljZW5zZS4gU2VlIExpY2Vuc2UudHh0IGluIHRoZSBwcm9qZWN0IHJvb3QgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24uXG4gKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi9cblxuZXhwb3J0IGZ1bmN0aW9uIG9uY2VEb2N1bWVudExvYWRlZChmOiAoKSA9PiB2b2lkKSB7XG5cdGlmIChkb2N1bWVudC5yZWFkeVN0YXRlID09PSAnbG9hZGluZycgfHwgZG9jdW1lbnQucmVhZHlTdGF0ZSA9PT0gJ3VuaW5pdGlhbGl6ZWQnKSB7XG5cdFx0ZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignRE9NQ29udGVudExvYWRlZCcsIGYpO1xuXHR9IGVsc2Uge1xuXHRcdGYoKTtcblx0fVxufSIsIi8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gKiAgQ29weXJpZ2h0IChjKSBNaWNyb3NvZnQgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKiAgTGljZW5zZWQgdW5kZXIgdGhlIE1JVCBMaWNlbnNlLiBTZWUgTGljZW5zZS50eHQgaW4gdGhlIHByb2plY3Qgcm9vdCBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbi5cbiAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qL1xuXG5pbXBvcnQgeyBnZXRTZXR0aW5ncyB9IGZyb20gJy4vc2V0dGluZ3MnO1xuaW1wb3J0IHsgcG9zdENvbW1hbmQsIHBvc3RNZXNzYWdlIH0gZnJvbSAnLi9tZXNzYWdpbmcnO1xuaW1wb3J0IHsgb25jZURvY3VtZW50TG9hZGVkIH0gZnJvbSAnLi9ldmVudHMnO1xuaW1wb3J0IHsgZ2V0RWRpdG9yTGluZU51bWJlckZvclBhZ2VPZmZzZXQsIHNjcm9sbFRvUmV2ZWFsU291cmNlTGluZSB9IGZyb20gJy4vc2Nyb2xsLXN5bmMnO1xuaW1wb3J0IHsgQWN0aXZlTGluZU1hcmtlciB9IGZyb20gJy4vYWN0aXZlTGluZU1hcmtlcic7XG5pbXBvcnQgdGhyb3R0bGUgPSByZXF1aXJlKCdsb2Rhc2gudGhyb3R0bGUnKTtcblxudmFyIHNjcm9sbERpc2FibGVkID0gdHJ1ZTtcbmNvbnN0IG1hcmtlciA9IG5ldyBBY3RpdmVMaW5lTWFya2VyKCk7XG5jb25zdCBzZXR0aW5ncyA9IGdldFNldHRpbmdzKCk7XG5cbm9uY2VEb2N1bWVudExvYWRlZCgoKSA9PiB7XG5cdGlmIChzZXR0aW5ncy5zY3JvbGxQcmV2aWV3V2l0aEVkaXRvcikge1xuXHRcdHNldFRpbWVvdXQoKCkgPT4ge1xuXHRcdFx0Y29uc3QgaW5pdGlhbExpbmUgPSArc2V0dGluZ3MubGluZTtcblx0XHRcdGlmICghaXNOYU4oaW5pdGlhbExpbmUpKSB7XG5cdFx0XHRcdHNjcm9sbERpc2FibGVkID0gdHJ1ZTtcblx0XHRcdFx0c2Nyb2xsVG9SZXZlYWxTb3VyY2VMaW5lKGluaXRpYWxMaW5lKTtcblx0XHRcdH1cblx0XHR9LCAwKTtcblx0fVxufSk7XG5cbmNvbnN0IG9uVXBkYXRlVmlldyA9ICgoKSA9PiB7XG5cdGNvbnN0IGRvU2Nyb2xsID0gdGhyb3R0bGUoKGxpbmU6IG51bWJlcikgPT4ge1xuXHRcdHNjcm9sbERpc2FibGVkID0gdHJ1ZTtcblx0XHRzY3JvbGxUb1JldmVhbFNvdXJjZUxpbmUobGluZSk7XG5cdH0sIDUwKTtcblxuXHRyZXR1cm4gKGxpbmU6IG51bWJlciwgc2V0dGluZ3M6IGFueSkgPT4ge1xuXHRcdGlmICghaXNOYU4obGluZSkpIHtcblx0XHRcdHNldHRpbmdzLmxpbmUgPSBsaW5lO1xuXHRcdFx0ZG9TY3JvbGwobGluZSk7XG5cdFx0fVxuXHR9O1xufSkoKTtcblxud2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ3Jlc2l6ZScsICgpID0+IHtcblx0c2Nyb2xsRGlzYWJsZWQgPSB0cnVlO1xufSwgdHJ1ZSk7XG5cbndpbmRvdy5hZGRFdmVudExpc3RlbmVyKCdtZXNzYWdlJywgZXZlbnQgPT4ge1xuXHRpZiAoZXZlbnQuZGF0YS5zb3VyY2UgIT09IHNldHRpbmdzLnNvdXJjZSkge1xuXHRcdHJldHVybjtcblx0fVxuXG5cdHN3aXRjaCAoZXZlbnQuZGF0YS50eXBlKSB7XG5cdFx0Y2FzZSAnb25EaWRDaGFuZ2VUZXh0RWRpdG9yU2VsZWN0aW9uJzpcblx0XHRcdG1hcmtlci5vbkRpZENoYW5nZVRleHRFZGl0b3JTZWxlY3Rpb24oZXZlbnQuZGF0YS5saW5lKTtcblx0XHRcdGJyZWFrO1xuXG5cdFx0Y2FzZSAndXBkYXRlVmlldyc6XG5cdFx0XHRvblVwZGF0ZVZpZXcoZXZlbnQuZGF0YS5saW5lLCBzZXR0aW5ncyk7XG5cdFx0XHRicmVhaztcblx0fVxufSwgZmFsc2UpO1xuXG5kb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdkYmxjbGljaycsIGV2ZW50ID0+IHtcblx0aWYgKCFzZXR0aW5ncy5kb3VibGVDbGlja1RvU3dpdGNoVG9FZGl0b3IpIHtcblx0XHRyZXR1cm47XG5cdH1cblxuXHQvLyBJZ25vcmUgY2xpY2tzIG9uIGxpbmtzXG5cdGZvciAobGV0IG5vZGUgPSBldmVudC50YXJnZXQgYXMgSFRNTEVsZW1lbnQ7IG5vZGU7IG5vZGUgPSBub2RlLnBhcmVudE5vZGUgYXMgSFRNTEVsZW1lbnQpIHtcblx0XHRpZiAobm9kZS50YWdOYW1lID09PSAnQScpIHtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cdH1cblxuXHRjb25zdCBvZmZzZXQgPSBldmVudC5wYWdlWTtcblx0Y29uc3QgbGluZSA9IGdldEVkaXRvckxpbmVOdW1iZXJGb3JQYWdlT2Zmc2V0KG9mZnNldCk7XG5cdGlmICh0eXBlb2YgbGluZSA9PT0gJ251bWJlcicgJiYgIWlzTmFOKGxpbmUpKSB7XG5cdFx0cG9zdE1lc3NhZ2UoJ2RpZENsaWNrJywgeyBsaW5lOiBNYXRoLmZsb29yKGxpbmUpIH0pO1xuXHR9XG59KTtcblxuZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCBldmVudCA9PiB7XG5cdGlmICghZXZlbnQpIHtcblx0XHRyZXR1cm47XG5cdH1cblxuXHRsZXQgbm9kZTogYW55ID0gZXZlbnQudGFyZ2V0O1xuXHR3aGlsZSAobm9kZSkge1xuXHRcdGlmIChub2RlLnRhZ05hbWUgJiYgbm9kZS50YWdOYW1lID09PSAnQScgJiYgbm9kZS5ocmVmKSB7XG5cdFx0XHRpZiAobm9kZS5nZXRBdHRyaWJ1dGUoJ2hyZWYnKS5zdGFydHNXaXRoKCcjJykpIHtcblx0XHRcdFx0YnJlYWs7XG5cdFx0XHR9XG5cdFx0XHRpZiAobm9kZS5ocmVmLnN0YXJ0c1dpdGgoJ2ZpbGU6Ly8nKSB8fCBub2RlLmhyZWYuc3RhcnRzV2l0aCgndnNjb2RlLXJlc291cmNlOicpKSB7XG5cdFx0XHRcdGNvbnN0IFtwYXRoLCBmcmFnbWVudF0gPSBub2RlLmhyZWYucmVwbGFjZSgvXihmaWxlOlxcL1xcL3x2c2NvZGUtcmVzb3VyY2U6KS9pLCAnJykuc3BsaXQoJyMnKTtcblx0XHRcdFx0cG9zdENvbW1hbmQoJ19tYXJrZG93bi5vcGVuRG9jdW1lbnRMaW5rJywgW3sgcGF0aCwgZnJhZ21lbnQgfV0pO1xuXHRcdFx0XHRldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuXHRcdFx0XHRldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcblx0XHRcdFx0YnJlYWs7XG5cdFx0XHR9XG5cdFx0XHRicmVhaztcblx0XHR9XG5cdFx0bm9kZSA9IG5vZGUucGFyZW50Tm9kZTtcblx0fVxufSwgdHJ1ZSk7XG5cbmlmIChzZXR0aW5ncy5zY3JvbGxFZGl0b3JXaXRoUHJldmlldykge1xuXHR3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcignc2Nyb2xsJywgdGhyb3R0bGUoKCkgPT4ge1xuXHRcdGlmIChzY3JvbGxEaXNhYmxlZCkge1xuXHRcdFx0c2Nyb2xsRGlzYWJsZWQgPSBmYWxzZTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0Y29uc3QgbGluZSA9IGdldEVkaXRvckxpbmVOdW1iZXJGb3JQYWdlT2Zmc2V0KHdpbmRvdy5zY3JvbGxZKTtcblx0XHRcdGlmICh0eXBlb2YgbGluZSA9PT0gJ251bWJlcicgJiYgIWlzTmFOKGxpbmUpKSB7XG5cdFx0XHRcdHBvc3RNZXNzYWdlKCdyZXZlYWxMaW5lJywgeyBsaW5lIH0pO1xuXHRcdFx0fVxuXHRcdH1cblx0fSwgNTApKTtcbn0iLCIvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICogIENvcHlyaWdodCAoYykgTWljcm9zb2Z0IENvcnBvcmF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICogIExpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgTGljZW5zZS4gU2VlIExpY2Vuc2UudHh0IGluIHRoZSBwcm9qZWN0IHJvb3QgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24uXG4gKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi9cblxuaW1wb3J0IHsgZ2V0U2V0dGluZ3MgfSBmcm9tICcuL3NldHRpbmdzJztcblxuLyoqXG4gKiBQb3N0IGEgbWVzc2FnZSB0byB0aGUgbWFya2Rvd24gZXh0ZW5zaW9uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBwb3N0TWVzc2FnZSh0eXBlOiBzdHJpbmcsIGJvZHk6IG9iamVjdCkge1xuXHR3aW5kb3cucGFyZW50LnBvc3RNZXNzYWdlKHtcblx0XHR0eXBlLFxuXHRcdHNvdXJjZTogZ2V0U2V0dGluZ3MoKS5zb3VyY2UsXG5cdFx0Ym9keVxuXHR9LCAnKicpO1xufVxuXG4vKipcbiAqIFBvc3QgYSBjb21tYW5kIHRvIGJlIGV4ZWN1dGVkIHRvIHRoZSBtYXJrZG93biBleHRlbnNpb25cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHBvc3RDb21tYW5kKGNvbW1hbmQ6IHN0cmluZywgYXJnczogYW55W10pIHtcblx0cG9zdE1lc3NhZ2UoJ2NvbW1hbmQnLCB7IGNvbW1hbmQsIGFyZ3MgfSk7XG59XG4iLCIvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICogIENvcHlyaWdodCAoYykgTWljcm9zb2Z0IENvcnBvcmF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICogIExpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgTGljZW5zZS4gU2VlIExpY2Vuc2UudHh0IGluIHRoZSBwcm9qZWN0IHJvb3QgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24uXG4gKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi9cblxuaW1wb3J0IHsgZ2V0U2V0dGluZ3MgfSBmcm9tICcuL3NldHRpbmdzJztcblxuXG5mdW5jdGlvbiBjbGFtcChtaW46IG51bWJlciwgbWF4OiBudW1iZXIsIHZhbHVlOiBudW1iZXIpIHtcblx0cmV0dXJuIE1hdGgubWluKG1heCwgTWF0aC5tYXgobWluLCB2YWx1ZSkpO1xufVxuXG5mdW5jdGlvbiBjbGFtcExpbmUobGluZTogbnVtYmVyKSB7XG5cdHJldHVybiBjbGFtcCgwLCBnZXRTZXR0aW5ncygpLmxpbmVDb3VudCAtIDEsIGxpbmUpO1xufVxuXG5cbmV4cG9ydCBpbnRlcmZhY2UgQ29kZUxpbmVFbGVtZW50IHtcblx0ZWxlbWVudDogSFRNTEVsZW1lbnQ7XG5cdGxpbmU6IG51bWJlcjtcbn1cblxuY29uc3QgZ2V0Q29kZUxpbmVFbGVtZW50cyA9ICgoKSA9PiB7XG5cdGxldCBlbGVtZW50czogQ29kZUxpbmVFbGVtZW50W107XG5cdHJldHVybiAoKSA9PiB7XG5cdFx0aWYgKCFlbGVtZW50cykge1xuXHRcdFx0ZWxlbWVudHMgPSBBcnJheS5wcm90b3R5cGUubWFwLmNhbGwoXG5cdFx0XHRcdGRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoJ2NvZGUtbGluZScpLFxuXHRcdFx0XHQoZWxlbWVudDogYW55KSA9PiB7XG5cdFx0XHRcdFx0Y29uc3QgbGluZSA9ICtlbGVtZW50LmdldEF0dHJpYnV0ZSgnZGF0YS1saW5lJyk7XG5cdFx0XHRcdFx0cmV0dXJuIHsgZWxlbWVudCwgbGluZSB9O1xuXHRcdFx0XHR9KVxuXHRcdFx0XHQuZmlsdGVyKCh4OiBhbnkpID0+ICFpc05hTih4LmxpbmUpKTtcblx0XHR9XG5cdFx0cmV0dXJuIGVsZW1lbnRzO1xuXHR9O1xufSkoKTtcblxuLyoqXG4gKiBGaW5kIHRoZSBodG1sIGVsZW1lbnRzIHRoYXQgbWFwIHRvIGEgc3BlY2lmaWMgdGFyZ2V0IGxpbmUgaW4gdGhlIGVkaXRvci5cbiAqXG4gKiBJZiBhbiBleGFjdCBtYXRjaCwgcmV0dXJucyBhIHNpbmdsZSBlbGVtZW50LiBJZiB0aGUgbGluZSBpcyBiZXR3ZWVuIGVsZW1lbnRzLFxuICogcmV0dXJucyB0aGUgZWxlbWVudCBwcmlvciB0byBhbmQgdGhlIGVsZW1lbnQgYWZ0ZXIgdGhlIGdpdmVuIGxpbmUuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRFbGVtZW50c0ZvclNvdXJjZUxpbmUodGFyZ2V0TGluZTogbnVtYmVyKTogeyBwcmV2aW91czogQ29kZUxpbmVFbGVtZW50OyBuZXh0PzogQ29kZUxpbmVFbGVtZW50OyB9IHtcblx0Y29uc3QgbGluZU51bWJlciA9IE1hdGguZmxvb3IodGFyZ2V0TGluZSk7XG5cdGNvbnN0IGxpbmVzID0gZ2V0Q29kZUxpbmVFbGVtZW50cygpO1xuXHRsZXQgcHJldmlvdXMgPSBsaW5lc1swXSB8fCBudWxsO1xuXHRmb3IgKGNvbnN0IGVudHJ5IG9mIGxpbmVzKSB7XG5cdFx0aWYgKGVudHJ5LmxpbmUgPT09IGxpbmVOdW1iZXIpIHtcblx0XHRcdHJldHVybiB7IHByZXZpb3VzOiBlbnRyeSwgbmV4dDogdW5kZWZpbmVkIH07XG5cdFx0fVxuXHRcdGVsc2UgaWYgKGVudHJ5LmxpbmUgPiBsaW5lTnVtYmVyKSB7XG5cdFx0XHRyZXR1cm4geyBwcmV2aW91cywgbmV4dDogZW50cnkgfTtcblx0XHR9XG5cdFx0cHJldmlvdXMgPSBlbnRyeTtcblx0fVxuXHRyZXR1cm4geyBwcmV2aW91cyB9O1xufVxuXG4vKipcbiAqIEZpbmQgdGhlIGh0bWwgZWxlbWVudHMgdGhhdCBhcmUgYXQgYSBzcGVjaWZpYyBwaXhlbCBvZmZzZXQgb24gdGhlIHBhZ2UuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRMaW5lRWxlbWVudHNBdFBhZ2VPZmZzZXQob2Zmc2V0OiBudW1iZXIpOiB7IHByZXZpb3VzOiBDb2RlTGluZUVsZW1lbnQ7IG5leHQ/OiBDb2RlTGluZUVsZW1lbnQ7IH0ge1xuXHRjb25zdCBsaW5lcyA9IGdldENvZGVMaW5lRWxlbWVudHMoKTtcblx0Y29uc3QgcG9zaXRpb24gPSBvZmZzZXQgLSB3aW5kb3cuc2Nyb2xsWTtcblx0bGV0IGxvID0gLTE7XG5cdGxldCBoaSA9IGxpbmVzLmxlbmd0aCAtIDE7XG5cdHdoaWxlIChsbyArIDEgPCBoaSkge1xuXHRcdGNvbnN0IG1pZCA9IE1hdGguZmxvb3IoKGxvICsgaGkpIC8gMik7XG5cdFx0Y29uc3QgYm91bmRzID0gbGluZXNbbWlkXS5lbGVtZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuXHRcdGlmIChib3VuZHMudG9wICsgYm91bmRzLmhlaWdodCA+PSBwb3NpdGlvbikge1xuXHRcdFx0aGkgPSBtaWQ7XG5cdFx0fVxuXHRcdGVsc2Uge1xuXHRcdFx0bG8gPSBtaWQ7XG5cdFx0fVxuXHR9XG5cdGNvbnN0IGhpRWxlbWVudCA9IGxpbmVzW2hpXTtcblx0Y29uc3QgaGlCb3VuZHMgPSBoaUVsZW1lbnQuZWxlbWVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcblx0aWYgKGhpID49IDEgJiYgaGlCb3VuZHMudG9wID4gcG9zaXRpb24pIHtcblx0XHRjb25zdCBsb0VsZW1lbnQgPSBsaW5lc1tsb107XG5cdFx0cmV0dXJuIHsgcHJldmlvdXM6IGxvRWxlbWVudCwgbmV4dDogaGlFbGVtZW50IH07XG5cdH1cblx0cmV0dXJuIHsgcHJldmlvdXM6IGhpRWxlbWVudCB9O1xufVxuXG4vKipcbiAqIEF0dGVtcHQgdG8gcmV2ZWFsIHRoZSBlbGVtZW50IGZvciBhIHNvdXJjZSBsaW5lIGluIHRoZSBlZGl0b3IuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzY3JvbGxUb1JldmVhbFNvdXJjZUxpbmUobGluZTogbnVtYmVyKSB7XG5cdGNvbnN0IHsgcHJldmlvdXMsIG5leHQgfSA9IGdldEVsZW1lbnRzRm9yU291cmNlTGluZShsaW5lKTtcblx0aWYgKHByZXZpb3VzICYmIGdldFNldHRpbmdzKCkuc2Nyb2xsUHJldmlld1dpdGhFZGl0b3IpIHtcblx0XHRsZXQgc2Nyb2xsVG8gPSAwO1xuXHRcdGNvbnN0IHJlY3QgPSBwcmV2aW91cy5lbGVtZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuXHRcdGNvbnN0IHByZXZpb3VzVG9wID0gcmVjdC50b3A7XG5cdFx0aWYgKG5leHQgJiYgbmV4dC5saW5lICE9PSBwcmV2aW91cy5saW5lKSB7XG5cdFx0XHQvLyBCZXR3ZWVuIHR3byBlbGVtZW50cy4gR28gdG8gcGVyY2VudGFnZSBvZmZzZXQgYmV0d2VlbiB0aGVtLlxuXHRcdFx0Y29uc3QgYmV0d2VlblByb2dyZXNzID0gKGxpbmUgLSBwcmV2aW91cy5saW5lKSAvIChuZXh0LmxpbmUgLSBwcmV2aW91cy5saW5lKTtcblx0XHRcdGNvbnN0IGVsZW1lbnRPZmZzZXQgPSBuZXh0LmVsZW1lbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkudG9wIC0gcHJldmlvdXNUb3A7XG5cdFx0XHRzY3JvbGxUbyA9IHByZXZpb3VzVG9wICsgYmV0d2VlblByb2dyZXNzICogZWxlbWVudE9mZnNldDtcblx0XHR9XG5cdFx0ZWxzZSB7XG5cdFx0XHRzY3JvbGxUbyA9IHByZXZpb3VzVG9wO1xuXHRcdH1cblx0XHR3aW5kb3cuc2Nyb2xsKDAsIE1hdGgubWF4KDEsIHdpbmRvdy5zY3JvbGxZICsgc2Nyb2xsVG8pKTtcblx0fVxufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0RWRpdG9yTGluZU51bWJlckZvclBhZ2VPZmZzZXQob2Zmc2V0OiBudW1iZXIpIHtcblx0Y29uc3QgeyBwcmV2aW91cywgbmV4dCB9ID0gZ2V0TGluZUVsZW1lbnRzQXRQYWdlT2Zmc2V0KG9mZnNldCk7XG5cdGlmIChwcmV2aW91cykge1xuXHRcdGNvbnN0IHByZXZpb3VzQm91bmRzID0gcHJldmlvdXMuZWxlbWVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcblx0XHRjb25zdCBvZmZzZXRGcm9tUHJldmlvdXMgPSAob2Zmc2V0IC0gd2luZG93LnNjcm9sbFkgLSBwcmV2aW91c0JvdW5kcy50b3ApO1xuXHRcdGlmIChuZXh0KSB7XG5cdFx0XHRjb25zdCBwcm9ncmVzc0JldHdlZW5FbGVtZW50cyA9IG9mZnNldEZyb21QcmV2aW91cyAvIChuZXh0LmVsZW1lbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkudG9wIC0gcHJldmlvdXNCb3VuZHMudG9wKTtcblx0XHRcdGNvbnN0IGxpbmUgPSBwcmV2aW91cy5saW5lICsgcHJvZ3Jlc3NCZXR3ZWVuRWxlbWVudHMgKiAobmV4dC5saW5lIC0gcHJldmlvdXMubGluZSk7XG5cdFx0XHRyZXR1cm4gY2xhbXBMaW5lKGxpbmUpO1xuXHRcdH1cblx0XHRlbHNlIHtcblx0XHRcdGNvbnN0IHByb2dyZXNzV2l0aGluRWxlbWVudCA9IG9mZnNldEZyb21QcmV2aW91cyAvIChwcmV2aW91c0JvdW5kcy5oZWlnaHQpO1xuXHRcdFx0Y29uc3QgbGluZSA9IHByZXZpb3VzLmxpbmUgKyBwcm9ncmVzc1dpdGhpbkVsZW1lbnQ7XG5cdFx0XHRyZXR1cm4gY2xhbXBMaW5lKGxpbmUpO1xuXHRcdH1cblx0fVxuXHRyZXR1cm4gbnVsbDtcbn1cbiIsIi8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gKiAgQ29weXJpZ2h0IChjKSBNaWNyb3NvZnQgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKiAgTGljZW5zZWQgdW5kZXIgdGhlIE1JVCBMaWNlbnNlLiBTZWUgTGljZW5zZS50eHQgaW4gdGhlIHByb2plY3Qgcm9vdCBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbi5cbiAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qL1xuXG5leHBvcnQgaW50ZXJmYWNlIFByZXZpZXdTZXR0aW5ncyB7XG5cdHNvdXJjZTogc3RyaW5nO1xuXHRsaW5lOiBudW1iZXI7XG5cdGxpbmVDb3VudDogbnVtYmVyO1xuXHRzY3JvbGxQcmV2aWV3V2l0aEVkaXRvcj86IGJvb2xlYW47XG5cdHNjcm9sbEVkaXRvcldpdGhQcmV2aWV3OiBib29sZWFuO1xuXHRkaXNhYmxlU2VjdXJpdHlXYXJuaW5nczogYm9vbGVhbjtcblx0ZG91YmxlQ2xpY2tUb1N3aXRjaFRvRWRpdG9yOiBib29sZWFuO1xufVxuXG5sZXQgY2FjaGVkU2V0dGluZ3M6IFByZXZpZXdTZXR0aW5ncyB8IHVuZGVmaW5lZCA9IHVuZGVmaW5lZDtcblxuZXhwb3J0IGZ1bmN0aW9uIGdldFNldHRpbmdzKCk6IFByZXZpZXdTZXR0aW5ncyB7XG5cdGlmIChjYWNoZWRTZXR0aW5ncykge1xuXHRcdHJldHVybiBjYWNoZWRTZXR0aW5ncztcblx0fVxuXG5cdGNvbnN0IGVsZW1lbnQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgndnNjb2RlLW1hcmtkb3duLXByZXZpZXctZGF0YScpO1xuXHRpZiAoZWxlbWVudCkge1xuXHRcdGNvbnN0IGRhdGEgPSBlbGVtZW50LmdldEF0dHJpYnV0ZSgnZGF0YS1zZXR0aW5ncycpO1xuXHRcdGlmIChkYXRhKSB7XG5cdFx0XHRjYWNoZWRTZXR0aW5ncyA9IEpTT04ucGFyc2UoZGF0YSk7XG5cdFx0XHRyZXR1cm4gY2FjaGVkU2V0dGluZ3MhO1xuXHRcdH1cblx0fVxuXG5cdHRocm93IG5ldyBFcnJvcignQ291bGQgbm90IGxvYWQgc2V0dGluZ3MnKTtcbn1cbiJdLCJzb3VyY2VSb290IjoiIn0= \ No newline at end of file +//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vd2VicGFjay9ib290c3RyYXAiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC50aHJvdHRsZS9pbmRleC5qcyIsIndlYnBhY2s6Ly8vKHdlYnBhY2spL2J1aWxkaW4vZ2xvYmFsLmpzIiwid2VicGFjazovLy8uL3ByZXZpZXctc3JjL2FjdGl2ZUxpbmVNYXJrZXIudHMiLCJ3ZWJwYWNrOi8vLy4vcHJldmlldy1zcmMvZXZlbnRzLnRzIiwid2VicGFjazovLy8uL3ByZXZpZXctc3JjL2luZGV4LnRzIiwid2VicGFjazovLy8uL3ByZXZpZXctc3JjL21lc3NhZ2luZy50cyIsIndlYnBhY2s6Ly8vLi9wcmV2aWV3LXNyYy9zY3JvbGwtc3luYy50cyIsIndlYnBhY2s6Ly8vLi9wcmV2aWV3LXNyYy9zZXR0aW5ncy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7OztBQUdBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQUs7QUFDTDtBQUNBOztBQUVBO0FBQ0E7QUFDQSx5REFBaUQsY0FBYztBQUMvRDs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxtQ0FBMkIsMEJBQTBCLEVBQUU7QUFDdkQseUNBQWlDLGVBQWU7QUFDaEQ7QUFDQTtBQUNBOztBQUVBO0FBQ0EsOERBQXNELCtEQUErRDs7QUFFckg7QUFDQTs7O0FBR0E7QUFDQTs7Ozs7Ozs7Ozs7O0FDbkVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNB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QUMsQ0FBQztJQUMxQyxNQUFNLEtBQUssR0FBRyxtQkFBbUIsRUFBRSxDQUFDO0lBQ3BDLElBQUksUUFBUSxHQUFHLEtBQUssQ0FBQyxDQUFDLENBQUMsSUFBSSxJQUFJLENBQUM7SUFDaEMsR0FBRyxDQUFDLENBQUMsTUFBTSxLQUFLLElBQUksS0FBSyxDQUFDLENBQUMsQ0FBQztRQUMzQixFQUFFLENBQUMsQ0FBQyxLQUFLLENBQUMsSUFBSSxLQUFLLFVBQVUsQ0FBQyxDQUFDLENBQUM7WUFDL0IsTUFBTSxDQUFDLEVBQUUsUUFBUSxFQUFFLEtBQUssRUFBRSxJQUFJLEVBQUUsU0FBUyxFQUFFLENBQUM7UUFDN0MsQ0FBQztRQUNELElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQyxLQUFLLENBQUMsSUFBSSxHQUFHLFVBQVUsQ0FBQyxDQUFDLENBQUM7WUFDbEMsTUFBTSxDQUFDLEVBQUUsUUFBUSxFQUFFLElBQUksRUFBRSxLQUFLLEVBQUUsQ0FBQztRQUNsQyxDQUFDO1FBQ0QsUUFBUSxHQUFHLEtBQUssQ0FBQztJQUNsQixDQUFDO0lBQ0QsTUFBTSxDQUFDLEVBQUUsUUFBUSxFQUFFLENBQUM7QUFDckIsQ0FBQztBQWRELDREQWNDO0FBRUQ7O0dBRUc7QUFDSCxxQ0FBNEMsTUFBYztJQUN6RCxNQUFNLEtBQUssR0FBRyxtQkFBbUIsRUFBRSxDQUFDO0lBQ3BDLE1BQU0sUUFBUSxHQUFHLE1BQU0sR0FBRyxNQUFNLENBQUMsT0FBTyxDQUFDO0lBQ3pDLElBQUksRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDO0lBQ1osSUFBSSxFQUFFLEdBQUcsS0FBSyxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUM7SUFDMUIsT0FBTyxFQUFFLEdBQUcsQ0FBQyxHQUFHLEVBQUUsRUFBRSxDQUFDO1FBQ3BCLE1BQU0sR0FBRyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFLEdBQUcsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7UUFDdEMsTUFBTSxNQUFNLEdBQUcsS0FBSyxDQUFDLEdBQUcsQ0FB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Qyx5QkFBeUIsQ0FBQyxDQUFDO0FBQzVDLENBQUM7QUFmRCxrQ0FlQyIsImZpbGUiOiJpbmRleC5qcyIsInNvdXJjZXNDb250ZW50IjpbIiBcdC8vIFRoZSBtb2R1bGUgY2FjaGVcbiBcdHZhciBpbnN0YWxsZWRNb2R1bGVzID0ge307XG5cbiBcdC8vIFRoZSByZXF1aXJlIGZ1bmN0aW9uXG4gXHRmdW5jdGlvbiBfX3dlYnBhY2tfcmVxdWlyZV9fKG1vZHVsZUlkKSB7XG5cbiBcdFx0Ly8gQ2hlY2sgaWYgbW9kdWxlIGlzIGluIGNhY2hlXG4gXHRcdGlmKGluc3RhbGxlZE1vZHVsZXNbbW9kdWxlSWRdKSB7XG4gXHRcdFx0cmV0dXJuIGluc3RhbGxlZE1vZHVsZXNbbW9kdWxlSWRdLmV4cG9ydHM7XG4gXHRcdH1cbiBcdFx0Ly8gQ3JlYXRlIGEgbmV3IG1vZHVsZSAoYW5kIHB1dCBpdCBpbnRvIHRoZSBjYWNoZSlcbiBcdFx0dmFyIG1vZHVsZSA9IGluc3RhbGxlZE1vZHVsZXNbbW9kdWxlSWRdID0ge1xuIFx0XHRcdGk6IG1vZHVsZUlkLFxuIFx0XHRcdGw6IGZhbHNlLFxuIFx0XHRcdGV4cG9ydHM6IHt9XG4gXHRcdH07XG5cbiBcdFx0Ly8gRXhlY3V0ZSB0aGUgbW9kdWxlIGZ1bmN0aW9uXG4gXHRcdG1vZHVsZXNbbW9kdWxlSWRdLmNhbGwobW9kdWxlLmV4cG9ydHMsIG1vZHVsZSwgbW9kdWxlLmV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pO1xuXG4gXHRcdC8vIEZsYWcgdGhlIG1vZHVsZSBhcyBsb2FkZWRcbiBcdFx0bW9kdWxlLmwgPSB0cnVlO1xuXG4gXHRcdC8vIFJldHVybiB0aGUgZXhwb3J0cyBvZiB0aGUgbW9kdWxlXG4gXHRcdHJldHVybiBtb2R1bGUuZXhwb3J0cztcbiBcdH1cblxuXG4gXHQvLyBleHBvc2UgdGhlIG1vZHVsZXMgb2JqZWN0IChfX3dlYnBhY2tfbW9kdWxlc19fKVxuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5tID0gbW9kdWxlcztcblxuIFx0Ly8gZXhwb3NlIHRoZSBtb2R1bGUgY2FjaGVcbiBcdF9fd2VicGFja19yZXF1aXJlX18uYyA9IGluc3RhbGxlZE1vZHVsZXM7XG5cbiBcdC8vIGRlZmluZSBnZXR0ZXIgZnVuY3Rpb24gZm9yIGhhcm1vbnkgZXhwb3J0c1xuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5kID0gZnVuY3Rpb24oZXhwb3J0cywgbmFtZSwgZ2V0dGVyKSB7XG4gXHRcdGlmKCFfX3dlYnBhY2tfcmVxdWlyZV9fLm8oZXhwb3J0cywgbmFtZSkpIHtcbiBcdFx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgbmFtZSwge1xuIFx0XHRcdFx0Y29uZmlndXJhYmxlOiBmYWxzZSxcbiBcdFx0XHRcdGVudW1lcmFibGU6IHRydWUsXG4gXHRcdFx0XHRnZXQ6IGdldHRlclxuIFx0XHRcdH0pO1xuIFx0XHR9XG4gXHR9O1xuXG4gXHQvLyBkZWZpbmUgX19lc01vZHVsZSBvbiBleHBvcnRzXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLnIgPSBmdW5jdGlvbihleHBvcnRzKSB7XG4gXHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCAnX19lc01vZHVsZScsIHsgdmFsdWU6IHRydWUgfSk7XG4gXHR9O1xuXG4gXHQvLyBnZXREZWZhdWx0RXhwb3J0IGZ1bmN0aW9uIGZvciBjb21wYXRpYmlsaXR5IHdpdGggbm9uLWhhcm1vbnkgbW9kdWxlc1xuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5uID0gZnVuY3Rpb24obW9kdWxlKSB7XG4gXHRcdHZhciBnZXR0ZXIgPSBtb2R1bGUgJiYgbW9kdWxlLl9fZXNNb2R1bGUgP1xuIFx0XHRcdGZ1bmN0aW9uIGdldERlZmF1bHQoKSB7IHJldHVybiBtb2R1bGVbJ2RlZmF1bHQnXTsgfSA6XG4gXHRcdFx0ZnVuY3Rpb24gZ2V0TW9kdWxlRXhwb3J0cygpIHsgcmV0dXJuIG1vZHVsZTsgfTtcbiBcdFx0X193ZWJwYWNrX3JlcXVpcmVfXy5kKGdldHRlciwgJ2EnLCBnZXR0ZXIpO1xuIFx0XHRyZXR1cm4gZ2V0dGVyO1xuIFx0fTtcblxuIFx0Ly8gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLm8gPSBmdW5jdGlvbihvYmplY3QsIHByb3BlcnR5KSB7IHJldHVybiBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwob2JqZWN0LCBwcm9wZXJ0eSk7IH07XG5cbiBcdC8vIF9fd2VicGFja19wdWJsaWNfcGF0aF9fXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLnAgPSBcIlwiO1xuXG5cbiBcdC8vIExvYWQgZW50cnkgbW9kdWxlIGFuZCByZXR1cm4gZXhwb3J0c1xuIFx0cmV0dXJuIF9fd2VicGFja19yZXF1aXJlX18oX193ZWJwYWNrX3JlcXVpcmVfXy5zID0gXCIuL3ByZXZpZXctc3JjL2luZGV4LnRzXCIpO1xuIiwiLyoqXG4gKiBsb2Rhc2ggKEN1c3RvbSBCdWlsZCkgPGh0dHBzOi8vbG9kYXNoLmNvbS8+XG4gKiBCdWlsZDogYGxvZGFzaCBtb2R1bGFyaXplIGV4cG9ydHM9XCJucG1cIiAtbyAuL2BcbiAqIENvcHlyaWdodCBqUXVlcnkgRm91bmRhdGlvbiBhbmQgb3RoZXIgY29udHJpYnV0b3JzIDxodHRwczovL2pxdWVyeS5vcmcvPlxuICogUmVsZWFzZWQgdW5kZXIgTUlUIGxpY2Vuc2UgPGh0dHBzOi8vbG9kYXNoLmNvbS9saWNlbnNlPlxuICogQmFzZWQgb24gVW5kZXJzY29yZS5qcyAxLjguMyA8aHR0cDovL3VuZGVyc2NvcmVqcy5vcmcvTElDRU5TRT5cbiAqIENvcHlyaWdodCBKZXJlbXkgQXNoa2VuYXMsIERvY3VtZW50Q2xvdWQgYW5kIEludmVzdGlnYXRpdmUgUmVwb3J0ZXJzICYgRWRpdG9yc1xuICovXG5cbi8qKiBVc2VkIGFzIHRoZSBgVHlwZUVycm9yYCBtZXNzYWdlIGZvciBcIkZ1bmN0aW9uc1wiIG1ldGhvZHMuICovXG52YXIgRlVOQ19FUlJPUl9URVhUID0gJ0V4cGVjdGVkIGEgZnVuY3Rpb24nO1xuXG4vKiogVXNlZCBhcyByZWZlcmVuY2VzIGZvciB2YXJpb3VzIGBOdW1iZXJgIGNvbnN0YW50cy4gKi9cbnZhciBOQU4gPSAwIC8gMDtcblxuLyoqIGBPYmplY3QjdG9TdHJpbmdgIHJlc3VsdCByZWZlcmVuY2VzLiAqL1xudmFyIHN5bWJvbFRhZyA9ICdbb2JqZWN0IFN5bWJvbF0nO1xuXG4vKiogVXNlZCB0byBtYXRjaCBsZWFkaW5nIGFuZCB0cmFpbGluZyB3aGl0ZXNwYWNlLiAqL1xudmFyIHJlVHJpbSA9IC9eXFxzK3xcXHMrJC9nO1xuXG4vKiogVXNlZCB0byBkZXRlY3QgYmFkIHNpZ25lZCBoZXhhZGVjaW1hbCBzdHJpbmcgdmFsdWVzLiAqL1xudmFyIHJlSXNCYWRIZXggPSAvXlstK10weFswLTlhLWZdKyQvaTtcblxuLyoqIFVzZWQgdG8gZGV0ZWN0IGJpbmFyeSBzdHJpbmcgdmFsdWVzLiAqL1xudmFyIHJlSXNCaW5hcnkgPSAvXjBiWzAxXSskL2k7XG5cbi8qKiBVc2VkIHRvIGRldGVjdCBvY3RhbCBzdHJpbmcgdmFsdWVzLiAqL1xudmFyIHJlSXNPY3RhbCA9IC9eMG9bMC03XSskL2k7XG5cbi8qKiBCdWlsdC1pbiBtZXRob2QgcmVmZXJlbmNlcyB3aXRob3V0IGEgZGVwZW5kZW5jeSBvbiBgcm9vdGAuICovXG52YXIgZnJlZVBhcnNlSW50ID0gcGFyc2VJbnQ7XG5cbi8qKiBEZXRlY3QgZnJlZSB2YXJpYWJsZSBgZ2xvYmFsYCBmcm9tIE5vZGUuanMuICovXG52YXIgZnJlZUdsb2JhbCA9IHR5cGVvZiBnbG9iYWwgPT0gJ29iamVjdCcgJiYgZ2xvYmFsICYmIGdsb2JhbC5PYmplY3QgPT09IE9iamVjdCAmJiBnbG9iYWw7XG5cbi8qKiBEZXRlY3QgZnJlZSB2YXJpYWJsZSBgc2VsZmAuICovXG52YXIgZnJlZVNlbGYgPSB0eXBlb2Ygc2VsZiA9PSAnb2JqZWN0JyAmJiBzZWxmICYmIHNlbGYuT2JqZWN0ID09PSBPYmplY3QgJiYgc2VsZjtcblxuLyoqIFVzZWQgYXMgYSByZWZlcmVuY2UgdG8gdGhlIGdsb2JhbCBvYmplY3QuICovXG52YXIgcm9vdCA9IGZyZWVHbG9iYWwgfHwgZnJlZVNlbGYgfHwgRnVuY3Rpb24oJ3JldHVybiB0aGlzJykoKTtcblxuLyoqIFVzZWQgZm9yIGJ1aWx0LWluIG1ldGhvZCByZWZlcmVuY2VzLiAqL1xudmFyIG9iamVjdFByb3RvID0gT2JqZWN0LnByb3RvdHlwZTtcblxuLyoqXG4gKiBVc2VkIHRvIHJlc29sdmUgdGhlXG4gKiBbYHRvU3RyaW5nVGFnYF0oaHR0cDovL2VjbWEtaW50ZXJuYXRpb25hbC5vcmcvZWNtYS0yNjIvNy4wLyNzZWMtb2JqZWN0LnByb3RvdHlwZS50b3N0cmluZylcbiAqIG9mIHZhbHVlcy5cbiAqL1xudmFyIG9iamVjdFRvU3RyaW5nID0gb2JqZWN0UHJvdG8udG9TdHJpbmc7XG5cbi8qIEJ1aWx0LWluIG1ldGhvZCByZWZlcmVuY2VzIGZvciB0aG9zZSB3aXRoIHRoZSBzYW1lIG5hbWUgYXMgb3RoZXIgYGxvZGFzaGAgbWV0aG9kcy4gKi9cbnZhciBuYXRpdmVNYXggPSBNYXRoLm1heCxcbiAgICBuYXRpdmVNaW4gPSBNYXRoLm1pbjtcblxuLyoqXG4gKiBHZXRzIHRoZSB0aW1lc3RhbXAgb2YgdGhlIG51bWJlciBvZiBtaWxsaXNlY29uZHMgdGhhdCBoYXZlIGVsYXBzZWQgc2luY2VcbiAqIHRoZSBVbml4IGVwb2NoICgxIEphbnVhcnkgMTk3MCAwMDowMDowMCBVVEMpLlxuICpcbiAqIEBzdGF0aWNcbiAqIEBtZW1iZXJPZiBfXG4gKiBAc2luY2UgMi40LjBcbiAqIEBjYXRlZ29yeSBEYXRlXG4gKiBAcmV0dXJucyB7bnVtYmVyfSBSZXR1cm5zIHRoZSB0aW1lc3RhbXAuXG4gKiBAZXhhbXBsZVxuICpcbiAqIF8uZGVmZXIoZnVuY3Rpb24oc3RhbXApIHtcbiAqICAgY29uc29sZS5sb2coXy5ub3coKSAtIHN0YW1wKTtcbiAqIH0sIF8ubm93KCkpO1xuICogLy8gPT4gTG9ncyB0aGUgbnVtYmVyIG9mIG1pbGxpc2Vjb25kcyBpdCB0b29rIGZvciB0aGUgZGVmZXJyZWQgaW52b2NhdGlvbi5cbiAqL1xudmFyIG5vdyA9IGZ1bmN0aW9uKCkge1xuICByZXR1cm4gcm9vdC5EYXRlLm5vdygpO1xufTtcblxuLyoqXG4gKiBDcmVhdGVzIGEgZGVib3VuY2VkIGZ1bmN0aW9uIHRoYXQgZGVsYXlzIGludm9raW5nIGBmdW5jYCB1bnRpbCBhZnRlciBgd2FpdGBcbiAqIG1pbGxpc2Vjb25kcyBoYXZlIGVsYXBzZWQgc2luY2UgdGhlIGxhc3QgdGltZSB0aGUgZGVib3VuY2VkIGZ1bmN0aW9uIHdhc1xuICogaW52b2tlZC4gVGhlIGRlYm91bmNlZCBmdW5jdGlvbiBjb21lcyB3aXRoIGEgYGNhbmNlbGAgbWV0aG9kIHRvIGNhbmNlbFxuICogZGVsYXllZCBgZnVuY2AgaW52b2NhdGlvbnMgYW5kIGEgYGZsdXNoYCBtZXRob2QgdG8gaW1tZWRpYXRlbHkgaW52b2tlIHRoZW0uXG4gKiBQcm92aWRlIGBvcHRpb25zYCB0byBpbmRpY2F0ZSB3aGV0aGVyIGBmdW5jYCBzaG91bGQgYmUgaW52b2tlZCBvbiB0aGVcbiAqIGxlYWRpbmcgYW5kL29yIHRyYWlsaW5nIGVkZ2Ugb2YgdGhlIGB3YWl0YCB0aW1lb3V0LiBUaGUgYGZ1bmNgIGlzIGludm9rZWRcbiAqIHdpdGggdGhlIGxhc3QgYXJndW1lbnRzIHByb3ZpZGVkIHRvIHRoZSBkZWJvdW5jZWQgZnVuY3Rpb24uIFN1YnNlcXVlbnRcbiAqIGNhbGxzIHRvIHRoZSBkZWJvdW5jZWQgZnVuY3Rpb24gcmV0dXJuIHRoZSByZXN1bHQgb2YgdGhlIGxhc3QgYGZ1bmNgXG4gKiBpbnZvY2F0aW9uLlxuICpcbiAqICoqTm90ZToqKiBJZiBgbGVhZGluZ2AgYW5kIGB0cmFpbGluZ2Agb3B0aW9ucyBhcmUgYHRydWVgLCBgZnVuY2AgaXNcbiAqIGludm9rZWQgb24gdGhlIHRyYWlsaW5nIGVkZ2Ugb2YgdGhlIHRpbWVvdXQgb25seSBpZiB0aGUgZGVib3VuY2VkIGZ1bmN0aW9uXG4gKiBpcyBpbnZva2VkIG1vcmUgdGhhbiBvbmNlIGR1cmluZyB0aGUgYHdhaXRgIHRpbWVvdXQuXG4gKlxuICogSWYgYHdhaXRgIGlzIGAwYCBhbmQgYGxlYWRpbmdgIGlzIGBmYWxzZWAsIGBmdW5jYCBpbnZvY2F0aW9uIGlzIGRlZmVycmVkXG4gKiB1bnRpbCB0byB0aGUgbmV4dCB0aWNrLCBzaW1pbGFyIHRvIGBzZXRUaW1lb3V0YCB3aXRoIGEgdGltZW91dCBvZiBgMGAuXG4gKlxuICogU2VlIFtEYXZpZCBDb3JiYWNobydzIGFydGljbGVdKGh0dHBzOi8vY3NzLXRyaWNrcy5jb20vZGVib3VuY2luZy10aHJvdHRsaW5nLWV4cGxhaW5lZC1leGFtcGxlcy8pXG4gKiBmb3IgZGV0YWlscyBvdmVyIHRoZSBkaWZmZXJlbmNlcyBiZXR3ZWVuIGBfLmRlYm91bmNlYCBhbmQgYF8udGhyb3R0bGVgLlxuICpcbiAqIEBzdGF0aWNcbiAqIEBtZW1iZXJPZiBfXG4gKiBAc2luY2UgMC4xLjBcbiAqIEBjYXRlZ29yeSBGdW5jdGlvblxuICogQHBhcmFtIHtGdW5jdGlvbn0gZnVuYyBUaGUgZnVuY3Rpb24gdG8gZGVib3VuY2UuXG4gKiBAcGFyYW0ge251bWJlcn0gW3dhaXQ9MF0gVGhlIG51bWJlciBvZiBtaWxsaXNlY29uZHMgdG8gZGVsYXkuXG4gKiBAcGFyYW0ge09iamVjdH0gW29wdGlvbnM9e31dIFRoZSBvcHRpb25zIG9iamVjdC5cbiAqIEBwYXJhbSB7Ym9vbGVhbn0gW29wdGlvbnMubGVhZGluZz1mYWxzZV1cbiAqICBTcGVjaWZ5IGludm9raW5nIG9uIHRoZSBsZWFkaW5nIGVkZ2Ugb2YgdGhlIHRpbWVvdXQuXG4gKiBAcGFyYW0ge251bWJlcn0gW29wdGlvbnMubWF4V2FpdF1cbiAqICBUaGUgbWF4aW11bSB0aW1lIGBmdW5jYCBpcyBhbGxvd2VkIHRvIGJlIGRlbGF5ZWQgYmVmb3JlIGl0J3MgaW52b2tlZC5cbiAqIEBwYXJhbSB7Ym9vbGVhbn0gW29wdGlvbnMudHJhaWxpbmc9dHJ1ZV1cbiAqICBTcGVjaWZ5IGludm9raW5nIG9uIHRoZSB0cmFpbGluZyBlZGdlIG9mIHRoZSB0aW1lb3V0LlxuICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIHRoZSBuZXcgZGVib3VuY2VkIGZ1bmN0aW9uLlxuICogQGV4YW1wbGVcbiAqXG4gKiAvLyBBdm9pZCBjb3N0bHkgY2FsY3VsYXRpb25zIHdoaWxlIHRoZSB3aW5kb3cgc2l6ZSBpcyBpbiBmbHV4LlxuICogalF1ZXJ5KHdpbmRvdykub24oJ3Jlc2l6ZScsIF8uZGVib3VuY2UoY2FsY3VsYXRlTGF5b3V0LCAxNTApKTtcbiAqXG4gKiAvLyBJbnZva2UgYHNlbmRNYWlsYCB3aGVuIGNsaWNrZWQsIGRlYm91bmNpbmcgc3Vic2VxdWVudCBjYWxscy5cbiAqIGpRdWVyeShlbGVtZW50KS5vbignY2xpY2snLCBfLmRlYm91bmNlKHNlbmRNYWlsLCAzMDAsIHtcbiAqICAgJ2xlYWRpbmcnOiB0cnVlLFxuICogICAndHJhaWxpbmcnOiBmYWxzZVxuICogfSkpO1xuICpcbiAqIC8vIEVuc3VyZSBgYmF0Y2hMb2dgIGlzIGludm9rZWQgb25jZSBhZnRlciAxIHNlY29uZCBvZiBkZWJvdW5jZWQgY2FsbHMuXG4gKiB2YXIgZGVib3VuY2VkID0gXy5kZWJvdW5jZShiYXRjaExvZywgMjUwLCB7ICdtYXhXYWl0JzogMTAwMCB9KTtcbiAqIHZhciBzb3VyY2UgPSBuZXcgRXZlbnRTb3VyY2UoJy9zdHJlYW0nKTtcbiAqIGpRdWVyeShzb3VyY2UpLm9uKCdtZXNzYWdlJywgZGVib3VuY2VkKTtcbiAqXG4gKiAvLyBDYW5jZWwgdGhlIHRyYWlsaW5nIGRlYm91bmNlZCBpbnZvY2F0aW9uLlxuICogalF1ZXJ5KHdpbmRvdykub24oJ3BvcHN0YXRlJywgZGVib3VuY2VkLmNhbmNlbCk7XG4gKi9cbmZ1bmN0aW9uIGRlYm91bmNlKGZ1bmMsIHdhaXQsIG9wdGlvbnMpIHtcbiAgdmFyIGxhc3RBcmdzLFxuICAgICAgbGFzdFRoaXMsXG4gICAgICBtYXhXYWl0LFxuICAgICAgcmVzdWx0LFxuICAgICAgdGltZXJJZCxcbiAgICAgIGxhc3RDYWxsVGltZSxcbiAgICAgIGxhc3RJbnZva2VUaW1lID0gMCxcbiAgICAgIGxlYWRpbmcgPSBmYWxzZSxcbiAgICAgIG1heGluZyA9IGZhbHNlLFxuICAgICAgdHJhaWxpbmcgPSB0cnVlO1xuXG4gIGlmICh0eXBlb2YgZnVuYyAhPSAnZnVuY3Rpb24nKSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcihGVU5DX0VSUk9SX1RFWFQpO1xuICB9XG4gIHdhaXQgPSB0b051bWJlcih3YWl0KSB8fCAwO1xuICBpZiAoaXNPYmplY3Qob3B0aW9ucykpIHtcbiAgICBsZWFkaW5nID0gISFvcHRpb25zLmxlYWRpbmc7XG4gICAgbWF4aW5nID0gJ21heFdhaXQnIGluIG9wdGlvbnM7XG4gICAgbWF4V2FpdCA9IG1heGluZyA/IG5hdGl2ZU1heCh0b051bWJlcihvcHRpb25zLm1heFdhaXQpIHx8IDAsIHdhaXQpIDogbWF4V2FpdDtcbiAgICB0cmFpbGluZyA9ICd0cmFpbGluZycgaW4gb3B0aW9ucyA/ICEhb3B0aW9ucy50cmFpbGluZyA6IHRyYWlsaW5nO1xuICB9XG5cbiAgZnVuY3Rpb24gaW52b2tlRnVuYyh0aW1lKSB7XG4gICAgdmFyIGFyZ3MgPSBsYXN0QXJncyxcbiAgICAgICAgdGhpc0FyZyA9IGxhc3RUaGlzO1xuXG4gICAgbGFzdEFyZ3MgPSBsYXN0VGhpcyA9IHVuZGVmaW5lZDtcbiAgICBsYXN0SW52b2tlVGltZSA9IHRpbWU7XG4gICAgcmVzdWx0ID0gZnVuYy5hcHBseSh0aGlzQXJnLCBhcmdzKTtcbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG5cbiAgZnVuY3Rpb24gbGVhZGluZ0VkZ2UodGltZSkge1xuICAgIC8vIFJlc2V0IGFueSBgbWF4V2FpdGAgdGltZXIuXG4gICAgbGFzdEludm9rZVRpbWUgPSB0aW1lO1xuICAgIC8vIFN0YXJ0IHRoZSB0aW1lciBmb3IgdGhlIHRyYWlsaW5nIGVkZ2UuXG4gICAgdGltZXJJZCA9IHNldFRpbWVvdXQodGltZXJFeHBpcmVkLCB3YWl0KTtcbiAgICAvLyBJbnZva2UgdGhlIGxlYWRpbmcgZWRnZS5cbiAgICByZXR1cm4gbGVhZGluZyA/IGludm9rZUZ1bmModGltZSkgOiByZXN1bHQ7XG4gIH1cblxuICBmdW5jdGlvbiByZW1haW5pbmdXYWl0KHRpbWUpIHtcbiAgICB2YXIgdGltZVNpbmNlTGFzdENhbGwgPSB0aW1lIC0gbGFzdENhbGxUaW1lLFxuICAgICAgICB0aW1lU2luY2VMYXN0SW52b2tlID0gdGltZSAtIGxhc3RJbnZva2VUaW1lLFxuICAgICAgICByZXN1bHQgPSB3YWl0IC0gdGltZVNpbmNlTGFzdENhbGw7XG5cbiAgICByZXR1cm4gbWF4aW5nID8gbmF0aXZlTWluKHJlc3VsdCwgbWF4V2FpdCAtIHRpbWVTaW5jZUxhc3RJbnZva2UpIDogcmVzdWx0O1xuICB9XG5cbiAgZnVuY3Rpb24gc2hvdWxkSW52b2tlKHRpbWUpIHtcbiAgICB2YXIgdGltZVNpbmNlTGFzdENhbGwgPSB0aW1lIC0gbGFzdENhbGxUaW1lLFxuICAgICAgICB0aW1lU2luY2VMYXN0SW52b2tlID0gdGltZSAtIGxhc3RJbnZva2VUaW1lO1xuXG4gICAgLy8gRWl0aGVyIHRoaXMgaXMgdGhlIGZpcnN0IGNhbGwsIGFjdGl2aXR5IGhhcyBzdG9wcGVkIGFuZCB3ZSdyZSBhdCB0aGVcbiAgICAvLyB0cmFpbGluZyBlZGdlLCB0aGUgc3lzdGVtIHRpbWUgaGFzIGdvbmUgYmFja3dhcmRzIGFuZCB3ZSdyZSB0cmVhdGluZ1xuICAgIC8vIGl0IGFzIHRoZSB0cmFpbGluZyBlZGdlLCBvciB3ZSd2ZSBoaXQgdGhlIGBtYXhXYWl0YCBsaW1pdC5cbiAgICByZXR1cm4gKGxhc3RDYWxsVGltZSA9PT0gdW5kZWZpbmVkIHx8ICh0aW1lU2luY2VMYXN0Q2FsbCA+PSB3YWl0KSB8fFxuICAgICAgKHRpbWVTaW5jZUxhc3RDYWxsIDwgMCkgfHwgKG1heGluZyAmJiB0aW1lU2luY2VMYXN0SW52b2tlID49IG1heFdhaXQpKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIHRpbWVyRXhwaXJlZCgpIHtcbiAgICB2YXIgdGltZSA9IG5vdygpO1xuICAgIGlmIChzaG91bGRJbnZva2UodGltZSkpIHtcbiAgICAgIHJldHVybiB0cmFpbGluZ0VkZ2UodGltZSk7XG4gICAgfVxuICAgIC8vIFJlc3RhcnQgdGhlIHRpbWVyLlxuICAgIHRpbWVySWQgPSBzZXRUaW1lb3V0KHRpbWVyRXhwaXJlZCwgcmVtYWluaW5nV2FpdCh0aW1lKSk7XG4gIH1cblxuICBmdW5jdGlvbiB0cmFpbGluZ0VkZ2UodGltZSkge1xuICAgIHRpbWVySWQgPSB1bmRlZmluZWQ7XG5cbiAgICAvLyBPbmx5IGludm9rZSBpZiB3ZSBoYXZlIGBsYXN0QXJnc2Agd2hpY2ggbWVhbnMgYGZ1bmNgIGhhcyBiZWVuXG4gICAgLy8gZGVib3VuY2VkIGF0IGxlYXN0IG9uY2UuXG4gICAgaWYgKHRyYWlsaW5nICYmIGxhc3RBcmdzKSB7XG4gICAgICByZXR1cm4gaW52b2tlRnVuYyh0aW1lKTtcbiAgICB9XG4gICAgbGFzdEFyZ3MgPSBsYXN0VGhpcyA9IHVuZGVmaW5lZDtcbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG5cbiAgZnVuY3Rpb24gY2FuY2VsKCkge1xuICAgIGlmICh0aW1lcklkICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGNsZWFyVGltZW91dCh0aW1lcklkKTtcbiAgICB9XG4gICAgbGFzdEludm9rZVRpbWUgPSAwO1xuICAgIGxhc3RBcmdzID0gbGFzdENhbGxUaW1lID0gbGFzdFRoaXMgPSB0aW1lcklkID0gdW5kZWZpbmVkO1xuICB9XG5cbiAgZnVuY3Rpb24gZmx1c2goKSB7XG4gICAgcmV0dXJuIHRpbWVySWQgPT09IHVuZGVmaW5lZCA/IHJlc3VsdCA6IHRyYWlsaW5nRWRnZShub3coKSk7XG4gIH1cblxuICBmdW5jdGlvbiBkZWJvdW5jZWQoKSB7XG4gICAgdmFyIHRpbWUgPSBub3coKSxcbiAgICAgICAgaXNJbnZva2luZyA9IHNob3VsZEludm9rZSh0aW1lKTtcblxuICAgIGxhc3RBcmdzID0gYXJndW1lbnRzO1xuICAgIGxhc3RUaGlzID0gdGhpcztcbiAgICBsYXN0Q2FsbFRpbWUgPSB0aW1lO1xuXG4gICAgaWYgKGlzSW52b2tpbmcpIHtcbiAgICAgIGlmICh0aW1lcklkID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgcmV0dXJuIGxlYWRpbmdFZGdlKGxhc3RDYWxsVGltZSk7XG4gICAgICB9XG4gICAgICBpZiAobWF4aW5nKSB7XG4gICAgICAgIC8vIEhhbmRsZSBpbnZvY2F0aW9ucyBpbiBhIHRpZ2h0IGxvb3AuXG4gICAgICAgIHRpbWVySWQgPSBzZXRUaW1lb3V0KHRpbWVyRXhwaXJlZCwgd2FpdCk7XG4gICAgICAgIHJldHVybiBpbnZva2VGdW5jKGxhc3RDYWxsVGltZSk7XG4gICAgICB9XG4gICAgfVxuICAgIGlmICh0aW1lcklkID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHRpbWVySWQgPSBzZXRUaW1lb3V0KHRpbWVyRXhwaXJlZCwgd2FpdCk7XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cbiAgZGVib3VuY2VkLmNhbmNlbCA9IGNhbmNlbDtcbiAgZGVib3VuY2VkLmZsdXNoID0gZmx1c2g7XG4gIHJldHVybiBkZWJvdW5jZWQ7XG59XG5cbi8qKlxuICogQ3JlYXRlcyBhIHRocm90dGxlZCBmdW5jdGlvbiB0aGF0IG9ubHkgaW52b2tlcyBgZnVuY2AgYXQgbW9zdCBvbmNlIHBlclxuICogZXZlcnkgYHdhaXRgIG1pbGxpc2Vjb25kcy4gVGhlIHRocm90dGxlZCBmdW5jdGlvbiBjb21lcyB3aXRoIGEgYGNhbmNlbGBcbiAqIG1ldGhvZCB0byBjYW5jZWwgZGVsYXllZCBgZnVuY2AgaW52b2NhdGlvbnMgYW5kIGEgYGZsdXNoYCBtZXRob2QgdG9cbiAqIGltbWVkaWF0ZWx5IGludm9rZSB0aGVtLiBQcm92aWRlIGBvcHRpb25zYCB0byBpbmRpY2F0ZSB3aGV0aGVyIGBmdW5jYFxuICogc2hvdWxkIGJlIGludm9rZWQgb24gdGhlIGxlYWRpbmcgYW5kL29yIHRyYWlsaW5nIGVkZ2Ugb2YgdGhlIGB3YWl0YFxuICogdGltZW91dC4gVGhlIGBmdW5jYCBpcyBpbnZva2VkIHdpdGggdGhlIGxhc3QgYXJndW1lbnRzIHByb3ZpZGVkIHRvIHRoZVxuICogdGhyb3R0bGVkIGZ1bmN0aW9uLiBTdWJzZXF1ZW50IGNhbGxzIHRvIHRoZSB0aHJvdHRsZWQgZnVuY3Rpb24gcmV0dXJuIHRoZVxuICogcmVzdWx0IG9mIHRoZSBsYXN0IGBmdW5jYCBpbnZvY2F0aW9uLlxuICpcbiAqICoqTm90ZToqKiBJZiBgbGVhZGluZ2AgYW5kIGB0cmFpbGluZ2Agb3B0aW9ucyBhcmUgYHRydWVgLCBgZnVuY2AgaXNcbiAqIGludm9rZWQgb24gdGhlIHRyYWlsaW5nIGVkZ2Ugb2YgdGhlIHRpbWVvdXQgb25seSBpZiB0aGUgdGhyb3R0bGVkIGZ1bmN0aW9uXG4gKiBpcyBpbnZva2VkIG1vcmUgdGhhbiBvbmNlIGR1cmluZyB0aGUgYHdhaXRgIHRpbWVvdXQuXG4gKlxuICogSWYgYHdhaXRgIGlzIGAwYCBhbmQgYGxlYWRpbmdgIGlzIGBmYWxzZWAsIGBmdW5jYCBpbnZvY2F0aW9uIGlzIGRlZmVycmVkXG4gKiB1bnRpbCB0byB0aGUgbmV4dCB0aWNrLCBzaW1pbGFyIHRvIGBzZXRUaW1lb3V0YCB3aXRoIGEgdGltZW91dCBvZiBgMGAuXG4gKlxuICogU2VlIFtEYXZpZCBDb3JiYWNobydzIGFydGljbGVdKGh0dHBzOi8vY3NzLXRyaWNrcy5jb20vZGVib3VuY2luZy10aHJvdHRsaW5nLWV4cGxhaW5lZC1leGFtcGxlcy8pXG4gKiBmb3IgZGV0YWlscyBvdmVyIHRoZSBkaWZmZXJlbmNlcyBiZXR3ZWVuIGBfLnRocm90dGxlYCBhbmQgYF8uZGVib3VuY2VgLlxuICpcbiAqIEBzdGF0aWNcbiAqIEBtZW1iZXJPZiBfXG4gKiBAc2luY2UgMC4xLjBcbiAqIEBjYXRlZ29yeSBGdW5jdGlvblxuICogQHBhcmFtIHtGdW5jdGlvbn0gZnVuYyBUaGUgZnVuY3Rpb24gdG8gdGhyb3R0bGUuXG4gKiBAcGFyYW0ge251bWJlcn0gW3dhaXQ9MF0gVGhlIG51bWJlciBvZiBtaWxsaXNlY29uZHMgdG8gdGhyb3R0bGUgaW52b2NhdGlvbnMgdG8uXG4gKiBAcGFyYW0ge09iamVjdH0gW29wdGlvbnM9e31dIFRoZSBvcHRpb25zIG9iamVjdC5cbiAqIEBwYXJhbSB7Ym9vbGVhbn0gW29wdGlvbnMubGVhZGluZz10cnVlXVxuICogIFNwZWNpZnkgaW52b2tpbmcgb24gdGhlIGxlYWRpbmcgZWRnZSBvZiB0aGUgdGltZW91dC5cbiAqIEBwYXJhbSB7Ym9vbGVhbn0gW29wdGlvbnMudHJhaWxpbmc9dHJ1ZV1cbiAqICBTcGVjaWZ5IGludm9raW5nIG9uIHRoZSB0cmFpbGluZyBlZGdlIG9mIHRoZSB0aW1lb3V0LlxuICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIHRoZSBuZXcgdGhyb3R0bGVkIGZ1bmN0aW9uLlxuICogQGV4YW1wbGVcbiAqXG4gKiAvLyBBdm9pZCBleGNlc3NpdmVseSB1cGRhdGluZyB0aGUgcG9zaXRpb24gd2hpbGUgc2Nyb2xsaW5nLlxuICogalF1ZXJ5KHdpbmRvdykub24oJ3Njcm9sbCcsIF8udGhyb3R0bGUodXBkYXRlUG9zaXRpb24sIDEwMCkpO1xuICpcbiAqIC8vIEludm9rZSBgcmVuZXdUb2tlbmAgd2hlbiB0aGUgY2xpY2sgZXZlbnQgaXMgZmlyZWQsIGJ1dCBub3QgbW9yZSB0aGFuIG9uY2UgZXZlcnkgNSBtaW51dGVzLlxuICogdmFyIHRocm90dGxlZCA9IF8udGhyb3R0bGUocmVuZXdUb2tlbiwgMzAwMDAwLCB7ICd0cmFpbGluZyc6IGZhbHNlIH0pO1xuICogalF1ZXJ5KGVsZW1lbnQpLm9uKCdjbGljaycsIHRocm90dGxlZCk7XG4gKlxuICogLy8gQ2FuY2VsIHRoZSB0cmFpbGluZyB0aHJvdHRsZWQgaW52b2NhdGlvbi5cbiAqIGpRdWVyeSh3aW5kb3cpLm9uKCdwb3BzdGF0ZScsIHRocm90dGxlZC5jYW5jZWwpO1xuICovXG5mdW5jdGlvbiB0aHJvdHRsZShmdW5jLCB3YWl0LCBvcHRpb25zKSB7XG4gIHZhciBsZWFkaW5nID0gdHJ1ZSxcbiAgICAgIHRyYWlsaW5nID0gdHJ1ZTtcblxuICBpZiAodHlwZW9mIGZ1bmMgIT0gJ2Z1bmN0aW9uJykge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoRlVOQ19FUlJPUl9URVhUKTtcbiAgfVxuICBpZiAoaXNPYmplY3Qob3B0aW9ucykpIHtcbiAgICBsZWFkaW5nID0gJ2xlYWRpbmcnIGluIG9wdGlvbnMgPyAhIW9wdGlvbnMubGVhZGluZyA6IGxlYWRpbmc7XG4gICAgdHJhaWxpbmcgPSAndHJhaWxpbmcnIGluIG9wdGlvbnMgPyAhIW9wdGlvbnMudHJhaWxpbmcgOiB0cmFpbGluZztcbiAgfVxuICByZXR1cm4gZGVib3VuY2UoZnVuYywgd2FpdCwge1xuICAgICdsZWFkaW5nJzogbGVhZGluZyxcbiAgICAnbWF4V2FpdCc6IHdhaXQsXG4gICAgJ3RyYWlsaW5nJzogdHJhaWxpbmdcbiAgfSk7XG59XG5cbi8qKlxuICogQ2hlY2tzIGlmIGB2YWx1ZWAgaXMgdGhlXG4gKiBbbGFuZ3VhZ2UgdHlwZV0oaHR0cDovL3d3dy5lY21hLWludGVybmF0aW9uYWwub3JnL2VjbWEtMjYyLzcuMC8jc2VjLWVjbWFzY3JpcHQtbGFuZ3VhZ2UtdHlwZXMpXG4gKiBvZiBgT2JqZWN0YC4gKGUuZy4gYXJyYXlzLCBmdW5jdGlvbnMsIG9iamVjdHMsIHJlZ2V4ZXMsIGBuZXcgTnVtYmVyKDApYCwgYW5kIGBuZXcgU3RyaW5nKCcnKWApXG4gKlxuICogQHN0YXRpY1xuICogQG1lbWJlck9mIF9cbiAqIEBzaW5jZSAwLjEuMFxuICogQGNhdGVnb3J5IExhbmdcbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrLlxuICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgYW4gb2JqZWN0LCBlbHNlIGBmYWxzZWAuXG4gKiBAZXhhbXBsZVxuICpcbiAqIF8uaXNPYmplY3Qoe30pO1xuICogLy8gPT4gdHJ1ZVxuICpcbiAqIF8uaXNPYmplY3QoWzEsIDIsIDNdKTtcbiAqIC8vID0+IHRydWVcbiAqXG4gKiBfLmlzT2JqZWN0KF8ubm9vcCk7XG4gKiAvLyA9PiB0cnVlXG4gKlxuICogXy5pc09iamVjdChudWxsKTtcbiAqIC8vID0+IGZhbHNlXG4gKi9cbmZ1bmN0aW9uIGlzT2JqZWN0KHZhbHVlKSB7XG4gIHZhciB0eXBlID0gdHlwZW9mIHZhbHVlO1xuICByZXR1cm4gISF2YWx1ZSAmJiAodHlwZSA9PSAnb2JqZWN0JyB8fCB0eXBlID09ICdmdW5jdGlvbicpO1xufVxuXG4vKipcbiAqIENoZWNrcyBpZiBgdmFsdWVgIGlzIG9iamVjdC1saWtlLiBBIHZhbHVlIGlzIG9iamVjdC1saWtlIGlmIGl0J3Mgbm90IGBudWxsYFxuICogYW5kIGhhcyBhIGB0eXBlb2ZgIHJlc3VsdCBvZiBcIm9iamVjdFwiLlxuICpcbiAqIEBzdGF0aWNcbiAqIEBtZW1iZXJPZiBfXG4gKiBAc2luY2UgNC4wLjBcbiAqIEBjYXRlZ29yeSBMYW5nXG4gKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay5cbiAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIG9iamVjdC1saWtlLCBlbHNlIGBmYWxzZWAuXG4gKiBAZXhhbXBsZVxuICpcbiAqIF8uaXNPYmplY3RMaWtlKHt9KTtcbiAqIC8vID0+IHRydWVcbiAqXG4gKiBfLmlzT2JqZWN0TGlrZShbMSwgMiwgM10pO1xuICogLy8gPT4gdHJ1ZVxuICpcbiAqIF8uaXNPYmplY3RMaWtlKF8ubm9vcCk7XG4gKiAvLyA9PiBmYWxzZVxuICpcbiAqIF8uaXNPYmplY3RMaWtlKG51bGwpO1xuICogLy8gPT4gZmFsc2VcbiAqL1xuZnVuY3Rpb24gaXNPYmplY3RMaWtlKHZhbHVlKSB7XG4gIHJldHVybiAhIXZhbHVlICYmIHR5cGVvZiB2YWx1ZSA9PSAnb2JqZWN0Jztcbn1cblxuLyoqXG4gKiBDaGVja3MgaWYgYHZhbHVlYCBpcyBjbGFzc2lmaWVkIGFzIGEgYFN5bWJvbGAgcHJpbWl0aXZlIG9yIG9iamVjdC5cbiAqXG4gKiBAc3RhdGljXG4gKiBAbWVtYmVyT2YgX1xuICogQHNpbmNlIDQuMC4wXG4gKiBAY2F0ZWdvcnkgTGFuZ1xuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBhIHN5bWJvbCwgZWxzZSBgZmFsc2VgLlxuICogQGV4YW1wbGVcbiAqXG4gKiBfLmlzU3ltYm9sKFN5bWJvbC5pdGVyYXRvcik7XG4gKiAvLyA9PiB0cnVlXG4gKlxuICogXy5pc1N5bWJvbCgnYWJjJyk7XG4gKiAvLyA9PiBmYWxzZVxuICovXG5mdW5jdGlvbiBpc1N5bWJvbCh2YWx1ZSkge1xuICByZXR1cm4gdHlwZW9mIHZhbHVlID09ICdzeW1ib2wnIHx8XG4gICAgKGlzT2JqZWN0TGlrZSh2YWx1ZSkgJiYgb2JqZWN0VG9TdHJpbmcuY2FsbCh2YWx1ZSkgPT0gc3ltYm9sVGFnKTtcbn1cblxuLyoqXG4gKiBDb252ZXJ0cyBgdmFsdWVgIHRvIGEgbnVtYmVyLlxuICpcbiAqIEBzdGF0aWNcbiAqIEBtZW1iZXJPZiBfXG4gKiBAc2luY2UgNC4wLjBcbiAqIEBjYXRlZ29yeSBMYW5nXG4gKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBwcm9jZXNzLlxuICogQHJldHVybnMge251bWJlcn0gUmV0dXJucyB0aGUgbnVtYmVyLlxuICogQGV4YW1wbGVcbiAqXG4gKiBfLnRvTnVtYmVyKDMuMik7XG4gKiAvLyA9PiAzLjJcbiAqXG4gKiBfLnRvTnVtYmVyKE51bWJlci5NSU5fVkFMVUUpO1xuICogLy8gPT4gNWUtMzI0XG4gKlxuICogXy50b051bWJlcihJbmZpbml0eSk7XG4gKiAvLyA9PiBJbmZpbml0eVxuICpcbiAqIF8udG9OdW1iZXIoJzMuMicpO1xuICogLy8gPT4gMy4yXG4gKi9cbmZ1bmN0aW9uIHRvTnVtYmVyKHZhbHVlKSB7XG4gIGlmICh0eXBlb2YgdmFsdWUgPT0gJ251bWJlcicpIHtcbiAgICByZXR1cm4gdmFsdWU7XG4gIH1cbiAgaWYgKGlzU3ltYm9sKHZhbHVlKSkge1xuICAgIHJldHVybiBOQU47XG4gIH1cbiAgaWYgKGlzT2JqZWN0KHZhbHVlKSkge1xuICAgIHZhciBvdGhlciA9IHR5cGVvZiB2YWx1ZS52YWx1ZU9mID09ICdmdW5jdGlvbicgPyB2YWx1ZS52YWx1ZU9mKCkgOiB2YWx1ZTtcbiAgICB2YWx1ZSA9IGlzT2JqZWN0KG90aGVyKSA/IChvdGhlciArICcnKSA6IG90aGVyO1xuICB9XG4gIGlmICh0eXBlb2YgdmFsdWUgIT0gJ3N0cmluZycpIHtcbiAgICByZXR1cm4gdmFsdWUgPT09IDAgPyB2YWx1ZSA6ICt2YWx1ZTtcbiAgfVxuICB2YWx1ZSA9IHZhbHVlLnJlcGxhY2UocmVUcmltLCAnJyk7XG4gIHZhciBpc0JpbmFyeSA9IHJlSXNCaW5hcnkudGVzdCh2YWx1ZSk7XG4gIHJldHVybiAoaXNCaW5hcnkgfHwgcmVJc09jdGFsLnRlc3QodmFsdWUpKVxuICAgID8gZnJlZVBhcnNlSW50KHZhbHVlLnNsaWNlKDIpLCBpc0JpbmFyeSA/IDIgOiA4KVxuICAgIDogKHJlSXNCYWRIZXgudGVzdCh2YWx1ZSkgPyBOQU4gOiArdmFsdWUpO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IHRocm90dGxlO1xuIiwidmFyIGc7XHJcblxyXG4vLyBUaGlzIHdvcmtzIGluIG5vbi1zdHJpY3QgbW9kZVxyXG5nID0gKGZ1bmN0aW9uKCkge1xyXG5cdHJldHVybiB0aGlzO1xyXG59KSgpO1xyXG5cclxudHJ5IHtcclxuXHQvLyBUaGlzIHdvcmtzIGlmIGV2YWwgaXMgYWxsb3dlZCAoc2VlIENTUClcclxuXHRnID0gZyB8fCBGdW5jdGlvbihcInJldHVybiB0aGlzXCIpKCkgfHwgKDEsIGV2YWwpKFwidGhpc1wiKTtcclxufSBjYXRjaCAoZSkge1xyXG5cdC8vIFRoaXMgd29ya3MgaWYgdGhlIHdpbmRvdyByZWZlcmVuY2UgaXMgYXZhaWxhYmxlXHJcblx0aWYgKHR5cGVvZiB3aW5kb3cgPT09IFwib2JqZWN0XCIpIGcgPSB3aW5kb3c7XHJcbn1cclxuXHJcbi8vIGcgY2FuIHN0aWxsIGJlIHVuZGVmaW5lZCwgYnV0IG5vdGhpbmcgdG8gZG8gYWJvdXQgaXQuLi5cclxuLy8gV2UgcmV0dXJuIHVuZGVmaW5lZCwgaW5zdGVhZCBvZiBub3RoaW5nIGhlcmUsIHNvIGl0J3NcclxuLy8gZWFzaWVyIHRvIGhhbmRsZSB0aGlzIGNhc2UuIGlmKCFnbG9iYWwpIHsgLi4ufVxyXG5cclxubW9kdWxlLmV4cG9ydHMgPSBnO1xyXG4iLCIvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICogIENvcHlyaWdodCAoYykgTWljcm9zb2Z0IENvcnBvcmF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICogIExpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgTGljZW5zZS4gU2VlIExpY2Vuc2UudHh0IGluIHRoZSBwcm9qZWN0IHJvb3QgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24uXG4gKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi9cbmltcG9ydCB7IGdldEVsZW1lbnRzRm9yU291cmNlTGluZSB9IGZyb20gJy4vc2Nyb2xsLXN5bmMnO1xuXG5leHBvcnQgY2xhc3MgQWN0aXZlTGluZU1hcmtlciB7XG5cdHByaXZhdGUgX2N1cnJlbnQ6IGFueTtcblxuXHRvbkRpZENoYW5nZVRleHRFZGl0b3JTZWxlY3Rpb24obGluZTogbnVtYmVyKSB7XG5cdFx0Y29uc3QgeyBwcmV2aW91cyB9ID0gZ2V0RWxlbWVudHNGb3JTb3VyY2VMaW5lKGxpbmUpO1xuXHRcdHRoaXMuX3VwZGF0ZShwcmV2aW91cyAmJiBwcmV2aW91cy5lbGVtZW50KTtcblx0fVxuXG5cdF91cGRhdGUoYmVmb3JlOiBIVE1MRWxlbWVudCB8IHVuZGVmaW5lZCkge1xuXHRcdHRoaXMuX3VubWFya0FjdGl2ZUVsZW1lbnQodGhpcy5fY3VycmVudCk7XG5cdFx0dGhpcy5fbWFya0FjdGl2ZUVsZW1lbnQoYmVmb3JlKTtcblx0XHR0aGlzLl9jdXJyZW50ID0gYmVmb3JlO1xuXHR9XG5cblx0X3VubWFya0FjdGl2ZUVsZW1lbnQoZWxlbWVudDogSFRNTEVsZW1lbnQgfCB1bmRlZmluZWQpIHtcblx0XHRpZiAoIWVsZW1lbnQpIHtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cdFx0ZWxlbWVudC5jbGFzc05hbWUgPSBlbGVtZW50LmNsYXNzTmFtZS5yZXBsYWNlKC9cXGJjb2RlLWFjdGl2ZS1saW5lXFxiL2csICcnKTtcblx0fVxuXG5cdF9tYXJrQWN0aXZlRWxlbWVudChlbGVtZW50OiBIVE1MRWxlbWVudCB8IHVuZGVmaW5lZCkge1xuXHRcdGlmICghZWxlbWVudCkge1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblx0XHRlbGVtZW50LmNsYXNzTmFtZSArPSAnIGNvZGUtYWN0aXZlLWxpbmUnO1xuXHR9XG59IiwiLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAqICBDb3B5cmlnaHQgKGMpIE1pY3Jvc29mdCBDb3Jwb3JhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqICBMaWNlbnNlZCB1bmRlciB0aGUgTUlUIExpY2Vuc2UuIFNlZSBMaWNlbnNlLnR4dCBpbiB0aGUgcHJvamVjdCByb290IGZvciBsaWNlbnNlIGluZm9ybWF0aW9uLlxuICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovXG5cbmV4cG9ydCBmdW5jdGlvbiBvbmNlRG9jdW1lbnRMb2FkZWQoZjogKCkgPT4gdm9pZCkge1xuXHRpZiAoZG9jdW1lbnQucmVhZHlTdGF0ZSA9PT0gJ2xvYWRpbmcnIHx8IGRvY3VtZW50LnJlYWR5U3RhdGUgPT09ICd1bmluaXRpYWxpemVkJykge1xuXHRcdGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ0RPTUNvbnRlbnRMb2FkZWQnLCBmKTtcblx0fSBlbHNlIHtcblx0XHRmKCk7XG5cdH1cbn0iLCIvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICogIENvcHlyaWdodCAoYykgTWljcm9zb2Z0IENvcnBvcmF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICogIExpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgTGljZW5zZS4gU2VlIExpY2Vuc2UudHh0IGluIHRoZSBwcm9qZWN0IHJvb3QgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24uXG4gKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi9cblxuaW1wb3J0IHsgZ2V0U2V0dGluZ3MgfSBmcm9tICcuL3NldHRpbmdzJztcbmltcG9ydCB7IHBvc3RDb21tYW5kLCBwb3N0TWVzc2FnZSB9IGZyb20gJy4vbWVzc2FnaW5nJztcbmltcG9ydCB7IG9uY2VEb2N1bWVudExvYWRlZCB9IGZyb20gJy4vZXZlbnRzJztcbmltcG9ydCB7IGdldEVkaXRvckxpbmVOdW1iZXJGb3JQYWdlT2Zmc2V0LCBzY3JvbGxUb1JldmVhbFNvdXJjZUxpbmUgfSBmcm9tICcuL3Njcm9sbC1zeW5jJztcbmltcG9ydCB7IEFjdGl2ZUxpbmVNYXJrZXIgfSBmcm9tICcuL2FjdGl2ZUxpbmVNYXJrZXInO1xuaW1wb3J0IHRocm90dGxlID0gcmVxdWlyZSgnbG9kYXNoLnRocm90dGxlJyk7XG5cbnZhciBzY3JvbGxEaXNhYmxlZCA9IHRydWU7XG5jb25zdCBtYXJrZXIgPSBuZXcgQWN0aXZlTGluZU1hcmtlcigpO1xuY29uc3Qgc2V0dGluZ3MgPSBnZXRTZXR0aW5ncygpO1xuXG5vbmNlRG9jdW1lbnRMb2FkZWQoKCkgPT4ge1xuXHRpZiAoc2V0dGluZ3Muc2Nyb2xsUHJldmlld1dpdGhFZGl0b3IpIHtcblx0XHRzZXRUaW1lb3V0KCgpID0+IHtcblx0XHRcdGNvbnN0IGluaXRpYWxMaW5lID0gK3NldHRpbmdzLmxpbmU7XG5cdFx0XHRpZiAoIWlzTmFOKGluaXRpYWxMaW5lKSkge1xuXHRcdFx0XHRzY3JvbGxEaXNhYmxlZCA9IHRydWU7XG5cdFx0XHRcdHNjcm9sbFRvUmV2ZWFsU291cmNlTGluZShpbml0aWFsTGluZSk7XG5cdFx0XHR9XG5cdFx0fSwgMCk7XG5cdH1cbn0pO1xuXG5jb25zdCBvblVwZGF0ZVZpZXcgPSAoKCkgPT4ge1xuXHRjb25zdCBkb1Njcm9sbCA9IHRocm90dGxlKChsaW5lOiBudW1iZXIpID0+IHtcblx0XHRzY3JvbGxEaXNhYmxlZCA9IHRydWU7XG5cdFx0c2Nyb2xsVG9SZXZlYWxTb3VyY2VMaW5lKGxpbmUpO1xuXHR9LCA1MCk7XG5cblx0cmV0dXJuIChsaW5lOiBudW1iZXIsIHNldHRpbmdzOiBhbnkpID0+IHtcblx0XHRpZiAoIWlzTmFOKGxpbmUpKSB7XG5cdFx0XHRzZXR0aW5ncy5saW5lID0gbGluZTtcblx0XHRcdGRvU2Nyb2xsKGxpbmUpO1xuXHRcdH1cblx0fTtcbn0pKCk7XG5cbndpbmRvdy5hZGRFdmVudExpc3RlbmVyKCdyZXNpemUnLCAoKSA9PiB7XG5cdHNjcm9sbERpc2FibGVkID0gdHJ1ZTtcbn0sIHRydWUpO1xuXG53aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcignbWVzc2FnZScsIGV2ZW50ID0+IHtcblx0aWYgKGV2ZW50LmRhdGEuc291cmNlICE9PSBzZXR0aW5ncy5zb3VyY2UpIHtcblx0XHRyZXR1cm47XG5cdH1cblxuXHRzd2l0Y2ggKGV2ZW50LmRhdGEudHlwZSkge1xuXHRcdGNhc2UgJ29uRGlkQ2hhbmdlVGV4dEVkaXRvclNlbGVjdGlvbic6XG5cdFx0XHRtYXJrZXIub25EaWRDaGFuZ2VUZXh0RWRpdG9yU2VsZWN0aW9uKGV2ZW50LmRhdGEubGluZSk7XG5cdFx0XHRicmVhaztcblxuXHRcdGNhc2UgJ3VwZGF0ZVZpZXcnOlxuXHRcdFx0b25VcGRhdGVWaWV3KGV2ZW50LmRhdGEubGluZSwgc2V0dGluZ3MpO1xuXHRcdFx0YnJlYWs7XG5cdH1cbn0sIGZhbHNlKTtcblxuZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignZGJsY2xpY2snLCBldmVudCA9PiB7XG5cdGlmICghc2V0dGluZ3MuZG91YmxlQ2xpY2tUb1N3aXRjaFRvRWRpdG9yKSB7XG5cdFx0cmV0dXJuO1xuXHR9XG5cblx0Ly8gSWdub3JlIGNsaWNrcyBvbiBsaW5rc1xuXHRmb3IgKGxldCBub2RlID0gZXZlbnQudGFyZ2V0IGFzIEhUTUxFbGVtZW50OyBub2RlOyBub2RlID0gbm9kZS5wYXJlbnROb2RlIGFzIEhUTUxFbGVtZW50KSB7XG5cdFx0aWYgKG5vZGUudGFnTmFtZSA9PT0gJ0EnKSB7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXHR9XG5cblx0Y29uc3Qgb2Zmc2V0ID0gZXZlbnQucGFnZVk7XG5cdGNvbnN0IGxpbmUgPSBnZXRFZGl0b3JMaW5lTnVtYmVyRm9yUGFnZU9mZnNldChvZmZzZXQpO1xuXHRpZiAodHlwZW9mIGxpbmUgPT09ICdudW1iZXInICYmICFpc05hTihsaW5lKSkge1xuXHRcdHBvc3RNZXNzYWdlKCdkaWRDbGljaycsIHsgbGluZTogTWF0aC5mbG9vcihsaW5lKSB9KTtcblx0fVxufSk7XG5cbmRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgZXZlbnQgPT4ge1xuXHRpZiAoIWV2ZW50KSB7XG5cdFx0cmV0dXJuO1xuXHR9XG5cblx0bGV0IG5vZGU6IGFueSA9IGV2ZW50LnRhcmdldDtcblx0d2hpbGUgKG5vZGUpIHtcblx0XHRpZiAobm9kZS50YWdOYW1lICYmIG5vZGUudGFnTmFtZSA9PT0gJ0EnICYmIG5vZGUuaHJlZikge1xuXHRcdFx0aWYgKG5vZGUuZ2V0QXR0cmlidXRlKCdocmVmJykuc3RhcnRzV2l0aCgnIycpKSB7XG5cdFx0XHRcdGJyZWFrO1xuXHRcdFx0fVxuXHRcdFx0aWYgKG5vZGUuaHJlZi5zdGFydHNXaXRoKCdmaWxlOi8vJykgfHwgbm9kZS5ocmVmLnN0YXJ0c1dpdGgoJ3ZzY29kZS1yZXNvdXJjZTonKSkge1xuXHRcdFx0XHRjb25zdCBbcGF0aCwgZnJhZ21lbnRdID0gbm9kZS5ocmVmLnJlcGxhY2UoL14oZmlsZTpcXC9cXC98dnNjb2RlLXJlc291cmNlOikvaSwgJycpLnNwbGl0KCcjJyk7XG5cdFx0XHRcdHBvc3RDb21tYW5kKCdfbWFya2Rvd24ub3BlbkRvY3VtZW50TGluaycsIFt7IHBhdGgsIGZyYWdtZW50IH1dKTtcblx0XHRcdFx0ZXZlbnQucHJldmVudERlZmF1bHQoKTtcblx0XHRcdFx0ZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG5cdFx0XHRcdGJyZWFrO1xuXHRcdFx0fVxuXHRcdFx0YnJlYWs7XG5cdFx0fVxuXHRcdG5vZGUgPSBub2RlLnBhcmVudE5vZGU7XG5cdH1cbn0sIHRydWUpO1xuXG5pZiAoc2V0dGluZ3Muc2Nyb2xsRWRpdG9yV2l0aFByZXZpZXcpIHtcblx0d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ3Njcm9sbCcsIHRocm90dGxlKCgpID0+IHtcblx0XHRpZiAoc2Nyb2xsRGlzYWJsZWQpIHtcblx0XHRcdHNjcm9sbERpc2FibGVkID0gZmFsc2U7XG5cdFx0fSBlbHNlIHtcblx0XHRcdGNvbnN0IGxpbmUgPSBnZXRFZGl0b3JMaW5lTnVtYmVyRm9yUGFnZU9mZnNldCh3aW5kb3cuc2Nyb2xsWSk7XG5cdFx0XHRpZiAodHlwZW9mIGxpbmUgPT09ICdudW1iZXInICYmICFpc05hTihsaW5lKSkge1xuXHRcdFx0XHRwb3N0TWVzc2FnZSgncmV2ZWFsTGluZScsIHsgbGluZSB9KTtcblx0XHRcdH1cblx0XHR9XG5cdH0sIDUwKSk7XG59IiwiLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAqICBDb3B5cmlnaHQgKGMpIE1pY3Jvc29mdCBDb3Jwb3JhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqICBMaWNlbnNlZCB1bmRlciB0aGUgTUlUIExpY2Vuc2UuIFNlZSBMaWNlbnNlLnR4dCBpbiB0aGUgcHJvamVjdCByb290IGZvciBsaWNlbnNlIGluZm9ybWF0aW9uLlxuICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovXG5cbmltcG9ydCB7IGdldFNldHRpbmdzIH0gZnJvbSAnLi9zZXR0aW5ncyc7XG5cbmRlY2xhcmUgdmFyIHZzY29kZTogYW55O1xuXG4vKipcbiAqIFBvc3QgYSBtZXNzYWdlIHRvIHRoZSBtYXJrZG93biBleHRlbnNpb25cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHBvc3RNZXNzYWdlKHR5cGU6IHN0cmluZywgYm9keTogb2JqZWN0KSB7XG5cdHZzY29kZS5wb3N0TWVzc2FnZSh7XG5cdFx0dHlwZSxcblx0XHRzb3VyY2U6IGdldFNldHRpbmdzKCkuc291cmNlLFxuXHRcdGJvZHlcblx0fSk7XG59XG5cbi8qKlxuICogUG9zdCBhIGNvbW1hbmQgdG8gYmUgZXhlY3V0ZWQgdG8gdGhlIG1hcmtkb3duIGV4dGVuc2lvblxuICovXG5leHBvcnQgZnVuY3Rpb24gcG9zdENvbW1hbmQoY29tbWFuZDogc3RyaW5nLCBhcmdzOiBhbnlbXSkge1xuXHRwb3N0TWVzc2FnZSgnY29tbWFuZCcsIHsgY29tbWFuZCwgYXJncyB9KTtcbn1cbiIsIi8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gKiAgQ29weXJpZ2h0IChjKSBNaWNyb3NvZnQgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKiAgTGljZW5zZWQgdW5kZXIgdGhlIE1JVCBMaWNlbnNlLiBTZWUgTGljZW5zZS50eHQgaW4gdGhlIHByb2plY3Qgcm9vdCBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbi5cbiAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qL1xuXG5pbXBvcnQgeyBnZXRTZXR0aW5ncyB9IGZyb20gJy4vc2V0dGluZ3MnO1xuXG5cbmZ1bmN0aW9uIGNsYW1wKG1pbjogbnVtYmVyLCBtYXg6IG51bWJlciwgdmFsdWU6IG51bWJlcikge1xuXHRyZXR1cm4gTWF0aC5taW4obWF4LCBNYXRoLm1heChtaW4sIHZhbHVlKSk7XG59XG5cbmZ1bmN0aW9uIGNsYW1wTGluZShsaW5lOiBudW1iZXIpIHtcblx0cmV0dXJuIGNsYW1wKDAsIGdldFNldHRpbmdzKCkubGluZUNvdW50IC0gMSwgbGluZSk7XG59XG5cblxuZXhwb3J0IGludGVyZmFjZSBDb2RlTGluZUVsZW1lbnQge1xuXHRlbGVtZW50OiBIVE1MRWxlbWVudDtcblx0bGluZTogbnVtYmVyO1xufVxuXG5jb25zdCBnZXRDb2RlTGluZUVsZW1lbnRzID0gKCgpID0+IHtcblx0bGV0IGVsZW1lbnRzOiBDb2RlTGluZUVsZW1lbnRbXTtcblx0cmV0dXJuICgpID0+IHtcblx0XHRpZiAoIWVsZW1lbnRzKSB7XG5cdFx0XHRlbGVtZW50cyA9IEFycmF5LnByb3RvdHlwZS5tYXAuY2FsbChcblx0XHRcdFx0ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgnY29kZS1saW5lJyksXG5cdFx0XHRcdChlbGVtZW50OiBhbnkpID0+IHtcblx0XHRcdFx0XHRjb25zdCBsaW5lID0gK2VsZW1lbnQuZ2V0QXR0cmlidXRlKCdkYXRhLWxpbmUnKTtcblx0XHRcdFx0XHRyZXR1cm4geyBlbGVtZW50LCBsaW5lIH07XG5cdFx0XHRcdH0pXG5cdFx0XHRcdC5maWx0ZXIoKHg6IGFueSkgPT4gIWlzTmFOKHgubGluZSkpO1xuXHRcdH1cblx0XHRyZXR1cm4gZWxlbWVudHM7XG5cdH07XG59KSgpO1xuXG4vKipcbiAqIEZpbmQgdGhlIGh0bWwgZWxlbWVudHMgdGhhdCBtYXAgdG8gYSBzcGVjaWZpYyB0YXJnZXQgbGluZSBpbiB0aGUgZWRpdG9yLlxuICpcbiAqIElmIGFuIGV4YWN0IG1hdGNoLCByZXR1cm5zIGEgc2luZ2xlIGVsZW1lbnQuIElmIHRoZSBsaW5lIGlzIGJldHdlZW4gZWxlbWVudHMsXG4gKiByZXR1cm5zIHRoZSBlbGVtZW50IHByaW9yIHRvIGFuZCB0aGUgZWxlbWVudCBhZnRlciB0aGUgZ2l2ZW4gbGluZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldEVsZW1lbnRzRm9yU291cmNlTGluZSh0YXJnZXRMaW5lOiBudW1iZXIpOiB7IHByZXZpb3VzOiBDb2RlTGluZUVsZW1lbnQ7IG5leHQ/OiBDb2RlTGluZUVsZW1lbnQ7IH0ge1xuXHRjb25zdCBsaW5lTnVtYmVyID0gTWF0aC5mbG9vcih0YXJnZXRMaW5lKTtcblx0Y29uc3QgbGluZXMgPSBnZXRDb2RlTGluZUVsZW1lbnRzKCk7XG5cdGxldCBwcmV2aW91cyA9IGxpbmVzWzBdIHx8IG51bGw7XG5cdGZvciAoY29uc3QgZW50cnkgb2YgbGluZXMpIHtcblx0XHRpZiAoZW50cnkubGluZSA9PT0gbGluZU51bWJlcikge1xuXHRcdFx0cmV0dXJuIHsgcHJldmlvdXM6IGVudHJ5LCBuZXh0OiB1bmRlZmluZWQgfTtcblx0XHR9XG5cdFx0ZWxzZSBpZiAoZW50cnkubGluZSA+IGxpbmVOdW1iZXIpIHtcblx0XHRcdHJldHVybiB7IHByZXZpb3VzLCBuZXh0OiBlbnRyeSB9O1xuXHRcdH1cblx0XHRwcmV2aW91cyA9IGVudHJ5O1xuXHR9XG5cdHJldHVybiB7IHByZXZpb3VzIH07XG59XG5cbi8qKlxuICogRmluZCB0aGUgaHRtbCBlbGVtZW50cyB0aGF0IGFyZSBhdCBhIHNwZWNpZmljIHBpeGVsIG9mZnNldCBvbiB0aGUgcGFnZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldExpbmVFbGVtZW50c0F0UGFnZU9mZnNldChvZmZzZXQ6IG51bWJlcik6IHsgcHJldmlvdXM6IENvZGVMaW5lRWxlbWVudDsgbmV4dD86IENvZGVMaW5lRWxlbWVudDsgfSB7XG5cdGNvbnN0IGxpbmVzID0gZ2V0Q29kZUxpbmVFbGVtZW50cygpO1xuXHRjb25zdCBwb3NpdGlvbiA9IG9mZnNldCAtIHdpbmRvdy5zY3JvbGxZO1xuXHRsZXQgbG8gPSAtMTtcblx0bGV0IGhpID0gbGluZXMubGVuZ3RoIC0gMTtcblx0d2hpbGUgKGxvICsgMSA8IGhpKSB7XG5cdFx0Y29uc3QgbWlkID0gTWF0aC5mbG9vcigobG8gKyBoaSkgLyAyKTtcblx0XHRjb25zdCBib3VuZHMgPSBsaW5lc1ttaWRdLmVsZW1lbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG5cdFx0aWYgKGJvdW5kcy50b3AgKyBib3VuZHMuaGVpZ2h0ID49IHBvc2l0aW9uKSB7XG5cdFx0XHRoaSA9IG1pZDtcblx0XHR9XG5cdFx0ZWxzZSB7XG5cdFx0XHRsbyA9IG1pZDtcblx0XHR9XG5cdH1cblx0Y29uc3QgaGlFbGVtZW50ID0gbGluZXNbaGldO1xuXHRjb25zdCBoaUJvdW5kcyA9IGhpRWxlbWVudC5lbGVtZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuXHRpZiAoaGkgPj0gMSAmJiBoaUJvdW5kcy50b3AgPiBwb3NpdGlvbikge1xuXHRcdGNvbnN0IGxvRWxlbWVudCA9IGxpbmVzW2xvXTtcblx0XHRyZXR1cm4geyBwcmV2aW91czogbG9FbGVtZW50LCBuZXh0OiBoaUVsZW1lbnQgfTtcblx0fVxuXHRyZXR1cm4geyBwcmV2aW91czogaGlFbGVtZW50IH07XG59XG5cbi8qKlxuICogQXR0ZW1wdCB0byByZXZlYWwgdGhlIGVsZW1lbnQgZm9yIGEgc291cmNlIGxpbmUgaW4gdGhlIGVkaXRvci5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNjcm9sbFRvUmV2ZWFsU291cmNlTGluZShsaW5lOiBudW1iZXIpIHtcblx0Y29uc3QgeyBwcmV2aW91cywgbmV4dCB9ID0gZ2V0RWxlbWVudHNGb3JTb3VyY2VMaW5lKGxpbmUpO1xuXHRpZiAocHJldmlvdXMgJiYgZ2V0U2V0dGluZ3MoKS5zY3JvbGxQcmV2aWV3V2l0aEVkaXRvcikge1xuXHRcdGxldCBzY3JvbGxUbyA9IDA7XG5cdFx0Y29uc3QgcmVjdCA9IHByZXZpb3VzLmVsZW1lbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG5cdFx0Y29uc3QgcHJldmlvdXNUb3AgPSByZWN0LnRvcDtcblx0XHRpZiAobmV4dCAmJiBuZXh0LmxpbmUgIT09IHByZXZpb3VzLmxpbmUpIHtcblx0XHRcdC8vIEJldHdlZW4gdHdvIGVsZW1lbnRzLiBHbyB0byBwZXJjZW50YWdlIG9mZnNldCBiZXR3ZWVuIHRoZW0uXG5cdFx0XHRjb25zdCBiZXR3ZWVuUHJvZ3Jlc3MgPSAobGluZSAtIHByZXZpb3VzLmxpbmUpIC8gKG5leHQubGluZSAtIHByZXZpb3VzLmxpbmUpO1xuXHRcdFx0Y29uc3QgZWxlbWVudE9mZnNldCA9IG5leHQuZWxlbWVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS50b3AgLSBwcmV2aW91c1RvcDtcblx0XHRcdHNjcm9sbFRvID0gcHJldmlvdXNUb3AgKyBiZXR3ZWVuUHJvZ3Jlc3MgKiBlbGVtZW50T2Zmc2V0O1xuXHRcdH1cblx0XHRlbHNlIHtcblx0XHRcdHNjcm9sbFRvID0gcHJldmlvdXNUb3A7XG5cdFx0fVxuXHRcdHdpbmRvdy5zY3JvbGwoMCwgTWF0aC5tYXgoMSwgd2luZG93LnNjcm9sbFkgKyBzY3JvbGxUbykpO1xuXHR9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRFZGl0b3JMaW5lTnVtYmVyRm9yUGFnZU9mZnNldChvZmZzZXQ6IG51bWJlcikge1xuXHRjb25zdCB7IHByZXZpb3VzLCBuZXh0IH0gPSBnZXRMaW5lRWxlbWVudHNBdFBhZ2VPZmZzZXQob2Zmc2V0KTtcblx0aWYgKHByZXZpb3VzKSB7XG5cdFx0Y29uc3QgcHJldmlvdXNCb3VuZHMgPSBwcmV2aW91cy5lbGVtZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuXHRcdGNvbnN0IG9mZnNldEZyb21QcmV2aW91cyA9IChvZmZzZXQgLSB3aW5kb3cuc2Nyb2xsWSAtIHByZXZpb3VzQm91bmRzLnRvcCk7XG5cdFx0aWYgKG5leHQpIHtcblx0XHRcdGNvbnN0IHByb2dyZXNzQmV0d2VlbkVsZW1lbnRzID0gb2Zmc2V0RnJvbVByZXZpb3VzIC8gKG5leHQuZWxlbWVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS50b3AgLSBwcmV2aW91c0JvdW5kcy50b3ApO1xuXHRcdFx0Y29uc3QgbGluZSA9IHByZXZpb3VzLmxpbmUgKyBwcm9ncmVzc0JldHdlZW5FbGVtZW50cyAqIChuZXh0LmxpbmUgLSBwcmV2aW91cy5saW5lKTtcblx0XHRcdHJldHVybiBjbGFtcExpbmUobGluZSk7XG5cdFx0fVxuXHRcdGVsc2Uge1xuXHRcdFx0Y29uc3QgcHJvZ3Jlc3NXaXRoaW5FbGVtZW50ID0gb2Zmc2V0RnJvbVByZXZpb3VzIC8gKHByZXZpb3VzQm91bmRzLmhlaWdodCk7XG5cdFx0XHRjb25zdCBsaW5lID0gcHJldmlvdXMubGluZSArIHByb2dyZXNzV2l0aGluRWxlbWVudDtcblx0XHRcdHJldHVybiBjbGFtcExpbmUobGluZSk7XG5cdFx0fVxuXHR9XG5cdHJldHVybiBudWxsO1xufVxuIiwiLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAqICBDb3B5cmlnaHQgKGMpIE1pY3Jvc29mdCBDb3Jwb3JhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqICBMaWNlbnNlZCB1bmRlciB0aGUgTUlUIExpY2Vuc2UuIFNlZSBMaWNlbnNlLnR4dCBpbiB0aGUgcHJvamVjdCByb290IGZvciBsaWNlbnNlIGluZm9ybWF0aW9uLlxuICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovXG5cbmV4cG9ydCBpbnRlcmZhY2UgUHJldmlld1NldHRpbmdzIHtcblx0c291cmNlOiBzdHJpbmc7XG5cdGxpbmU6IG51bWJlcjtcblx0bGluZUNvdW50OiBudW1iZXI7XG5cdHNjcm9sbFByZXZpZXdXaXRoRWRpdG9yPzogYm9vbGVhbjtcblx0c2Nyb2xsRWRpdG9yV2l0aFByZXZpZXc6IGJvb2xlYW47XG5cdGRpc2FibGVTZWN1cml0eVdhcm5pbmdzOiBib29sZWFuO1xuXHRkb3VibGVDbGlja1RvU3dpdGNoVG9FZGl0b3I6IGJvb2xlYW47XG59XG5cbmxldCBjYWNoZWRTZXR0aW5nczogUHJldmlld1NldHRpbmdzIHwgdW5kZWZpbmVkID0gdW5kZWZpbmVkO1xuXG5leHBvcnQgZnVuY3Rpb24gZ2V0U2V0dGluZ3MoKTogUHJldmlld1NldHRpbmdzIHtcblx0aWYgKGNhY2hlZFNldHRpbmdzKSB7XG5cdFx0cmV0dXJuIGNhY2hlZFNldHRpbmdzO1xuXHR9XG5cblx0Y29uc3QgZWxlbWVudCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd2c2NvZGUtbWFya2Rvd24tcHJldmlldy1kYXRhJyk7XG5cdGlmIChlbGVtZW50KSB7XG5cdFx0Y29uc3QgZGF0YSA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlKCdkYXRhLXNldHRpbmdzJyk7XG5cdFx0aWYgKGRhdGEpIHtcblx0XHRcdGNhY2hlZFNldHRpbmdzID0gSlNPTi5wYXJzZShkYXRhKTtcblx0XHRcdHJldHVybiBjYWNoZWRTZXR0aW5ncyE7XG5cdFx0fVxuXHR9XG5cblx0dGhyb3cgbmV3IEVycm9yKCdDb3VsZCBub3QgbG9hZCBzZXR0aW5ncycpO1xufVxuIl0sInNvdXJjZVJvb3QiOiIifQ== \ No newline at end of file diff --git a/extensions/markdown-language-features/media/pre.js b/extensions/markdown-language-features/media/pre.js index c5901bf4204..340d2b1f95c 100644 --- a/extensions/markdown-language-features/media/pre.js +++ b/extensions/markdown-language-features/media/pre.js @@ -188,11 +188,11 @@ const settings_1 = __webpack_require__(/*! ./settings */ "./preview-src/settings * Post a message to the markdown extension */ function postMessage(type, body) { - window.parent.postMessage({ + vscode.postMessage({ type, source: settings_1.getSettings().source, body - }, '*'); + }); } exports.postMessage = postMessage; /** @@ -294,4 +294,4 @@ exports.getStrings = getStrings; /***/ }) /******/ }); -//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vd2VicGFjay9ib290c3RyYXAiLCJ3ZWJwYWNrOi8vLy4vcHJldmlldy1zcmMvY3NwLnRzIiwid2VicGFjazovLy8uL3ByZXZpZXctc3JjL2xvYWRpbmcudHMiLCJ3ZWJwYWNrOi8vLy4vcHJldmlldy1zcmMvbWVzc2FnaW5nLnRzIiwid2VicGFjazovLy8uL3ByZXZpZXctc3JjL3ByZS50cyIsIndlYnBhY2s6Ly8vLi9wcmV2aWV3LXNyYy9zZXR0aW5ncy50cyIsIndlYnBhY2s6Ly8vLi9wcmV2aWV3LXNyYy9zdHJpbmdzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBSztBQUNMO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLHlEQUFpRCxjQUFjO0FBQy9EOztBQUVBO0FBQ0E7QUFDQTtBQUNBLG1DQUEyQiwwQkFBMEIsRUFBRTtBQUN2RCx5Q0FBaUMsZUFBZTtBQUNoRDtBQUNBO0FBQ0E7O0FBRUE7QUFDQSw4REFBc0QsK0RBQStEOztBQUVySDtBQUNBOzs7QUFHQTtBQUNBOzs7Ozs7Ozs7Ozs7OztBQ25FQTs7O2dHQUdnRzs7QUFFaEcsc0ZBQXlDO0FBQ3pDLG1GQUF1QztBQUN2Qyx5RkFBMEM7QUFFMUM7O0dBRUc7QUFDSDtJQUdDO1FBRlEsWUFBTyxHQUFHLEtBQUssQ0FBQztRQUd2QixRQUFRLENBQUMsZ0JBQWdCLENBQUMseUJBQXlCLEVBQUUsR0FBRyxFQUFFO1lBQ3pELElBQUksQ0FBQyxjQUFjLEVBQUUsQ0FBQztRQUN2QixDQUFDLENBQUMsQ0FBQztRQUVILE1BQU0sQ0FBQyxnQkFBZ0IsQ0FBQyxTQUFTLEVB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ZUM7Ozs7Ozs7Ozs7Ozs7O0FDaENEOzs7Z0dBR2dHOztBQUVoRztJQUNDLE1BQU0sS0FBSyxHQUFHLFFBQVEsQ0FBQyxjQUFjLENBQUMsOEJBQThCLENBQUMsQ0FBQztJQUN0RSxFQUFFLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDO1FBQ1gsTUFBTSxJQUFJLEdBQUcsS0FBSyxDQUFDLFlBQVksQ0FBQyxjQUFjLENBQUMsQ0FBQztRQUNoRCxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDO1lBQ1YsTUFBTSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDekIsQ0FBQztJQUNGLENBQUM7SUFDRCxNQUFNLElBQUksS0FBSyxDQUFDLHdCQUF3QixDQUFDLENBQUM7QUFDM0MsQ0FBQztBQVRELGdDQVNDIiwiZmlsZSI6InByZS5qcyIsInNvdXJjZXNDb250ZW50IjpbIiBcdC8vIFRoZSBtb2R1bGUgY2FjaGVcbiBcdHZhciBpbnN0YWxsZWRNb2R1bGVzID0ge307XG5cbiBcdC8vIFRoZSByZXF1aXJlIGZ1bmN0aW9uXG4gXHRmdW5jdGlvbiBfX3dlYnBhY2tfcmVxdWlyZV9fKG1vZHVsZUlkKSB7XG5cbiBcdFx0Ly8gQ2hlY2sgaWYgbW9kdWxlIGlzIGluIGNhY2hlXG4gXHRcdGlmKGluc3RhbGxlZE1vZHVsZXNbbW9kdWxlSWRdKSB7XG4gXHRcdFx0cmV0dXJuIGluc3RhbGxlZE1vZHVsZXNbbW9kdWxlSWRdLmV4cG9ydHM7XG4gXHRcdH1cbiBcdFx0Ly8gQ3JlYXRlIGEgbmV3IG1vZHVsZSAoYW5kIHB1dCBpdCBpbnRvIHRoZSBjYWNoZSlcbiBcdFx0dmFyIG1vZHVsZSA9IGluc3RhbGxlZE1vZHVsZXNbbW9kdWxlSWRdID0ge1xuIFx0XHRcdGk6IG1vZHVsZUlkLFxuIFx0XHRcdGw6IGZhbHNlLFxuIFx0XHRcdGV4cG9ydHM6IHt9XG4gXHRcdH07XG5cbiBcdFx0Ly8gRXhlY3V0ZSB0aGUgbW9kdWxlIGZ1bmN0aW9uXG4gXHRcdG1vZHVsZXNbbW9kdWxlSWRdLmNhbGwobW9kdWxlLmV4cG9ydHMsIG1vZHVsZSwgbW9kdWxlLmV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pO1xuXG4gXHRcdC8vIEZsYWcgdGhlIG1vZHVsZSBhcyBsb2FkZWRcbiBcdFx0bW9kdWxlLmwgPSB0cnVlO1xuXG4gXHRcdC8vIFJldHVybiB0aGUgZXhwb3J0cyBvZiB0aGUgbW9kdWxlXG4gXHRcdHJldHVybiBtb2R1bGUuZXhwb3J0cztcbiBcdH1cblxuXG4gXHQvLyBleHBvc2UgdGhlIG1vZHVsZXMgb2JqZWN0IChfX3dlYnBhY2tfbW9kdWxlc19fKVxuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5tID0gbW9kdWxlcztcblxuIFx0Ly8gZXhwb3NlIHRoZSBtb2R1bGUgY2FjaGVcbiBcdF9fd2VicGFja19yZXF1aXJlX18uYyA9IGluc3RhbGxlZE1vZHVsZXM7XG5cbiBcdC8vIGRlZmluZSBnZXR0ZXIgZnVuY3Rpb24gZm9yIGhhcm1vbnkgZXhwb3J0c1xuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5kID0gZnVuY3Rpb24oZXhwb3J0cywgbmFtZSwgZ2V0dGVyKSB7XG4gXHRcdGlmKCFfX3dlYnBhY2tfcmVxdWlyZV9fLm8oZXhwb3J0cywgbmFtZSkpIHtcbiBcdFx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgbmFtZSwge1xuIFx0XHRcdFx0Y29uZmlndXJhYmxlOiBmYWxzZSxcbiBcdFx0XHRcdGVudW1lcmFibGU6IHRydWUsXG4gXHRcdFx0XHRnZXQ6IGdldHRlclxuIFx0XHRcdH0pO1xuIFx0XHR9XG4gXHR9O1xuXG4gXHQvLyBkZWZpbmUgX19lc01vZHVsZSBvbiBleHBvcnRzXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLnIgPSBmdW5jdGlvbihleHBvcnRzKSB7XG4gXHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCAnX19lc01vZHVsZScsIHsgdmFsdWU6IHRydWUgfSk7XG4gXHR9O1xuXG4gXHQvLyBnZXREZWZhdWx0RXhwb3J0IGZ1bmN0aW9uIGZvciBjb21wYXRpYmlsaXR5IHdpdGggbm9uLWhhcm1vbnkgbW9kdWxlc1xuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5uID0gZnVuY3Rpb24obW9kdWxlKSB7XG4gXHRcdHZhciBnZXR0ZXIgPSBtb2R1bGUgJiYgbW9kdWxlLl9fZXNNb2R1bGUgP1xuIFx0XHRcdGZ1bmN0aW9uIGdldERlZmF1bHQoKSB7IHJldHVybiBtb2R1bGVbJ2RlZmF1bHQnXTsgfSA6XG4gXHRcdFx0ZnVuY3Rpb24gZ2V0TW9kdWxlRXhwb3J0cygpIHsgcmV0dXJuIG1vZHVsZTsgfTtcbiBcdFx0X193ZWJwYWNrX3JlcXVpcmVfXy5kKGdldHRlciwgJ2EnLCBnZXR0ZXIpO1xuIFx0XHRyZXR1cm4gZ2V0dGVyO1xuIFx0fTtcblxuIFx0Ly8gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLm8gPSBmdW5jdGlvbihvYmplY3QsIHByb3BlcnR5KSB7IHJldHVybiBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwob2JqZWN0LCBwcm9wZXJ0eSk7IH07XG5cbiBcdC8vIF9fd2VicGFja19wdWJsaWNfcGF0aF9fXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLnAgPSBcIlwiO1xuXG5cbiBcdC8vIExvYWQgZW50cnkgbW9kdWxlIGFuZCByZXR1cm4gZXhwb3J0c1xuIFx0cmV0dXJuIF9fd2VicGFja19yZXF1aXJlX18oX193ZWJwYWNrX3JlcXVpcmVfXy5zID0gXCIuL3ByZXZpZXctc3JjL3ByZS50c1wiKTtcbiIsIi8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gKiAgQ29weXJpZ2h0IChjKSBNaWNyb3NvZnQgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKiAgTGljZW5zZWQgdW5kZXIgdGhlIE1JVCBMaWNlbnNlLiBTZWUgTGljZW5zZS50eHQgaW4gdGhlIHByb2plY3Qgcm9vdCBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbi5cbiAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qL1xuXG5pbXBvcnQgeyBnZXRTZXR0aW5ncyB9IGZyb20gJy4vc2V0dGluZ3MnO1xuaW1wb3J0IHsgZ2V0U3RyaW5ncyB9IGZyb20gJy4vc3RyaW5ncyc7XG5pbXBvcnQgeyBwb3N0Q29tbWFuZCB9IGZyb20gJy4vbWVzc2FnaW5nJztcblxuLyoqXG4gKiBTaG93cyBhbiBhbGVydCB3aGVuIHRoZXJlIGlzIGEgY29udGVudCBzZWN1cml0eSBwb2xpY3kgdmlvbGF0aW9uLlxuICovXG5leHBvcnQgY2xhc3MgQ3NwQWxlcnRlciB7XG5cdHByaXZhdGUgZGlkU2hvdyA9IGZhbHNlO1xuXG5cdGNvbnN0cnVjdG9yKCkge1xuXHRcdGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ3NlY3VyaXR5cG9saWN5dmlvbGF0aW9uJywgKCkgPT4ge1xuXHRcdFx0dGhpcy5zaG93Q3NwV2FybmluZygpO1xuXHRcdH0pO1xuXG5cdFx0d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ21lc3NhZ2UnLCAoZXZlbnQpID0+IHtcblx0XHRcdGlmIChldmVudCAmJiBldmVudC5kYXRhICYmIGV2ZW50LmRhdGEubmFtZSA9PT0gJ3ZzY29kZS1kaWQtYmxvY2stc3ZnJykge1xuXHRcdFx0XHR0aGlzLnNob3dDc3BXYXJuaW5nKCk7XG5cdFx0XHR9XG5cdFx0fSk7XG5cdH1cblxuXHRwcml2YXRlIHNob3dDc3BXYXJuaW5nKCkge1xuXHRcdGNvbnN0IHN0cmluZ3MgPSBnZXRTdHJpbmdzKCk7XG5cdFx0Y29uc3Qgc2V0dGluZ3MgPSBnZXRTZXR0aW5ncygpO1xuXG5cdFx0aWYgKHRoaXMuZGlkU2hvdyB8fCBzZXR0aW5ncy5kaXNhYmxlU2VjdXJpdHlXYXJuaW5ncykge1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblx0XHR0aGlzLmRpZFNob3cgPSB0cnVlO1xuXG5cdFx0Y29uc3Qgbm90aWZpY2F0aW9uID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnYScpO1xuXHRcdG5vdGlmaWNhdGlvbi5pbm5lclRleHQgPSBzdHJpbmdzLmNzcEFsZXJ0TWVzc2FnZVRleHQ7XG5cdFx0bm90aWZpY2F0aW9uLnNldEF0dHJpYnV0ZSgnaWQnLCAnY29kZS1jc3Atd2FybmluZycpO1xuXHRcdG5vdGlmaWNhdGlvbi5zZXRBdHRyaWJ1dGUoJ3RpdGxlJywgc3RyaW5ncy5jc3BBbGVydE1lc3NhZ2VUaXRsZSk7XG5cblx0XHRub3RpZmljYXRpb24uc2V0QXR0cmlidXRlKCdyb2xlJywgJ2J1dHRvbicpO1xuXHRcdG5vdGlmaWNhdGlvbi5zZXRBdHRyaWJ1dGUoJ2FyaWEtbGFiZWwnLCBzdHJpbmdzLmNzcEFsZXJ0TWVzc2FnZUxhYmVsKTtcblx0XHRub3RpZmljYXRpb24ub25jbGljayA9ICgpID0+IHtcblx0XHRcdHBvc3RDb21tYW5kKCdtYXJrZG93bi5zaG93UHJldmlld1NlY3VyaXR5U2VsZWN0b3InLCBbc2V0dGluZ3Muc291cmNlXSk7XG5cdFx0fTtcblx0XHRkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKG5vdGlmaWNhdGlvbik7XG5cdH1cbn1cbiIsIi8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gKiAgQ29weXJpZ2h0IChjKSBNaWNyb3NvZnQgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKiAgTGljZW5zZWQgdW5kZXIgdGhlIE1JVCBMaWNlbnNlLiBTZWUgTGljZW5zZS50eHQgaW4gdGhlIHByb2plY3Qgcm9vdCBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbi5cbiAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qL1xuaW1wb3J0IHsgcG9zdENvbW1hbmQgfSBmcm9tICcuL21lc3NhZ2luZyc7XG5cbmV4cG9ydCBjbGFzcyBTdHlsZUxvYWRpbmdNb25pdG9yIHtcblx0cHJpdmF0ZSB1bmxvYWRlZFN0eWxlczogc3RyaW5nW10gPSBbXTtcblxuXHRjb25zdHJ1Y3RvcigpIHtcblx0XHRjb25zdCBvblN0eWxlTG9hZEVycm9yID0gKGV2ZW50OiBhbnkpID0+IHtcblx0XHRcdGNvbnN0IHNvdXJjZSA9IGV2ZW50LnRhcmdldC5kYXRhc2V0LnNvdXJjZTtcblx0XHRcdHRoaXMudW5sb2FkZWRTdHlsZXMucHVzaChzb3VyY2UpO1xuXHRcdH07XG5cblx0XHR3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcignRE9NQ29udGVudExvYWRlZCcsICgpID0+IHtcblx0XHRcdGZvciAoY29uc3QgbGluayBvZiBkb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCdjb2RlLXVzZXItc3R5bGUnKSBhcyBIVE1MQ29sbGVjdGlvbk9mPEhUTUxFbGVtZW50Pikge1xuXHRcdFx0XHRpZiAobGluay5kYXRhc2V0LnNvdXJjZSkge1xuXHRcdFx0XHRcdGxpbmsub25lcnJvciA9IG9uU3R5bGVMb2FkRXJyb3I7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9KTtcblxuXHRcdHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCdsb2FkJywgKCkgPT4ge1xuXHRcdFx0aWYgKCF0aGlzLnVubG9hZGVkU3R5bGVzLmxlbmd0aCkge1xuXHRcdFx0XHRyZXR1cm47XG5cdFx0XHR9XG5cdFx0XHRwb3N0Q29tbWFuZCgnX21hcmtkb3duLm9uUHJldmlld1N0eWxlTG9hZEVycm9yJywgW3RoaXMudW5sb2FkZWRTdHlsZXNdKTtcblx0XHR9KTtcblx0fVxufSIsIi8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gKiAgQ29weXJpZ2h0IChjKSBNaWNyb3NvZnQgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKiAgTGljZW5zZWQgdW5kZXIgdGhlIE1JVCBMaWNlbnNlLiBTZWUgTGljZW5zZS50eHQgaW4gdGhlIHByb2plY3Qgcm9vdCBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbi5cbiAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qL1xuXG5pbXBvcnQgeyBnZXRTZXR0aW5ncyB9IGZyb20gJy4vc2V0dGluZ3MnO1xuXG4vKipcbiAqIFBvc3QgYSBtZXNzYWdlIHRvIHRoZSBtYXJrZG93biBleHRlbnNpb25cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHBvc3RNZXNzYWdlKHR5cGU6IHN0cmluZywgYm9keTogb2JqZWN0KSB7XG5cdHdpbmRvdy5wYXJlbnQucG9zdE1lc3NhZ2Uoe1xuXHRcdHR5cGUsXG5cdFx0c291cmNlOiBnZXRTZXR0aW5ncygpLnNvdXJjZSxcblx0XHRib2R5XG5cdH0sICcqJyk7XG59XG5cbi8qKlxuICogUG9zdCBhIGNvbW1hbmQgdG8gYmUgZXhlY3V0ZWQgdG8gdGhlIG1hcmtkb3duIGV4dGVuc2lvblxuICovXG5leHBvcnQgZnVuY3Rpb24gcG9zdENvbW1hbmQoY29tbWFuZDogc3RyaW5nLCBhcmdzOiBhbnlbXSkge1xuXHRwb3N0TWVzc2FnZSgnY29tbWFuZCcsIHsgY29tbWFuZCwgYXJncyB9KTtcbn1cbiIsIi8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gKiAgQ29weXJpZ2h0IChjKSBNaWNyb3NvZnQgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKiAgTGljZW5zZWQgdW5kZXIgdGhlIE1JVCBMaWNlbnNlLiBTZWUgTGljZW5zZS50eHQgaW4gdGhlIHByb2plY3Qgcm9vdCBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbi5cbiAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qL1xuXG5pbXBvcnQgeyBDc3BBbGVydGVyIH0gZnJvbSAnLi9jc3AnO1xuaW1wb3J0IHsgU3R5bGVMb2FkaW5nTW9uaXRvciB9IGZyb20gJy4vbG9hZGluZyc7XG5cbi8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTpuby11bnVzZWQtZXhwcmVzc2lvblxubmV3IENzcEFsZXJ0ZXIoKTtcblxuLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOm5vLXVudXNlZC1leHByZXNzaW9uXG5uZXcgU3R5bGVMb2FkaW5nTW9uaXRvcigpOyIsIi8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gKiAgQ29weXJpZ2h0IChjKSBNaWNyb3NvZnQgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKiAgTGljZW5zZWQgdW5kZXIgdGhlIE1JVCBMaWNlbnNlLiBTZWUgTGljZW5zZS50eHQgaW4gdGhlIHByb2plY3Qgcm9vdCBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbi5cbiAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qL1xuXG5leHBvcnQgaW50ZXJmYWNlIFByZXZpZXdTZXR0aW5ncyB7XG5cdHNvdXJjZTogc3RyaW5nO1xuXHRsaW5lOiBudW1iZXI7XG5cdGxpbmVDb3VudDogbnVtYmVyO1xuXHRzY3JvbGxQcmV2aWV3V2l0aEVkaXRvcj86IGJvb2xlYW47XG5cdHNjcm9sbEVkaXRvcldpdGhQcmV2aWV3OiBib29sZWFuO1xuXHRkaXNhYmxlU2VjdXJpdHlXYXJuaW5nczogYm9vbGVhbjtcblx0ZG91YmxlQ2xpY2tUb1N3aXRjaFRvRWRpdG9yOiBib29sZWFuO1xufVxuXG5sZXQgY2FjaGVkU2V0dGluZ3M6IFByZXZpZXdTZXR0aW5ncyB8IHVuZGVmaW5lZCA9IHVuZGVmaW5lZDtcblxuZXhwb3J0IGZ1bmN0aW9uIGdldFNldHRpbmdzKCk6IFByZXZpZXdTZXR0aW5ncyB7XG5cdGlmIChjYWNoZWRTZXR0aW5ncykge1xuXHRcdHJldHVybiBjYWNoZWRTZXR0aW5ncztcblx0fVxuXG5cdGNvbnN0IGVsZW1lbnQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgndnNjb2RlLW1hcmtkb3duLXByZXZpZXctZGF0YScpO1xuXHRpZiAoZWxlbWVudCkge1xuXHRcdGNvbnN0IGRhdGEgPSBlbGVtZW50LmdldEF0dHJpYnV0ZSgnZGF0YS1zZXR0aW5ncycpO1xuXHRcdGlmIChkYXRhKSB7XG5cdFx0XHRjYWNoZWRTZXR0aW5ncyA9IEpTT04ucGFyc2UoZGF0YSk7XG5cdFx0XHRyZXR1cm4gY2FjaGVkU2V0dGluZ3MhO1xuXHRcdH1cblx0fVxuXG5cdHRocm93IG5ldyBFcnJvcignQ291bGQgbm90IGxvYWQgc2V0dGluZ3MnKTtcbn1cbiIsIi8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gKiAgQ29weXJpZ2h0IChjKSBNaWNyb3NvZnQgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKiAgTGljZW5zZWQgdW5kZXIgdGhlIE1JVCBMaWNlbnNlLiBTZWUgTGljZW5zZS50eHQgaW4gdGhlIHByb2plY3Qgcm9vdCBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbi5cbiAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qL1xuXG5leHBvcnQgZnVuY3Rpb24gZ2V0U3RyaW5ncygpOiB7IFtrZXk6IHN0cmluZ106IHN0cmluZyB9IHtcblx0Y29uc3Qgc3RvcmUgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgndnNjb2RlLW1hcmtkb3duLXByZXZpZXctZGF0YScpO1xuXHRpZiAoc3RvcmUpIHtcblx0XHRjb25zdCBkYXRhID0gc3RvcmUuZ2V0QXR0cmlidXRlKCdkYXRhLXN0cmluZ3MnKTtcblx0XHRpZiAoZGF0YSkge1xuXHRcdFx0cmV0dXJuIEpTT04ucGFyc2UoZGF0YSk7XG5cdFx0fVxuXHR9XG5cdHRocm93IG5ldyBFcnJvcignQ291bGQgbm90IGxvYWQgc3RyaW5ncycpO1xufVxuIl0sInNvdXJjZVJvb3QiOiIifQ== \ No newline at end of file +//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vd2VicGFjay9ib290c3RyYXAiLCJ3ZWJwYWNrOi8vLy4vcHJldmlldy1zcmMvY3NwLnRzIiwid2VicGFjazovLy8uL3ByZXZpZXctc3JjL2xvYWRpbmcudHMiLCJ3ZWJwYWNrOi8vLy4vcHJldmlldy1zcmMvbWVzc2FnaW5nLnRzIiwid2VicGFjazovLy8uL3ByZXZpZXctc3JjL3ByZS50cyIsIndlYnBhY2s6Ly8vLi9wcmV2aWV3LXNyYy9zZXR0aW5ncy50cyIsIndlYnBhY2s6Ly8vLi9wcmV2aWV3LXNyYy9zdHJpbmdzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBSztBQUNMO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLHlEQUFpRCxjQUFjO0FBQy9EOztBQUVBO0FBQ0E7QUFDQTtBQUNBLG1DQUEyQiwwQkFBMEIsRUFBRTtBQUN2RCx5Q0FBaUMsZUFBZTtBQUNoRDtBQUNBO0FBQ0E7O0FBRUE7QUFDQSw4REFBc0QsK0RBQStEOztBQUVySDtBQUNBOzs7QUFHQTtBQUNBOzs7Ozs7Ozs7Ozs7OztBQ25FQTs7O2dHQUdnRzs7QUFFaEcsc0ZBQXlDO0FBQ3pDLG1GQUF1QztBQUN2Qyx5RkFBMEM7QUFFMUM7O0dBRUc7QUFDSDtJQUdDO1FBRlEsWUFBTyxHQUFHLEtBQUssQ0FBQztRQUd2QixRQUFRLENBQUMsZ0JBQWdCLENBQUMseUJBQXlCLEVBQUUsR0FBRyxFQUFFO1lBQ3pELElBQUksQ0FBQyxjQUFjLEVBQUUsQ0FBQztRQUN2QixDQUFDLENBQUMsQ0FBQztRQUVILE1BQU0sQ0FBQyxnQkFBZ0IsQ0FBQyxTQUFTLEVB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RDs7O2dHQUdnRzs7QUFFaEc7SUFDQyxNQUFNLEtBQUssR0FBRyxRQUFRLENBQUMsY0FBYyxDQUFDLDhCQUE4QixDQUFDLENBQUM7SUFDdEUsRUFBRSxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQztRQUNYLE1BQU0sSUFBSSxHQUFHLEtBQUssQ0FBQyxZQUFZLENBQUMsY0FBYyxDQUFDLENBQUM7UUFDaEQsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQztZQUNWLE1BQU0sQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ3pCLENBQUM7SUFDRixDQUFDO0lBQ0QsTUFBTSxJQUFJLEtBQUssQ0FBQyx3QkFBd0IsQ0FBQyxDQUFDO0FBQzNDLENBQUM7QUFURCxnQ0FTQyIsImZpbGUiOiJwcmUuanMiLCJzb3VyY2VzQ29udGVudCI6WyIgXHQvLyBUaGUgbW9kdWxlIGNhY2hlXG4gXHR2YXIgaW5zdGFsbGVkTW9kdWxlcyA9IHt9O1xuXG4gXHQvLyBUaGUgcmVxdWlyZSBmdW5jdGlvblxuIFx0ZnVuY3Rpb24gX193ZWJwYWNrX3JlcXVpcmVfXyhtb2R1bGVJZCkge1xuXG4gXHRcdC8vIENoZWNrIGlmIG1vZHVsZSBpcyBpbiBjYWNoZVxuIFx0XHRpZihpbnN0YWxsZWRNb2R1bGVzW21vZHVsZUlkXSkge1xuIFx0XHRcdHJldHVybiBpbnN0YWxsZWRNb2R1bGVzW21vZHVsZUlkXS5leHBvcnRzO1xuIFx0XHR9XG4gXHRcdC8vIENyZWF0ZSBhIG5ldyBtb2R1bGUgKGFuZCBwdXQgaXQgaW50byB0aGUgY2FjaGUpXG4gXHRcdHZhciBtb2R1bGUgPSBpbnN0YWxsZWRNb2R1bGVzW21vZHVsZUlkXSA9IHtcbiBcdFx0XHRpOiBtb2R1bGVJZCxcbiBcdFx0XHRsOiBmYWxzZSxcbiBcdFx0XHRleHBvcnRzOiB7fVxuIFx0XHR9O1xuXG4gXHRcdC8vIEV4ZWN1dGUgdGhlIG1vZHVsZSBmdW5jdGlvblxuIFx0XHRtb2R1bGVzW21vZHVsZUlkXS5jYWxsKG1vZHVsZS5leHBvcnRzLCBtb2R1bGUsIG1vZHVsZS5leHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKTtcblxuIFx0XHQvLyBGbGFnIHRoZSBtb2R1bGUgYXMgbG9hZGVkXG4gXHRcdG1vZHVsZS5sID0gdHJ1ZTtcblxuIFx0XHQvLyBSZXR1cm4gdGhlIGV4cG9ydHMgb2YgdGhlIG1vZHVsZVxuIFx0XHRyZXR1cm4gbW9kdWxlLmV4cG9ydHM7XG4gXHR9XG5cblxuIFx0Ly8gZXhwb3NlIHRoZSBtb2R1bGVzIG9iamVjdCAoX193ZWJwYWNrX21vZHVsZXNfXylcbiBcdF9fd2VicGFja19yZXF1aXJlX18ubSA9IG1vZHVsZXM7XG5cbiBcdC8vIGV4cG9zZSB0aGUgbW9kdWxlIGNhY2hlXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLmMgPSBpbnN0YWxsZWRNb2R1bGVzO1xuXG4gXHQvLyBkZWZpbmUgZ2V0dGVyIGZ1bmN0aW9uIGZvciBoYXJtb255IGV4cG9ydHNcbiBcdF9fd2VicGFja19yZXF1aXJlX18uZCA9IGZ1bmN0aW9uKGV4cG9ydHMsIG5hbWUsIGdldHRlcikge1xuIFx0XHRpZighX193ZWJwYWNrX3JlcXVpcmVfXy5vKGV4cG9ydHMsIG5hbWUpKSB7XG4gXHRcdFx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIG5hbWUsIHtcbiBcdFx0XHRcdGNvbmZpZ3VyYWJsZTogZmFsc2UsXG4gXHRcdFx0XHRlbnVtZXJhYmxlOiB0cnVlLFxuIFx0XHRcdFx0Z2V0OiBnZXR0ZXJcbiBcdFx0XHR9KTtcbiBcdFx0fVxuIFx0fTtcblxuIFx0Ly8gZGVmaW5lIF9fZXNNb2R1bGUgb24gZXhwb3J0c1xuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5yID0gZnVuY3Rpb24oZXhwb3J0cykge1xuIFx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgJ19fZXNNb2R1bGUnLCB7IHZhbHVlOiB0cnVlIH0pO1xuIFx0fTtcblxuIFx0Ly8gZ2V0RGVmYXVsdEV4cG9ydCBmdW5jdGlvbiBmb3IgY29tcGF0aWJpbGl0eSB3aXRoIG5vbi1oYXJtb255IG1vZHVsZXNcbiBcdF9fd2VicGFja19yZXF1aXJlX18ubiA9IGZ1bmN0aW9uKG1vZHVsZSkge1xuIFx0XHR2YXIgZ2V0dGVyID0gbW9kdWxlICYmIG1vZHVsZS5fX2VzTW9kdWxlID9cbiBcdFx0XHRmdW5jdGlvbiBnZXREZWZhdWx0KCkgeyByZXR1cm4gbW9kdWxlWydkZWZhdWx0J107IH0gOlxuIFx0XHRcdGZ1bmN0aW9uIGdldE1vZHVsZUV4cG9ydHMoKSB7IHJldHVybiBtb2R1bGU7IH07XG4gXHRcdF9fd2VicGFja19yZXF1aXJlX18uZChnZXR0ZXIsICdhJywgZ2V0dGVyKTtcbiBcdFx0cmV0dXJuIGdldHRlcjtcbiBcdH07XG5cbiBcdC8vIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbFxuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5vID0gZnVuY3Rpb24ob2JqZWN0LCBwcm9wZXJ0eSkgeyByZXR1cm4gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG9iamVjdCwgcHJvcGVydHkpOyB9O1xuXG4gXHQvLyBfX3dlYnBhY2tfcHVibGljX3BhdGhfX1xuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5wID0gXCJcIjtcblxuXG4gXHQvLyBMb2FkIGVudHJ5IG1vZHVsZSBhbmQgcmV0dXJuIGV4cG9ydHNcbiBcdHJldHVybiBfX3dlYnBhY2tfcmVxdWlyZV9fKF9fd2VicGFja19yZXF1aXJlX18ucyA9IFwiLi9wcmV2aWV3LXNyYy9wcmUudHNcIik7XG4iLCIvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICogIENvcHlyaWdodCAoYykgTWljcm9zb2Z0IENvcnBvcmF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICogIExpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgTGljZW5zZS4gU2VlIExpY2Vuc2UudHh0IGluIHRoZSBwcm9qZWN0IHJvb3QgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24uXG4gKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi9cblxuaW1wb3J0IHsgZ2V0U2V0dGluZ3MgfSBmcm9tICcuL3NldHRpbmdzJztcbmltcG9ydCB7IGdldFN0cmluZ3MgfSBmcm9tICcuL3N0cmluZ3MnO1xuaW1wb3J0IHsgcG9zdENvbW1hbmQgfSBmcm9tICcuL21lc3NhZ2luZyc7XG5cbi8qKlxuICogU2hvd3MgYW4gYWxlcnQgd2hlbiB0aGVyZSBpcyBhIGNvbnRlbnQgc2VjdXJpdHkgcG9saWN5IHZpb2xhdGlvbi5cbiAqL1xuZXhwb3J0IGNsYXNzIENzcEFsZXJ0ZXIge1xuXHRwcml2YXRlIGRpZFNob3cgPSBmYWxzZTtcblxuXHRjb25zdHJ1Y3RvcigpIHtcblx0XHRkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdzZWN1cml0eXBvbGljeXZpb2xhdGlvbicsICgpID0+IHtcblx0XHRcdHRoaXMuc2hvd0NzcFdhcm5pbmcoKTtcblx0XHR9KTtcblxuXHRcdHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCdtZXNzYWdlJywgKGV2ZW50KSA9PiB7XG5cdFx0XHRpZiAoZXZlbnQgJiYgZXZlbnQuZGF0YSAmJiBldmVudC5kYXRhLm5hbWUgPT09ICd2c2NvZGUtZGlkLWJsb2NrLXN2ZycpIHtcblx0XHRcdFx0dGhpcy5zaG93Q3NwV2FybmluZygpO1xuXHRcdFx0fVxuXHRcdH0pO1xuXHR9XG5cblx0cHJpdmF0ZSBzaG93Q3NwV2FybmluZygpIHtcblx0XHRjb25zdCBzdHJpbmdzID0gZ2V0U3RyaW5ncygpO1xuXHRcdGNvbnN0IHNldHRpbmdzID0gZ2V0U2V0dGluZ3MoKTtcblxuXHRcdGlmICh0aGlzLmRpZFNob3cgfHwgc2V0dGluZ3MuZGlzYWJsZVNlY3VyaXR5V2FybmluZ3MpIHtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cdFx0dGhpcy5kaWRTaG93ID0gdHJ1ZTtcblxuXHRcdGNvbnN0IG5vdGlmaWNhdGlvbiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2EnKTtcblx0XHRub3RpZmljYXRpb24uaW5uZXJUZXh0ID0gc3RyaW5ncy5jc3BBbGVydE1lc3NhZ2VUZXh0O1xuXHRcdG5vdGlmaWNhdGlvbi5zZXRBdHRyaWJ1dGUoJ2lkJywgJ2NvZGUtY3NwLXdhcm5pbmcnKTtcblx0XHRub3RpZmljYXRpb24uc2V0QXR0cmlidXRlKCd0aXRsZScsIHN0cmluZ3MuY3NwQWxlcnRNZXNzYWdlVGl0bGUpO1xuXG5cdFx0bm90aWZpY2F0aW9uLnNldEF0dHJpYnV0ZSgncm9sZScsICdidXR0b24nKTtcblx0XHRub3RpZmljYXRpb24uc2V0QXR0cmlidXRlKCdhcmlhLWxhYmVsJywgc3RyaW5ncy5jc3BBbGVydE1lc3NhZ2VMYWJlbCk7XG5cdFx0bm90aWZpY2F0aW9uLm9uY2xpY2sgPSAoKSA9PiB7XG5cdFx0XHRwb3N0Q29tbWFuZCgnbWFya2Rvd24uc2hvd1ByZXZpZXdTZWN1cml0eVNlbGVjdG9yJywgW3NldHRpbmdzLnNvdXJjZV0pO1xuXHRcdH07XG5cdFx0ZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChub3RpZmljYXRpb24pO1xuXHR9XG59XG4iLCIvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICogIENvcHlyaWdodCAoYykgTWljcm9zb2Z0IENvcnBvcmF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICogIExpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgTGljZW5zZS4gU2VlIExpY2Vuc2UudHh0IGluIHRoZSBwcm9qZWN0IHJvb3QgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24uXG4gKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi9cbmltcG9ydCB7IHBvc3RDb21tYW5kIH0gZnJvbSAnLi9tZXNzYWdpbmcnO1xuXG5leHBvcnQgY2xhc3MgU3R5bGVMb2FkaW5nTW9uaXRvciB7XG5cdHByaXZhdGUgdW5sb2FkZWRTdHlsZXM6IHN0cmluZ1tdID0gW107XG5cblx0Y29uc3RydWN0b3IoKSB7XG5cdFx0Y29uc3Qgb25TdHlsZUxvYWRFcnJvciA9IChldmVudDogYW55KSA9PiB7XG5cdFx0XHRjb25zdCBzb3VyY2UgPSBldmVudC50YXJnZXQuZGF0YXNldC5zb3VyY2U7XG5cdFx0XHR0aGlzLnVubG9hZGVkU3R5bGVzLnB1c2goc291cmNlKTtcblx0XHR9O1xuXG5cdFx0d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ0RPTUNvbnRlbnRMb2FkZWQnLCAoKSA9PiB7XG5cdFx0XHRmb3IgKGNvbnN0IGxpbmsgb2YgZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgnY29kZS11c2VyLXN0eWxlJykgYXMgSFRNTENvbGxlY3Rpb25PZjxIVE1MRWxlbWVudD4pIHtcblx0XHRcdFx0aWYgKGxpbmsuZGF0YXNldC5zb3VyY2UpIHtcblx0XHRcdFx0XHRsaW5rLm9uZXJyb3IgPSBvblN0eWxlTG9hZEVycm9yO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fSk7XG5cblx0XHR3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcignbG9hZCcsICgpID0+IHtcblx0XHRcdGlmICghdGhpcy51bmxvYWRlZFN0eWxlcy5sZW5ndGgpIHtcblx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0fVxuXHRcdFx0cG9zdENvbW1hbmQoJ19tYXJrZG93bi5vblByZXZpZXdTdHlsZUxvYWRFcnJvcicsIFt0aGlzLnVubG9hZGVkU3R5bGVzXSk7XG5cdFx0fSk7XG5cdH1cbn0iLCIvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICogIENvcHlyaWdodCAoYykgTWljcm9zb2Z0IENvcnBvcmF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICogIExpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgTGljZW5zZS4gU2VlIExpY2Vuc2UudHh0IGluIHRoZSBwcm9qZWN0IHJvb3QgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24uXG4gKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi9cblxuaW1wb3J0IHsgZ2V0U2V0dGluZ3MgfSBmcm9tICcuL3NldHRpbmdzJztcblxuZGVjbGFyZSB2YXIgdnNjb2RlOiBhbnk7XG5cbi8qKlxuICogUG9zdCBhIG1lc3NhZ2UgdG8gdGhlIG1hcmtkb3duIGV4dGVuc2lvblxuICovXG5leHBvcnQgZnVuY3Rpb24gcG9zdE1lc3NhZ2UodHlwZTogc3RyaW5nLCBib2R5OiBvYmplY3QpIHtcblx0dnNjb2RlLnBvc3RNZXNzYWdlKHtcblx0XHR0eXBlLFxuXHRcdHNvdXJjZTogZ2V0U2V0dGluZ3MoKS5zb3VyY2UsXG5cdFx0Ym9keVxuXHR9KTtcbn1cblxuLyoqXG4gKiBQb3N0IGEgY29tbWFuZCB0byBiZSBleGVjdXRlZCB0byB0aGUgbWFya2Rvd24gZXh0ZW5zaW9uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBwb3N0Q29tbWFuZChjb21tYW5kOiBzdHJpbmcsIGFyZ3M6IGFueVtdKSB7XG5cdHBvc3RNZXNzYWdlKCdjb21tYW5kJywgeyBjb21tYW5kLCBhcmdzIH0pO1xufVxuIiwiLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAqICBDb3B5cmlnaHQgKGMpIE1pY3Jvc29mdCBDb3Jwb3JhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqICBMaWNlbnNlZCB1bmRlciB0aGUgTUlUIExpY2Vuc2UuIFNlZSBMaWNlbnNlLnR4dCBpbiB0aGUgcHJvamVjdCByb290IGZvciBsaWNlbnNlIGluZm9ybWF0aW9uLlxuICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovXG5cbmltcG9ydCB7IENzcEFsZXJ0ZXIgfSBmcm9tICcuL2NzcCc7XG5pbXBvcnQgeyBTdHlsZUxvYWRpbmdNb25pdG9yIH0gZnJvbSAnLi9sb2FkaW5nJztcblxuLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOm5vLXVudXNlZC1leHByZXNzaW9uXG5uZXcgQ3NwQWxlcnRlcigpO1xuXG4vLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6bm8tdW51c2VkLWV4cHJlc3Npb25cbm5ldyBTdHlsZUxvYWRpbmdNb25pdG9yKCk7IiwiLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAqICBDb3B5cmlnaHQgKGMpIE1pY3Jvc29mdCBDb3Jwb3JhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqICBMaWNlbnNlZCB1bmRlciB0aGUgTUlUIExpY2Vuc2UuIFNlZSBMaWNlbnNlLnR4dCBpbiB0aGUgcHJvamVjdCByb290IGZvciBsaWNlbnNlIGluZm9ybWF0aW9uLlxuICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovXG5cbmV4cG9ydCBpbnRlcmZhY2UgUHJldmlld1NldHRpbmdzIHtcblx0c291cmNlOiBzdHJpbmc7XG5cdGxpbmU6IG51bWJlcjtcblx0bGluZUNvdW50OiBudW1iZXI7XG5cdHNjcm9sbFByZXZpZXdXaXRoRWRpdG9yPzogYm9vbGVhbjtcblx0c2Nyb2xsRWRpdG9yV2l0aFByZXZpZXc6IGJvb2xlYW47XG5cdGRpc2FibGVTZWN1cml0eVdhcm5pbmdzOiBib29sZWFuO1xuXHRkb3VibGVDbGlja1RvU3dpdGNoVG9FZGl0b3I6IGJvb2xlYW47XG59XG5cbmxldCBjYWNoZWRTZXR0aW5nczogUHJldmlld1NldHRpbmdzIHwgdW5kZWZpbmVkID0gdW5kZWZpbmVkO1xuXG5leHBvcnQgZnVuY3Rpb24gZ2V0U2V0dGluZ3MoKTogUHJldmlld1NldHRpbmdzIHtcblx0aWYgKGNhY2hlZFNldHRpbmdzKSB7XG5cdFx0cmV0dXJuIGNhY2hlZFNldHRpbmdzO1xuXHR9XG5cblx0Y29uc3QgZWxlbWVudCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd2c2NvZGUtbWFya2Rvd24tcHJldmlldy1kYXRhJyk7XG5cdGlmIChlbGVtZW50KSB7XG5cdFx0Y29uc3QgZGF0YSA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlKCdkYXRhLXNldHRpbmdzJyk7XG5cdFx0aWYgKGRhdGEpIHtcblx0XHRcdGNhY2hlZFNldHRpbmdzID0gSlNPTi5wYXJzZShkYXRhKTtcblx0XHRcdHJldHVybiBjYWNoZWRTZXR0aW5ncyE7XG5cdFx0fVxuXHR9XG5cblx0dGhyb3cgbmV3IEVycm9yKCdDb3VsZCBub3QgbG9hZCBzZXR0aW5ncycpO1xufVxuIiwiLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAqICBDb3B5cmlnaHQgKGMpIE1pY3Jvc29mdCBDb3Jwb3JhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqICBMaWNlbnNlZCB1bmRlciB0aGUgTUlUIExpY2Vuc2UuIFNlZSBMaWNlbnNlLnR4dCBpbiB0aGUgcHJvamVjdCByb290IGZvciBsaWNlbnNlIGluZm9ybWF0aW9uLlxuICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovXG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRTdHJpbmdzKCk6IHsgW2tleTogc3RyaW5nXTogc3RyaW5nIH0ge1xuXHRjb25zdCBzdG9yZSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd2c2NvZGUtbWFya2Rvd24tcHJldmlldy1kYXRhJyk7XG5cdGlmIChzdG9yZSkge1xuXHRcdGNvbnN0IGRhdGEgPSBzdG9yZS5nZXRBdHRyaWJ1dGUoJ2RhdGEtc3RyaW5ncycpO1xuXHRcdGlmIChkYXRhKSB7XG5cdFx0XHRyZXR1cm4gSlNPTi5wYXJzZShkYXRhKTtcblx0XHR9XG5cdH1cblx0dGhyb3cgbmV3IEVycm9yKCdDb3VsZCBub3QgbG9hZCBzdHJpbmdzJyk7XG59XG4iXSwic291cmNlUm9vdCI6IiJ9 \ No newline at end of file diff --git a/extensions/markdown-language-features/preview-src/messaging.ts b/extensions/markdown-language-features/preview-src/messaging.ts index 10571ff28db..1fdb313103d 100644 --- a/extensions/markdown-language-features/preview-src/messaging.ts +++ b/extensions/markdown-language-features/preview-src/messaging.ts @@ -5,15 +5,17 @@ import { getSettings } from './settings'; +declare var vscode: any; + /** * Post a message to the markdown extension */ export function postMessage(type: string, body: object) { - window.parent.postMessage({ + vscode.postMessage({ type, source: getSettings().source, body - }, '*'); + }); } /** diff --git a/src/vs/workbench/parts/webview/electron-browser/webview-pre.js b/src/vs/workbench/parts/webview/electron-browser/webview-pre.js index e52c2990030..307d67a3b43 100644 --- a/src/vs/workbench/parts/webview/electron-browser/webview-pre.js +++ b/src/vs/workbench/parts/webview/electron-browser/webview-pre.js @@ -10,7 +10,7 @@ const ipcRenderer = require('electron').ipcRenderer; - const registerVscodeResourceScheme = (function() { + const registerVscodeResourceScheme = (function () { let hasRegistered = false; return () => { if (hasRegistered) { @@ -174,6 +174,28 @@ newDocument.head.appendChild(baseElement); } + // apply default script + if (enableWrappedPostMessage) { + const defaultScript = newDocument.createElement('script'); + defaultScript.textContent = ` + const vscode = Object.freeze((function() { + const originalPostMessage = window.parent.postMessage.bind(window.parent); + return { + postMessage: function(msg) { + return originalPostMessage(msg, '*'); + } + }; + })()); + delete window.parent; + `; + + if (newDocument.head.hasChildNodes()) { + newDocument.head.insertBefore(defaultScript, newDocument.head.firstChild); + } else { + newDocument.head.appendChild(defaultScript); + } + } + // apply default styles const defaultStyles = newDocument.createElement('style'); defaultStyles.id = '_defaultStyles'; From 1b31feb50dbcad8eacb5aa86e3ac60e7fc181e08 Mon Sep 17 00:00:00 2001 From: Ramya Achutha Rao Date: Wed, 25 Apr 2018 17:20:41 -0700 Subject: [PATCH 087/830] Get stats on folder onfly if scheme is file Fixes #48570 --- src/vs/workbench/parts/stats/node/workspaceStats.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/vs/workbench/parts/stats/node/workspaceStats.ts b/src/vs/workbench/parts/stats/node/workspaceStats.ts index 7c64c805596..2ee25366077 100644 --- a/src/vs/workbench/parts/stats/node/workspaceStats.ts +++ b/src/vs/workbench/parts/stats/node/workspaceStats.ts @@ -255,8 +255,9 @@ export class WorkspaceStats implements IWorkbenchContribution { tags['workspace.roots'] = isEmpty ? 0 : workspace.folders.length; tags['workspace.empty'] = isEmpty; - const folders = !isEmpty ? workspace.folders.map(folder => folder.uri) : this.environmentService.appQuality !== 'stable' && this.findFolders(configuration); + let folders = !isEmpty ? workspace.folders.map(folder => folder.uri) : this.environmentService.appQuality !== 'stable' && this.findFolders(configuration); if (folders && folders.length && this.fileService) { + folders = folders.filter(x => x.scheme === 'file'); //return const files: IResolveFileResult[] = await this.fileService.resolveFiles(folders.map(resource => ({ resource }))); const names = ([]).concat(...files.map(result => result.success ? (result.stat.children || []) : [])).map(c => c.name); From bd6de64bfa19a49ce42bcbe523a0b0b9c5516c59 Mon Sep 17 00:00:00 2001 From: Pine Wu Date: Tue, 24 Apr 2018 10:02:27 -0700 Subject: [PATCH 088/830] [css] update service --- extensions/css-language-features/server/package.json | 2 +- extensions/css-language-features/server/yarn.lock | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/extensions/css-language-features/server/package.json b/extensions/css-language-features/server/package.json index fee6cb6868f..5b472527e61 100644 --- a/extensions/css-language-features/server/package.json +++ b/extensions/css-language-features/server/package.json @@ -8,7 +8,7 @@ "node": "*" }, "dependencies": { - "vscode-css-languageservice": "^3.0.9-next.11", + "vscode-css-languageservice": "^3.0.9-next.12", "vscode-languageserver": "^4.0.0", "vscode-languageserver-protocol-foldingprovider": "^2.0.0-next.2" }, diff --git a/extensions/css-language-features/server/yarn.lock b/extensions/css-language-features/server/yarn.lock index 6a25dff9f61..8f1a9ddcb6c 100644 --- a/extensions/css-language-features/server/yarn.lock +++ b/extensions/css-language-features/server/yarn.lock @@ -10,9 +10,9 @@ version "7.0.43" resolved "https://registry.yarnpkg.com/@types/node/-/node-7.0.43.tgz#a187e08495a075f200ca946079c914e1a5fe962c" -vscode-css-languageservice@^3.0.9-next.11: - version "3.0.9-next.11" - resolved "https://registry.yarnpkg.com/vscode-css-languageservice/-/vscode-css-languageservice-3.0.9-next.11.tgz#a71af12086a1b534bd75341306a0046b7d3d22f2" +vscode-css-languageservice@^3.0.9-next.12: + version "3.0.9-next.12" + resolved "https://registry.yarnpkg.com/vscode-css-languageservice/-/vscode-css-languageservice-3.0.9-next.12.tgz#013a0fbe6aa042932819db43824802da4ab02a55" dependencies: vscode-languageserver-types "^3.6.1" vscode-nls "^3.2.1" From eca6b7c77bcddfe97f6f516c6ef0a64c2ef82d33 Mon Sep 17 00:00:00 2001 From: Pine Wu Date: Wed, 25 Apr 2018 17:37:57 -0700 Subject: [PATCH 089/830] SmartStep for css debugging --- extensions/css-language-features/.vscode/launch.json | 2 ++ 1 file changed, 2 insertions(+) diff --git a/extensions/css-language-features/.vscode/launch.json b/extensions/css-language-features/.vscode/launch.json index 5472c605b69..f6f6922c78d 100644 --- a/extensions/css-language-features/.vscode/launch.json +++ b/extensions/css-language-features/.vscode/launch.json @@ -18,6 +18,7 @@ "stopOnEntry": false, "sourceMaps": true, "outFiles": ["${workspaceFolder}/client/out/**/*.js"], + "smartStep": true, "preLaunchTask": "npm: compile" }, { @@ -39,6 +40,7 @@ "port": 6044, "sourceMaps": true, "outFiles": ["${workspaceFolder}/server/out/**/*.js"], + "smartStep": true, "restart": true } ] From a4526912281f16b842a00e0813675b0ccc3684ef Mon Sep 17 00:00:00 2001 From: Pine Wu Date: Wed, 25 Apr 2018 17:43:35 -0700 Subject: [PATCH 090/830] [css] update service --- extensions/css-language-features/server/package.json | 2 +- extensions/css-language-features/server/yarn.lock | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/extensions/css-language-features/server/package.json b/extensions/css-language-features/server/package.json index 5b472527e61..a3169e7f339 100644 --- a/extensions/css-language-features/server/package.json +++ b/extensions/css-language-features/server/package.json @@ -8,7 +8,7 @@ "node": "*" }, "dependencies": { - "vscode-css-languageservice": "^3.0.9-next.12", + "vscode-css-languageservice": "^3.0.9-next.13", "vscode-languageserver": "^4.0.0", "vscode-languageserver-protocol-foldingprovider": "^2.0.0-next.2" }, diff --git a/extensions/css-language-features/server/yarn.lock b/extensions/css-language-features/server/yarn.lock index 8f1a9ddcb6c..8fab5223e9f 100644 --- a/extensions/css-language-features/server/yarn.lock +++ b/extensions/css-language-features/server/yarn.lock @@ -10,9 +10,9 @@ version "7.0.43" resolved "https://registry.yarnpkg.com/@types/node/-/node-7.0.43.tgz#a187e08495a075f200ca946079c914e1a5fe962c" -vscode-css-languageservice@^3.0.9-next.12: - version "3.0.9-next.12" - resolved "https://registry.yarnpkg.com/vscode-css-languageservice/-/vscode-css-languageservice-3.0.9-next.12.tgz#013a0fbe6aa042932819db43824802da4ab02a55" +vscode-css-languageservice@^3.0.9-next.13: + version "3.0.9-next.13" + resolved "https://registry.yarnpkg.com/vscode-css-languageservice/-/vscode-css-languageservice-3.0.9-next.13.tgz#84dfe85211081659c0f0f44b153e4a0ecd54f53c" dependencies: vscode-languageserver-types "^3.6.1" vscode-nls "^3.2.1" From ebf9c8c730041c7fd1586ad8458e8a5c3b2d38fc Mon Sep 17 00:00:00 2001 From: Rachel Macfarlane Date: Wed, 25 Apr 2018 19:06:41 -0700 Subject: [PATCH 091/830] Update windows-process-tree to 0.2.2 --- package.json | 2 +- yarn.lock | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/package.json b/package.json index aba7c5c031c..7d31972f2b7 100644 --- a/package.json +++ b/package.json @@ -132,6 +132,6 @@ "optionalDependencies": { "windows-foreground-love": "0.1.0", "windows-mutex": "^0.2.0", - "windows-process-tree": "0.2.1" + "windows-process-tree": "0.2.2" } } diff --git a/yarn.lock b/yarn.lock index 6a63dc20696..8395ed9b532 100644 --- a/yarn.lock +++ b/yarn.lock @@ -6017,9 +6017,9 @@ windows-mutex@^0.2.0: bindings "^1.2.1" nan "^2.1.0" -windows-process-tree@0.2.1: - version "0.2.1" - resolved "https://registry.yarnpkg.com/windows-process-tree/-/windows-process-tree-0.2.1.tgz#d750f8592bd956e89f8dc565bc47be6430d3df6e" +windows-process-tree@0.2.2: + version "0.2.2" + resolved "https://registry.yarnpkg.com/windows-process-tree/-/windows-process-tree-0.2.2.tgz#1ab2518588d6f389c10e5a6c9c0d5550989506f4" dependencies: nan "^2.6.2" From 741e7e413b3767c514789ac422262e4e7065417c Mon Sep 17 00:00:00 2001 From: Rachel Macfarlane Date: Wed, 25 Apr 2018 19:37:00 -0700 Subject: [PATCH 092/830] Show context menu on right click in process explorer, #48498 --- .../electron-browser/processExplorer/processExplorerMain.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/vs/code/electron-browser/processExplorer/processExplorerMain.ts b/src/vs/code/electron-browser/processExplorer/processExplorerMain.ts index 17a77b37b0f..55f2e4826ef 100644 --- a/src/vs/code/electron-browser/processExplorer/processExplorerMain.ts +++ b/src/vs/code/electron-browser/processExplorer/processExplorerMain.ts @@ -161,7 +161,7 @@ export function startup(data: ProcessExplorerData): void { const tableRows = document.getElementsByTagName('tr'); for (let i = 0; i < tableRows.length; i++) { const tableRow = tableRows[i]; - tableRow.addEventListener('click', (e) => { + tableRow.addEventListener('contextmenu', (e) => { showContextMenu(e); }); } From 976ef115c35dff5da4d0e99832d3fd8b0347082c Mon Sep 17 00:00:00 2001 From: Rachel Macfarlane Date: Wed, 25 Apr 2018 20:06:07 -0700 Subject: [PATCH 093/830] Change cursor to default in process explorer, #48585 --- .../electron-browser/processExplorer/media/processExplorer.css | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/vs/code/electron-browser/processExplorer/media/processExplorer.css b/src/vs/code/electron-browser/processExplorer/media/processExplorer.css index 90498bdb122..012740110f4 100644 --- a/src/vs/code/electron-browser/processExplorer/media/processExplorer.css +++ b/src/vs/code/electron-browser/processExplorer/media/processExplorer.css @@ -43,10 +43,12 @@ th { border-bottom: 1px solid #cccccc; padding: .5rem; border-top: 1px solid #cccccc; + cursor: default; } td { padding: .25rem; vertical-align: top; + cursor: default; } .centered { From bbb562359bdb3b3f25112b07df31463bf2c34acb Mon Sep 17 00:00:00 2001 From: Rob Lourens Date: Wed, 25 Apr 2018 21:25:23 -0700 Subject: [PATCH 094/830] Bump node-debug2 #47274 --- build/builtInExtensions.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build/builtInExtensions.json b/build/builtInExtensions.json index c8c9057b592..0c7ae4ea8a7 100644 --- a/build/builtInExtensions.json +++ b/build/builtInExtensions.json @@ -6,7 +6,7 @@ }, { "name": "ms-vscode.node-debug2", - "version": "1.23.4", + "version": "1.23.5", "repo": "https://github.com/Microsoft/vscode-node-debug2" } ] From 6d7bb1a174f588360366af26a2ec8f27064ca110 Mon Sep 17 00:00:00 2001 From: Rob Lourens Date: Wed, 25 Apr 2018 21:56:48 -0700 Subject: [PATCH 095/830] Fix #43976 --- .../parts/search/browser/searchActions.ts | 27 ++++++++++++++++--- 1 file changed, 24 insertions(+), 3 deletions(-) diff --git a/src/vs/workbench/parts/search/browser/searchActions.ts b/src/vs/workbench/parts/search/browser/searchActions.ts index 4d60b042603..68239c9a31e 100644 --- a/src/vs/workbench/parts/search/browser/searchActions.ts +++ b/src/vs/workbench/parts/search/browser/searchActions.ts @@ -501,11 +501,32 @@ export abstract class AbstractSearchAndReplaceAction extends Action { public getPreviousElementAfterRemoved(viewer: ITree, element: RenderableMatch): RenderableMatch { let navigator: INavigator = this.getNavigatorAt(element, viewer); let previousElement = navigator.previous(); - if (element instanceof Match && element.parent().matches().length === 1) { - // If this is the only match, then the file match is also removed - // Hence take the previous element to file match + + // If this is the only match, then the file/folder match is also removed + // Hence take the previous element. + const parent = element.parent(); + if (parent === previousElement) { previousElement = navigator.previous(); } + + if (parent instanceof FileMatch && parent.parent() === previousElement) { + previousElement = navigator.previous(); + } + + // If the previous element is a File or Folder, expand it and go to its last child. + // Spell out the two cases, would be too easy to create an infinite loop, like by adding another level... + if (previousElement && previousElement instanceof FolderMatch) { + navigator.next(); + viewer.expand(previousElement); + previousElement = navigator.previous(); + } + + if (previousElement && previousElement instanceof FileMatch) { + navigator.next(); + viewer.expand(previousElement); + previousElement = navigator.previous(); + } + return previousElement; } From 82d97b4c3c9c0c42f3005d4fc9114885ca652094 Mon Sep 17 00:00:00 2001 From: Matt Bierner Date: Wed, 25 Apr 2018 22:27:51 -0700 Subject: [PATCH 096/830] Add acquireVsCodeApi to get handle to vscode api inside webview Fixes #48540 --- .../markdown-language-features/media/index.js | 52 ++++++------ .../markdown-language-features/media/pre.js | 82 +++++++------------ .../preview-src/csp.ts | 25 ++++-- .../preview-src/index.ts | 24 ++++-- .../preview-src/loading.ts | 17 +++- .../preview-src/messaging.ts | 41 ++++++---- .../preview-src/pre.ts | 12 ++- .../webview/electron-browser/webview-pre.js | 20 +++-- 8 files changed, 155 insertions(+), 118 deletions(-) diff --git a/extensions/markdown-language-features/media/index.js b/extensions/markdown-language-features/media/index.js index cba62281adf..1b0c48d596b 100644 --- a/extensions/markdown-language-features/media/index.js +++ b/extensions/markdown-language-features/media/index.js @@ -637,15 +637,19 @@ exports.onceDocumentLoaded = onceDocumentLoaded; * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ Object.defineProperty(exports, "__esModule", { value: true }); -const settings_1 = __webpack_require__(/*! ./settings */ "./preview-src/settings.ts"); -const messaging_1 = __webpack_require__(/*! ./messaging */ "./preview-src/messaging.ts"); -const events_1 = __webpack_require__(/*! ./events */ "./preview-src/events.ts"); -const scroll_sync_1 = __webpack_require__(/*! ./scroll-sync */ "./preview-src/scroll-sync.ts"); const activeLineMarker_1 = __webpack_require__(/*! ./activeLineMarker */ "./preview-src/activeLineMarker.ts"); +const events_1 = __webpack_require__(/*! ./events */ "./preview-src/events.ts"); +const messaging_1 = __webpack_require__(/*! ./messaging */ "./preview-src/messaging.ts"); +const scroll_sync_1 = __webpack_require__(/*! ./scroll-sync */ "./preview-src/scroll-sync.ts"); +const settings_1 = __webpack_require__(/*! ./settings */ "./preview-src/settings.ts"); const throttle = __webpack_require__(/*! lodash.throttle */ "./node_modules/lodash.throttle/index.js"); var scrollDisabled = true; const marker = new activeLineMarker_1.ActiveLineMarker(); const settings = settings_1.getSettings(); +const vscode = acquireVsCodeApi(); +const messaging = messaging_1.createPosterForVsCode(vscode); +window.cspAlerter.setPoster(messaging); +window.styleLoadingMonitor.setPoster(messaging); events_1.onceDocumentLoaded(() => { if (settings.scrollPreviewWithEditor) { setTimeout(() => { @@ -698,7 +702,7 @@ document.addEventListener('dblclick', event => { const offset = event.pageY; const line = scroll_sync_1.getEditorLineNumberForPageOffset(offset); if (typeof line === 'number' && !isNaN(line)) { - messaging_1.postMessage('didClick', { line: Math.floor(line) }); + messaging.postMessage('didClick', { line: Math.floor(line) }); } }); document.addEventListener('click', event => { @@ -713,7 +717,7 @@ document.addEventListener('click', event => { } if (node.href.startsWith('file://') || node.href.startsWith('vscode-resource:')) { const [path, fragment] = node.href.replace(/^(file:\/\/|vscode-resource:)/i, '').split('#'); - messaging_1.postCommand('_markdown.openDocumentLink', [{ path, fragment }]); + messaging.postCommand('_markdown.openDocumentLink', [{ path, fragment }]); event.preventDefault(); event.stopPropagation(); break; @@ -731,7 +735,7 @@ if (settings.scrollEditorWithPreview) { else { const line = scroll_sync_1.getEditorLineNumberForPageOffset(window.scrollY); if (typeof line === 'number' && !isNaN(line)) { - messaging_1.postMessage('revealLine', { line }); + messaging.postMessage('revealLine', { line }); } } }, 50)); @@ -755,24 +759,20 @@ if (settings.scrollEditorWithPreview) { *--------------------------------------------------------------------------------------------*/ Object.defineProperty(exports, "__esModule", { value: true }); const settings_1 = __webpack_require__(/*! ./settings */ "./preview-src/settings.ts"); -/** - * Post a message to the markdown extension - */ -function postMessage(type, body) { - vscode.postMessage({ - type, - source: settings_1.getSettings().source, - body - }); -} -exports.postMessage = postMessage; -/** - * Post a command to be executed to the markdown extension - */ -function postCommand(command, args) { - postMessage('command', { command, args }); -} -exports.postCommand = postCommand; +exports.createPosterForVsCode = (vscode) => { + return new class { + postMessage(type, body) { + vscode.postMessage({ + type, + source: settings_1.getSettings().source, + body + }); + } + postCommand(command, args) { + this.postMessage('command', { command, args }); + } + }; +}; /***/ }), @@ -940,4 +940,4 @@ exports.getSettings = getSettings; /***/ }) /******/ }); -//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vd2VicGFjay9ib290c3RyYXAiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC50aHJvdHRsZS9pbmRleC5qcyIsIndlYnBhY2s6Ly8vKHdlYnBhY2spL2J1aWxkaW4vZ2xvYmFsLmpzIiwid2VicGFjazovLy8uL3ByZXZpZXctc3JjL2FjdGl2ZUxpbmVNYXJrZXIudHMiLCJ3ZWJwYWNrOi8vLy4vcHJldmlldy1zcmMvZXZlbnRzLnRzIiwid2VicGFjazovLy8uL3ByZXZpZXctc3JjL2luZGV4LnRzIiwid2VicGFjazovLy8uL3ByZXZpZXctc3JjL21lc3NhZ2luZy50cyIsIndlYnBhY2s6Ly8vLi9wcmV2aWV3LXNyYy9zY3JvbGwtc3luYy50cyIsIndlYnBhY2s6Ly8vLi9wcmV2aWV3LXNyYy9zZXR0aW5ncy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7OztBQUdBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQUs7QUFDTDtBQUNBOztBQUVBO0FBQ0E7QUFDQSx5REFBaUQsY0FBYztBQUMvRDs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxtQ0FBMkIsMEJBQTBCLEVBQUU7QUFDdkQseUNBQWlDLGVBQWU7QUFDaEQ7QUFDQTtBQUNBOztBQUVBO0FBQ0EsOERBQXNELCtEQUErRDs7QUFFckg7QUFDQTs7O0FBR0E7QUFDQTs7Ozs7Ozs7Ozs7O0FDbkVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNB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QUMsQ0FBQztJQUMxQyxNQUFNLEtBQUssR0FBRyxtQkFBbUIsRUFBRSxDQUFDO0lBQ3BDLElBQUksUUFBUSxHQUFHLEtBQUssQ0FBQyxDQUFDLENBQUMsSUFBSSxJQUFJLENBQUM7SUFDaEMsR0FBRyxDQUFDLENBQUMsTUFBTSxLQUFLLElBQUksS0FBSyxDQUFDLENBQUMsQ0FBQztRQUMzQixFQUFFLENBQUMsQ0FBQyxLQUFLLENBQUMsSUFBSSxLQUFLLFVBQVUsQ0FBQyxDQUFDLENBQUM7WUFDL0IsTUFBTSxDQUFDLEVBQUUsUUFBUSxFQUFFLEtBQUssRUFBRSxJQUFJLEVBQUUsU0FBUyxFQUFFLENBQUM7UUFDN0MsQ0FBQztRQUNELElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQyxLQUFLLENBQUMsSUFBSSxHQUFHLFVBQVUsQ0FBQyxDQUFDLENBQUM7WUFDbEMsTUFBTSxDQUFDLEVBQUUsUUFBUSxFQUFFLElBQUksRUFBRSxLQUFLLEVBQUUsQ0FBQztRQUNsQyxDQUFDO1FBQ0QsUUFBUSxHQUFHLEtBQUssQ0FBQztJQUNsQixDQUFDO0lBQ0QsTUFBTSxDQUFDLEVBQUUsUUFBUSxFQUFFLENBQUM7QUFDckIsQ0FBQztBQWRELDREQWNDO0FBRUQ7O0dBRUc7QUFDSCxxQ0FBNEMsTUFBYztJQUN6RCxNQUFNLEtBQUssR0FBRyxtQkFBbUIsRUFBRSxDQUFDO0lBQ3BDLE1BQU0sUUFBUSxHQUFHLE1BQU0sR0FBRyxNQUFNLENBQUMsT0FBTyxDQUFDO0lBQ3pDLElBQUksRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDO0lBQ1osSUFBSSxFQUFFLEdBQUcsS0FBSyxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUM7SUFDMUIsT0FBTyxFQUFFLEdBQUcsQ0FBQyxHQUFHLEVBQUUsRUFBRSxDQUFDO1FBQ3BCLE1BQU0sR0FBRyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFLEdBQUcsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7UUFDdEMsTUFBTSxNQUFNLEdBQUcsS0FBSyxDQUFDLEdBQUcsQ0FB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Qyx5QkFBeUIsQ0FBQyxDQUFDO0FBQzVDLENBQUM7QUFmRCxrQ0FlQyIsImZpbGUiOiJpbmRleC5qcyIsInNvdXJjZXNDb250ZW50IjpbIiBcdC8vIFRoZSBtb2R1bGUgY2FjaGVcbiBcdHZhciBpbnN0YWxsZWRNb2R1bGVzID0ge307XG5cbiBcdC8vIFRoZSByZXF1aXJlIGZ1bmN0aW9uXG4gXHRmdW5jdGlvbiBfX3dlYnBhY2tfcmVxdWlyZV9fKG1vZHVsZUlkKSB7XG5cbiBcdFx0Ly8gQ2hlY2sgaWYgbW9kdWxlIGlzIGluIGNhY2hlXG4gXHRcdGlmKGluc3RhbGxlZE1vZHVsZXNbbW9kdWxlSWRdKSB7XG4gXHRcdFx0cmV0dXJuIGluc3RhbGxlZE1vZHVsZXNbbW9kdWxlSWRdLmV4cG9ydHM7XG4gXHRcdH1cbiBcdFx0Ly8gQ3JlYXRlIGEgbmV3IG1vZHVsZSAoYW5kIHB1dCBpdCBpbnRvIHRoZSBjYWNoZSlcbiBcdFx0dmFyIG1vZHVsZSA9IGluc3RhbGxlZE1vZHVsZXNbbW9kdWxlSWRdID0ge1xuIFx0XHRcdGk6IG1vZHVsZUlkLFxuIFx0XHRcdGw6IGZhbHNlLFxuIFx0XHRcdGV4cG9ydHM6IHt9XG4gXHRcdH07XG5cbiBcdFx0Ly8gRXhlY3V0ZSB0aGUgbW9kdWxlIGZ1bmN0aW9uXG4gXHRcdG1vZHVsZXNbbW9kdWxlSWRdLmNhbGwobW9kdWxlLmV4cG9ydHMsIG1vZHVsZSwgbW9kdWxlLmV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pO1xuXG4gXHRcdC8vIEZsYWcgdGhlIG1vZHVsZSBhcyBsb2FkZWRcbiBcdFx0bW9kdWxlLmwgPSB0cnVlO1xuXG4gXHRcdC8vIFJldHVybiB0aGUgZXhwb3J0cyBvZiB0aGUgbW9kdWxlXG4gXHRcdHJldHVybiBtb2R1bGUuZXhwb3J0cztcbiBcdH1cblxuXG4gXHQvLyBleHBvc2UgdGhlIG1vZHVsZXMgb2JqZWN0IChfX3dlYnBhY2tfbW9kdWxlc19fKVxuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5tID0gbW9kdWxlcztcblxuIFx0Ly8gZXhwb3NlIHRoZSBtb2R1bGUgY2FjaGVcbiBcdF9fd2VicGFja19yZXF1aXJlX18uYyA9IGluc3RhbGxlZE1vZHVsZXM7XG5cbiBcdC8vIGRlZmluZSBnZXR0ZXIgZnVuY3Rpb24gZm9yIGhhcm1vbnkgZXhwb3J0c1xuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5kID0gZnVuY3Rpb24oZXhwb3J0cywgbmFtZSwgZ2V0dGVyKSB7XG4gXHRcdGlmKCFfX3dlYnBhY2tfcmVxdWlyZV9fLm8oZXhwb3J0cywgbmFtZSkpIHtcbiBcdFx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgbmFtZSwge1xuIFx0XHRcdFx0Y29uZmlndXJhYmxlOiBmYWxzZSxcbiBcdFx0XHRcdGVudW1lcmFibGU6IHRydWUsXG4gXHRcdFx0XHRnZXQ6IGdldHRlclxuIFx0XHRcdH0pO1xuIFx0XHR9XG4gXHR9O1xuXG4gXHQvLyBkZWZpbmUgX19lc01vZHVsZSBvbiBleHBvcnRzXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLnIgPSBmdW5jdGlvbihleHBvcnRzKSB7XG4gXHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCAnX19lc01vZHVsZScsIHsgdmFsdWU6IHRydWUgfSk7XG4gXHR9O1xuXG4gXHQvLyBnZXREZWZhdWx0RXhwb3J0IGZ1bmN0aW9uIGZvciBjb21wYXRpYmlsaXR5IHdpdGggbm9uLWhhcm1vbnkgbW9kdWxlc1xuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5uID0gZnVuY3Rpb24obW9kdWxlKSB7XG4gXHRcdHZhciBnZXR0ZXIgPSBtb2R1bGUgJiYgbW9kdWxlLl9fZXNNb2R1bGUgP1xuIFx0XHRcdGZ1bmN0aW9uIGdldERlZmF1bHQoKSB7IHJldHVybiBtb2R1bGVbJ2RlZmF1bHQnXTsgfSA6XG4gXHRcdFx0ZnVuY3Rpb24gZ2V0TW9kdWxlRXhwb3J0cygpIHsgcmV0dXJuIG1vZHVsZTsgfTtcbiBcdFx0X193ZWJwYWNrX3JlcXVpcmVfXy5kKGdldHRlciwgJ2EnLCBnZXR0ZXIpO1xuIFx0XHRyZXR1cm4gZ2V0dGVyO1xuIFx0fTtcblxuIFx0Ly8gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLm8gPSBmdW5jdGlvbihvYmplY3QsIHByb3BlcnR5KSB7IHJldHVybiBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwob2JqZWN0LCBwcm9wZXJ0eSk7IH07XG5cbiBcdC8vIF9fd2VicGFja19wdWJsaWNfcGF0aF9fXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLnAgPSBcIlwiO1xuXG5cbiBcdC8vIExvYWQgZW50cnkgbW9kdWxlIGFuZCByZXR1cm4gZXhwb3J0c1xuIFx0cmV0dXJuIF9fd2VicGFja19yZXF1aXJlX18oX193ZWJwYWNrX3JlcXVpcmVfXy5zID0gXCIuL3ByZXZpZXctc3JjL2luZGV4LnRzXCIpO1xuIiwiLyoqXG4gKiBsb2Rhc2ggKEN1c3RvbSBCdWlsZCkgPGh0dHBzOi8vbG9kYXNoLmNvbS8+XG4gKiBCdWlsZDogYGxvZGFzaCBtb2R1bGFyaXplIGV4cG9ydHM9XCJucG1cIiAtbyAuL2BcbiAqIENvcHlyaWdodCBqUXVlcnkgRm91bmRhdGlvbiBhbmQgb3RoZXIgY29udHJpYnV0b3JzIDxodHRwczovL2pxdWVyeS5vcmcvPlxuICogUmVsZWFzZWQgdW5kZXIgTUlUIGxpY2Vuc2UgPGh0dHBzOi8vbG9kYXNoLmNvbS9saWNlbnNlPlxuICogQmFzZWQgb24gVW5kZXJzY29yZS5qcyAxLjguMyA8aHR0cDovL3VuZGVyc2NvcmVqcy5vcmcvTElDRU5TRT5cbiAqIENvcHlyaWdodCBKZXJlbXkgQXNoa2VuYXMsIERvY3VtZW50Q2xvdWQgYW5kIEludmVzdGlnYXRpdmUgUmVwb3J0ZXJzICYgRWRpdG9yc1xuICovXG5cbi8qKiBVc2VkIGFzIHRoZSBgVHlwZUVycm9yYCBtZXNzYWdlIGZvciBcIkZ1bmN0aW9uc1wiIG1ldGhvZHMuICovXG52YXIgRlVOQ19FUlJPUl9URVhUID0gJ0V4cGVjdGVkIGEgZnVuY3Rpb24nO1xuXG4vKiogVXNlZCBhcyByZWZlcmVuY2VzIGZvciB2YXJpb3VzIGBOdW1iZXJgIGNvbnN0YW50cy4gKi9cbnZhciBOQU4gPSAwIC8gMDtcblxuLyoqIGBPYmplY3QjdG9TdHJpbmdgIHJlc3VsdCByZWZlcmVuY2VzLiAqL1xudmFyIHN5bWJvbFRhZyA9ICdbb2JqZWN0IFN5bWJvbF0nO1xuXG4vKiogVXNlZCB0byBtYXRjaCBsZWFkaW5nIGFuZCB0cmFpbGluZyB3aGl0ZXNwYWNlLiAqL1xudmFyIHJlVHJpbSA9IC9eXFxzK3xcXHMrJC9nO1xuXG4vKiogVXNlZCB0byBkZXRlY3QgYmFkIHNpZ25lZCBoZXhhZGVjaW1hbCBzdHJpbmcgdmFsdWVzLiAqL1xudmFyIHJlSXNCYWRIZXggPSAvXlstK10weFswLTlhLWZdKyQvaTtcblxuLyoqIFVzZWQgdG8gZGV0ZWN0IGJpbmFyeSBzdHJpbmcgdmFsdWVzLiAqL1xudmFyIHJlSXNCaW5hcnkgPSAvXjBiWzAxXSskL2k7XG5cbi8qKiBVc2VkIHRvIGRldGVjdCBvY3RhbCBzdHJpbmcgdmFsdWVzLiAqL1xudmFyIHJlSXNPY3RhbCA9IC9eMG9bMC03XSskL2k7XG5cbi8qKiBCdWlsdC1pbiBtZXRob2QgcmVmZXJlbmNlcyB3aXRob3V0IGEgZGVwZW5kZW5jeSBvbiBgcm9vdGAuICovXG52YXIgZnJlZVBhcnNlSW50ID0gcGFyc2VJbnQ7XG5cbi8qKiBEZXRlY3QgZnJlZSB2YXJpYWJsZSBgZ2xvYmFsYCBmcm9tIE5vZGUuanMuICovXG52YXIgZnJlZUdsb2JhbCA9IHR5cGVvZiBnbG9iYWwgPT0gJ29iamVjdCcgJiYgZ2xvYmFsICYmIGdsb2JhbC5PYmplY3QgPT09IE9iamVjdCAmJiBnbG9iYWw7XG5cbi8qKiBEZXRlY3QgZnJlZSB2YXJpYWJsZSBgc2VsZmAuICovXG52YXIgZnJlZVNlbGYgPSB0eXBlb2Ygc2VsZiA9PSAnb2JqZWN0JyAmJiBzZWxmICYmIHNlbGYuT2JqZWN0ID09PSBPYmplY3QgJiYgc2VsZjtcblxuLyoqIFVzZWQgYXMgYSByZWZlcmVuY2UgdG8gdGhlIGdsb2JhbCBvYmplY3QuICovXG52YXIgcm9vdCA9IGZyZWVHbG9iYWwgfHwgZnJlZVNlbGYgfHwgRnVuY3Rpb24oJ3JldHVybiB0aGlzJykoKTtcblxuLyoqIFVzZWQgZm9yIGJ1aWx0LWluIG1ldGhvZCByZWZlcmVuY2VzLiAqL1xudmFyIG9iamVjdFByb3RvID0gT2JqZWN0LnByb3RvdHlwZTtcblxuLyoqXG4gKiBVc2VkIHRvIHJlc29sdmUgdGhlXG4gKiBbYHRvU3RyaW5nVGFnYF0oaHR0cDovL2VjbWEtaW50ZXJuYXRpb25hbC5vcmcvZWNtYS0yNjIvNy4wLyNzZWMtb2JqZWN0LnByb3RvdHlwZS50b3N0cmluZylcbiAqIG9mIHZhbHVlcy5cbiAqL1xudmFyIG9iamVjdFRvU3RyaW5nID0gb2JqZWN0UHJvdG8udG9TdHJpbmc7XG5cbi8qIEJ1aWx0LWluIG1ldGhvZCByZWZlcmVuY2VzIGZvciB0aG9zZSB3aXRoIHRoZSBzYW1lIG5hbWUgYXMgb3RoZXIgYGxvZGFzaGAgbWV0aG9kcy4gKi9cbnZhciBuYXRpdmVNYXggPSBNYXRoLm1heCxcbiAgICBuYXRpdmVNaW4gPSBNYXRoLm1pbjtcblxuLyoqXG4gKiBHZXRzIHRoZSB0aW1lc3RhbXAgb2YgdGhlIG51bWJlciBvZiBtaWxsaXNlY29uZHMgdGhhdCBoYXZlIGVsYXBzZWQgc2luY2VcbiAqIHRoZSBVbml4IGVwb2NoICgxIEphbnVhcnkgMTk3MCAwMDowMDowMCBVVEMpLlxuICpcbiAqIEBzdGF0aWNcbiAqIEBtZW1iZXJPZiBfXG4gKiBAc2luY2UgMi40LjBcbiAqIEBjYXRlZ29yeSBEYXRlXG4gKiBAcmV0dXJucyB7bnVtYmVyfSBSZXR1cm5zIHRoZSB0aW1lc3RhbXAuXG4gKiBAZXhhbXBsZVxuICpcbiAqIF8uZGVmZXIoZnVuY3Rpb24oc3RhbXApIHtcbiAqICAgY29uc29sZS5sb2coXy5ub3coKSAtIHN0YW1wKTtcbiAqIH0sIF8ubm93KCkpO1xuICogLy8gPT4gTG9ncyB0aGUgbnVtYmVyIG9mIG1pbGxpc2Vjb25kcyBpdCB0b29rIGZvciB0aGUgZGVmZXJyZWQgaW52b2NhdGlvbi5cbiAqL1xudmFyIG5vdyA9IGZ1bmN0aW9uKCkge1xuICByZXR1cm4gcm9vdC5EYXRlLm5vdygpO1xufTtcblxuLyoqXG4gKiBDcmVhdGVzIGEgZGVib3VuY2VkIGZ1bmN0aW9uIHRoYXQgZGVsYXlzIGludm9raW5nIGBmdW5jYCB1bnRpbCBhZnRlciBgd2FpdGBcbiAqIG1pbGxpc2Vjb25kcyBoYXZlIGVsYXBzZWQgc2luY2UgdGhlIGxhc3QgdGltZSB0aGUgZGVib3VuY2VkIGZ1bmN0aW9uIHdhc1xuICogaW52b2tlZC4gVGhlIGRlYm91bmNlZCBmdW5jdGlvbiBjb21lcyB3aXRoIGEgYGNhbmNlbGAgbWV0aG9kIHRvIGNhbmNlbFxuICogZGVsYXllZCBgZnVuY2AgaW52b2NhdGlvbnMgYW5kIGEgYGZsdXNoYCBtZXRob2QgdG8gaW1tZWRpYXRlbHkgaW52b2tlIHRoZW0uXG4gKiBQcm92aWRlIGBvcHRpb25zYCB0byBpbmRpY2F0ZSB3aGV0aGVyIGBmdW5jYCBzaG91bGQgYmUgaW52b2tlZCBvbiB0aGVcbiAqIGxlYWRpbmcgYW5kL29yIHRyYWlsaW5nIGVkZ2Ugb2YgdGhlIGB3YWl0YCB0aW1lb3V0LiBUaGUgYGZ1bmNgIGlzIGludm9rZWRcbiAqIHdpdGggdGhlIGxhc3QgYXJndW1lbnRzIHByb3ZpZGVkIHRvIHRoZSBkZWJvdW5jZWQgZnVuY3Rpb24uIFN1YnNlcXVlbnRcbiAqIGNhbGxzIHRvIHRoZSBkZWJvdW5jZWQgZnVuY3Rpb24gcmV0dXJuIHRoZSByZXN1bHQgb2YgdGhlIGxhc3QgYGZ1bmNgXG4gKiBpbnZvY2F0aW9uLlxuICpcbiAqICoqTm90ZToqKiBJZiBgbGVhZGluZ2AgYW5kIGB0cmFpbGluZ2Agb3B0aW9ucyBhcmUgYHRydWVgLCBgZnVuY2AgaXNcbiAqIGludm9rZWQgb24gdGhlIHRyYWlsaW5nIGVkZ2Ugb2YgdGhlIHRpbWVvdXQgb25seSBpZiB0aGUgZGVib3VuY2VkIGZ1bmN0aW9uXG4gKiBpcyBpbnZva2VkIG1vcmUgdGhhbiBvbmNlIGR1cmluZyB0aGUgYHdhaXRgIHRpbWVvdXQuXG4gKlxuICogSWYgYHdhaXRgIGlzIGAwYCBhbmQgYGxlYWRpbmdgIGlzIGBmYWxzZWAsIGBmdW5jYCBpbnZvY2F0aW9uIGlzIGRlZmVycmVkXG4gKiB1bnRpbCB0byB0aGUgbmV4dCB0aWNrLCBzaW1pbGFyIHRvIGBzZXRUaW1lb3V0YCB3aXRoIGEgdGltZW91dCBvZiBgMGAuXG4gKlxuICogU2VlIFtEYXZpZCBDb3JiYWNobydzIGFydGljbGVdKGh0dHBzOi8vY3NzLXRyaWNrcy5jb20vZGVib3VuY2luZy10aHJvdHRsaW5nLWV4cGxhaW5lZC1leGFtcGxlcy8pXG4gKiBmb3IgZGV0YWlscyBvdmVyIHRoZSBkaWZmZXJlbmNlcyBiZXR3ZWVuIGBfLmRlYm91bmNlYCBhbmQgYF8udGhyb3R0bGVgLlxuICpcbiAqIEBzdGF0aWNcbiAqIEBtZW1iZXJPZiBfXG4gKiBAc2luY2UgMC4xLjBcbiAqIEBjYXRlZ29yeSBGdW5jdGlvblxuICogQHBhcmFtIHtGdW5jdGlvbn0gZnVuYyBUaGUgZnVuY3Rpb24gdG8gZGVib3VuY2UuXG4gKiBAcGFyYW0ge251bWJlcn0gW3dhaXQ9MF0gVGhlIG51bWJlciBvZiBtaWxsaXNlY29uZHMgdG8gZGVsYXkuXG4gKiBAcGFyYW0ge09iamVjdH0gW29wdGlvbnM9e31dIFRoZSBvcHRpb25zIG9iamVjdC5cbiAqIEBwYXJhbSB7Ym9vbGVhbn0gW29wdGlvbnMubGVhZGluZz1mYWxzZV1cbiAqICBTcGVjaWZ5IGludm9raW5nIG9uIHRoZSBsZWFkaW5nIGVkZ2Ugb2YgdGhlIHRpbWVvdXQuXG4gKiBAcGFyYW0ge251bWJlcn0gW29wdGlvbnMubWF4V2FpdF1cbiAqICBUaGUgbWF4aW11bSB0aW1lIGBmdW5jYCBpcyBhbGxvd2VkIHRvIGJlIGRlbGF5ZWQgYmVmb3JlIGl0J3MgaW52b2tlZC5cbiAqIEBwYXJhbSB7Ym9vbGVhbn0gW29wdGlvbnMudHJhaWxpbmc9dHJ1ZV1cbiAqICBTcGVjaWZ5IGludm9raW5nIG9uIHRoZSB0cmFpbGluZyBlZGdlIG9mIHRoZSB0aW1lb3V0LlxuICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIHRoZSBuZXcgZGVib3VuY2VkIGZ1bmN0aW9uLlxuICogQGV4YW1wbGVcbiAqXG4gKiAvLyBBdm9pZCBjb3N0bHkgY2FsY3VsYXRpb25zIHdoaWxlIHRoZSB3aW5kb3cgc2l6ZSBpcyBpbiBmbHV4LlxuICogalF1ZXJ5KHdpbmRvdykub24oJ3Jlc2l6ZScsIF8uZGVib3VuY2UoY2FsY3VsYXRlTGF5b3V0LCAxNTApKTtcbiAqXG4gKiAvLyBJbnZva2UgYHNlbmRNYWlsYCB3aGVuIGNsaWNrZWQsIGRlYm91bmNpbmcgc3Vic2VxdWVudCBjYWxscy5cbiAqIGpRdWVyeShlbGVtZW50KS5vbignY2xpY2snLCBfLmRlYm91bmNlKHNlbmRNYWlsLCAzMDAsIHtcbiAqICAgJ2xlYWRpbmcnOiB0cnVlLFxuICogICAndHJhaWxpbmcnOiBmYWxzZVxuICogfSkpO1xuICpcbiAqIC8vIEVuc3VyZSBgYmF0Y2hMb2dgIGlzIGludm9rZWQgb25jZSBhZnRlciAxIHNlY29uZCBvZiBkZWJvdW5jZWQgY2FsbHMuXG4gKiB2YXIgZGVib3VuY2VkID0gXy5kZWJvdW5jZShiYXRjaExvZywgMjUwLCB7ICdtYXhXYWl0JzogMTAwMCB9KTtcbiAqIHZhciBzb3VyY2UgPSBuZXcgRXZlbnRTb3VyY2UoJy9zdHJlYW0nKTtcbiAqIGpRdWVyeShzb3VyY2UpLm9uKCdtZXNzYWdlJywgZGVib3VuY2VkKTtcbiAqXG4gKiAvLyBDYW5jZWwgdGhlIHRyYWlsaW5nIGRlYm91bmNlZCBpbnZvY2F0aW9uLlxuICogalF1ZXJ5KHdpbmRvdykub24oJ3BvcHN0YXRlJywgZGVib3VuY2VkLmNhbmNlbCk7XG4gKi9cbmZ1bmN0aW9uIGRlYm91bmNlKGZ1bmMsIHdhaXQsIG9wdGlvbnMpIHtcbiAgdmFyIGxhc3RBcmdzLFxuICAgICAgbGFzdFRoaXMsXG4gICAgICBtYXhXYWl0LFxuICAgICAgcmVzdWx0LFxuICAgICAgdGltZXJJZCxcbiAgICAgIGxhc3RDYWxsVGltZSxcbiAgICAgIGxhc3RJbnZva2VUaW1lID0gMCxcbiAgICAgIGxlYWRpbmcgPSBmYWxzZSxcbiAgICAgIG1heGluZyA9IGZhbHNlLFxuICAgICAgdHJhaWxpbmcgPSB0cnVlO1xuXG4gIGlmICh0eXBlb2YgZnVuYyAhPSAnZnVuY3Rpb24nKSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcihGVU5DX0VSUk9SX1RFWFQpO1xuICB9XG4gIHdhaXQgPSB0b051bWJlcih3YWl0KSB8fCAwO1xuICBpZiAoaXNPYmplY3Qob3B0aW9ucykpIHtcbiAgICBsZWFkaW5nID0gISFvcHRpb25zLmxlYWRpbmc7XG4gICAgbWF4aW5nID0gJ21heFdhaXQnIGluIG9wdGlvbnM7XG4gICAgbWF4V2FpdCA9IG1heGluZyA/IG5hdGl2ZU1heCh0b051bWJlcihvcHRpb25zLm1heFdhaXQpIHx8IDAsIHdhaXQpIDogbWF4V2FpdDtcbiAgICB0cmFpbGluZyA9ICd0cmFpbGluZycgaW4gb3B0aW9ucyA/ICEhb3B0aW9ucy50cmFpbGluZyA6IHRyYWlsaW5nO1xuICB9XG5cbiAgZnVuY3Rpb24gaW52b2tlRnVuYyh0aW1lKSB7XG4gICAgdmFyIGFyZ3MgPSBsYXN0QXJncyxcbiAgICAgICAgdGhpc0FyZyA9IGxhc3RUaGlzO1xuXG4gICAgbGFzdEFyZ3MgPSBsYXN0VGhpcyA9IHVuZGVmaW5lZDtcbiAgICBsYXN0SW52b2tlVGltZSA9IHRpbWU7XG4gICAgcmVzdWx0ID0gZnVuYy5hcHBseSh0aGlzQXJnLCBhcmdzKTtcbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG5cbiAgZnVuY3Rpb24gbGVhZGluZ0VkZ2UodGltZSkge1xuICAgIC8vIFJlc2V0IGFueSBgbWF4V2FpdGAgdGltZXIuXG4gICAgbGFzdEludm9rZVRpbWUgPSB0aW1lO1xuICAgIC8vIFN0YXJ0IHRoZSB0aW1lciBmb3IgdGhlIHRyYWlsaW5nIGVkZ2UuXG4gICAgdGltZXJJZCA9IHNldFRpbWVvdXQodGltZXJFeHBpcmVkLCB3YWl0KTtcbiAgICAvLyBJbnZva2UgdGhlIGxlYWRpbmcgZWRnZS5cbiAgICByZXR1cm4gbGVhZGluZyA/IGludm9rZUZ1bmModGltZSkgOiByZXN1bHQ7XG4gIH1cblxuICBmdW5jdGlvbiByZW1haW5pbmdXYWl0KHRpbWUpIHtcbiAgICB2YXIgdGltZVNpbmNlTGFzdENhbGwgPSB0aW1lIC0gbGFzdENhbGxUaW1lLFxuICAgICAgICB0aW1lU2luY2VMYXN0SW52b2tlID0gdGltZSAtIGxhc3RJbnZva2VUaW1lLFxuICAgICAgICByZXN1bHQgPSB3YWl0IC0gdGltZVNpbmNlTGFzdENhbGw7XG5cbiAgICByZXR1cm4gbWF4aW5nID8gbmF0aXZlTWluKHJlc3VsdCwgbWF4V2FpdCAtIHRpbWVTaW5jZUxhc3RJbnZva2UpIDogcmVzdWx0O1xuICB9XG5cbiAgZnVuY3Rpb24gc2hvdWxkSW52b2tlKHRpbWUpIHtcbiAgICB2YXIgdGltZVNpbmNlTGFzdENhbGwgPSB0aW1lIC0gbGFzdENhbGxUaW1lLFxuICAgICAgICB0aW1lU2luY2VMYXN0SW52b2tlID0gdGltZSAtIGxhc3RJbnZva2VUaW1lO1xuXG4gICAgLy8gRWl0aGVyIHRoaXMgaXMgdGhlIGZpcnN0IGNhbGwsIGFjdGl2aXR5IGhhcyBzdG9wcGVkIGFuZCB3ZSdyZSBhdCB0aGVcbiAgICAvLyB0cmFpbGluZyBlZGdlLCB0aGUgc3lzdGVtIHRpbWUgaGFzIGdvbmUgYmFja3dhcmRzIGFuZCB3ZSdyZSB0cmVhdGluZ1xuICAgIC8vIGl0IGFzIHRoZSB0cmFpbGluZyBlZGdlLCBvciB3ZSd2ZSBoaXQgdGhlIGBtYXhXYWl0YCBsaW1pdC5cbiAgICByZXR1cm4gKGxhc3RDYWxsVGltZSA9PT0gdW5kZWZpbmVkIHx8ICh0aW1lU2luY2VMYXN0Q2FsbCA+PSB3YWl0KSB8fFxuICAgICAgKHRpbWVTaW5jZUxhc3RDYWxsIDwgMCkgfHwgKG1heGluZyAmJiB0aW1lU2luY2VMYXN0SW52b2tlID49IG1heFdhaXQpKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIHRpbWVyRXhwaXJlZCgpIHtcbiAgICB2YXIgdGltZSA9IG5vdygpO1xuICAgIGlmIChzaG91bGRJbnZva2UodGltZSkpIHtcbiAgICAgIHJldHVybiB0cmFpbGluZ0VkZ2UodGltZSk7XG4gICAgfVxuICAgIC8vIFJlc3RhcnQgdGhlIHRpbWVyLlxuICAgIHRpbWVySWQgPSBzZXRUaW1lb3V0KHRpbWVyRXhwaXJlZCwgcmVtYWluaW5nV2FpdCh0aW1lKSk7XG4gIH1cblxuICBmdW5jdGlvbiB0cmFpbGluZ0VkZ2UodGltZSkge1xuICAgIHRpbWVySWQgPSB1bmRlZmluZWQ7XG5cbiAgICAvLyBPbmx5IGludm9rZSBpZiB3ZSBoYXZlIGBsYXN0QXJnc2Agd2hpY2ggbWVhbnMgYGZ1bmNgIGhhcyBiZWVuXG4gICAgLy8gZGVib3VuY2VkIGF0IGxlYXN0IG9uY2UuXG4gICAgaWYgKHRyYWlsaW5nICYmIGxhc3RBcmdzKSB7XG4gICAgICByZXR1cm4gaW52b2tlRnVuYyh0aW1lKTtcbiAgICB9XG4gICAgbGFzdEFyZ3MgPSBsYXN0VGhpcyA9IHVuZGVmaW5lZDtcbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG5cbiAgZnVuY3Rpb24gY2FuY2VsKCkge1xuICAgIGlmICh0aW1lcklkICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGNsZWFyVGltZW91dCh0aW1lcklkKTtcbiAgICB9XG4gICAgbGFzdEludm9rZVRpbWUgPSAwO1xuICAgIGxhc3RBcmdzID0gbGFzdENhbGxUaW1lID0gbGFzdFRoaXMgPSB0aW1lcklkID0gdW5kZWZpbmVkO1xuICB9XG5cbiAgZnVuY3Rpb24gZmx1c2goKSB7XG4gICAgcmV0dXJuIHRpbWVySWQgPT09IHVuZGVmaW5lZCA/IHJlc3VsdCA6IHRyYWlsaW5nRWRnZShub3coKSk7XG4gIH1cblxuICBmdW5jdGlvbiBkZWJvdW5jZWQoKSB7XG4gICAgdmFyIHRpbWUgPSBub3coKSxcbiAgICAgICAgaXNJbnZva2luZyA9IHNob3VsZEludm9rZSh0aW1lKTtcblxuICAgIGxhc3RBcmdzID0gYXJndW1lbnRzO1xuICAgIGxhc3RUaGlzID0gdGhpcztcbiAgICBsYXN0Q2FsbFRpbWUgPSB0aW1lO1xuXG4gICAgaWYgKGlzSW52b2tpbmcpIHtcbiAgICAgIGlmICh0aW1lcklkID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgcmV0dXJuIGxlYWRpbmdFZGdlKGxhc3RDYWxsVGltZSk7XG4gICAgICB9XG4gICAgICBpZiAobWF4aW5nKSB7XG4gICAgICAgIC8vIEhhbmRsZSBpbnZvY2F0aW9ucyBpbiBhIHRpZ2h0IGxvb3AuXG4gICAgICAgIHRpbWVySWQgPSBzZXRUaW1lb3V0KHRpbWVyRXhwaXJlZCwgd2FpdCk7XG4gICAgICAgIHJldHVybiBpbnZva2VGdW5jKGxhc3RDYWxsVGltZSk7XG4gICAgICB9XG4gICAgfVxuICAgIGlmICh0aW1lcklkID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHRpbWVySWQgPSBzZXRUaW1lb3V0KHRpbWVyRXhwaXJlZCwgd2FpdCk7XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cbiAgZGVib3VuY2VkLmNhbmNlbCA9IGNhbmNlbDtcbiAgZGVib3VuY2VkLmZsdXNoID0gZmx1c2g7XG4gIHJldHVybiBkZWJvdW5jZWQ7XG59XG5cbi8qKlxuICogQ3JlYXRlcyBhIHRocm90dGxlZCBmdW5jdGlvbiB0aGF0IG9ubHkgaW52b2tlcyBgZnVuY2AgYXQgbW9zdCBvbmNlIHBlclxuICogZXZlcnkgYHdhaXRgIG1pbGxpc2Vjb25kcy4gVGhlIHRocm90dGxlZCBmdW5jdGlvbiBjb21lcyB3aXRoIGEgYGNhbmNlbGBcbiAqIG1ldGhvZCB0byBjYW5jZWwgZGVsYXllZCBgZnVuY2AgaW52b2NhdGlvbnMgYW5kIGEgYGZsdXNoYCBtZXRob2QgdG9cbiAqIGltbWVkaWF0ZWx5IGludm9rZSB0aGVtLiBQcm92aWRlIGBvcHRpb25zYCB0byBpbmRpY2F0ZSB3aGV0aGVyIGBmdW5jYFxuICogc2hvdWxkIGJlIGludm9rZWQgb24gdGhlIGxlYWRpbmcgYW5kL29yIHRyYWlsaW5nIGVkZ2Ugb2YgdGhlIGB3YWl0YFxuICogdGltZW91dC4gVGhlIGBmdW5jYCBpcyBpbnZva2VkIHdpdGggdGhlIGxhc3QgYXJndW1lbnRzIHByb3ZpZGVkIHRvIHRoZVxuICogdGhyb3R0bGVkIGZ1bmN0aW9uLiBTdWJzZXF1ZW50IGNhbGxzIHRvIHRoZSB0aHJvdHRsZWQgZnVuY3Rpb24gcmV0dXJuIHRoZVxuICogcmVzdWx0IG9mIHRoZSBsYXN0IGBmdW5jYCBpbnZvY2F0aW9uLlxuICpcbiAqICoqTm90ZToqKiBJZiBgbGVhZGluZ2AgYW5kIGB0cmFpbGluZ2Agb3B0aW9ucyBhcmUgYHRydWVgLCBgZnVuY2AgaXNcbiAqIGludm9rZWQgb24gdGhlIHRyYWlsaW5nIGVkZ2Ugb2YgdGhlIHRpbWVvdXQgb25seSBpZiB0aGUgdGhyb3R0bGVkIGZ1bmN0aW9uXG4gKiBpcyBpbnZva2VkIG1vcmUgdGhhbiBvbmNlIGR1cmluZyB0aGUgYHdhaXRgIHRpbWVvdXQuXG4gKlxuICogSWYgYHdhaXRgIGlzIGAwYCBhbmQgYGxlYWRpbmdgIGlzIGBmYWxzZWAsIGBmdW5jYCBpbnZvY2F0aW9uIGlzIGRlZmVycmVkXG4gKiB1bnRpbCB0byB0aGUgbmV4dCB0aWNrLCBzaW1pbGFyIHRvIGBzZXRUaW1lb3V0YCB3aXRoIGEgdGltZW91dCBvZiBgMGAuXG4gKlxuICogU2VlIFtEYXZpZCBDb3JiYWNobydzIGFydGljbGVdKGh0dHBzOi8vY3NzLXRyaWNrcy5jb20vZGVib3VuY2luZy10aHJvdHRsaW5nLWV4cGxhaW5lZC1leGFtcGxlcy8pXG4gKiBmb3IgZGV0YWlscyBvdmVyIHRoZSBkaWZmZXJlbmNlcyBiZXR3ZWVuIGBfLnRocm90dGxlYCBhbmQgYF8uZGVib3VuY2VgLlxuICpcbiAqIEBzdGF0aWNcbiAqIEBtZW1iZXJPZiBfXG4gKiBAc2luY2UgMC4xLjBcbiAqIEBjYXRlZ29yeSBGdW5jdGlvblxuICogQHBhcmFtIHtGdW5jdGlvbn0gZnVuYyBUaGUgZnVuY3Rpb24gdG8gdGhyb3R0bGUuXG4gKiBAcGFyYW0ge251bWJlcn0gW3dhaXQ9MF0gVGhlIG51bWJlciBvZiBtaWxsaXNlY29uZHMgdG8gdGhyb3R0bGUgaW52b2NhdGlvbnMgdG8uXG4gKiBAcGFyYW0ge09iamVjdH0gW29wdGlvbnM9e31dIFRoZSBvcHRpb25zIG9iamVjdC5cbiAqIEBwYXJhbSB7Ym9vbGVhbn0gW29wdGlvbnMubGVhZGluZz10cnVlXVxuICogIFNwZWNpZnkgaW52b2tpbmcgb24gdGhlIGxlYWRpbmcgZWRnZSBvZiB0aGUgdGltZW91dC5cbiAqIEBwYXJhbSB7Ym9vbGVhbn0gW29wdGlvbnMudHJhaWxpbmc9dHJ1ZV1cbiAqICBTcGVjaWZ5IGludm9raW5nIG9uIHRoZSB0cmFpbGluZyBlZGdlIG9mIHRoZSB0aW1lb3V0LlxuICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIHRoZSBuZXcgdGhyb3R0bGVkIGZ1bmN0aW9uLlxuICogQGV4YW1wbGVcbiAqXG4gKiAvLyBBdm9pZCBleGNlc3NpdmVseSB1cGRhdGluZyB0aGUgcG9zaXRpb24gd2hpbGUgc2Nyb2xsaW5nLlxuICogalF1ZXJ5KHdpbmRvdykub24oJ3Njcm9sbCcsIF8udGhyb3R0bGUodXBkYXRlUG9zaXRpb24sIDEwMCkpO1xuICpcbiAqIC8vIEludm9rZSBgcmVuZXdUb2tlbmAgd2hlbiB0aGUgY2xpY2sgZXZlbnQgaXMgZmlyZWQsIGJ1dCBub3QgbW9yZSB0aGFuIG9uY2UgZXZlcnkgNSBtaW51dGVzLlxuICogdmFyIHRocm90dGxlZCA9IF8udGhyb3R0bGUocmVuZXdUb2tlbiwgMzAwMDAwLCB7ICd0cmFpbGluZyc6IGZhbHNlIH0pO1xuICogalF1ZXJ5KGVsZW1lbnQpLm9uKCdjbGljaycsIHRocm90dGxlZCk7XG4gKlxuICogLy8gQ2FuY2VsIHRoZSB0cmFpbGluZyB0aHJvdHRsZWQgaW52b2NhdGlvbi5cbiAqIGpRdWVyeSh3aW5kb3cpLm9uKCdwb3BzdGF0ZScsIHRocm90dGxlZC5jYW5jZWwpO1xuICovXG5mdW5jdGlvbiB0aHJvdHRsZShmdW5jLCB3YWl0LCBvcHRpb25zKSB7XG4gIHZhciBsZWFkaW5nID0gdHJ1ZSxcbiAgICAgIHRyYWlsaW5nID0gdHJ1ZTtcblxuICBpZiAodHlwZW9mIGZ1bmMgIT0gJ2Z1bmN0aW9uJykge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoRlVOQ19FUlJPUl9URVhUKTtcbiAgfVxuICBpZiAoaXNPYmplY3Qob3B0aW9ucykpIHtcbiAgICBsZWFkaW5nID0gJ2xlYWRpbmcnIGluIG9wdGlvbnMgPyAhIW9wdGlvbnMubGVhZGluZyA6IGxlYWRpbmc7XG4gICAgdHJhaWxpbmcgPSAndHJhaWxpbmcnIGluIG9wdGlvbnMgPyAhIW9wdGlvbnMudHJhaWxpbmcgOiB0cmFpbGluZztcbiAgfVxuICByZXR1cm4gZGVib3VuY2UoZnVuYywgd2FpdCwge1xuICAgICdsZWFkaW5nJzogbGVhZGluZyxcbiAgICAnbWF4V2FpdCc6IHdhaXQsXG4gICAgJ3RyYWlsaW5nJzogdHJhaWxpbmdcbiAgfSk7XG59XG5cbi8qKlxuICogQ2hlY2tzIGlmIGB2YWx1ZWAgaXMgdGhlXG4gKiBbbGFuZ3VhZ2UgdHlwZV0oaHR0cDovL3d3dy5lY21hLWludGVybmF0aW9uYWwub3JnL2VjbWEtMjYyLzcuMC8jc2VjLWVjbWFzY3JpcHQtbGFuZ3VhZ2UtdHlwZXMpXG4gKiBvZiBgT2JqZWN0YC4gKGUuZy4gYXJyYXlzLCBmdW5jdGlvbnMsIG9iamVjdHMsIHJlZ2V4ZXMsIGBuZXcgTnVtYmVyKDApYCwgYW5kIGBuZXcgU3RyaW5nKCcnKWApXG4gKlxuICogQHN0YXRpY1xuICogQG1lbWJlck9mIF9cbiAqIEBzaW5jZSAwLjEuMFxuICogQGNhdGVnb3J5IExhbmdcbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrLlxuICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgYW4gb2JqZWN0LCBlbHNlIGBmYWxzZWAuXG4gKiBAZXhhbXBsZVxuICpcbiAqIF8uaXNPYmplY3Qoe30pO1xuICogLy8gPT4gdHJ1ZVxuICpcbiAqIF8uaXNPYmplY3QoWzEsIDIsIDNdKTtcbiAqIC8vID0+IHRydWVcbiAqXG4gKiBfLmlzT2JqZWN0KF8ubm9vcCk7XG4gKiAvLyA9PiB0cnVlXG4gKlxuICogXy5pc09iamVjdChudWxsKTtcbiAqIC8vID0+IGZhbHNlXG4gKi9cbmZ1bmN0aW9uIGlzT2JqZWN0KHZhbHVlKSB7XG4gIHZhciB0eXBlID0gdHlwZW9mIHZhbHVlO1xuICByZXR1cm4gISF2YWx1ZSAmJiAodHlwZSA9PSAnb2JqZWN0JyB8fCB0eXBlID09ICdmdW5jdGlvbicpO1xufVxuXG4vKipcbiAqIENoZWNrcyBpZiBgdmFsdWVgIGlzIG9iamVjdC1saWtlLiBBIHZhbHVlIGlzIG9iamVjdC1saWtlIGlmIGl0J3Mgbm90IGBudWxsYFxuICogYW5kIGhhcyBhIGB0eXBlb2ZgIHJlc3VsdCBvZiBcIm9iamVjdFwiLlxuICpcbiAqIEBzdGF0aWNcbiAqIEBtZW1iZXJPZiBfXG4gKiBAc2luY2UgNC4wLjBcbiAqIEBjYXRlZ29yeSBMYW5nXG4gKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay5cbiAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIG9iamVjdC1saWtlLCBlbHNlIGBmYWxzZWAuXG4gKiBAZXhhbXBsZVxuICpcbiAqIF8uaXNPYmplY3RMaWtlKHt9KTtcbiAqIC8vID0+IHRydWVcbiAqXG4gKiBfLmlzT2JqZWN0TGlrZShbMSwgMiwgM10pO1xuICogLy8gPT4gdHJ1ZVxuICpcbiAqIF8uaXNPYmplY3RMaWtlKF8ubm9vcCk7XG4gKiAvLyA9PiBmYWxzZVxuICpcbiAqIF8uaXNPYmplY3RMaWtlKG51bGwpO1xuICogLy8gPT4gZmFsc2VcbiAqL1xuZnVuY3Rpb24gaXNPYmplY3RMaWtlKHZhbHVlKSB7XG4gIHJldHVybiAhIXZhbHVlICYmIHR5cGVvZiB2YWx1ZSA9PSAnb2JqZWN0Jztcbn1cblxuLyoqXG4gKiBDaGVja3MgaWYgYHZhbHVlYCBpcyBjbGFzc2lmaWVkIGFzIGEgYFN5bWJvbGAgcHJpbWl0aXZlIG9yIG9iamVjdC5cbiAqXG4gKiBAc3RhdGljXG4gKiBAbWVtYmVyT2YgX1xuICogQHNpbmNlIDQuMC4wXG4gKiBAY2F0ZWdvcnkgTGFuZ1xuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBhIHN5bWJvbCwgZWxzZSBgZmFsc2VgLlxuICogQGV4YW1wbGVcbiAqXG4gKiBfLmlzU3ltYm9sKFN5bWJvbC5pdGVyYXRvcik7XG4gKiAvLyA9PiB0cnVlXG4gKlxuICogXy5pc1N5bWJvbCgnYWJjJyk7XG4gKiAvLyA9PiBmYWxzZVxuICovXG5mdW5jdGlvbiBpc1N5bWJvbCh2YWx1ZSkge1xuICByZXR1cm4gdHlwZW9mIHZhbHVlID09ICdzeW1ib2wnIHx8XG4gICAgKGlzT2JqZWN0TGlrZSh2YWx1ZSkgJiYgb2JqZWN0VG9TdHJpbmcuY2FsbCh2YWx1ZSkgPT0gc3ltYm9sVGFnKTtcbn1cblxuLyoqXG4gKiBDb252ZXJ0cyBgdmFsdWVgIHRvIGEgbnVtYmVyLlxuICpcbiAqIEBzdGF0aWNcbiAqIEBtZW1iZXJPZiBfXG4gKiBAc2luY2UgNC4wLjBcbiAqIEBjYXRlZ29yeSBMYW5nXG4gKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBwcm9jZXNzLlxuICogQHJldHVybnMge251bWJlcn0gUmV0dXJucyB0aGUgbnVtYmVyLlxuICogQGV4YW1wbGVcbiAqXG4gKiBfLnRvTnVtYmVyKDMuMik7XG4gKiAvLyA9PiAzLjJcbiAqXG4gKiBfLnRvTnVtYmVyKE51bWJlci5NSU5fVkFMVUUpO1xuICogLy8gPT4gNWUtMzI0XG4gKlxuICogXy50b051bWJlcihJbmZpbml0eSk7XG4gKiAvLyA9PiBJbmZpbml0eVxuICpcbiAqIF8udG9OdW1iZXIoJzMuMicpO1xuICogLy8gPT4gMy4yXG4gKi9cbmZ1bmN0aW9uIHRvTnVtYmVyKHZhbHVlKSB7XG4gIGlmICh0eXBlb2YgdmFsdWUgPT0gJ251bWJlcicpIHtcbiAgICByZXR1cm4gdmFsdWU7XG4gIH1cbiAgaWYgKGlzU3ltYm9sKHZhbHVlKSkge1xuICAgIHJldHVybiBOQU47XG4gIH1cbiAgaWYgKGlzT2JqZWN0KHZhbHVlKSkge1xuICAgIHZhciBvdGhlciA9IHR5cGVvZiB2YWx1ZS52YWx1ZU9mID09ICdmdW5jdGlvbicgPyB2YWx1ZS52YWx1ZU9mKCkgOiB2YWx1ZTtcbiAgICB2YWx1ZSA9IGlzT2JqZWN0KG90aGVyKSA/IChvdGhlciArICcnKSA6IG90aGVyO1xuICB9XG4gIGlmICh0eXBlb2YgdmFsdWUgIT0gJ3N0cmluZycpIHtcbiAgICByZXR1cm4gdmFsdWUgPT09IDAgPyB2YWx1ZSA6ICt2YWx1ZTtcbiAgfVxuICB2YWx1ZSA9IHZhbHVlLnJlcGxhY2UocmVUcmltLCAnJyk7XG4gIHZhciBpc0JpbmFyeSA9IHJlSXNCaW5hcnkudGVzdCh2YWx1ZSk7XG4gIHJldHVybiAoaXNCaW5hcnkgfHwgcmVJc09jdGFsLnRlc3QodmFsdWUpKVxuICAgID8gZnJlZVBhcnNlSW50KHZhbHVlLnNsaWNlKDIpLCBpc0JpbmFyeSA/IDIgOiA4KVxuICAgIDogKHJlSXNCYWRIZXgudGVzdCh2YWx1ZSkgPyBOQU4gOiArdmFsdWUpO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IHRocm90dGxlO1xuIiwidmFyIGc7XHJcblxyXG4vLyBUaGlzIHdvcmtzIGluIG5vbi1zdHJpY3QgbW9kZVxyXG5nID0gKGZ1bmN0aW9uKCkge1xyXG5cdHJldHVybiB0aGlzO1xyXG59KSgpO1xyXG5cclxudHJ5IHtcclxuXHQvLyBUaGlzIHdvcmtzIGlmIGV2YWwgaXMgYWxsb3dlZCAoc2VlIENTUClcclxuXHRnID0gZyB8fCBGdW5jdGlvbihcInJldHVybiB0aGlzXCIpKCkgfHwgKDEsIGV2YWwpKFwidGhpc1wiKTtcclxufSBjYXRjaCAoZSkge1xyXG5cdC8vIFRoaXMgd29ya3MgaWYgdGhlIHdpbmRvdyByZWZlcmVuY2UgaXMgYXZhaWxhYmxlXHJcblx0aWYgKHR5cGVvZiB3aW5kb3cgPT09IFwib2JqZWN0XCIpIGcgPSB3aW5kb3c7XHJcbn1cclxuXHJcbi8vIGcgY2FuIHN0aWxsIGJlIHVuZGVmaW5lZCwgYnV0IG5vdGhpbmcgdG8gZG8gYWJvdXQgaXQuLi5cclxuLy8gV2UgcmV0dXJuIHVuZGVmaW5lZCwgaW5zdGVhZCBvZiBub3RoaW5nIGhlcmUsIHNvIGl0J3NcclxuLy8gZWFzaWVyIHRvIGhhbmRsZSB0aGlzIGNhc2UuIGlmKCFnbG9iYWwpIHsgLi4ufVxyXG5cclxubW9kdWxlLmV4cG9ydHMgPSBnO1xyXG4iLCIvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICogIENvcHlyaWdodCAoYykgTWljcm9zb2Z0IENvcnBvcmF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICogIExpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgTGljZW5zZS4gU2VlIExpY2Vuc2UudHh0IGluIHRoZSBwcm9qZWN0IHJvb3QgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24uXG4gKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi9cbmltcG9ydCB7IGdldEVsZW1lbnRzRm9yU291cmNlTGluZSB9IGZyb20gJy4vc2Nyb2xsLXN5bmMnO1xuXG5leHBvcnQgY2xhc3MgQWN0aXZlTGluZU1hcmtlciB7XG5cdHByaXZhdGUgX2N1cnJlbnQ6IGFueTtcblxuXHRvbkRpZENoYW5nZVRleHRFZGl0b3JTZWxlY3Rpb24obGluZTogbnVtYmVyKSB7XG5cdFx0Y29uc3QgeyBwcmV2aW91cyB9ID0gZ2V0RWxlbWVudHNGb3JTb3VyY2VMaW5lKGxpbmUpO1xuXHRcdHRoaXMuX3VwZGF0ZShwcmV2aW91cyAmJiBwcmV2aW91cy5lbGVtZW50KTtcblx0fVxuXG5cdF91cGRhdGUoYmVmb3JlOiBIVE1MRWxlbWVudCB8IHVuZGVmaW5lZCkge1xuXHRcdHRoaXMuX3VubWFya0FjdGl2ZUVsZW1lbnQodGhpcy5fY3VycmVudCk7XG5cdFx0dGhpcy5fbWFya0FjdGl2ZUVsZW1lbnQoYmVmb3JlKTtcblx0XHR0aGlzLl9jdXJyZW50ID0gYmVmb3JlO1xuXHR9XG5cblx0X3VubWFya0FjdGl2ZUVsZW1lbnQoZWxlbWVudDogSFRNTEVsZW1lbnQgfCB1bmRlZmluZWQpIHtcblx0XHRpZiAoIWVsZW1lbnQpIHtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cdFx0ZWxlbWVudC5jbGFzc05hbWUgPSBlbGVtZW50LmNsYXNzTmFtZS5yZXBsYWNlKC9cXGJjb2RlLWFjdGl2ZS1saW5lXFxiL2csICcnKTtcblx0fVxuXG5cdF9tYXJrQWN0aXZlRWxlbWVudChlbGVtZW50OiBIVE1MRWxlbWVudCB8IHVuZGVmaW5lZCkge1xuXHRcdGlmICghZWxlbWVudCkge1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblx0XHRlbGVtZW50LmNsYXNzTmFtZSArPSAnIGNvZGUtYWN0aXZlLWxpbmUnO1xuXHR9XG59IiwiLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAqICBDb3B5cmlnaHQgKGMpIE1pY3Jvc29mdCBDb3Jwb3JhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqICBMaWNlbnNlZCB1bmRlciB0aGUgTUlUIExpY2Vuc2UuIFNlZSBMaWNlbnNlLnR4dCBpbiB0aGUgcHJvamVjdCByb290IGZvciBsaWNlbnNlIGluZm9ybWF0aW9uLlxuICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovXG5cbmV4cG9ydCBmdW5jdGlvbiBvbmNlRG9jdW1lbnRMb2FkZWQoZjogKCkgPT4gdm9pZCkge1xuXHRpZiAoZG9jdW1lbnQucmVhZHlTdGF0ZSA9PT0gJ2xvYWRpbmcnIHx8IGRvY3VtZW50LnJlYWR5U3RhdGUgPT09ICd1bmluaXRpYWxpemVkJykge1xuXHRcdGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ0RPTUNvbnRlbnRMb2FkZWQnLCBmKTtcblx0fSBlbHNlIHtcblx0XHRmKCk7XG5cdH1cbn0iLCIvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICogIENvcHlyaWdodCAoYykgTWljcm9zb2Z0IENvcnBvcmF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICogIExpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgTGljZW5zZS4gU2VlIExpY2Vuc2UudHh0IGluIHRoZSBwcm9qZWN0IHJvb3QgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24uXG4gKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi9cblxuaW1wb3J0IHsgZ2V0U2V0dGluZ3MgfSBmcm9tICcuL3NldHRpbmdzJztcbmltcG9ydCB7IHBvc3RDb21tYW5kLCBwb3N0TWVzc2FnZSB9IGZyb20gJy4vbWVzc2FnaW5nJztcbmltcG9ydCB7IG9uY2VEb2N1bWVudExvYWRlZCB9IGZyb20gJy4vZXZlbnRzJztcbmltcG9ydCB7IGdldEVkaXRvckxpbmVOdW1iZXJGb3JQYWdlT2Zmc2V0LCBzY3JvbGxUb1JldmVhbFNvdXJjZUxpbmUgfSBmcm9tICcuL3Njcm9sbC1zeW5jJztcbmltcG9ydCB7IEFjdGl2ZUxpbmVNYXJrZXIgfSBmcm9tICcuL2FjdGl2ZUxpbmVNYXJrZXInO1xuaW1wb3J0IHRocm90dGxlID0gcmVxdWlyZSgnbG9kYXNoLnRocm90dGxlJyk7XG5cbnZhciBzY3JvbGxEaXNhYmxlZCA9IHRydWU7XG5jb25zdCBtYXJrZXIgPSBuZXcgQWN0aXZlTGluZU1hcmtlcigpO1xuY29uc3Qgc2V0dGluZ3MgPSBnZXRTZXR0aW5ncygpO1xuXG5vbmNlRG9jdW1lbnRMb2FkZWQoKCkgPT4ge1xuXHRpZiAoc2V0dGluZ3Muc2Nyb2xsUHJldmlld1dpdGhFZGl0b3IpIHtcblx0XHRzZXRUaW1lb3V0KCgpID0+IHtcblx0XHRcdGNvbnN0IGluaXRpYWxMaW5lID0gK3NldHRpbmdzLmxpbmU7XG5cdFx0XHRpZiAoIWlzTmFOKGluaXRpYWxMaW5lKSkge1xuXHRcdFx0XHRzY3JvbGxEaXNhYmxlZCA9IHRydWU7XG5cdFx0XHRcdHNjcm9sbFRvUmV2ZWFsU291cmNlTGluZShpbml0aWFsTGluZSk7XG5cdFx0XHR9XG5cdFx0fSwgMCk7XG5cdH1cbn0pO1xuXG5jb25zdCBvblVwZGF0ZVZpZXcgPSAoKCkgPT4ge1xuXHRjb25zdCBkb1Njcm9sbCA9IHRocm90dGxlKChsaW5lOiBudW1iZXIpID0+IHtcblx0XHRzY3JvbGxEaXNhYmxlZCA9IHRydWU7XG5cdFx0c2Nyb2xsVG9SZXZlYWxTb3VyY2VMaW5lKGxpbmUpO1xuXHR9LCA1MCk7XG5cblx0cmV0dXJuIChsaW5lOiBudW1iZXIsIHNldHRpbmdzOiBhbnkpID0+IHtcblx0XHRpZiAoIWlzTmFOKGxpbmUpKSB7XG5cdFx0XHRzZXR0aW5ncy5saW5lID0gbGluZTtcblx0XHRcdGRvU2Nyb2xsKGxpbmUpO1xuXHRcdH1cblx0fTtcbn0pKCk7XG5cbndpbmRvdy5hZGRFdmVudExpc3RlbmVyKCdyZXNpemUnLCAoKSA9PiB7XG5cdHNjcm9sbERpc2FibGVkID0gdHJ1ZTtcbn0sIHRydWUpO1xuXG53aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcignbWVzc2FnZScsIGV2ZW50ID0+IHtcblx0aWYgKGV2ZW50LmRhdGEuc291cmNlICE9PSBzZXR0aW5ncy5zb3VyY2UpIHtcblx0XHRyZXR1cm47XG5cdH1cblxuXHRzd2l0Y2ggKGV2ZW50LmRhdGEudHlwZSkge1xuXHRcdGNhc2UgJ29uRGlkQ2hhbmdlVGV4dEVkaXRvclNlbGVjdGlvbic6XG5cdFx0XHRtYXJrZXIub25EaWRDaGFuZ2VUZXh0RWRpdG9yU2VsZWN0aW9uKGV2ZW50LmRhdGEubGluZSk7XG5cdFx0XHRicmVhaztcblxuXHRcdGNhc2UgJ3VwZGF0ZVZpZXcnOlxuXHRcdFx0b25VcGRhdGVWaWV3KGV2ZW50LmRhdGEubGluZSwgc2V0dGluZ3MpO1xuXHRcdFx0YnJlYWs7XG5cdH1cbn0sIGZhbHNlKTtcblxuZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignZGJsY2xpY2snLCBldmVudCA9PiB7XG5cdGlmICghc2V0dGluZ3MuZG91YmxlQ2xpY2tUb1N3aXRjaFRvRWRpdG9yKSB7XG5cdFx0cmV0dXJuO1xuXHR9XG5cblx0Ly8gSWdub3JlIGNsaWNrcyBvbiBsaW5rc1xuXHRmb3IgKGxldCBub2RlID0gZXZlbnQudGFyZ2V0IGFzIEhUTUxFbGVtZW50OyBub2RlOyBub2RlID0gbm9kZS5wYXJlbnROb2RlIGFzIEhUTUxFbGVtZW50KSB7XG5cdFx0aWYgKG5vZGUudGFnTmFtZSA9PT0gJ0EnKSB7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXHR9XG5cblx0Y29uc3Qgb2Zmc2V0ID0gZXZlbnQucGFnZVk7XG5cdGNvbnN0IGxpbmUgPSBnZXRFZGl0b3JMaW5lTnVtYmVyRm9yUGFnZU9mZnNldChvZmZzZXQpO1xuXHRpZiAodHlwZW9mIGxpbmUgPT09ICdudW1iZXInICYmICFpc05hTihsaW5lKSkge1xuXHRcdHBvc3RNZXNzYWdlKCdkaWRDbGljaycsIHsgbGluZTogTWF0aC5mbG9vcihsaW5lKSB9KTtcblx0fVxufSk7XG5cbmRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgZXZlbnQgPT4ge1xuXHRpZiAoIWV2ZW50KSB7XG5cdFx0cmV0dXJuO1xuXHR9XG5cblx0bGV0IG5vZGU6IGFueSA9IGV2ZW50LnRhcmdldDtcblx0d2hpbGUgKG5vZGUpIHtcblx0XHRpZiAobm9kZS50YWdOYW1lICYmIG5vZGUudGFnTmFtZSA9PT0gJ0EnICYmIG5vZGUuaHJlZikge1xuXHRcdFx0aWYgKG5vZGUuZ2V0QXR0cmlidXRlKCdocmVmJykuc3RhcnRzV2l0aCgnIycpKSB7XG5cdFx0XHRcdGJyZWFrO1xuXHRcdFx0fVxuXHRcdFx0aWYgKG5vZGUuaHJlZi5zdGFydHNXaXRoKCdmaWxlOi8vJykgfHwgbm9kZS5ocmVmLnN0YXJ0c1dpdGgoJ3ZzY29kZS1yZXNvdXJjZTonKSkge1xuXHRcdFx0XHRjb25zdCBbcGF0aCwgZnJhZ21lbnRdID0gbm9kZS5ocmVmLnJlcGxhY2UoL14oZmlsZTpcXC9cXC98dnNjb2RlLXJlc291cmNlOikvaSwgJycpLnNwbGl0KCcjJyk7XG5cdFx0XHRcdHBvc3RDb21tYW5kKCdfbWFya2Rvd24ub3BlbkRvY3VtZW50TGluaycsIFt7IHBhdGgsIGZyYWdtZW50IH1dKTtcblx0XHRcdFx0ZXZlbnQucHJldmVudERlZmF1bHQoKTtcblx0XHRcdFx0ZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG5cdFx0XHRcdGJyZWFrO1xuXHRcdFx0fVxuXHRcdFx0YnJlYWs7XG5cdFx0fVxuXHRcdG5vZGUgPSBub2RlLnBhcmVudE5vZGU7XG5cdH1cbn0sIHRydWUpO1xuXG5pZiAoc2V0dGluZ3Muc2Nyb2xsRWRpdG9yV2l0aFByZXZpZXcpIHtcblx0d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ3Njcm9sbCcsIHRocm90dGxlKCgpID0+IHtcblx0XHRpZiAoc2Nyb2xsRGlzYWJsZWQpIHtcblx0XHRcdHNjcm9sbERpc2FibGVkID0gZmFsc2U7XG5cdFx0fSBlbHNlIHtcblx0XHRcdGNvbnN0IGxpbmUgPSBnZXRFZGl0b3JMaW5lTnVtYmVyRm9yUGFnZU9mZnNldCh3aW5kb3cuc2Nyb2xsWSk7XG5cdFx0XHRpZiAodHlwZW9mIGxpbmUgPT09ICdudW1iZXInICYmICFpc05hTihsaW5lKSkge1xuXHRcdFx0XHRwb3N0TWVzc2FnZSgncmV2ZWFsTGluZScsIHsgbGluZSB9KTtcblx0XHRcdH1cblx0XHR9XG5cdH0sIDUwKSk7XG59IiwiLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAqICBDb3B5cmlnaHQgKGMpIE1pY3Jvc29mdCBDb3Jwb3JhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqICBMaWNlbnNlZCB1bmRlciB0aGUgTUlUIExpY2Vuc2UuIFNlZSBMaWNlbnNlLnR4dCBpbiB0aGUgcHJvamVjdCByb290IGZvciBsaWNlbnNlIGluZm9ybWF0aW9uLlxuICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovXG5cbmltcG9ydCB7IGdldFNldHRpbmdzIH0gZnJvbSAnLi9zZXR0aW5ncyc7XG5cbmRlY2xhcmUgdmFyIHZzY29kZTogYW55O1xuXG4vKipcbiAqIFBvc3QgYSBtZXNzYWdlIHRvIHRoZSBtYXJrZG93biBleHRlbnNpb25cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHBvc3RNZXNzYWdlKHR5cGU6IHN0cmluZywgYm9keTogb2JqZWN0KSB7XG5cdHZzY29kZS5wb3N0TWVzc2FnZSh7XG5cdFx0dHlwZSxcblx0XHRzb3VyY2U6IGdldFNldHRpbmdzKCkuc291cmNlLFxuXHRcdGJvZHlcblx0fSk7XG59XG5cbi8qKlxuICogUG9zdCBhIGNvbW1hbmQgdG8gYmUgZXhlY3V0ZWQgdG8gdGhlIG1hcmtkb3duIGV4dGVuc2lvblxuICovXG5leHBvcnQgZnVuY3Rpb24gcG9zdENvbW1hbmQoY29tbWFuZDogc3RyaW5nLCBhcmdzOiBhbnlbXSkge1xuXHRwb3N0TWVzc2FnZSgnY29tbWFuZCcsIHsgY29tbWFuZCwgYXJncyB9KTtcbn1cbiIsIi8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gKiAgQ29weXJpZ2h0IChjKSBNaWNyb3NvZnQgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKiAgTGljZW5zZWQgdW5kZXIgdGhlIE1JVCBMaWNlbnNlLiBTZWUgTGljZW5zZS50eHQgaW4gdGhlIHByb2plY3Qgcm9vdCBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbi5cbiAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qL1xuXG5pbXBvcnQgeyBnZXRTZXR0aW5ncyB9IGZyb20gJy4vc2V0dGluZ3MnO1xuXG5cbmZ1bmN0aW9uIGNsYW1wKG1pbjogbnVtYmVyLCBtYXg6IG51bWJlciwgdmFsdWU6IG51bWJlcikge1xuXHRyZXR1cm4gTWF0aC5taW4obWF4LCBNYXRoLm1heChtaW4sIHZhbHVlKSk7XG59XG5cbmZ1bmN0aW9uIGNsYW1wTGluZShsaW5lOiBudW1iZXIpIHtcblx0cmV0dXJuIGNsYW1wKDAsIGdldFNldHRpbmdzKCkubGluZUNvdW50IC0gMSwgbGluZSk7XG59XG5cblxuZXhwb3J0IGludGVyZmFjZSBDb2RlTGluZUVsZW1lbnQge1xuXHRlbGVtZW50OiBIVE1MRWxlbWVudDtcblx0bGluZTogbnVtYmVyO1xufVxuXG5jb25zdCBnZXRDb2RlTGluZUVsZW1lbnRzID0gKCgpID0+IHtcblx0bGV0IGVsZW1lbnRzOiBDb2RlTGluZUVsZW1lbnRbXTtcblx0cmV0dXJuICgpID0+IHtcblx0XHRpZiAoIWVsZW1lbnRzKSB7XG5cdFx0XHRlbGVtZW50cyA9IEFycmF5LnByb3RvdHlwZS5tYXAuY2FsbChcblx0XHRcdFx0ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgnY29kZS1saW5lJyksXG5cdFx0XHRcdChlbGVtZW50OiBhbnkpID0+IHtcblx0XHRcdFx0XHRjb25zdCBsaW5lID0gK2VsZW1lbnQuZ2V0QXR0cmlidXRlKCdkYXRhLWxpbmUnKTtcblx0XHRcdFx0XHRyZXR1cm4geyBlbGVtZW50LCBsaW5lIH07XG5cdFx0XHRcdH0pXG5cdFx0XHRcdC5maWx0ZXIoKHg6IGFueSkgPT4gIWlzTmFOKHgubGluZSkpO1xuXHRcdH1cblx0XHRyZXR1cm4gZWxlbWVudHM7XG5cdH07XG59KSgpO1xuXG4vKipcbiAqIEZpbmQgdGhlIGh0bWwgZWxlbWVudHMgdGhhdCBtYXAgdG8gYSBzcGVjaWZpYyB0YXJnZXQgbGluZSBpbiB0aGUgZWRpdG9yLlxuICpcbiAqIElmIGFuIGV4YWN0IG1hdGNoLCByZXR1cm5zIGEgc2luZ2xlIGVsZW1lbnQuIElmIHRoZSBsaW5lIGlzIGJldHdlZW4gZWxlbWVudHMsXG4gKiByZXR1cm5zIHRoZSBlbGVtZW50IHByaW9yIHRvIGFuZCB0aGUgZWxlbWVudCBhZnRlciB0aGUgZ2l2ZW4gbGluZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldEVsZW1lbnRzRm9yU291cmNlTGluZSh0YXJnZXRMaW5lOiBudW1iZXIpOiB7IHByZXZpb3VzOiBDb2RlTGluZUVsZW1lbnQ7IG5leHQ/OiBDb2RlTGluZUVsZW1lbnQ7IH0ge1xuXHRjb25zdCBsaW5lTnVtYmVyID0gTWF0aC5mbG9vcih0YXJnZXRMaW5lKTtcblx0Y29uc3QgbGluZXMgPSBnZXRDb2RlTGluZUVsZW1lbnRzKCk7XG5cdGxldCBwcmV2aW91cyA9IGxpbmVzWzBdIHx8IG51bGw7XG5cdGZvciAoY29uc3QgZW50cnkgb2YgbGluZXMpIHtcblx0XHRpZiAoZW50cnkubGluZSA9PT0gbGluZU51bWJlcikge1xuXHRcdFx0cmV0dXJuIHsgcHJldmlvdXM6IGVudHJ5LCBuZXh0OiB1bmRlZmluZWQgfTtcblx0XHR9XG5cdFx0ZWxzZSBpZiAoZW50cnkubGluZSA+IGxpbmVOdW1iZXIpIHtcblx0XHRcdHJldHVybiB7IHByZXZpb3VzLCBuZXh0OiBlbnRyeSB9O1xuXHRcdH1cblx0XHRwcmV2aW91cyA9IGVudHJ5O1xuXHR9XG5cdHJldHVybiB7IHByZXZpb3VzIH07XG59XG5cbi8qKlxuICogRmluZCB0aGUgaHRtbCBlbGVtZW50cyB0aGF0IGFyZSBhdCBhIHNwZWNpZmljIHBpeGVsIG9mZnNldCBvbiB0aGUgcGFnZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldExpbmVFbGVtZW50c0F0UGFnZU9mZnNldChvZmZzZXQ6IG51bWJlcik6IHsgcHJldmlvdXM6IENvZGVMaW5lRWxlbWVudDsgbmV4dD86IENvZGVMaW5lRWxlbWVudDsgfSB7XG5cdGNvbnN0IGxpbmVzID0gZ2V0Q29kZUxpbmVFbGVtZW50cygpO1xuXHRjb25zdCBwb3NpdGlvbiA9IG9mZnNldCAtIHdpbmRvdy5zY3JvbGxZO1xuXHRsZXQgbG8gPSAtMTtcblx0bGV0IGhpID0gbGluZXMubGVuZ3RoIC0gMTtcblx0d2hpbGUgKGxvICsgMSA8IGhpKSB7XG5cdFx0Y29uc3QgbWlkID0gTWF0aC5mbG9vcigobG8gKyBoaSkgLyAyKTtcblx0XHRjb25zdCBib3VuZHMgPSBsaW5lc1ttaWRdLmVsZW1lbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG5cdFx0aWYgKGJvdW5kcy50b3AgKyBib3VuZHMuaGVpZ2h0ID49IHBvc2l0aW9uKSB7XG5cdFx0XHRoaSA9IG1pZDtcblx0XHR9XG5cdFx0ZWxzZSB7XG5cdFx0XHRsbyA9IG1pZDtcblx0XHR9XG5cdH1cblx0Y29uc3QgaGlFbGVtZW50ID0gbGluZXNbaGldO1xuXHRjb25zdCBoaUJvdW5kcyA9IGhpRWxlbWVudC5lbGVtZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuXHRpZiAoaGkgPj0gMSAmJiBoaUJvdW5kcy50b3AgPiBwb3NpdGlvbikge1xuXHRcdGNvbnN0IGxvRWxlbWVudCA9IGxpbmVzW2xvXTtcblx0XHRyZXR1cm4geyBwcmV2aW91czogbG9FbGVtZW50LCBuZXh0OiBoaUVsZW1lbnQgfTtcblx0fVxuXHRyZXR1cm4geyBwcmV2aW91czogaGlFbGVtZW50IH07XG59XG5cbi8qKlxuICogQXR0ZW1wdCB0byByZXZlYWwgdGhlIGVsZW1lbnQgZm9yIGEgc291cmNlIGxpbmUgaW4gdGhlIGVkaXRvci5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNjcm9sbFRvUmV2ZWFsU291cmNlTGluZShsaW5lOiBudW1iZXIpIHtcblx0Y29uc3QgeyBwcmV2aW91cywgbmV4dCB9ID0gZ2V0RWxlbWVudHNGb3JTb3VyY2VMaW5lKGxpbmUpO1xuXHRpZiAocHJldmlvdXMgJiYgZ2V0U2V0dGluZ3MoKS5zY3JvbGxQcmV2aWV3V2l0aEVkaXRvcikge1xuXHRcdGxldCBzY3JvbGxUbyA9IDA7XG5cdFx0Y29uc3QgcmVjdCA9IHByZXZpb3VzLmVsZW1lbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG5cdFx0Y29uc3QgcHJldmlvdXNUb3AgPSByZWN0LnRvcDtcblx0XHRpZiAobmV4dCAmJiBuZXh0LmxpbmUgIT09IHByZXZpb3VzLmxpbmUpIHtcblx0XHRcdC8vIEJldHdlZW4gdHdvIGVsZW1lbnRzLiBHbyB0byBwZXJjZW50YWdlIG9mZnNldCBiZXR3ZWVuIHRoZW0uXG5cdFx0XHRjb25zdCBiZXR3ZWVuUHJvZ3Jlc3MgPSAobGluZSAtIHByZXZpb3VzLmxpbmUpIC8gKG5leHQubGluZSAtIHByZXZpb3VzLmxpbmUpO1xuXHRcdFx0Y29uc3QgZWxlbWVudE9mZnNldCA9IG5leHQuZWxlbWVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS50b3AgLSBwcmV2aW91c1RvcDtcblx0XHRcdHNjcm9sbFRvID0gcHJldmlvdXNUb3AgKyBiZXR3ZWVuUHJvZ3Jlc3MgKiBlbGVtZW50T2Zmc2V0O1xuXHRcdH1cblx0XHRlbHNlIHtcblx0XHRcdHNjcm9sbFRvID0gcHJldmlvdXNUb3A7XG5cdFx0fVxuXHRcdHdpbmRvdy5zY3JvbGwoMCwgTWF0aC5tYXgoMSwgd2luZG93LnNjcm9sbFkgKyBzY3JvbGxUbykpO1xuXHR9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRFZGl0b3JMaW5lTnVtYmVyRm9yUGFnZU9mZnNldChvZmZzZXQ6IG51bWJlcikge1xuXHRjb25zdCB7IHByZXZpb3VzLCBuZXh0IH0gPSBnZXRMaW5lRWxlbWVudHNBdFBhZ2VPZmZzZXQob2Zmc2V0KTtcblx0aWYgKHByZXZpb3VzKSB7XG5cdFx0Y29uc3QgcHJldmlvdXNCb3VuZHMgPSBwcmV2aW91cy5lbGVtZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuXHRcdGNvbnN0IG9mZnNldEZyb21QcmV2aW91cyA9IChvZmZzZXQgLSB3aW5kb3cuc2Nyb2xsWSAtIHByZXZpb3VzQm91bmRzLnRvcCk7XG5cdFx0aWYgKG5leHQpIHtcblx0XHRcdGNvbnN0IHByb2dyZXNzQmV0d2VlbkVsZW1lbnRzID0gb2Zmc2V0RnJvbVByZXZpb3VzIC8gKG5leHQuZWxlbWVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS50b3AgLSBwcmV2aW91c0JvdW5kcy50b3ApO1xuXHRcdFx0Y29uc3QgbGluZSA9IHByZXZpb3VzLmxpbmUgKyBwcm9ncmVzc0JldHdlZW5FbGVtZW50cyAqIChuZXh0LmxpbmUgLSBwcmV2aW91cy5saW5lKTtcblx0XHRcdHJldHVybiBjbGFtcExpbmUobGluZSk7XG5cdFx0fVxuXHRcdGVsc2Uge1xuXHRcdFx0Y29uc3QgcHJvZ3Jlc3NXaXRoaW5FbGVtZW50ID0gb2Zmc2V0RnJvbVByZXZpb3VzIC8gKHByZXZpb3VzQm91bmRzLmhlaWdodCk7XG5cdFx0XHRjb25zdCBsaW5lID0gcHJldmlvdXMubGluZSArIHByb2dyZXNzV2l0aGluRWxlbWVudDtcblx0XHRcdHJldHVybiBjbGFtcExpbmUobGluZSk7XG5cdFx0fVxuXHR9XG5cdHJldHVybiBudWxsO1xufVxuIiwiLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAqICBDb3B5cmlnaHQgKGMpIE1pY3Jvc29mdCBDb3Jwb3JhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqICBMaWNlbnNlZCB1bmRlciB0aGUgTUlUIExpY2Vuc2UuIFNlZSBMaWNlbnNlLnR4dCBpbiB0aGUgcHJvamVjdCByb290IGZvciBsaWNlbnNlIGluZm9ybWF0aW9uLlxuICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovXG5cbmV4cG9ydCBpbnRlcmZhY2UgUHJldmlld1NldHRpbmdzIHtcblx0c291cmNlOiBzdHJpbmc7XG5cdGxpbmU6IG51bWJlcjtcblx0bGluZUNvdW50OiBudW1iZXI7XG5cdHNjcm9sbFByZXZpZXdXaXRoRWRpdG9yPzogYm9vbGVhbjtcblx0c2Nyb2xsRWRpdG9yV2l0aFByZXZpZXc6IGJvb2xlYW47XG5cdGRpc2FibGVTZWN1cml0eVdhcm5pbmdzOiBib29sZWFuO1xuXHRkb3VibGVDbGlja1RvU3dpdGNoVG9FZGl0b3I6IGJvb2xlYW47XG59XG5cbmxldCBjYWNoZWRTZXR0aW5nczogUHJldmlld1NldHRpbmdzIHwgdW5kZWZpbmVkID0gdW5kZWZpbmVkO1xuXG5leHBvcnQgZnVuY3Rpb24gZ2V0U2V0dGluZ3MoKTogUHJldmlld1NldHRpbmdzIHtcblx0aWYgKGNhY2hlZFNldHRpbmdzKSB7XG5cdFx0cmV0dXJuIGNhY2hlZFNldHRpbmdzO1xuXHR9XG5cblx0Y29uc3QgZWxlbWVudCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd2c2NvZGUtbWFya2Rvd24tcHJldmlldy1kYXRhJyk7XG5cdGlmIChlbGVtZW50KSB7XG5cdFx0Y29uc3QgZGF0YSA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlKCdkYXRhLXNldHRpbmdzJyk7XG5cdFx0aWYgKGRhdGEpIHtcblx0XHRcdGNhY2hlZFNldHRpbmdzID0gSlNPTi5wYXJzZShkYXRhKTtcblx0XHRcdHJldHVybiBjYWNoZWRTZXR0aW5ncyE7XG5cdFx0fVxuXHR9XG5cblx0dGhyb3cgbmV3IEVycm9yKCdDb3VsZCBub3QgbG9hZCBzZXR0aW5ncycpO1xufVxuIl0sInNvdXJjZVJvb3QiOiIifQ== \ No newline at end of file +//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vd2VicGFjay9ib290c3RyYXAiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC50aHJvdHRsZS9pbmRleC5qcyIsIndlYnBhY2s6Ly8vKHdlYnBhY2spL2J1aWxkaW4vZ2xvYmFsLmpzIiwid2VicGFjazovLy8uL3ByZXZpZXctc3JjL2FjdGl2ZUxpbmVNYXJrZXIudHMiLCJ3ZWJwYWNrOi8vLy4vcHJldmlldy1zcmMvZXZlbnRzLnRzIiwid2VicGFjazovLy8uL3ByZXZpZXctc3JjL2luZGV4LnRzIiwid2VicGFjazovLy8uL3ByZXZpZXctc3JjL21lc3NhZ2luZy50cyIsIndlYnBhY2s6Ly8vLi9wcmV2aWV3LXNyYy9zY3JvbGwtc3luYy50cyIsIndlYnBhY2s6Ly8vLi9wcmV2aWV3LXNyYy9zZXR0aW5ncy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7OztBQUdBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQUs7QUFDTDtBQUNBOztBQUVBO0FBQ0E7QUFDQSx5REFBaUQsY0FBYztBQUMvRDs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxtQ0FBMkIsMEJBQTBCLEVBQUU7QUFDdkQseUNBQWlDLGVBQWU7QUFDaEQ7QUFDQTtBQUNBOztBQUVBO0FBQ0EsOERBQXNELCtEQUErRDs7QUFFckg7QUFDQTs7O0FBR0E7QUFDQTs7Ozs7Ozs7Ozs7O0FDbkVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNB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LDhCQUE4QixDQUFDLENBQUM7SUFDeEUsRUFBRSxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQztRQUNiLE1BQU0sSUFBSSxHQUFHLE9BQU8sQ0FBQyxZQUFZLENBQUMsZUFBZSxDQUFDLENBQUM7UUFDbkQsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQztZQUNWLGNBQWMsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDO1lBQ2xDLE1BQU0sQ0FBQyxjQUFlLENBQUM7UUFDeEIsQ0FBQztJQUNGLENBQUM7SUFFRCxNQUFNLElBQUksS0FBSyxDQUFDLHlCQUF5QixDQUFDLENBQUM7QUFDNUMsQ0FBQztBQWZELGtDQWVDIiwiZmlsZSI6ImluZGV4LmpzIiwic291cmNlc0NvbnRlbnQiOlsiIFx0Ly8gVGhlIG1vZHVsZSBjYWNoZVxuIFx0dmFyIGluc3RhbGxlZE1vZHVsZXMgPSB7fTtcblxuIFx0Ly8gVGhlIHJlcXVpcmUgZnVuY3Rpb25cbiBcdGZ1bmN0aW9uIF9fd2VicGFja19yZXF1aXJlX18obW9kdWxlSWQpIHtcblxuIFx0XHQvLyBDaGVjayBpZiBtb2R1bGUgaXMgaW4gY2FjaGVcbiBcdFx0aWYoaW5zdGFsbGVkTW9kdWxlc1ttb2R1bGVJZF0pIHtcbiBcdFx0XHRyZXR1cm4gaW5zdGFsbGVkTW9kdWxlc1ttb2R1bGVJZF0uZXhwb3J0cztcbiBcdFx0fVxuIFx0XHQvLyBDcmVhdGUgYSBuZXcgbW9kdWxlIChhbmQgcHV0IGl0IGludG8gdGhlIGNhY2hlKVxuIFx0XHR2YXIgbW9kdWxlID0gaW5zdGFsbGVkTW9kdWxlc1ttb2R1bGVJZF0gPSB7XG4gXHRcdFx0aTogbW9kdWxlSWQsXG4gXHRcdFx0bDogZmFsc2UsXG4gXHRcdFx0ZXhwb3J0czoge31cbiBcdFx0fTtcblxuIFx0XHQvLyBFeGVjdXRlIHRoZSBtb2R1bGUgZnVuY3Rpb25cbiBcdFx0bW9kdWxlc1ttb2R1bGVJZF0uY2FsbChtb2R1bGUuZXhwb3J0cywgbW9kdWxlLCBtb2R1bGUuZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXyk7XG5cbiBcdFx0Ly8gRmxhZyB0aGUgbW9kdWxlIGFzIGxvYWRlZFxuIFx0XHRtb2R1bGUubCA9IHRydWU7XG5cbiBcdFx0Ly8gUmV0dXJuIHRoZSBleHBvcnRzIG9mIHRoZSBtb2R1bGVcbiBcdFx0cmV0dXJuIG1vZHVsZS5leHBvcnRzO1xuIFx0fVxuXG5cbiBcdC8vIGV4cG9zZSB0aGUgbW9kdWxlcyBvYmplY3QgKF9fd2VicGFja19tb2R1bGVzX18pXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLm0gPSBtb2R1bGVzO1xuXG4gXHQvLyBleHBvc2UgdGhlIG1vZHVsZSBjYWNoZVxuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5jID0gaW5zdGFsbGVkTW9kdWxlcztcblxuIFx0Ly8gZGVmaW5lIGdldHRlciBmdW5jdGlvbiBmb3IgaGFybW9ueSBleHBvcnRzXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLmQgPSBmdW5jdGlvbihleHBvcnRzLCBuYW1lLCBnZXR0ZXIpIHtcbiBcdFx0aWYoIV9fd2VicGFja19yZXF1aXJlX18ubyhleHBvcnRzLCBuYW1lKSkge1xuIFx0XHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBuYW1lLCB7XG4gXHRcdFx0XHRjb25maWd1cmFibGU6IGZhbHNlLFxuIFx0XHRcdFx0ZW51bWVyYWJsZTogdHJ1ZSxcbiBcdFx0XHRcdGdldDogZ2V0dGVyXG4gXHRcdFx0fSk7XG4gXHRcdH1cbiBcdH07XG5cbiBcdC8vIGRlZmluZSBfX2VzTW9kdWxlIG9uIGV4cG9ydHNcbiBcdF9fd2VicGFja19yZXF1aXJlX18uciA9IGZ1bmN0aW9uKGV4cG9ydHMpIHtcbiBcdFx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsICdfX2VzTW9kdWxlJywgeyB2YWx1ZTogdHJ1ZSB9KTtcbiBcdH07XG5cbiBcdC8vIGdldERlZmF1bHRFeHBvcnQgZnVuY3Rpb24gZm9yIGNvbXBhdGliaWxpdHkgd2l0aCBub24taGFybW9ueSBtb2R1bGVzXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLm4gPSBmdW5jdGlvbihtb2R1bGUpIHtcbiBcdFx0dmFyIGdldHRlciA9IG1vZHVsZSAmJiBtb2R1bGUuX19lc01vZHVsZSA/XG4gXHRcdFx0ZnVuY3Rpb24gZ2V0RGVmYXVsdCgpIHsgcmV0dXJuIG1vZHVsZVsnZGVmYXVsdCddOyB9IDpcbiBcdFx0XHRmdW5jdGlvbiBnZXRNb2R1bGVFeHBvcnRzKCkgeyByZXR1cm4gbW9kdWxlOyB9O1xuIFx0XHRfX3dlYnBhY2tfcmVxdWlyZV9fLmQoZ2V0dGVyLCAnYScsIGdldHRlcik7XG4gXHRcdHJldHVybiBnZXR0ZXI7XG4gXHR9O1xuXG4gXHQvLyBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGxcbiBcdF9fd2VicGFja19yZXF1aXJlX18ubyA9IGZ1bmN0aW9uKG9iamVjdCwgcHJvcGVydHkpIHsgcmV0dXJuIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChvYmplY3QsIHByb3BlcnR5KTsgfTtcblxuIFx0Ly8gX193ZWJwYWNrX3B1YmxpY19wYXRoX19cbiBcdF9fd2VicGFja19yZXF1aXJlX18ucCA9IFwiXCI7XG5cblxuIFx0Ly8gTG9hZCBlbnRyeSBtb2R1bGUgYW5kIHJldHVybiBleHBvcnRzXG4gXHRyZXR1cm4gX193ZWJwYWNrX3JlcXVpcmVfXyhfX3dlYnBhY2tfcmVxdWlyZV9fLnMgPSBcIi4vcHJldmlldy1zcmMvaW5kZXgudHNcIik7XG4iLCIvKipcbiAqIGxvZGFzaCAoQ3VzdG9tIEJ1aWxkKSA8aHR0cHM6Ly9sb2Rhc2guY29tLz5cbiAqIEJ1aWxkOiBgbG9kYXNoIG1vZHVsYXJpemUgZXhwb3J0cz1cIm5wbVwiIC1vIC4vYFxuICogQ29weXJpZ2h0IGpRdWVyeSBGb3VuZGF0aW9uIGFuZCBvdGhlciBjb250cmlidXRvcnMgPGh0dHBzOi8vanF1ZXJ5Lm9yZy8+XG4gKiBSZWxlYXNlZCB1bmRlciBNSVQgbGljZW5zZSA8aHR0cHM6Ly9sb2Rhc2guY29tL2xpY2Vuc2U+XG4gKiBCYXNlZCBvbiBVbmRlcnNjb3JlLmpzIDEuOC4zIDxodHRwOi8vdW5kZXJzY29yZWpzLm9yZy9MSUNFTlNFPlxuICogQ29weXJpZ2h0IEplcmVteSBBc2hrZW5hcywgRG9jdW1lbnRDbG91ZCBhbmQgSW52ZXN0aWdhdGl2ZSBSZXBvcnRlcnMgJiBFZGl0b3JzXG4gKi9cblxuLyoqIFVzZWQgYXMgdGhlIGBUeXBlRXJyb3JgIG1lc3NhZ2UgZm9yIFwiRnVuY3Rpb25zXCIgbWV0aG9kcy4gKi9cbnZhciBGVU5DX0VSUk9SX1RFWFQgPSAnRXhwZWN0ZWQgYSBmdW5jdGlvbic7XG5cbi8qKiBVc2VkIGFzIHJlZmVyZW5jZXMgZm9yIHZhcmlvdXMgYE51bWJlcmAgY29uc3RhbnRzLiAqL1xudmFyIE5BTiA9IDAgLyAwO1xuXG4vKiogYE9iamVjdCN0b1N0cmluZ2AgcmVzdWx0IHJlZmVyZW5jZXMuICovXG52YXIgc3ltYm9sVGFnID0gJ1tvYmplY3QgU3ltYm9sXSc7XG5cbi8qKiBVc2VkIHRvIG1hdGNoIGxlYWRpbmcgYW5kIHRyYWlsaW5nIHdoaXRlc3BhY2UuICovXG52YXIgcmVUcmltID0gL15cXHMrfFxccyskL2c7XG5cbi8qKiBVc2VkIHRvIGRldGVjdCBiYWQgc2lnbmVkIGhleGFkZWNpbWFsIHN0cmluZyB2YWx1ZXMuICovXG52YXIgcmVJc0JhZEhleCA9IC9eWy0rXTB4WzAtOWEtZl0rJC9pO1xuXG4vKiogVXNlZCB0byBkZXRlY3QgYmluYXJ5IHN0cmluZyB2YWx1ZXMuICovXG52YXIgcmVJc0JpbmFyeSA9IC9eMGJbMDFdKyQvaTtcblxuLyoqIFVzZWQgdG8gZGV0ZWN0IG9jdGFsIHN0cmluZyB2YWx1ZXMuICovXG52YXIgcmVJc09jdGFsID0gL14wb1swLTddKyQvaTtcblxuLyoqIEJ1aWx0LWluIG1ldGhvZCByZWZlcmVuY2VzIHdpdGhvdXQgYSBkZXBlbmRlbmN5IG9uIGByb290YC4gKi9cbnZhciBmcmVlUGFyc2VJbnQgPSBwYXJzZUludDtcblxuLyoqIERldGVjdCBmcmVlIHZhcmlhYmxlIGBnbG9iYWxgIGZyb20gTm9kZS5qcy4gKi9cbnZhciBmcmVlR2xvYmFsID0gdHlwZW9mIGdsb2JhbCA9PSAnb2JqZWN0JyAmJiBnbG9iYWwgJiYgZ2xvYmFsLk9iamVjdCA9PT0gT2JqZWN0ICYmIGdsb2JhbDtcblxuLyoqIERldGVjdCBmcmVlIHZhcmlhYmxlIGBzZWxmYC4gKi9cbnZhciBmcmVlU2VsZiA9IHR5cGVvZiBzZWxmID09ICdvYmplY3QnICYmIHNlbGYgJiYgc2VsZi5PYmplY3QgPT09IE9iamVjdCAmJiBzZWxmO1xuXG4vKiogVXNlZCBhcyBhIHJlZmVyZW5jZSB0byB0aGUgZ2xvYmFsIG9iamVjdC4gKi9cbnZhciByb290ID0gZnJlZUdsb2JhbCB8fCBmcmVlU2VsZiB8fCBGdW5jdGlvbigncmV0dXJuIHRoaXMnKSgpO1xuXG4vKiogVXNlZCBmb3IgYnVpbHQtaW4gbWV0aG9kIHJlZmVyZW5jZXMuICovXG52YXIgb2JqZWN0UHJvdG8gPSBPYmplY3QucHJvdG90eXBlO1xuXG4vKipcbiAqIFVzZWQgdG8gcmVzb2x2ZSB0aGVcbiAqIFtgdG9TdHJpbmdUYWdgXShodHRwOi8vZWNtYS1pbnRlcm5hdGlvbmFsLm9yZy9lY21hLTI2Mi83LjAvI3NlYy1vYmplY3QucHJvdG90eXBlLnRvc3RyaW5nKVxuICogb2YgdmFsdWVzLlxuICovXG52YXIgb2JqZWN0VG9TdHJpbmcgPSBvYmplY3RQcm90by50b1N0cmluZztcblxuLyogQnVpbHQtaW4gbWV0aG9kIHJlZmVyZW5jZXMgZm9yIHRob3NlIHdpdGggdGhlIHNhbWUgbmFtZSBhcyBvdGhlciBgbG9kYXNoYCBtZXRob2RzLiAqL1xudmFyIG5hdGl2ZU1heCA9IE1hdGgubWF4LFxuICAgIG5hdGl2ZU1pbiA9IE1hdGgubWluO1xuXG4vKipcbiAqIEdldHMgdGhlIHRpbWVzdGFtcCBvZiB0aGUgbnVtYmVyIG9mIG1pbGxpc2Vjb25kcyB0aGF0IGhhdmUgZWxhcHNlZCBzaW5jZVxuICogdGhlIFVuaXggZXBvY2ggKDEgSmFudWFyeSAxOTcwIDAwOjAwOjAwIFVUQykuXG4gKlxuICogQHN0YXRpY1xuICogQG1lbWJlck9mIF9cbiAqIEBzaW5jZSAyLjQuMFxuICogQGNhdGVnb3J5IERhdGVcbiAqIEByZXR1cm5zIHtudW1iZXJ9IFJldHVybnMgdGhlIHRpbWVzdGFtcC5cbiAqIEBleGFtcGxlXG4gKlxuICogXy5kZWZlcihmdW5jdGlvbihzdGFtcCkge1xuICogICBjb25zb2xlLmxvZyhfLm5vdygpIC0gc3RhbXApO1xuICogfSwgXy5ub3coKSk7XG4gKiAvLyA9PiBMb2dzIHRoZSBudW1iZXIgb2YgbWlsbGlzZWNvbmRzIGl0IHRvb2sgZm9yIHRoZSBkZWZlcnJlZCBpbnZvY2F0aW9uLlxuICovXG52YXIgbm93ID0gZnVuY3Rpb24oKSB7XG4gIHJldHVybiByb290LkRhdGUubm93KCk7XG59O1xuXG4vKipcbiAqIENyZWF0ZXMgYSBkZWJvdW5jZWQgZnVuY3Rpb24gdGhhdCBkZWxheXMgaW52b2tpbmcgYGZ1bmNgIHVudGlsIGFmdGVyIGB3YWl0YFxuICogbWlsbGlzZWNvbmRzIGhhdmUgZWxhcHNlZCBzaW5jZSB0aGUgbGFzdCB0aW1lIHRoZSBkZWJvdW5jZWQgZnVuY3Rpb24gd2FzXG4gKiBpbnZva2VkLiBUaGUgZGVib3VuY2VkIGZ1bmN0aW9uIGNvbWVzIHdpdGggYSBgY2FuY2VsYCBtZXRob2QgdG8gY2FuY2VsXG4gKiBkZWxheWVkIGBmdW5jYCBpbnZvY2F0aW9ucyBhbmQgYSBgZmx1c2hgIG1ldGhvZCB0byBpbW1lZGlhdGVseSBpbnZva2UgdGhlbS5cbiAqIFByb3ZpZGUgYG9wdGlvbnNgIHRvIGluZGljYXRlIHdoZXRoZXIgYGZ1bmNgIHNob3VsZCBiZSBpbnZva2VkIG9uIHRoZVxuICogbGVhZGluZyBhbmQvb3IgdHJhaWxpbmcgZWRnZSBvZiB0aGUgYHdhaXRgIHRpbWVvdXQuIFRoZSBgZnVuY2AgaXMgaW52b2tlZFxuICogd2l0aCB0aGUgbGFzdCBhcmd1bWVudHMgcHJvdmlkZWQgdG8gdGhlIGRlYm91bmNlZCBmdW5jdGlvbi4gU3Vic2VxdWVudFxuICogY2FsbHMgdG8gdGhlIGRlYm91bmNlZCBmdW5jdGlvbiByZXR1cm4gdGhlIHJlc3VsdCBvZiB0aGUgbGFzdCBgZnVuY2BcbiAqIGludm9jYXRpb24uXG4gKlxuICogKipOb3RlOioqIElmIGBsZWFkaW5nYCBhbmQgYHRyYWlsaW5nYCBvcHRpb25zIGFyZSBgdHJ1ZWAsIGBmdW5jYCBpc1xuICogaW52b2tlZCBvbiB0aGUgdHJhaWxpbmcgZWRnZSBvZiB0aGUgdGltZW91dCBvbmx5IGlmIHRoZSBkZWJvdW5jZWQgZnVuY3Rpb25cbiAqIGlzIGludm9rZWQgbW9yZSB0aGFuIG9uY2UgZHVyaW5nIHRoZSBgd2FpdGAgdGltZW91dC5cbiAqXG4gKiBJZiBgd2FpdGAgaXMgYDBgIGFuZCBgbGVhZGluZ2AgaXMgYGZhbHNlYCwgYGZ1bmNgIGludm9jYXRpb24gaXMgZGVmZXJyZWRcbiAqIHVudGlsIHRvIHRoZSBuZXh0IHRpY2ssIHNpbWlsYXIgdG8gYHNldFRpbWVvdXRgIHdpdGggYSB0aW1lb3V0IG9mIGAwYC5cbiAqXG4gKiBTZWUgW0RhdmlkIENvcmJhY2hvJ3MgYXJ0aWNsZV0oaHR0cHM6Ly9jc3MtdHJpY2tzLmNvbS9kZWJvdW5jaW5nLXRocm90dGxpbmctZXhwbGFpbmVkLWV4YW1wbGVzLylcbiAqIGZvciBkZXRhaWxzIG92ZXIgdGhlIGRpZmZlcmVuY2VzIGJldHdlZW4gYF8uZGVib3VuY2VgIGFuZCBgXy50aHJvdHRsZWAuXG4gKlxuICogQHN0YXRpY1xuICogQG1lbWJlck9mIF9cbiAqIEBzaW5jZSAwLjEuMFxuICogQGNhdGVnb3J5IEZ1bmN0aW9uXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBmdW5jIFRoZSBmdW5jdGlvbiB0byBkZWJvdW5jZS5cbiAqIEBwYXJhbSB7bnVtYmVyfSBbd2FpdD0wXSBUaGUgbnVtYmVyIG9mIG1pbGxpc2Vjb25kcyB0byBkZWxheS5cbiAqIEBwYXJhbSB7T2JqZWN0fSBbb3B0aW9ucz17fV0gVGhlIG9wdGlvbnMgb2JqZWN0LlxuICogQHBhcmFtIHtib29sZWFufSBbb3B0aW9ucy5sZWFkaW5nPWZhbHNlXVxuICogIFNwZWNpZnkgaW52b2tpbmcgb24gdGhlIGxlYWRpbmcgZWRnZSBvZiB0aGUgdGltZW91dC5cbiAqIEBwYXJhbSB7bnVtYmVyfSBbb3B0aW9ucy5tYXhXYWl0XVxuICogIFRoZSBtYXhpbXVtIHRpbWUgYGZ1bmNgIGlzIGFsbG93ZWQgdG8gYmUgZGVsYXllZCBiZWZvcmUgaXQncyBpbnZva2VkLlxuICogQHBhcmFtIHtib29sZWFufSBbb3B0aW9ucy50cmFpbGluZz10cnVlXVxuICogIFNwZWNpZnkgaW52b2tpbmcgb24gdGhlIHRyYWlsaW5nIGVkZ2Ugb2YgdGhlIHRpbWVvdXQuXG4gKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIG5ldyBkZWJvdW5jZWQgZnVuY3Rpb24uXG4gKiBAZXhhbXBsZVxuICpcbiAqIC8vIEF2b2lkIGNvc3RseSBjYWxjdWxhdGlvbnMgd2hpbGUgdGhlIHdpbmRvdyBzaXplIGlzIGluIGZsdXguXG4gKiBqUXVlcnkod2luZG93KS5vbigncmVzaXplJywgXy5kZWJvdW5jZShjYWxjdWxhdGVMYXlvdXQsIDE1MCkpO1xuICpcbiAqIC8vIEludm9rZSBgc2VuZE1haWxgIHdoZW4gY2xpY2tlZCwgZGVib3VuY2luZyBzdWJzZXF1ZW50IGNhbGxzLlxuICogalF1ZXJ5KGVsZW1lbnQpLm9uKCdjbGljaycsIF8uZGVib3VuY2Uoc2VuZE1haWwsIDMwMCwge1xuICogICAnbGVhZGluZyc6IHRydWUsXG4gKiAgICd0cmFpbGluZyc6IGZhbHNlXG4gKiB9KSk7XG4gKlxuICogLy8gRW5zdXJlIGBiYXRjaExvZ2AgaXMgaW52b2tlZCBvbmNlIGFmdGVyIDEgc2Vjb25kIG9mIGRlYm91bmNlZCBjYWxscy5cbiAqIHZhciBkZWJvdW5jZWQgPSBfLmRlYm91bmNlKGJhdGNoTG9nLCAyNTAsIHsgJ21heFdhaXQnOiAxMDAwIH0pO1xuICogdmFyIHNvdXJjZSA9IG5ldyBFdmVudFNvdXJjZSgnL3N0cmVhbScpO1xuICogalF1ZXJ5KHNvdXJjZSkub24oJ21lc3NhZ2UnLCBkZWJvdW5jZWQpO1xuICpcbiAqIC8vIENhbmNlbCB0aGUgdHJhaWxpbmcgZGVib3VuY2VkIGludm9jYXRpb24uXG4gKiBqUXVlcnkod2luZG93KS5vbigncG9wc3RhdGUnLCBkZWJvdW5jZWQuY2FuY2VsKTtcbiAqL1xuZnVuY3Rpb24gZGVib3VuY2UoZnVuYywgd2FpdCwgb3B0aW9ucykge1xuICB2YXIgbGFzdEFyZ3MsXG4gICAgICBsYXN0VGhpcyxcbiAgICAgIG1heFdhaXQsXG4gICAgICByZXN1bHQsXG4gICAgICB0aW1lcklkLFxuICAgICAgbGFzdENhbGxUaW1lLFxuICAgICAgbGFzdEludm9rZVRpbWUgPSAwLFxuICAgICAgbGVhZGluZyA9IGZhbHNlLFxuICAgICAgbWF4aW5nID0gZmFsc2UsXG4gICAgICB0cmFpbGluZyA9IHRydWU7XG5cbiAgaWYgKHR5cGVvZiBmdW5jICE9ICdmdW5jdGlvbicpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKEZVTkNfRVJST1JfVEVYVCk7XG4gIH1cbiAgd2FpdCA9IHRvTnVtYmVyKHdhaXQpIHx8IDA7XG4gIGlmIChpc09iamVjdChvcHRpb25zKSkge1xuICAgIGxlYWRpbmcgPSAhIW9wdGlvbnMubGVhZGluZztcbiAgICBtYXhpbmcgPSAnbWF4V2FpdCcgaW4gb3B0aW9ucztcbiAgICBtYXhXYWl0ID0gbWF4aW5nID8gbmF0aXZlTWF4KHRvTnVtYmVyKG9wdGlvbnMubWF4V2FpdCkgfHwgMCwgd2FpdCkgOiBtYXhXYWl0O1xuICAgIHRyYWlsaW5nID0gJ3RyYWlsaW5nJyBpbiBvcHRpb25zID8gISFvcHRpb25zLnRyYWlsaW5nIDogdHJhaWxpbmc7XG4gIH1cblxuICBmdW5jdGlvbiBpbnZva2VGdW5jKHRpbWUpIHtcbiAgICB2YXIgYXJncyA9IGxhc3RBcmdzLFxuICAgICAgICB0aGlzQXJnID0gbGFzdFRoaXM7XG5cbiAgICBsYXN0QXJncyA9IGxhc3RUaGlzID0gdW5kZWZpbmVkO1xuICAgIGxhc3RJbnZva2VUaW1lID0gdGltZTtcbiAgICByZXN1bHQgPSBmdW5jLmFwcGx5KHRoaXNBcmcsIGFyZ3MpO1xuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cblxuICBmdW5jdGlvbiBsZWFkaW5nRWRnZSh0aW1lKSB7XG4gICAgLy8gUmVzZXQgYW55IGBtYXhXYWl0YCB0aW1lci5cbiAgICBsYXN0SW52b2tlVGltZSA9IHRpbWU7XG4gICAgLy8gU3RhcnQgdGhlIHRpbWVyIGZvciB0aGUgdHJhaWxpbmcgZWRnZS5cbiAgICB0aW1lcklkID0gc2V0VGltZW91dCh0aW1lckV4cGlyZWQsIHdhaXQpO1xuICAgIC8vIEludm9rZSB0aGUgbGVhZGluZyBlZGdlLlxuICAgIHJldHVybiBsZWFkaW5nID8gaW52b2tlRnVuYyh0aW1lKSA6IHJlc3VsdDtcbiAgfVxuXG4gIGZ1bmN0aW9uIHJlbWFpbmluZ1dhaXQodGltZSkge1xuICAgIHZhciB0aW1lU2luY2VMYXN0Q2FsbCA9IHRpbWUgLSBsYXN0Q2FsbFRpbWUsXG4gICAgICAgIHRpbWVTaW5jZUxhc3RJbnZva2UgPSB0aW1lIC0gbGFzdEludm9rZVRpbWUsXG4gICAgICAgIHJlc3VsdCA9IHdhaXQgLSB0aW1lU2luY2VMYXN0Q2FsbDtcblxuICAgIHJldHVybiBtYXhpbmcgPyBuYXRpdmVNaW4ocmVzdWx0LCBtYXhXYWl0IC0gdGltZVNpbmNlTGFzdEludm9rZSkgOiByZXN1bHQ7XG4gIH1cblxuICBmdW5jdGlvbiBzaG91bGRJbnZva2UodGltZSkge1xuICAgIHZhciB0aW1lU2luY2VMYXN0Q2FsbCA9IHRpbWUgLSBsYXN0Q2FsbFRpbWUsXG4gICAgICAgIHRpbWVTaW5jZUxhc3RJbnZva2UgPSB0aW1lIC0gbGFzdEludm9rZVRpbWU7XG5cbiAgICAvLyBFaXRoZXIgdGhpcyBpcyB0aGUgZmlyc3QgY2FsbCwgYWN0aXZpdHkgaGFzIHN0b3BwZWQgYW5kIHdlJ3JlIGF0IHRoZVxuICAgIC8vIHRyYWlsaW5nIGVkZ2UsIHRoZSBzeXN0ZW0gdGltZSBoYXMgZ29uZSBiYWNrd2FyZHMgYW5kIHdlJ3JlIHRyZWF0aW5nXG4gICAgLy8gaXQgYXMgdGhlIHRyYWlsaW5nIGVkZ2UsIG9yIHdlJ3ZlIGhpdCB0aGUgYG1heFdhaXRgIGxpbWl0LlxuICAgIHJldHVybiAobGFzdENhbGxUaW1lID09PSB1bmRlZmluZWQgfHwgKHRpbWVTaW5jZUxhc3RDYWxsID49IHdhaXQpIHx8XG4gICAgICAodGltZVNpbmNlTGFzdENhbGwgPCAwKSB8fCAobWF4aW5nICYmIHRpbWVTaW5jZUxhc3RJbnZva2UgPj0gbWF4V2FpdCkpO1xuICB9XG5cbiAgZnVuY3Rpb24gdGltZXJFeHBpcmVkKCkge1xuICAgIHZhciB0aW1lID0gbm93KCk7XG4gICAgaWYgKHNob3VsZEludm9rZSh0aW1lKSkge1xuICAgICAgcmV0dXJuIHRyYWlsaW5nRWRnZSh0aW1lKTtcbiAgICB9XG4gICAgLy8gUmVzdGFydCB0aGUgdGltZXIuXG4gICAgdGltZXJJZCA9IHNldFRpbWVvdXQodGltZXJFeHBpcmVkLCByZW1haW5pbmdXYWl0KHRpbWUpKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIHRyYWlsaW5nRWRnZSh0aW1lKSB7XG4gICAgdGltZXJJZCA9IHVuZGVmaW5lZDtcblxuICAgIC8vIE9ubHkgaW52b2tlIGlmIHdlIGhhdmUgYGxhc3RBcmdzYCB3aGljaCBtZWFucyBgZnVuY2AgaGFzIGJlZW5cbiAgICAvLyBkZWJvdW5jZWQgYXQgbGVhc3Qgb25jZS5cbiAgICBpZiAodHJhaWxpbmcgJiYgbGFzdEFyZ3MpIHtcbiAgICAgIHJldHVybiBpbnZva2VGdW5jKHRpbWUpO1xuICAgIH1cbiAgICBsYXN0QXJncyA9IGxhc3RUaGlzID0gdW5kZWZpbmVkO1xuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cblxuICBmdW5jdGlvbiBjYW5jZWwoKSB7XG4gICAgaWYgKHRpbWVySWQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgY2xlYXJUaW1lb3V0KHRpbWVySWQpO1xuICAgIH1cbiAgICBsYXN0SW52b2tlVGltZSA9IDA7XG4gICAgbGFzdEFyZ3MgPSBsYXN0Q2FsbFRpbWUgPSBsYXN0VGhpcyA9IHRpbWVySWQgPSB1bmRlZmluZWQ7XG4gIH1cblxuICBmdW5jdGlvbiBmbHVzaCgpIHtcbiAgICByZXR1cm4gdGltZXJJZCA9PT0gdW5kZWZpbmVkID8gcmVzdWx0IDogdHJhaWxpbmdFZGdlKG5vdygpKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGRlYm91bmNlZCgpIHtcbiAgICB2YXIgdGltZSA9IG5vdygpLFxuICAgICAgICBpc0ludm9raW5nID0gc2hvdWxkSW52b2tlKHRpbWUpO1xuXG4gICAgbGFzdEFyZ3MgPSBhcmd1bWVudHM7XG4gICAgbGFzdFRoaXMgPSB0aGlzO1xuICAgIGxhc3RDYWxsVGltZSA9IHRpbWU7XG5cbiAgICBpZiAoaXNJbnZva2luZykge1xuICAgICAgaWYgKHRpbWVySWQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICByZXR1cm4gbGVhZGluZ0VkZ2UobGFzdENhbGxUaW1lKTtcbiAgICAgIH1cbiAgICAgIGlmIChtYXhpbmcpIHtcbiAgICAgICAgLy8gSGFuZGxlIGludm9jYXRpb25zIGluIGEgdGlnaHQgbG9vcC5cbiAgICAgICAgdGltZXJJZCA9IHNldFRpbWVvdXQodGltZXJFeHBpcmVkLCB3YWl0KTtcbiAgICAgICAgcmV0dXJuIGludm9rZUZ1bmMobGFzdENhbGxUaW1lKTtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKHRpbWVySWQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgdGltZXJJZCA9IHNldFRpbWVvdXQodGltZXJFeHBpcmVkLCB3YWl0KTtcbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuICBkZWJvdW5jZWQuY2FuY2VsID0gY2FuY2VsO1xuICBkZWJvdW5jZWQuZmx1c2ggPSBmbHVzaDtcbiAgcmV0dXJuIGRlYm91bmNlZDtcbn1cblxuLyoqXG4gKiBDcmVhdGVzIGEgdGhyb3R0bGVkIGZ1bmN0aW9uIHRoYXQgb25seSBpbnZva2VzIGBmdW5jYCBhdCBtb3N0IG9uY2UgcGVyXG4gKiBldmVyeSBgd2FpdGAgbWlsbGlzZWNvbmRzLiBUaGUgdGhyb3R0bGVkIGZ1bmN0aW9uIGNvbWVzIHdpdGggYSBgY2FuY2VsYFxuICogbWV0aG9kIHRvIGNhbmNlbCBkZWxheWVkIGBmdW5jYCBpbnZvY2F0aW9ucyBhbmQgYSBgZmx1c2hgIG1ldGhvZCB0b1xuICogaW1tZWRpYXRlbHkgaW52b2tlIHRoZW0uIFByb3ZpZGUgYG9wdGlvbnNgIHRvIGluZGljYXRlIHdoZXRoZXIgYGZ1bmNgXG4gKiBzaG91bGQgYmUgaW52b2tlZCBvbiB0aGUgbGVhZGluZyBhbmQvb3IgdHJhaWxpbmcgZWRnZSBvZiB0aGUgYHdhaXRgXG4gKiB0aW1lb3V0LiBUaGUgYGZ1bmNgIGlzIGludm9rZWQgd2l0aCB0aGUgbGFzdCBhcmd1bWVudHMgcHJvdmlkZWQgdG8gdGhlXG4gKiB0aHJvdHRsZWQgZnVuY3Rpb24uIFN1YnNlcXVlbnQgY2FsbHMgdG8gdGhlIHRocm90dGxlZCBmdW5jdGlvbiByZXR1cm4gdGhlXG4gKiByZXN1bHQgb2YgdGhlIGxhc3QgYGZ1bmNgIGludm9jYXRpb24uXG4gKlxuICogKipOb3RlOioqIElmIGBsZWFkaW5nYCBhbmQgYHRyYWlsaW5nYCBvcHRpb25zIGFyZSBgdHJ1ZWAsIGBmdW5jYCBpc1xuICogaW52b2tlZCBvbiB0aGUgdHJhaWxpbmcgZWRnZSBvZiB0aGUgdGltZW91dCBvbmx5IGlmIHRoZSB0aHJvdHRsZWQgZnVuY3Rpb25cbiAqIGlzIGludm9rZWQgbW9yZSB0aGFuIG9uY2UgZHVyaW5nIHRoZSBgd2FpdGAgdGltZW91dC5cbiAqXG4gKiBJZiBgd2FpdGAgaXMgYDBgIGFuZCBgbGVhZGluZ2AgaXMgYGZhbHNlYCwgYGZ1bmNgIGludm9jYXRpb24gaXMgZGVmZXJyZWRcbiAqIHVudGlsIHRvIHRoZSBuZXh0IHRpY2ssIHNpbWlsYXIgdG8gYHNldFRpbWVvdXRgIHdpdGggYSB0aW1lb3V0IG9mIGAwYC5cbiAqXG4gKiBTZWUgW0RhdmlkIENvcmJhY2hvJ3MgYXJ0aWNsZV0oaHR0cHM6Ly9jc3MtdHJpY2tzLmNvbS9kZWJvdW5jaW5nLXRocm90dGxpbmctZXhwbGFpbmVkLWV4YW1wbGVzLylcbiAqIGZvciBkZXRhaWxzIG92ZXIgdGhlIGRpZmZlcmVuY2VzIGJldHdlZW4gYF8udGhyb3R0bGVgIGFuZCBgXy5kZWJvdW5jZWAuXG4gKlxuICogQHN0YXRpY1xuICogQG1lbWJlck9mIF9cbiAqIEBzaW5jZSAwLjEuMFxuICogQGNhdGVnb3J5IEZ1bmN0aW9uXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBmdW5jIFRoZSBmdW5jdGlvbiB0byB0aHJvdHRsZS5cbiAqIEBwYXJhbSB7bnVtYmVyfSBbd2FpdD0wXSBUaGUgbnVtYmVyIG9mIG1pbGxpc2Vjb25kcyB0byB0aHJvdHRsZSBpbnZvY2F0aW9ucyB0by5cbiAqIEBwYXJhbSB7T2JqZWN0fSBbb3B0aW9ucz17fV0gVGhlIG9wdGlvbnMgb2JqZWN0LlxuICogQHBhcmFtIHtib29sZWFufSBbb3B0aW9ucy5sZWFkaW5nPXRydWVdXG4gKiAgU3BlY2lmeSBpbnZva2luZyBvbiB0aGUgbGVhZGluZyBlZGdlIG9mIHRoZSB0aW1lb3V0LlxuICogQHBhcmFtIHtib29sZWFufSBbb3B0aW9ucy50cmFpbGluZz10cnVlXVxuICogIFNwZWNpZnkgaW52b2tpbmcgb24gdGhlIHRyYWlsaW5nIGVkZ2Ugb2YgdGhlIHRpbWVvdXQuXG4gKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIG5ldyB0aHJvdHRsZWQgZnVuY3Rpb24uXG4gKiBAZXhhbXBsZVxuICpcbiAqIC8vIEF2b2lkIGV4Y2Vzc2l2ZWx5IHVwZGF0aW5nIHRoZSBwb3NpdGlvbiB3aGlsZSBzY3JvbGxpbmcuXG4gKiBqUXVlcnkod2luZG93KS5vbignc2Nyb2xsJywgXy50aHJvdHRsZSh1cGRhdGVQb3NpdGlvbiwgMTAwKSk7XG4gKlxuICogLy8gSW52b2tlIGByZW5ld1Rva2VuYCB3aGVuIHRoZSBjbGljayBldmVudCBpcyBmaXJlZCwgYnV0IG5vdCBtb3JlIHRoYW4gb25jZSBldmVyeSA1IG1pbnV0ZXMuXG4gKiB2YXIgdGhyb3R0bGVkID0gXy50aHJvdHRsZShyZW5ld1Rva2VuLCAzMDAwMDAsIHsgJ3RyYWlsaW5nJzogZmFsc2UgfSk7XG4gKiBqUXVlcnkoZWxlbWVudCkub24oJ2NsaWNrJywgdGhyb3R0bGVkKTtcbiAqXG4gKiAvLyBDYW5jZWwgdGhlIHRyYWlsaW5nIHRocm90dGxlZCBpbnZvY2F0aW9uLlxuICogalF1ZXJ5KHdpbmRvdykub24oJ3BvcHN0YXRlJywgdGhyb3R0bGVkLmNhbmNlbCk7XG4gKi9cbmZ1bmN0aW9uIHRocm90dGxlKGZ1bmMsIHdhaXQsIG9wdGlvbnMpIHtcbiAgdmFyIGxlYWRpbmcgPSB0cnVlLFxuICAgICAgdHJhaWxpbmcgPSB0cnVlO1xuXG4gIGlmICh0eXBlb2YgZnVuYyAhPSAnZnVuY3Rpb24nKSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcihGVU5DX0VSUk9SX1RFWFQpO1xuICB9XG4gIGlmIChpc09iamVjdChvcHRpb25zKSkge1xuICAgIGxlYWRpbmcgPSAnbGVhZGluZycgaW4gb3B0aW9ucyA/ICEhb3B0aW9ucy5sZWFkaW5nIDogbGVhZGluZztcbiAgICB0cmFpbGluZyA9ICd0cmFpbGluZycgaW4gb3B0aW9ucyA/ICEhb3B0aW9ucy50cmFpbGluZyA6IHRyYWlsaW5nO1xuICB9XG4gIHJldHVybiBkZWJvdW5jZShmdW5jLCB3YWl0LCB7XG4gICAgJ2xlYWRpbmcnOiBsZWFkaW5nLFxuICAgICdtYXhXYWl0Jzogd2FpdCxcbiAgICAndHJhaWxpbmcnOiB0cmFpbGluZ1xuICB9KTtcbn1cblxuLyoqXG4gKiBDaGVja3MgaWYgYHZhbHVlYCBpcyB0aGVcbiAqIFtsYW5ndWFnZSB0eXBlXShodHRwOi8vd3d3LmVjbWEtaW50ZXJuYXRpb25hbC5vcmcvZWNtYS0yNjIvNy4wLyNzZWMtZWNtYXNjcmlwdC1sYW5ndWFnZS10eXBlcylcbiAqIG9mIGBPYmplY3RgLiAoZS5nLiBhcnJheXMsIGZ1bmN0aW9ucywgb2JqZWN0cywgcmVnZXhlcywgYG5ldyBOdW1iZXIoMClgLCBhbmQgYG5ldyBTdHJpbmcoJycpYClcbiAqXG4gKiBAc3RhdGljXG4gKiBAbWVtYmVyT2YgX1xuICogQHNpbmNlIDAuMS4wXG4gKiBAY2F0ZWdvcnkgTGFuZ1xuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBhbiBvYmplY3QsIGVsc2UgYGZhbHNlYC5cbiAqIEBleGFtcGxlXG4gKlxuICogXy5pc09iamVjdCh7fSk7XG4gKiAvLyA9PiB0cnVlXG4gKlxuICogXy5pc09iamVjdChbMSwgMiwgM10pO1xuICogLy8gPT4gdHJ1ZVxuICpcbiAqIF8uaXNPYmplY3QoXy5ub29wKTtcbiAqIC8vID0+IHRydWVcbiAqXG4gKiBfLmlzT2JqZWN0KG51bGwpO1xuICogLy8gPT4gZmFsc2VcbiAqL1xuZnVuY3Rpb24gaXNPYmplY3QodmFsdWUpIHtcbiAgdmFyIHR5cGUgPSB0eXBlb2YgdmFsdWU7XG4gIHJldHVybiAhIXZhbHVlICYmICh0eXBlID09ICdvYmplY3QnIHx8IHR5cGUgPT0gJ2Z1bmN0aW9uJyk7XG59XG5cbi8qKlxuICogQ2hlY2tzIGlmIGB2YWx1ZWAgaXMgb2JqZWN0LWxpa2UuIEEgdmFsdWUgaXMgb2JqZWN0LWxpa2UgaWYgaXQncyBub3QgYG51bGxgXG4gKiBhbmQgaGFzIGEgYHR5cGVvZmAgcmVzdWx0IG9mIFwib2JqZWN0XCIuXG4gKlxuICogQHN0YXRpY1xuICogQG1lbWJlck9mIF9cbiAqIEBzaW5jZSA0LjAuMFxuICogQGNhdGVnb3J5IExhbmdcbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrLlxuICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgb2JqZWN0LWxpa2UsIGVsc2UgYGZhbHNlYC5cbiAqIEBleGFtcGxlXG4gKlxuICogXy5pc09iamVjdExpa2Uoe30pO1xuICogLy8gPT4gdHJ1ZVxuICpcbiAqIF8uaXNPYmplY3RMaWtlKFsxLCAyLCAzXSk7XG4gKiAvLyA9PiB0cnVlXG4gKlxuICogXy5pc09iamVjdExpa2UoXy5ub29wKTtcbiAqIC8vID0+IGZhbHNlXG4gKlxuICogXy5pc09iamVjdExpa2UobnVsbCk7XG4gKiAvLyA9PiBmYWxzZVxuICovXG5mdW5jdGlvbiBpc09iamVjdExpa2UodmFsdWUpIHtcbiAgcmV0dXJuICEhdmFsdWUgJiYgdHlwZW9mIHZhbHVlID09ICdvYmplY3QnO1xufVxuXG4vKipcbiAqIENoZWNrcyBpZiBgdmFsdWVgIGlzIGNsYXNzaWZpZWQgYXMgYSBgU3ltYm9sYCBwcmltaXRpdmUgb3Igb2JqZWN0LlxuICpcbiAqIEBzdGF0aWNcbiAqIEBtZW1iZXJPZiBfXG4gKiBAc2luY2UgNC4wLjBcbiAqIEBjYXRlZ29yeSBMYW5nXG4gKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay5cbiAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIGEgc3ltYm9sLCBlbHNlIGBmYWxzZWAuXG4gKiBAZXhhbXBsZVxuICpcbiAqIF8uaXNTeW1ib2woU3ltYm9sLml0ZXJhdG9yKTtcbiAqIC8vID0+IHRydWVcbiAqXG4gKiBfLmlzU3ltYm9sKCdhYmMnKTtcbiAqIC8vID0+IGZhbHNlXG4gKi9cbmZ1bmN0aW9uIGlzU3ltYm9sKHZhbHVlKSB7XG4gIHJldHVybiB0eXBlb2YgdmFsdWUgPT0gJ3N5bWJvbCcgfHxcbiAgICAoaXNPYmplY3RMaWtlKHZhbHVlKSAmJiBvYmplY3RUb1N0cmluZy5jYWxsKHZhbHVlKSA9PSBzeW1ib2xUYWcpO1xufVxuXG4vKipcbiAqIENvbnZlcnRzIGB2YWx1ZWAgdG8gYSBudW1iZXIuXG4gKlxuICogQHN0YXRpY1xuICogQG1lbWJlck9mIF9cbiAqIEBzaW5jZSA0LjAuMFxuICogQGNhdGVnb3J5IExhbmdcbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIHByb2Nlc3MuXG4gKiBAcmV0dXJucyB7bnVtYmVyfSBSZXR1cm5zIHRoZSBudW1iZXIuXG4gKiBAZXhhbXBsZVxuICpcbiAqIF8udG9OdW1iZXIoMy4yKTtcbiAqIC8vID0+IDMuMlxuICpcbiAqIF8udG9OdW1iZXIoTnVtYmVyLk1JTl9WQUxVRSk7XG4gKiAvLyA9PiA1ZS0zMjRcbiAqXG4gKiBfLnRvTnVtYmVyKEluZmluaXR5KTtcbiAqIC8vID0+IEluZmluaXR5XG4gKlxuICogXy50b051bWJlcignMy4yJyk7XG4gKiAvLyA9PiAzLjJcbiAqL1xuZnVuY3Rpb24gdG9OdW1iZXIodmFsdWUpIHtcbiAgaWYgKHR5cGVvZiB2YWx1ZSA9PSAnbnVtYmVyJykge1xuICAgIHJldHVybiB2YWx1ZTtcbiAgfVxuICBpZiAoaXNTeW1ib2wodmFsdWUpKSB7XG4gICAgcmV0dXJuIE5BTjtcbiAgfVxuICBpZiAoaXNPYmplY3QodmFsdWUpKSB7XG4gICAgdmFyIG90aGVyID0gdHlwZW9mIHZhbHVlLnZhbHVlT2YgPT0gJ2Z1bmN0aW9uJyA/IHZhbHVlLnZhbHVlT2YoKSA6IHZhbHVlO1xuICAgIHZhbHVlID0gaXNPYmplY3Qob3RoZXIpID8gKG90aGVyICsgJycpIDogb3RoZXI7XG4gIH1cbiAgaWYgKHR5cGVvZiB2YWx1ZSAhPSAnc3RyaW5nJykge1xuICAgIHJldHVybiB2YWx1ZSA9PT0gMCA/IHZhbHVlIDogK3ZhbHVlO1xuICB9XG4gIHZhbHVlID0gdmFsdWUucmVwbGFjZShyZVRyaW0sICcnKTtcbiAgdmFyIGlzQmluYXJ5ID0gcmVJc0JpbmFyeS50ZXN0KHZhbHVlKTtcbiAgcmV0dXJuIChpc0JpbmFyeSB8fCByZUlzT2N0YWwudGVzdCh2YWx1ZSkpXG4gICAgPyBmcmVlUGFyc2VJbnQodmFsdWUuc2xpY2UoMiksIGlzQmluYXJ5ID8gMiA6IDgpXG4gICAgOiAocmVJc0JhZEhleC50ZXN0KHZhbHVlKSA/IE5BTiA6ICt2YWx1ZSk7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gdGhyb3R0bGU7XG4iLCJ2YXIgZztcclxuXHJcbi8vIFRoaXMgd29ya3MgaW4gbm9uLXN0cmljdCBtb2RlXHJcbmcgPSAoZnVuY3Rpb24oKSB7XHJcblx0cmV0dXJuIHRoaXM7XHJcbn0pKCk7XHJcblxyXG50cnkge1xyXG5cdC8vIFRoaXMgd29ya3MgaWYgZXZhbCBpcyBhbGxvd2VkIChzZWUgQ1NQKVxyXG5cdGcgPSBnIHx8IEZ1bmN0aW9uKFwicmV0dXJuIHRoaXNcIikoKSB8fCAoMSwgZXZhbCkoXCJ0aGlzXCIpO1xyXG59IGNhdGNoIChlKSB7XHJcblx0Ly8gVGhpcyB3b3JrcyBpZiB0aGUgd2luZG93IHJlZmVyZW5jZSBpcyBhdmFpbGFibGVcclxuXHRpZiAodHlwZW9mIHdpbmRvdyA9PT0gXCJvYmplY3RcIikgZyA9IHdpbmRvdztcclxufVxyXG5cclxuLy8gZyBjYW4gc3RpbGwgYmUgdW5kZWZpbmVkLCBidXQgbm90aGluZyB0byBkbyBhYm91dCBpdC4uLlxyXG4vLyBXZSByZXR1cm4gdW5kZWZpbmVkLCBpbnN0ZWFkIG9mIG5vdGhpbmcgaGVyZSwgc28gaXQnc1xyXG4vLyBlYXNpZXIgdG8gaGFuZGxlIHRoaXMgY2FzZS4gaWYoIWdsb2JhbCkgeyAuLi59XHJcblxyXG5tb2R1bGUuZXhwb3J0cyA9IGc7XHJcbiIsIi8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gKiAgQ29weXJpZ2h0IChjKSBNaWNyb3NvZnQgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKiAgTGljZW5zZWQgdW5kZXIgdGhlIE1JVCBMaWNlbnNlLiBTZWUgTGljZW5zZS50eHQgaW4gdGhlIHByb2plY3Qgcm9vdCBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbi5cbiAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qL1xuaW1wb3J0IHsgZ2V0RWxlbWVudHNGb3JTb3VyY2VMaW5lIH0gZnJvbSAnLi9zY3JvbGwtc3luYyc7XG5cbmV4cG9ydCBjbGFzcyBBY3RpdmVMaW5lTWFya2VyIHtcblx0cHJpdmF0ZSBfY3VycmVudDogYW55O1xuXG5cdG9uRGlkQ2hhbmdlVGV4dEVkaXRvclNlbGVjdGlvbihsaW5lOiBudW1iZXIpIHtcblx0XHRjb25zdCB7IHByZXZpb3VzIH0gPSBnZXRFbGVtZW50c0ZvclNvdXJjZUxpbmUobGluZSk7XG5cdFx0dGhpcy5fdXBkYXRlKHByZXZpb3VzICYmIHByZXZpb3VzLmVsZW1lbnQpO1xuXHR9XG5cblx0X3VwZGF0ZShiZWZvcmU6IEhUTUxFbGVtZW50IHwgdW5kZWZpbmVkKSB7XG5cdFx0dGhpcy5fdW5tYXJrQWN0aXZlRWxlbWVudCh0aGlzLl9jdXJyZW50KTtcblx0XHR0aGlzLl9tYXJrQWN0aXZlRWxlbWVudChiZWZvcmUpO1xuXHRcdHRoaXMuX2N1cnJlbnQgPSBiZWZvcmU7XG5cdH1cblxuXHRfdW5tYXJrQWN0aXZlRWxlbWVudChlbGVtZW50OiBIVE1MRWxlbWVudCB8IHVuZGVmaW5lZCkge1xuXHRcdGlmICghZWxlbWVudCkge1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblx0XHRlbGVtZW50LmNsYXNzTmFtZSA9IGVsZW1lbnQuY2xhc3NOYW1lLnJlcGxhY2UoL1xcYmNvZGUtYWN0aXZlLWxpbmVcXGIvZywgJycpO1xuXHR9XG5cblx0X21hcmtBY3RpdmVFbGVtZW50KGVsZW1lbnQ6IEhUTUxFbGVtZW50IHwgdW5kZWZpbmVkKSB7XG5cdFx0aWYgKCFlbGVtZW50KSB7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXHRcdGVsZW1lbnQuY2xhc3NOYW1lICs9ICcgY29kZS1hY3RpdmUtbGluZSc7XG5cdH1cbn0iLCIvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICogIENvcHlyaWdodCAoYykgTWljcm9zb2Z0IENvcnBvcmF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICogIExpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgTGljZW5zZS4gU2VlIExpY2Vuc2UudHh0IGluIHRoZSBwcm9qZWN0IHJvb3QgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24uXG4gKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi9cblxuZXhwb3J0IGZ1bmN0aW9uIG9uY2VEb2N1bWVudExvYWRlZChmOiAoKSA9PiB2b2lkKSB7XG5cdGlmIChkb2N1bWVudC5yZWFkeVN0YXRlID09PSAnbG9hZGluZycgfHwgZG9jdW1lbnQucmVhZHlTdGF0ZSA9PT0gJ3VuaW5pdGlhbGl6ZWQnKSB7XG5cdFx0ZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignRE9NQ29udGVudExvYWRlZCcsIGYpO1xuXHR9IGVsc2Uge1xuXHRcdGYoKTtcblx0fVxufSIsIi8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gKiAgQ29weXJpZ2h0IChjKSBNaWNyb3NvZnQgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKiAgTGljZW5zZWQgdW5kZXIgdGhlIE1JVCBMaWNlbnNlLiBTZWUgTGljZW5zZS50eHQgaW4gdGhlIHByb2plY3Qgcm9vdCBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbi5cbiAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qL1xuXG5pbXBvcnQgeyBBY3RpdmVMaW5lTWFya2VyIH0gZnJvbSAnLi9hY3RpdmVMaW5lTWFya2VyJztcbmltcG9ydCB7IG9uY2VEb2N1bWVudExvYWRlZCB9IGZyb20gJy4vZXZlbnRzJztcbmltcG9ydCB7IGNyZWF0ZVBvc3RlckZvclZzQ29kZSB9IGZyb20gJy4vbWVzc2FnaW5nJztcbmltcG9ydCB7IGdldEVkaXRvckxpbmVOdW1iZXJGb3JQYWdlT2Zmc2V0LCBzY3JvbGxUb1JldmVhbFNvdXJjZUxpbmUgfSBmcm9tICcuL3Njcm9sbC1zeW5jJztcbmltcG9ydCB7IGdldFNldHRpbmdzIH0gZnJvbSAnLi9zZXR0aW5ncyc7XG5pbXBvcnQgdGhyb3R0bGUgPSByZXF1aXJlKCdsb2Rhc2gudGhyb3R0bGUnKTtcblxuZGVjbGFyZSB2YXIgYWNxdWlyZVZzQ29kZUFwaTogYW55O1xuXG52YXIgc2Nyb2xsRGlzYWJsZWQgPSB0cnVlO1xuY29uc3QgbWFya2VyID0gbmV3IEFjdGl2ZUxpbmVNYXJrZXIoKTtcbmNvbnN0IHNldHRpbmdzID0gZ2V0U2V0dGluZ3MoKTtcblxuY29uc3QgdnNjb2RlID0gYWNxdWlyZVZzQ29kZUFwaSgpO1xuY29uc3QgbWVzc2FnaW5nID0gY3JlYXRlUG9zdGVyRm9yVnNDb2RlKHZzY29kZSk7XG5cbndpbmRvdy5jc3BBbGVydGVyLnNldFBvc3RlcihtZXNzYWdpbmcpO1xud2luZG93LnN0eWxlTG9hZGluZ01vbml0b3Iuc2V0UG9zdGVyKG1lc3NhZ2luZyk7XG5cbm9uY2VEb2N1bWVudExvYWRlZCgoKSA9PiB7XG5cdGlmIChzZXR0aW5ncy5zY3JvbGxQcmV2aWV3V2l0aEVkaXRvcikge1xuXHRcdHNldFRpbWVvdXQoKCkgPT4ge1xuXHRcdFx0Y29uc3QgaW5pdGlhbExpbmUgPSArc2V0dGluZ3MubGluZTtcblx0XHRcdGlmICghaXNOYU4oaW5pdGlhbExpbmUpKSB7XG5cdFx0XHRcdHNjcm9sbERpc2FibGVkID0gdHJ1ZTtcblx0XHRcdFx0c2Nyb2xsVG9SZXZlYWxTb3VyY2VMaW5lKGluaXRpYWxMaW5lKTtcblx0XHRcdH1cblx0XHR9LCAwKTtcblx0fVxufSk7XG5cbmNvbnN0IG9uVXBkYXRlVmlldyA9ICgoKSA9PiB7XG5cdGNvbnN0IGRvU2Nyb2xsID0gdGhyb3R0bGUoKGxpbmU6IG51bWJlcikgPT4ge1xuXHRcdHNjcm9sbERpc2FibGVkID0gdHJ1ZTtcblx0XHRzY3JvbGxUb1JldmVhbFNvdXJjZUxpbmUobGluZSk7XG5cdH0sIDUwKTtcblxuXHRyZXR1cm4gKGxpbmU6IG51bWJlciwgc2V0dGluZ3M6IGFueSkgPT4ge1xuXHRcdGlmICghaXNOYU4obGluZSkpIHtcblx0XHRcdHNldHRpbmdzLmxpbmUgPSBsaW5lO1xuXHRcdFx0ZG9TY3JvbGwobGluZSk7XG5cdFx0fVxuXHR9O1xufSkoKTtcblxud2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ3Jlc2l6ZScsICgpID0+IHtcblx0c2Nyb2xsRGlzYWJsZWQgPSB0cnVlO1xufSwgdHJ1ZSk7XG5cbndpbmRvdy5hZGRFdmVudExpc3RlbmVyKCdtZXNzYWdlJywgZXZlbnQgPT4ge1xuXHRpZiAoZXZlbnQuZGF0YS5zb3VyY2UgIT09IHNldHRpbmdzLnNvdXJjZSkge1xuXHRcdHJldHVybjtcblx0fVxuXG5cdHN3aXRjaCAoZXZlbnQuZGF0YS50eXBlKSB7XG5cdFx0Y2FzZSAnb25EaWRDaGFuZ2VUZXh0RWRpdG9yU2VsZWN0aW9uJzpcblx0XHRcdG1hcmtlci5vbkRpZENoYW5nZVRleHRFZGl0b3JTZWxlY3Rpb24oZXZlbnQuZGF0YS5saW5lKTtcblx0XHRcdGJyZWFrO1xuXG5cdFx0Y2FzZSAndXBkYXRlVmlldyc6XG5cdFx0XHRvblVwZGF0ZVZpZXcoZXZlbnQuZGF0YS5saW5lLCBzZXR0aW5ncyk7XG5cdFx0XHRicmVhaztcblx0fVxufSwgZmFsc2UpO1xuXG5kb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdkYmxjbGljaycsIGV2ZW50ID0+IHtcblx0aWYgKCFzZXR0aW5ncy5kb3VibGVDbGlja1RvU3dpdGNoVG9FZGl0b3IpIHtcblx0XHRyZXR1cm47XG5cdH1cblxuXHQvLyBJZ25vcmUgY2xpY2tzIG9uIGxpbmtzXG5cdGZvciAobGV0IG5vZGUgPSBldmVudC50YXJnZXQgYXMgSFRNTEVsZW1lbnQ7IG5vZGU7IG5vZGUgPSBub2RlLnBhcmVudE5vZGUgYXMgSFRNTEVsZW1lbnQpIHtcblx0XHRpZiAobm9kZS50YWdOYW1lID09PSAnQScpIHtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cdH1cblxuXHRjb25zdCBvZmZzZXQgPSBldmVudC5wYWdlWTtcblx0Y29uc3QgbGluZSA9IGdldEVkaXRvckxpbmVOdW1iZXJGb3JQYWdlT2Zmc2V0KG9mZnNldCk7XG5cdGlmICh0eXBlb2YgbGluZSA9PT0gJ251bWJlcicgJiYgIWlzTmFOKGxpbmUpKSB7XG5cdFx0bWVzc2FnaW5nLnBvc3RNZXNzYWdlKCdkaWRDbGljaycsIHsgbGluZTogTWF0aC5mbG9vcihsaW5lKSB9KTtcblx0fVxufSk7XG5cbmRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgZXZlbnQgPT4ge1xuXHRpZiAoIWV2ZW50KSB7XG5cdFx0cmV0dXJuO1xuXHR9XG5cblx0bGV0IG5vZGU6IGFueSA9IGV2ZW50LnRhcmdldDtcblx0d2hpbGUgKG5vZGUpIHtcblx0XHRpZiAobm9kZS50YWdOYW1lICYmIG5vZGUudGFnTmFtZSA9PT0gJ0EnICYmIG5vZGUuaHJlZikge1xuXHRcdFx0aWYgKG5vZGUuZ2V0QXR0cmlidXRlKCdocmVmJykuc3RhcnRzV2l0aCgnIycpKSB7XG5cdFx0XHRcdGJyZWFrO1xuXHRcdFx0fVxuXHRcdFx0aWYgKG5vZGUuaHJlZi5zdGFydHNXaXRoKCdmaWxlOi8vJykgfHwgbm9kZS5ocmVmLnN0YXJ0c1dpdGgoJ3ZzY29kZS1yZXNvdXJjZTonKSkge1xuXHRcdFx0XHRjb25zdCBbcGF0aCwgZnJhZ21lbnRdID0gbm9kZS5ocmVmLnJlcGxhY2UoL14oZmlsZTpcXC9cXC98dnNjb2RlLXJlc291cmNlOikvaSwgJycpLnNwbGl0KCcjJyk7XG5cdFx0XHRcdG1lc3NhZ2luZy5wb3N0Q29tbWFuZCgnX21hcmtkb3duLm9wZW5Eb2N1bWVudExpbmsnLCBbeyBwYXRoLCBmcmFnbWVudCB9XSk7XG5cdFx0XHRcdGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG5cdFx0XHRcdGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuXHRcdFx0XHRicmVhaztcblx0XHRcdH1cblx0XHRcdGJyZWFrO1xuXHRcdH1cblx0XHRub2RlID0gbm9kZS5wYXJlbnROb2RlO1xuXHR9XG59LCB0cnVlKTtcblxuaWYgKHNldHRpbmdzLnNjcm9sbEVkaXRvcldpdGhQcmV2aWV3KSB7XG5cdHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCdzY3JvbGwnLCB0aHJvdHRsZSgoKSA9PiB7XG5cdFx0aWYgKHNjcm9sbERpc2FibGVkKSB7XG5cdFx0XHRzY3JvbGxEaXNhYmxlZCA9IGZhbHNlO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRjb25zdCBsaW5lID0gZ2V0RWRpdG9yTGluZU51bWJlckZvclBhZ2VPZmZzZXQod2luZG93LnNjcm9sbFkpO1xuXHRcdFx0aWYgKHR5cGVvZiBsaW5lID09PSAnbnVtYmVyJyAmJiAhaXNOYU4obGluZSkpIHtcblx0XHRcdFx0bWVzc2FnaW5nLnBvc3RNZXNzYWdlKCdyZXZlYWxMaW5lJywgeyBsaW5lIH0pO1xuXHRcdFx0fVxuXHRcdH1cblx0fSwgNTApKTtcbn0iLCIvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICogIENvcHlyaWdodCAoYykgTWljcm9zb2Z0IENvcnBvcmF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICogIExpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgTGljZW5zZS4gU2VlIExpY2Vuc2UudHh0IGluIHRoZSBwcm9qZWN0IHJvb3QgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24uXG4gKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi9cblxuaW1wb3J0IHsgZ2V0U2V0dGluZ3MgfSBmcm9tICcuL3NldHRpbmdzJztcblxuZXhwb3J0IGludGVyZmFjZSBNZXNzYWdlUG9zdGVyIHtcblx0LyoqXG5cdCAqIFBvc3QgYSBtZXNzYWdlIHRvIHRoZSBtYXJrZG93biBleHRlbnNpb25cblx0ICovXG5cdHBvc3RNZXNzYWdlKHR5cGU6IHN0cmluZywgYm9keTogb2JqZWN0KTogdm9pZDtcblxuXG5cdC8qKlxuXHQgKiBQb3N0IGEgY29tbWFuZCB0byBiZSBleGVjdXRlZCB0byB0aGUgbWFya2Rvd24gZXh0ZW5zaW9uXG5cdCAqL1xuXHRwb3N0Q29tbWFuZChjb21tYW5kOiBzdHJpbmcsIGFyZ3M6IGFueVtdKTogdm9pZDtcbn1cblxuZXhwb3J0IGNvbnN0IGNyZWF0ZVBvc3RlckZvclZzQ29kZSA9ICh2c2NvZGU6IGFueSkgPT4ge1xuXHRyZXR1cm4gbmV3IGNsYXNzIGltcGxlbWVudHMgTWVzc2FnZVBvc3RlciB7XG5cdFx0cG9zdE1lc3NhZ2UodHlwZTogc3RyaW5nLCBib2R5OiBvYmplY3QpOiB2b2lkIHtcblx0XHRcdHZzY29kZS5wb3N0TWVzc2FnZSh7XG5cdFx0XHRcdHR5cGUsXG5cdFx0XHRcdHNvdXJjZTogZ2V0U2V0dGluZ3MoKS5zb3VyY2UsXG5cdFx0XHRcdGJvZHlcblx0XHRcdH0pO1xuXHRcdH1cblx0XHRwb3N0Q29tbWFuZChjb21tYW5kOiBzdHJpbmcsIGFyZ3M6IGFueVtdKSB7XG5cdFx0XHR0aGlzLnBvc3RNZXNzYWdlKCdjb21tYW5kJywgeyBjb21tYW5kLCBhcmdzIH0pO1xuXHRcdH1cblx0fTtcbn07XG5cbiIsIi8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gKiAgQ29weXJpZ2h0IChjKSBNaWNyb3NvZnQgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKiAgTGljZW5zZWQgdW5kZXIgdGhlIE1JVCBMaWNlbnNlLiBTZWUgTGljZW5zZS50eHQgaW4gdGhlIHByb2plY3Qgcm9vdCBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbi5cbiAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qL1xuXG5pbXBvcnQgeyBnZXRTZXR0aW5ncyB9IGZyb20gJy4vc2V0dGluZ3MnO1xuXG5cbmZ1bmN0aW9uIGNsYW1wKG1pbjogbnVtYmVyLCBtYXg6IG51bWJlciwgdmFsdWU6IG51bWJlcikge1xuXHRyZXR1cm4gTWF0aC5taW4obWF4LCBNYXRoLm1heChtaW4sIHZhbHVlKSk7XG59XG5cbmZ1bmN0aW9uIGNsYW1wTGluZShsaW5lOiBudW1iZXIpIHtcblx0cmV0dXJuIGNsYW1wKDAsIGdldFNldHRpbmdzKCkubGluZUNvdW50IC0gMSwgbGluZSk7XG59XG5cblxuZXhwb3J0IGludGVyZmFjZSBDb2RlTGluZUVsZW1lbnQge1xuXHRlbGVtZW50OiBIVE1MRWxlbWVudDtcblx0bGluZTogbnVtYmVyO1xufVxuXG5jb25zdCBnZXRDb2RlTGluZUVsZW1lbnRzID0gKCgpID0+IHtcblx0bGV0IGVsZW1lbnRzOiBDb2RlTGluZUVsZW1lbnRbXTtcblx0cmV0dXJuICgpID0+IHtcblx0XHRpZiAoIWVsZW1lbnRzKSB7XG5cdFx0XHRlbGVtZW50cyA9IEFycmF5LnByb3RvdHlwZS5tYXAuY2FsbChcblx0XHRcdFx0ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgnY29kZS1saW5lJyksXG5cdFx0XHRcdChlbGVtZW50OiBhbnkpID0+IHtcblx0XHRcdFx0XHRjb25zdCBsaW5lID0gK2VsZW1lbnQuZ2V0QXR0cmlidXRlKCdkYXRhLWxpbmUnKTtcblx0XHRcdFx0XHRyZXR1cm4geyBlbGVtZW50LCBsaW5lIH07XG5cdFx0XHRcdH0pXG5cdFx0XHRcdC5maWx0ZXIoKHg6IGFueSkgPT4gIWlzTmFOKHgubGluZSkpO1xuXHRcdH1cblx0XHRyZXR1cm4gZWxlbWVudHM7XG5cdH07XG59KSgpO1xuXG4vKipcbiAqIEZpbmQgdGhlIGh0bWwgZWxlbWVudHMgdGhhdCBtYXAgdG8gYSBzcGVjaWZpYyB0YXJnZXQgbGluZSBpbiB0aGUgZWRpdG9yLlxuICpcbiAqIElmIGFuIGV4YWN0IG1hdGNoLCByZXR1cm5zIGEgc2luZ2xlIGVsZW1lbnQuIElmIHRoZSBsaW5lIGlzIGJldHdlZW4gZWxlbWVudHMsXG4gKiByZXR1cm5zIHRoZSBlbGVtZW50IHByaW9yIHRvIGFuZCB0aGUgZWxlbWVudCBhZnRlciB0aGUgZ2l2ZW4gbGluZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldEVsZW1lbnRzRm9yU291cmNlTGluZSh0YXJnZXRMaW5lOiBudW1iZXIpOiB7IHByZXZpb3VzOiBDb2RlTGluZUVsZW1lbnQ7IG5leHQ/OiBDb2RlTGluZUVsZW1lbnQ7IH0ge1xuXHRjb25zdCBsaW5lTnVtYmVyID0gTWF0aC5mbG9vcih0YXJnZXRMaW5lKTtcblx0Y29uc3QgbGluZXMgPSBnZXRDb2RlTGluZUVsZW1lbnRzKCk7XG5cdGxldCBwcmV2aW91cyA9IGxpbmVzWzBdIHx8IG51bGw7XG5cdGZvciAoY29uc3QgZW50cnkgb2YgbGluZXMpIHtcblx0XHRpZiAoZW50cnkubGluZSA9PT0gbGluZU51bWJlcikge1xuXHRcdFx0cmV0dXJuIHsgcHJldmlvdXM6IGVudHJ5LCBuZXh0OiB1bmRlZmluZWQgfTtcblx0XHR9XG5cdFx0ZWxzZSBpZiAoZW50cnkubGluZSA+IGxpbmVOdW1iZXIpIHtcblx0XHRcdHJldHVybiB7IHByZXZpb3VzLCBuZXh0OiBlbnRyeSB9O1xuXHRcdH1cblx0XHRwcmV2aW91cyA9IGVudHJ5O1xuXHR9XG5cdHJldHVybiB7IHByZXZpb3VzIH07XG59XG5cbi8qKlxuICogRmluZCB0aGUgaHRtbCBlbGVtZW50cyB0aGF0IGFyZSBhdCBhIHNwZWNpZmljIHBpeGVsIG9mZnNldCBvbiB0aGUgcGFnZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldExpbmVFbGVtZW50c0F0UGFnZU9mZnNldChvZmZzZXQ6IG51bWJlcik6IHsgcHJldmlvdXM6IENvZGVMaW5lRWxlbWVudDsgbmV4dD86IENvZGVMaW5lRWxlbWVudDsgfSB7XG5cdGNvbnN0IGxpbmVzID0gZ2V0Q29kZUxpbmVFbGVtZW50cygpO1xuXHRjb25zdCBwb3NpdGlvbiA9IG9mZnNldCAtIHdpbmRvdy5zY3JvbGxZO1xuXHRsZXQgbG8gPSAtMTtcblx0bGV0IGhpID0gbGluZXMubGVuZ3RoIC0gMTtcblx0d2hpbGUgKGxvICsgMSA8IGhpKSB7XG5cdFx0Y29uc3QgbWlkID0gTWF0aC5mbG9vcigobG8gKyBoaSkgLyAyKTtcblx0XHRjb25zdCBib3VuZHMgPSBsaW5lc1ttaWRdLmVsZW1lbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG5cdFx0aWYgKGJvdW5kcy50b3AgKyBib3VuZHMuaGVpZ2h0ID49IHBvc2l0aW9uKSB7XG5cdFx0XHRoaSA9IG1pZDtcblx0XHR9XG5cdFx0ZWxzZSB7XG5cdFx0XHRsbyA9IG1pZDtcblx0XHR9XG5cdH1cblx0Y29uc3QgaGlFbGVtZW50ID0gbGluZXNbaGldO1xuXHRjb25zdCBoaUJvdW5kcyA9IGhpRWxlbWVudC5lbGVtZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuXHRpZiAoaGkgPj0gMSAmJiBoaUJvdW5kcy50b3AgPiBwb3NpdGlvbikge1xuXHRcdGNvbnN0IGxvRWxlbWVudCA9IGxpbmVzW2xvXTtcblx0XHRyZXR1cm4geyBwcmV2aW91czogbG9FbGVtZW50LCBuZXh0OiBoaUVsZW1lbnQgfTtcblx0fVxuXHRyZXR1cm4geyBwcmV2aW91czogaGlFbGVtZW50IH07XG59XG5cbi8qKlxuICogQXR0ZW1wdCB0byByZXZlYWwgdGhlIGVsZW1lbnQgZm9yIGEgc291cmNlIGxpbmUgaW4gdGhlIGVkaXRvci5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNjcm9sbFRvUmV2ZWFsU291cmNlTGluZShsaW5lOiBudW1iZXIpIHtcblx0Y29uc3QgeyBwcmV2aW91cywgbmV4dCB9ID0gZ2V0RWxlbWVudHNGb3JTb3VyY2VMaW5lKGxpbmUpO1xuXHRpZiAocHJldmlvdXMgJiYgZ2V0U2V0dGluZ3MoKS5zY3JvbGxQcmV2aWV3V2l0aEVkaXRvcikge1xuXHRcdGxldCBzY3JvbGxUbyA9IDA7XG5cdFx0Y29uc3QgcmVjdCA9IHByZXZpb3VzLmVsZW1lbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG5cdFx0Y29uc3QgcHJldmlvdXNUb3AgPSByZWN0LnRvcDtcblx0XHRpZiAobmV4dCAmJiBuZXh0LmxpbmUgIT09IHByZXZpb3VzLmxpbmUpIHtcblx0XHRcdC8vIEJldHdlZW4gdHdvIGVsZW1lbnRzLiBHbyB0byBwZXJjZW50YWdlIG9mZnNldCBiZXR3ZWVuIHRoZW0uXG5cdFx0XHRjb25zdCBiZXR3ZWVuUHJvZ3Jlc3MgPSAobGluZSAtIHByZXZpb3VzLmxpbmUpIC8gKG5leHQubGluZSAtIHByZXZpb3VzLmxpbmUpO1xuXHRcdFx0Y29uc3QgZWxlbWVudE9mZnNldCA9IG5leHQuZWxlbWVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS50b3AgLSBwcmV2aW91c1RvcDtcblx0XHRcdHNjcm9sbFRvID0gcHJldmlvdXNUb3AgKyBiZXR3ZWVuUHJvZ3Jlc3MgKiBlbGVtZW50T2Zmc2V0O1xuXHRcdH1cblx0XHRlbHNlIHtcblx0XHRcdHNjcm9sbFRvID0gcHJldmlvdXNUb3A7XG5cdFx0fVxuXHRcdHdpbmRvdy5zY3JvbGwoMCwgTWF0aC5tYXgoMSwgd2luZG93LnNjcm9sbFkgKyBzY3JvbGxUbykpO1xuXHR9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRFZGl0b3JMaW5lTnVtYmVyRm9yUGFnZU9mZnNldChvZmZzZXQ6IG51bWJlcikge1xuXHRjb25zdCB7IHByZXZpb3VzLCBuZXh0IH0gPSBnZXRMaW5lRWxlbWVudHNBdFBhZ2VPZmZzZXQob2Zmc2V0KTtcblx0aWYgKHByZXZpb3VzKSB7XG5cdFx0Y29uc3QgcHJldmlvdXNCb3VuZHMgPSBwcmV2aW91cy5lbGVtZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuXHRcdGNvbnN0IG9mZnNldEZyb21QcmV2aW91cyA9IChvZmZzZXQgLSB3aW5kb3cuc2Nyb2xsWSAtIHByZXZpb3VzQm91bmRzLnRvcCk7XG5cdFx0aWYgKG5leHQpIHtcblx0XHRcdGNvbnN0IHByb2dyZXNzQmV0d2VlbkVsZW1lbnRzID0gb2Zmc2V0RnJvbVByZXZpb3VzIC8gKG5leHQuZWxlbWVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS50b3AgLSBwcmV2aW91c0JvdW5kcy50b3ApO1xuXHRcdFx0Y29uc3QgbGluZSA9IHByZXZpb3VzLmxpbmUgKyBwcm9ncmVzc0JldHdlZW5FbGVtZW50cyAqIChuZXh0LmxpbmUgLSBwcmV2aW91cy5saW5lKTtcblx0XHRcdHJldHVybiBjbGFtcExpbmUobGluZSk7XG5cdFx0fVxuXHRcdGVsc2Uge1xuXHRcdFx0Y29uc3QgcHJvZ3Jlc3NXaXRoaW5FbGVtZW50ID0gb2Zmc2V0RnJvbVByZXZpb3VzIC8gKHByZXZpb3VzQm91bmRzLmhlaWdodCk7XG5cdFx0XHRjb25zdCBsaW5lID0gcHJldmlvdXMubGluZSArIHByb2dyZXNzV2l0aGluRWxlbWVudDtcblx0XHRcdHJldHVybiBjbGFtcExpbmUobGluZSk7XG5cdFx0fVxuXHR9XG5cdHJldHVybiBudWxsO1xufVxuIiwiLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAqICBDb3B5cmlnaHQgKGMpIE1pY3Jvc29mdCBDb3Jwb3JhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqICBMaWNlbnNlZCB1bmRlciB0aGUgTUlUIExpY2Vuc2UuIFNlZSBMaWNlbnNlLnR4dCBpbiB0aGUgcHJvamVjdCByb290IGZvciBsaWNlbnNlIGluZm9ybWF0aW9uLlxuICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovXG5cbmV4cG9ydCBpbnRlcmZhY2UgUHJldmlld1NldHRpbmdzIHtcblx0c291cmNlOiBzdHJpbmc7XG5cdGxpbmU6IG51bWJlcjtcblx0bGluZUNvdW50OiBudW1iZXI7XG5cdHNjcm9sbFByZXZpZXdXaXRoRWRpdG9yPzogYm9vbGVhbjtcblx0c2Nyb2xsRWRpdG9yV2l0aFByZXZpZXc6IGJvb2xlYW47XG5cdGRpc2FibGVTZWN1cml0eVdhcm5pbmdzOiBib29sZWFuO1xuXHRkb3VibGVDbGlja1RvU3dpdGNoVG9FZGl0b3I6IGJvb2xlYW47XG59XG5cbmxldCBjYWNoZWRTZXR0aW5nczogUHJldmlld1NldHRpbmdzIHwgdW5kZWZpbmVkID0gdW5kZWZpbmVkO1xuXG5leHBvcnQgZnVuY3Rpb24gZ2V0U2V0dGluZ3MoKTogUHJldmlld1NldHRpbmdzIHtcblx0aWYgKGNhY2hlZFNldHRpbmdzKSB7XG5cdFx0cmV0dXJuIGNhY2hlZFNldHRpbmdzO1xuXHR9XG5cblx0Y29uc3QgZWxlbWVudCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd2c2NvZGUtbWFya2Rvd24tcHJldmlldy1kYXRhJyk7XG5cdGlmIChlbGVtZW50KSB7XG5cdFx0Y29uc3QgZGF0YSA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlKCdkYXRhLXNldHRpbmdzJyk7XG5cdFx0aWYgKGRhdGEpIHtcblx0XHRcdGNhY2hlZFNldHRpbmdzID0gSlNPTi5wYXJzZShkYXRhKTtcblx0XHRcdHJldHVybiBjYWNoZWRTZXR0aW5ncyE7XG5cdFx0fVxuXHR9XG5cblx0dGhyb3cgbmV3IEVycm9yKCdDb3VsZCBub3QgbG9hZCBzZXR0aW5ncycpO1xufVxuIl0sInNvdXJjZVJvb3QiOiIifQ== \ No newline at end of file diff --git a/extensions/markdown-language-features/media/pre.js b/extensions/markdown-language-features/media/pre.js index 340d2b1f95c..3089452ac04 100644 --- a/extensions/markdown-language-features/media/pre.js +++ b/extensions/markdown-language-features/media/pre.js @@ -87,26 +87,36 @@ Object.defineProperty(exports, "__esModule", { value: true }); const settings_1 = __webpack_require__(/*! ./settings */ "./preview-src/settings.ts"); const strings_1 = __webpack_require__(/*! ./strings */ "./preview-src/strings.ts"); -const messaging_1 = __webpack_require__(/*! ./messaging */ "./preview-src/messaging.ts"); /** * Shows an alert when there is a content security policy violation. */ class CspAlerter { constructor() { this.didShow = false; + this.didHaveCspWarning = false; document.addEventListener('securitypolicyviolation', () => { - this.showCspWarning(); + this.onCspWarning(); }); window.addEventListener('message', (event) => { if (event && event.data && event.data.name === 'vscode-did-block-svg') { - this.showCspWarning(); + this.onCspWarning(); } }); } + setPoster(poster) { + this.messaging = poster; + if (this.didHaveCspWarning) { + this.showCspWarning(); + } + } + onCspWarning() { + this.didHaveCspWarning = true; + this.showCspWarning(); + } showCspWarning() { const strings = strings_1.getStrings(); const settings = settings_1.getSettings(); - if (this.didShow || settings.disableSecurityWarnings) { + if (this.didShow || settings.disableSecurityWarnings || !this.messaging) { return; } this.didShow = true; @@ -117,7 +127,7 @@ class CspAlerter { notification.setAttribute('role', 'button'); notification.setAttribute('aria-label', strings.cspAlertMessageLabel); notification.onclick = () => { - messaging_1.postCommand('markdown.showPreviewSecuritySelector', [settings.source]); + this.messaging.postCommand('markdown.showPreviewSecuritySelector', [settings.source]); }; document.body.appendChild(notification); } @@ -137,14 +147,10 @@ exports.CspAlerter = CspAlerter; "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); -/*--------------------------------------------------------------------------------------------- - * Copyright (c) Microsoft Corporation. All rights reserved. - * Licensed under the MIT License. See License.txt in the project root for license information. - *--------------------------------------------------------------------------------------------*/ -const messaging_1 = __webpack_require__(/*! ./messaging */ "./preview-src/messaging.ts"); class StyleLoadingMonitor { constructor() { this.unloadedStyles = []; + this.finishedLoading = false; const onStyleLoadError = (event) => { const source = event.target.dataset.source; this.unloadedStyles.push(source); @@ -160,50 +166,22 @@ class StyleLoadingMonitor { if (!this.unloadedStyles.length) { return; } - messaging_1.postCommand('_markdown.onPreviewStyleLoadError', [this.unloadedStyles]); + this.finishedLoading = true; + if (this.poster) { + this.poster.postCommand('_markdown.onPreviewStyleLoadError', [this.unloadedStyles]); + } }); } + setPoster(poster) { + this.poster = poster; + if (this.finishedLoading) { + poster.postCommand('_markdown.onPreviewStyleLoadError', [this.unloadedStyles]); + } + } } exports.StyleLoadingMonitor = StyleLoadingMonitor; -/***/ }), - -/***/ "./preview-src/messaging.ts": -/*!**********************************!*\ - !*** ./preview-src/messaging.ts ***! - \**********************************/ -/*! no static exports found */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; - -/*--------------------------------------------------------------------------------------------- - * Copyright (c) Microsoft Corporation. All rights reserved. - * Licensed under the MIT License. See License.txt in the project root for license information. - *--------------------------------------------------------------------------------------------*/ -Object.defineProperty(exports, "__esModule", { value: true }); -const settings_1 = __webpack_require__(/*! ./settings */ "./preview-src/settings.ts"); -/** - * Post a message to the markdown extension - */ -function postMessage(type, body) { - vscode.postMessage({ - type, - source: settings_1.getSettings().source, - body - }); -} -exports.postMessage = postMessage; -/** - * Post a command to be executed to the markdown extension - */ -function postCommand(command, args) { - postMessage('command', { command, args }); -} -exports.postCommand = postCommand; - - /***/ }), /***/ "./preview-src/pre.ts": @@ -222,10 +200,8 @@ exports.postCommand = postCommand; Object.defineProperty(exports, "__esModule", { value: true }); const csp_1 = __webpack_require__(/*! ./csp */ "./preview-src/csp.ts"); const loading_1 = __webpack_require__(/*! ./loading */ "./preview-src/loading.ts"); -// tslint:disable-next-line:no-unused-expression -new csp_1.CspAlerter(); -// tslint:disable-next-line:no-unused-expression -new loading_1.StyleLoadingMonitor(); +window.cspAlerter = new csp_1.CspAlerter(); +window.styleLoadingMonitor = new loading_1.StyleLoadingMonitor(); /***/ }), @@ -294,4 +270,4 @@ exports.getStrings = getStrings; /***/ }) /******/ }); -//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vd2VicGFjay9ib290c3RyYXAiLCJ3ZWJwYWNrOi8vLy4vcHJldmlldy1zcmMvY3NwLnRzIiwid2VicGFjazovLy8uL3ByZXZpZXctc3JjL2xvYWRpbmcudHMiLCJ3ZWJwYWNrOi8vLy4vcHJldmlldy1zcmMvbWVzc2FnaW5nLnRzIiwid2VicGFjazovLy8uL3ByZXZpZXctc3JjL3ByZS50cyIsIndlYnBhY2s6Ly8vLi9wcmV2aWV3LXNyYy9zZXR0aW5ncy50cyIsIndlYnBhY2s6Ly8vLi9wcmV2aWV3LXNyYy9zdHJpbmdzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBSztBQUNMO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLHlEQUFpRCxjQUFjO0FBQy9EOztBQUVBO0FBQ0E7QUFDQTtBQUNBLG1DQUEyQiwwQkFBMEIsRUFBRTtBQUN2RCx5Q0FBaUMsZUFBZTtBQUNoRDtBQUNBO0FBQ0E7O0FBRUE7QUFDQSw4REFBc0QsK0RBQStEOztBQUVySDtBQUNBOzs7QUFHQTtBQUNBOzs7Ozs7Ozs7Ozs7OztBQ25FQTs7O2dHQUdnRzs7QUFFaEcsc0ZBQXlDO0FBQ3pDLG1GQUF1QztBQUN2Qyx5RkFBMEM7QUFFMUM7O0dBRUc7QUFDSDtJQUdDO1FBRlEsWUFBTyxHQUFHLEtBQUssQ0FBQztRQUd2QixRQUFRLENBQUMsZ0JBQWdCLENBQUMseUJBQXlCLEVBQUUsR0FBRyxFQUFFO1lBQ3pELElBQUksQ0FBQyxjQUFjLEVBQUUsQ0FBQztRQUN2QixDQUFDLENBQUMsQ0FBQztRQUVILE1BQU0sQ0FBQyxnQkFBZ0IsQ0FBQyxTQUFTLEVB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RDs7O2dHQUdnRzs7QUFFaEc7SUFDQyxNQUFNLEtBQUssR0FBRyxRQUFRLENBQUMsY0FBYyxDQUFDLDhCQUE4QixDQUFDLENBQUM7SUFDdEUsRUFBRSxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQztRQUNYLE1BQU0sSUFBSSxHQUFHLEtBQUssQ0FBQyxZQUFZLENBQUMsY0FBYyxDQUFDLENBQUM7UUFDaEQsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQztZQUNWLE1BQU0sQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ3pCLENBQUM7SUFDRixDQUFDO0lBQ0QsTUFBTSxJQUFJLEtBQUssQ0FBQyx3QkFBd0IsQ0FBQyxDQUFDO0FBQzNDLENBQUM7QUFURCxnQ0FTQyIsImZpbGUiOiJwcmUuanMiLCJzb3VyY2VzQ29udGVudCI6WyIgXHQvLyBUaGUgbW9kdWxlIGNhY2hlXG4gXHR2YXIgaW5zdGFsbGVkTW9kdWxlcyA9IHt9O1xuXG4gXHQvLyBUaGUgcmVxdWlyZSBmdW5jdGlvblxuIFx0ZnVuY3Rpb24gX193ZWJwYWNrX3JlcXVpcmVfXyhtb2R1bGVJZCkge1xuXG4gXHRcdC8vIENoZWNrIGlmIG1vZHVsZSBpcyBpbiBjYWNoZVxuIFx0XHRpZihpbnN0YWxsZWRNb2R1bGVzW21vZHVsZUlkXSkge1xuIFx0XHRcdHJldHVybiBpbnN0YWxsZWRNb2R1bGVzW21vZHVsZUlkXS5leHBvcnRzO1xuIFx0XHR9XG4gXHRcdC8vIENyZWF0ZSBhIG5ldyBtb2R1bGUgKGFuZCBwdXQgaXQgaW50byB0aGUgY2FjaGUpXG4gXHRcdHZhciBtb2R1bGUgPSBpbnN0YWxsZWRNb2R1bGVzW21vZHVsZUlkXSA9IHtcbiBcdFx0XHRpOiBtb2R1bGVJZCxcbiBcdFx0XHRsOiBmYWxzZSxcbiBcdFx0XHRleHBvcnRzOiB7fVxuIFx0XHR9O1xuXG4gXHRcdC8vIEV4ZWN1dGUgdGhlIG1vZHVsZSBmdW5jdGlvblxuIFx0XHRtb2R1bGVzW21vZHVsZUlkXS5jYWxsKG1vZHVsZS5leHBvcnRzLCBtb2R1bGUsIG1vZHVsZS5leHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKTtcblxuIFx0XHQvLyBGbGFnIHRoZSBtb2R1bGUgYXMgbG9hZGVkXG4gXHRcdG1vZHVsZS5sID0gdHJ1ZTtcblxuIFx0XHQvLyBSZXR1cm4gdGhlIGV4cG9ydHMgb2YgdGhlIG1vZHVsZVxuIFx0XHRyZXR1cm4gbW9kdWxlLmV4cG9ydHM7XG4gXHR9XG5cblxuIFx0Ly8gZXhwb3NlIHRoZSBtb2R1bGVzIG9iamVjdCAoX193ZWJwYWNrX21vZHVsZXNfXylcbiBcdF9fd2VicGFja19yZXF1aXJlX18ubSA9IG1vZHVsZXM7XG5cbiBcdC8vIGV4cG9zZSB0aGUgbW9kdWxlIGNhY2hlXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLmMgPSBpbnN0YWxsZWRNb2R1bGVzO1xuXG4gXHQvLyBkZWZpbmUgZ2V0dGVyIGZ1bmN0aW9uIGZvciBoYXJtb255IGV4cG9ydHNcbiBcdF9fd2VicGFja19yZXF1aXJlX18uZCA9IGZ1bmN0aW9uKGV4cG9ydHMsIG5hbWUsIGdldHRlcikge1xuIFx0XHRpZighX193ZWJwYWNrX3JlcXVpcmVfXy5vKGV4cG9ydHMsIG5hbWUpKSB7XG4gXHRcdFx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIG5hbWUsIHtcbiBcdFx0XHRcdGNvbmZpZ3VyYWJsZTogZmFsc2UsXG4gXHRcdFx0XHRlbnVtZXJhYmxlOiB0cnVlLFxuIFx0XHRcdFx0Z2V0OiBnZXR0ZXJcbiBcdFx0XHR9KTtcbiBcdFx0fVxuIFx0fTtcblxuIFx0Ly8gZGVmaW5lIF9fZXNNb2R1bGUgb24gZXhwb3J0c1xuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5yID0gZnVuY3Rpb24oZXhwb3J0cykge1xuIFx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgJ19fZXNNb2R1bGUnLCB7IHZhbHVlOiB0cnVlIH0pO1xuIFx0fTtcblxuIFx0Ly8gZ2V0RGVmYXVsdEV4cG9ydCBmdW5jdGlvbiBmb3IgY29tcGF0aWJpbGl0eSB3aXRoIG5vbi1oYXJtb255IG1vZHVsZXNcbiBcdF9fd2VicGFja19yZXF1aXJlX18ubiA9IGZ1bmN0aW9uKG1vZHVsZSkge1xuIFx0XHR2YXIgZ2V0dGVyID0gbW9kdWxlICYmIG1vZHVsZS5fX2VzTW9kdWxlID9cbiBcdFx0XHRmdW5jdGlvbiBnZXREZWZhdWx0KCkgeyByZXR1cm4gbW9kdWxlWydkZWZhdWx0J107IH0gOlxuIFx0XHRcdGZ1bmN0aW9uIGdldE1vZHVsZUV4cG9ydHMoKSB7IHJldHVybiBtb2R1bGU7IH07XG4gXHRcdF9fd2VicGFja19yZXF1aXJlX18uZChnZXR0ZXIsICdhJywgZ2V0dGVyKTtcbiBcdFx0cmV0dXJuIGdldHRlcjtcbiBcdH07XG5cbiBcdC8vIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbFxuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5vID0gZnVuY3Rpb24ob2JqZWN0LCBwcm9wZXJ0eSkgeyByZXR1cm4gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG9iamVjdCwgcHJvcGVydHkpOyB9O1xuXG4gXHQvLyBfX3dlYnBhY2tfcHVibGljX3BhdGhfX1xuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5wID0gXCJcIjtcblxuXG4gXHQvLyBMb2FkIGVudHJ5IG1vZHVsZSBhbmQgcmV0dXJuIGV4cG9ydHNcbiBcdHJldHVybiBfX3dlYnBhY2tfcmVxdWlyZV9fKF9fd2VicGFja19yZXF1aXJlX18ucyA9IFwiLi9wcmV2aWV3LXNyYy9wcmUudHNcIik7XG4iLCIvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICogIENvcHlyaWdodCAoYykgTWljcm9zb2Z0IENvcnBvcmF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICogIExpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgTGljZW5zZS4gU2VlIExpY2Vuc2UudHh0IGluIHRoZSBwcm9qZWN0IHJvb3QgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24uXG4gKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi9cblxuaW1wb3J0IHsgZ2V0U2V0dGluZ3MgfSBmcm9tICcuL3NldHRpbmdzJztcbmltcG9ydCB7IGdldFN0cmluZ3MgfSBmcm9tICcuL3N0cmluZ3MnO1xuaW1wb3J0IHsgcG9zdENvbW1hbmQgfSBmcm9tICcuL21lc3NhZ2luZyc7XG5cbi8qKlxuICogU2hvd3MgYW4gYWxlcnQgd2hlbiB0aGVyZSBpcyBhIGNvbnRlbnQgc2VjdXJpdHkgcG9saWN5IHZpb2xhdGlvbi5cbiAqL1xuZXhwb3J0IGNsYXNzIENzcEFsZXJ0ZXIge1xuXHRwcml2YXRlIGRpZFNob3cgPSBmYWxzZTtcblxuXHRjb25zdHJ1Y3RvcigpIHtcblx0XHRkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdzZWN1cml0eXBvbGljeXZpb2xhdGlvbicsICgpID0+IHtcblx0XHRcdHRoaXMuc2hvd0NzcFdhcm5pbmcoKTtcblx0XHR9KTtcblxuXHRcdHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCdtZXNzYWdlJywgKGV2ZW50KSA9PiB7XG5cdFx0XHRpZiAoZXZlbnQgJiYgZXZlbnQuZGF0YSAmJiBldmVudC5kYXRhLm5hbWUgPT09ICd2c2NvZGUtZGlkLWJsb2NrLXN2ZycpIHtcblx0XHRcdFx0dGhpcy5zaG93Q3NwV2FybmluZygpO1xuXHRcdFx0fVxuXHRcdH0pO1xuXHR9XG5cblx0cHJpdmF0ZSBzaG93Q3NwV2FybmluZygpIHtcblx0XHRjb25zdCBzdHJpbmdzID0gZ2V0U3RyaW5ncygpO1xuXHRcdGNvbnN0IHNldHRpbmdzID0gZ2V0U2V0dGluZ3MoKTtcblxuXHRcdGlmICh0aGlzLmRpZFNob3cgfHwgc2V0dGluZ3MuZGlzYWJsZVNlY3VyaXR5V2FybmluZ3MpIHtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cdFx0dGhpcy5kaWRTaG93ID0gdHJ1ZTtcblxuXHRcdGNvbnN0IG5vdGlmaWNhdGlvbiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2EnKTtcblx0XHRub3RpZmljYXRpb24uaW5uZXJUZXh0ID0gc3RyaW5ncy5jc3BBbGVydE1lc3NhZ2VUZXh0O1xuXHRcdG5vdGlmaWNhdGlvbi5zZXRBdHRyaWJ1dGUoJ2lkJywgJ2NvZGUtY3NwLXdhcm5pbmcnKTtcblx0XHRub3RpZmljYXRpb24uc2V0QXR0cmlidXRlKCd0aXRsZScsIHN0cmluZ3MuY3NwQWxlcnRNZXNzYWdlVGl0bGUpO1xuXG5cdFx0bm90aWZpY2F0aW9uLnNldEF0dHJpYnV0ZSgncm9sZScsICdidXR0b24nKTtcblx0XHRub3RpZmljYXRpb24uc2V0QXR0cmlidXRlKCdhcmlhLWxhYmVsJywgc3RyaW5ncy5jc3BBbGVydE1lc3NhZ2VMYWJlbCk7XG5cdFx0bm90aWZpY2F0aW9uLm9uY2xpY2sgPSAoKSA9PiB7XG5cdFx0XHRwb3N0Q29tbWFuZCgnbWFya2Rvd24uc2hvd1ByZXZpZXdTZWN1cml0eVNlbGVjdG9yJywgW3NldHRpbmdzLnNvdXJjZV0pO1xuXHRcdH07XG5cdFx0ZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChub3RpZmljYXRpb24pO1xuXHR9XG59XG4iLCIvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICogIENvcHlyaWdodCAoYykgTWljcm9zb2Z0IENvcnBvcmF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICogIExpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgTGljZW5zZS4gU2VlIExpY2Vuc2UudHh0IGluIHRoZSBwcm9qZWN0IHJvb3QgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24uXG4gKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi9cbmltcG9ydCB7IHBvc3RDb21tYW5kIH0gZnJvbSAnLi9tZXNzYWdpbmcnO1xuXG5leHBvcnQgY2xhc3MgU3R5bGVMb2FkaW5nTW9uaXRvciB7XG5cdHByaXZhdGUgdW5sb2FkZWRTdHlsZXM6IHN0cmluZ1tdID0gW107XG5cblx0Y29uc3RydWN0b3IoKSB7XG5cdFx0Y29uc3Qgb25TdHlsZUxvYWRFcnJvciA9IChldmVudDogYW55KSA9PiB7XG5cdFx0XHRjb25zdCBzb3VyY2UgPSBldmVudC50YXJnZXQuZGF0YXNldC5zb3VyY2U7XG5cdFx0XHR0aGlzLnVubG9hZGVkU3R5bGVzLnB1c2goc291cmNlKTtcblx0XHR9O1xuXG5cdFx0d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ0RPTUNvbnRlbnRMb2FkZWQnLCAoKSA9PiB7XG5cdFx0XHRmb3IgKGNvbnN0IGxpbmsgb2YgZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgnY29kZS11c2VyLXN0eWxlJykgYXMgSFRNTENvbGxlY3Rpb25PZjxIVE1MRWxlbWVudD4pIHtcblx0XHRcdFx0aWYgKGxpbmsuZGF0YXNldC5zb3VyY2UpIHtcblx0XHRcdFx0XHRsaW5rLm9uZXJyb3IgPSBvblN0eWxlTG9hZEVycm9yO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fSk7XG5cblx0XHR3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcignbG9hZCcsICgpID0+IHtcblx0XHRcdGlmICghdGhpcy51bmxvYWRlZFN0eWxlcy5sZW5ndGgpIHtcblx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0fVxuXHRcdFx0cG9zdENvbW1hbmQoJ19tYXJrZG93bi5vblByZXZpZXdTdHlsZUxvYWRFcnJvcicsIFt0aGlzLnVubG9hZGVkU3R5bGVzXSk7XG5cdFx0fSk7XG5cdH1cbn0iLCIvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICogIENvcHlyaWdodCAoYykgTWljcm9zb2Z0IENvcnBvcmF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICogIExpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgTGljZW5zZS4gU2VlIExpY2Vuc2UudHh0IGluIHRoZSBwcm9qZWN0IHJvb3QgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24uXG4gKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi9cblxuaW1wb3J0IHsgZ2V0U2V0dGluZ3MgfSBmcm9tICcuL3NldHRpbmdzJztcblxuZGVjbGFyZSB2YXIgdnNjb2RlOiBhbnk7XG5cbi8qKlxuICogUG9zdCBhIG1lc3NhZ2UgdG8gdGhlIG1hcmtkb3duIGV4dGVuc2lvblxuICovXG5leHBvcnQgZnVuY3Rpb24gcG9zdE1lc3NhZ2UodHlwZTogc3RyaW5nLCBib2R5OiBvYmplY3QpIHtcblx0dnNjb2RlLnBvc3RNZXNzYWdlKHtcblx0XHR0eXBlLFxuXHRcdHNvdXJjZTogZ2V0U2V0dGluZ3MoKS5zb3VyY2UsXG5cdFx0Ym9keVxuXHR9KTtcbn1cblxuLyoqXG4gKiBQb3N0IGEgY29tbWFuZCB0byBiZSBleGVjdXRlZCB0byB0aGUgbWFya2Rvd24gZXh0ZW5zaW9uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBwb3N0Q29tbWFuZChjb21tYW5kOiBzdHJpbmcsIGFyZ3M6IGFueVtdKSB7XG5cdHBvc3RNZXNzYWdlKCdjb21tYW5kJywgeyBjb21tYW5kLCBhcmdzIH0pO1xufVxuIiwiLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAqICBDb3B5cmlnaHQgKGMpIE1pY3Jvc29mdCBDb3Jwb3JhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqICBMaWNlbnNlZCB1bmRlciB0aGUgTUlUIExpY2Vuc2UuIFNlZSBMaWNlbnNlLnR4dCBpbiB0aGUgcHJvamVjdCByb290IGZvciBsaWNlbnNlIGluZm9ybWF0aW9uLlxuICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovXG5cbmltcG9ydCB7IENzcEFsZXJ0ZXIgfSBmcm9tICcuL2NzcCc7XG5pbXBvcnQgeyBTdHlsZUxvYWRpbmdNb25pdG9yIH0gZnJvbSAnLi9sb2FkaW5nJztcblxuLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOm5vLXVudXNlZC1leHByZXNzaW9uXG5uZXcgQ3NwQWxlcnRlcigpO1xuXG4vLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6bm8tdW51c2VkLWV4cHJlc3Npb25cbm5ldyBTdHlsZUxvYWRpbmdNb25pdG9yKCk7IiwiLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAqICBDb3B5cmlnaHQgKGMpIE1pY3Jvc29mdCBDb3Jwb3JhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqICBMaWNlbnNlZCB1bmRlciB0aGUgTUlUIExpY2Vuc2UuIFNlZSBMaWNlbnNlLnR4dCBpbiB0aGUgcHJvamVjdCByb290IGZvciBsaWNlbnNlIGluZm9ybWF0aW9uLlxuICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovXG5cbmV4cG9ydCBpbnRlcmZhY2UgUHJldmlld1NldHRpbmdzIHtcblx0c291cmNlOiBzdHJpbmc7XG5cdGxpbmU6IG51bWJlcjtcblx0bGluZUNvdW50OiBudW1iZXI7XG5cdHNjcm9sbFByZXZpZXdXaXRoRWRpdG9yPzogYm9vbGVhbjtcblx0c2Nyb2xsRWRpdG9yV2l0aFByZXZpZXc6IGJvb2xlYW47XG5cdGRpc2FibGVTZWN1cml0eVdhcm5pbmdzOiBib29sZWFuO1xuXHRkb3VibGVDbGlja1RvU3dpdGNoVG9FZGl0b3I6IGJvb2xlYW47XG59XG5cbmxldCBjYWNoZWRTZXR0aW5nczogUHJldmlld1NldHRpbmdzIHwgdW5kZWZpbmVkID0gdW5kZWZpbmVkO1xuXG5leHBvcnQgZnVuY3Rpb24gZ2V0U2V0dGluZ3MoKTogUHJldmlld1NldHRpbmdzIHtcblx0aWYgKGNhY2hlZFNldHRpbmdzKSB7XG5cdFx0cmV0dXJuIGNhY2hlZFNldHRpbmdzO1xuXHR9XG5cblx0Y29uc3QgZWxlbWVudCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd2c2NvZGUtbWFya2Rvd24tcHJldmlldy1kYXRhJyk7XG5cdGlmIChlbGVtZW50KSB7XG5cdFx0Y29uc3QgZGF0YSA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlKCdkYXRhLXNldHRpbmdzJyk7XG5cdFx0aWYgKGRhdGEpIHtcblx0XHRcdGNhY2hlZFNldHRpbmdzID0gSlNPTi5wYXJzZShkYXRhKTtcblx0XHRcdHJldHVybiBjYWNoZWRTZXR0aW5ncyE7XG5cdFx0fVxuXHR9XG5cblx0dGhyb3cgbmV3IEVycm9yKCdDb3VsZCBub3QgbG9hZCBzZXR0aW5ncycpO1xufVxuIiwiLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAqICBDb3B5cmlnaHQgKGMpIE1pY3Jvc29mdCBDb3Jwb3JhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqICBMaWNlbnNlZCB1bmRlciB0aGUgTUlUIExpY2Vuc2UuIFNlZSBMaWNlbnNlLnR4dCBpbiB0aGUgcHJvamVjdCByb290IGZvciBsaWNlbnNlIGluZm9ybWF0aW9uLlxuICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovXG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRTdHJpbmdzKCk6IHsgW2tleTogc3RyaW5nXTogc3RyaW5nIH0ge1xuXHRjb25zdCBzdG9yZSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd2c2NvZGUtbWFya2Rvd24tcHJldmlldy1kYXRhJyk7XG5cdGlmIChzdG9yZSkge1xuXHRcdGNvbnN0IGRhdGEgPSBzdG9yZS5nZXRBdHRyaWJ1dGUoJ2RhdGEtc3RyaW5ncycpO1xuXHRcdGlmIChkYXRhKSB7XG5cdFx0XHRyZXR1cm4gSlNPTi5wYXJzZShkYXRhKTtcblx0XHR9XG5cdH1cblx0dGhyb3cgbmV3IEVycm9yKCdDb3VsZCBub3QgbG9hZCBzdHJpbmdzJyk7XG59XG4iXSwic291cmNlUm9vdCI6IiJ9 \ No newline at end of file +//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vd2VicGFjay9ib290c3RyYXAiLCJ3ZWJwYWNrOi8vLy4vcHJldmlldy1zcmMvY3NwLnRzIiwid2VicGFjazovLy8uL3ByZXZpZXctc3JjL2xvYWRpbmcudHMiLCJ3ZWJwYWNrOi8vLy4vcHJldmlldy1zcmMvcHJlLnRzIiwid2VicGFjazovLy8uL3ByZXZpZXctc3JjL3NldHRpbmdzLnRzIiwid2VicGFjazovLy8uL3ByZXZpZXctc3JjL3N0cmluZ3MudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOzs7QUFHQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFLO0FBQ0w7QUFDQTs7QUFFQTtBQUNBO0FBQ0EseURBQWlELGNBQWM7QUFDL0Q7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsbUNBQTJCLDBCQUEwQixFQUFFO0FBQ3ZELHlDQUFpQyxlQUFlO0FBQ2hEO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLDhEQUFzRCwrREFBK0Q7O0FBRXJIO0FBQ0E7OztBQUdBO0FBQ0E7Ozs7Ozs7Ozs7Ozs7O0FDbkVBOzs7Z0dBR2dHOztBQUdoRyxzRkFBeUM7QUFDekMsbUZBQXVDO0FBRXZDOztHQUVHO0FBQ0g7SUFNQztRQUxRLFlBQU8sR0FBRyxLQUFLLENBQUM7UUFDaEIsc0JBQWlCLEdBQUcsS0FBSyxDQUFDO1FBS2pDLFFBQVEsQ0FBQyxnQkFBZ0IsQ0FBQyx5QkFBeUIsRUFBRSxHQUFHLEVBQUU7WUFDekQsSUFBSSxDQUFDLFlBQVksRUFBRSxDQUFDO1FBQ3JCLENBQUMsQ0FBQyxDQUFDO1FBRUgsTUFBTSxDQUFDLGdCQUFnQixDQUFDLFNBQVMsRUFBRSxDQUFDLEtBQUssRUFBRSxFQUFFO1lB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Q0FBQyxDQUFDO1FBQ2IsTUFBTSxJQUFJLEdBQUcsT0FBTyxDQUFDLFlBQVksQ0FBQyxlQUFlLENBQUMsQ0FBQztRQUNuRCxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDO1lBQ1YsY0FBYyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUM7WUFDbEMsTUFBTSxDQUFDLGNBQWUsQ0FBQztRQUN4QixDQUFDO0lBQ0YsQ0FBQztJQUVELE1BQU0sSUFBSSxLQUFLLENBQUMseUJBQXlCLENBQUMsQ0FBQztBQUM1QyxDQUFDO0FBZkQsa0NBZUM7Ozs7Ozs7Ozs7Ozs7O0FDaENEOzs7Z0dBR2dHOztBQUVoRztJQUNDLE1BQU0sS0FBSyxHQUFHLFFBQVEsQ0FBQyxjQUFjLENBQUMsOEJBQThCLENBQUMsQ0FBQztJQUN0RSxFQUFFLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDO1FBQ1gsTUFBTSxJQUFJLEdBQUcsS0FBSyxDQUFDLFlBQVksQ0FBQyxjQUFjLENBQUMsQ0FBQztRQUNoRCxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDO1lBQ1YsTUFBTSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDekIsQ0FBQztJQUNGLENBQUM7SUFDRCxNQUFNLElBQUksS0FBSyxDQUFDLHdCQUF3QixDQUFDLENBQUM7QUFDM0MsQ0FBQztBQVRELGdDQVNDIiwiZmlsZSI6InByZS5qcyIsInNvdXJjZXNDb250ZW50IjpbIiBcdC8vIFRoZSBtb2R1bGUgY2FjaGVcbiBcdHZhciBpbnN0YWxsZWRNb2R1bGVzID0ge307XG5cbiBcdC8vIFRoZSByZXF1aXJlIGZ1bmN0aW9uXG4gXHRmdW5jdGlvbiBfX3dlYnBhY2tfcmVxdWlyZV9fKG1vZHVsZUlkKSB7XG5cbiBcdFx0Ly8gQ2hlY2sgaWYgbW9kdWxlIGlzIGluIGNhY2hlXG4gXHRcdGlmKGluc3RhbGxlZE1vZHVsZXNbbW9kdWxlSWRdKSB7XG4gXHRcdFx0cmV0dXJuIGluc3RhbGxlZE1vZHVsZXNbbW9kdWxlSWRdLmV4cG9ydHM7XG4gXHRcdH1cbiBcdFx0Ly8gQ3JlYXRlIGEgbmV3IG1vZHVsZSAoYW5kIHB1dCBpdCBpbnRvIHRoZSBjYWNoZSlcbiBcdFx0dmFyIG1vZHVsZSA9IGluc3RhbGxlZE1vZHVsZXNbbW9kdWxlSWRdID0ge1xuIFx0XHRcdGk6IG1vZHVsZUlkLFxuIFx0XHRcdGw6IGZhbHNlLFxuIFx0XHRcdGV4cG9ydHM6IHt9XG4gXHRcdH07XG5cbiBcdFx0Ly8gRXhlY3V0ZSB0aGUgbW9kdWxlIGZ1bmN0aW9uXG4gXHRcdG1vZHVsZXNbbW9kdWxlSWRdLmNhbGwobW9kdWxlLmV4cG9ydHMsIG1vZHVsZSwgbW9kdWxlLmV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pO1xuXG4gXHRcdC8vIEZsYWcgdGhlIG1vZHVsZSBhcyBsb2FkZWRcbiBcdFx0bW9kdWxlLmwgPSB0cnVlO1xuXG4gXHRcdC8vIFJldHVybiB0aGUgZXhwb3J0cyBvZiB0aGUgbW9kdWxlXG4gXHRcdHJldHVybiBtb2R1bGUuZXhwb3J0cztcbiBcdH1cblxuXG4gXHQvLyBleHBvc2UgdGhlIG1vZHVsZXMgb2JqZWN0IChfX3dlYnBhY2tfbW9kdWxlc19fKVxuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5tID0gbW9kdWxlcztcblxuIFx0Ly8gZXhwb3NlIHRoZSBtb2R1bGUgY2FjaGVcbiBcdF9fd2VicGFja19yZXF1aXJlX18uYyA9IGluc3RhbGxlZE1vZHVsZXM7XG5cbiBcdC8vIGRlZmluZSBnZXR0ZXIgZnVuY3Rpb24gZm9yIGhhcm1vbnkgZXhwb3J0c1xuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5kID0gZnVuY3Rpb24oZXhwb3J0cywgbmFtZSwgZ2V0dGVyKSB7XG4gXHRcdGlmKCFfX3dlYnBhY2tfcmVxdWlyZV9fLm8oZXhwb3J0cywgbmFtZSkpIHtcbiBcdFx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgbmFtZSwge1xuIFx0XHRcdFx0Y29uZmlndXJhYmxlOiBmYWxzZSxcbiBcdFx0XHRcdGVudW1lcmFibGU6IHRydWUsXG4gXHRcdFx0XHRnZXQ6IGdldHRlclxuIFx0XHRcdH0pO1xuIFx0XHR9XG4gXHR9O1xuXG4gXHQvLyBkZWZpbmUgX19lc01vZHVsZSBvbiBleHBvcnRzXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLnIgPSBmdW5jdGlvbihleHBvcnRzKSB7XG4gXHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCAnX19lc01vZHVsZScsIHsgdmFsdWU6IHRydWUgfSk7XG4gXHR9O1xuXG4gXHQvLyBnZXREZWZhdWx0RXhwb3J0IGZ1bmN0aW9uIGZvciBjb21wYXRpYmlsaXR5IHdpdGggbm9uLWhhcm1vbnkgbW9kdWxlc1xuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5uID0gZnVuY3Rpb24obW9kdWxlKSB7XG4gXHRcdHZhciBnZXR0ZXIgPSBtb2R1bGUgJiYgbW9kdWxlLl9fZXNNb2R1bGUgP1xuIFx0XHRcdGZ1bmN0aW9uIGdldERlZmF1bHQoKSB7IHJldHVybiBtb2R1bGVbJ2RlZmF1bHQnXTsgfSA6XG4gXHRcdFx0ZnVuY3Rpb24gZ2V0TW9kdWxlRXhwb3J0cygpIHsgcmV0dXJuIG1vZHVsZTsgfTtcbiBcdFx0X193ZWJwYWNrX3JlcXVpcmVfXy5kKGdldHRlciwgJ2EnLCBnZXR0ZXIpO1xuIFx0XHRyZXR1cm4gZ2V0dGVyO1xuIFx0fTtcblxuIFx0Ly8gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLm8gPSBmdW5jdGlvbihvYmplY3QsIHByb3BlcnR5KSB7IHJldHVybiBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwob2JqZWN0LCBwcm9wZXJ0eSk7IH07XG5cbiBcdC8vIF9fd2VicGFja19wdWJsaWNfcGF0aF9fXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLnAgPSBcIlwiO1xuXG5cbiBcdC8vIExvYWQgZW50cnkgbW9kdWxlIGFuZCByZXR1cm4gZXhwb3J0c1xuIFx0cmV0dXJuIF9fd2VicGFja19yZXF1aXJlX18oX193ZWJwYWNrX3JlcXVpcmVfXy5zID0gXCIuL3ByZXZpZXctc3JjL3ByZS50c1wiKTtcbiIsIi8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gKiAgQ29weXJpZ2h0IChjKSBNaWNyb3NvZnQgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKiAgTGljZW5zZWQgdW5kZXIgdGhlIE1JVCBMaWNlbnNlLiBTZWUgTGljZW5zZS50eHQgaW4gdGhlIHByb2plY3Qgcm9vdCBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbi5cbiAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qL1xuXG5pbXBvcnQgeyBNZXNzYWdlUG9zdGVyIH0gZnJvbSAnLi9tZXNzYWdpbmcnO1xuaW1wb3J0IHsgZ2V0U2V0dGluZ3MgfSBmcm9tICcuL3NldHRpbmdzJztcbmltcG9ydCB7IGdldFN0cmluZ3MgfSBmcm9tICcuL3N0cmluZ3MnO1xuXG4vKipcbiAqIFNob3dzIGFuIGFsZXJ0IHdoZW4gdGhlcmUgaXMgYSBjb250ZW50IHNlY3VyaXR5IHBvbGljeSB2aW9sYXRpb24uXG4gKi9cbmV4cG9ydCBjbGFzcyBDc3BBbGVydGVyIHtcblx0cHJpdmF0ZSBkaWRTaG93ID0gZmFsc2U7XG5cdHByaXZhdGUgZGlkSGF2ZUNzcFdhcm5pbmcgPSBmYWxzZTtcblxuXHRwcml2YXRlIG1lc3NhZ2luZz86IE1lc3NhZ2VQb3N0ZXI7XG5cblx0Y29uc3RydWN0b3IoKSB7XG5cdFx0ZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignc2VjdXJpdHlwb2xpY3l2aW9sYXRpb24nLCAoKSA9PiB7XG5cdFx0XHR0aGlzLm9uQ3NwV2FybmluZygpO1xuXHRcdH0pO1xuXG5cdFx0d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ21lc3NhZ2UnLCAoZXZlbnQpID0+IHtcblx0XHRcdGlmIChldmVudCAmJiBldmVudC5kYXRhICYmIGV2ZW50LmRhdGEubmFtZSA9PT0gJ3ZzY29kZS1kaWQtYmxvY2stc3ZnJykge1xuXHRcdFx0XHR0aGlzLm9uQ3NwV2FybmluZygpO1xuXHRcdFx0fVxuXHRcdH0pO1xuXHR9XG5cblx0cHVibGljIHNldFBvc3Rlcihwb3N0ZXI6IE1lc3NhZ2VQb3N0ZXIpIHtcblx0XHR0aGlzLm1lc3NhZ2luZyA9IHBvc3Rlcjtcblx0XHRpZiAodGhpcy5kaWRIYXZlQ3NwV2FybmluZykge1xuXHRcdFx0dGhpcy5zaG93Q3NwV2FybmluZygpO1xuXHRcdH1cblx0fVxuXG5cdHByaXZhdGUgb25Dc3BXYXJuaW5nKCkge1xuXHRcdHRoaXMuZGlkSGF2ZUNzcFdhcm5pbmcgPSB0cnVlO1xuXHRcdHRoaXMuc2hvd0NzcFdhcm5pbmcoKTtcblx0fVxuXG5cdHByaXZhdGUgc2hvd0NzcFdhcm5pbmcoKSB7XG5cdFx0Y29uc3Qgc3RyaW5ncyA9IGdldFN0cmluZ3MoKTtcblx0XHRjb25zdCBzZXR0aW5ncyA9IGdldFNldHRpbmdzKCk7XG5cblx0XHRpZiAodGhpcy5kaWRTaG93IHx8IHNldHRpbmdzLmRpc2FibGVTZWN1cml0eVdhcm5pbmdzIHx8ICF0aGlzLm1lc3NhZ2luZykge1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblx0XHR0aGlzLmRpZFNob3cgPSB0cnVlO1xuXG5cdFx0Y29uc3Qgbm90aWZpY2F0aW9uID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnYScpO1xuXHRcdG5vdGlmaWNhdGlvbi5pbm5lclRleHQgPSBzdHJpbmdzLmNzcEFsZXJ0TWVzc2FnZVRleHQ7XG5cdFx0bm90aWZpY2F0aW9uLnNldEF0dHJpYnV0ZSgnaWQnLCAnY29kZS1jc3Atd2FybmluZycpO1xuXHRcdG5vdGlmaWNhdGlvbi5zZXRBdHRyaWJ1dGUoJ3RpdGxlJywgc3RyaW5ncy5jc3BBbGVydE1lc3NhZ2VUaXRsZSk7XG5cblx0XHRub3RpZmljYXRpb24uc2V0QXR0cmlidXRlKCdyb2xlJywgJ2J1dHRvbicpO1xuXHRcdG5vdGlmaWNhdGlvbi5zZXRBdHRyaWJ1dGUoJ2FyaWEtbGFiZWwnLCBzdHJpbmdzLmNzcEFsZXJ0TWVzc2FnZUxhYmVsKTtcblx0XHRub3RpZmljYXRpb24ub25jbGljayA9ICgpID0+IHtcblx0XHRcdHRoaXMubWVzc2FnaW5nIS5wb3N0Q29tbWFuZCgnbWFya2Rvd24uc2hvd1ByZXZpZXdTZWN1cml0eVNlbGVjdG9yJywgW3NldHRpbmdzLnNvdXJjZV0pO1xuXHRcdH07XG5cdFx0ZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChub3RpZmljYXRpb24pO1xuXHR9XG59XG4iLCIvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICogIENvcHlyaWdodCAoYykgTWljcm9zb2Z0IENvcnBvcmF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICogIExpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgTGljZW5zZS4gU2VlIExpY2Vuc2UudHh0IGluIHRoZSBwcm9qZWN0IHJvb3QgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24uXG4gKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi9cbmltcG9ydCB7IE1lc3NhZ2VQb3N0ZXIgfSBmcm9tICcuL21lc3NhZ2luZyc7XG5cbmV4cG9ydCBjbGFzcyBTdHlsZUxvYWRpbmdNb25pdG9yIHtcblx0cHJpdmF0ZSB1bmxvYWRlZFN0eWxlczogc3RyaW5nW10gPSBbXTtcblx0cHJpdmF0ZSBmaW5pc2hlZExvYWRpbmc6IGJvb2xlYW4gPSBmYWxzZTtcblxuXHRwcml2YXRlIHBvc3Rlcj86IE1lc3NhZ2VQb3N0ZXI7XG5cblx0Y29uc3RydWN0b3IoKSB7XG5cdFx0Y29uc3Qgb25TdHlsZUxvYWRFcnJvciA9IChldmVudDogYW55KSA9PiB7XG5cdFx0XHRjb25zdCBzb3VyY2UgPSBldmVudC50YXJnZXQuZGF0YXNldC5zb3VyY2U7XG5cdFx0XHR0aGlzLnVubG9hZGVkU3R5bGVzLnB1c2goc291cmNlKTtcblx0XHR9O1xuXG5cdFx0d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ0RPTUNvbnRlbnRMb2FkZWQnLCAoKSA9PiB7XG5cdFx0XHRmb3IgKGNvbnN0IGxpbmsgb2YgZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgnY29kZS11c2VyLXN0eWxlJykgYXMgSFRNTENvbGxlY3Rpb25PZjxIVE1MRWxlbWVudD4pIHtcblx0XHRcdFx0aWYgKGxpbmsuZGF0YXNldC5zb3VyY2UpIHtcblx0XHRcdFx0XHRsaW5rLm9uZXJyb3IgPSBvblN0eWxlTG9hZEVycm9yO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fSk7XG5cblx0XHR3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcignbG9hZCcsICgpID0+IHtcblx0XHRcdGlmICghdGhpcy51bmxvYWRlZFN0eWxlcy5sZW5ndGgpIHtcblx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0fVxuXHRcdFx0dGhpcy5maW5pc2hlZExvYWRpbmcgPSB0cnVlO1xuXHRcdFx0aWYgKHRoaXMucG9zdGVyKSB7XG5cdFx0XHRcdHRoaXMucG9zdGVyLnBvc3RDb21tYW5kKCdfbWFya2Rvd24ub25QcmV2aWV3U3R5bGVMb2FkRXJyb3InLCBbdGhpcy51bmxvYWRlZFN0eWxlc10pO1xuXHRcdFx0fVxuXHRcdH0pO1xuXHR9XG5cblx0cHVibGljIHNldFBvc3Rlcihwb3N0ZXI6IE1lc3NhZ2VQb3N0ZXIpOiB2b2lkIHtcblx0XHR0aGlzLnBvc3RlciA9IHBvc3Rlcjtcblx0XHRpZiAodGhpcy5maW5pc2hlZExvYWRpbmcpIHtcblx0XHRcdHBvc3Rlci5wb3N0Q29tbWFuZCgnX21hcmtkb3duLm9uUHJldmlld1N0eWxlTG9hZEVycm9yJywgW3RoaXMudW5sb2FkZWRTdHlsZXNdKTtcblx0XHR9XG5cdH1cbn0iLCIvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICogIENvcHlyaWdodCAoYykgTWljcm9zb2Z0IENvcnBvcmF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICogIExpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgTGljZW5zZS4gU2VlIExpY2Vuc2UudHh0IGluIHRoZSBwcm9qZWN0IHJvb3QgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24uXG4gKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi9cblxuaW1wb3J0IHsgQ3NwQWxlcnRlciB9IGZyb20gJy4vY3NwJztcbmltcG9ydCB7IFN0eWxlTG9hZGluZ01vbml0b3IgfSBmcm9tICcuL2xvYWRpbmcnO1xuXG5kZWNsYXJlIGdsb2JhbCB7XG5cdGludGVyZmFjZSBXaW5kb3cge1xuXHRcdGNzcEFsZXJ0ZXI6IENzcEFsZXJ0ZXI7XG5cdFx0c3R5bGVMb2FkaW5nTW9uaXRvcjogU3R5bGVMb2FkaW5nTW9uaXRvcjtcblx0fVxufVxuXG53aW5kb3cuY3NwQWxlcnRlciA9IG5ldyBDc3BBbGVydGVyKCk7XG53aW5kb3cuc3R5bGVMb2FkaW5nTW9uaXRvciA9IG5ldyBTdHlsZUxvYWRpbmdNb25pdG9yKCk7IiwiLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAqICBDb3B5cmlnaHQgKGMpIE1pY3Jvc29mdCBDb3Jwb3JhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqICBMaWNlbnNlZCB1bmRlciB0aGUgTUlUIExpY2Vuc2UuIFNlZSBMaWNlbnNlLnR4dCBpbiB0aGUgcHJvamVjdCByb290IGZvciBsaWNlbnNlIGluZm9ybWF0aW9uLlxuICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovXG5cbmV4cG9ydCBpbnRlcmZhY2UgUHJldmlld1NldHRpbmdzIHtcblx0c291cmNlOiBzdHJpbmc7XG5cdGxpbmU6IG51bWJlcjtcblx0bGluZUNvdW50OiBudW1iZXI7XG5cdHNjcm9sbFByZXZpZXdXaXRoRWRpdG9yPzogYm9vbGVhbjtcblx0c2Nyb2xsRWRpdG9yV2l0aFByZXZpZXc6IGJvb2xlYW47XG5cdGRpc2FibGVTZWN1cml0eVdhcm5pbmdzOiBib29sZWFuO1xuXHRkb3VibGVDbGlja1RvU3dpdGNoVG9FZGl0b3I6IGJvb2xlYW47XG59XG5cbmxldCBjYWNoZWRTZXR0aW5nczogUHJldmlld1NldHRpbmdzIHwgdW5kZWZpbmVkID0gdW5kZWZpbmVkO1xuXG5leHBvcnQgZnVuY3Rpb24gZ2V0U2V0dGluZ3MoKTogUHJldmlld1NldHRpbmdzIHtcblx0aWYgKGNhY2hlZFNldHRpbmdzKSB7XG5cdFx0cmV0dXJuIGNhY2hlZFNldHRpbmdzO1xuXHR9XG5cblx0Y29uc3QgZWxlbWVudCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd2c2NvZGUtbWFya2Rvd24tcHJldmlldy1kYXRhJyk7XG5cdGlmIChlbGVtZW50KSB7XG5cdFx0Y29uc3QgZGF0YSA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlKCdkYXRhLXNldHRpbmdzJyk7XG5cdFx0aWYgKGRhdGEpIHtcblx0XHRcdGNhY2hlZFNldHRpbmdzID0gSlNPTi5wYXJzZShkYXRhKTtcblx0XHRcdHJldHVybiBjYWNoZWRTZXR0aW5ncyE7XG5cdFx0fVxuXHR9XG5cblx0dGhyb3cgbmV3IEVycm9yKCdDb3VsZCBub3QgbG9hZCBzZXR0aW5ncycpO1xufVxuIiwiLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAqICBDb3B5cmlnaHQgKGMpIE1pY3Jvc29mdCBDb3Jwb3JhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqICBMaWNlbnNlZCB1bmRlciB0aGUgTUlUIExpY2Vuc2UuIFNlZSBMaWNlbnNlLnR4dCBpbiB0aGUgcHJvamVjdCByb290IGZvciBsaWNlbnNlIGluZm9ybWF0aW9uLlxuICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovXG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRTdHJpbmdzKCk6IHsgW2tleTogc3RyaW5nXTogc3RyaW5nIH0ge1xuXHRjb25zdCBzdG9yZSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd2c2NvZGUtbWFya2Rvd24tcHJldmlldy1kYXRhJyk7XG5cdGlmIChzdG9yZSkge1xuXHRcdGNvbnN0IGRhdGEgPSBzdG9yZS5nZXRBdHRyaWJ1dGUoJ2RhdGEtc3RyaW5ncycpO1xuXHRcdGlmIChkYXRhKSB7XG5cdFx0XHRyZXR1cm4gSlNPTi5wYXJzZShkYXRhKTtcblx0XHR9XG5cdH1cblx0dGhyb3cgbmV3IEVycm9yKCdDb3VsZCBub3QgbG9hZCBzdHJpbmdzJyk7XG59XG4iXSwic291cmNlUm9vdCI6IiJ9 \ No newline at end of file diff --git a/extensions/markdown-language-features/preview-src/csp.ts b/extensions/markdown-language-features/preview-src/csp.ts index 32202952258..d7af87412fc 100644 --- a/extensions/markdown-language-features/preview-src/csp.ts +++ b/extensions/markdown-language-features/preview-src/csp.ts @@ -3,33 +3,48 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ +import { MessagePoster } from './messaging'; import { getSettings } from './settings'; import { getStrings } from './strings'; -import { postCommand } from './messaging'; /** * Shows an alert when there is a content security policy violation. */ export class CspAlerter { private didShow = false; + private didHaveCspWarning = false; + + private messaging?: MessagePoster; constructor() { document.addEventListener('securitypolicyviolation', () => { - this.showCspWarning(); + this.onCspWarning(); }); window.addEventListener('message', (event) => { if (event && event.data && event.data.name === 'vscode-did-block-svg') { - this.showCspWarning(); + this.onCspWarning(); } }); } + public setPoster(poster: MessagePoster) { + this.messaging = poster; + if (this.didHaveCspWarning) { + this.showCspWarning(); + } + } + + private onCspWarning() { + this.didHaveCspWarning = true; + this.showCspWarning(); + } + private showCspWarning() { const strings = getStrings(); const settings = getSettings(); - if (this.didShow || settings.disableSecurityWarnings) { + if (this.didShow || settings.disableSecurityWarnings || !this.messaging) { return; } this.didShow = true; @@ -42,7 +57,7 @@ export class CspAlerter { notification.setAttribute('role', 'button'); notification.setAttribute('aria-label', strings.cspAlertMessageLabel); notification.onclick = () => { - postCommand('markdown.showPreviewSecuritySelector', [settings.source]); + this.messaging!.postCommand('markdown.showPreviewSecuritySelector', [settings.source]); }; document.body.appendChild(notification); } diff --git a/extensions/markdown-language-features/preview-src/index.ts b/extensions/markdown-language-features/preview-src/index.ts index 5bce7230b85..8572230ab25 100644 --- a/extensions/markdown-language-features/preview-src/index.ts +++ b/extensions/markdown-language-features/preview-src/index.ts @@ -3,17 +3,27 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import { getSettings } from './settings'; -import { postCommand, postMessage } from './messaging'; -import { onceDocumentLoaded } from './events'; -import { getEditorLineNumberForPageOffset, scrollToRevealSourceLine } from './scroll-sync'; import { ActiveLineMarker } from './activeLineMarker'; +import { onceDocumentLoaded } from './events'; +import { createPosterForVsCode } from './messaging'; +import { getEditorLineNumberForPageOffset, scrollToRevealSourceLine } from './scroll-sync'; +import { getSettings } from './settings'; import throttle = require('lodash.throttle'); +declare var acquireVsCodeApi: any; + var scrollDisabled = true; const marker = new ActiveLineMarker(); const settings = getSettings(); +const vscode = acquireVsCodeApi(); +vscode.postMessage({}); + +const messaging = createPosterForVsCode(vscode); + +window.cspAlerter.setPoster(messaging); +window.styleLoadingMonitor.setPoster(messaging); + onceDocumentLoaded(() => { if (settings.scrollPreviewWithEditor) { setTimeout(() => { @@ -75,7 +85,7 @@ document.addEventListener('dblclick', event => { const offset = event.pageY; const line = getEditorLineNumberForPageOffset(offset); if (typeof line === 'number' && !isNaN(line)) { - postMessage('didClick', { line: Math.floor(line) }); + messaging.postMessage('didClick', { line: Math.floor(line) }); } }); @@ -92,7 +102,7 @@ document.addEventListener('click', event => { } if (node.href.startsWith('file://') || node.href.startsWith('vscode-resource:')) { const [path, fragment] = node.href.replace(/^(file:\/\/|vscode-resource:)/i, '').split('#'); - postCommand('_markdown.openDocumentLink', [{ path, fragment }]); + messaging.postCommand('_markdown.openDocumentLink', [{ path, fragment }]); event.preventDefault(); event.stopPropagation(); break; @@ -110,7 +120,7 @@ if (settings.scrollEditorWithPreview) { } else { const line = getEditorLineNumberForPageOffset(window.scrollY); if (typeof line === 'number' && !isNaN(line)) { - postMessage('revealLine', { line }); + messaging.postMessage('revealLine', { line }); } } }, 50)); diff --git a/extensions/markdown-language-features/preview-src/loading.ts b/extensions/markdown-language-features/preview-src/loading.ts index 34692558774..94f4455a0c7 100644 --- a/extensions/markdown-language-features/preview-src/loading.ts +++ b/extensions/markdown-language-features/preview-src/loading.ts @@ -2,10 +2,13 @@ * Copyright (c) Microsoft Corporation. All rights reserved. * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import { postCommand } from './messaging'; +import { MessagePoster } from './messaging'; export class StyleLoadingMonitor { private unloadedStyles: string[] = []; + private finishedLoading: boolean = false; + + private poster?: MessagePoster; constructor() { const onStyleLoadError = (event: any) => { @@ -25,7 +28,17 @@ export class StyleLoadingMonitor { if (!this.unloadedStyles.length) { return; } - postCommand('_markdown.onPreviewStyleLoadError', [this.unloadedStyles]); + this.finishedLoading = true; + if (this.poster) { + this.poster.postCommand('_markdown.onPreviewStyleLoadError', [this.unloadedStyles]); + } }); } + + public setPoster(poster: MessagePoster): void { + this.poster = poster; + if (this.finishedLoading) { + poster.postCommand('_markdown.onPreviewStyleLoadError', [this.unloadedStyles]); + } + } } \ No newline at end of file diff --git a/extensions/markdown-language-features/preview-src/messaging.ts b/extensions/markdown-language-features/preview-src/messaging.ts index 1fdb313103d..7037766b7a6 100644 --- a/extensions/markdown-language-features/preview-src/messaging.ts +++ b/extensions/markdown-language-features/preview-src/messaging.ts @@ -5,22 +5,31 @@ import { getSettings } from './settings'; -declare var vscode: any; +export interface MessagePoster { + /** + * Post a message to the markdown extension + */ + postMessage(type: string, body: object): void; -/** - * Post a message to the markdown extension - */ -export function postMessage(type: string, body: object) { - vscode.postMessage({ - type, - source: getSettings().source, - body - }); + + /** + * Post a command to be executed to the markdown extension + */ + postCommand(command: string, args: any[]): void; } -/** - * Post a command to be executed to the markdown extension - */ -export function postCommand(command: string, args: any[]) { - postMessage('command', { command, args }); -} +export const createPosterForVsCode = (vscode: any) => { + return new class implements MessagePoster { + postMessage(type: string, body: object): void { + vscode.postMessage({ + type, + source: getSettings().source, + body + }); + } + postCommand(command: string, args: any[]) { + this.postMessage('command', { command, args }); + } + }; +}; + diff --git a/extensions/markdown-language-features/preview-src/pre.ts b/extensions/markdown-language-features/preview-src/pre.ts index c9fd0ec5b35..9f1c806a979 100644 --- a/extensions/markdown-language-features/preview-src/pre.ts +++ b/extensions/markdown-language-features/preview-src/pre.ts @@ -6,8 +6,12 @@ import { CspAlerter } from './csp'; import { StyleLoadingMonitor } from './loading'; -// tslint:disable-next-line:no-unused-expression -new CspAlerter(); +declare global { + interface Window { + cspAlerter: CspAlerter; + styleLoadingMonitor: StyleLoadingMonitor; + } +} -// tslint:disable-next-line:no-unused-expression -new StyleLoadingMonitor(); \ No newline at end of file +window.cspAlerter = new CspAlerter(); +window.styleLoadingMonitor = new StyleLoadingMonitor(); \ No newline at end of file diff --git a/src/vs/workbench/parts/webview/electron-browser/webview-pre.js b/src/vs/workbench/parts/webview/electron-browser/webview-pre.js index 307d67a3b43..ec3e2db0a2b 100644 --- a/src/vs/workbench/parts/webview/electron-browser/webview-pre.js +++ b/src/vs/workbench/parts/webview/electron-browser/webview-pre.js @@ -178,15 +178,25 @@ if (enableWrappedPostMessage) { const defaultScript = newDocument.createElement('script'); defaultScript.textContent = ` - const vscode = Object.freeze((function() { + const acquireVsCodeApi = (function() { const originalPostMessage = window.parent.postMessage.bind(window.parent); - return { - postMessage: function(msg) { - return originalPostMessage(msg, '*'); + let acquired = false; + + return () => { + if (acquired) { + throw new Error('An instance of the VS Code API has already been acquired'); } + acquired = true; + return Object.freeze({ + postMessage: function(msg) { + return originalPostMessage(msg, '*'); + } + }); }; - })()); + })(); delete window.parent; + delete window.top; + delete window.frameElement; `; if (newDocument.head.hasChildNodes()) { From 8f1f772650fa4b6e50914fbf1296340cdfb74a05 Mon Sep 17 00:00:00 2001 From: Matt Bierner Date: Wed, 25 Apr 2018 23:29:40 -0700 Subject: [PATCH 097/830] Add notes on what retainContextWhileHidden does to scripts Fixes #48719 --- src/vs/vscode.d.ts | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/src/vs/vscode.d.ts b/src/vs/vscode.d.ts index 9a89f22ec55..4378731a6ec 100644 --- a/src/vs/vscode.d.ts +++ b/src/vs/vscode.d.ts @@ -5153,9 +5153,11 @@ declare module 'vscode' { * Normally the webview panel's html context is created when the panel becomes visible * and destroyed when it is 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 - * the panel becomes visible again, the context is automatically restored - * in the exact same state it was in originally. + * 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. From 12424071d74d2276fde8856ff61afd895c5e9197 Mon Sep 17 00:00:00 2001 From: Johannes Rieken Date: Thu, 26 Apr 2018 09:46:07 +0200 Subject: [PATCH 098/830] have only {overwrite} in rename/copy, #48668 --- src/vs/platform/files/common/files.ts | 8 ++++++-- src/vs/vscode.d.ts | 10 ++++++++-- .../api/electron-browser/mainThreadFileSystem.ts | 6 +++--- src/vs/workbench/api/node/extHost.protocol.ts | 6 +++--- src/vs/workbench/api/node/extHostFileSystem.ts | 4 ++-- .../files/electron-browser/remoteFileService.ts | 4 ++-- 6 files changed, 24 insertions(+), 14 deletions(-) diff --git a/src/vs/platform/files/common/files.ts b/src/vs/platform/files/common/files.ts index 2eaafd63aa9..fa1a6aa28b1 100644 --- a/src/vs/platform/files/common/files.ts +++ b/src/vs/platform/files/common/files.ts @@ -155,6 +155,10 @@ export interface IFileService { dispose(): void; } +export interface FileOverwriteOptions { + overwrite: boolean; +} + export interface FileOptions { /** * Create a file when it doesn't exists. @@ -217,8 +221,8 @@ export interface IFileSystemProvider { readdir(resource: URI): TPromise<[string, FileType][]>; delete(resource: URI): TPromise; - rename(from: URI, to: URI, opts: FileOptions): TPromise; - copy?(from: URI, to: URI, opts: FileOptions): TPromise; + rename(from: URI, to: URI, opts: FileOverwriteOptions): TPromise; + copy?(from: URI, to: URI, opts: FileOverwriteOptions): TPromise; readFile?(resource: URI, opts: FileOptions): TPromise; writeFile?(resource: URI, content: Uint8Array, opts: FileOptions): TPromise; diff --git a/src/vs/vscode.d.ts b/src/vs/vscode.d.ts index 4378731a6ec..1dfbc7cdaec 100644 --- a/src/vs/vscode.d.ts +++ b/src/vs/vscode.d.ts @@ -5061,9 +5061,12 @@ declare module 'vscode' { * * @param oldUri The existing file or folder. * @param newUri The target location. + * @param options Defines if existing files should be overwriten. * @param token A cancellation token. + * @throws [`FileNotFound`](FileSystemError.FileNotFound) when `oldUri` doesn't exist + * @throws [`FileExists`](FileSystemError.FileExists) when `newUri` exists and when the `overwrite` option is not `true`. */ - rename(oldUri: Uri, newUri: Uri, options: FileOptions, token: CancellationToken): FileStat | Thenable; + rename(oldUri: Uri, newUri: Uri, options: { overwrite: boolean }, token: CancellationToken): FileStat | Thenable; /** * Copy files or folders. Implementing this function is optional but it will speedup @@ -5071,9 +5074,12 @@ declare module 'vscode' { * * @param source The existing file or folder. * @param destination The destination location. + * @param options Defines if existing files should be overwriten. * @param token A cancellation token. + * @throws [`FileNotFound`](FileSystemError.FileNotFound) when `source` doesn't exist + * @throws [`FileExists`](FileSystemError.FileExists) when `destination` exists and when the `overwrite` option is not `true`. */ - copy?(source: Uri, destination: Uri, options: FileOptions, token: CancellationToken): FileStat | Thenable; + copy?(source: Uri, destination: Uri, options: { overwrite: boolean }, token: CancellationToken): FileStat | Thenable; } /** diff --git a/src/vs/workbench/api/electron-browser/mainThreadFileSystem.ts b/src/vs/workbench/api/electron-browser/mainThreadFileSystem.ts index 39e5599f3c0..7daef885dc1 100644 --- a/src/vs/workbench/api/electron-browser/mainThreadFileSystem.ts +++ b/src/vs/workbench/api/electron-browser/mainThreadFileSystem.ts @@ -8,7 +8,7 @@ import { Emitter, Event } from 'vs/base/common/event'; import { IDisposable, dispose } from 'vs/base/common/lifecycle'; import URI from 'vs/base/common/uri'; import { TPromise } from 'vs/base/common/winjs.base'; -import { FileOptions, FileSystemProviderCapabilities, IFileChange, IFileService, IFileSystemProvider, IStat, IWatchOptions, FileType } from 'vs/platform/files/common/files'; +import { FileOptions, FileSystemProviderCapabilities, IFileChange, IFileService, IFileSystemProvider, IStat, IWatchOptions, FileType, FileOverwriteOptions } from 'vs/platform/files/common/files'; import { extHostNamedCustomer } from 'vs/workbench/api/electron-browser/extHostCustomers'; import { ExtHostContext, ExtHostFileSystemShape, IExtHostContext, IFileChangeDto, MainContext, MainThreadFileSystemShape } from '../node/extHost.protocol'; @@ -119,11 +119,11 @@ class RemoteFileSystemProvider implements IFileSystemProvider { return this._proxy.$readdir(this._handle, resource); } - rename(resource: URI, target: URI, opts: FileOptions): TPromise { + rename(resource: URI, target: URI, opts: FileOverwriteOptions): TPromise { return this._proxy.$rename(this._handle, resource, target, opts); } - copy(resource: URI, target: URI, opts: FileOptions): TPromise { + copy(resource: URI, target: URI, opts: FileOverwriteOptions): TPromise { return this._proxy.$copy(this._handle, resource, target, opts); } } diff --git a/src/vs/workbench/api/node/extHost.protocol.ts b/src/vs/workbench/api/node/extHost.protocol.ts index dd0d72b1ba0..ac488b829cc 100644 --- a/src/vs/workbench/api/node/extHost.protocol.ts +++ b/src/vs/workbench/api/node/extHost.protocol.ts @@ -42,7 +42,7 @@ import { ITreeItem } from 'vs/workbench/common/views'; import { ThemeColor } from 'vs/platform/theme/common/themeService'; import { IDisposable } from 'vs/base/common/lifecycle'; import { SerializedError } from 'vs/base/common/errors'; -import { IStat, FileChangeType, IWatchOptions, FileSystemProviderCapabilities, FileOptions, FileType } from 'vs/platform/files/common/files'; +import { IStat, FileChangeType, IWatchOptions, FileSystemProviderCapabilities, FileOptions, FileType, FileOverwriteOptions } from 'vs/platform/files/common/files'; import { ConfigurationScope } from 'vs/platform/configuration/common/configurationRegistry'; import { CommentRule, CharacterPair, EnterAction } from 'vs/editor/common/modes/languageConfiguration'; import { ISingleEditOperation } from 'vs/editor/common/model'; @@ -585,8 +585,8 @@ export interface ExtHostFileSystemShape { $readdir(handle: number, resource: UriComponents): TPromise<[string, FileType][]>; $readFile(handle: number, resource: UriComponents, opts: FileOptions): TPromise; $writeFile(handle: number, resource: UriComponents, base64Encoded: string, opts: FileOptions): TPromise; - $rename(handle: number, resource: UriComponents, target: UriComponents, opts: FileOptions): TPromise; - $copy(handle: number, resource: UriComponents, target: UriComponents, opts: FileOptions): TPromise; + $rename(handle: number, resource: UriComponents, target: UriComponents, opts: FileOverwriteOptions): TPromise; + $copy(handle: number, resource: UriComponents, target: UriComponents, opts: FileOverwriteOptions): TPromise; $mkdir(handle: number, resource: UriComponents): TPromise; $delete(handle: number, resource: UriComponents): TPromise; $watch(handle: number, session: number, resource: UriComponents, opts: IWatchOptions): void; diff --git a/src/vs/workbench/api/node/extHostFileSystem.ts b/src/vs/workbench/api/node/extHostFileSystem.ts index 330628c339b..52b295f30c9 100644 --- a/src/vs/workbench/api/node/extHostFileSystem.ts +++ b/src/vs/workbench/api/node/extHostFileSystem.ts @@ -272,11 +272,11 @@ export class ExtHostFileSystem implements ExtHostFileSystemShape { return asWinJsPromise(token => this._fsProvider.get(handle).delete(URI.revive(resource), {}, token)); } - $rename(handle: number, oldUri: UriComponents, newUri: UriComponents, opts: files.FileOptions): TPromise { + $rename(handle: number, oldUri: UriComponents, newUri: UriComponents, opts: files.FileOverwriteOptions): TPromise { return asWinJsPromise(token => this._fsProvider.get(handle).rename(URI.revive(oldUri), URI.revive(newUri), opts, token)).then(ExtHostFileSystem._asIStat); } - $copy(handle: number, oldUri: UriComponents, newUri: UriComponents, opts: files.FileOptions): TPromise { + $copy(handle: number, oldUri: UriComponents, newUri: UriComponents, opts: files.FileOverwriteOptions): TPromise { return asWinJsPromise(token => this._fsProvider.get(handle).copy(URI.revive(oldUri), URI.revive(newUri), opts, token)).then(ExtHostFileSystem._asIStat); } diff --git a/src/vs/workbench/services/files/electron-browser/remoteFileService.ts b/src/vs/workbench/services/files/electron-browser/remoteFileService.ts index 530188a07a4..7249a347a96 100644 --- a/src/vs/workbench/services/files/electron-browser/remoteFileService.ts +++ b/src/vs/workbench/services/files/electron-browser/remoteFileService.ts @@ -547,7 +547,7 @@ export class RemoteFileService extends FileService { : TPromise.as(null); return prepare.then(() => this._withProvider(source)).then(provider => { - return provider.rename(source, target, { create: true, exclusive: !overwrite }).then(stat => { + return provider.rename(source, target, { overwrite }).then(stat => { return toIFileStat(provider, [target, stat]); }).then(fileStat => { this._onAfterOperation.fire(new FileOperationEvent(source, FileOperation.MOVE, fileStat)); @@ -576,7 +576,7 @@ export class RemoteFileService extends FileService { if (source.scheme === target.scheme && (provider.capabilities & FileSystemProviderCapabilities.FileFolderCopy)) { // good: provider supports copy withing scheme - return provider.copy(source, target, { create: true, exclusive: !overwrite }).then(stat => toIFileStat(provider, [target, stat])); + return provider.copy(source, target, { overwrite }).then(stat => toIFileStat(provider, [target, stat])); } const prepare = overwrite From 98fa486648969bf18f6954360fb30c0322ee19c5 Mon Sep 17 00:00:00 2001 From: Joao Moreno Date: Thu, 26 Apr 2018 09:48:31 +0200 Subject: [PATCH 099/830] fix NPE fixes #47801 --- src/vs/workbench/parts/scm/electron-browser/scmViewlet.ts | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/vs/workbench/parts/scm/electron-browser/scmViewlet.ts b/src/vs/workbench/parts/scm/electron-browser/scmViewlet.ts index 5a9e281008b..dc29571df77 100644 --- a/src/vs/workbench/parts/scm/electron-browser/scmViewlet.ts +++ b/src/vs/workbench/parts/scm/electron-browser/scmViewlet.ts @@ -358,6 +358,11 @@ class MainPanel extends ViewletPanel { this.list.setSelection(selection); this.list.setFocus([selection[0]]); } + + dispose(): void { + this.visibilityDisposables = dispose(this.visibilityDisposables); + super.dispose(); + } } interface ResourceGroupTemplate { From 96a19943038bf9fb3bd8a93c5f3db6b0def8de5c Mon Sep 17 00:00:00 2001 From: Johannes Rieken Date: Thu, 26 Apr 2018 09:51:24 +0200 Subject: [PATCH 100/830] remove CancelationTokens, #48527 --- src/vs/vscode.d.ts | 24 +++++++------------ .../workbench/api/node/extHostFileSystem.ts | 16 ++++++------- 2 files changed, 16 insertions(+), 24 deletions(-) diff --git a/src/vs/vscode.d.ts b/src/vs/vscode.d.ts index 1dfbc7cdaec..cfc2483856f 100644 --- a/src/vs/vscode.d.ts +++ b/src/vs/vscode.d.ts @@ -5007,54 +5007,48 @@ declare module 'vscode' { * in case the file does not exist. * * @param uri The uri of the file to retrieve meta data about. - * @param token A cancellation token. * @return The file metadata about the file. */ - stat(uri: Uri, options: { /*future: followSymlinks*/ }, token: CancellationToken): FileStat | Thenable; + stat(uri: Uri, options: { /*future: followSymlinks*/ }): FileStat | Thenable; /** * Retrieve the meta data of all entries of a [directory](#FileStat.isDirectory) * * @param uri The uri of the folder. - * @param token A cancellation token. * @return A thenable that resolves to an array of tuples of file names and files stats. */ - readDirectory(uri: Uri, options: { /*future: onlyType?*/ }, token: CancellationToken): [string, FileType][] | Thenable<[string, FileType][]>; + readDirectory(uri: Uri, options: { /*future: onlyType?*/ }): [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. - * @param token A cancellation token. */ - createDirectory(uri: Uri, options: { /*future: permissions?*/ }, token: CancellationToken): FileStat | Thenable; + createDirectory(uri: Uri, options: { /*future: permissions?*/ }): FileStat | Thenable; /** * Read the entire contents of a file. * * @param uri The uri of the file. - * @param token A cancellation token. * @return A thenable that resolves to an array of bytes. */ - readFile(uri: Uri, options: FileOptions, token: CancellationToken): Uint8Array | Thenable; + readFile(uri: Uri, options: FileOptions): 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 token A cancellation token. */ - writeFile(uri: Uri, content: Uint8Array, options: FileOptions, token: CancellationToken): void | Thenable; + writeFile(uri: Uri, content: Uint8Array, options: FileOptions): void | Thenable; /** * Delete a file. * * @param uri The resource that is to be deleted * @param options Options bag for future use - * @param token A cancellation token. */ - delete(uri: Uri, options: { /*future: useTrash?, followSymlinks?*/ }, token: CancellationToken): void | Thenable; + delete(uri: Uri, options: { /*future: useTrash?, followSymlinks?*/ }): void | Thenable; /** * Rename a file or folder. @@ -5062,11 +5056,10 @@ declare module 'vscode' { * @param oldUri The existing file or folder. * @param newUri The target location. * @param options Defines if existing files should be overwriten. - * @param token A cancellation token. * @throws [`FileNotFound`](FileSystemError.FileNotFound) when `oldUri` doesn't exist * @throws [`FileExists`](FileSystemError.FileExists) when `newUri` exists and when the `overwrite` option is not `true`. */ - rename(oldUri: Uri, newUri: Uri, options: { overwrite: boolean }, token: CancellationToken): FileStat | Thenable; + rename(oldUri: Uri, newUri: Uri, options: { overwrite: boolean }): FileStat | Thenable; /** * Copy files or folders. Implementing this function is optional but it will speedup @@ -5075,11 +5068,10 @@ declare module 'vscode' { * @param source The existing file or folder. * @param destination The destination location. * @param options Defines if existing files should be overwriten. - * @param token A cancellation token. * @throws [`FileNotFound`](FileSystemError.FileNotFound) when `source` doesn't exist * @throws [`FileExists`](FileSystemError.FileExists) when `destination` exists and when the `overwrite` option is not `true`. */ - copy?(source: Uri, destination: Uri, options: { overwrite: boolean }, token: CancellationToken): FileStat | Thenable; + copy?(source: Uri, destination: Uri, options: { overwrite: boolean }): FileStat | Thenable; } /** diff --git a/src/vs/workbench/api/node/extHostFileSystem.ts b/src/vs/workbench/api/node/extHostFileSystem.ts index 52b295f30c9..954ce34c00b 100644 --- a/src/vs/workbench/api/node/extHostFileSystem.ts +++ b/src/vs/workbench/api/node/extHostFileSystem.ts @@ -249,39 +249,39 @@ export class ExtHostFileSystem implements ExtHostFileSystemShape { } $stat(handle: number, resource: UriComponents): TPromise { - return asWinJsPromise(token => this._fsProvider.get(handle).stat(URI.revive(resource), {}, token)).then(ExtHostFileSystem._asIStat); + return asWinJsPromise(token => this._fsProvider.get(handle).stat(URI.revive(resource), {})).then(ExtHostFileSystem._asIStat); } $readdir(handle: number, resource: UriComponents): TPromise<[string, files.FileType][], any> { - return asWinJsPromise(token => this._fsProvider.get(handle).readDirectory(URI.revive(resource), {}, token)); + return asWinJsPromise(token => this._fsProvider.get(handle).readDirectory(URI.revive(resource), {})); } $readFile(handle: number, resource: UriComponents, opts: files.FileOptions): TPromise { return asWinJsPromise(token => { - return this._fsProvider.get(handle).readFile(URI.revive(resource), opts, token); + return this._fsProvider.get(handle).readFile(URI.revive(resource), opts); }).then(data => { return Buffer.isBuffer(data) ? data.toString('base64') : Buffer.from(data.buffer, data.byteOffset, data.byteLength).toString('base64'); }); } $writeFile(handle: number, resource: UriComponents, base64Content: string, opts: files.FileOptions): TPromise { - return asWinJsPromise(token => this._fsProvider.get(handle).writeFile(URI.revive(resource), Buffer.from(base64Content, 'base64'), opts, token)); + return asWinJsPromise(token => this._fsProvider.get(handle).writeFile(URI.revive(resource), Buffer.from(base64Content, 'base64'), opts)); } $delete(handle: number, resource: UriComponents): TPromise { - return asWinJsPromise(token => this._fsProvider.get(handle).delete(URI.revive(resource), {}, token)); + return asWinJsPromise(token => this._fsProvider.get(handle).delete(URI.revive(resource), {})); } $rename(handle: number, oldUri: UriComponents, newUri: UriComponents, opts: files.FileOverwriteOptions): TPromise { - return asWinJsPromise(token => this._fsProvider.get(handle).rename(URI.revive(oldUri), URI.revive(newUri), opts, token)).then(ExtHostFileSystem._asIStat); + return asWinJsPromise(token => this._fsProvider.get(handle).rename(URI.revive(oldUri), URI.revive(newUri), opts)).then(ExtHostFileSystem._asIStat); } $copy(handle: number, oldUri: UriComponents, newUri: UriComponents, opts: files.FileOverwriteOptions): TPromise { - return asWinJsPromise(token => this._fsProvider.get(handle).copy(URI.revive(oldUri), URI.revive(newUri), opts, token)).then(ExtHostFileSystem._asIStat); + return asWinJsPromise(token => this._fsProvider.get(handle).copy(URI.revive(oldUri), URI.revive(newUri), opts)).then(ExtHostFileSystem._asIStat); } $mkdir(handle: number, resource: UriComponents): TPromise { - return asWinJsPromise(token => this._fsProvider.get(handle).createDirectory(URI.revive(resource), {}, token)).then(ExtHostFileSystem._asIStat); + return asWinJsPromise(token => this._fsProvider.get(handle).createDirectory(URI.revive(resource), {})).then(ExtHostFileSystem._asIStat); } $watch(handle: number, session: number, resource: UriComponents, opts: files.IWatchOptions): void { From c2f0c40f257a017c0a221202d5a780749fe619d3 Mon Sep 17 00:00:00 2001 From: Joao Moreno Date: Thu, 26 Apr 2018 10:10:32 +0200 Subject: [PATCH 101/830] use progress notification API for git clone fixes #48692 --- extensions/git/src/commands.ts | 30 ++++++++++-------------------- 1 file changed, 10 insertions(+), 20 deletions(-) diff --git a/extensions/git/src/commands.ts b/extensions/git/src/commands.ts index e37383c4932..e73eec2eff0 100644 --- a/extensions/git/src/commands.ts +++ b/extensions/git/src/commands.ts @@ -5,7 +5,7 @@ 'use strict'; -import { Uri, commands, Disposable, window, workspace, QuickPickItem, OutputChannel, Range, WorkspaceEdit, Position, LineChange, SourceControlResourceState, TextDocumentShowOptions, ViewColumn, ProgressLocation, TextEditor, CancellationTokenSource, StatusBarAlignment, MessageOptions } from 'vscode'; +import { Uri, commands, Disposable, window, workspace, QuickPickItem, OutputChannel, Range, WorkspaceEdit, Position, LineChange, SourceControlResourceState, TextDocumentShowOptions, ViewColumn, ProgressLocation, TextEditor, MessageOptions } from 'vscode'; import { Ref, RefType, Git, GitErrorCodes, Branch } from './git'; import { Repository, Resource, Status, CommitOptions, ResourceGroupType } from './repository'; import { Model } from './model'; @@ -328,8 +328,6 @@ export class CommandCenter { return ''; } - private static cloneId = 0; - @command('git.clone') async clone(url?: string): Promise { if (!url) { @@ -368,22 +366,17 @@ export class CommandCenter { return; } - const tokenSource = new CancellationTokenSource(); - const cancelCommandId = `cancelClone${CommandCenter.cloneId++}`; - const commandDisposable = commands.registerCommand(cancelCommandId, () => tokenSource.cancel()); - - const statusBarItem = window.createStatusBarItem(StatusBarAlignment.Left); - statusBarItem.text = localize('cancel', "$(sync~spin) Cloning repository... Click to cancel"); - statusBarItem.tooltip = localize('cancel tooltip', "Cancel clone"); - statusBarItem.command = cancelCommandId; - statusBarItem.show(); - - const clonePromise = this.git.clone(url, parentPath.replace(/^~/, os.homedir()), tokenSource.token); - try { - window.withProgress({ location: ProgressLocation.SourceControl, title: localize('cloning', "Cloning git repository...") }, () => clonePromise); + const opts = { + location: ProgressLocation.Notification, + title: localize('cloning', "Cloning git repository '{0}'...", url), + cancellable: true + }; - const repositoryPath = await clonePromise; + const repositoryPath = await window.withProgress( + opts, + (_, token) => this.git.clone(url!, parentPath.replace(/^~/, os.homedir()), token) + ); const open = localize('openrepo', "Open Repository"); const result = await window.showInformationMessage(localize('proposeopen', "Would you like to open the cloned repository?"), open); @@ -419,9 +412,6 @@ export class CommandCenter { } throw err; - } finally { - commandDisposable.dispose(); - statusBarItem.dispose(); } } From 0ec5e324d1ad6ec8b699295f23b4d01da3efaa4c Mon Sep 17 00:00:00 2001 From: isidor Date: Thu, 26 Apr 2018 10:27:49 +0200 Subject: [PATCH 102/830] fixes #47947 --- src/vs/workbench/parts/files/electron-browser/fileCommands.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/vs/workbench/parts/files/electron-browser/fileCommands.ts b/src/vs/workbench/parts/files/electron-browser/fileCommands.ts index 271b64ec68c..d61bcaf20fc 100644 --- a/src/vs/workbench/parts/files/electron-browser/fileCommands.ts +++ b/src/vs/workbench/parts/files/electron-browser/fileCommands.ts @@ -411,7 +411,7 @@ KeybindingsRegistry.registerCommandAndKeybindingRule({ }); KeybindingsRegistry.registerCommandAndKeybindingRule({ weight: KeybindingsRegistry.WEIGHT.workbenchContrib(), - when: EditorContextKeys.editorTextFocus.toNegated(), + when: undefined, primary: KeyChord(KeyMod.CtrlCmd | KeyCode.KEY_K, KeyCode.KEY_R), id: 'workbench.action.files.revealActiveFileInWindows', handler: (accessor: ServicesAccessor) => { @@ -433,7 +433,7 @@ function resourcesToClipboard(resources: URI[], clipboardService: IClipboardServ } KeybindingsRegistry.registerCommandAndKeybindingRule({ weight: KeybindingsRegistry.WEIGHT.workbenchContrib(), - when: undefined, + when: EditorContextKeys.editorTextFocus.toNegated(), primary: KeyMod.CtrlCmd | KeyMod.Alt | KeyCode.KEY_C, win: { primary: KeyMod.Shift | KeyMod.Alt | KeyCode.KEY_C From 923bbd42f30ce90ab97a9c344fa989eeeb6b1dde Mon Sep 17 00:00:00 2001 From: Johannes Rieken Date: Thu, 26 Apr 2018 10:43:19 +0200 Subject: [PATCH 103/830] remove unused/underspecified options, #48527 --- src/vs/platform/files/common/files.ts | 30 +++--------- src/vs/vscode.d.ts | 49 ++++++++++++------- .../electron-browser/mainThreadFileSystem.ts | 8 +-- src/vs/workbench/api/node/extHost.protocol.ts | 6 +-- .../workbench/api/node/extHostFileSystem.ts | 16 +++--- .../electron-browser/remoteFileService.ts | 12 ++--- .../files/electron-browser/streams.ts | 24 ++++----- 7 files changed, 70 insertions(+), 75 deletions(-) diff --git a/src/vs/platform/files/common/files.ts b/src/vs/platform/files/common/files.ts index fa1a6aa28b1..c99d1c471d1 100644 --- a/src/vs/platform/files/common/files.ts +++ b/src/vs/platform/files/common/files.ts @@ -159,27 +159,9 @@ export interface FileOverwriteOptions { overwrite: boolean; } -export interface FileOptions { - /** - * Create a file when it doesn't exists. - */ - create?: boolean; - - /** - * In combination with [`create`](FileOptions.create) but - * the operation should fail when a file already exists. - */ - exclusive?: boolean; - - /** - * Open a file for reading. - */ - read?: boolean; - - /** - * Open a file for writing. - */ - write?: boolean; +export interface FileWriteOptions { + overwrite: boolean; + create: boolean; } export enum FileType { @@ -224,10 +206,10 @@ export interface IFileSystemProvider { rename(from: URI, to: URI, opts: FileOverwriteOptions): TPromise; copy?(from: URI, to: URI, opts: FileOverwriteOptions): TPromise; - readFile?(resource: URI, opts: FileOptions): TPromise; - writeFile?(resource: URI, content: Uint8Array, opts: FileOptions): TPromise; + readFile?(resource: URI): TPromise; + writeFile?(resource: URI, content: Uint8Array, opts: FileWriteOptions): TPromise; - open?(resource: URI, opts: FileOptions): TPromise; + open?(resource: URI): TPromise; close?(fd: number): TPromise; read?(fd: number, pos: number, data: Uint8Array, offset: number, length: number): TPromise; write?(fd: number, pos: number, data: Uint8Array, offset: number, length: number): TPromise; diff --git a/src/vs/vscode.d.ts b/src/vs/vscode.d.ts index cfc2483856f..9f1239e78f2 100644 --- a/src/vs/vscode.d.ts +++ b/src/vs/vscode.d.ts @@ -4997,58 +4997,69 @@ declare module 'vscode' { /** * Subscribe to events in the file or folder denoted by `uri`. - * @param uri - * @param options + * @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 this `uri`. */ watch(uri: Uri, options: { recursive: boolean; excludes: string[] }): Disposable; /** - * Retrieve metadata about a file. Throw an [`FileNotFound`](#FileSystemError.FileNotFound)-error - * in case the file does not exist. + * Retrieve metadata about a file. * * @param uri The uri of the file to retrieve meta data about. * @return The file metadata about the file. + * @throws [`FileNotFound`](#FileSystemError.FileNotFound) when `uri` doesn't exist. */ - stat(uri: Uri, options: { /*future: followSymlinks*/ }): FileStat | Thenable; + stat(uri: Uri): FileStat | Thenable; /** - * Retrieve the meta data of all entries of a [directory](#FileStat.isDirectory) + * Retrieve the meta data of all entries of a [directory](#FileType.Directory) * * @param uri The uri of the folder. - * @return A thenable that resolves to an array of tuples of file names and files stats. + * @return An array of name/type-tuples or a thenable that resolves to such. + * @throws [`FileNotFound`](#FileSystemError.FileNotFound) when `uri` doesn't exist. */ - readDirectory(uri: Uri, options: { /*future: onlyType?*/ }): [string, FileType][] | Thenable<[string, FileType][]>; + 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. + * @param uri The uri of the new folder. + * @returns Metadata about the created directory or a thenable that resolves to such. + * @throws [`FileNotFound`](#FileSystemError.FileNotFound) when the parent of `uri` doesn't exist. + * @throws [`FileExists`](#FileSystemError.FileExists) when `uri` already exists. */ - createDirectory(uri: Uri, options: { /*future: permissions?*/ }): FileStat | Thenable; + createDirectory(uri: Uri): FileStat | Thenable; /** * Read the entire contents of a file. * * @param uri The uri of the file. - * @return A thenable that resolves to an array of bytes. + * @return An array of bytes or a thenable that resolves to such. + * @throws [`FileNotFound`](#FileSystemError.FileNotFound) when `uri` doesn't exist. */ - readFile(uri: Uri, options: FileOptions): Uint8Array | Thenable; + 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 is missing files should or must be created. + * @throws [`FileNotFound`](#FileSystemError.FileNotFound) when `uri` doesn't exist and `create` is not set. + * @throws [`FileNotFound`](#FileSystemError.FileNotFound) when the parent of `uri` doesn't exist and `create` is set. + * @throws [`FileExists`](#FileSystemError.FileExists) when `uri` already exists and `overwrite` is set. */ - writeFile(uri: Uri, content: Uint8Array, options: FileOptions): void | Thenable; + 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 Options bag for future use + * @param uri The resource that is to be deleted. + * @param options Defines if deletion of folders is recursive. + * @throws [`FileNotFound`](#FileSystemError.FileNotFound) when `uri` doesn't exist. */ - delete(uri: Uri, options: { /*future: useTrash?, followSymlinks?*/ }): void | Thenable; + delete(uri: Uri, options: { recursive: boolean }): void | Thenable; /** * Rename a file or folder. @@ -5056,8 +5067,9 @@ declare module 'vscode' { * @param oldUri The existing file or folder. * @param newUri The target location. * @param options Defines if existing files should be overwriten. - * @throws [`FileNotFound`](FileSystemError.FileNotFound) when `oldUri` doesn't exist - * @throws [`FileExists`](FileSystemError.FileExists) when `newUri` exists and when the `overwrite` option is not `true`. + * @returns Metadata about the renamed file or a thenable that resolves to such. + * @throws [`FileNotFound`](#FileSystemError.FileNotFound) when `oldUri` doesn't exist. + * @throws [`FileExists`](#FileSystemError.FileExists) when `newUri` exists and when the `overwrite` option is not `true`. */ rename(oldUri: Uri, newUri: Uri, options: { overwrite: boolean }): FileStat | Thenable; @@ -5068,6 +5080,7 @@ declare module 'vscode' { * @param source The existing file or folder. * @param destination The destination location. * @param options Defines if existing files should be overwriten. + * @returns Metadata about the copied file or a thenable that resolves to such. * @throws [`FileNotFound`](FileSystemError.FileNotFound) when `source` doesn't exist * @throws [`FileExists`](FileSystemError.FileExists) when `destination` exists and when the `overwrite` option is not `true`. */ diff --git a/src/vs/workbench/api/electron-browser/mainThreadFileSystem.ts b/src/vs/workbench/api/electron-browser/mainThreadFileSystem.ts index 7daef885dc1..ed8c02f6975 100644 --- a/src/vs/workbench/api/electron-browser/mainThreadFileSystem.ts +++ b/src/vs/workbench/api/electron-browser/mainThreadFileSystem.ts @@ -8,7 +8,7 @@ import { Emitter, Event } from 'vs/base/common/event'; import { IDisposable, dispose } from 'vs/base/common/lifecycle'; import URI from 'vs/base/common/uri'; import { TPromise } from 'vs/base/common/winjs.base'; -import { FileOptions, FileSystemProviderCapabilities, IFileChange, IFileService, IFileSystemProvider, IStat, IWatchOptions, FileType, FileOverwriteOptions } from 'vs/platform/files/common/files'; +import { FileWriteOptions, FileSystemProviderCapabilities, IFileChange, IFileService, IFileSystemProvider, IStat, IWatchOptions, FileType, FileOverwriteOptions } from 'vs/platform/files/common/files'; import { extHostNamedCustomer } from 'vs/workbench/api/electron-browser/extHostCustomers'; import { ExtHostContext, ExtHostFileSystemShape, IExtHostContext, IFileChangeDto, MainContext, MainThreadFileSystemShape } from '../node/extHost.protocol'; @@ -94,13 +94,13 @@ class RemoteFileSystemProvider implements IFileSystemProvider { }); } - readFile(resource: URI, opts: FileOptions): TPromise { - return this._proxy.$readFile(this._handle, resource, opts).then(encoded => { + readFile(resource: URI): TPromise { + return this._proxy.$readFile(this._handle, resource).then(encoded => { return Buffer.from(encoded, 'base64'); }); } - writeFile(resource: URI, content: Uint8Array, opts: FileOptions): TPromise { + writeFile(resource: URI, content: Uint8Array, opts: FileWriteOptions): TPromise { let encoded = Buffer.isBuffer(content) ? content.toString('base64') : Buffer.from(content.buffer, content.byteOffset, content.byteLength).toString('base64'); diff --git a/src/vs/workbench/api/node/extHost.protocol.ts b/src/vs/workbench/api/node/extHost.protocol.ts index ac488b829cc..8a7ee4a5de7 100644 --- a/src/vs/workbench/api/node/extHost.protocol.ts +++ b/src/vs/workbench/api/node/extHost.protocol.ts @@ -42,7 +42,7 @@ import { ITreeItem } from 'vs/workbench/common/views'; import { ThemeColor } from 'vs/platform/theme/common/themeService'; import { IDisposable } from 'vs/base/common/lifecycle'; import { SerializedError } from 'vs/base/common/errors'; -import { IStat, FileChangeType, IWatchOptions, FileSystemProviderCapabilities, FileOptions, FileType, FileOverwriteOptions } from 'vs/platform/files/common/files'; +import { IStat, FileChangeType, IWatchOptions, FileSystemProviderCapabilities, FileWriteOptions, FileType, FileOverwriteOptions } from 'vs/platform/files/common/files'; import { ConfigurationScope } from 'vs/platform/configuration/common/configurationRegistry'; import { CommentRule, CharacterPair, EnterAction } from 'vs/editor/common/modes/languageConfiguration'; import { ISingleEditOperation } from 'vs/editor/common/model'; @@ -583,8 +583,8 @@ export interface ExtHostWorkspaceShape { export interface ExtHostFileSystemShape { $stat(handle: number, resource: UriComponents): TPromise; $readdir(handle: number, resource: UriComponents): TPromise<[string, FileType][]>; - $readFile(handle: number, resource: UriComponents, opts: FileOptions): TPromise; - $writeFile(handle: number, resource: UriComponents, base64Encoded: string, opts: FileOptions): TPromise; + $readFile(handle: number, resource: UriComponents): TPromise; + $writeFile(handle: number, resource: UriComponents, base64Encoded: string, opts: FileWriteOptions): TPromise; $rename(handle: number, resource: UriComponents, target: UriComponents, opts: FileOverwriteOptions): TPromise; $copy(handle: number, resource: UriComponents, target: UriComponents, opts: FileOverwriteOptions): TPromise; $mkdir(handle: number, resource: UriComponents): TPromise; diff --git a/src/vs/workbench/api/node/extHostFileSystem.ts b/src/vs/workbench/api/node/extHostFileSystem.ts index 954ce34c00b..f46c802aeaa 100644 --- a/src/vs/workbench/api/node/extHostFileSystem.ts +++ b/src/vs/workbench/api/node/extHostFileSystem.ts @@ -152,7 +152,7 @@ class FileSystemProviderShim implements vscode.FileSystemProvider { }); } - writeFile(resource: vscode.Uri, content: Uint8Array, options: files.FileOptions): Thenable { + writeFile(resource: vscode.Uri, content: Uint8Array, options: files.FileWriteOptions): Thenable { return this._delegate.write(resource, content); } } @@ -249,27 +249,27 @@ export class ExtHostFileSystem implements ExtHostFileSystemShape { } $stat(handle: number, resource: UriComponents): TPromise { - return asWinJsPromise(token => this._fsProvider.get(handle).stat(URI.revive(resource), {})).then(ExtHostFileSystem._asIStat); + return asWinJsPromise(token => this._fsProvider.get(handle).stat(URI.revive(resource))).then(ExtHostFileSystem._asIStat); } $readdir(handle: number, resource: UriComponents): TPromise<[string, files.FileType][], any> { - return asWinJsPromise(token => this._fsProvider.get(handle).readDirectory(URI.revive(resource), {})); + return asWinJsPromise(token => this._fsProvider.get(handle).readDirectory(URI.revive(resource))); } - $readFile(handle: number, resource: UriComponents, opts: files.FileOptions): TPromise { + $readFile(handle: number, resource: UriComponents): TPromise { return asWinJsPromise(token => { - return this._fsProvider.get(handle).readFile(URI.revive(resource), opts); + return this._fsProvider.get(handle).readFile(URI.revive(resource)); }).then(data => { return Buffer.isBuffer(data) ? data.toString('base64') : Buffer.from(data.buffer, data.byteOffset, data.byteLength).toString('base64'); }); } - $writeFile(handle: number, resource: UriComponents, base64Content: string, opts: files.FileOptions): TPromise { + $writeFile(handle: number, resource: UriComponents, base64Content: string, opts: files.FileWriteOptions): TPromise { return asWinJsPromise(token => this._fsProvider.get(handle).writeFile(URI.revive(resource), Buffer.from(base64Content, 'base64'), opts)); } $delete(handle: number, resource: UriComponents): TPromise { - return asWinJsPromise(token => this._fsProvider.get(handle).delete(URI.revive(resource), {})); + return asWinJsPromise(token => this._fsProvider.get(handle).delete(URI.revive(resource), { recursive: true })); } $rename(handle: number, oldUri: UriComponents, newUri: UriComponents, opts: files.FileOverwriteOptions): TPromise { @@ -281,7 +281,7 @@ export class ExtHostFileSystem implements ExtHostFileSystemShape { } $mkdir(handle: number, resource: UriComponents): TPromise { - return asWinJsPromise(token => this._fsProvider.get(handle).createDirectory(URI.revive(resource), {})).then(ExtHostFileSystem._asIStat); + return asWinJsPromise(token => this._fsProvider.get(handle).createDirectory(URI.revive(resource))).then(ExtHostFileSystem._asIStat); } $watch(handle: number, session: number, resource: UriComponents, opts: files.IWatchOptions): void { diff --git a/src/vs/workbench/services/files/electron-browser/remoteFileService.ts b/src/vs/workbench/services/files/electron-browser/remoteFileService.ts index 7249a347a96..50accd1da5d 100644 --- a/src/vs/workbench/services/files/electron-browser/remoteFileService.ts +++ b/src/vs/workbench/services/files/electron-browser/remoteFileService.ts @@ -16,7 +16,7 @@ import { ITextResourceConfigurationService } from 'vs/editor/common/services/res import { localize } from 'vs/nls'; import { IConfigurationService } from 'vs/platform/configuration/common/configuration'; import { IEnvironmentService } from 'vs/platform/environment/common/environment'; -import { FileChangesEvent, FileOperation, FileOperationError, FileOperationEvent, FileOperationResult, FileOptions, FileSystemProviderCapabilities, IContent, ICreateFileOptions, IFileStat, IFileSystemProvider, IFilesConfiguration, IResolveContentOptions, IResolveFileOptions, IResolveFileResult, IStat, IStreamContent, ITextSnapshot, IUpdateContentOptions, StringSnapshot, IWatchOptions, FileType } from 'vs/platform/files/common/files'; +import { FileChangesEvent, FileOperation, FileOperationError, FileOperationEvent, FileOperationResult, FileWriteOptions, FileSystemProviderCapabilities, IContent, ICreateFileOptions, IFileStat, IFileSystemProvider, IFilesConfiguration, IResolveContentOptions, IResolveFileOptions, IResolveFileResult, IStat, IStreamContent, ITextSnapshot, IUpdateContentOptions, StringSnapshot, IWatchOptions, FileType } from 'vs/platform/files/common/files'; import { ILifecycleService } from 'vs/platform/lifecycle/common/lifecycle'; import { INotificationService } from 'vs/platform/notification/common/notification'; import { IStorageService } from 'vs/platform/storage/common/storage'; @@ -380,7 +380,7 @@ export class RemoteFileService extends FileService { } }; - const readable = createReadableOfProvider(provider, resource, options.position || 0, { read: true }); + const readable = createReadableOfProvider(provider, resource, options.position || 0); return toDecodeStream(readable, decodeStreamOpts).then(data => { @@ -414,7 +414,7 @@ export class RemoteFileService extends FileService { return this._withProvider(resource).then(provider => { const encoding = this.encoding.getWriteEncoding(resource); - return this._writeFile(provider, resource, new StringSnapshot(content), encoding, { write: true, create: true, exclusive: !(options && options.overwrite) }); + return this._writeFile(provider, resource, new StringSnapshot(content), encoding, { create: true, overwrite: Boolean(options && options.overwrite) }); }).then(fileStat => { this._onAfterOperation.fire(new FileOperationEvent(resource, FileOperation.CREATE, fileStat)); @@ -436,12 +436,12 @@ export class RemoteFileService extends FileService { } return this._withProvider(resource).then(provider => { const snapshot = typeof value === 'string' ? new StringSnapshot(value) : value; - return this._writeFile(provider, resource, snapshot, options && options.encoding, { write: true }); + return this._writeFile(provider, resource, snapshot, options && options.encoding, { create: false, overwrite: false }); }); } } - private _writeFile(provider: IFileSystemProvider, resource: URI, snapshot: ITextSnapshot, preferredEncoding: string, options: FileOptions): TPromise { + private _writeFile(provider: IFileSystemProvider, resource: URI, snapshot: ITextSnapshot, preferredEncoding: string, options: FileWriteOptions): TPromise { const readable = createReadableOfSnapshot(snapshot); const encoding = this.encoding.getWriteEncoding(resource, preferredEncoding); const decoder = decodeStream(encoding); @@ -592,7 +592,7 @@ export class RemoteFileService extends FileService { provider, target, new StringSnapshot(content.value), content.encoding, - { write: true, create: true, exclusive: !overwrite } + { create: true, overwrite } ).then(fileStat => { this._onAfterOperation.fire(new FileOperationEvent(source, FileOperation.COPY, fileStat)); return fileStat; diff --git a/src/vs/workbench/services/files/electron-browser/streams.ts b/src/vs/workbench/services/files/electron-browser/streams.ts index 583166be2cc..8e56b7da30e 100644 --- a/src/vs/workbench/services/files/electron-browser/streams.ts +++ b/src/vs/workbench/services/files/electron-browser/streams.ts @@ -7,10 +7,10 @@ import { Readable, Writable } from 'stream'; import { UTF8 } from 'vs/base/node/encoding'; import URI from 'vs/base/common/uri'; -import { IFileSystemProvider, ITextSnapshot, FileSystemProviderCapabilities, FileOptions } from 'vs/platform/files/common/files'; +import { IFileSystemProvider, ITextSnapshot, FileSystemProviderCapabilities, FileWriteOptions } from 'vs/platform/files/common/files'; import { illegalArgument } from 'vs/base/common/errors'; -export function createWritableOfProvider(provider: IFileSystemProvider, resource: URI, opts: FileOptions): Writable { +export function createWritableOfProvider(provider: IFileSystemProvider, resource: URI, opts: FileWriteOptions): Writable { if (provider.capabilities & FileSystemProviderCapabilities.FileOpenReadWriteClose) { return createWritable(provider, resource, opts); } else if (provider.capabilities & FileSystemProviderCapabilities.FileReadWrite) { @@ -20,7 +20,7 @@ export function createWritableOfProvider(provider: IFileSystemProvider, resource } } -function createSimpleWritable(provider: IFileSystemProvider, resource: URI, opts: FileOptions): Writable { +function createSimpleWritable(provider: IFileSystemProvider, resource: URI, opts: FileWriteOptions): Writable { return new class extends Writable { _chunks: Buffer[] = []; constructor(opts?) { @@ -41,7 +41,7 @@ function createSimpleWritable(provider: IFileSystemProvider, resource: URI, opts }; } -function createWritable(provider: IFileSystemProvider, resource: URI, opts: FileOptions): Writable { +function createWritable(provider: IFileSystemProvider, resource: URI, opts: FileWriteOptions): Writable { return new class extends Writable { _fd: number; _pos: number; @@ -51,7 +51,7 @@ function createWritable(provider: IFileSystemProvider, resource: URI, opts: File async _write(chunk: Buffer, encoding, callback: Function) { try { if (typeof this._fd !== 'number') { - this._fd = await provider.open(resource, opts); + this._fd = await provider.open(resource); } let bytesWritten = await provider.write(this._fd, this._pos, chunk, 0, chunk.length); this._pos += bytesWritten; @@ -70,17 +70,17 @@ function createWritable(provider: IFileSystemProvider, resource: URI, opts: File }; } -export function createReadableOfProvider(provider: IFileSystemProvider, resource: URI, position: number, opts: FileOptions): Readable { +export function createReadableOfProvider(provider: IFileSystemProvider, resource: URI, position: number): Readable { if (provider.capabilities & FileSystemProviderCapabilities.FileOpenReadWriteClose) { - return createReadable(provider, resource, position, opts); + return createReadable(provider, resource, position); } else if (provider.capabilities & FileSystemProviderCapabilities.FileReadWrite) { - return createSimpleReadable(provider, resource, position, opts); + return createSimpleReadable(provider, resource, position); } else { throw illegalArgument(); } } -function createReadable(provider: IFileSystemProvider, resource: URI, position: number, opts: FileOptions): Readable { +function createReadable(provider: IFileSystemProvider, resource: URI, position: number): Readable { return new class extends Readable { _fd: number; _pos: number = position; @@ -96,7 +96,7 @@ function createReadable(provider: IFileSystemProvider, resource: URI, position: this._reading = true; try { if (typeof this._fd !== 'number') { - this._fd = await provider.open(resource, opts); + this._fd = await provider.open(resource); } let buffer = Buffer.allocUnsafe(64 * 1024); while (this._reading) { @@ -124,14 +124,14 @@ function createReadable(provider: IFileSystemProvider, resource: URI, position: }; } -function createSimpleReadable(provider: IFileSystemProvider, resource: URI, position: number, opts: FileOptions): Readable { +function createSimpleReadable(provider: IFileSystemProvider, resource: URI, position: number): Readable { return new class extends Readable { _readOperation: Thenable; _read(size?: number): void { if (this._readOperation) { return; } - this._readOperation = provider.readFile(resource, opts).then(data => { + this._readOperation = provider.readFile(resource).then(data => { this.push(data.slice(position)); this.push(null); }, err => { From aab6f59a4c281d8efc0579ae1e3a12801a42a57b Mon Sep 17 00:00:00 2001 From: Sandeep Somavarapu Date: Thu, 26 Apr 2018 10:46:27 +0200 Subject: [PATCH 104/830] For performance reason check for .json files and deletes .vscode folder first --- .../services/configuration/node/configuration.ts | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/src/vs/workbench/services/configuration/node/configuration.ts b/src/vs/workbench/services/configuration/node/configuration.ts index b763c271181..3479073d1d6 100644 --- a/src/vs/workbench/services/configuration/node/configuration.ts +++ b/src/vs/workbench/services/configuration/node/configuration.ts @@ -288,19 +288,21 @@ export class FileServiceBasedFolderConfiguration extends AbstractFolderConfigura // Find changes that affect workspace configuration files for (let i = 0, len = events.length; i < len; i++) { - const resource = events[i].resource; - const folderRelativePath = this.toFolderRelativePath(resource); - if (!folderRelativePath) { - continue; // event is not inside folder - } + const resource = events[i].resource; const basename = paths.basename(resource.path); const isJson = paths.extname(basename) === '.json'; const isDeletedSettingsFolder = (events[i].type === FileChangeType.DELETED && basename === this.configFolderRelativePath); + if (!isJson && !isDeletedSettingsFolder) { continue; // only JSON files or the actual settings folder } + const folderRelativePath = this.toFolderRelativePath(resource); + if (!folderRelativePath) { + continue; // event is not inside folder + } + // Handle case where ".vscode" got deleted if (isDeletedSettingsFolder) { this.workspaceFilePathToConfiguration = Object.create(null); From 9d2bc792d509ee1c610657bbf33c531224350b01 Mon Sep 17 00:00:00 2001 From: Johannes Rieken Date: Thu, 26 Apr 2018 10:48:07 +0200 Subject: [PATCH 105/830] no more FileOptions, #48668 --- src/vs/vscode.d.ts | 26 -------------------------- 1 file changed, 26 deletions(-) diff --git a/src/vs/vscode.d.ts b/src/vs/vscode.d.ts index 9f1239e78f2..8c69773e1f4 100644 --- a/src/vs/vscode.d.ts +++ b/src/vs/vscode.d.ts @@ -4948,32 +4948,6 @@ declare module 'vscode' { */ uri: Uri; } - /** - * Commonly used options when reading, writing, or stat'ing files or folders. - */ - export interface FileOptions { - - /** - * Create a file when it doesn't exists - */ - create?: boolean; - - /** - * In combination with [`create`](FileOptions.create) but - * the operation should fail when a file already exists. - */ - exclusive?: boolean; - - /** - * Open a file for reading. - */ - read?: boolean; - - /** - * Open a file for writing. - */ - write?: boolean; - } /** * The filesystem provider defines what the editor needs to read, write, discover, From 271eba6590c0c00e79c25e47f3a8ca2aff1d6557 Mon Sep 17 00:00:00 2001 From: Joao Moreno Date: Thu, 26 Apr 2018 10:35:51 +0200 Subject: [PATCH 106/830] prevent double protocol handler registration fixes #48476 --- src/vs/workbench/api/node/extHostUrls.ts | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/src/vs/workbench/api/node/extHostUrls.ts b/src/vs/workbench/api/node/extHostUrls.ts index 6732afcad4d..534dfb4f02a 100644 --- a/src/vs/workbench/api/node/extHostUrls.ts +++ b/src/vs/workbench/api/node/extHostUrls.ts @@ -14,6 +14,7 @@ export class ExtHostUrls implements ExtHostUrlsShape { private static HandlePool = 0; private readonly _proxy: MainThreadUrlsShape; + private handles = new Set(); private handlers = new Map(); constructor( @@ -23,11 +24,17 @@ export class ExtHostUrls implements ExtHostUrlsShape { } registerProtocolHandler(extensionId: string, handler: vscode.ProtocolHandler): vscode.Disposable { + if (this.handles.has(extensionId)) { + throw new Error(`Protocol handler already registered for extension ${extensionId}`); + } + const handle = ExtHostUrls.HandlePool++; + this.handles.add(extensionId); this.handlers.set(handle, handler); this._proxy.$registerProtocolHandler(handle, extensionId); return toDisposable(() => { + this.handles.delete(extensionId); this.handlers.delete(handle); this._proxy.$unregisterProtocolHandler(handle); }); From 5b38ec4b2a6475a2c98a7d0e44b67c0d415f8382 Mon Sep 17 00:00:00 2001 From: Joao Moreno Date: Thu, 26 Apr 2018 11:09:17 +0200 Subject: [PATCH 107/830] deal protocol handler registration during user prompt fixes #48479 --- .../inactiveExtensionUrlHandler.ts | 19 +++++++++++++------ 1 file changed, 13 insertions(+), 6 deletions(-) diff --git a/src/vs/platform/url/electron-browser/inactiveExtensionUrlHandler.ts b/src/vs/platform/url/electron-browser/inactiveExtensionUrlHandler.ts index 5c6ab39a215..71381696ae5 100644 --- a/src/vs/platform/url/electron-browser/inactiveExtensionUrlHandler.ts +++ b/src/vs/platform/url/electron-browser/inactiveExtensionUrlHandler.ts @@ -40,7 +40,7 @@ export class ExtensionUrlHandler implements IExtensionUrlHandler, IURLHandler { readonly _serviceBrand: any; - private extensionIds = new Set(); + private extensionHandlers = new Map(); private uriBuffer = new Map(); private disposable: IDisposable; @@ -63,6 +63,7 @@ export class ExtensionUrlHandler implements IExtensionUrlHandler, IURLHandler { } const extensionId = uri.authority; + const wasHandlerAvailable = this.extensionHandlers.has(extensionId); const result = await this.dialogService.confirm({ message: localize('confirmUrl', "Do you want to let the {0} extension open the following URL?", extensionId), @@ -73,8 +74,14 @@ export class ExtensionUrlHandler implements IExtensionUrlHandler, IURLHandler { return true; } - // let the ExtensionUrlHandler instance handle this - if (this.extensionIds.has(extensionId)) { + const handler = this.extensionHandlers.get(extensionId); + if (handler) { + if (!wasHandlerAvailable) { + // forward it directly + return handler.handleURL(uri); + } + + // let the ExtensionUrlHandler instance handle this return TPromise.as(false); } @@ -96,7 +103,7 @@ export class ExtensionUrlHandler implements IExtensionUrlHandler, IURLHandler { } registerExtensionHandler(extensionId: string, handler: IURLHandler): void { - this.extensionIds.add(extensionId); + this.extensionHandlers.set(extensionId, handler); const uris = this.uriBuffer.get(extensionId) || []; @@ -108,7 +115,7 @@ export class ExtensionUrlHandler implements IExtensionUrlHandler, IURLHandler { } unregisterExtensionHandler(extensionId: string): void { - this.extensionIds.delete(extensionId); + this.extensionHandlers.delete(extensionId); } // forget about all uris buffered more than 5 minutes ago @@ -129,7 +136,7 @@ export class ExtensionUrlHandler implements IExtensionUrlHandler, IURLHandler { dispose(): void { this.disposable.dispose(); - this.extensionIds.clear(); + this.extensionHandlers.clear(); this.uriBuffer.clear(); } } \ No newline at end of file From 6cbbb7e698c5e92917cdf41a2e80c425bde19946 Mon Sep 17 00:00:00 2001 From: Johannes Rieken Date: Thu, 26 Apr 2018 10:59:37 +0200 Subject: [PATCH 108/830] add NoPermissions-error, more jsdoc, #48527 --- src/vs/vscode.d.ts | 19 ++++++++++++------- src/vs/workbench/api/node/extHostTypes.ts | 3 +++ .../electron-browser/remoteFileService.ts | 5 +++++ 3 files changed, 20 insertions(+), 7 deletions(-) diff --git a/src/vs/vscode.d.ts b/src/vs/vscode.d.ts index 8c69773e1f4..68d3bc42576 100644 --- a/src/vs/vscode.d.ts +++ b/src/vs/vscode.d.ts @@ -4854,17 +4854,14 @@ declare module 'vscode' { * to a file. */ type: FileType; - /** - * The creation timestamp in milliseconds. + * The creation timestamp in milliseconds elapsed since January 1, 1970 00:00:00 UTC. */ ctime: number; - /** - * The modification timestamp in milliseconds. + * The modification timestamp in milliseconds elapsed since January 1, 1970 00:00:00 UTC. */ mtime: number; - /** * The size in bytes. */ @@ -4904,6 +4901,12 @@ declare module 'vscode' { */ 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; + /** * Creates a new filesystem error. * @@ -5043,6 +5046,7 @@ declare module 'vscode' { * @param options Defines if existing files should be overwriten. * @returns Metadata about the renamed file or a thenable that resolves to such. * @throws [`FileNotFound`](#FileSystemError.FileNotFound) when `oldUri` doesn't exist. + * @throws [`FileNotFound`](#FileSystemError.FileNotFound) when parent of `newUri` doesn't exist * @throws [`FileExists`](#FileSystemError.FileExists) when `newUri` exists and when the `overwrite` option is not `true`. */ rename(oldUri: Uri, newUri: Uri, options: { overwrite: boolean }): FileStat | Thenable; @@ -5055,8 +5059,9 @@ declare module 'vscode' { * @param destination The destination location. * @param options Defines if existing files should be overwriten. * @returns Metadata about the copied file or a thenable that resolves to such. - * @throws [`FileNotFound`](FileSystemError.FileNotFound) when `source` doesn't exist - * @throws [`FileExists`](FileSystemError.FileExists) when `destination` exists and when the `overwrite` option is not `true`. + * @throws [`FileNotFound`](#FileSystemError.FileNotFound) when `source` doesn't exist + * @throws [`FileNotFound`](#FileSystemError.FileNotFound) when parent of `destination` doesn't exist + * @throws [`FileExists`](#FileSystemError.FileExists) when `destination` exists and when the `overwrite` option is not `true`. */ copy?(source: Uri, destination: Uri, options: { overwrite: boolean }): FileStat | Thenable; } diff --git a/src/vs/workbench/api/node/extHostTypes.ts b/src/vs/workbench/api/node/extHostTypes.ts index b1cb67d05c0..1d84be94566 100644 --- a/src/vs/workbench/api/node/extHostTypes.ts +++ b/src/vs/workbench/api/node/extHostTypes.ts @@ -1878,6 +1878,9 @@ export class FileSystemError extends Error { static FileIsADirectory(messageOrUri?: string | URI): FileSystemError { return new FileSystemError(messageOrUri, 'EntryIsADirectory', FileSystemError.FileIsADirectory); } + static NoPermissions(messageOrUri?: string | URI): FileSystemError { + return new FileSystemError(messageOrUri, 'NoPermissions', FileSystemError.NoPermissions); + } constructor(uriOrMessage?: string | URI, code?: string, terminator?: Function) { super(URI.isUri(uriOrMessage) ? uriOrMessage.toString(true) : uriOrMessage); diff --git a/src/vs/workbench/services/files/electron-browser/remoteFileService.ts b/src/vs/workbench/services/files/electron-browser/remoteFileService.ts index 50accd1da5d..34a7b3d7609 100644 --- a/src/vs/workbench/services/files/electron-browser/remoteFileService.ts +++ b/src/vs/workbench/services/files/electron-browser/remoteFileService.ts @@ -240,7 +240,12 @@ export class RemoteFileService extends FileService { case 'EntryIsADirectory': res = FileOperationResult.FILE_IS_DIRECTORY; break; + case 'NoPermissions': + res = FileOperationResult.FILE_PERMISSION_DENIED; + break; case 'EntryExists': + res = FileOperationResult.FILE_MOVE_CONFLICT; + break; case 'EntryNotADirectory': default: // todo From 01b7ae0ac9c7447ca24496c0923e9e67f79447cf Mon Sep 17 00:00:00 2001 From: Johannes Rieken Date: Thu, 26 Apr 2018 11:12:48 +0200 Subject: [PATCH 109/830] properly handle exists-errors, #48660 --- .../electron-browser/remoteFileService.ts | 24 +++++++++++++++++-- 1 file changed, 22 insertions(+), 2 deletions(-) diff --git a/src/vs/workbench/services/files/electron-browser/remoteFileService.ts b/src/vs/workbench/services/files/electron-browser/remoteFileService.ts index 34a7b3d7609..c62b811e0e9 100644 --- a/src/vs/workbench/services/files/electron-browser/remoteFileService.ts +++ b/src/vs/workbench/services/files/electron-browser/remoteFileService.ts @@ -557,6 +557,12 @@ export class RemoteFileService extends FileService { }).then(fileStat => { this._onAfterOperation.fire(new FileOperationEvent(source, FileOperation.MOVE, fileStat)); return fileStat; + }, err => { + const result = this._tryParseFileOperationResult(err); + if (result === FileOperationResult.FILE_MOVE_CONFLICT) { + throw new FileOperationError(localize('fileMoveConflict', "Unable to move/copy. File already exists at destination."), result); + } + throw err; }); }); } @@ -581,7 +587,18 @@ export class RemoteFileService extends FileService { if (source.scheme === target.scheme && (provider.capabilities & FileSystemProviderCapabilities.FileFolderCopy)) { // good: provider supports copy withing scheme - return provider.copy(source, target, { overwrite }).then(stat => toIFileStat(provider, [target, stat])); + return provider.copy(source, target, { overwrite }).then(stat => { + return toIFileStat(provider, [target, stat]); + }).then(fileStat => { + this._onAfterOperation.fire(new FileOperationEvent(source, FileOperation.COPY, fileStat)); + return fileStat; + }, err => { + const result = this._tryParseFileOperationResult(err); + if (result === FileOperationResult.FILE_MOVE_CONFLICT) { + throw new FileOperationError(localize('fileMoveConflict', "Unable to move/copy. File already exists at destination."), result); + } + throw err; + }); } const prepare = overwrite @@ -603,7 +620,10 @@ export class RemoteFileService extends FileService { return fileStat; }); }, err => { - if (err instanceof Error && err.name === 'ENOPRO') { + const result = this._tryParseFileOperationResult(err); + if (result === FileOperationResult.FILE_MOVE_CONFLICT) { + throw new FileOperationError(localize('fileMoveConflict', "Unable to move/copy. File already exists at destination."), result); + } else if (err instanceof Error && err.name === 'ENOPRO') { // file scheme return super.updateContent(target, content.value, { encoding: content.encoding }); } else { From f765117b953b154b9272b92c921bc7eab71d81b5 Mon Sep 17 00:00:00 2001 From: Joao Moreno Date: Thu, 26 Apr 2018 11:19:52 +0200 Subject: [PATCH 110/830] add workspace folder after git clone fixes #48738 --- extensions/git/src/commands.ts | 19 +++++++++++++++++-- 1 file changed, 17 insertions(+), 2 deletions(-) diff --git a/extensions/git/src/commands.ts b/extensions/git/src/commands.ts index e73eec2eff0..6dd3ee6ed33 100644 --- a/extensions/git/src/commands.ts +++ b/extensions/git/src/commands.ts @@ -378,8 +378,18 @@ export class CommandCenter { (_, token) => this.git.clone(url!, parentPath.replace(/^~/, os.homedir()), token) ); + const choices = []; + let message = localize('proposeopen', "Would you like to open the cloned repository?"); const open = localize('openrepo', "Open Repository"); - const result = await window.showInformationMessage(localize('proposeopen', "Would you like to open the cloned repository?"), open); + choices.push(open); + + const addToWorkspace = localize('add', "Add to Workspace"); + if (workspace.workspaceFolders) { + message = localize('proposeopen2', "Would you like to open the cloned repository, or add it to the current workspace?"); + choices.push(addToWorkspace); + } + + const result = await window.showInformationMessage(message, ...choices); const openFolder = result === open; /* __GDPR__ @@ -389,8 +399,13 @@ export class CommandCenter { } */ this.telemetryReporter.sendTelemetryEvent('clone', { outcome: 'success' }, { openFolder: openFolder ? 1 : 0 }); + + const uri = Uri.file(repositoryPath); + if (openFolder) { - commands.executeCommand('vscode.openFolder', Uri.file(repositoryPath)); + commands.executeCommand('vscode.openFolder', uri); + } else if (result === addToWorkspace) { + workspace.updateWorkspaceFolders(workspace.workspaceFolders!.length, 0, { uri }); } } catch (err) { if (/already exists and is not an empty directory/.test(err && err.stderr || '')) { From d1380912cf5c9db73d35ba00c5028f021a8f897e Mon Sep 17 00:00:00 2001 From: Joao Moreno Date: Thu, 26 Apr 2018 11:33:16 +0200 Subject: [PATCH 111/830] use native dialog for git clone fixes #48492 --- extensions/git/src/commands.ts | 20 +++++++++++++------- 1 file changed, 13 insertions(+), 7 deletions(-) diff --git a/extensions/git/src/commands.ts b/extensions/git/src/commands.ts index 6dd3ee6ed33..1ca402bf14f 100644 --- a/extensions/git/src/commands.ts +++ b/extensions/git/src/commands.ts @@ -348,15 +348,18 @@ export class CommandCenter { } const config = workspace.getConfiguration('git'); - let value = config.get('defaultCloneDirectory') || os.homedir(); + let defaultCloneDirectory = config.get('defaultCloneDirectory') || os.homedir(); + defaultCloneDirectory = defaultCloneDirectory.replace(/^~/, os.homedir()); - const parentPath = await window.showInputBox({ - prompt: localize('parent', "Parent Directory"), - value, - ignoreFocusOut: true + const uris = await window.showOpenDialog({ + canSelectFiles: false, + canSelectFolders: true, + canSelectMany: false, + defaultUri: Uri.file(defaultCloneDirectory), + openLabel: localize('selectFolder', "Select Repository Location") }); - if (!parentPath) { + if (!uris || uris.length === 0) { /* __GDPR__ "clone" : { "outcome" : { "classification": "SystemMetaData", "purpose": "FeatureInsight" } @@ -366,6 +369,9 @@ export class CommandCenter { return; } + const uri = uris[0]; + const parentPath = uri.fsPath; + try { const opts = { location: ProgressLocation.Notification, @@ -375,7 +381,7 @@ export class CommandCenter { const repositoryPath = await window.withProgress( opts, - (_, token) => this.git.clone(url!, parentPath.replace(/^~/, os.homedir()), token) + (_, token) => this.git.clone(url!, parentPath, token) ); const choices = []; From 02bcbbc8dab392dcbf8a005acba582e9ed12d91b Mon Sep 17 00:00:00 2001 From: Joao Moreno Date: Thu, 26 Apr 2018 11:33:55 +0200 Subject: [PATCH 112/830] pick different folder names for git clone fixes #48485 --- extensions/git/src/git.ts | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/extensions/git/src/git.ts b/extensions/git/src/git.ts index 77101cf8347..a04aba93531 100644 --- a/extensions/git/src/git.ts +++ b/extensions/git/src/git.ts @@ -388,8 +388,15 @@ export class Git { } async clone(url: string, parentPath: string, cancellationToken?: CancellationToken): Promise { - const folderName = decodeURI(url).replace(/^.*\//, '').replace(/\.git$/, '') || 'repository'; - const folderPath = path.join(parentPath, folderName); + let baseFolderName = decodeURI(url).replace(/^.*\//, '').replace(/\.git$/, '') || 'repository'; + let folderName = baseFolderName; + let folderPath = path.join(parentPath, folderName); + let count = 1; + + while (count < 20 && await new Promise(c => fs.exists(folderPath, c))) { + folderName = `${baseFolderName}-${count++}`; + folderPath = path.join(parentPath, folderName); + } await mkdirp(parentPath); From d4677c3a0aa9a45a3f6ce874801a228dc2ae8be6 Mon Sep 17 00:00:00 2001 From: isidor Date: Thu, 26 Apr 2018 11:45:39 +0200 Subject: [PATCH 113/830] debug: debug.hideNonDebugHovers --- src/vs/workbench/parts/debug/common/debug.ts | 1 + .../electron-browser/debug.contribution.ts | 5 +++++ .../debugEditorContribution.ts | 20 +++++++++++++++++-- 3 files changed, 24 insertions(+), 2 deletions(-) diff --git a/src/vs/workbench/parts/debug/common/debug.ts b/src/vs/workbench/parts/debug/common/debug.ts index 9522abecb6f..ad601775749 100644 --- a/src/vs/workbench/parts/debug/common/debug.ts +++ b/src/vs/workbench/parts/debug/common/debug.ts @@ -351,6 +351,7 @@ export interface IDebugConfiguration { showInStatusBar: 'never' | 'always' | 'onFirstSessionStart'; internalConsoleOptions: 'neverOpen' | 'openOnSessionStart' | 'openOnFirstSessionStart'; extensionHostDebugAdapter: boolean; + hideNonDebugHovers: boolean; } export interface IGlobalConfig { diff --git a/src/vs/workbench/parts/debug/electron-browser/debug.contribution.ts b/src/vs/workbench/parts/debug/electron-browser/debug.contribution.ts index 0cf19b4fc6c..46621dd5473 100644 --- a/src/vs/workbench/parts/debug/electron-browser/debug.contribution.ts +++ b/src/vs/workbench/parts/debug/electron-browser/debug.contribution.ts @@ -205,6 +205,11 @@ configurationRegistry.registerConfiguration({ default: 'openOnFirstSessionStart', description: nls.localize('openDebug', "Controls whether debug view should be open on debugging session start.") }, + 'debug.hideNonDebugHovers': { + type: 'boolean', + description: nls.localize({ comment: ['This is the description for a setting'], key: 'hideNonDebugHovers' }, "Controls if the non debug hovers should be hidden while debugging. If false the hover providers will be called to provide a hover. Regular hovers will not be shown even if this setting is false."), + default: true + }, 'launch': { type: 'object', description: nls.localize({ comment: ['This is the description for a setting'], key: 'launch' }, "Global debug launch configuration. Should be used as an alternative to 'launch.json' that is shared across workspaces"), diff --git a/src/vs/workbench/parts/debug/electron-browser/debugEditorContribution.ts b/src/vs/workbench/parts/debug/electron-browser/debugEditorContribution.ts index c1bee3bf46b..cb7c178fa10 100644 --- a/src/vs/workbench/parts/debug/electron-browser/debugEditorContribution.ts +++ b/src/vs/workbench/parts/debug/electron-browser/debugEditorContribution.ts @@ -6,7 +6,7 @@ import * as nls from 'vs/nls'; import * as errors from 'vs/base/common/errors'; import { TPromise } from 'vs/base/common/winjs.base'; -import { RunOnceScheduler } from 'vs/base/common/async'; +import { RunOnceScheduler, asWinJsPromise } from 'vs/base/common/async'; import * as lifecycle from 'vs/base/common/lifecycle'; import * as env from 'vs/base/common/platform'; import uri from 'vs/base/common/uri'; @@ -16,7 +16,7 @@ import { Constants } from 'vs/editor/common/core/uint'; import { IAction, Action } from 'vs/base/common/actions'; import { KeyCode } from 'vs/base/common/keyCodes'; import { IKeyboardEvent } from 'vs/base/browser/keyboardEvent'; -import { StandardTokenType } from 'vs/editor/common/modes'; +import { StandardTokenType, HoverProviderRegistry } from 'vs/editor/common/modes'; import { DEFAULT_WORD_REGEXP } from 'vs/editor/common/model/wordHelper'; import { ICodeEditor, IEditorMouseEvent, MouseTargetType } from 'vs/editor/browser/editorBrowser'; import { registerEditorContribution } from 'vs/editor/browser/editorExtensions'; @@ -57,6 +57,7 @@ export class DebugEditorContribution implements IDebugEditorContribution { private toDispose: lifecycle.IDisposable[]; private hoverWidget: DebugHoverWidget; + private nonDebugHoverPosition: Position; private hoverRange: Range; private breakpointHintDecoration: string[]; @@ -340,6 +341,17 @@ export class DebugEditorContribution implements IDebugEditorContribution { return new RunOnceScheduler(() => this.hoverWidget.hide(), HOVER_DELAY); } + @memoize + private get provideNonDebugHoverScheduler(): RunOnceScheduler { + return new RunOnceScheduler(() => { + const model = this.editor.getModel(); + const supports = HoverProviderRegistry.ordered(model); + TPromise.join(supports.map(s => + asWinJsPromise(token => s.provideHover(model, this.nonDebugHoverPosition, token))) + ).done(undefined, errors.onUnexpectedError); + }, HOVER_DELAY); + } + private hideHoverWidget(): void { if (!this.hideHoverScheduler.isScheduled() && this.hoverWidget.isVisible()) { this.hideHoverScheduler.schedule(); @@ -362,6 +374,10 @@ export class DebugEditorContribution implements IDebugEditorContribution { return; } + if (!this.configurationService.getValue('debug').hideNonDebugHovers) { + this.nonDebugHoverPosition = mouseEvent.target.position; + this.provideNonDebugHoverScheduler.schedule(); + } const targetType = mouseEvent.target.type; const stopKey = env.isMacintosh ? 'metaKey' : 'ctrlKey'; From 6b82f92a08b10f1a946a72dc0acd5ab04cf3aad2 Mon Sep 17 00:00:00 2001 From: Sandeep Somavarapu Date: Thu, 26 Apr 2018 12:06:56 +0200 Subject: [PATCH 114/830] Fix #48627 --- .../configuration/node/configuration.ts | 17 ++++++++++++----- 1 file changed, 12 insertions(+), 5 deletions(-) diff --git a/src/vs/workbench/services/configuration/node/configuration.ts b/src/vs/workbench/services/configuration/node/configuration.ts index 3479073d1d6..cbc98afe54b 100644 --- a/src/vs/workbench/services/configuration/node/configuration.ts +++ b/src/vs/workbench/services/configuration/node/configuration.ts @@ -161,9 +161,17 @@ export abstract class AbstractFolderConfiguration extends Disposable implements loadConfiguration(): TPromise { return this.loadFolderConfigurationContents() .then((contents) => { + + // reset + this._standAloneConfigurations = []; + this._folderSettingsModelParser.parse(''); + + // parse this.parseContents(contents); + // Consolidate (support *.json files in the workspace settings folder) this.consolidate(); + this._loaded = true; return this._cache; }); @@ -183,7 +191,6 @@ export abstract class AbstractFolderConfiguration extends Disposable implements } private parseContents(contents: { resource: URI, value: string }[]): void { - this._standAloneConfigurations = []; for (const content of contents) { const name = paths.basename(content.resource.path); if (name === `${FOLDER_SETTINGS_NAME}.json`) { @@ -334,12 +341,12 @@ export class FileServiceBasedFolderConfiguration extends AbstractFolderConfigura private toFolderRelativePath(resource: URI): string { if (resource.scheme === Schemas.file) { - if (paths.isEqualOrParent(resource.fsPath, this.folder.fsPath, !isLinux /* ignorecase */)) { - return paths.normalize(relative(this.folder.fsPath, resource.fsPath)); + if (paths.isEqualOrParent(resource.fsPath, this.folderConfigurationPath.fsPath, !isLinux /* ignorecase */)) { + return paths.normalize(relative(this.folderConfigurationPath.fsPath, resource.fsPath)); } } else { - if (paths.isEqualOrParent(resource.path, this.folder.path, true /* ignorecase */)) { - return paths.normalize(relative(this.folder.path, resource.path)); + if (paths.isEqualOrParent(resource.path, this.folderConfigurationPath.path, true /* ignorecase */)) { + return paths.normalize(relative(this.folderConfigurationPath.path, resource.path)); } } return null; From cb982cab99f4f6cd51a4397fe362ed5c3cf6fed3 Mon Sep 17 00:00:00 2001 From: Erich Gamma Date: Thu, 26 Apr 2018 12:12:29 +0200 Subject: [PATCH 115/830] Fixing #48456 always include npm install --- extensions/npm/src/tasks.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/extensions/npm/src/tasks.ts b/extensions/npm/src/tasks.ts index bde3743692d..be689debdba 100644 --- a/extensions/npm/src/tasks.ts +++ b/extensions/npm/src/tasks.ts @@ -164,7 +164,7 @@ async function provideNpmScriptsForFolder(packageJsonUri: Uri): Promise result.push(task); }); // always add npm install (without a problem matcher) - // result.push(createTask('install', 'install', rootPath, folder, [])); + result.push(createTask('install', 'install', folder, packageJsonUri, [])); return result; } From b1f5a4d5df9b8c9e4a5cc79881a430878cf05c50 Mon Sep 17 00:00:00 2001 From: Sandeep Somavarapu Date: Thu, 26 Apr 2018 12:29:49 +0200 Subject: [PATCH 116/830] #43645 Lift off proposed api flag --- src/vs/workbench/api/browser/viewsContainersExtensionPoint.ts | 4 ---- 1 file changed, 4 deletions(-) diff --git a/src/vs/workbench/api/browser/viewsContainersExtensionPoint.ts b/src/vs/workbench/api/browser/viewsContainersExtensionPoint.ts index 36f215340ca..5528735ff51 100644 --- a/src/vs/workbench/api/browser/viewsContainersExtensionPoint.ts +++ b/src/vs/workbench/api/browser/viewsContainersExtensionPoint.ts @@ -92,10 +92,6 @@ class ViewsContainersExtensionHandler implements IWorkbenchContribution { viewsContainersExtensionPoint.setHandler((extensions) => { for (let extension of extensions) { const { value, collector } = extension; - if (!extension.description.enableProposedApi) { - collector.error(localize({ key: 'proposed', comment: ['Contribution refers to those that an extension contributes to VS Code through an extension/contribution point. '] }, "'viewsContainers' contribution is only available when running out of dev or with the following command line switch: --enable-proposed-api {0}", extension.description.id)); - continue; - } forEach(value, entry => { if (!this.isValidViewsContainer(entry.value, collector)) { return; From 29ad969380558aecc50c1e9cfdf74921a67686f3 Mon Sep 17 00:00:00 2001 From: Till Salinger Date: Thu, 26 Apr 2018 12:45:22 +0200 Subject: [PATCH 117/830] fixes #43687 Renaming a file in explorer creates a one second glitch in input box --- .../parts/files/electron-browser/views/explorerViewer.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/src/vs/workbench/parts/files/electron-browser/views/explorerViewer.ts b/src/vs/workbench/parts/files/electron-browser/views/explorerViewer.ts index 1a418a43fc5..78e0e1d8e66 100644 --- a/src/vs/workbench/parts/files/electron-browser/views/explorerViewer.ts +++ b/src/vs/workbench/parts/files/electron-browser/views/explorerViewer.ts @@ -300,6 +300,7 @@ export class FileRenderer implements IRenderer { const done = once((commit: boolean, blur: boolean) => { tree.clearHighlight(); + label.element.style.display = 'none'; if (commit && inputBox.value) { editableData.action.run({ value: inputBox.value }); From 3929ea094101c2e9535ea030c38f5cf91be629ca Mon Sep 17 00:00:00 2001 From: Alex Dima Date: Thu, 26 Apr 2018 12:46:47 +0200 Subject: [PATCH 118/830] Fixes #48741: Sort reverse edit operations only if order is not significant --- .../pieceTreeTextBuffer.ts | 16 ++++++++++---- .../common/model/editableTextModel.test.ts | 22 +++++++++++++++++++ 2 files changed, 34 insertions(+), 4 deletions(-) diff --git a/src/vs/editor/common/model/pieceTreeTextBuffer/pieceTreeTextBuffer.ts b/src/vs/editor/common/model/pieceTreeTextBuffer/pieceTreeTextBuffer.ts index 27416907f49..7e5ad2bb133 100644 --- a/src/vs/editor/common/model/pieceTreeTextBuffer/pieceTreeTextBuffer.ts +++ b/src/vs/editor/common/model/pieceTreeTextBuffer/pieceTreeTextBuffer.ts @@ -206,13 +206,17 @@ export class PieceTreeTextBuffer implements ITextBuffer { // Sort operations ascending operations.sort(PieceTreeTextBuffer._sortOpsAscending); + let hasTouchingRanges = false; for (let i = 0, count = operations.length - 1; i < count; i++) { let rangeEnd = operations[i].range.getEndPosition(); let nextRangeStart = operations[i + 1].range.getStartPosition(); - if (nextRangeStart.isBefore(rangeEnd)) { - // overlapping ranges - throw new Error('Overlapping ranges are not allowed!'); + if (nextRangeStart.isBeforeOrEqual(rangeEnd)) { + if (nextRangeStart.isBefore(rangeEnd)) { + // overlapping ranges + throw new Error('Overlapping ranges are not allowed!'); + } + hasTouchingRanges = true; } } @@ -256,7 +260,11 @@ export class PieceTreeTextBuffer implements ITextBuffer { forceMoveMarkers: op.forceMoveMarkers }; } - reverseOperations.sort((a, b) => a.sortIndex - b.sortIndex); + + // Can only sort reverse operations when the order is not significant + if (!hasTouchingRanges) { + reverseOperations.sort((a, b) => a.sortIndex - b.sortIndex); + } this._mightContainRTL = mightContainRTL; this._mightContainNonBasicASCII = mightContainNonBasicASCII; diff --git a/src/vs/editor/test/common/model/editableTextModel.test.ts b/src/vs/editor/test/common/model/editableTextModel.test.ts index fa41d0d5f49..480fdc82c47 100644 --- a/src/vs/editor/test/common/model/editableTextModel.test.ts +++ b/src/vs/editor/test/common/model/editableTextModel.test.ts @@ -1091,4 +1091,26 @@ suite('EditorModel - EditableTextModel.applyEdits', () => { model.dispose(); }); + + test('issue #48741: Broken undo stack with move lines up with multiple cursors', () => { + let model = createEditableTextModelFromString([ + 'line1', + 'line2', + 'line3', + '', + ].join('\n')); + + const undoEdits = model.applyEdits([ + { range: new Range(4, 1, 4, 1), text: 'line3', }, + { range: new Range(3, 1, 3, 6), text: null, }, + { range: new Range(2, 1, 3, 1), text: null, }, + { range: new Range(3, 6, 3, 6), text: '\nline2' } + ]); + + model.applyEdits(undoEdits); + + assert.deepEqual(model.getValue(), 'line1\nline2\nline3\n'); + + model.dispose(); + }); }); From 40515c5aa0de550a187ba7621d3a905c62b096eb Mon Sep 17 00:00:00 2001 From: Erich Gamma Date: Thu, 26 Apr 2018 12:58:16 +0200 Subject: [PATCH 119/830] fixing #48590 use task API to fetch tasks --- extensions/npm/src/main.ts | 15 +++++++-------- extensions/npm/src/npmView.ts | 8 +++----- 2 files changed, 10 insertions(+), 13 deletions(-) diff --git a/extensions/npm/src/main.ts b/extensions/npm/src/main.ts index d1331783c55..d3ebc055c7d 100644 --- a/extensions/npm/src/main.ts +++ b/extensions/npm/src/main.ts @@ -14,13 +14,14 @@ import { provideNpmScripts, hasNpmScripts, explorerIsEnabled } from './tasks'; let taskProvider: vscode.Disposable | undefined; export async function activate(context: vscode.ExtensionContext): Promise { - taskProvider = registerTaskProvider(context); + taskProvider = registerTaskProvider(); + registerExplorer(context); configureHttpRequest(); vscode.workspace.onDidChangeConfiguration(() => configureHttpRequest()); context.subscriptions.push(addJSONProviders(httpRequest.xhr)); } -function registerTaskProvider(context: vscode.ExtensionContext): vscode.Disposable | undefined { +function registerTaskProvider(): vscode.Disposable | undefined { if (vscode.workspace.workspaceFolders) { let provider: vscode.TaskProvider = { provideTasks: () => { @@ -30,16 +31,14 @@ function registerTaskProvider(context: vscode.ExtensionContext): vscode.Disposab return undefined; } }; - let disposable = vscode.workspace.registerTaskProvider('npm', provider); - registerExplorer(context, provider); - return disposable; + return vscode.workspace.registerTaskProvider('npm', provider); } return undefined; } -async function registerExplorer(context: vscode.ExtensionContext, provider: vscode.TaskProvider) { - if (explorerIsEnabled()) { - let treeDataProvider = vscode.window.registerTreeDataProvider('npm', new NpmScriptsTreeDataProvider(context, provider)); +async function registerExplorer(context: vscode.ExtensionContext) { + if (explorerIsEnabled() && vscode.workspace.workspaceFolders) { + let treeDataProvider = vscode.window.registerTreeDataProvider('npm', new NpmScriptsTreeDataProvider(context)); context.subscriptions.push(treeDataProvider); if (await hasNpmScripts()) { vscode.commands.executeCommand('setContext', 'hasNpmScripts', true); diff --git a/extensions/npm/src/npmView.ts b/extensions/npm/src/npmView.ts index 94f9bdbebbc..2eaad7d831a 100644 --- a/extensions/npm/src/npmView.ts +++ b/extensions/npm/src/npmView.ts @@ -6,7 +6,7 @@ import * as path from 'path'; import { - DebugConfiguration, Event, EventEmitter, ExtensionContext, Task, TaskProvider, + DebugConfiguration, Event, EventEmitter, ExtensionContext, Task, TextDocument, ThemeIcon, TreeDataProvider, TreeItem, TreeItemCollapsibleState, Uri, WorkspaceFolder, commands, debug, window, workspace, Selection } from 'vscode'; @@ -92,14 +92,12 @@ class NpmScript extends TreeItem { export class NpmScriptsTreeDataProvider implements TreeDataProvider { private taskTree: Folder[] | PackageJSON[] | null = null; - private taskProvider: TaskProvider; private extensionContext: ExtensionContext; private _onDidChangeTreeData: EventEmitter = new EventEmitter(); readonly onDidChangeTreeData: Event = this._onDidChangeTreeData.event; - constructor(context: ExtensionContext, taskProvider: TaskProvider) { + constructor(context: ExtensionContext) { const subscriptions = context.subscriptions; - this.taskProvider = taskProvider; this.extensionContext = context; subscriptions.push(commands.registerCommand('npm.runScript', this.runScript, this)); subscriptions.push(commands.registerCommand('npm.debugScript', this.debugScript, this)); @@ -265,7 +263,7 @@ export class NpmScriptsTreeDataProvider implements TreeDataProvider { async getChildren(element?: TreeItem): Promise { if (!this.taskTree) { - let tasks = await this.taskProvider.provideTasks(); + let tasks = await workspace.fetchTasks({ type: 'npm' }); if (tasks) { this.taskTree = this.buildTaskTree(tasks); } From 520d075e1325fdb505b15b03cb4a201f46f5c2c9 Mon Sep 17 00:00:00 2001 From: Sandeep Somavarapu Date: Thu, 26 Apr 2018 13:12:17 +0200 Subject: [PATCH 120/830] Log as soon as an entry is called --- src/vs/base/node/zip.ts | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/src/vs/base/node/zip.ts b/src/vs/base/node/zip.ts index cd7ec2c2612..0c034bf2820 100644 --- a/src/vs/base/node/zip.ts +++ b/src/vs/base/node/zip.ts @@ -101,16 +101,16 @@ function extractZip(zipfile: ZipFile, targetPath: string, options: IOptions, log if (isCanceled || zipfile.entryCount === extractedEntriesCount) { c(null); } else { - e(new ExtractError('Incomplete', new Error(nls.localize('incompleteExtract', "Incomplete. Extracted {0} of {1} entries", extractedEntriesCount, zipfile.entryCount)))); + e(new ExtractError('Incomplete', new Error(nls.localize('incompleteExtract', "Incomplete. Found {0} of {1} entries", extractedEntriesCount, zipfile.entryCount)))); } }, e)); zipfile.on('entry', (entry: Entry) => { + logService.debug(targetPath, 'Found', entry.fileName); + if (isCanceled) { return; } - logService.debug(targetPath, 'Extracting', entry.fileName); - if (!options.sourcePathRegex.test(entry.fileName)) { extractedEntriesCount++; return; @@ -131,6 +131,7 @@ function extractZip(zipfile: ZipFile, targetPath: string, options: IOptions, log last = throttler.queue(() => stream.then(stream => extractEntry(stream, fileName, mode, targetPath, options).then(() => extractedEntriesCount++))); }); }, () => { + logService.debug(targetPath, 'Cancelled.'); isCanceled = true; last.cancel(); zipfile.close(); From 2ed98bf4399dd7b41bae95c8637679ede18619f1 Mon Sep 17 00:00:00 2001 From: Johannes Rieken Date: Thu, 26 Apr 2018 14:01:39 +0200 Subject: [PATCH 121/830] no implicit stat objects, #48527 --- src/vs/platform/files/common/files.ts | 6 +++--- src/vs/vscode.d.ts | 11 +++++++--- .../electron-browser/mainThreadFileSystem.ts | 6 +++--- src/vs/workbench/api/node/extHost.protocol.ts | 6 +++--- .../workbench/api/node/extHostFileSystem.ts | 20 +++++++++---------- .../electron-browser/remoteFileService.ts | 12 +++++------ 6 files changed, 33 insertions(+), 28 deletions(-) diff --git a/src/vs/platform/files/common/files.ts b/src/vs/platform/files/common/files.ts index c99d1c471d1..efda47d55cf 100644 --- a/src/vs/platform/files/common/files.ts +++ b/src/vs/platform/files/common/files.ts @@ -199,12 +199,12 @@ export interface IFileSystemProvider { watch(resource: URI, opts: IWatchOptions): IDisposable; stat(resource: URI): TPromise; - mkdir(resource: URI): TPromise; + mkdir(resource: URI): TPromise; readdir(resource: URI): TPromise<[string, FileType][]>; delete(resource: URI): TPromise; - rename(from: URI, to: URI, opts: FileOverwriteOptions): TPromise; - copy?(from: URI, to: URI, opts: FileOverwriteOptions): TPromise; + rename(from: URI, to: URI, opts: FileOverwriteOptions): TPromise; + copy?(from: URI, to: URI, opts: FileOverwriteOptions): TPromise; readFile?(resource: URI): TPromise; writeFile?(resource: URI, content: Uint8Array, opts: FileWriteOptions): TPromise; diff --git a/src/vs/vscode.d.ts b/src/vs/vscode.d.ts index 68d3bc42576..373680ad3b8 100644 --- a/src/vs/vscode.d.ts +++ b/src/vs/vscode.d.ts @@ -5005,8 +5005,9 @@ declare module 'vscode' { * @returns Metadata about the created directory or a thenable that resolves to such. * @throws [`FileNotFound`](#FileSystemError.FileNotFound) when the parent of `uri` doesn't exist. * @throws [`FileExists`](#FileSystemError.FileExists) when `uri` already exists. + * @throws [`NoPermissions`](#FileSystemError.NoPermissions) when permissions aren't sufficient. */ - createDirectory(uri: Uri): FileStat | Thenable; + createDirectory(uri: Uri): void | Thenable; /** * Read the entire contents of a file. @@ -5026,6 +5027,7 @@ declare module 'vscode' { * @throws [`FileNotFound`](#FileSystemError.FileNotFound) when `uri` doesn't exist and `create` is not set. * @throws [`FileNotFound`](#FileSystemError.FileNotFound) when the parent of `uri` doesn't exist and `create` is set. * @throws [`FileExists`](#FileSystemError.FileExists) when `uri` already exists and `overwrite` is set. + * @throws [`NoPermissions`](#FileSystemError.NoPermissions) when permissions aren't sufficient. */ writeFile(uri: Uri, content: Uint8Array, options: { create: boolean, overwrite: boolean }): void | Thenable; @@ -5035,6 +5037,7 @@ declare module 'vscode' { * @param uri The resource that is to be deleted. * @param options Defines if deletion of folders is recursive. * @throws [`FileNotFound`](#FileSystemError.FileNotFound) when `uri` doesn't exist. + * @throws [`NoPermissions`](#FileSystemError.NoPermissions) when permissions aren't sufficient. */ delete(uri: Uri, options: { recursive: boolean }): void | Thenable; @@ -5048,8 +5051,9 @@ declare module 'vscode' { * @throws [`FileNotFound`](#FileSystemError.FileNotFound) when `oldUri` doesn't exist. * @throws [`FileNotFound`](#FileSystemError.FileNotFound) when parent of `newUri` doesn't exist * @throws [`FileExists`](#FileSystemError.FileExists) when `newUri` exists and when the `overwrite` option is not `true`. + * @throws [`NoPermissions`](#FileSystemError.NoPermissions) when permissions aren't sufficient. */ - rename(oldUri: Uri, newUri: Uri, options: { overwrite: boolean }): FileStat | Thenable; + rename(oldUri: Uri, newUri: Uri, options: { overwrite: boolean }): void | Thenable; /** * Copy files or folders. Implementing this function is optional but it will speedup @@ -5062,8 +5066,9 @@ declare module 'vscode' { * @throws [`FileNotFound`](#FileSystemError.FileNotFound) when `source` doesn't exist * @throws [`FileNotFound`](#FileSystemError.FileNotFound) when parent of `destination` doesn't exist * @throws [`FileExists`](#FileSystemError.FileExists) when `destination` exists and when the `overwrite` option is not `true`. + * @throws [`NoPermissions`](#FileSystemError.NoPermissions) when permissions aren't sufficient. */ - copy?(source: Uri, destination: Uri, options: { overwrite: boolean }): FileStat | Thenable; + copy?(source: Uri, destination: Uri, options: { overwrite: boolean }): void | Thenable; } /** diff --git a/src/vs/workbench/api/electron-browser/mainThreadFileSystem.ts b/src/vs/workbench/api/electron-browser/mainThreadFileSystem.ts index ed8c02f6975..343051fb7e7 100644 --- a/src/vs/workbench/api/electron-browser/mainThreadFileSystem.ts +++ b/src/vs/workbench/api/electron-browser/mainThreadFileSystem.ts @@ -111,7 +111,7 @@ class RemoteFileSystemProvider implements IFileSystemProvider { return this._proxy.$delete(this._handle, resource); } - mkdir(resource: URI): TPromise { + mkdir(resource: URI): TPromise { return this._proxy.$mkdir(this._handle, resource); } @@ -119,11 +119,11 @@ class RemoteFileSystemProvider implements IFileSystemProvider { return this._proxy.$readdir(this._handle, resource); } - rename(resource: URI, target: URI, opts: FileOverwriteOptions): TPromise { + rename(resource: URI, target: URI, opts: FileOverwriteOptions): TPromise { return this._proxy.$rename(this._handle, resource, target, opts); } - copy(resource: URI, target: URI, opts: FileOverwriteOptions): TPromise { + copy(resource: URI, target: URI, opts: FileOverwriteOptions): TPromise { return this._proxy.$copy(this._handle, resource, target, opts); } } diff --git a/src/vs/workbench/api/node/extHost.protocol.ts b/src/vs/workbench/api/node/extHost.protocol.ts index 8a7ee4a5de7..67ab3eab780 100644 --- a/src/vs/workbench/api/node/extHost.protocol.ts +++ b/src/vs/workbench/api/node/extHost.protocol.ts @@ -585,9 +585,9 @@ export interface ExtHostFileSystemShape { $readdir(handle: number, resource: UriComponents): TPromise<[string, FileType][]>; $readFile(handle: number, resource: UriComponents): TPromise; $writeFile(handle: number, resource: UriComponents, base64Encoded: string, opts: FileWriteOptions): TPromise; - $rename(handle: number, resource: UriComponents, target: UriComponents, opts: FileOverwriteOptions): TPromise; - $copy(handle: number, resource: UriComponents, target: UriComponents, opts: FileOverwriteOptions): TPromise; - $mkdir(handle: number, resource: UriComponents): TPromise; + $rename(handle: number, resource: UriComponents, target: UriComponents, opts: FileOverwriteOptions): TPromise; + $copy(handle: number, resource: UriComponents, target: UriComponents, opts: FileOverwriteOptions): TPromise; + $mkdir(handle: number, resource: UriComponents): TPromise; $delete(handle: number, resource: UriComponents): TPromise; $watch(handle: number, session: number, resource: UriComponents, opts: IWatchOptions): void; $unwatch(handle: number, session: number): void; diff --git a/src/vs/workbench/api/node/extHostFileSystem.ts b/src/vs/workbench/api/node/extHostFileSystem.ts index f46c802aeaa..927ab3d434b 100644 --- a/src/vs/workbench/api/node/extHostFileSystem.ts +++ b/src/vs/workbench/api/node/extHostFileSystem.ts @@ -78,8 +78,8 @@ class FileSystemProviderShim implements vscode.FileSystemProvider { stat(resource: vscode.Uri): Thenable { return this._delegate.stat(resource).then(stat => FileSystemProviderShim._modernizeFileStat(stat)); } - rename(oldUri: vscode.Uri, newUri: vscode.Uri): Thenable { - return this._delegate.move(oldUri, newUri).then(stat => FileSystemProviderShim._modernizeFileStat(stat)); + rename(oldUri: vscode.Uri, newUri: vscode.Uri): Thenable { + return this._delegate.move(oldUri, newUri).then(stat => void 0); } readDirectory(resource: vscode.Uri): Thenable<[string, vscode.FileType][]> { return this._delegate.readdir(resource).then(tuples => { @@ -135,8 +135,8 @@ class FileSystemProviderShim implements vscode.FileSystemProvider { } }); } - createDirectory(resource: vscode.Uri): Thenable { - return this._delegate.mkdir(resource).then(stat => FileSystemProviderShim._modernizeFileStat(stat)); + createDirectory(resource: vscode.Uri): Thenable { + return this._delegate.mkdir(resource).then(stat => void 0); } // --- read/write @@ -272,16 +272,16 @@ export class ExtHostFileSystem implements ExtHostFileSystemShape { return asWinJsPromise(token => this._fsProvider.get(handle).delete(URI.revive(resource), { recursive: true })); } - $rename(handle: number, oldUri: UriComponents, newUri: UriComponents, opts: files.FileOverwriteOptions): TPromise { - return asWinJsPromise(token => this._fsProvider.get(handle).rename(URI.revive(oldUri), URI.revive(newUri), opts)).then(ExtHostFileSystem._asIStat); + $rename(handle: number, oldUri: UriComponents, newUri: UriComponents, opts: files.FileOverwriteOptions): TPromise { + return asWinJsPromise(token => this._fsProvider.get(handle).rename(URI.revive(oldUri), URI.revive(newUri), opts)); } - $copy(handle: number, oldUri: UriComponents, newUri: UriComponents, opts: files.FileOverwriteOptions): TPromise { - return asWinJsPromise(token => this._fsProvider.get(handle).copy(URI.revive(oldUri), URI.revive(newUri), opts)).then(ExtHostFileSystem._asIStat); + $copy(handle: number, oldUri: UriComponents, newUri: UriComponents, opts: files.FileOverwriteOptions): TPromise { + return asWinJsPromise(token => this._fsProvider.get(handle).copy(URI.revive(oldUri), URI.revive(newUri), opts)); } - $mkdir(handle: number, resource: UriComponents): TPromise { - return asWinJsPromise(token => this._fsProvider.get(handle).createDirectory(URI.revive(resource))).then(ExtHostFileSystem._asIStat); + $mkdir(handle: number, resource: UriComponents): TPromise { + return asWinJsPromise(token => this._fsProvider.get(handle).createDirectory(URI.revive(resource))); } $watch(handle: number, session: number, resource: UriComponents, opts: files.IWatchOptions): void { diff --git a/src/vs/workbench/services/files/electron-browser/remoteFileService.ts b/src/vs/workbench/services/files/electron-browser/remoteFileService.ts index c62b811e0e9..1ecbe48e43f 100644 --- a/src/vs/workbench/services/files/electron-browser/remoteFileService.ts +++ b/src/vs/workbench/services/files/electron-browser/remoteFileService.ts @@ -516,8 +516,8 @@ export class RemoteFileService extends FileService { return super.createFolder(resource); } else { return this._withProvider(resource).then(provider => { - return provider.mkdir(resource).then(stat => { - return toIFileStat(provider, [resource, stat]); + return provider.mkdir(resource).then(() => { + return this.resolveFile(resource); }); }).then(fileStat => { this._onAfterOperation.fire(new FileOperationEvent(resource, FileOperation.CREATE, fileStat)); @@ -552,8 +552,8 @@ export class RemoteFileService extends FileService { : TPromise.as(null); return prepare.then(() => this._withProvider(source)).then(provider => { - return provider.rename(source, target, { overwrite }).then(stat => { - return toIFileStat(provider, [target, stat]); + return provider.rename(source, target, { overwrite }).then(() => { + return this.resolveFile(target); }).then(fileStat => { this._onAfterOperation.fire(new FileOperationEvent(source, FileOperation.MOVE, fileStat)); return fileStat; @@ -587,8 +587,8 @@ export class RemoteFileService extends FileService { if (source.scheme === target.scheme && (provider.capabilities & FileSystemProviderCapabilities.FileFolderCopy)) { // good: provider supports copy withing scheme - return provider.copy(source, target, { overwrite }).then(stat => { - return toIFileStat(provider, [target, stat]); + return provider.copy(source, target, { overwrite }).then(() => { + return this.resolveFile(target); }).then(fileStat => { this._onAfterOperation.fire(new FileOperationEvent(source, FileOperation.COPY, fileStat)); return fileStat; From 8010415c7567b00d69d271a675272ca30a4b8a80 Mon Sep 17 00:00:00 2001 From: isidor Date: Thu, 26 Apr 2018 14:20:43 +0200 Subject: [PATCH 122/830] paths: fix dirname for paths that end in slash. Explorer model fix find for paths ending with extra slashes fixes microsoft/vscode-cascade#57 --- src/vs/base/common/paths.ts | 4 +++- src/vs/base/test/common/paths.test.ts | 3 ++- src/vs/workbench/parts/files/common/explorerModel.ts | 7 ++----- .../files/test/electron-browser/explorerModel.test.ts | 1 + 4 files changed, 8 insertions(+), 7 deletions(-) diff --git a/src/vs/base/common/paths.ts b/src/vs/base/common/paths.ts index 70c4b3ae231..b8a144fd5ec 100644 --- a/src/vs/base/common/paths.ts +++ b/src/vs/base/common/paths.ts @@ -27,6 +27,8 @@ export function dirname(path: string): string { return '.'; } else if (~idx === 0) { return path[0]; + } else if (~idx === path.length - 1) { + return dirname(path.substring(0, path.length - 1)); } else { let res = path.substring(0, ~idx); if (isWindows && res[res.length - 1] === ':') { @@ -395,4 +397,4 @@ export function isAbsolute_win32(path: string): boolean { export function isAbsolute_posix(path: string): boolean { return path && path.charCodeAt(0) === CharCode.Slash; -} \ No newline at end of file +} diff --git a/src/vs/base/test/common/paths.test.ts b/src/vs/base/test/common/paths.test.ts index 6001c5b00ba..742bd45e35e 100644 --- a/src/vs/base/test/common/paths.test.ts +++ b/src/vs/base/test/common/paths.test.ts @@ -20,6 +20,7 @@ suite('Paths', () => { assert.equal(paths.dirname('/'), '/'); assert.equal(paths.dirname('\\'), '\\'); assert.equal(paths.dirname('foo'), '.'); + assert.equal(paths.dirname('/folder/'), '/'); if (platform.isWindows) { assert.equal(paths.dirname('c:\\some\\file.txt'), 'c:\\some'); assert.equal(paths.dirname('c:\\some'), 'c:\\'); @@ -226,4 +227,4 @@ suite('Paths', () => { assert.ok(!paths.isAbsolute_posix(nonAbsolutePath), nonAbsolutePath); }); }); -}); \ No newline at end of file +}); diff --git a/src/vs/workbench/parts/files/common/explorerModel.ts b/src/vs/workbench/parts/files/common/explorerModel.ts index afcf1bbefb3..9a563a2af48 100644 --- a/src/vs/workbench/parts/files/common/explorerModel.ts +++ b/src/vs/workbench/parts/files/common/explorerModel.ts @@ -17,7 +17,7 @@ import { IEditorGroup, toResource, IEditorIdentifier } from 'vs/workbench/common import { IDisposable, dispose } from 'vs/base/common/lifecycle'; import { getPathLabel } from 'vs/base/common/labels'; import { Schemas } from 'vs/base/common/network'; -import { startsWith, startsWithIgnoreCase, equalsIgnoreCase } from 'vs/base/common/strings'; +import { startsWith, startsWithIgnoreCase, equalsIgnoreCase, rtrim } from 'vs/base/common/strings'; export class Model { @@ -345,10 +345,7 @@ export class ExplorerItem { } private findByPath(path: string, index: number): ExplorerItem { - if (this.resource.path === path) { - return this; - } - if (!isLinux && equalsIgnoreCase(this.resource.path, path)) { + if (paths.isEqual(rtrim(this.resource.path, paths.sep), rtrim(path, paths.sep), !isLinux)) { return this; } diff --git a/src/vs/workbench/parts/files/test/electron-browser/explorerModel.test.ts b/src/vs/workbench/parts/files/test/electron-browser/explorerModel.test.ts index 10791cfd06d..d072bc62b58 100644 --- a/src/vs/workbench/parts/files/test/electron-browser/explorerModel.test.ts +++ b/src/vs/workbench/parts/files/test/electron-browser/explorerModel.test.ts @@ -156,6 +156,7 @@ suite('Files - View Model', () => { assert.strictEqual(s1.find(toResource('foobar')), null); assert.strictEqual(s1.find(toResource('/')), s1); + assert.strictEqual(s1.find(toResource('')), s1); }); test('Find with mixed case', function () { From bd4cb40bd4959c7c7674aab14fd26efa4ca8e913 Mon Sep 17 00:00:00 2001 From: isidor Date: Thu, 26 Apr 2018 14:34:44 +0200 Subject: [PATCH 123/830] explorer model: rtrim a bit less --- src/vs/workbench/parts/files/common/explorerModel.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/vs/workbench/parts/files/common/explorerModel.ts b/src/vs/workbench/parts/files/common/explorerModel.ts index 9a563a2af48..41c4d2fba29 100644 --- a/src/vs/workbench/parts/files/common/explorerModel.ts +++ b/src/vs/workbench/parts/files/common/explorerModel.ts @@ -338,14 +338,14 @@ export class ExplorerItem { if (resource && this.resource.scheme === resource.scheme && this.resource.authority === resource.authority && (isLinux ? startsWith(resource.path, this.resource.path) : startsWithIgnoreCase(resource.path, this.resource.path)) ) { - return this.findByPath(resource.path, this.resource.path.length); + return this.findByPath(rtrim(resource.path, paths.nativeSep), this.resource.path.length); } return null; //Unable to find } private findByPath(path: string, index: number): ExplorerItem { - if (paths.isEqual(rtrim(this.resource.path, paths.sep), rtrim(path, paths.sep), !isLinux)) { + if (paths.isEqual(rtrim(this.resource.path, paths.sep), path, !isLinux)) { return this; } From 8c1cc70d5db085045eb42b84bc10e77d2b862f77 Mon Sep 17 00:00:00 2001 From: isidor Date: Thu, 26 Apr 2018 14:35:33 +0200 Subject: [PATCH 124/830] fix errors --- src/vs/workbench/parts/files/common/explorerModel.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/vs/workbench/parts/files/common/explorerModel.ts b/src/vs/workbench/parts/files/common/explorerModel.ts index 41c4d2fba29..15eb534b531 100644 --- a/src/vs/workbench/parts/files/common/explorerModel.ts +++ b/src/vs/workbench/parts/files/common/explorerModel.ts @@ -17,7 +17,7 @@ import { IEditorGroup, toResource, IEditorIdentifier } from 'vs/workbench/common import { IDisposable, dispose } from 'vs/base/common/lifecycle'; import { getPathLabel } from 'vs/base/common/labels'; import { Schemas } from 'vs/base/common/network'; -import { startsWith, startsWithIgnoreCase, equalsIgnoreCase, rtrim } from 'vs/base/common/strings'; +import { startsWith, startsWithIgnoreCase, rtrim } from 'vs/base/common/strings'; export class Model { From 594b8b8debc41caed0fb9a07a2c43dff7ceef2fd Mon Sep 17 00:00:00 2001 From: Benjamin Pasero Date: Thu, 26 Apr 2018 14:42:14 +0200 Subject: [PATCH 125/830] workaround #47883 --- src/vs/platform/log/common/log.ts | 25 +++++++++++++++++++ src/vs/platform/log/node/spdlogService.ts | 12 ++++++++- .../output/electron-browser/outputServices.ts | 8 +++--- 3 files changed, 40 insertions(+), 5 deletions(-) diff --git a/src/vs/platform/log/common/log.ts b/src/vs/platform/log/common/log.ts index e657e282ebb..a39d5b61827 100644 --- a/src/vs/platform/log/common/log.ts +++ b/src/vs/platform/log/common/log.ts @@ -300,6 +300,31 @@ export class NullLogService implements ILogService { dispose(): void { } } +export interface IOutputWriter { + trace(message: string): void; + debug(message: string): void; + info(message: string): void; + warn(message: string): void; + error(message: string): void; + critical(message: string): void; + setLevel(level: number): void; + clearFormatters(): void; + flush(): void; + drop(): void; +} + +export class NullOutputWriter implements IOutputWriter { + trace(message: string): void { } + debug(message: string): void { } + info(message: string): void { } + warn(message: string): void { } + error(message: string): void { } + critical(message: string): void { } + setLevel(level: number): void { } + clearFormatters(): void { } + flush(): void { } + drop(): void { } +} export function getLogLevel(environmentService: IEnvironmentService): LogLevel { if (environmentService.verbose) { diff --git a/src/vs/platform/log/node/spdlogService.ts b/src/vs/platform/log/node/spdlogService.ts index 5d579767204..49ec67792b0 100644 --- a/src/vs/platform/log/node/spdlogService.ts +++ b/src/vs/platform/log/node/spdlogService.ts @@ -6,7 +6,7 @@ 'use strict'; import * as path from 'path'; -import { ILogService, LogLevel, NullLogService, AbstractLogService } from 'vs/platform/log/common/log'; +import { ILogService, LogLevel, NullLogService, AbstractLogService, NullOutputWriter, IOutputWriter } from 'vs/platform/log/common/log'; import * as spdlog from 'spdlog'; export function createSpdLogService(processName: string, logLevel: LogLevel, logsFolder: string): ILogService { @@ -25,6 +25,16 @@ export function createSpdLogService(processName: string, logLevel: LogLevel, log return new NullLogService(); } +export function createSpdLogOutputWriter(name: string, filename: string, filesize: number, filecount: number): IOutputWriter { + // Do not crash if spdlog rotating logger cannot be loaded (workaround for https://github.com/Microsoft/vscode/issues/47883) + try { + return new spdlog.RotatingLogger(name, filename, filesize, filecount); + } catch (e) { + console.error(e); + } + return new NullOutputWriter(); +} + class SpdLogService extends AbstractLogService implements ILogService { _serviceBrand: any; diff --git a/src/vs/workbench/parts/output/electron-browser/outputServices.ts b/src/vs/workbench/parts/output/electron-browser/outputServices.ts index aac872844cb..11579a7d8bb 100644 --- a/src/vs/workbench/parts/output/electron-browser/outputServices.ts +++ b/src/vs/workbench/parts/output/electron-browser/outputServices.ts @@ -31,13 +31,13 @@ import { IFileService } from 'vs/platform/files/common/files'; import { IPanel } from 'vs/workbench/common/panel'; import { ResourceEditorInput } from 'vs/workbench/common/editor/resourceEditorInput'; import { IEnvironmentService } from 'vs/platform/environment/common/environment'; -import { RotatingLogger } from 'spdlog'; import { toLocalISOString } from 'vs/base/common/date'; import { IWindowService } from 'vs/platform/windows/common/windows'; -import { ILogService } from 'vs/platform/log/common/log'; +import { ILogService, IOutputWriter } from 'vs/platform/log/common/log'; import { Schemas } from 'vs/base/common/network'; import { ILifecycleService } from 'vs/platform/lifecycle/common/lifecycle'; import { IContextKeyService } from 'vs/platform/contextkey/common/contextkey'; +import { createSpdLogOutputWriter } from 'vs/platform/log/node/spdlogService'; const OUTPUT_ACTIVE_CHANNEL_KEY = 'output.activechannel'; @@ -201,7 +201,7 @@ abstract class AbstractFileOutputChannel extends Disposable { */ class OutputChannelBackedByFile extends AbstractFileOutputChannel implements OutputChannel { - private outputWriter: RotatingLogger; + private outputWriter: IOutputWriter; private appendedMessage = ''; private loadingFromFileInProgress: boolean = false; private resettingDelayer: ThrottledDelayer; @@ -219,7 +219,7 @@ class OutputChannelBackedByFile extends AbstractFileOutputChannel implements Out super({ ...outputChannelIdentifier, file: URI.file(paths.join(outputDir, `${outputChannelIdentifier.id}.log`)) }, modelUri, OUTPUT_MIME, fileService, modelService, modeService); // Use one rotating file to check for main file reset - this.outputWriter = new RotatingLogger(this.id, this.file.fsPath, 1024 * 1024 * 30, 1); + this.outputWriter = createSpdLogOutputWriter(this.id, this.file.fsPath, 1024 * 1024 * 30, 1); this.outputWriter.clearFormatters(); this.rotatingFilePath = `${outputChannelIdentifier.id}.1.log`; this._register(watchOutputDirectory(paths.dirname(this.file.fsPath), logService, (eventType, file) => this.onFileChangedInOutputDirector(eventType, file))); From 84238e7932cbfc4278e34f76d24489a9ba2e2d6d Mon Sep 17 00:00:00 2001 From: Johannes Rieken Date: Thu, 26 Apr 2018 14:45:24 +0200 Subject: [PATCH 126/830] fix mkdirp and use it more, #48527 --- .../electron-browser/remoteFileService.ts | 68 ++++++++++--------- 1 file changed, 36 insertions(+), 32 deletions(-) diff --git a/src/vs/workbench/services/files/electron-browser/remoteFileService.ts b/src/vs/workbench/services/files/electron-browser/remoteFileService.ts index 1ecbe48e43f..ee79fee02c7 100644 --- a/src/vs/workbench/services/files/electron-browser/remoteFileService.ts +++ b/src/vs/workbench/services/files/electron-browser/remoteFileService.ts @@ -412,14 +412,38 @@ export class RemoteFileService extends FileService { // --- saving + private static async _mkdirp(provider: IFileSystemProvider, directory: URI): Promise { + + let basenames: string[] = []; + while (directory.path !== '/') { + try { + let stat = await provider.stat(directory); + if ((stat.type & FileType.Directory) === 0) { + throw new Error(`${directory.toString()} is not a directory`); + } + break; // we have hit a directory -> good + } catch (e) { + // ENOENT + basenames.push(posix.basename(directory.path)); + directory = directory.with({ path: posix.dirname(directory.path) }); + } + } + for (let i = basenames.length - 1; i >= 0; i--) { + directory = directory.with({ path: posix.join(directory.path, basenames[i]) }); + await provider.mkdir(directory); + } + } + createFile(resource: URI, content?: string, options?: ICreateFileOptions): TPromise { if (resource.scheme === Schemas.file) { return super.createFile(resource, content, options); } else { - return this._withProvider(resource).then(provider => { - const encoding = this.encoding.getWriteEncoding(resource); - return this._writeFile(provider, resource, new StringSnapshot(content), encoding, { create: true, overwrite: Boolean(options && options.overwrite) }); + return this._withProvider(resource).then(provider => { + return RemoteFileService._mkdirp(provider, resource.with({ path: posix.dirname(resource.path) })).then(() => { + const encoding = this.encoding.getWriteEncoding(resource); + return this._writeFile(provider, resource, new StringSnapshot(content), encoding, { create: true, overwrite: Boolean(options && options.overwrite) }); + }); }).then(fileStat => { this._onAfterOperation.fire(new FileOperationEvent(resource, FileOperation.CREATE, fileStat)); @@ -432,16 +456,15 @@ export class RemoteFileService extends FileService { } } - async updateContent(resource: URI, value: string | ITextSnapshot, options?: IUpdateContentOptions): TPromise { + updateContent(resource: URI, value: string | ITextSnapshot, options?: IUpdateContentOptions): TPromise { if (resource.scheme === Schemas.file) { return super.updateContent(resource, value, options); } else { - if (options && options.mkdirp) { - await this._mkdirp(resource.with({ path: posix.dirname(resource.path) })); - } return this._withProvider(resource).then(provider => { - const snapshot = typeof value === 'string' ? new StringSnapshot(value) : value; - return this._writeFile(provider, resource, snapshot, options && options.encoding, { create: false, overwrite: false }); + return RemoteFileService._mkdirp(provider, resource.with({ path: posix.dirname(resource.path) })).then(() => { + const snapshot = typeof value === 'string' ? new StringSnapshot(value) : value; + return this._writeFile(provider, resource, snapshot, options && options.encoding, { create: true, overwrite: true }); + }); }); } } @@ -476,27 +499,6 @@ export class RemoteFileService extends FileService { }); } - private async _mkdirp(directory: URI): Promise { - let basenames: string[] = []; - while (directory.path !== '/') { - try { - let stat = await this.resolveFile(directory); - if (!stat.isDirectory) { - throw new Error(`${directory.toString()} is not a directory`); - } - } catch (e) { - // ENOENT - basenames.push(posix.basename(directory.path)); - directory = directory.with({ path: posix.dirname(directory.path) }); - } - break; - } - for (let i = basenames.length - 1; i >= 0; i--) { - directory = directory.with({ path: posix.join(directory.path, basenames[i]) }); - await this.createFolder(directory); - } - } - // --- delete del(resource: URI, useTrash?: boolean): TPromise { @@ -516,8 +518,10 @@ export class RemoteFileService extends FileService { return super.createFolder(resource); } else { return this._withProvider(resource).then(provider => { - return provider.mkdir(resource).then(() => { - return this.resolveFile(resource); + return RemoteFileService._mkdirp(provider, resource.with({ path: posix.dirname(resource.path) })).then(() => { + return provider.mkdir(resource).then(() => { + return this.resolveFile(resource); + }); }); }).then(fileStat => { this._onAfterOperation.fire(new FileOperationEvent(resource, FileOperation.CREATE, fileStat)); From 72b51f3aea49ff1018e1c301d6e253a819d12f8b Mon Sep 17 00:00:00 2001 From: Johannes Rieken Date: Thu, 26 Apr 2018 14:51:14 +0200 Subject: [PATCH 127/830] jsdoc fixes, #48527 --- src/vs/vscode.d.ts | 3 --- 1 file changed, 3 deletions(-) diff --git a/src/vs/vscode.d.ts b/src/vs/vscode.d.ts index 373680ad3b8..c419713c90a 100644 --- a/src/vs/vscode.d.ts +++ b/src/vs/vscode.d.ts @@ -5002,7 +5002,6 @@ declare module 'vscode' { * Create a new directory. *Note* that new files are created via `write`-calls. * * @param uri The uri of the new folder. - * @returns Metadata about the created directory or a thenable that resolves to such. * @throws [`FileNotFound`](#FileSystemError.FileNotFound) when the parent of `uri` doesn't exist. * @throws [`FileExists`](#FileSystemError.FileExists) when `uri` already exists. * @throws [`NoPermissions`](#FileSystemError.NoPermissions) when permissions aren't sufficient. @@ -5047,7 +5046,6 @@ declare module 'vscode' { * @param oldUri The existing file or folder. * @param newUri The target location. * @param options Defines if existing files should be overwriten. - * @returns Metadata about the renamed file or a thenable that resolves to such. * @throws [`FileNotFound`](#FileSystemError.FileNotFound) when `oldUri` doesn't exist. * @throws [`FileNotFound`](#FileSystemError.FileNotFound) when parent of `newUri` doesn't exist * @throws [`FileExists`](#FileSystemError.FileExists) when `newUri` exists and when the `overwrite` option is not `true`. @@ -5062,7 +5060,6 @@ declare module 'vscode' { * @param source The existing file or folder. * @param destination The destination location. * @param options Defines if existing files should be overwriten. - * @returns Metadata about the copied file or a thenable that resolves to such. * @throws [`FileNotFound`](#FileSystemError.FileNotFound) when `source` doesn't exist * @throws [`FileNotFound`](#FileSystemError.FileNotFound) when parent of `destination` doesn't exist * @throws [`FileExists`](#FileSystemError.FileExists) when `destination` exists and when the `overwrite` option is not `true`. From a4dec1a6028e7ce09cc069fe332cd6befb5dc335 Mon Sep 17 00:00:00 2001 From: isidor Date: Thu, 26 Apr 2018 14:53:58 +0200 Subject: [PATCH 128/830] Address pr feedback --- src/vs/workbench/parts/debug/common/debug.ts | 2 +- .../electron-browser/debug.contribution.ts | 6 ++-- .../debugEditorContribution.ts | 30 ++++++++++++------- 3 files changed, 23 insertions(+), 15 deletions(-) diff --git a/src/vs/workbench/parts/debug/common/debug.ts b/src/vs/workbench/parts/debug/common/debug.ts index ad601775749..d3c699c7c20 100644 --- a/src/vs/workbench/parts/debug/common/debug.ts +++ b/src/vs/workbench/parts/debug/common/debug.ts @@ -351,7 +351,7 @@ export interface IDebugConfiguration { showInStatusBar: 'never' | 'always' | 'onFirstSessionStart'; internalConsoleOptions: 'neverOpen' | 'openOnSessionStart' | 'openOnFirstSessionStart'; extensionHostDebugAdapter: boolean; - hideNonDebugHovers: boolean; + enableAllHovers: boolean; } export interface IGlobalConfig { diff --git a/src/vs/workbench/parts/debug/electron-browser/debug.contribution.ts b/src/vs/workbench/parts/debug/electron-browser/debug.contribution.ts index 46621dd5473..7e525d1ba3a 100644 --- a/src/vs/workbench/parts/debug/electron-browser/debug.contribution.ts +++ b/src/vs/workbench/parts/debug/electron-browser/debug.contribution.ts @@ -205,10 +205,10 @@ configurationRegistry.registerConfiguration({ default: 'openOnFirstSessionStart', description: nls.localize('openDebug', "Controls whether debug view should be open on debugging session start.") }, - 'debug.hideNonDebugHovers': { + 'debug.enableAllHovers': { type: 'boolean', - description: nls.localize({ comment: ['This is the description for a setting'], key: 'hideNonDebugHovers' }, "Controls if the non debug hovers should be hidden while debugging. If false the hover providers will be called to provide a hover. Regular hovers will not be shown even if this setting is false."), - default: true + description: nls.localize({ comment: ['This is the description for a setting'], key: 'enableAllHovers' }, "Controls if the non debug hovers should be enabled while debugging. If true the hover providers will be called to provide a hover. Regular hovers will not be shown even if this setting is true."), + default: false }, 'launch': { type: 'object', diff --git a/src/vs/workbench/parts/debug/electron-browser/debugEditorContribution.ts b/src/vs/workbench/parts/debug/electron-browser/debugEditorContribution.ts index cb7c178fa10..4605fadbd7b 100644 --- a/src/vs/workbench/parts/debug/electron-browser/debugEditorContribution.ts +++ b/src/vs/workbench/parts/debug/electron-browser/debugEditorContribution.ts @@ -6,7 +6,7 @@ import * as nls from 'vs/nls'; import * as errors from 'vs/base/common/errors'; import { TPromise } from 'vs/base/common/winjs.base'; -import { RunOnceScheduler, asWinJsPromise } from 'vs/base/common/async'; +import { RunOnceScheduler } from 'vs/base/common/async'; import * as lifecycle from 'vs/base/common/lifecycle'; import * as env from 'vs/base/common/platform'; import uri from 'vs/base/common/uri'; @@ -16,7 +16,7 @@ import { Constants } from 'vs/editor/common/core/uint'; import { IAction, Action } from 'vs/base/common/actions'; import { KeyCode } from 'vs/base/common/keyCodes'; import { IKeyboardEvent } from 'vs/base/browser/keyboardEvent'; -import { StandardTokenType, HoverProviderRegistry } from 'vs/editor/common/modes'; +import { StandardTokenType } from 'vs/editor/common/modes'; import { DEFAULT_WORD_REGEXP } from 'vs/editor/common/model/wordHelper'; import { ICodeEditor, IEditorMouseEvent, MouseTargetType } from 'vs/editor/browser/editorBrowser'; import { registerEditorContribution } from 'vs/editor/browser/editorExtensions'; @@ -45,6 +45,7 @@ import { IKeybindingService } from 'vs/platform/keybinding/common/keybinding'; import { ContextSubMenu } from 'vs/base/browser/contextmenu'; import { memoize } from 'vs/base/common/decorators'; import { IDialogService } from 'vs/platform/dialogs/common/dialogs'; +import { getHover } from 'vs/editor/contrib/hover/getHover'; const HOVER_DELAY = 300; const LAUNCH_JSON_REGEX = /launch\.json$/; @@ -240,6 +241,7 @@ export class DebugEditorContribution implements IDebugEditorContribution { this.toDispose.push(this.editor.onMouseDown((e: IEditorMouseEvent) => this.onEditorMouseDown(e))); this.toDispose.push(this.editor.onMouseMove((e: IEditorMouseEvent) => this.onEditorMouseMove(e))); this.toDispose.push(this.editor.onMouseLeave((e: IEditorMouseEvent) => { + this.provideNonDebugHoverScheduler.cancel(); const hoverDomNode = this.hoverWidget.getDomNode(); if (!hoverDomNode) { return; @@ -333,23 +335,28 @@ export class DebugEditorContribution implements IDebugEditorContribution { @memoize private get showHoverScheduler(): RunOnceScheduler { - return new RunOnceScheduler(() => this.showHover(this.hoverRange, false), HOVER_DELAY); + const scheduler = new RunOnceScheduler(() => this.showHover(this.hoverRange, false), HOVER_DELAY); + this.toDispose.push(scheduler); + + return scheduler; } @memoize private get hideHoverScheduler(): RunOnceScheduler { - return new RunOnceScheduler(() => this.hoverWidget.hide(), HOVER_DELAY); + const scheduler = new RunOnceScheduler(() => this.hoverWidget.hide(), HOVER_DELAY); + this.toDispose.push(scheduler); + + return scheduler; } @memoize private get provideNonDebugHoverScheduler(): RunOnceScheduler { - return new RunOnceScheduler(() => { - const model = this.editor.getModel(); - const supports = HoverProviderRegistry.ordered(model); - TPromise.join(supports.map(s => - asWinJsPromise(token => s.provideHover(model, this.nonDebugHoverPosition, token))) - ).done(undefined, errors.onUnexpectedError); + const scheduler = new RunOnceScheduler(() => { + getHover(this.editor.getModel(), this.nonDebugHoverPosition); }, HOVER_DELAY); + this.toDispose.push(scheduler); + + return scheduler; } private hideHoverWidget(): void { @@ -357,6 +364,7 @@ export class DebugEditorContribution implements IDebugEditorContribution { this.hideHoverScheduler.schedule(); } this.showHoverScheduler.cancel(); + this.provideNonDebugHoverScheduler.cancel(); } // hover business @@ -374,7 +382,7 @@ export class DebugEditorContribution implements IDebugEditorContribution { return; } - if (!this.configurationService.getValue('debug').hideNonDebugHovers) { + if (!this.configurationService.getValue('debug').enableAllHovers) { this.nonDebugHoverPosition = mouseEvent.target.position; this.provideNonDebugHoverScheduler.schedule(); } From 4b8ead0caec3b51fbfa2c620c70b3e7ab2057727 Mon Sep 17 00:00:00 2001 From: Joao Moreno Date: Thu, 26 Apr 2018 15:21:54 +0200 Subject: [PATCH 129/830] call url handler even when all windows are closed fixes #48532 --- src/vs/code/electron-main/app.ts | 21 +++++++++- .../url/electron-main/electronUrlListener.ts | 38 +++++-------------- src/vs/platform/windows/common/windows.ts | 6 +-- .../windows/electron-main/windowsService.ts | 12 ++++-- 4 files changed, 41 insertions(+), 36 deletions(-) diff --git a/src/vs/code/electron-main/app.ts b/src/vs/code/electron-main/app.ts index 7ea899cd82d..60c8b78835b 100644 --- a/src/vs/code/electron-main/app.ts +++ b/src/vs/code/electron-main/app.ts @@ -396,7 +396,7 @@ export class CodeApplication { this.lifecycleService.ready(); // Propagate to clients - this.windowsMainService = accessor.get(IWindowsMainService); // TODO@Joao: unfold this + const windowsMainService = this.windowsMainService = accessor.get(IWindowsMainService); // TODO@Joao: unfold this const args = this.environmentService.args; @@ -405,6 +405,25 @@ export class CodeApplication { const urlHandlerChannel = this.electronIpcServer.getChannel('urlHandler', { route: () => activeWindowManager.activeClientId }); const multiplexURLHandler = new URLHandlerChannelClient(urlHandlerChannel); + // On Mac, Code can be running without any open windows, so we must create a window to handle urls, + // if there is none + if (platform.isMacintosh) { + const environmentService = accessor.get(IEnvironmentService); + + urlService.registerHandler({ + async handleURL(uri: URI): TPromise { + if (windowsMainService.getWindowCount() === 0) { + const cli = { ...environmentService.args, goto: true }; + const [window] = windowsMainService.open({ context: OpenContext.API, cli, forceEmpty: true }); + + return window.ready().then(() => urlService.open(uri)); + } + + return false; + } + }); + } + // Register the multiple URL handker urlService.registerHandler(multiplexURLHandler); diff --git a/src/vs/platform/url/electron-main/electronUrlListener.ts b/src/vs/platform/url/electron-main/electronUrlListener.ts index d228fdc23ef..b3b0fdf8bd1 100644 --- a/src/vs/platform/url/electron-main/electronUrlListener.ts +++ b/src/vs/platform/url/electron-main/electronUrlListener.ts @@ -5,7 +5,7 @@ 'use strict'; -import { mapEvent, fromNodeEventEmitter, filterEvent } from 'vs/base/common/event'; +import { mapEvent, fromNodeEventEmitter, filterEvent, once } from 'vs/base/common/event'; import { IURLService } from 'vs/platform/url/common/url'; import product from 'vs/platform/node/product'; import { app } from 'electron'; @@ -24,13 +24,12 @@ function uriFromRawUrl(url: string): URI | null { export class ElectronURLListener { - private buffer: URI[] = []; private disposables: IDisposable[] = []; constructor( initial: string | string[], @IURLService private urlService: IURLService, - @IWindowsMainService private windowsService: IWindowsMainService + @IWindowsMainService windowsService: IWindowsMainService ) { const globalBuffer = ((global).getOpenUrls() || []) as string[]; const rawBuffer = [ @@ -38,7 +37,8 @@ export class ElectronURLListener { ...globalBuffer ]; - this.buffer = rawBuffer.map(uriFromRawUrl).filter(uri => !!uri); + const buffer = rawBuffer.map(uriFromRawUrl).filter(uri => !!uri); + const flush = () => buffer.forEach(uri => urlService.open(uri)); app.setAsDefaultProtocolClient(product.urlProtocol, process.execPath, ['--open-url', '--']); @@ -51,34 +51,16 @@ export class ElectronURLListener { }); const onOpenUrl = filterEvent(mapEvent(onOpenElectronUrl, uriFromRawUrl), uri => !!uri); - onOpenUrl(this.open, this, this.disposables); + onOpenUrl(this.urlService.open, this.urlService, this.disposables); - this.windowsService.onWindowReady(this.flushBuffer, this, this.disposables); - this.flushBuffer(); - } - - private open(uri: URI): void { - const shouldBuffer = this.windowsService.getWindows() + const isWindowReady = windowsService.getWindows() .filter(w => w.readyState === ReadyState.READY) - .length === 0; + .length > 0; - if (shouldBuffer) { - this.buffer.push(uri); + if (isWindowReady) { + flush(); } else { - this.urlService.open(uri).then(handled => { - if (!handled) { - this.buffer.push(uri); - } - }); - } - } - - private flushBuffer(): void { - const buffer = this.buffer; - this.buffer = []; - - for (const uri of buffer) { - this.open(uri); + once(windowsService.onWindowReady)(flush); } } diff --git a/src/vs/platform/windows/common/windows.ts b/src/vs/platform/windows/common/windows.ts index 5df0fccaa20..fea8cb45f4f 100644 --- a/src/vs/platform/windows/common/windows.ts +++ b/src/vs/platform/windows/common/windows.ts @@ -7,7 +7,7 @@ import { TPromise } from 'vs/base/common/winjs.base'; import { createDecorator } from 'vs/platform/instantiation/common/instantiation'; -import { Event } from 'vs/base/common/event'; +import { Event, latch, anyEvent } from 'vs/base/common/event'; import { ITelemetryData } from 'vs/platform/telemetry/common/telemetry'; import { IProcessEnvironment } from 'vs/base/common/platform'; import { ParsedArgs } from 'vs/platform/environment/common/environment'; @@ -343,8 +343,8 @@ export class ActiveWindowManager implements IDisposable { private _activeWindowId: number; constructor(@IWindowsService windowsService: IWindowsService) { - windowsService.onWindowOpen(this.setActiveWindow, this, this.disposables); - windowsService.onWindowFocus(this.setActiveWindow, this, this.disposables); + const onActiveWindowChange = latch(anyEvent(windowsService.onWindowOpen, windowsService.onWindowFocus)); + onActiveWindowChange(this.setActiveWindow, this, this.disposables); } private setActiveWindow(windowId: number) { diff --git a/src/vs/platform/windows/electron-main/windowsService.ts b/src/vs/platform/windows/electron-main/windowsService.ts index 235d5999406..e8587efa62f 100644 --- a/src/vs/platform/windows/electron-main/windowsService.ts +++ b/src/vs/platform/windows/electron-main/windowsService.ts @@ -14,7 +14,7 @@ import product from 'vs/platform/node/product'; import { IWindowsService, OpenContext, INativeOpenDialogOptions, IEnterWorkspaceResult, IMessageBoxResult } from 'vs/platform/windows/common/windows'; import { IEnvironmentService, ParsedArgs } from 'vs/platform/environment/common/environment'; import { shell, crashReporter, app, Menu, clipboard } from 'electron'; -import { Event, fromNodeEventEmitter } from 'vs/base/common/event'; +import { Event, fromNodeEventEmitter, mapEvent, filterEvent, anyEvent } from 'vs/base/common/event'; import { IURLService, IURLHandler } from 'vs/platform/url/common/url'; import { ILifecycleService } from 'vs/platform/lifecycle/electron-main/lifecycleMain'; import { IWindowsMainService, ISharedProcess } from 'vs/platform/windows/electron-main/windows'; @@ -32,9 +32,13 @@ export class WindowsService implements IWindowsService, IURLHandler, IDisposable private disposables: IDisposable[] = []; - readonly onWindowOpen: Event = fromNodeEventEmitter(app, 'browser-window-created', (_, w: Electron.BrowserWindow) => w.id); - readonly onWindowFocus: Event = fromNodeEventEmitter(app, 'browser-window-focus', (_, w: Electron.BrowserWindow) => w.id); - readonly onWindowBlur: Event = fromNodeEventEmitter(app, 'browser-window-blur', (_, w: Electron.BrowserWindow) => w.id); + readonly onWindowOpen: Event = filterEvent(fromNodeEventEmitter(app, 'browser-window-created', (_, w: Electron.BrowserWindow) => w.id), id => !!this.windowsMainService.getWindowById(id)); + readonly onWindowFocus: Event = anyEvent( + mapEvent(filterEvent(mapEvent(this.windowsMainService.onWindowsCountChanged, () => this.windowsMainService.getLastActiveWindow()), w => !!w), w => w.id), + filterEvent(fromNodeEventEmitter(app, 'browser-window-focus', (_, w: Electron.BrowserWindow) => w.id), id => !!this.windowsMainService.getWindowById(id)) + ); + + readonly onWindowBlur: Event = filterEvent(fromNodeEventEmitter(app, 'browser-window-blur', (_, w: Electron.BrowserWindow) => w.id), id => !!this.windowsMainService.getWindowById(id)); constructor( private sharedProcess: ISharedProcess, From 882d1a66455ff1a3fd9674387011da9f420657bd Mon Sep 17 00:00:00 2001 From: Joao Moreno Date: Thu, 26 Apr 2018 15:34:04 +0200 Subject: [PATCH 130/830] improve extension URL opening interface fixes #48609 fixes #48608 --- .../electron-browser/inactiveExtensionUrlHandler.ts | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/src/vs/platform/url/electron-browser/inactiveExtensionUrlHandler.ts b/src/vs/platform/url/electron-browser/inactiveExtensionUrlHandler.ts index 71381696ae5..f8c42720026 100644 --- a/src/vs/platform/url/electron-browser/inactiveExtensionUrlHandler.ts +++ b/src/vs/platform/url/electron-browser/inactiveExtensionUrlHandler.ts @@ -65,9 +65,16 @@ export class ExtensionUrlHandler implements IExtensionUrlHandler, IURLHandler { const extensionId = uri.authority; const wasHandlerAvailable = this.extensionHandlers.has(extensionId); + const extensions = await this.extensionService.getExtensions(); + const extension = extensions.filter(e => e.id === extensionId)[0]; + + if (!extension) { + return false; + } + const result = await this.dialogService.confirm({ - message: localize('confirmUrl', "Do you want to let the {0} extension open the following URL?", extensionId), - detail: uri.toString() + message: localize('confirmUrl', "Allow an extension to open this URL?", extensionId), + detail: `${extension.displayName || extension.name} (${extensionId}) wants to open a URL:\n\n${uri.toString()}` }); if (!result.confirmed) { From 9eed1b33f58d799c1c56b268cecb80bb55290004 Mon Sep 17 00:00:00 2001 From: Alex Dima Date: Thu, 26 Apr 2018 15:16:25 +0200 Subject: [PATCH 131/830] Limit active indent guide computation to viewport (#48721) --- .../browser/viewParts/indentGuides/indentGuides.ts | 2 +- src/vs/editor/common/model.ts | 2 +- src/vs/editor/common/model/textModel.ts | 6 +++--- .../editor/common/viewModel/splitLinesCollection.ts | 12 ++++++++---- src/vs/editor/common/viewModel/viewModel.ts | 2 +- src/vs/editor/common/viewModel/viewModelImpl.ts | 4 ++-- .../test/common/model/textModelWithTokens.test.ts | 2 +- 7 files changed, 17 insertions(+), 13 deletions(-) diff --git a/src/vs/editor/browser/viewParts/indentGuides/indentGuides.ts b/src/vs/editor/browser/viewParts/indentGuides/indentGuides.ts index 8834b5fed88..869e5efad81 100644 --- a/src/vs/editor/browser/viewParts/indentGuides/indentGuides.ts +++ b/src/vs/editor/browser/viewParts/indentGuides/indentGuides.ts @@ -114,7 +114,7 @@ export class IndentGuidesOverlay extends DynamicViewOverlay { let activeIndentEndLineNumber = 0; let activeIndentLevel = 0; if (this._primaryLineNumber) { - const activeIndentInfo = this._context.model.getActiveIndentGuide(this._primaryLineNumber); + const activeIndentInfo = this._context.model.getActiveIndentGuide(this._primaryLineNumber, visibleStartLineNumber, visibleEndLineNumber); activeIndentStartLineNumber = activeIndentInfo.startLineNumber; activeIndentEndLineNumber = activeIndentInfo.endLineNumber; activeIndentLevel = activeIndentInfo.indent; diff --git a/src/vs/editor/common/model.ts b/src/vs/editor/common/model.ts index ca064215e92..fcd2b5ed666 100644 --- a/src/vs/editor/common/model.ts +++ b/src/vs/editor/common/model.ts @@ -868,7 +868,7 @@ export interface ITextModel { /** * @internal */ - getActiveIndentGuide(lineNumber: number): IActiveIndentGuideInfo; + getActiveIndentGuide(lineNumber: number, minLineNumber: number, maxLineNumber: number): IActiveIndentGuideInfo; /** * @internal diff --git a/src/vs/editor/common/model/textModel.ts b/src/vs/editor/common/model/textModel.ts index 9a7a735e650..ba34a2a2364 100644 --- a/src/vs/editor/common/model/textModel.ts +++ b/src/vs/editor/common/model/textModel.ts @@ -2389,7 +2389,7 @@ export class TextModel extends Disposable implements model.ITextModel { return TextModel.computeIndentLevel(this._buffer.getLineContent(lineIndex + 1), this._options.tabSize); } - public getActiveIndentGuide(lineNumber: number): model.IActiveIndentGuideInfo { + public getActiveIndentGuide(lineNumber: number, minLineNumber: number, maxLineNumber: number): model.IActiveIndentGuideInfo { this._assertNotDisposed(); const lineCount = this.getLineCount(); @@ -2482,10 +2482,10 @@ export class TextModel extends Disposable implements model.ITextModel { const upLineNumber = lineNumber - distance; const downLineNumber = lineNumber + distance; - if (upLineNumber < 1) { + if (upLineNumber < 1 || upLineNumber < minLineNumber) { goUp = false; } - if (downLineNumber > lineCount) { + if (downLineNumber > lineCount || downLineNumber > maxLineNumber) { goDown = false; } diff --git a/src/vs/editor/common/viewModel/splitLinesCollection.ts b/src/vs/editor/common/viewModel/splitLinesCollection.ts index 73f02436877..4f8f974693b 100644 --- a/src/vs/editor/common/viewModel/splitLinesCollection.ts +++ b/src/vs/editor/common/viewModel/splitLinesCollection.ts @@ -82,7 +82,7 @@ export interface IViewModelLinesCollection { getViewLineCount(): number; warmUpLookupCache(viewStartLineNumber: number, viewEndLineNumber: number): void; - getActiveIndentGuide(viewLineNumber: number): IActiveIndentGuideInfo; + getActiveIndentGuide(viewLineNumber: number, minLineNumber: number, maxLineNumber: number): IActiveIndentGuideInfo; getViewLinesIndentGuides(viewStartLineNumber: number, viewEndLineNumber: number): number[]; getViewLineContent(viewLineNumber: number): string; getViewLineLength(viewLineNumber: number): number; @@ -505,12 +505,16 @@ export class SplitLinesCollection implements IViewModelLinesCollection { this.prefixSumComputer.warmUpCache(viewStartLineNumber - 1, viewEndLineNumber - 1); } - public getActiveIndentGuide(viewLineNumber: number): IActiveIndentGuideInfo { + public getActiveIndentGuide(viewLineNumber: number, minLineNumber: number, maxLineNumber: number): IActiveIndentGuideInfo { this._ensureValidState(); viewLineNumber = this._toValidViewLineNumber(viewLineNumber); + minLineNumber = this._toValidViewLineNumber(minLineNumber); + maxLineNumber = this._toValidViewLineNumber(maxLineNumber); const modelPosition = this.convertViewPositionToModelPosition(viewLineNumber, this.getViewLineMinColumn(viewLineNumber)); - const result = this.model.getActiveIndentGuide(modelPosition.lineNumber); + const modelMinPosition = this.convertViewPositionToModelPosition(minLineNumber, this.getViewLineMinColumn(minLineNumber)); + const modelMaxPosition = this.convertViewPositionToModelPosition(maxLineNumber, this.getViewLineMinColumn(maxLineNumber)); + const result = this.model.getActiveIndentGuide(modelPosition.lineNumber, modelMinPosition.lineNumber, modelMaxPosition.lineNumber); const viewStartPosition = this.convertModelPositionToViewPosition(result.startLineNumber, 1); const viewEndPosition = this.convertModelPositionToViewPosition(result.endLineNumber, 1); @@ -1258,7 +1262,7 @@ export class IdentityLinesCollection implements IViewModelLinesCollection { public warmUpLookupCache(viewStartLineNumber: number, viewEndLineNumber: number): void { } - public getActiveIndentGuide(viewLineNumber: number): IActiveIndentGuideInfo { + public getActiveIndentGuide(viewLineNumber: number, minLineNumber: number, maxLineNumber: number): IActiveIndentGuideInfo { return { startLineNumber: viewLineNumber, endLineNumber: viewLineNumber, diff --git a/src/vs/editor/common/viewModel/viewModel.ts b/src/vs/editor/common/viewModel/viewModel.ts index e4239fcd5e3..ba1096ea74f 100644 --- a/src/vs/editor/common/viewModel/viewModel.ts +++ b/src/vs/editor/common/viewModel/viewModel.ts @@ -133,7 +133,7 @@ export interface IViewModel { getLineCount(): number; getLineContent(lineNumber: number): string; getLineLength(lineNumber: number): number; - getActiveIndentGuide(lineNumber: number): IActiveIndentGuideInfo; + getActiveIndentGuide(lineNumber: number, minLineNumber: number, maxLineNumber: number): IActiveIndentGuideInfo; getLinesIndentGuides(startLineNumber: number, endLineNumber: number): number[]; getLineMinColumn(lineNumber: number): number; getLineMaxColumn(lineNumber: number): number; diff --git a/src/vs/editor/common/viewModel/viewModelImpl.ts b/src/vs/editor/common/viewModel/viewModelImpl.ts index 434615d824d..00e49e8e91c 100644 --- a/src/vs/editor/common/viewModel/viewModelImpl.ts +++ b/src/vs/editor/common/viewModel/viewModelImpl.ts @@ -452,8 +452,8 @@ export class ViewModel extends viewEvents.ViewEventEmitter implements IViewModel this.viewportStartLineTop = this.viewLayout.getVerticalOffsetForLineNumber(startLineNumber); } - public getActiveIndentGuide(lineNumber: number): IActiveIndentGuideInfo { - return this.lines.getActiveIndentGuide(lineNumber); + public getActiveIndentGuide(lineNumber: number, minLineNumber: number, maxLineNumber: number): IActiveIndentGuideInfo { + return this.lines.getActiveIndentGuide(lineNumber, minLineNumber, maxLineNumber); } public getLinesIndentGuides(startLineNumber: number, endLineNumber: number): number[] { diff --git a/src/vs/editor/test/common/model/textModelWithTokens.test.ts b/src/vs/editor/test/common/model/textModelWithTokens.test.ts index 9023f0cc7dc..13bf09eb03d 100644 --- a/src/vs/editor/test/common/model/textModelWithTokens.test.ts +++ b/src/vs/editor/test/common/model/textModelWithTokens.test.ts @@ -433,7 +433,7 @@ suite('TextModel.getLineIndentGuide', () => { } const expected = { startLineNumber, endLineNumber, indent }; - const actual = model.getActiveIndentGuide(lineNumber); + const actual = model.getActiveIndentGuide(lineNumber, 1, model.getLineCount()); assert.deepEqual(actual, expected, `line number ${lineNumber}`); } From c9420399fda6b62a5ebd3b1d7d80047c43ba6672 Mon Sep 17 00:00:00 2001 From: Alex Dima Date: Thu, 26 Apr 2018 15:32:47 +0200 Subject: [PATCH 132/830] Uncomment test --- .../test/common/model/editableTextModel.test.ts | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/src/vs/editor/test/common/model/editableTextModel.test.ts b/src/vs/editor/test/common/model/editableTextModel.test.ts index 480fdc82c47..dfa393b303f 100644 --- a/src/vs/editor/test/common/model/editableTextModel.test.ts +++ b/src/vs/editor/test/common/model/editableTextModel.test.ts @@ -7,7 +7,7 @@ import * as assert from 'assert'; import { Range } from 'vs/editor/common/core/range'; -import { EndOfLineSequence, IIdentifiedSingleEditOperation } from 'vs/editor/common/model'; +import { EndOfLineSequence, IIdentifiedSingleEditOperation, EndOfLinePreference } from 'vs/editor/common/model'; import { TextModel } from 'vs/editor/common/model/textModel'; import { MirrorTextModel } from 'vs/editor/common/model/mirrorTextModel'; import { assertSyncedModels, testApplyEditsWithSyncedModels } from 'vs/editor/test/common/model/editableTextModelTestUtils'; @@ -1078,16 +1078,16 @@ suite('EditorModel - EditableTextModel.applyEdits', () => { { range: new Range(1, 2, 1, 2), text: '"' }, ]); - // assert.equal(model.getValue(EndOfLinePreference.LF), '"\'"👁\''); + assert.equal(model.getValue(EndOfLinePreference.LF), '"\'"👁\''); assert.deepEqual(model.validateRange(new Range(1, 3, 1, 4)), new Range(1, 3, 1, 4)); - // model.applyEdits([ - // { range: new Range(1, 1, 1, 2), text: null }, - // { range: new Range(1, 3, 1, 4), text: null }, - // ]); + model.applyEdits([ + { range: new Range(1, 1, 1, 2), text: null }, + { range: new Range(1, 3, 1, 4), text: null }, + ]); - // assert.equal(model.getValue(EndOfLinePreference.LF), '\'👁\''); + assert.equal(model.getValue(EndOfLinePreference.LF), '\'👁\''); model.dispose(); }); From b27ecc6100638bc0c9cc8138c1d1afc7c48419a6 Mon Sep 17 00:00:00 2001 From: Alex Dima Date: Thu, 26 Apr 2018 15:34:30 +0200 Subject: [PATCH 133/830] Limit the maximum distance of the active indent guide (#48721) --- src/vs/editor/common/model/textModel.ts | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/vs/editor/common/model/textModel.ts b/src/vs/editor/common/model/textModel.ts index ba34a2a2364..c3dd46e55ad 100644 --- a/src/vs/editor/common/model/textModel.ts +++ b/src/vs/editor/common/model/textModel.ts @@ -2488,6 +2488,11 @@ export class TextModel extends Disposable implements model.ITextModel { if (downLineNumber > lineCount || downLineNumber > maxLineNumber) { goDown = false; } + if (distance > 50000) { + // stop processing + goUp = false; + goDown = false; + } if (goUp) { // compute indent level going up From c73ea1634754b986bcc9a1481bb4feb3806d8fd5 Mon Sep 17 00:00:00 2001 From: Johannes Rieken Date: Thu, 26 Apr 2018 15:56:43 +0200 Subject: [PATCH 134/830] documents with the untitled-scheme are consider untitled, #48269 --- src/vs/vscode.d.ts | 4 +++- src/vs/workbench/api/node/extHostDocumentData.ts | 4 ++-- 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/src/vs/vscode.d.ts b/src/vs/vscode.d.ts index c419713c90a..b7c67664cb7 100644 --- a/src/vs/vscode.d.ts +++ b/src/vs/vscode.d.ts @@ -101,7 +101,9 @@ declare module 'vscode' { readonly fileName: string; /** - * Is this document representing an untitled file. + * Is this document representing an untitled file which has never been saved yet. *Note* that + * this does not mean the document will be saved to disk, use [`uri.scheme`](#Uri.scheme) + * to figure out where a document will be [saved](#FileSystemProvider), e.g. `file`, `ftp` etc. */ readonly isUntitled: boolean; diff --git a/src/vs/workbench/api/node/extHostDocumentData.ts b/src/vs/workbench/api/node/extHostDocumentData.ts index d42afcf7ba0..2eeef2a7d5f 100644 --- a/src/vs/workbench/api/node/extHostDocumentData.ts +++ b/src/vs/workbench/api/node/extHostDocumentData.ts @@ -13,6 +13,7 @@ import * as vscode from 'vscode'; import { getWordAtText, ensureValidWordDefinition } from 'vs/editor/common/model/wordHelper'; import { MainThreadDocumentsShape } from './extHost.protocol'; import { TPromise } from 'vs/base/common/winjs.base'; +import { Schemas } from 'vs/base/common/network'; const _modeId2WordDefinition = new Map(); export function setWordDefinitionFor(modeId: string, wordDefinition: RegExp): void { @@ -68,8 +69,7 @@ export class ExtHostDocumentData extends MirrorTextModel { this._document = { get uri() { return data._uri; }, get fileName() { return data._uri.fsPath; }, - // todo@remote -> https://github.com/Microsoft/vscode/issues/48269 - get isUntitled() { return data._uri.scheme !== 'file'; }, + get isUntitled() { return data._uri.scheme === Schemas.untitled; }, get languageId() { return data._languageId; }, get version() { return data._versionId; }, get isClosed() { return data._isDisposed; }, From ded0736bf8d9498bcff78d297ce062a2815f8c06 Mon Sep 17 00:00:00 2001 From: Sandeep Somavarapu Date: Thu, 26 Apr 2018 16:14:28 +0200 Subject: [PATCH 135/830] #43645 Do not override view containers --- .../browser/viewsContainersExtensionPoint.ts | 92 ++++++++++--------- 1 file changed, 49 insertions(+), 43 deletions(-) diff --git a/src/vs/workbench/api/browser/viewsContainersExtensionPoint.ts b/src/vs/workbench/api/browser/viewsContainersExtensionPoint.ts index 5528735ff51..5fd69ca019e 100644 --- a/src/vs/workbench/api/browser/viewsContainersExtensionPoint.ts +++ b/src/vs/workbench/api/browser/viewsContainersExtensionPoint.ts @@ -143,56 +143,62 @@ class ViewsContainersExtensionHandler implements IWorkbenchContribution { } private registerCustomViewlet(descriptor: IUserFriendlyViewsContainerDescriptor, order: number, cssClass: string): void { + const viewletRegistry = Registry.as(ViewletExtensions.Viewlets); const id = `workbench.view.extension.${descriptor.id}`; - const location: ViewLocation = ViewLocation.register(id); - // Register as viewlet - class CustomViewlet extends PersistentViewsViewlet { - constructor( - @IPartService partService: IPartService, - @ITelemetryService telemetryService: ITelemetryService, - @IWorkspaceContextService contextService: IWorkspaceContextService, - @IStorageService storageService: IStorageService, - @IWorkbenchEditorService editorService: IWorkbenchEditorService, - @IInstantiationService instantiationService: IInstantiationService, - @IContextKeyService contextKeyService: IContextKeyService, - @IThemeService themeService: IThemeService, - @IContextMenuService contextMenuService: IContextMenuService, - @IExtensionService extensionService: IExtensionService - ) { - super(id, location, `${id}.state`, true, partService, telemetryService, storageService, instantiationService, themeService, contextService, contextKeyService, contextMenuService, extensionService); + if (!viewletRegistry.getViewlet(id)) { + + const location: ViewLocation = ViewLocation.register(id); + + // Register as viewlet + class CustomViewlet extends PersistentViewsViewlet { + constructor( + @IPartService partService: IPartService, + @ITelemetryService telemetryService: ITelemetryService, + @IWorkspaceContextService contextService: IWorkspaceContextService, + @IStorageService storageService: IStorageService, + @IWorkbenchEditorService editorService: IWorkbenchEditorService, + @IInstantiationService instantiationService: IInstantiationService, + @IContextKeyService contextKeyService: IContextKeyService, + @IThemeService themeService: IThemeService, + @IContextMenuService contextMenuService: IContextMenuService, + @IExtensionService extensionService: IExtensionService + ) { + super(id, location, `${id}.state`, true, partService, telemetryService, storageService, instantiationService, themeService, contextService, contextKeyService, contextMenuService, extensionService); + } } - } - const viewletDescriptor = new ViewletDescriptor( - CustomViewlet, - id, - descriptor.title, - cssClass, - order - ); + const viewletDescriptor = new ViewletDescriptor( + CustomViewlet, + id, + descriptor.title, + cssClass, + order + ); - Registry.as(ViewletExtensions.Viewlets).registerViewlet(viewletDescriptor); + viewletRegistry.registerViewlet(viewletDescriptor); - // Register Action to Open Viewlet - class OpenCustomViewletAction extends ToggleViewletAction { - constructor( - id: string, label: string, - @IViewletService viewletService: IViewletService, - @IWorkbenchEditorService editorService: IWorkbenchEditorService - ) { - super(id, label, id, viewletService, editorService); + // Register Action to Open Viewlet + class OpenCustomViewletAction extends ToggleViewletAction { + constructor( + id: string, label: string, + @IViewletService viewletService: IViewletService, + @IWorkbenchEditorService editorService: IWorkbenchEditorService + ) { + super(id, label, id, viewletService, editorService); + } } - } - const registry = Registry.as(ActionExtensions.WorkbenchActions); - registry.registerWorkbenchAction( - new SyncActionDescriptor(OpenCustomViewletAction, id, localize('showViewlet', "Show {0}", descriptor.title)), - 'View: Show {0}', - localize('view', "View") - ); + const registry = Registry.as(ActionExtensions.WorkbenchActions); + registry.registerWorkbenchAction( + new SyncActionDescriptor(OpenCustomViewletAction, id, localize('showViewlet', "Show {0}", descriptor.title)), + 'View: Show {0}', + localize('view', "View") + ); + + // Generate CSS to show the icon in the activity bar + const iconClass = `.monaco-workbench > .activitybar .monaco-action-bar .action-label.${cssClass}`; + createCSSRule(iconClass, `-webkit-mask: url('${descriptor.icon}') no-repeat 50% 50%`); + } - // Generate CSS to show the icon in the activity bar - const iconClass = `.monaco-workbench > .activitybar .monaco-action-bar .action-label.${cssClass}`; - createCSSRule(iconClass, `-webkit-mask: url('${descriptor.icon}') no-repeat 50% 50%`); } } From 20994d2b5391ae4f964555715c53589ba3b526f8 Mon Sep 17 00:00:00 2001 From: Erich Gamma Date: Thu, 26 Apr 2018 16:02:38 +0200 Subject: [PATCH 136/830] Remove unneeded keys --- extensions/npm/package.nls.json | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/extensions/npm/package.nls.json b/extensions/npm/package.nls.json index fa751eeba24..9caaff63fc3 100644 --- a/extensions/npm/package.nls.json +++ b/extensions/npm/package.nls.json @@ -13,7 +13,5 @@ "command.refresh": "Refresh", "command.run": "Run", "command.debug": "Debug", - "command.openScript": "Open", - "npm.scriptInvalid": "Could not find the script '{0}'. Try to refresh the view.", - "npm.noDebugOptions": "Could not launch '{0}' for debugging because the scripts lacks a node debug option, e.g. '--inspect-brk'." + "command.openScript": "Open" } From 51a880315fd0ec2cafb511a17de48ec31802ba6d Mon Sep 17 00:00:00 2001 From: Erich Gamma Date: Thu, 26 Apr 2018 16:32:03 +0200 Subject: [PATCH 137/830] Add a Learn More action fixing #48538 --- extensions/npm/src/npmView.ts | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/extensions/npm/src/npmView.ts b/extensions/npm/src/npmView.ts index 2eaad7d831a..dbcfaffccaa 100644 --- a/extensions/npm/src/npmView.ts +++ b/extensions/npm/src/npmView.ts @@ -157,8 +157,13 @@ export class NpmScriptsTreeDataProvider implements TreeDataProvider { let debugArg = await this.extractDebugArg(scripts, task); if (!debugArg) { - let message = localize('npm.noDebugOptions', 'Could not launch "{0}" for debugging because the scripts lacks a node debug option, e.g. "--inspect-brk".', task.name); - window.showErrorMessage(message, { modal: true }); + let message = localize('noDebugOptions', 'Could not launch "{0}" for debugging because the scripts lacks a node debug option, e.g. "--inspect-brk".', task.name); + let learnMore = localize('learnMore', 'Learn More'); + let ok = localize('ok', 'OK'); + let result = await window.showErrorMessage(message, { modal: true }, ok, learnMore); + if (result === learnMore) { + commands.executeCommand('vscode.open', Uri.parse('https://code.visualstudio.com/docs/nodejs/nodejs-debugging#_launch-configuration-support-for-npm-and-other-tools')); + } return; } @@ -187,7 +192,7 @@ export class NpmScriptsTreeDataProvider implements TreeDataProvider { } private scriptNotValid(task: Task) { - let message = localize('npm.scriptInvalid', 'Could not find the script "{0}". Try to refresh the view.', task.name); + let message = localize('scriptInvalid', 'Could not find the script "{0}". Try to refresh the view.', task.name); window.showErrorMessage(message); } From 39748bd8b87c08455a7821ab7a4034071d684815 Mon Sep 17 00:00:00 2001 From: Sandeep Somavarapu Date: Thu, 26 Apr 2018 17:57:39 +0200 Subject: [PATCH 138/830] #47883 Use old workaround --- src/vs/platform/log/common/log.ts | 26 --- src/vs/platform/log/node/spdlogService.ts | 12 +- .../output/electron-browser/outputServices.ts | 165 +++++++++++++++++- 3 files changed, 158 insertions(+), 45 deletions(-) diff --git a/src/vs/platform/log/common/log.ts b/src/vs/platform/log/common/log.ts index a39d5b61827..84db1c3361a 100644 --- a/src/vs/platform/log/common/log.ts +++ b/src/vs/platform/log/common/log.ts @@ -300,32 +300,6 @@ export class NullLogService implements ILogService { dispose(): void { } } -export interface IOutputWriter { - trace(message: string): void; - debug(message: string): void; - info(message: string): void; - warn(message: string): void; - error(message: string): void; - critical(message: string): void; - setLevel(level: number): void; - clearFormatters(): void; - flush(): void; - drop(): void; -} - -export class NullOutputWriter implements IOutputWriter { - trace(message: string): void { } - debug(message: string): void { } - info(message: string): void { } - warn(message: string): void { } - error(message: string): void { } - critical(message: string): void { } - setLevel(level: number): void { } - clearFormatters(): void { } - flush(): void { } - drop(): void { } -} - export function getLogLevel(environmentService: IEnvironmentService): LogLevel { if (environmentService.verbose) { return LogLevel.Trace; diff --git a/src/vs/platform/log/node/spdlogService.ts b/src/vs/platform/log/node/spdlogService.ts index 49ec67792b0..5d579767204 100644 --- a/src/vs/platform/log/node/spdlogService.ts +++ b/src/vs/platform/log/node/spdlogService.ts @@ -6,7 +6,7 @@ 'use strict'; import * as path from 'path'; -import { ILogService, LogLevel, NullLogService, AbstractLogService, NullOutputWriter, IOutputWriter } from 'vs/platform/log/common/log'; +import { ILogService, LogLevel, NullLogService, AbstractLogService } from 'vs/platform/log/common/log'; import * as spdlog from 'spdlog'; export function createSpdLogService(processName: string, logLevel: LogLevel, logsFolder: string): ILogService { @@ -25,16 +25,6 @@ export function createSpdLogService(processName: string, logLevel: LogLevel, log return new NullLogService(); } -export function createSpdLogOutputWriter(name: string, filename: string, filesize: number, filecount: number): IOutputWriter { - // Do not crash if spdlog rotating logger cannot be loaded (workaround for https://github.com/Microsoft/vscode/issues/47883) - try { - return new spdlog.RotatingLogger(name, filename, filesize, filecount); - } catch (e) { - console.error(e); - } - return new NullOutputWriter(); -} - class SpdLogService extends AbstractLogService implements ILogService { _serviceBrand: any; diff --git a/src/vs/workbench/parts/output/electron-browser/outputServices.ts b/src/vs/workbench/parts/output/electron-browser/outputServices.ts index 11579a7d8bb..769103f1d49 100644 --- a/src/vs/workbench/parts/output/electron-browser/outputServices.ts +++ b/src/vs/workbench/parts/output/electron-browser/outputServices.ts @@ -5,6 +5,7 @@ import * as nls from 'vs/nls'; import * as paths from 'vs/base/common/paths'; +import * as strings from 'vs/base/common/strings'; import * as extfs from 'vs/base/node/extfs'; import * as fs from 'fs'; import { TPromise } from 'vs/base/common/winjs.base'; @@ -15,7 +16,7 @@ import { IInstantiationService } from 'vs/platform/instantiation/common/instanti import { IStorageService, StorageScope } from 'vs/platform/storage/common/storage'; import { Registry } from 'vs/platform/registry/common/platform'; import { EditorOptions } from 'vs/workbench/common/editor'; -import { IOutputChannelIdentifier, IOutputChannel, IOutputService, Extensions, OUTPUT_PANEL_ID, IOutputChannelRegistry, OUTPUT_SCHEME, OUTPUT_MIME, LOG_SCHEME, LOG_MIME, CONTEXT_ACTIVE_LOG_OUTPUT } from 'vs/workbench/parts/output/common/output'; +import { IOutputChannelIdentifier, IOutputChannel, IOutputService, Extensions, OUTPUT_PANEL_ID, IOutputChannelRegistry, OUTPUT_SCHEME, OUTPUT_MIME, MAX_OUTPUT_LENGTH, LOG_SCHEME, LOG_MIME, CONTEXT_ACTIVE_LOG_OUTPUT } from 'vs/workbench/parts/output/common/output'; import { OutputPanel } from 'vs/workbench/parts/output/browser/outputPanel'; import { IPanelService } from 'vs/workbench/services/panel/common/panelService'; import { IModelService } from 'vs/editor/common/services/modelService'; @@ -31,13 +32,14 @@ import { IFileService } from 'vs/platform/files/common/files'; import { IPanel } from 'vs/workbench/common/panel'; import { ResourceEditorInput } from 'vs/workbench/common/editor/resourceEditorInput'; import { IEnvironmentService } from 'vs/platform/environment/common/environment'; +import { RotatingLogger } from 'spdlog'; import { toLocalISOString } from 'vs/base/common/date'; import { IWindowService } from 'vs/platform/windows/common/windows'; -import { ILogService, IOutputWriter } from 'vs/platform/log/common/log'; +import { ILogService } from 'vs/platform/log/common/log'; +import { binarySearch } from 'vs/base/common/arrays'; import { Schemas } from 'vs/base/common/network'; import { ILifecycleService } from 'vs/platform/lifecycle/common/lifecycle'; import { IContextKeyService } from 'vs/platform/contextkey/common/contextkey'; -import { createSpdLogOutputWriter } from 'vs/platform/log/node/spdlogService'; const OUTPUT_ACTIVE_CHANNEL_KEY = 'output.activechannel'; @@ -201,7 +203,7 @@ abstract class AbstractFileOutputChannel extends Disposable { */ class OutputChannelBackedByFile extends AbstractFileOutputChannel implements OutputChannel { - private outputWriter: IOutputWriter; + private outputWriter: RotatingLogger; private appendedMessage = ''; private loadingFromFileInProgress: boolean = false; private resettingDelayer: ThrottledDelayer; @@ -219,7 +221,7 @@ class OutputChannelBackedByFile extends AbstractFileOutputChannel implements Out super({ ...outputChannelIdentifier, file: URI.file(paths.join(outputDir, `${outputChannelIdentifier.id}.log`)) }, modelUri, OUTPUT_MIME, fileService, modelService, modeService); // Use one rotating file to check for main file reset - this.outputWriter = createSpdLogOutputWriter(this.id, this.file.fsPath, 1024 * 1024 * 30, 1); + this.outputWriter = new RotatingLogger(this.id, this.file.fsPath, 1024 * 1024 * 30, 1); this.outputWriter.clearFormatters(); this.rotatingFilePath = `${outputChannelIdentifier.id}.1.log`; this._register(watchOutputDirectory(paths.dirname(this.file.fsPath), logService, (eventType, file) => this.onFileChangedInOutputDirector(eventType, file))); @@ -566,9 +568,16 @@ export class OutputService extends Disposable implements IOutputService, ITextMo } const uri = URI.from({ scheme: OUTPUT_SCHEME, path: id }); - return channelData && channelData.file - ? this.instantiationService.createInstance(FileOutputChannel, channelData, uri) - : this.instantiationService.createInstance(OutputChannelBackedByFile, { id, label: channelData ? channelData.label : '' }, this.outputDir, uri); + if (channelData && channelData.file) { + return this.instantiationService.createInstance(FileOutputChannel, channelData, uri); + } + try { + return this.instantiationService.createInstance(OutputChannelBackedByFile, { id, label: channelData ? channelData.label : '' }, this.outputDir, uri); + } catch (e) { + // Do not crash if spdlog rotating logger cannot be loaded (workaround for https://github.com/Microsoft/vscode/issues/47883) + this.logService.error(e); + return this.instantiationService.createInstance(BufferredOutputChannel, { id, label: channelData ? channelData.label : '' }); + } } private doShowChannel(channel: IOutputChannel, preserveFocus: boolean): TPromise { @@ -636,4 +645,144 @@ export class LogContentProvider { } return channel; } +} +// Remove this channel when https://github.com/Microsoft/vscode/issues/47883 is fixed +class BufferredOutputChannel extends Disposable implements OutputChannel { + + readonly id: string; + readonly label: string; + readonly file: URI = null; + scrollLock: boolean = false; + + protected _onDidAppendedContent: Emitter = new Emitter(); + readonly onDidAppendedContent: Event = this._onDidAppendedContent.event; + + private readonly _onDispose: Emitter = new Emitter(); + readonly onDispose: Event = this._onDispose.event; + + private modelUpdater: RunOnceScheduler; + private model: ITextModel; + private readonly bufferredContent: BufferedContent; + private lastReadId: number = void 0; + + constructor( + protected readonly outputChannelIdentifier: IOutputChannelIdentifier, + @IModelService private modelService: IModelService, + @IModeService private modeService: IModeService + ) { + super(); + + this.id = outputChannelIdentifier.id; + this.label = outputChannelIdentifier.label; + + this.modelUpdater = new RunOnceScheduler(() => this.updateModel(), 300); + this._register(toDisposable(() => this.modelUpdater.cancel())); + + this.bufferredContent = new BufferedContent(); + this._register(toDisposable(() => this.bufferredContent.clear())); + } + + append(output: string) { + this.bufferredContent.append(output); + if (!this.modelUpdater.isScheduled()) { + this.modelUpdater.schedule(); + } + } + + clear(): void { + if (this.modelUpdater.isScheduled()) { + this.modelUpdater.cancel(); + } + if (this.model) { + this.model.setValue(''); + } + this.bufferredContent.clear(); + this.lastReadId = void 0; + } + + loadModel(): TPromise { + const { value, id } = this.bufferredContent.getDelta(this.lastReadId); + if (this.model) { + this.model.setValue(value); + } else { + this.model = this.createModel(value); + } + this.lastReadId = id; + return TPromise.as(this.model); + } + + private createModel(content: string): ITextModel { + const model = this.modelService.createModel(content, this.modeService.getOrCreateMode(OUTPUT_MIME), URI.from({ scheme: OUTPUT_SCHEME, path: this.id })); + const disposables: IDisposable[] = []; + disposables.push(model.onWillDispose(() => { + this.model = null; + dispose(disposables); + })); + return model; + } + + private updateModel(): void { + if (this.model) { + const { value, id } = this.bufferredContent.getDelta(this.lastReadId); + this.lastReadId = id; + const lastLine = this.model.getLineCount(); + const lastLineMaxColumn = this.model.getLineMaxColumn(lastLine); + this.model.applyEdits([EditOperation.insert(new Position(lastLine, lastLineMaxColumn), value)]); + this._onDidAppendedContent.fire(); + } + } + + dispose(): void { + this._onDispose.fire(); + super.dispose(); + } +} + +class BufferedContent { + + private data: string[] = []; + private dataIds: number[] = []; + private idPool = 0; + private length = 0; + + public append(content: string): void { + this.data.push(content); + this.dataIds.push(++this.idPool); + this.length += content.length; + this.trim(); + } + + public clear(): void { + this.data.length = 0; + this.dataIds.length = 0; + this.length = 0; + } + + private trim(): void { + if (this.length < MAX_OUTPUT_LENGTH * 1.2) { + return; + } + + while (this.length > MAX_OUTPUT_LENGTH) { + this.dataIds.shift(); + const removed = this.data.shift(); + this.length -= removed.length; + } + } + + public getDelta(previousId?: number): { value: string, id: number } { + let idx = -1; + if (previousId !== void 0) { + idx = binarySearch(this.dataIds, previousId, (a, b) => a - b); + } + + const id = this.idPool; + if (idx >= 0) { + const value = strings.removeAnsiEscapeCodes(this.data.slice(idx + 1).join('')); + return { value, id }; + } else { + const value = strings.removeAnsiEscapeCodes(this.data.join('')); + return { value, id }; + } + } } \ No newline at end of file From 6f4d130ae536b9c52073907ff6dbbee6338b287b Mon Sep 17 00:00:00 2001 From: Johannes Rieken Date: Thu, 26 Apr 2018 18:03:52 +0200 Subject: [PATCH 139/830] rename it to prepareRename, #48700 --- src/vs/vscode.d.ts | 2 +- src/vs/workbench/api/node/extHostLanguageFeatures.ts | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/vs/vscode.d.ts b/src/vs/vscode.d.ts index b7c67664cb7..aab2acc9a79 100644 --- a/src/vs/vscode.d.ts +++ b/src/vs/vscode.d.ts @@ -2764,7 +2764,7 @@ declare module 'vscode' { * @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`. */ - resolveRenameLocation?(document: TextDocument, position: Position, token: CancellationToken): ProviderResult; + prepareRename?(document: TextDocument, position: Position, token: CancellationToken): ProviderResult; } /** diff --git a/src/vs/workbench/api/node/extHostLanguageFeatures.ts b/src/vs/workbench/api/node/extHostLanguageFeatures.ts index 2a7c092734d..69e4e9f72ae 100644 --- a/src/vs/workbench/api/node/extHostLanguageFeatures.ts +++ b/src/vs/workbench/api/node/extHostLanguageFeatures.ts @@ -471,7 +471,7 @@ class NavigateTypeAdapter { class RenameAdapter { static supportsResolving(provider: vscode.RenameProvider): boolean { - return typeof provider.resolveRenameLocation === 'function'; + return typeof provider.prepareRename === 'function'; } private _documents: ExtHostDocuments; @@ -511,14 +511,14 @@ class RenameAdapter { } resolveRenameLocation(resource: URI, position: IPosition): TPromise { - if (typeof this._provider.resolveRenameLocation !== 'function') { + if (typeof this._provider.prepareRename !== 'function') { return TPromise.as(undefined); } let doc = this._documents.getDocumentData(resource).document; let pos = TypeConverters.toPosition(position); - return asWinJsPromise(token => this._provider.resolveRenameLocation(doc, pos, token)).then(rangeOrLocation => { + return asWinJsPromise(token => this._provider.prepareRename(doc, pos, token)).then(rangeOrLocation => { let range: vscode.Range; let text: string; From d88846945e3b7e0037e505a69e55cdfe36841866 Mon Sep 17 00:00:00 2001 From: Johannes Rieken Date: Thu, 26 Apr 2018 18:20:39 +0200 Subject: [PATCH 140/830] fix #48766 --- src/vs/workbench/api/electron-browser/mainThreadFileSystem.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/vs/workbench/api/electron-browser/mainThreadFileSystem.ts b/src/vs/workbench/api/electron-browser/mainThreadFileSystem.ts index 343051fb7e7..81593724b68 100644 --- a/src/vs/workbench/api/electron-browser/mainThreadFileSystem.ts +++ b/src/vs/workbench/api/electron-browser/mainThreadFileSystem.ts @@ -26,7 +26,7 @@ export class MainThreadFileSystem implements MainThreadFileSystemShape { } dispose(): void { - this._fileProvider.forEach(value => dispose()); + this._fileProvider.forEach(value => value.dispose()); this._fileProvider.clear(); } From 31ebb53fd8d15fc11ef720cb2f7ee521260b2587 Mon Sep 17 00:00:00 2001 From: Johannes Rieken Date: Thu, 26 Apr 2018 18:34:21 +0200 Subject: [PATCH 141/830] fix #48767 --- src/vs/base/common/async.ts | 18 ++++++++++++++---- 1 file changed, 14 insertions(+), 4 deletions(-) diff --git a/src/vs/base/common/async.ts b/src/vs/base/common/async.ts index dd2a37bb9af..b84139ef87d 100644 --- a/src/vs/base/common/async.ts +++ b/src/vs/base/common/async.ts @@ -29,11 +29,21 @@ export function asWinJsPromise(callback: (token: CancellationToken) => T | TP return new TPromise((resolve, reject, progress) => { let item = callback(source.token); if (item instanceof TPromise) { - always(item, () => source.dispose()); - item.then(resolve, reject, progress); + item.then(result => { + source.dispose(); + resolve(result); + }, err => { + source.dispose(); + reject(err); + }, progress); } else if (isThenable(item)) { - always(item, () => source.dispose()); - item.then(resolve, reject); + item.then(result => { + source.dispose(); + resolve(result); + }, err => { + source.dispose(); + reject(err); + }); } else { source.dispose(); resolve(item); From 53a36900398a7261ffc66835fd1db80b382a8ea6 Mon Sep 17 00:00:00 2001 From: Sandeep Somavarapu Date: Thu, 26 Apr 2018 19:01:09 +0200 Subject: [PATCH 142/830] Update the localizations fwd link --- .../electron-browser/localizations.contribution.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/vs/workbench/parts/localizations/electron-browser/localizations.contribution.ts b/src/vs/workbench/parts/localizations/electron-browser/localizations.contribution.ts index 616b8369470..175ea3e68f6 100644 --- a/src/vs/workbench/parts/localizations/electron-browser/localizations.contribution.ts +++ b/src/vs/workbench/parts/localizations/electron-browser/localizations.contribution.ts @@ -106,7 +106,7 @@ export class LocalizationWorkbenchContribution extends Disposable implements IWo this.notificationService.prompt(Severity.Warning, localize('install language pack', "In the near future, VS Code will only support language packs in the form of Marketplace extensions. Please install the '{0}' extension in order to continue to use the currently configured language. ", extension.displayName || extension.displayName), [ { label: localize('install', "Install"), run: () => this.installExtension(extension) }, - { label: localize('more information', "More Information..."), run: () => window.open('https://go.microsoft.com/fwlink/?linkid=830387') } + { label: localize('more information', "More Information..."), run: () => window.open('https://go.microsoft.com/fwlink/?linkid=872941') } ]); } }); From f3ba8606e1d3134523cb4a95341dabc491c98f63 Mon Sep 17 00:00:00 2001 From: Rachel Macfarlane Date: Thu, 26 Apr 2018 10:46:22 -0700 Subject: [PATCH 143/830] Delay fetching performance data unless it is requested in issue reporter, #48617 --- .../code/electron-browser/issue/issueReporterMain.ts | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/src/vs/code/electron-browser/issue/issueReporterMain.ts b/src/vs/code/electron-browser/issue/issueReporterMain.ts index 72c46ded2cb..4edeea2666a 100644 --- a/src/vs/code/electron-browser/issue/issueReporterMain.ts +++ b/src/vs/code/electron-browser/issue/issueReporterMain.ts @@ -107,7 +107,9 @@ export class IssueReporter extends Disposable { }); ipcRenderer.send('issueSystemInfoRequest'); - ipcRenderer.send('issuePerformanceInfoRequest'); + if (configuration.data.issueType === IssueType.PerformanceIssue) { + ipcRenderer.send('issuePerformanceInfoRequest'); + } this.logService.trace('issueReporter: Sent data requests'); if (window.document.documentElement.lang !== 'en') { @@ -294,7 +296,11 @@ export class IssueReporter extends Disposable { private setEventHandlers(): void { this.addEventListener('issue-type', 'change', (event: Event) => { - this.issueReporterModel.update({ issueType: parseInt((event.target).value) }); + const issueType = parseInt((event.target).value); + this.issueReporterModel.update({ issueType: issueType }); + if (issueType === IssueType.PerformanceIssue && !this.receivedPerformanceInfo) { + ipcRenderer.send('issuePerformanceInfoRequest'); + } this.updatePreviewButtonState(); this.render(); }); From 0dfeec2eefa7074b905caf255bfe56e42d6e9328 Mon Sep 17 00:00:00 2001 From: Pine Wu Date: Thu, 26 Apr 2018 10:58:17 -0700 Subject: [PATCH 144/830] Restrict html/css to only handling file and untitled files. Part of #48777 --- extensions/css-language-features/client/src/cssMain.ts | 9 ++++++++- extensions/html-language-features/client/src/htmlMain.ts | 9 ++++++++- .../html-language-features/server/src/htmlServerMain.ts | 7 ++++++- 3 files changed, 22 insertions(+), 3 deletions(-) diff --git a/extensions/css-language-features/client/src/cssMain.ts b/extensions/css-language-features/client/src/cssMain.ts index a3474705b16..50e2e7a1b37 100644 --- a/extensions/css-language-features/client/src/cssMain.ts +++ b/extensions/css-language-features/client/src/cssMain.ts @@ -27,7 +27,14 @@ export function activate(context: ExtensionContext) { debug: { module: serverModule, transport: TransportKind.ipc, options: debugOptions } }; - let documentSelector = ['css', 'scss', 'less']; + let documentSelector = [ + { language: 'css', scheme: 'file' }, + { language: 'css', scheme: 'untitled' }, + { language: 'scss', scheme: 'file' }, + { language: 'scss', scheme: 'untitled' }, + { language: 'less', scheme: 'file' }, + { language: 'less', scheme: 'untitled' }, + ]; // Options to control the language client let clientOptions: LanguageClientOptions = { diff --git a/extensions/html-language-features/client/src/htmlMain.ts b/extensions/html-language-features/client/src/htmlMain.ts index 9d32be2861f..bf8fa07af2b 100644 --- a/extensions/html-language-features/client/src/htmlMain.ts +++ b/extensions/html-language-features/client/src/htmlMain.ts @@ -47,7 +47,14 @@ export function activate(context: ExtensionContext) { debug: { module: serverModule, transport: TransportKind.ipc, options: debugOptions } }; - let documentSelector = ['html', 'handlebars', 'razor']; + let documentSelector = [ + { language: 'html', scheme: 'file' }, + { language: 'html', scheme: 'untitled' }, + { language: 'handlebars', scheme: 'file' }, + { language: 'handlebars', scheme: 'untitled' }, + { language: 'razor', scheme: 'file' }, + { language: 'razor', scheme: 'untitled' } + ]; let embeddedLanguages = { css: true, javascript: true }; // Options to control the language client diff --git a/extensions/html-language-features/server/src/htmlServerMain.ts b/extensions/html-language-features/server/src/htmlServerMain.ts index 7e9253c83e6..8c6babddedb 100644 --- a/extensions/html-language-features/server/src/htmlServerMain.ts +++ b/extensions/html-language-features/server/src/htmlServerMain.ts @@ -171,7 +171,12 @@ connection.onDidChangeConfiguration((change) => { let enableFormatter = globalSettings && globalSettings.html && globalSettings.html.format && globalSettings.html.format.enable; if (enableFormatter) { if (!formatterRegistration) { - let documentSelector: DocumentSelector = [{ language: 'html' }, { language: 'handlebars' }]; // don't register razor, the formatter does more harm than good + let documentSelector: DocumentSelector = [ + { language: 'html', scheme: 'file' }, + { language: 'html', scheme: 'untitled' }, + { language: 'handlebars', scheme: 'file' }, + { language: 'handlebars', scheme: 'untitled' } + ]; // don't register razor, the formatter does more harm than good formatterRegistration = connection.client.register(DocumentRangeFormattingRequest.type, { documentSelector }); } } else if (formatterRegistration) { From 2f86e30e96db4f7dc6db934973c92258bf6e388d Mon Sep 17 00:00:00 2001 From: Matt Bierner Date: Thu, 26 Apr 2018 10:54:34 -0700 Subject: [PATCH 145/830] Disable syntax based folding again by default for stable --- extensions/typescript-language-features/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/extensions/typescript-language-features/package.json b/extensions/typescript-language-features/package.json index 56ecdf7b32e..1c2df7ca398 100644 --- a/extensions/typescript-language-features/package.json +++ b/extensions/typescript-language-features/package.json @@ -411,7 +411,7 @@ }, "typescript.experimental.syntaxFolding": { "type": "boolean", - "default": true, + "default": false, "description": "%typescript.experimental.syntaxFolding%" }, "javascript.suggestionActions.enabled": { From 2864ccf67616861d6e55e8d367368b4827b57e26 Mon Sep 17 00:00:00 2001 From: Matt Bierner Date: Thu, 26 Apr 2018 11:03:17 -0700 Subject: [PATCH 146/830] Only register markdown for file and untitled schemes Fixes #48777 --- .../src/extension.ts | 20 ++++++++++--------- 1 file changed, 11 insertions(+), 9 deletions(-) diff --git a/extensions/markdown-language-features/src/extension.ts b/extensions/markdown-language-features/src/extension.ts index e260737797b..5312e4109bb 100644 --- a/extensions/markdown-language-features/src/extension.ts +++ b/extensions/markdown-language-features/src/extension.ts @@ -4,20 +4,19 @@ *--------------------------------------------------------------------------------------------*/ import * as vscode from 'vscode'; - -import { MarkdownEngine } from './markdownEngine'; -import { ExtensionContentSecurityPolicyArbiter, PreviewSecuritySelector } from './security'; -import { Logger } from './logger'; import { CommandManager } from './commandManager'; import * as commands from './commands/index'; -import { loadDefaultTelemetryReporter } from './telemetryReporter'; -import { getMarkdownExtensionContributions } from './markdownExtensions'; import LinkProvider from './features/documentLinkProvider'; import MDDocumentSymbolProvider from './features/documentSymbolProvider'; -import MarkdownWorkspaceSymbolProvider from './features/workspaceSymbolProvider'; +import MarkdownFoldingProvider from './features/foldingProvider'; import { MarkdownContentProvider } from './features/previewContentProvider'; import { MarkdownPreviewManager } from './features/previewManager'; -import MarkdownFoldingProvider from './features/foldingProvider'; +import MarkdownWorkspaceSymbolProvider from './features/workspaceSymbolProvider'; +import { Logger } from './logger'; +import { MarkdownEngine } from './markdownEngine'; +import { getMarkdownExtensionContributions } from './markdownExtensions'; +import { ExtensionContentSecurityPolicyArbiter, PreviewSecuritySelector } from './security'; +import { loadDefaultTelemetryReporter } from './telemetryReporter'; export function activate(context: vscode.ExtensionContext) { @@ -30,7 +29,10 @@ export function activate(context: vscode.ExtensionContext) { const engine = new MarkdownEngine(contributions); const logger = new Logger(); - const selector = 'markdown'; + const selector: vscode.DocumentSelector = [ + { language: 'markdown', scheme: 'file' }, + { language: 'markdown', scheme: 'untitled' } + ]; const contentProvider = new MarkdownContentProvider(engine, context, cspArbiter, contributions, logger); const symbolProvider = new MDDocumentSymbolProvider(engine); From 1ee636d5cab91224f3d2c9d802b42d5c7f64dfca Mon Sep 17 00:00:00 2001 From: Martin Aeschlimann Date: Thu, 26 Apr 2018 19:21:23 +0100 Subject: [PATCH 147/830] remove FoldingRangeProviderMetadata --- src/vs/vscode.d.ts | 13 +------------ 1 file changed, 1 insertion(+), 12 deletions(-) diff --git a/src/vs/vscode.d.ts b/src/vs/vscode.d.ts index aab2acc9a79..668c13ef6cc 100644 --- a/src/vs/vscode.d.ts +++ b/src/vs/vscode.d.ts @@ -3447,17 +3447,6 @@ declare module 'vscode' { public constructor(value: string); } - - /** - * Metadata about the kind of folding ranges that a [FoldingRangeProvider](#FoldingRangeProvider) providers uses. - */ - export interface FoldingRangeProviderMetadata { - /** - * [FoldingRangeKind](#FoldingRangeKind) that this provider may return. - */ - readonly providedFoldingRangeKinds?: ReadonlyArray; - } - /** * Folding context (for future use) */ @@ -6917,7 +6906,7 @@ declare module 'vscode' { * @param metadata Metadata about the kind of code actions the provider providers. * @return A [disposable](#Disposable) that unregisters this provider when being disposed. */ - export function registerFoldingRangeProvider(selector: DocumentSelector, provider: FoldingRangeProvider, metadata?: FoldingRangeProviderMetadata): Disposable; + export function registerFoldingRangeProvider(selector: DocumentSelector, provider: FoldingRangeProvider): Disposable; /** * Set a [language configuration](#LanguageConfiguration) for a language. From 0b8e0cca5e4c08239100db4174307cdedfd7a8fd Mon Sep 17 00:00:00 2001 From: Ramya Achutha Rao Date: Thu, 26 Apr 2018 11:22:21 -0700 Subject: [PATCH 148/830] Space next to search term in baked in extension viewlets Fixes #48725 --- .../parts/extensions/browser/extensionsActions.ts | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/vs/workbench/parts/extensions/browser/extensionsActions.ts b/src/vs/workbench/parts/extensions/browser/extensionsActions.ts index df3e59bcee6..8843a913dc1 100644 --- a/src/vs/workbench/parts/extensions/browser/extensionsActions.ts +++ b/src/vs/workbench/parts/extensions/browser/extensionsActions.ts @@ -985,7 +985,7 @@ export class ShowEnabledExtensionsAction extends Action { return this.viewletService.openViewlet(VIEWLET_ID, true) .then(viewlet => viewlet as IExtensionsViewlet) .then(viewlet => { - viewlet.search('@enabled'); + viewlet.search('@enabled '); viewlet.focus(); }); } @@ -1008,7 +1008,7 @@ export class ShowInstalledExtensionsAction extends Action { return this.viewletService.openViewlet(VIEWLET_ID, true) .then(viewlet => viewlet as IExtensionsViewlet) .then(viewlet => { - viewlet.search('@installed'); + viewlet.search('@installed '); viewlet.focus(); }); } @@ -1213,7 +1213,7 @@ export class InstallWorkspaceRecommendedExtensionsAction extends Action { return TPromise.as(null); } - viewlet.search('@recommended'); + viewlet.search('@recommended '); viewlet.focus(); return this.extensionsWorkbenchService.queryGallery({ names: toInstall, source: 'install-all-workspace-recommendations' }).then(pager => { @@ -1292,7 +1292,7 @@ export class InstallRecommendedExtensionAction extends Action { return TPromise.as(null); } - viewlet.search('@recommended'); + viewlet.search('@recommended '); viewlet.focus(); return this.extensionsWorkbenchService.queryGallery({ names: [this.extensionId], source: 'install-recommendation' }).then(pager => { From 0b634c4a8763a9e847e470c71fcd068ed93268a6 Mon Sep 17 00:00:00 2001 From: Ramya Achutha Rao Date: Thu, 26 Apr 2018 11:29:43 -0700 Subject: [PATCH 149/830] Use specific document filters for file and untitled --- extensions/emmet/src/extension.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/extensions/emmet/src/extension.ts b/extensions/emmet/src/extension.ts index 3079a1764fe..5bdb9338975 100644 --- a/extensions/emmet/src/extension.ts +++ b/extensions/emmet/src/extension.ts @@ -161,7 +161,7 @@ function registerCompletionProviders(context: vscode.ExtensionContext) { completionProvidersMapping.delete(language); } - const provider = vscode.languages.registerCompletionItemProvider(language, completionProvider, ...LANGUAGE_MODES[includedLanguages[language]]); + const provider = vscode.languages.registerCompletionItemProvider([{ language, scheme: 'file' }, { language, scheme: 'untitled' }], completionProvider, ...LANGUAGE_MODES[includedLanguages[language]]); context.subscriptions.push(provider); languageMappingForCompletionProviders.set(language, includedLanguages[language]); @@ -170,7 +170,7 @@ function registerCompletionProviders(context: vscode.ExtensionContext) { Object.keys(LANGUAGE_MODES).forEach(language => { if (!languageMappingForCompletionProviders.has(language)) { - const provider = vscode.languages.registerCompletionItemProvider(language, completionProvider, ...LANGUAGE_MODES[language]); + const provider = vscode.languages.registerCompletionItemProvider([{ language, scheme: 'file' }, { language, scheme: 'untitled' }], completionProvider, ...LANGUAGE_MODES[language]); context.subscriptions.push(provider); languageMappingForCompletionProviders.set(language, language); From 051b8b324372c4efa2b9739aaeaec963cf7449dc Mon Sep 17 00:00:00 2001 From: Matt Bierner Date: Thu, 26 Apr 2018 11:34:06 -0700 Subject: [PATCH 150/830] Remove old package lock file --- .../package-lock.json | 8463 ----------------- 1 file changed, 8463 deletions(-) delete mode 100644 extensions/markdown-language-features/package-lock.json diff --git a/extensions/markdown-language-features/package-lock.json b/extensions/markdown-language-features/package-lock.json deleted file mode 100644 index 0fbcd613c76..00000000000 --- a/extensions/markdown-language-features/package-lock.json +++ /dev/null @@ -1,8463 +0,0 @@ -{ - "name": "markdown-language-features", - "version": "1.0.0", - "lockfileVersion": 1, - "requires": true, - "dependencies": { - "@sindresorhus/is": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-0.7.0.tgz", - "integrity": "sha512-ONhaKPIufzzrlNbqtWFFd+jlnemX6lJAgq9ZeiZtS7I1PIf/la7CW4m83rTXRnVnsMbW2k56pGYu7AUFJD9Pow==", - "dev": true - }, - "acorn": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-5.5.0.tgz", - "integrity": "sha512-arn53F07VXmls4o4pUhSzBa4fvaagPRe7AVZ8l7NHxFWUie2DsuFSBMMNAkgzRlOhEhzAnxeKyaWVzOH4xqp/g==", - "dev": true - }, - "acorn-dynamic-import": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/acorn-dynamic-import/-/acorn-dynamic-import-3.0.0.tgz", - "integrity": "sha512-zVWV8Z8lislJoOKKqdNMOB+s6+XV5WERty8MnKBeFgwA+19XJjJHs2RP5dzM57FftIs+jQnRToLiWazKr6sSWg==", - "dev": true, - "requires": { - "acorn": "5.5.0" - } - }, - "ajv": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.2.1.tgz", - "integrity": "sha1-KKarxJOiq+D7TIUHrK7bQ/pVBnE=", - "dev": true, - "requires": { - "fast-deep-equal": "1.1.0", - "fast-json-stable-stringify": "2.0.0", - "json-schema-traverse": "0.3.1" - } - }, - "ajv-keywords": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.1.0.tgz", - "integrity": "sha1-rCsnk5xUPpXSwG5/f1wnvkqlQ74=", - "dev": true - }, - "ansi-escapes": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-3.0.0.tgz", - "integrity": "sha512-O/klc27mWNUigtv0F8NJWbLF00OcegQalkqKURWdosW08YZKi4m6CnSUSvIZG1otNJbTWhN01Hhz389DW7mvDQ==", - "dev": true - }, - "ansi-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", - "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", - "dev": true - }, - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "1.9.1" - } - }, - "any-observable": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/any-observable/-/any-observable-0.2.0.tgz", - "integrity": "sha1-xnhwBYADV5AJCD9UrAq6+1wz0kI=", - "dev": true - }, - "anymatch": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-2.0.0.tgz", - "integrity": "sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw==", - "dev": true, - "requires": { - "micromatch": "3.1.9", - "normalize-path": "2.1.1" - } - }, - "aproba": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/aproba/-/aproba-1.2.0.tgz", - "integrity": "sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==", - "dev": true - }, - "argv": { - "version": "0.0.2", - "resolved": "https://registry.npmjs.org/argv/-/argv-0.0.2.tgz", - "integrity": "sha1-7L0W+JSbFXGDcRsb2jNPN4QBhas=", - "dev": true - }, - "arr-diff": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz", - "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=", - "dev": true - }, - "arr-flatten": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/arr-flatten/-/arr-flatten-1.1.0.tgz", - "integrity": "sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg==", - "dev": true - }, - "arr-union": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/arr-union/-/arr-union-3.1.0.tgz", - "integrity": "sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ=", - "dev": true - }, - "array-differ": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/array-differ/-/array-differ-1.0.0.tgz", - "integrity": "sha1-7/UuN1gknTO+QCuLuOVkuytdQDE=", - "dev": true - }, - "array-union": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/array-union/-/array-union-1.0.2.tgz", - "integrity": "sha1-mjRBDk9OPaI96jdb5b5w8kd47Dk=", - "dev": true, - "requires": { - "array-uniq": "1.0.3" - } - }, - "array-uniq": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/array-uniq/-/array-uniq-1.0.3.tgz", - "integrity": "sha1-r2rId6Jcx/dOBYiUdThY39sk/bY=", - "dev": true - }, - "array-unique": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz", - "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=", - "dev": true - }, - "arrify": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz", - "integrity": "sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0=", - "dev": true - }, - "asn1": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.3.tgz", - "integrity": "sha1-2sh4dxPJlmhJ/IGAd36+nB3fO4Y=", - "dev": true - }, - "asn1.js": { - "version": "4.10.1", - "resolved": "https://registry.npmjs.org/asn1.js/-/asn1.js-4.10.1.tgz", - "integrity": "sha512-p32cOF5q0Zqs9uBiONKYLm6BClCoBCM5O9JfeUSlnQLBTxYdTK+pW+nXflm8UkKd2UYlEbYz5qEi0JuZR9ckSw==", - "dev": true, - "requires": { - "bn.js": "4.11.8", - "inherits": "2.0.3", - "minimalistic-assert": "1.0.0" - } - }, - "assert": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/assert/-/assert-1.4.1.tgz", - "integrity": "sha1-mZEtWRg2tab1s0XA8H7vwI/GXZE=", - "dev": true, - "requires": { - "util": "0.10.3" - } - }, - "assert-plus": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-0.2.0.tgz", - "integrity": "sha1-104bh+ev/A24qttwIfP+SBAasjQ=", - "dev": true - }, - "assign-symbols": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/assign-symbols/-/assign-symbols-1.0.0.tgz", - "integrity": "sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c=", - "dev": true - }, - "ast-types": { - "version": "0.10.1", - "resolved": "https://registry.npmjs.org/ast-types/-/ast-types-0.10.1.tgz", - "integrity": "sha512-UY7+9DPzlJ9VM8eY0b2TUZcZvF+1pO0hzMtAyjBYKhOmnvRlqYNYnWdtsMj0V16CGaMlpL0G1jnLbLo4AyotuQ==", - "dev": true - }, - "async": { - "version": "1.5.2", - "resolved": "https://registry.npmjs.org/async/-/async-1.5.2.tgz", - "integrity": "sha1-7GphrlZIDAw8skHJVhjiCJL5Zyo=", - "dev": true - }, - "async-each": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/async-each/-/async-each-1.0.1.tgz", - "integrity": "sha1-GdOGodntxufByF04iu28xW0zYC0=", - "dev": true - }, - "asynckit": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", - "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=", - "dev": true - }, - "atob": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/atob/-/atob-2.0.3.tgz", - "integrity": "sha1-GcenYEc3dEaPILLS0DNyrX1Mv10=", - "dev": true - }, - "aws-sign2": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.6.0.tgz", - "integrity": "sha1-FDQt0428yU0OW4fXY81jYSwOeU8=", - "dev": true - }, - "aws4": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.6.0.tgz", - "integrity": "sha1-g+9cqGCysy5KDe7e6MdxudtXRx4=", - "dev": true - }, - "babel-code-frame": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-code-frame/-/babel-code-frame-6.26.0.tgz", - "integrity": "sha1-Y/1D99weO7fONZR9uP42mj9Yx0s=", - "dev": true, - "requires": { - "chalk": "1.1.3", - "esutils": "2.0.2", - "js-tokens": "3.0.2" - }, - "dependencies": { - "ansi-regex": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", - "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", - "dev": true - }, - "ansi-styles": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", - "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", - "dev": true - }, - "chalk": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", - "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", - "dev": true, - "requires": { - "ansi-styles": "2.2.1", - "escape-string-regexp": "1.0.5", - "has-ansi": "2.0.0", - "strip-ansi": "3.0.1", - "supports-color": "2.0.0" - } - }, - "strip-ansi": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", - "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", - "dev": true, - "requires": { - "ansi-regex": "2.1.1" - } - }, - "supports-color": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", - "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", - "dev": true - } - } - }, - "babel-core": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-core/-/babel-core-6.26.0.tgz", - "integrity": "sha1-rzL3izGm/O8RnIew/Y2XU/A6C7g=", - "dev": true, - "requires": { - "babel-code-frame": "6.26.0", - "babel-generator": "6.26.1", - "babel-helpers": "6.24.1", - "babel-messages": "6.23.0", - "babel-register": "6.26.0", - "babel-runtime": "6.26.0", - "babel-template": "6.26.0", - "babel-traverse": "6.26.0", - "babel-types": "6.26.0", - "babylon": "6.18.0", - "convert-source-map": "1.5.1", - "debug": "2.6.9", - "json5": "0.5.1", - "lodash": "4.17.5", - "minimatch": "3.0.4", - "path-is-absolute": "1.0.1", - "private": "0.1.8", - "slash": "1.0.0", - "source-map": "0.5.7" - } - }, - "babel-generator": { - "version": "6.26.1", - "resolved": "https://registry.npmjs.org/babel-generator/-/babel-generator-6.26.1.tgz", - "integrity": "sha512-HyfwY6ApZj7BYTcJURpM5tznulaBvyio7/0d4zFOeMPUmfxkCjHocCuoLa2SAGzBI8AREcH3eP3758F672DppA==", - "dev": true, - "requires": { - "babel-messages": "6.23.0", - "babel-runtime": "6.26.0", - "babel-types": "6.26.0", - "detect-indent": "4.0.0", - "jsesc": "1.3.0", - "lodash": "4.17.5", - "source-map": "0.5.7", - "trim-right": "1.0.1" - }, - "dependencies": { - "jsesc": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-1.3.0.tgz", - "integrity": "sha1-RsP+yMGJKxKwgz25vHYiF226s0s=", - "dev": true - } - } - }, - "babel-helper-bindify-decorators": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-helper-bindify-decorators/-/babel-helper-bindify-decorators-6.24.1.tgz", - "integrity": "sha1-FMGeXxQte0fxmlJDHlKxzLxAozA=", - "dev": true, - "requires": { - "babel-runtime": "6.26.0", - "babel-traverse": "6.26.0", - "babel-types": "6.26.0" - } - }, - "babel-helper-builder-binary-assignment-operator-visitor": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-helper-builder-binary-assignment-operator-visitor/-/babel-helper-builder-binary-assignment-operator-visitor-6.24.1.tgz", - "integrity": "sha1-zORReto1b0IgvK6KAsKzRvmlZmQ=", - "dev": true, - "requires": { - "babel-helper-explode-assignable-expression": "6.24.1", - "babel-runtime": "6.26.0", - "babel-types": "6.26.0" - } - }, - "babel-helper-call-delegate": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-helper-call-delegate/-/babel-helper-call-delegate-6.24.1.tgz", - "integrity": "sha1-7Oaqzdx25Bw0YfiL/Fdb0Nqi340=", - "dev": true, - "requires": { - "babel-helper-hoist-variables": "6.24.1", - "babel-runtime": "6.26.0", - "babel-traverse": "6.26.0", - "babel-types": "6.26.0" - } - }, - "babel-helper-define-map": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-helper-define-map/-/babel-helper-define-map-6.26.0.tgz", - "integrity": "sha1-pfVtq0GiX5fstJjH66ypgZ+Vvl8=", - "dev": true, - "requires": { - "babel-helper-function-name": "6.24.1", - "babel-runtime": "6.26.0", - "babel-types": "6.26.0", - "lodash": "4.17.5" - } - }, - "babel-helper-explode-assignable-expression": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-helper-explode-assignable-expression/-/babel-helper-explode-assignable-expression-6.24.1.tgz", - "integrity": "sha1-8luCz33BBDPFX3BZLVdGQArCLKo=", - "dev": true, - "requires": { - "babel-runtime": "6.26.0", - "babel-traverse": "6.26.0", - "babel-types": "6.26.0" - } - }, - "babel-helper-explode-class": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-helper-explode-class/-/babel-helper-explode-class-6.24.1.tgz", - "integrity": "sha1-fcKjkQ3uAHBW4eMdZAztPVTqqes=", - "dev": true, - "requires": { - "babel-helper-bindify-decorators": "6.24.1", - "babel-runtime": "6.26.0", - "babel-traverse": "6.26.0", - "babel-types": "6.26.0" - } - }, - "babel-helper-function-name": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-helper-function-name/-/babel-helper-function-name-6.24.1.tgz", - "integrity": "sha1-00dbjAPtmCQqJbSDUasYOZ01gKk=", - "dev": true, - "requires": { - "babel-helper-get-function-arity": "6.24.1", - "babel-runtime": "6.26.0", - "babel-template": "6.26.0", - "babel-traverse": "6.26.0", - "babel-types": "6.26.0" - } - }, - "babel-helper-get-function-arity": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-helper-get-function-arity/-/babel-helper-get-function-arity-6.24.1.tgz", - "integrity": "sha1-j3eCqpNAfEHTqlCQj4mwMbG2hT0=", - "dev": true, - "requires": { - "babel-runtime": "6.26.0", - "babel-types": "6.26.0" - } - }, - "babel-helper-hoist-variables": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-helper-hoist-variables/-/babel-helper-hoist-variables-6.24.1.tgz", - "integrity": "sha1-HssnaJydJVE+rbyZFKc/VAi+enY=", - "dev": true, - "requires": { - "babel-runtime": "6.26.0", - "babel-types": "6.26.0" - } - }, - "babel-helper-optimise-call-expression": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-helper-optimise-call-expression/-/babel-helper-optimise-call-expression-6.24.1.tgz", - "integrity": "sha1-96E0J7qfc/j0+pk8VKl4gtEkQlc=", - "dev": true, - "requires": { - "babel-runtime": "6.26.0", - "babel-types": "6.26.0" - } - }, - "babel-helper-regex": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-helper-regex/-/babel-helper-regex-6.26.0.tgz", - "integrity": "sha1-MlxZ+QL4LyS3T6zu0DY5VPZJXnI=", - "dev": true, - "requires": { - "babel-runtime": "6.26.0", - "babel-types": "6.26.0", - "lodash": "4.17.5" - } - }, - "babel-helper-remap-async-to-generator": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-helper-remap-async-to-generator/-/babel-helper-remap-async-to-generator-6.24.1.tgz", - "integrity": "sha1-XsWBgnrXI/7N04HxySg5BnbkVRs=", - "dev": true, - "requires": { - "babel-helper-function-name": "6.24.1", - "babel-runtime": "6.26.0", - "babel-template": "6.26.0", - "babel-traverse": "6.26.0", - "babel-types": "6.26.0" - } - }, - "babel-helper-replace-supers": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-helper-replace-supers/-/babel-helper-replace-supers-6.24.1.tgz", - "integrity": "sha1-v22/5Dk40XNpohPKiov3S2qQqxo=", - "dev": true, - "requires": { - "babel-helper-optimise-call-expression": "6.24.1", - "babel-messages": "6.23.0", - "babel-runtime": "6.26.0", - "babel-template": "6.26.0", - "babel-traverse": "6.26.0", - "babel-types": "6.26.0" - } - }, - "babel-helpers": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-helpers/-/babel-helpers-6.24.1.tgz", - "integrity": "sha1-NHHenK7DiOXIUOWX5Yom3fN2ArI=", - "dev": true, - "requires": { - "babel-runtime": "6.26.0", - "babel-template": "6.26.0" - } - }, - "babel-messages": { - "version": "6.23.0", - "resolved": "https://registry.npmjs.org/babel-messages/-/babel-messages-6.23.0.tgz", - "integrity": "sha1-8830cDhYA1sqKVHG7F7fbGLyYw4=", - "dev": true, - "requires": { - "babel-runtime": "6.26.0" - } - }, - "babel-plugin-check-es2015-constants": { - "version": "6.22.0", - "resolved": "https://registry.npmjs.org/babel-plugin-check-es2015-constants/-/babel-plugin-check-es2015-constants-6.22.0.tgz", - "integrity": "sha1-NRV7EBQm/S/9PaP3XH0ekYNbv4o=", - "dev": true, - "requires": { - "babel-runtime": "6.26.0" - } - }, - "babel-plugin-syntax-async-functions": { - "version": "6.13.0", - "resolved": "https://registry.npmjs.org/babel-plugin-syntax-async-functions/-/babel-plugin-syntax-async-functions-6.13.0.tgz", - "integrity": "sha1-ytnK0RkbWtY0vzCuCHI5HgZHvpU=", - "dev": true - }, - "babel-plugin-syntax-async-generators": { - "version": "6.13.0", - "resolved": "https://registry.npmjs.org/babel-plugin-syntax-async-generators/-/babel-plugin-syntax-async-generators-6.13.0.tgz", - "integrity": "sha1-a8lj67FuzLrmuStZbrfzXDQqi5o=", - "dev": true - }, - "babel-plugin-syntax-class-constructor-call": { - "version": "6.18.0", - "resolved": "https://registry.npmjs.org/babel-plugin-syntax-class-constructor-call/-/babel-plugin-syntax-class-constructor-call-6.18.0.tgz", - "integrity": "sha1-nLnTn+Q8hgC+yBRkVt3L1OGnZBY=", - "dev": true - }, - "babel-plugin-syntax-class-properties": { - "version": "6.13.0", - "resolved": "https://registry.npmjs.org/babel-plugin-syntax-class-properties/-/babel-plugin-syntax-class-properties-6.13.0.tgz", - "integrity": "sha1-1+sjt5oxf4VDlixQW4J8fWysJ94=", - "dev": true - }, - "babel-plugin-syntax-decorators": { - "version": "6.13.0", - "resolved": "https://registry.npmjs.org/babel-plugin-syntax-decorators/-/babel-plugin-syntax-decorators-6.13.0.tgz", - "integrity": "sha1-MSVjtNvePMgGzuPkFszurd0RrAs=", - "dev": true - }, - "babel-plugin-syntax-dynamic-import": { - "version": "6.18.0", - "resolved": "https://registry.npmjs.org/babel-plugin-syntax-dynamic-import/-/babel-plugin-syntax-dynamic-import-6.18.0.tgz", - "integrity": "sha1-jWomIpyDdFqZgqRBBRVyyqF5sdo=", - "dev": true - }, - "babel-plugin-syntax-exponentiation-operator": { - "version": "6.13.0", - "resolved": "https://registry.npmjs.org/babel-plugin-syntax-exponentiation-operator/-/babel-plugin-syntax-exponentiation-operator-6.13.0.tgz", - "integrity": "sha1-nufoM3KQ2pUoggGmpX9BcDF4MN4=", - "dev": true - }, - "babel-plugin-syntax-export-extensions": { - "version": "6.13.0", - "resolved": "https://registry.npmjs.org/babel-plugin-syntax-export-extensions/-/babel-plugin-syntax-export-extensions-6.13.0.tgz", - "integrity": "sha1-cKFITw+QiaToStRLrDU8lbmxJyE=", - "dev": true - }, - "babel-plugin-syntax-flow": { - "version": "6.18.0", - "resolved": "https://registry.npmjs.org/babel-plugin-syntax-flow/-/babel-plugin-syntax-flow-6.18.0.tgz", - "integrity": "sha1-TDqyCiryaqIM0lmVw5jE63AxDI0=", - "dev": true - }, - "babel-plugin-syntax-object-rest-spread": { - "version": "6.13.0", - "resolved": "https://registry.npmjs.org/babel-plugin-syntax-object-rest-spread/-/babel-plugin-syntax-object-rest-spread-6.13.0.tgz", - "integrity": "sha1-/WU28rzhODb/o6VFjEkDpZe7O/U=", - "dev": true - }, - "babel-plugin-syntax-trailing-function-commas": { - "version": "6.22.0", - "resolved": "https://registry.npmjs.org/babel-plugin-syntax-trailing-function-commas/-/babel-plugin-syntax-trailing-function-commas-6.22.0.tgz", - "integrity": "sha1-ugNgk3+NBuQBgKQ/4NVhb/9TLPM=", - "dev": true - }, - "babel-plugin-transform-async-generator-functions": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-async-generator-functions/-/babel-plugin-transform-async-generator-functions-6.24.1.tgz", - "integrity": "sha1-8FiQAUX9PpkHpt3yjaWfIVJYpds=", - "dev": true, - "requires": { - "babel-helper-remap-async-to-generator": "6.24.1", - "babel-plugin-syntax-async-generators": "6.13.0", - "babel-runtime": "6.26.0" - } - }, - "babel-plugin-transform-async-to-generator": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-async-to-generator/-/babel-plugin-transform-async-to-generator-6.24.1.tgz", - "integrity": "sha1-ZTbjeK/2yx1VF6wOQOs+n8jQh2E=", - "dev": true, - "requires": { - "babel-helper-remap-async-to-generator": "6.24.1", - "babel-plugin-syntax-async-functions": "6.13.0", - "babel-runtime": "6.26.0" - } - }, - "babel-plugin-transform-class-constructor-call": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-class-constructor-call/-/babel-plugin-transform-class-constructor-call-6.24.1.tgz", - "integrity": "sha1-gNwoVQWsBn3LjWxl4vbxGrd2Xvk=", - "dev": true, - "requires": { - "babel-plugin-syntax-class-constructor-call": "6.18.0", - "babel-runtime": "6.26.0", - "babel-template": "6.26.0" - } - }, - "babel-plugin-transform-class-properties": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-class-properties/-/babel-plugin-transform-class-properties-6.24.1.tgz", - "integrity": "sha1-anl2PqYdM9NvN7YRqp3vgagbRqw=", - "dev": true, - "requires": { - "babel-helper-function-name": "6.24.1", - "babel-plugin-syntax-class-properties": "6.13.0", - "babel-runtime": "6.26.0", - "babel-template": "6.26.0" - } - }, - "babel-plugin-transform-decorators": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-decorators/-/babel-plugin-transform-decorators-6.24.1.tgz", - "integrity": "sha1-eIAT2PjGtSIr33s0Q5Df13Vp4k0=", - "dev": true, - "requires": { - "babel-helper-explode-class": "6.24.1", - "babel-plugin-syntax-decorators": "6.13.0", - "babel-runtime": "6.26.0", - "babel-template": "6.26.0", - "babel-types": "6.26.0" - } - }, - "babel-plugin-transform-es2015-arrow-functions": { - "version": "6.22.0", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-arrow-functions/-/babel-plugin-transform-es2015-arrow-functions-6.22.0.tgz", - "integrity": "sha1-RSaSy3EdX3ncf4XkQM5BufJE0iE=", - "dev": true, - "requires": { - "babel-runtime": "6.26.0" - } - }, - "babel-plugin-transform-es2015-block-scoped-functions": { - "version": "6.22.0", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-block-scoped-functions/-/babel-plugin-transform-es2015-block-scoped-functions-6.22.0.tgz", - "integrity": "sha1-u8UbSflk1wy42OC5ToICRs46YUE=", - "dev": true, - "requires": { - "babel-runtime": "6.26.0" - } - }, - "babel-plugin-transform-es2015-block-scoping": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-block-scoping/-/babel-plugin-transform-es2015-block-scoping-6.26.0.tgz", - "integrity": "sha1-1w9SmcEwjQXBL0Y4E7CgnnOxiV8=", - "dev": true, - "requires": { - "babel-runtime": "6.26.0", - "babel-template": "6.26.0", - "babel-traverse": "6.26.0", - "babel-types": "6.26.0", - "lodash": "4.17.5" - } - }, - "babel-plugin-transform-es2015-classes": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-classes/-/babel-plugin-transform-es2015-classes-6.24.1.tgz", - "integrity": "sha1-WkxYpQyclGHlZLSyo7+ryXolhNs=", - "dev": true, - "requires": { - "babel-helper-define-map": "6.26.0", - "babel-helper-function-name": "6.24.1", - "babel-helper-optimise-call-expression": "6.24.1", - "babel-helper-replace-supers": "6.24.1", - "babel-messages": "6.23.0", - "babel-runtime": "6.26.0", - "babel-template": "6.26.0", - "babel-traverse": "6.26.0", - "babel-types": "6.26.0" - } - }, - "babel-plugin-transform-es2015-computed-properties": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-computed-properties/-/babel-plugin-transform-es2015-computed-properties-6.24.1.tgz", - "integrity": "sha1-b+Ko0WiV1WNPTNmZttNICjCBWbM=", - "dev": true, - "requires": { - "babel-runtime": "6.26.0", - "babel-template": "6.26.0" - } - }, - "babel-plugin-transform-es2015-destructuring": { - "version": "6.23.0", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-destructuring/-/babel-plugin-transform-es2015-destructuring-6.23.0.tgz", - "integrity": "sha1-mXux8auWf2gtKwh2/jWNYOdlxW0=", - "dev": true, - "requires": { - "babel-runtime": "6.26.0" - } - }, - "babel-plugin-transform-es2015-duplicate-keys": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-duplicate-keys/-/babel-plugin-transform-es2015-duplicate-keys-6.24.1.tgz", - "integrity": "sha1-c+s9MQypaePvnskcU3QabxV2Qj4=", - "dev": true, - "requires": { - "babel-runtime": "6.26.0", - "babel-types": "6.26.0" - } - }, - "babel-plugin-transform-es2015-for-of": { - "version": "6.23.0", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-for-of/-/babel-plugin-transform-es2015-for-of-6.23.0.tgz", - "integrity": "sha1-9HyVsrYT3x0+zC/bdXNiPHUkhpE=", - "dev": true, - "requires": { - "babel-runtime": "6.26.0" - } - }, - "babel-plugin-transform-es2015-function-name": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-function-name/-/babel-plugin-transform-es2015-function-name-6.24.1.tgz", - "integrity": "sha1-g0yJhTvDaxrw86TF26qU/Y6sqos=", - "dev": true, - "requires": { - "babel-helper-function-name": "6.24.1", - "babel-runtime": "6.26.0", - "babel-types": "6.26.0" - } - }, - "babel-plugin-transform-es2015-literals": { - "version": "6.22.0", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-literals/-/babel-plugin-transform-es2015-literals-6.22.0.tgz", - "integrity": "sha1-T1SgLWzWbPkVKAAZox0xklN3yi4=", - "dev": true, - "requires": { - "babel-runtime": "6.26.0" - } - }, - "babel-plugin-transform-es2015-modules-amd": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-modules-amd/-/babel-plugin-transform-es2015-modules-amd-6.24.1.tgz", - "integrity": "sha1-Oz5UAXI5hC1tGcMBHEvS8AoA0VQ=", - "dev": true, - "requires": { - "babel-plugin-transform-es2015-modules-commonjs": "6.26.0", - "babel-runtime": "6.26.0", - "babel-template": "6.26.0" - } - }, - "babel-plugin-transform-es2015-modules-commonjs": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-modules-commonjs/-/babel-plugin-transform-es2015-modules-commonjs-6.26.0.tgz", - "integrity": "sha1-DYOUApt9xqvhqX7xgeAHWN0uXYo=", - "dev": true, - "requires": { - "babel-plugin-transform-strict-mode": "6.24.1", - "babel-runtime": "6.26.0", - "babel-template": "6.26.0", - "babel-types": "6.26.0" - } - }, - "babel-plugin-transform-es2015-modules-systemjs": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-modules-systemjs/-/babel-plugin-transform-es2015-modules-systemjs-6.24.1.tgz", - "integrity": "sha1-/4mhQrkRmpBhlfXxBuzzBdlAfSM=", - "dev": true, - "requires": { - "babel-helper-hoist-variables": "6.24.1", - "babel-runtime": "6.26.0", - "babel-template": "6.26.0" - } - }, - "babel-plugin-transform-es2015-modules-umd": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-modules-umd/-/babel-plugin-transform-es2015-modules-umd-6.24.1.tgz", - "integrity": "sha1-rJl+YoXNGO1hdq22B9YCNErThGg=", - "dev": true, - "requires": { - "babel-plugin-transform-es2015-modules-amd": "6.24.1", - "babel-runtime": "6.26.0", - "babel-template": "6.26.0" - } - }, - "babel-plugin-transform-es2015-object-super": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-object-super/-/babel-plugin-transform-es2015-object-super-6.24.1.tgz", - "integrity": "sha1-JM72muIcuDp/hgPa0CH1cusnj40=", - "dev": true, - "requires": { - "babel-helper-replace-supers": "6.24.1", - "babel-runtime": "6.26.0" - } - }, - "babel-plugin-transform-es2015-parameters": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-parameters/-/babel-plugin-transform-es2015-parameters-6.24.1.tgz", - "integrity": "sha1-V6w1GrScrxSpfNE7CfZv3wpiXys=", - "dev": true, - "requires": { - "babel-helper-call-delegate": "6.24.1", - "babel-helper-get-function-arity": "6.24.1", - "babel-runtime": "6.26.0", - "babel-template": "6.26.0", - "babel-traverse": "6.26.0", - "babel-types": "6.26.0" - } - }, - "babel-plugin-transform-es2015-shorthand-properties": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-shorthand-properties/-/babel-plugin-transform-es2015-shorthand-properties-6.24.1.tgz", - "integrity": "sha1-JPh11nIch2YbvZmkYi5R8U3jiqA=", - "dev": true, - "requires": { - "babel-runtime": "6.26.0", - "babel-types": "6.26.0" - } - }, - "babel-plugin-transform-es2015-spread": { - "version": "6.22.0", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-spread/-/babel-plugin-transform-es2015-spread-6.22.0.tgz", - "integrity": "sha1-1taKmfia7cRTbIGlQujdnxdG+NE=", - "dev": true, - "requires": { - "babel-runtime": "6.26.0" - } - }, - "babel-plugin-transform-es2015-sticky-regex": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-sticky-regex/-/babel-plugin-transform-es2015-sticky-regex-6.24.1.tgz", - "integrity": "sha1-AMHNsaynERLN8M9hJsLta0V8zbw=", - "dev": true, - "requires": { - "babel-helper-regex": "6.26.0", - "babel-runtime": "6.26.0", - "babel-types": "6.26.0" - } - }, - "babel-plugin-transform-es2015-template-literals": { - "version": "6.22.0", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-template-literals/-/babel-plugin-transform-es2015-template-literals-6.22.0.tgz", - "integrity": "sha1-qEs0UPfp+PH2g51taH2oS7EjbY0=", - "dev": true, - "requires": { - "babel-runtime": "6.26.0" - } - }, - "babel-plugin-transform-es2015-typeof-symbol": { - "version": "6.23.0", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-typeof-symbol/-/babel-plugin-transform-es2015-typeof-symbol-6.23.0.tgz", - "integrity": "sha1-3sCfHN3/lLUqxz1QXITfWdzOs3I=", - "dev": true, - "requires": { - "babel-runtime": "6.26.0" - } - }, - "babel-plugin-transform-es2015-unicode-regex": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-unicode-regex/-/babel-plugin-transform-es2015-unicode-regex-6.24.1.tgz", - "integrity": "sha1-04sS9C6nMj9yk4fxinxa4frrNek=", - "dev": true, - "requires": { - "babel-helper-regex": "6.26.0", - "babel-runtime": "6.26.0", - "regexpu-core": "2.0.0" - } - }, - "babel-plugin-transform-exponentiation-operator": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-exponentiation-operator/-/babel-plugin-transform-exponentiation-operator-6.24.1.tgz", - "integrity": "sha1-KrDJx/MJj6SJB3cruBP+QejeOg4=", - "dev": true, - "requires": { - "babel-helper-builder-binary-assignment-operator-visitor": "6.24.1", - "babel-plugin-syntax-exponentiation-operator": "6.13.0", - "babel-runtime": "6.26.0" - } - }, - "babel-plugin-transform-export-extensions": { - "version": "6.22.0", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-export-extensions/-/babel-plugin-transform-export-extensions-6.22.0.tgz", - "integrity": "sha1-U3OLR+deghhYnuqUbLvTkQm75lM=", - "dev": true, - "requires": { - "babel-plugin-syntax-export-extensions": "6.13.0", - "babel-runtime": "6.26.0" - } - }, - "babel-plugin-transform-flow-strip-types": { - "version": "6.22.0", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-flow-strip-types/-/babel-plugin-transform-flow-strip-types-6.22.0.tgz", - "integrity": "sha1-hMtnKTXUNxT9wyvOhFaNh0Qc988=", - "dev": true, - "requires": { - "babel-plugin-syntax-flow": "6.18.0", - "babel-runtime": "6.26.0" - } - }, - "babel-plugin-transform-object-rest-spread": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-object-rest-spread/-/babel-plugin-transform-object-rest-spread-6.26.0.tgz", - "integrity": "sha1-DzZpLVD+9rfi1LOsFHgTepY7ewY=", - "dev": true, - "requires": { - "babel-plugin-syntax-object-rest-spread": "6.13.0", - "babel-runtime": "6.26.0" - } - }, - "babel-plugin-transform-regenerator": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-regenerator/-/babel-plugin-transform-regenerator-6.26.0.tgz", - "integrity": "sha1-4HA2lvveJ/Cj78rPi03KL3s6jy8=", - "dev": true, - "requires": { - "regenerator-transform": "0.10.1" - } - }, - "babel-plugin-transform-strict-mode": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-strict-mode/-/babel-plugin-transform-strict-mode-6.24.1.tgz", - "integrity": "sha1-1fr3qleKZbvlkc9e2uBKDGcCB1g=", - "dev": true, - "requires": { - "babel-runtime": "6.26.0", - "babel-types": "6.26.0" - } - }, - "babel-preset-es2015": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-preset-es2015/-/babel-preset-es2015-6.24.1.tgz", - "integrity": "sha1-1EBQ1rwsn+6nAqrzjXJ6AhBTiTk=", - "dev": true, - "requires": { - "babel-plugin-check-es2015-constants": "6.22.0", - "babel-plugin-transform-es2015-arrow-functions": "6.22.0", - "babel-plugin-transform-es2015-block-scoped-functions": "6.22.0", - "babel-plugin-transform-es2015-block-scoping": "6.26.0", - "babel-plugin-transform-es2015-classes": "6.24.1", - "babel-plugin-transform-es2015-computed-properties": "6.24.1", - "babel-plugin-transform-es2015-destructuring": "6.23.0", - "babel-plugin-transform-es2015-duplicate-keys": "6.24.1", - "babel-plugin-transform-es2015-for-of": "6.23.0", - "babel-plugin-transform-es2015-function-name": "6.24.1", - "babel-plugin-transform-es2015-literals": "6.22.0", - "babel-plugin-transform-es2015-modules-amd": "6.24.1", - "babel-plugin-transform-es2015-modules-commonjs": "6.26.0", - "babel-plugin-transform-es2015-modules-systemjs": "6.24.1", - "babel-plugin-transform-es2015-modules-umd": "6.24.1", - "babel-plugin-transform-es2015-object-super": "6.24.1", - "babel-plugin-transform-es2015-parameters": "6.24.1", - "babel-plugin-transform-es2015-shorthand-properties": "6.24.1", - "babel-plugin-transform-es2015-spread": "6.22.0", - "babel-plugin-transform-es2015-sticky-regex": "6.24.1", - "babel-plugin-transform-es2015-template-literals": "6.22.0", - "babel-plugin-transform-es2015-typeof-symbol": "6.23.0", - "babel-plugin-transform-es2015-unicode-regex": "6.24.1", - "babel-plugin-transform-regenerator": "6.26.0" - } - }, - "babel-preset-stage-1": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-preset-stage-1/-/babel-preset-stage-1-6.24.1.tgz", - "integrity": "sha1-dpLNfc1oSZB+auSgqFWJz7niv7A=", - "dev": true, - "requires": { - "babel-plugin-transform-class-constructor-call": "6.24.1", - "babel-plugin-transform-export-extensions": "6.22.0", - "babel-preset-stage-2": "6.24.1" - } - }, - "babel-preset-stage-2": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-preset-stage-2/-/babel-preset-stage-2-6.24.1.tgz", - "integrity": "sha1-2eKWD7PXEYfw5k7sYrwHdnIZvcE=", - "dev": true, - "requires": { - "babel-plugin-syntax-dynamic-import": "6.18.0", - "babel-plugin-transform-class-properties": "6.24.1", - "babel-plugin-transform-decorators": "6.24.1", - "babel-preset-stage-3": "6.24.1" - } - }, - "babel-preset-stage-3": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-preset-stage-3/-/babel-preset-stage-3-6.24.1.tgz", - "integrity": "sha1-g2raCp56f6N8sTj7kyb4eTSkg5U=", - "dev": true, - "requires": { - "babel-plugin-syntax-trailing-function-commas": "6.22.0", - "babel-plugin-transform-async-generator-functions": "6.24.1", - "babel-plugin-transform-async-to-generator": "6.24.1", - "babel-plugin-transform-exponentiation-operator": "6.24.1", - "babel-plugin-transform-object-rest-spread": "6.26.0" - } - }, - "babel-register": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-register/-/babel-register-6.26.0.tgz", - "integrity": "sha1-btAhFz4vy0htestFxgCahW9kcHE=", - "dev": true, - "requires": { - "babel-core": "6.26.0", - "babel-runtime": "6.26.0", - "core-js": "2.5.3", - "home-or-tmp": "2.0.0", - "lodash": "4.17.5", - "mkdirp": "0.5.1", - "source-map-support": "0.4.18" - } - }, - "babel-runtime": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.26.0.tgz", - "integrity": "sha1-llxwWGaOgrVde/4E/yM3vItWR/4=", - "dev": true, - "requires": { - "core-js": "2.5.3", - "regenerator-runtime": "0.11.1" - } - }, - "babel-template": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-template/-/babel-template-6.26.0.tgz", - "integrity": "sha1-3gPi0WOWsGn0bdn/+FIfsaDjXgI=", - "dev": true, - "requires": { - "babel-runtime": "6.26.0", - "babel-traverse": "6.26.0", - "babel-types": "6.26.0", - "babylon": "6.18.0", - "lodash": "4.17.5" - } - }, - "babel-traverse": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-traverse/-/babel-traverse-6.26.0.tgz", - "integrity": "sha1-RqnL1+3MYsjlwGTi0tjQ9ANXZu4=", - "dev": true, - "requires": { - "babel-code-frame": "6.26.0", - "babel-messages": "6.23.0", - "babel-runtime": "6.26.0", - "babel-types": "6.26.0", - "babylon": "6.18.0", - "debug": "2.6.9", - "globals": "9.18.0", - "invariant": "2.2.3", - "lodash": "4.17.5" - } - }, - "babel-types": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-types/-/babel-types-6.26.0.tgz", - "integrity": "sha1-o7Bz+Uq0nrb6Vc1lInozQ4BjJJc=", - "dev": true, - "requires": { - "babel-runtime": "6.26.0", - "esutils": "2.0.2", - "lodash": "4.17.5", - "to-fast-properties": "1.0.3" - } - }, - "babylon": { - "version": "6.18.0", - "resolved": "https://registry.npmjs.org/babylon/-/babylon-6.18.0.tgz", - "integrity": "sha512-q/UEjfGJ2Cm3oKV71DJz9d25TPnq5rhBVL2Q4fA5wcC3jcrdn7+SssEybFIxwAvvP+YCsCYNKughoF33GxgycQ==", - "dev": true - }, - "balanced-match": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", - "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", - "dev": true - }, - "base": { - "version": "0.11.2", - "resolved": "https://registry.npmjs.org/base/-/base-0.11.2.tgz", - "integrity": "sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg==", - "dev": true, - "requires": { - "cache-base": "1.0.1", - "class-utils": "0.3.6", - "component-emitter": "1.2.1", - "define-property": "1.0.0", - "isobject": "3.0.1", - "mixin-deep": "1.3.1", - "pascalcase": "0.1.1" - }, - "dependencies": { - "define-property": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", - "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", - "dev": true, - "requires": { - "is-descriptor": "1.0.2" - } - } - } - }, - "base64-js": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.2.3.tgz", - "integrity": "sha512-MsAhsUW1GxCdgYSO6tAfZrNapmUKk7mWx/k5mFY/A1gBtkaCaNapTg+FExCw1r9yeaZhqx/xPg43xgTFH6KL5w==", - "dev": true - }, - "bcrypt-pbkdf": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.1.tgz", - "integrity": "sha1-Y7xdy2EzG5K8Bf1SiVPDNGKgb40=", - "dev": true, - "optional": true, - "requires": { - "tweetnacl": "0.14.5" - } - }, - "big.js": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/big.js/-/big.js-3.2.0.tgz", - "integrity": "sha512-+hN/Zh2D08Mx65pZ/4g5bsmNiZUuChDiQfTUQ7qJr4/kuopCr88xZsAXv6mBoZEsUI4OuGHlX59qE94K2mMW8Q==", - "dev": true - }, - "binary-extensions": { - "version": "1.11.0", - "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-1.11.0.tgz", - "integrity": "sha1-RqoXUftqL5PuXmibsQh9SxTGwgU=", - "dev": true - }, - "binaryextensions": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/binaryextensions/-/binaryextensions-2.1.1.tgz", - "integrity": "sha512-XBaoWE9RW8pPdPQNibZsW2zh8TW6gcarXp1FZPwT8Uop8ScSNldJEWf2k9l3HeTqdrEwsOsFcq74RiJECW34yA==", - "dev": true - }, - "bluebird": { - "version": "3.5.1", - "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.5.1.tgz", - "integrity": "sha512-MKiLiV+I1AA596t9w1sQJ8jkiSr5+ZKi0WKrYGUn6d1Fx+Ij4tIj+m2WMQSGczs5jZVxV339chE8iwk6F64wjA==", - "dev": true - }, - "bn.js": { - "version": "4.11.8", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.8.tgz", - "integrity": "sha512-ItfYfPLkWHUjckQCk8xC+LwxgK8NYcXywGigJgSwOP8Y2iyWT4f2vsZnoOXTTbo+o5yXmIUJ4gn5538SO5S3gA==", - "dev": true - }, - "boom": { - "version": "2.10.1", - "resolved": "https://registry.npmjs.org/boom/-/boom-2.10.1.tgz", - "integrity": "sha1-OciRjO/1eZ+D+UkqhI9iWt0Mdm8=", - "dev": true, - "requires": { - "hoek": "2.16.3" - } - }, - "brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "dev": true, - "requires": { - "balanced-match": "1.0.0", - "concat-map": "0.0.1" - } - }, - "braces": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.1.tgz", - "integrity": "sha512-SO5lYHA3vO6gz66erVvedSCkp7AKWdv6VcQ2N4ysXfPxdAlxAMMAdwegGGcv1Bqwm7naF1hNdk5d6AAIEHV2nQ==", - "dev": true, - "requires": { - "arr-flatten": "1.1.0", - "array-unique": "0.3.2", - "define-property": "1.0.0", - "extend-shallow": "2.0.1", - "fill-range": "4.0.0", - "isobject": "3.0.1", - "kind-of": "6.0.2", - "repeat-element": "1.1.2", - "snapdragon": "0.8.1", - "snapdragon-node": "2.1.1", - "split-string": "3.1.0", - "to-regex": "3.0.2" - }, - "dependencies": { - "define-property": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", - "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", - "dev": true, - "requires": { - "is-descriptor": "1.0.2" - } - }, - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "requires": { - "is-extendable": "0.1.1" - } - } - } - }, - "brorand": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/brorand/-/brorand-1.1.0.tgz", - "integrity": "sha1-EsJe/kCkXjwyPrhnWgoM5XsiNx8=", - "dev": true - }, - "browserify-aes": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/browserify-aes/-/browserify-aes-1.1.1.tgz", - "integrity": "sha512-UGnTYAnB2a3YuYKIRy1/4FB2HdM866E0qC46JXvVTYKlBlZlnvfpSfY6OKfXZAkv70eJ2a1SqzpAo5CRhZGDFg==", - "dev": true, - "requires": { - "buffer-xor": "1.0.3", - "cipher-base": "1.0.4", - "create-hash": "1.1.3", - "evp_bytestokey": "1.0.3", - "inherits": "2.0.3", - "safe-buffer": "5.1.1" - } - }, - "browserify-cipher": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/browserify-cipher/-/browserify-cipher-1.0.0.tgz", - "integrity": "sha1-mYgkSHS/XtTijalWZtzWasj8Njo=", - "dev": true, - "requires": { - "browserify-aes": "1.1.1", - "browserify-des": "1.0.0", - "evp_bytestokey": "1.0.3" - } - }, - "browserify-des": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/browserify-des/-/browserify-des-1.0.0.tgz", - "integrity": "sha1-2qJ3cXRwki7S/hhZQRihdUOXId0=", - "dev": true, - "requires": { - "cipher-base": "1.0.4", - "des.js": "1.0.0", - "inherits": "2.0.3" - } - }, - "browserify-rsa": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/browserify-rsa/-/browserify-rsa-4.0.1.tgz", - "integrity": "sha1-IeCr+vbyApzy+vsTNWenAdQTVSQ=", - "dev": true, - "requires": { - "bn.js": "4.11.8", - "randombytes": "2.0.6" - } - }, - "browserify-sign": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/browserify-sign/-/browserify-sign-4.0.4.tgz", - "integrity": "sha1-qk62jl17ZYuqa/alfmMMvXqT0pg=", - "dev": true, - "requires": { - "bn.js": "4.11.8", - "browserify-rsa": "4.0.1", - "create-hash": "1.1.3", - "create-hmac": "1.1.6", - "elliptic": "6.4.0", - "inherits": "2.0.3", - "parse-asn1": "5.1.0" - } - }, - "browserify-zlib": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/browserify-zlib/-/browserify-zlib-0.2.0.tgz", - "integrity": "sha512-Z942RysHXmJrhqk88FmKBVq/v5tqmSkDz7p54G/MGyjMnCFFnC79XWNbg+Vta8W6Wb2qtSZTSxIGkJrRpCFEiA==", - "dev": true, - "requires": { - "pako": "1.0.6" - } - }, - "buffer": { - "version": "4.9.1", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-4.9.1.tgz", - "integrity": "sha1-bRu2AbB6TvztlwlBMgkwJ8lbwpg=", - "dev": true, - "requires": { - "base64-js": "1.2.3", - "ieee754": "1.1.8", - "isarray": "1.0.0" - } - }, - "buffer-xor": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/buffer-xor/-/buffer-xor-1.0.3.tgz", - "integrity": "sha1-JuYe0UIvtw3ULm42cp7VHYVf6Nk=", - "dev": true - }, - "builtin-modules": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-1.1.1.tgz", - "integrity": "sha1-Jw8HbFpywC9bZaR9+Uxf46J4iS8=", - "dev": true - }, - "builtin-status-codes": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/builtin-status-codes/-/builtin-status-codes-3.0.0.tgz", - "integrity": "sha1-hZgoeOIbmOHGZCXgPQF0eI9Wnug=", - "dev": true - }, - "cacache": { - "version": "10.0.4", - "resolved": "https://registry.npmjs.org/cacache/-/cacache-10.0.4.tgz", - "integrity": "sha512-Dph0MzuH+rTQzGPNT9fAnrPmMmjKfST6trxJeK7NQuHRaVw24VzPRWTmg9MpcwOVQZO0E1FBICUlFeNaKPIfHA==", - "dev": true, - "requires": { - "bluebird": "3.5.1", - "chownr": "1.0.1", - "glob": "7.1.2", - "graceful-fs": "4.1.11", - "lru-cache": "4.1.1", - "mississippi": "2.0.0", - "mkdirp": "0.5.1", - "move-concurrently": "1.0.1", - "promise-inflight": "1.0.1", - "rimraf": "2.6.2", - "ssri": "5.2.4", - "unique-filename": "1.1.0", - "y18n": "4.0.0" - } - }, - "cache-base": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/cache-base/-/cache-base-1.0.1.tgz", - "integrity": "sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ==", - "dev": true, - "requires": { - "collection-visit": "1.0.0", - "component-emitter": "1.2.1", - "get-value": "2.0.6", - "has-value": "1.0.0", - "isobject": "3.0.1", - "set-value": "2.0.0", - "to-object-path": "0.3.0", - "union-value": "1.0.0", - "unset-value": "1.0.0" - } - }, - "cacheable-request": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-2.1.4.tgz", - "integrity": "sha1-DYCIAbY0KtM8kd+dC0TcCbkeXD0=", - "dev": true, - "requires": { - "clone-response": "1.0.2", - "get-stream": "3.0.0", - "http-cache-semantics": "3.8.1", - "keyv": "3.0.0", - "lowercase-keys": "1.0.0", - "normalize-url": "2.0.1", - "responselike": "1.0.2" - } - }, - "camelcase": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-4.1.0.tgz", - "integrity": "sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0=", - "dev": true - }, - "caseless": { - "version": "0.12.0", - "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", - "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=", - "dev": true - }, - "chalk": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.3.2.tgz", - "integrity": "sha512-ZM4j2/ld/YZDc3Ma8PgN7gyAk+kHMMMyzLNryCPGhWrsfAuDVeuid5bpRFTDgMH9JBK2lA4dyyAkkZYF/WcqDQ==", - "dev": true, - "requires": { - "ansi-styles": "3.2.1", - "escape-string-regexp": "1.0.5", - "supports-color": "5.3.0" - } - }, - "chardet": { - "version": "0.4.2", - "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.4.2.tgz", - "integrity": "sha1-tUc7M9yXxCTl2Y3IfVXU2KKci/I=", - "dev": true - }, - "chokidar": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-2.0.2.tgz", - "integrity": "sha512-l32Hw3wqB0L2kGVmSbK/a+xXLDrUEsc84pSgMkmwygHvD7ubRsP/vxxHa5BtB6oix1XLLVCHyYMsckRXxThmZw==", - "dev": true, - "requires": { - "anymatch": "2.0.0", - "async-each": "1.0.1", - "braces": "2.3.1", - "fsevents": "1.1.3", - "glob-parent": "3.1.0", - "inherits": "2.0.3", - "is-binary-path": "1.0.1", - "is-glob": "4.0.0", - "normalize-path": "2.1.1", - "path-is-absolute": "1.0.1", - "readdirp": "2.1.0", - "upath": "1.0.4" - } - }, - "chownr": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.0.1.tgz", - "integrity": "sha1-4qdQQqlVGQi+vSW4Uj1fl2nXkYE=", - "dev": true - }, - "chrome-trace-event": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-0.1.2.tgz", - "integrity": "sha1-kPNohdU0WlBiEzLwcXtZWIPV2YI=", - "dev": true - }, - "cipher-base": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/cipher-base/-/cipher-base-1.0.4.tgz", - "integrity": "sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q==", - "dev": true, - "requires": { - "inherits": "2.0.3", - "safe-buffer": "5.1.1" - } - }, - "class-utils": { - "version": "0.3.6", - "resolved": "https://registry.npmjs.org/class-utils/-/class-utils-0.3.6.tgz", - "integrity": "sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg==", - "dev": true, - "requires": { - "arr-union": "3.1.0", - "define-property": "0.2.5", - "isobject": "3.0.1", - "static-extend": "0.1.2" - }, - "dependencies": { - "define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "dev": true, - "requires": { - "is-descriptor": "0.1.6" - } - }, - "is-accessor-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", - "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", - "dev": true, - "requires": { - "kind-of": "3.2.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "1.1.6" - } - } - } - }, - "is-data-descriptor": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", - "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", - "dev": true, - "requires": { - "kind-of": "3.2.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "1.1.6" - } - } - } - }, - "is-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", - "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", - "dev": true, - "requires": { - "is-accessor-descriptor": "0.1.6", - "is-data-descriptor": "0.1.4", - "kind-of": "5.1.0" - } - }, - "kind-of": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", - "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", - "dev": true - } - } - }, - "cli-cursor": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-2.1.0.tgz", - "integrity": "sha1-s12sN2R5+sw+lHR9QdDQ9SOP/LU=", - "dev": true, - "requires": { - "restore-cursor": "2.0.0" - } - }, - "cli-spinners": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/cli-spinners/-/cli-spinners-0.1.2.tgz", - "integrity": "sha1-u3ZNiOGF+54eaiofGXcjGPYF4xw=", - "dev": true - }, - "cli-table": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/cli-table/-/cli-table-0.3.1.tgz", - "integrity": "sha1-9TsFJmqLGguTSz0IIebi3FkUriM=", - "dev": true, - "requires": { - "colors": "1.0.3" - }, - "dependencies": { - "colors": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/colors/-/colors-1.0.3.tgz", - "integrity": "sha1-BDP0TYCWgP3rYO0mDxsMJi6CpAs=", - "dev": true - } - } - }, - "cli-truncate": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/cli-truncate/-/cli-truncate-0.2.1.tgz", - "integrity": "sha1-nxXPuwcFAFNpIWxiasfQWrkN1XQ=", - "dev": true, - "requires": { - "slice-ansi": "0.0.4", - "string-width": "1.0.2" - }, - "dependencies": { - "ansi-regex": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", - "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", - "dev": true - }, - "is-fullwidth-code-point": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", - "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", - "dev": true, - "requires": { - "number-is-nan": "1.0.1" - } - }, - "string-width": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", - "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", - "dev": true, - "requires": { - "code-point-at": "1.1.0", - "is-fullwidth-code-point": "1.0.0", - "strip-ansi": "3.0.1" - } - }, - "strip-ansi": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", - "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", - "dev": true, - "requires": { - "ansi-regex": "2.1.1" - } - } - } - }, - "cli-width": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-2.2.0.tgz", - "integrity": "sha1-/xnt6Kml5XkyQUewwR8PvLq+1jk=", - "dev": true - }, - "cliui": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-3.2.0.tgz", - "integrity": "sha1-EgYBU3qRbSmUD5NNo7SNWFo5IT0=", - "dev": true, - "requires": { - "string-width": "1.0.2", - "strip-ansi": "3.0.1", - "wrap-ansi": "2.1.0" - }, - "dependencies": { - "ansi-regex": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", - "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", - "dev": true - }, - "is-fullwidth-code-point": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", - "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", - "dev": true, - "requires": { - "number-is-nan": "1.0.1" - } - }, - "string-width": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", - "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", - "dev": true, - "requires": { - "code-point-at": "1.1.0", - "is-fullwidth-code-point": "1.0.0", - "strip-ansi": "3.0.1" - } - }, - "strip-ansi": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", - "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", - "dev": true, - "requires": { - "ansi-regex": "2.1.1" - } - } - } - }, - "clone": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.3.tgz", - "integrity": "sha1-KY1+IjFmD0DAA8LtMUDezz9TCF8=", - "dev": true - }, - "clone-buffer": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/clone-buffer/-/clone-buffer-1.0.0.tgz", - "integrity": "sha1-4+JbIHrE5wGvch4staFnksrD3Fg=", - "dev": true - }, - "clone-response": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/clone-response/-/clone-response-1.0.2.tgz", - "integrity": "sha1-0dyXOSAxTfZ/vrlCI7TuNQI56Ws=", - "dev": true, - "requires": { - "mimic-response": "1.0.0" - } - }, - "clone-stats": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/clone-stats/-/clone-stats-0.0.1.tgz", - "integrity": "sha1-uI+UqCzzi4eR1YBG6kAprYjKmdE=", - "dev": true - }, - "cloneable-readable": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/cloneable-readable/-/cloneable-readable-1.0.0.tgz", - "integrity": "sha1-pikNQT8hemEjL5XkWP84QYz7ARc=", - "dev": true, - "requires": { - "inherits": "2.0.3", - "process-nextick-args": "1.0.7", - "through2": "2.0.3" - }, - "dependencies": { - "process-nextick-args": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-1.0.7.tgz", - "integrity": "sha1-FQ4gt1ZZCtP5EJPyWk8q2L/zC6M=", - "dev": true - } - } - }, - "co": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", - "integrity": "sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ=", - "dev": true - }, - "code-point-at": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz", - "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=", - "dev": true - }, - "codecov": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/codecov/-/codecov-3.0.0.tgz", - "integrity": "sha1-wnO4xPEpRXI+jcnSWAPYk0Pl8o4=", - "dev": true, - "requires": { - "argv": "0.0.2", - "request": "2.81.0", - "urlgrey": "0.4.4" - } - }, - "collection-visit": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/collection-visit/-/collection-visit-1.0.0.tgz", - "integrity": "sha1-S8A3PBZLwykbTTaMgpzxqApZ3KA=", - "dev": true, - "requires": { - "map-visit": "1.0.0", - "object-visit": "1.0.1" - } - }, - "color-convert": { - "version": "1.9.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.1.tgz", - "integrity": "sha512-mjGanIiwQJskCC18rPR6OmrZ6fm2Lc7PeGFYwCmy5J34wC6F1PzdGL6xeMfmgicfYcNLGuVFA3WzXtIDCQSZxQ==", - "dev": true, - "requires": { - "color-name": "1.1.3" - } - }, - "color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", - "dev": true - }, - "colors": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/colors/-/colors-1.1.2.tgz", - "integrity": "sha1-FopHAXVran9RoSzgyXv6KMCE7WM=", - "dev": true - }, - "combined-stream": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.6.tgz", - "integrity": "sha1-cj599ugBrFYTETp+RFqbactjKBg=", - "dev": true, - "requires": { - "delayed-stream": "1.0.0" - } - }, - "commander": { - "version": "2.13.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.13.0.tgz", - "integrity": "sha512-MVuS359B+YzaWqjCL/c+22gfryv+mCBPHAv3zyVI2GN8EY6IRP8VwtasXn8jyyhvvq84R4ImN1OKRtcbIasjYA==", - "dev": true - }, - "commondir": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", - "integrity": "sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs=", - "dev": true - }, - "component-emitter": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.2.1.tgz", - "integrity": "sha1-E3kY1teCg/ffemt8WmPhQOaUJeY=", - "dev": true - }, - "concat-map": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", - "dev": true - }, - "concat-stream": { - "version": "1.6.1", - "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.1.tgz", - "integrity": "sha512-gslSSJx03QKa59cIKqeJO9HQ/WZMotvYJCuaUULrLpjj8oG40kV2Z+gz82pVxlTkOADi4PJxQPPfhl1ELYrrXw==", - "dev": true, - "requires": { - "inherits": "2.0.3", - "readable-stream": "2.3.5", - "typedarray": "0.0.6" - } - }, - "console-browserify": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/console-browserify/-/console-browserify-1.1.0.tgz", - "integrity": "sha1-8CQcRXMKn8YyOyBtvzjtx0HQuxA=", - "dev": true, - "requires": { - "date-now": "0.1.4" - } - }, - "constants-browserify": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/constants-browserify/-/constants-browserify-1.0.0.tgz", - "integrity": "sha1-wguW2MYXdIqvHBYCF2DNJ/y4y3U=", - "dev": true - }, - "convert-source-map": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.5.1.tgz", - "integrity": "sha1-uCeAl7m8IpNl3lxiz1/K7YtVmeU=", - "dev": true - }, - "copy-concurrently": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/copy-concurrently/-/copy-concurrently-1.0.5.tgz", - "integrity": "sha512-f2domd9fsVDFtaFcbaRZuYXwtdmnzqbADSwhSWYxYB/Q8zsdUUFMXVRwXGDMWmbEzAn1kdRrtI1T/KTFOL4X2A==", - "dev": true, - "requires": { - "aproba": "1.2.0", - "fs-write-stream-atomic": "1.0.10", - "iferr": "0.1.5", - "mkdirp": "0.5.1", - "rimraf": "2.6.2", - "run-queue": "1.0.3" - } - }, - "copy-descriptor": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/copy-descriptor/-/copy-descriptor-0.1.1.tgz", - "integrity": "sha1-Z29us8OZl8LuGsOpJP1hJHSPV40=", - "dev": true - }, - "core-js": { - "version": "2.5.3", - "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.5.3.tgz", - "integrity": "sha1-isw4NFgk8W2DZbfJtCWRaOjtYD4=", - "dev": true - }, - "core-util-is": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", - "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=", - "dev": true - }, - "create-ecdh": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/create-ecdh/-/create-ecdh-4.0.0.tgz", - "integrity": "sha1-iIxyNZbN92EvZJgjPuvXo1MBc30=", - "dev": true, - "requires": { - "bn.js": "4.11.8", - "elliptic": "6.4.0" - } - }, - "create-hash": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/create-hash/-/create-hash-1.1.3.tgz", - "integrity": "sha1-YGBCrIuSYnUPSDyt2rD1gZFy2P0=", - "dev": true, - "requires": { - "cipher-base": "1.0.4", - "inherits": "2.0.3", - "ripemd160": "2.0.1", - "sha.js": "2.4.10" - } - }, - "create-hmac": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/create-hmac/-/create-hmac-1.1.6.tgz", - "integrity": "sha1-rLniIaThe9sHbpBlfEK5PjcmzwY=", - "dev": true, - "requires": { - "cipher-base": "1.0.4", - "create-hash": "1.1.3", - "inherits": "2.0.3", - "ripemd160": "2.0.1", - "safe-buffer": "5.1.1", - "sha.js": "2.4.10" - } - }, - "cross-spawn": { - "version": "6.0.5", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", - "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", - "dev": true, - "requires": { - "nice-try": "1.0.4", - "path-key": "2.0.1", - "semver": "5.5.0", - "shebang-command": "1.2.0", - "which": "1.3.0" - } - }, - "cryptiles": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/cryptiles/-/cryptiles-2.0.5.tgz", - "integrity": "sha1-O9/s3GCBR8HGcgL6KR59ylnqo7g=", - "dev": true, - "requires": { - "boom": "2.10.1" - } - }, - "crypto-browserify": { - "version": "3.12.0", - "resolved": "https://registry.npmjs.org/crypto-browserify/-/crypto-browserify-3.12.0.tgz", - "integrity": "sha512-fz4spIh+znjO2VjL+IdhEpRJ3YN6sMzITSBijk6FK2UvTqruSQW+/cCZTSNsMiZNvUeq0CqurF+dAbyiGOY6Wg==", - "dev": true, - "requires": { - "browserify-cipher": "1.0.0", - "browserify-sign": "4.0.4", - "create-ecdh": "4.0.0", - "create-hash": "1.1.3", - "create-hmac": "1.1.6", - "diffie-hellman": "5.0.2", - "inherits": "2.0.3", - "pbkdf2": "3.0.14", - "public-encrypt": "4.0.0", - "randombytes": "2.0.6", - "randomfill": "1.0.4" - } - }, - "cyclist": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/cyclist/-/cyclist-0.2.2.tgz", - "integrity": "sha1-GzN5LhHpFKL9bW7WRHRkRE5fpkA=", - "dev": true - }, - "dargs": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/dargs/-/dargs-5.1.0.tgz", - "integrity": "sha1-7H6lDHhWTNNsnV7Bj2Yyn63ieCk=", - "dev": true - }, - "dashdash": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", - "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=", - "dev": true, - "requires": { - "assert-plus": "1.0.0" - }, - "dependencies": { - "assert-plus": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", - "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", - "dev": true - } - } - }, - "date-fns": { - "version": "1.29.0", - "resolved": "https://registry.npmjs.org/date-fns/-/date-fns-1.29.0.tgz", - "integrity": "sha512-lbTXWZ6M20cWH8N9S6afb0SBm6tMk+uUg6z3MqHPKE9atmsY3kJkTm8vKe93izJ2B2+q5MV990sM2CHgtAZaOw==", - "dev": true - }, - "date-now": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/date-now/-/date-now-0.1.4.tgz", - "integrity": "sha1-6vQ5/U1ISK105cx9vvIAZyueNFs=", - "dev": true - }, - "dateformat": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/dateformat/-/dateformat-2.2.0.tgz", - "integrity": "sha1-QGXiATz5+5Ft39gu+1Bq1MZ2kGI=", - "dev": true - }, - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "requires": { - "ms": "2.0.0" - } - }, - "decamelize": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", - "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=", - "dev": true - }, - "decode-uri-component": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.0.tgz", - "integrity": "sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU=", - "dev": true - }, - "decompress-response": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-3.3.0.tgz", - "integrity": "sha1-gKTdMjdIOEv6JICDYirt7Jgq3/M=", - "dev": true, - "requires": { - "mimic-response": "1.0.0" - } - }, - "deep-extend": { - "version": "0.4.2", - "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.4.2.tgz", - "integrity": "sha1-SLaZwn4zS/ifEIkr5DL25MfTSn8=", - "dev": true - }, - "define-property": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-2.0.2.tgz", - "integrity": "sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==", - "dev": true, - "requires": { - "is-descriptor": "1.0.2", - "isobject": "3.0.1" - } - }, - "delayed-stream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", - "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=", - "dev": true - }, - "des.js": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/des.js/-/des.js-1.0.0.tgz", - "integrity": "sha1-wHTS4qpqipoH29YfmhXCzYPsjsw=", - "dev": true, - "requires": { - "inherits": "2.0.3", - "minimalistic-assert": "1.0.0" - } - }, - "detect-conflict": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/detect-conflict/-/detect-conflict-1.0.1.tgz", - "integrity": "sha1-CIZXpmqWHAUBnbfEIwiDsca0F24=", - "dev": true - }, - "detect-indent": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/detect-indent/-/detect-indent-4.0.0.tgz", - "integrity": "sha1-920GQ1LN9Docts5hnE7jqUdd4gg=", - "dev": true, - "requires": { - "repeating": "2.0.1" - } - }, - "diff": { - "version": "3.5.0", - "resolved": "https://registry.npmjs.org/diff/-/diff-3.5.0.tgz", - "integrity": "sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA==", - "dev": true - }, - "diffie-hellman": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/diffie-hellman/-/diffie-hellman-5.0.2.tgz", - "integrity": "sha1-tYNXOScM/ias9jIJn97SoH8gnl4=", - "dev": true, - "requires": { - "bn.js": "4.11.8", - "miller-rabin": "4.0.1", - "randombytes": "2.0.6" - } - }, - "dom-walk": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/dom-walk/-/dom-walk-0.1.1.tgz", - "integrity": "sha1-ZyIm3HTI95mtNTB9+TaroRrNYBg=", - "dev": true - }, - "domain-browser": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/domain-browser/-/domain-browser-1.2.0.tgz", - "integrity": "sha512-jnjyiM6eRyZl2H+W8Q/zLMA481hzi0eszAaBUzIVnmYVDBbnLxVNnfu1HgEBvCbL+71FrxMl3E6lpKH7Ge3OXA==", - "dev": true - }, - "duplexer3": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/duplexer3/-/duplexer3-0.1.4.tgz", - "integrity": "sha1-7gHdHKwO08vH/b6jfcCo8c4ALOI=", - "dev": true - }, - "duplexify": { - "version": "3.5.4", - "resolved": "https://registry.npmjs.org/duplexify/-/duplexify-3.5.4.tgz", - "integrity": "sha512-JzYSLYMhoVVBe8+mbHQ4KgpvHpm0DZpJuL8PY93Vyv1fW7jYJ90LoXa1di/CVbJM+TgMs91rbDapE/RNIfnJsA==", - "dev": true, - "requires": { - "end-of-stream": "1.4.1", - "inherits": "2.0.3", - "readable-stream": "2.3.5", - "stream-shift": "1.0.0" - } - }, - "ecc-jsbn": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.1.tgz", - "integrity": "sha1-D8c6ntXw1Tw4GTOYUj735UN3dQU=", - "dev": true, - "optional": true, - "requires": { - "jsbn": "0.1.1" - } - }, - "editions": { - "version": "1.3.4", - "resolved": "https://registry.npmjs.org/editions/-/editions-1.3.4.tgz", - "integrity": "sha512-gzao+mxnYDzIysXKMQi/+M1mjy/rjestjg6OPoYTtI+3Izp23oiGZitsl9lPDPiTGXbcSIk1iJWhliSaglxnUg==", - "dev": true - }, - "ejs": { - "version": "2.5.7", - "resolved": "https://registry.npmjs.org/ejs/-/ejs-2.5.7.tgz", - "integrity": "sha1-zIcsFoiArjxxiXYv1f/ACJbJUYo=", - "dev": true - }, - "elegant-spinner": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/elegant-spinner/-/elegant-spinner-1.0.1.tgz", - "integrity": "sha1-2wQ1IcldfjA/2PNFvtwzSc+wcp4=", - "dev": true - }, - "elliptic": { - "version": "6.4.0", - "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.4.0.tgz", - "integrity": "sha1-ysmvh2LIWDYYcAPI3+GT5eLq5d8=", - "dev": true, - "requires": { - "bn.js": "4.11.8", - "brorand": "1.1.0", - "hash.js": "1.1.3", - "hmac-drbg": "1.0.1", - "inherits": "2.0.3", - "minimalistic-assert": "1.0.0", - "minimalistic-crypto-utils": "1.0.1" - } - }, - "emojis-list": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-2.1.0.tgz", - "integrity": "sha1-TapNnbAPmBmIDHn6RXrlsJof04k=", - "dev": true - }, - "end-of-stream": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.1.tgz", - "integrity": "sha512-1MkrZNvWTKCaigbn+W15elq2BB/L22nqrSY5DKlo3X6+vclJm8Bb5djXJBmEX6fS3+zCh/F4VBK5Z2KxJt4s2Q==", - "dev": true, - "requires": { - "once": "1.4.0" - } - }, - "enhanced-resolve": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-4.0.0.tgz", - "integrity": "sha512-jox/62b2GofV1qTUQTMPEJSDIGycS43evqYzD/KVtEb9OCoki9cnacUPxCrZa7JfPzZSYOCZhu9O9luaMxAX8g==", - "dev": true, - "requires": { - "graceful-fs": "4.1.11", - "memory-fs": "0.4.1", - "tapable": "1.0.0" - } - }, - "errno": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/errno/-/errno-0.1.7.tgz", - "integrity": "sha512-MfrRBDWzIWifgq6tJj60gkAwtLNb6sQPlcFrSOflcP1aFmmruKQ2wRnze/8V6kgyz7H3FF8Npzv78mZ7XLLflg==", - "dev": true, - "requires": { - "prr": "1.0.1" - } - }, - "error": { - "version": "7.0.2", - "resolved": "https://registry.npmjs.org/error/-/error-7.0.2.tgz", - "integrity": "sha1-pfdf/02ZJhJt2sDqXcOOaJFTywI=", - "dev": true, - "requires": { - "string-template": "0.2.1", - "xtend": "4.0.1" - } - }, - "error-ex": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.1.tgz", - "integrity": "sha1-+FWobOYa3E6GIcPNoh56dhLDqNw=", - "dev": true, - "requires": { - "is-arrayish": "0.2.1" - } - }, - "escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", - "dev": true - }, - "eslint-scope": { - "version": "3.7.1", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-3.7.1.tgz", - "integrity": "sha1-PWPD7f2gLgbgGkUq2IyqzHzctug=", - "dev": true, - "requires": { - "esrecurse": "4.2.1", - "estraverse": "4.2.0" - } - }, - "esprima": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.0.tgz", - "integrity": "sha512-oftTcaMu/EGrEIu904mWteKIv8vMuOgGYo7EhVJJN00R/EED9DCua/xxHRdYnKtcECzVg7xOWhflvJMnqcFZjw==", - "dev": true - }, - "esrecurse": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.2.1.tgz", - "integrity": "sha512-64RBB++fIOAXPw3P9cy89qfMlvZEXZkqqJkjqqXIvzP5ezRZjW+lPWjw35UX/3EhUPFYbg5ER4JYgDw4007/DQ==", - "dev": true, - "requires": { - "estraverse": "4.2.0" - } - }, - "estraverse": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.2.0.tgz", - "integrity": "sha1-De4/7TH81GlhjOc0IJn8GvoL2xM=", - "dev": true - }, - "esutils": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.2.tgz", - "integrity": "sha1-Cr9PHKpbyx96nYrMbepPqqBLrJs=", - "dev": true - }, - "events": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/events/-/events-1.1.1.tgz", - "integrity": "sha1-nr23Y1rQmccNzEwqH1AEKI6L2SQ=", - "dev": true - }, - "evp_bytestokey": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz", - "integrity": "sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA==", - "dev": true, - "requires": { - "md5.js": "1.3.4", - "safe-buffer": "5.1.1" - } - }, - "execa": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/execa/-/execa-0.7.0.tgz", - "integrity": "sha1-lEvs00zEHuMqY6n68nrVpl/Fl3c=", - "dev": true, - "requires": { - "cross-spawn": "5.1.0", - "get-stream": "3.0.0", - "is-stream": "1.1.0", - "npm-run-path": "2.0.2", - "p-finally": "1.0.0", - "signal-exit": "3.0.2", - "strip-eof": "1.0.0" - }, - "dependencies": { - "cross-spawn": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-5.1.0.tgz", - "integrity": "sha1-6L0O/uWPz/b4+UUQoKVUu/ojVEk=", - "dev": true, - "requires": { - "lru-cache": "4.1.1", - "shebang-command": "1.2.0", - "which": "1.3.0" - } - } - } - }, - "exit-hook": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/exit-hook/-/exit-hook-1.1.1.tgz", - "integrity": "sha1-8FyiM7SMBdVP/wd2XfhQfpXAL/g=", - "dev": true - }, - "expand-brackets": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz", - "integrity": "sha1-t3c14xXOMPa27/D4OwQVGiJEliI=", - "dev": true, - "requires": { - "debug": "2.6.9", - "define-property": "0.2.5", - "extend-shallow": "2.0.1", - "posix-character-classes": "0.1.1", - "regex-not": "1.0.2", - "snapdragon": "0.8.1", - "to-regex": "3.0.2" - }, - "dependencies": { - "define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "dev": true, - "requires": { - "is-descriptor": "0.1.6" - } - }, - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "requires": { - "is-extendable": "0.1.1" - } - }, - "is-accessor-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", - "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", - "dev": true, - "requires": { - "kind-of": "3.2.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "1.1.6" - } - } - } - }, - "is-data-descriptor": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", - "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", - "dev": true, - "requires": { - "kind-of": "3.2.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "1.1.6" - } - } - } - }, - "is-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", - "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", - "dev": true, - "requires": { - "is-accessor-descriptor": "0.1.6", - "is-data-descriptor": "0.1.4", - "kind-of": "5.1.0" - } - }, - "kind-of": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", - "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", - "dev": true - } - } - }, - "expand-range": { - "version": "1.8.2", - "resolved": "https://registry.npmjs.org/expand-range/-/expand-range-1.8.2.tgz", - "integrity": "sha1-opnv/TNf4nIeuujiV+x5ZE/IUzc=", - "dev": true, - "requires": { - "fill-range": "2.2.3" - }, - "dependencies": { - "fill-range": { - "version": "2.2.3", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-2.2.3.tgz", - "integrity": "sha1-ULd9/X5Gm8dJJHCWNpn+eoSFpyM=", - "dev": true, - "requires": { - "is-number": "2.1.0", - "isobject": "2.1.0", - "randomatic": "1.1.7", - "repeat-element": "1.1.2", - "repeat-string": "1.6.1" - } - }, - "is-number": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-2.1.0.tgz", - "integrity": "sha1-Afy7s5NGOlSPL0ZszhbezknbkI8=", - "dev": true, - "requires": { - "kind-of": "3.2.2" - } - }, - "isobject": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", - "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=", - "dev": true, - "requires": { - "isarray": "1.0.0" - } - }, - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "1.1.6" - } - } - } - }, - "expand-tilde": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/expand-tilde/-/expand-tilde-2.0.2.tgz", - "integrity": "sha1-l+gBqgUt8CRU3kawK/YhZCzchQI=", - "dev": true, - "requires": { - "homedir-polyfill": "1.0.1" - } - }, - "extend": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.1.tgz", - "integrity": "sha1-p1Xqe8Gt/MWjHOfnYtuq3F5jZEQ=", - "dev": true - }, - "extend-shallow": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", - "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=", - "dev": true, - "requires": { - "assign-symbols": "1.0.0", - "is-extendable": "1.0.1" - }, - "dependencies": { - "is-extendable": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", - "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", - "dev": true, - "requires": { - "is-plain-object": "2.0.4" - } - } - } - }, - "external-editor": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-2.1.0.tgz", - "integrity": "sha512-E44iT5QVOUJBKij4IIV3uvxuNlbKS38Tw1HiupxEIHPv9qtC2PrDYohbXV5U+1jnfIXttny8gUhj+oZvflFlzA==", - "dev": true, - "requires": { - "chardet": "0.4.2", - "iconv-lite": "0.4.19", - "tmp": "0.0.33" - } - }, - "extglob": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz", - "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==", - "dev": true, - "requires": { - "array-unique": "0.3.2", - "define-property": "1.0.0", - "expand-brackets": "2.1.4", - "extend-shallow": "2.0.1", - "fragment-cache": "0.2.1", - "regex-not": "1.0.2", - "snapdragon": "0.8.1", - "to-regex": "3.0.2" - }, - "dependencies": { - "define-property": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", - "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", - "dev": true, - "requires": { - "is-descriptor": "1.0.2" - } - }, - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "requires": { - "is-extendable": "0.1.1" - } - } - } - }, - "extsprintf": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", - "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=", - "dev": true - }, - "fast-deep-equal": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-1.1.0.tgz", - "integrity": "sha1-wFNHeBfIa1HaqFPIHgWbcz0CNhQ=", - "dev": true - }, - "fast-json-stable-stringify": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz", - "integrity": "sha1-1RQsDK7msRifh9OnYREGT4bIu/I=", - "dev": true - }, - "figures": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/figures/-/figures-2.0.0.tgz", - "integrity": "sha1-OrGi0qYsi/tDGgyUy3l6L84nyWI=", - "dev": true, - "requires": { - "escape-string-regexp": "1.0.5" - } - }, - "filename-regex": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/filename-regex/-/filename-regex-2.0.1.tgz", - "integrity": "sha1-wcS5vuPglyXdsQa3XB4wH+LxiyY=", - "dev": true - }, - "fill-range": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", - "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", - "dev": true, - "requires": { - "extend-shallow": "2.0.1", - "is-number": "3.0.0", - "repeat-string": "1.6.1", - "to-regex-range": "2.1.1" - }, - "dependencies": { - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "requires": { - "is-extendable": "0.1.1" - } - } - } - }, - "find-cache-dir": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-1.0.0.tgz", - "integrity": "sha1-kojj6ePMN0hxfTnq3hfPcfww7m8=", - "dev": true, - "requires": { - "commondir": "1.0.1", - "make-dir": "1.2.0", - "pkg-dir": "2.0.0" - } - }, - "find-up": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", - "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", - "dev": true, - "requires": { - "locate-path": "2.0.0" - } - }, - "first-chunk-stream": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/first-chunk-stream/-/first-chunk-stream-2.0.0.tgz", - "integrity": "sha1-G97NuOCDwGZLkZRVgVd6Q6nzHXA=", - "dev": true, - "requires": { - "readable-stream": "2.3.5" - } - }, - "flow-parser": { - "version": "0.66.0", - "resolved": "https://registry.npmjs.org/flow-parser/-/flow-parser-0.66.0.tgz", - "integrity": "sha1-vlg/77ARkqpRZEFdMaYkGzVxiYM=", - "dev": true - }, - "flush-write-stream": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/flush-write-stream/-/flush-write-stream-1.0.2.tgz", - "integrity": "sha1-yBuQ2HRnZvGmCaRoCZRsRd2K5Bc=", - "dev": true, - "requires": { - "inherits": "2.0.3", - "readable-stream": "2.3.5" - } - }, - "for-in": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz", - "integrity": "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=", - "dev": true - }, - "for-own": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/for-own/-/for-own-0.1.5.tgz", - "integrity": "sha1-UmXGgaTylNq78XyVCbZ2OqhFEM4=", - "dev": true, - "requires": { - "for-in": "1.0.2" - } - }, - "forever-agent": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", - "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=", - "dev": true - }, - "form-data": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.1.4.tgz", - "integrity": "sha1-M8GDrPGTJ27KqYFDpp6Uv+4XUNE=", - "dev": true, - "requires": { - "asynckit": "0.4.0", - "combined-stream": "1.0.6", - "mime-types": "2.1.18" - } - }, - "fragment-cache": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/fragment-cache/-/fragment-cache-0.2.1.tgz", - "integrity": "sha1-QpD60n8T6Jvn8zeZxrxaCr//DRk=", - "dev": true, - "requires": { - "map-cache": "0.2.2" - } - }, - "from2": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/from2/-/from2-2.3.0.tgz", - "integrity": "sha1-i/tVAr3kpNNs/e6gB/zKIdfjgq8=", - "dev": true, - "requires": { - "inherits": "2.0.3", - "readable-stream": "2.3.5" - } - }, - "fs-write-stream-atomic": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/fs-write-stream-atomic/-/fs-write-stream-atomic-1.0.10.tgz", - "integrity": "sha1-tH31NJPvkR33VzHnCp3tAYnbQMk=", - "dev": true, - "requires": { - "graceful-fs": "4.1.11", - "iferr": "0.1.5", - "imurmurhash": "0.1.4", - "readable-stream": "2.3.5" - } - }, - "fs.realpath": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", - "dev": true - }, - "fsevents": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.1.3.tgz", - "integrity": "sha512-WIr7iDkdmdbxu/Gh6eKEZJL6KPE74/5MEsf2whTOFNxbIoIixogroLdKYqB6FDav4Wavh/lZdzzd3b2KxIXC5Q==", - "dev": true, - "optional": true, - "requires": { - "nan": "2.9.2", - "node-pre-gyp": "0.6.39" - }, - "dependencies": { - "abbrev": { - "version": "1.1.0", - "bundled": true, - "dev": true, - "optional": true - }, - "ajv": { - "version": "4.11.8", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "co": "4.6.0", - "json-stable-stringify": "1.0.1" - } - }, - "ansi-regex": { - "version": "2.1.1", - "bundled": true, - "dev": true - }, - "aproba": { - "version": "1.1.1", - "bundled": true, - "dev": true, - "optional": true - }, - "are-we-there-yet": { - "version": "1.1.4", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "delegates": "1.0.0", - "readable-stream": "2.2.9" - } - }, - "asn1": { - "version": "0.2.3", - "bundled": true, - "dev": true, - "optional": true - }, - "assert-plus": { - "version": "0.2.0", - "bundled": true, - "dev": true, - "optional": true - }, - "asynckit": { - "version": "0.4.0", - "bundled": true, - "dev": true, - "optional": true - }, - "aws-sign2": { - "version": "0.6.0", - "bundled": true, - "dev": true, - "optional": true - }, - "aws4": { - "version": "1.6.0", - "bundled": true, - "dev": true, - "optional": true - }, - "balanced-match": { - "version": "0.4.2", - "bundled": true, - "dev": true - }, - "bcrypt-pbkdf": { - "version": "1.0.1", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "tweetnacl": "0.14.5" - } - }, - "block-stream": { - "version": "0.0.9", - "bundled": true, - "dev": true, - "requires": { - "inherits": "2.0.3" - } - }, - "boom": { - "version": "2.10.1", - "bundled": true, - "dev": true, - "requires": { - "hoek": "2.16.3" - } - }, - "brace-expansion": { - "version": "1.1.7", - "bundled": true, - "dev": true, - "requires": { - "balanced-match": "0.4.2", - "concat-map": "0.0.1" - } - }, - "buffer-shims": { - "version": "1.0.0", - "bundled": true, - "dev": true - }, - "caseless": { - "version": "0.12.0", - "bundled": true, - "dev": true, - "optional": true - }, - "co": { - "version": "4.6.0", - "bundled": true, - "dev": true, - "optional": true - }, - "code-point-at": { - "version": "1.1.0", - "bundled": true, - "dev": true - }, - "combined-stream": { - "version": "1.0.5", - "bundled": true, - "dev": true, - "requires": { - "delayed-stream": "1.0.0" - } - }, - "concat-map": { - "version": "0.0.1", - "bundled": true, - "dev": true - }, - "console-control-strings": { - "version": "1.1.0", - "bundled": true, - "dev": true - }, - "core-util-is": { - "version": "1.0.2", - "bundled": true, - "dev": true - }, - "cryptiles": { - "version": "2.0.5", - "bundled": true, - "dev": true, - "requires": { - "boom": "2.10.1" - } - }, - "dashdash": { - "version": "1.14.1", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "assert-plus": "1.0.0" - }, - "dependencies": { - "assert-plus": { - "version": "1.0.0", - "bundled": true, - "dev": true, - "optional": true - } - } - }, - "debug": { - "version": "2.6.8", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "ms": "2.0.0" - } - }, - "deep-extend": { - "version": "0.4.2", - "bundled": true, - "dev": true, - "optional": true - }, - "delayed-stream": { - "version": "1.0.0", - "bundled": true, - "dev": true - }, - "delegates": { - "version": "1.0.0", - "bundled": true, - "dev": true, - "optional": true - }, - "detect-libc": { - "version": "1.0.2", - "bundled": true, - "dev": true, - "optional": true - }, - "ecc-jsbn": { - "version": "0.1.1", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "jsbn": "0.1.1" - } - }, - "extend": { - "version": "3.0.1", - "bundled": true, - "dev": true, - "optional": true - }, - "extsprintf": { - "version": "1.0.2", - "bundled": true, - "dev": true - }, - "forever-agent": { - "version": "0.6.1", - "bundled": true, - "dev": true, - "optional": true - }, - "form-data": { - "version": "2.1.4", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "asynckit": "0.4.0", - "combined-stream": "1.0.5", - "mime-types": "2.1.15" - } - }, - "fs.realpath": { - "version": "1.0.0", - "bundled": true, - "dev": true - }, - "fstream": { - "version": "1.0.11", - "bundled": true, - "dev": true, - "requires": { - "graceful-fs": "4.1.11", - "inherits": "2.0.3", - "mkdirp": "0.5.1", - "rimraf": "2.6.1" - } - }, - "fstream-ignore": { - "version": "1.0.5", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "fstream": "1.0.11", - "inherits": "2.0.3", - "minimatch": "3.0.4" - } - }, - "gauge": { - "version": "2.7.4", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "aproba": "1.1.1", - "console-control-strings": "1.1.0", - "has-unicode": "2.0.1", - "object-assign": "4.1.1", - "signal-exit": "3.0.2", - "string-width": "1.0.2", - "strip-ansi": "3.0.1", - "wide-align": "1.1.2" - } - }, - "getpass": { - "version": "0.1.7", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "assert-plus": "1.0.0" - }, - "dependencies": { - "assert-plus": { - "version": "1.0.0", - "bundled": true, - "dev": true, - "optional": true - } - } - }, - "glob": { - "version": "7.1.2", - "bundled": true, - "dev": true, - "requires": { - "fs.realpath": "1.0.0", - "inflight": "1.0.6", - "inherits": "2.0.3", - "minimatch": "3.0.4", - "once": "1.4.0", - "path-is-absolute": "1.0.1" - } - }, - "graceful-fs": { - "version": "4.1.11", - "bundled": true, - "dev": true - }, - "har-schema": { - "version": "1.0.5", - "bundled": true, - "dev": true, - "optional": true - }, - "har-validator": { - "version": "4.2.1", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "ajv": "4.11.8", - "har-schema": "1.0.5" - } - }, - "has-unicode": { - "version": "2.0.1", - "bundled": true, - "dev": true, - "optional": true - }, - "hawk": { - "version": "3.1.3", - "bundled": true, - "dev": true, - "requires": { - "boom": "2.10.1", - "cryptiles": "2.0.5", - "hoek": "2.16.3", - "sntp": "1.0.9" - } - }, - "hoek": { - "version": "2.16.3", - "bundled": true, - "dev": true - }, - "http-signature": { - "version": "1.1.1", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "assert-plus": "0.2.0", - "jsprim": "1.4.0", - "sshpk": "1.13.0" - } - }, - "inflight": { - "version": "1.0.6", - "bundled": true, - "dev": true, - "requires": { - "once": "1.4.0", - "wrappy": "1.0.2" - } - }, - "inherits": { - "version": "2.0.3", - "bundled": true, - "dev": true - }, - "ini": { - "version": "1.3.4", - "bundled": true, - "dev": true, - "optional": true - }, - "is-fullwidth-code-point": { - "version": "1.0.0", - "bundled": true, - "dev": true, - "requires": { - "number-is-nan": "1.0.1" - } - }, - "is-typedarray": { - "version": "1.0.0", - "bundled": true, - "dev": true, - "optional": true - }, - "isarray": { - "version": "1.0.0", - "bundled": true, - "dev": true - }, - "isstream": { - "version": "0.1.2", - "bundled": true, - "dev": true, - "optional": true - }, - "jodid25519": { - "version": "1.0.2", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "jsbn": "0.1.1" - } - }, - "jsbn": { - "version": "0.1.1", - "bundled": true, - "dev": true, - "optional": true - }, - "json-schema": { - "version": "0.2.3", - "bundled": true, - "dev": true, - "optional": true - }, - "json-stable-stringify": { - "version": "1.0.1", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "jsonify": "0.0.0" - } - }, - "json-stringify-safe": { - "version": "5.0.1", - "bundled": true, - "dev": true, - "optional": true - }, - "jsonify": { - "version": "0.0.0", - "bundled": true, - "dev": true, - "optional": true - }, - "jsprim": { - "version": "1.4.0", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "assert-plus": "1.0.0", - "extsprintf": "1.0.2", - "json-schema": "0.2.3", - "verror": "1.3.6" - }, - "dependencies": { - "assert-plus": { - "version": "1.0.0", - "bundled": true, - "dev": true, - "optional": true - } - } - }, - "mime-db": { - "version": "1.27.0", - "bundled": true, - "dev": true - }, - "mime-types": { - "version": "2.1.15", - "bundled": true, - "dev": true, - "requires": { - "mime-db": "1.27.0" - } - }, - "minimatch": { - "version": "3.0.4", - "bundled": true, - "dev": true, - "requires": { - "brace-expansion": "1.1.7" - } - }, - "minimist": { - "version": "0.0.8", - "bundled": true, - "dev": true - }, - "mkdirp": { - "version": "0.5.1", - "bundled": true, - "dev": true, - "requires": { - "minimist": "0.0.8" - } - }, - "ms": { - "version": "2.0.0", - "bundled": true, - "dev": true, - "optional": true - }, - "node-pre-gyp": { - "version": "0.6.39", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "detect-libc": "1.0.2", - "hawk": "3.1.3", - "mkdirp": "0.5.1", - "nopt": "4.0.1", - "npmlog": "4.1.0", - "rc": "1.2.1", - "request": "2.81.0", - "rimraf": "2.6.1", - "semver": "5.3.0", - "tar": "2.2.1", - "tar-pack": "3.4.0" - } - }, - "nopt": { - "version": "4.0.1", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "abbrev": "1.1.0", - "osenv": "0.1.4" - } - }, - "npmlog": { - "version": "4.1.0", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "are-we-there-yet": "1.1.4", - "console-control-strings": "1.1.0", - "gauge": "2.7.4", - "set-blocking": "2.0.0" - } - }, - "number-is-nan": { - "version": "1.0.1", - "bundled": true, - "dev": true - }, - "oauth-sign": { - "version": "0.8.2", - "bundled": true, - "dev": true, - "optional": true - }, - "object-assign": { - "version": "4.1.1", - "bundled": true, - "dev": true, - "optional": true - }, - "once": { - "version": "1.4.0", - "bundled": true, - "dev": true, - "requires": { - "wrappy": "1.0.2" - } - }, - "os-homedir": { - "version": "1.0.2", - "bundled": true, - "dev": true, - "optional": true - }, - "os-tmpdir": { - "version": "1.0.2", - "bundled": true, - "dev": true, - "optional": true - }, - "osenv": { - "version": "0.1.4", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "os-homedir": "1.0.2", - "os-tmpdir": "1.0.2" - } - }, - "path-is-absolute": { - "version": "1.0.1", - "bundled": true, - "dev": true - }, - "performance-now": { - "version": "0.2.0", - "bundled": true, - "dev": true, - "optional": true - }, - "process-nextick-args": { - "version": "1.0.7", - "bundled": true, - "dev": true - }, - "punycode": { - "version": "1.4.1", - "bundled": true, - "dev": true, - "optional": true - }, - "qs": { - "version": "6.4.0", - "bundled": true, - "dev": true, - "optional": true - }, - "rc": { - "version": "1.2.1", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "deep-extend": "0.4.2", - "ini": "1.3.4", - "minimist": "1.2.0", - "strip-json-comments": "2.0.1" - }, - "dependencies": { - "minimist": { - "version": "1.2.0", - "bundled": true, - "dev": true, - "optional": true - } - } - }, - "readable-stream": { - "version": "2.2.9", - "bundled": true, - "dev": true, - "requires": { - "buffer-shims": "1.0.0", - "core-util-is": "1.0.2", - "inherits": "2.0.3", - "isarray": "1.0.0", - "process-nextick-args": "1.0.7", - "string_decoder": "1.0.1", - "util-deprecate": "1.0.2" - } - }, - "request": { - "version": "2.81.0", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "aws-sign2": "0.6.0", - "aws4": "1.6.0", - "caseless": "0.12.0", - "combined-stream": "1.0.5", - "extend": "3.0.1", - "forever-agent": "0.6.1", - "form-data": "2.1.4", - "har-validator": "4.2.1", - "hawk": "3.1.3", - "http-signature": "1.1.1", - "is-typedarray": "1.0.0", - "isstream": "0.1.2", - "json-stringify-safe": "5.0.1", - "mime-types": "2.1.15", - "oauth-sign": "0.8.2", - "performance-now": "0.2.0", - "qs": "6.4.0", - "safe-buffer": "5.0.1", - "stringstream": "0.0.5", - "tough-cookie": "2.3.2", - "tunnel-agent": "0.6.0", - "uuid": "3.0.1" - } - }, - "rimraf": { - "version": "2.6.1", - "bundled": true, - "dev": true, - "requires": { - "glob": "7.1.2" - } - }, - "safe-buffer": { - "version": "5.0.1", - "bundled": true, - "dev": true - }, - "semver": { - "version": "5.3.0", - "bundled": true, - "dev": true, - "optional": true - }, - "set-blocking": { - "version": "2.0.0", - "bundled": true, - "dev": true, - "optional": true - }, - "signal-exit": { - "version": "3.0.2", - "bundled": true, - "dev": true, - "optional": true - }, - "sntp": { - "version": "1.0.9", - "bundled": true, - "dev": true, - "requires": { - "hoek": "2.16.3" - } - }, - "sshpk": { - "version": "1.13.0", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "asn1": "0.2.3", - "assert-plus": "1.0.0", - "bcrypt-pbkdf": "1.0.1", - "dashdash": "1.14.1", - "ecc-jsbn": "0.1.1", - "getpass": "0.1.7", - "jodid25519": "1.0.2", - "jsbn": "0.1.1", - "tweetnacl": "0.14.5" - }, - "dependencies": { - "assert-plus": { - "version": "1.0.0", - "bundled": true, - "dev": true, - "optional": true - } - } - }, - "string-width": { - "version": "1.0.2", - "bundled": true, - "dev": true, - "requires": { - "code-point-at": "1.1.0", - "is-fullwidth-code-point": "1.0.0", - "strip-ansi": "3.0.1" - } - }, - "string_decoder": { - "version": "1.0.1", - "bundled": true, - "dev": true, - "requires": { - "safe-buffer": "5.0.1" - } - }, - "stringstream": { - "version": "0.0.5", - "bundled": true, - "dev": true, - "optional": true - }, - "strip-ansi": { - "version": "3.0.1", - "bundled": true, - "dev": true, - "requires": { - "ansi-regex": "2.1.1" - } - }, - "strip-json-comments": { - "version": "2.0.1", - "bundled": true, - "dev": true, - "optional": true - }, - "tar": { - "version": "2.2.1", - "bundled": true, - "dev": true, - "requires": { - "block-stream": "0.0.9", - "fstream": "1.0.11", - "inherits": "2.0.3" - } - }, - "tar-pack": { - "version": "3.4.0", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "debug": "2.6.8", - "fstream": "1.0.11", - "fstream-ignore": "1.0.5", - "once": "1.4.0", - "readable-stream": "2.2.9", - "rimraf": "2.6.1", - "tar": "2.2.1", - "uid-number": "0.0.6" - } - }, - "tough-cookie": { - "version": "2.3.2", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "punycode": "1.4.1" - } - }, - "tunnel-agent": { - "version": "0.6.0", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "safe-buffer": "5.0.1" - } - }, - "tweetnacl": { - "version": "0.14.5", - "bundled": true, - "dev": true, - "optional": true - }, - "uid-number": { - "version": "0.0.6", - "bundled": true, - "dev": true, - "optional": true - }, - "util-deprecate": { - "version": "1.0.2", - "bundled": true, - "dev": true - }, - "uuid": { - "version": "3.0.1", - "bundled": true, - "dev": true, - "optional": true - }, - "verror": { - "version": "1.3.6", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "extsprintf": "1.0.2" - } - }, - "wide-align": { - "version": "1.1.2", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "string-width": "1.0.2" - } - }, - "wrappy": { - "version": "1.0.2", - "bundled": true, - "dev": true - } - } - }, - "get-caller-file": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-1.0.2.tgz", - "integrity": "sha1-9wLmMSfn4jHBYKgMFVSstw1QR+U=", - "dev": true - }, - "get-stream": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-3.0.0.tgz", - "integrity": "sha1-jpQ9E1jcN1VQVOy+LtsFqhdO3hQ=", - "dev": true - }, - "get-value": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/get-value/-/get-value-2.0.6.tgz", - "integrity": "sha1-3BXKHGcjh8p2vTesCjlbogQqLCg=", - "dev": true - }, - "getpass": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", - "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=", - "dev": true, - "requires": { - "assert-plus": "1.0.0" - }, - "dependencies": { - "assert-plus": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", - "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", - "dev": true - } - } - }, - "gh-got": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/gh-got/-/gh-got-6.0.0.tgz", - "integrity": "sha512-F/mS+fsWQMo1zfgG9MD8KWvTWPPzzhuVwY++fhQ5Ggd+0P+CAMHtzMZhNxG+TqGfHDChJKsbh6otfMGqO2AKBw==", - "dev": true, - "requires": { - "got": "7.1.0", - "is-plain-obj": "1.1.0" - }, - "dependencies": { - "got": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/got/-/got-7.1.0.tgz", - "integrity": "sha512-Y5WMo7xKKq1muPsxD+KmrR8DH5auG7fBdDVueZwETwV6VytKyU9OX/ddpq2/1hp1vIPvVb4T81dKQz3BivkNLw==", - "dev": true, - "requires": { - "decompress-response": "3.3.0", - "duplexer3": "0.1.4", - "get-stream": "3.0.0", - "is-plain-obj": "1.1.0", - "is-retry-allowed": "1.1.0", - "is-stream": "1.1.0", - "isurl": "1.0.0", - "lowercase-keys": "1.0.0", - "p-cancelable": "0.3.0", - "p-timeout": "1.2.1", - "safe-buffer": "5.1.1", - "timed-out": "4.0.1", - "url-parse-lax": "1.0.0", - "url-to-options": "1.0.1" - } - }, - "p-timeout": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/p-timeout/-/p-timeout-1.2.1.tgz", - "integrity": "sha1-XrOzU7f86Z8QGhA4iAuwVOu+o4Y=", - "dev": true, - "requires": { - "p-finally": "1.0.0" - } - }, - "prepend-http": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/prepend-http/-/prepend-http-1.0.4.tgz", - "integrity": "sha1-1PRWKwzjaW5BrFLQ4ALlemNdxtw=", - "dev": true - }, - "url-parse-lax": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/url-parse-lax/-/url-parse-lax-1.0.0.tgz", - "integrity": "sha1-evjzA2Rem9eaJy56FKxovAYJ2nM=", - "dev": true, - "requires": { - "prepend-http": "1.0.4" - } - } - } - }, - "github-username": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/github-username/-/github-username-4.1.0.tgz", - "integrity": "sha1-y+KABBiDIG2kISrp5LXxacML9Bc=", - "dev": true, - "requires": { - "gh-got": "6.0.0" - } - }, - "glob": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz", - "integrity": "sha512-MJTUg1kjuLeQCJ+ccE4Vpa6kKVXkPYJ2mOCQyUuKLcLQsdrMCpBPUi8qVE6+YuaJkozeA9NusTAw3hLr8Xe5EQ==", - "dev": true, - "requires": { - "fs.realpath": "1.0.0", - "inflight": "1.0.6", - "inherits": "2.0.3", - "minimatch": "3.0.4", - "once": "1.4.0", - "path-is-absolute": "1.0.1" - } - }, - "glob-all": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/glob-all/-/glob-all-3.1.0.tgz", - "integrity": "sha1-iRPd+17hrHgSZWJBsD1SF8ZLAqs=", - "dev": true, - "requires": { - "glob": "7.1.2", - "yargs": "1.2.6" - }, - "dependencies": { - "minimist": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.1.0.tgz", - "integrity": "sha1-md9lelJXTCHJBXSX33QnkLK0wN4=", - "dev": true - }, - "yargs": { - "version": "1.2.6", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-1.2.6.tgz", - "integrity": "sha1-nHtKgv1dWVsr8Xq23MQxNUMv40s=", - "dev": true, - "requires": { - "minimist": "0.1.0" - } - } - } - }, - "glob-base": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/glob-base/-/glob-base-0.3.0.tgz", - "integrity": "sha1-27Fk9iIbHAscz4Kuoyi0l98Oo8Q=", - "dev": true, - "requires": { - "glob-parent": "2.0.0", - "is-glob": "2.0.1" - }, - "dependencies": { - "glob-parent": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-2.0.0.tgz", - "integrity": "sha1-gTg9ctsFT8zPUzbaqQLxgvbtuyg=", - "dev": true, - "requires": { - "is-glob": "2.0.1" - } - }, - "is-extglob": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz", - "integrity": "sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA=", - "dev": true - }, - "is-glob": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-2.0.1.tgz", - "integrity": "sha1-0Jb5JqPe1WAPP9/ZEZjLCIjC2GM=", - "dev": true, - "requires": { - "is-extglob": "1.0.0" - } - } - } - }, - "glob-parent": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz", - "integrity": "sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4=", - "dev": true, - "requires": { - "is-glob": "3.1.0", - "path-dirname": "1.0.2" - }, - "dependencies": { - "is-glob": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz", - "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=", - "dev": true, - "requires": { - "is-extglob": "2.1.1" - } - } - } - }, - "global": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/global/-/global-4.3.2.tgz", - "integrity": "sha1-52mJJopsdMOJCLEwWxD8DjlOnQ8=", - "dev": true, - "requires": { - "min-document": "2.19.0", - "process": "0.5.2" - }, - "dependencies": { - "process": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/process/-/process-0.5.2.tgz", - "integrity": "sha1-FjjYqONML0QKkduVq5rrZ3/Bhc8=", - "dev": true - } - } - }, - "global-modules": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/global-modules/-/global-modules-1.0.0.tgz", - "integrity": "sha512-sKzpEkf11GpOFuw0Zzjzmt4B4UZwjOcG757PPvrfhxcLFbq0wpsgpOqxpxtxFiCG4DtG93M6XRVbF2oGdev7bg==", - "dev": true, - "requires": { - "global-prefix": "1.0.2", - "is-windows": "1.0.2", - "resolve-dir": "1.0.1" - } - }, - "global-prefix": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/global-prefix/-/global-prefix-1.0.2.tgz", - "integrity": "sha1-2/dDxsFJklk8ZVVoy2btMsASLr4=", - "dev": true, - "requires": { - "expand-tilde": "2.0.2", - "homedir-polyfill": "1.0.1", - "ini": "1.3.5", - "is-windows": "1.0.2", - "which": "1.3.0" - } - }, - "globals": { - "version": "9.18.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-9.18.0.tgz", - "integrity": "sha512-S0nG3CLEQiY/ILxqtztTWH/3iRRdyBLw6KMDxnKMchrtbj2OFmehVh0WUCfW3DUrIgx/qFrJPICrq4Z4sTR9UQ==", - "dev": true - }, - "globby": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/globby/-/globby-6.1.0.tgz", - "integrity": "sha1-9abXDoOV4hyFj7BInWTfAkJNUGw=", - "dev": true, - "requires": { - "array-union": "1.0.2", - "glob": "7.1.2", - "object-assign": "4.1.1", - "pify": "2.3.0", - "pinkie-promise": "2.0.1" - }, - "dependencies": { - "pify": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", - "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", - "dev": true - } - } - }, - "got": { - "version": "8.2.0", - "resolved": "https://registry.npmjs.org/got/-/got-8.2.0.tgz", - "integrity": "sha512-giadqJpXIwjY+ZsuWys8p2yjZGhOHiU4hiJHjS/oeCxw1u8vANQz3zPlrxW2Zw/siCXsSMI3hvzWGcnFyujyAg==", - "dev": true, - "requires": { - "@sindresorhus/is": "0.7.0", - "cacheable-request": "2.1.4", - "decompress-response": "3.3.0", - "duplexer3": "0.1.4", - "get-stream": "3.0.0", - "into-stream": "3.1.0", - "is-retry-allowed": "1.1.0", - "isurl": "1.0.0", - "lowercase-keys": "1.0.0", - "mimic-response": "1.0.0", - "p-cancelable": "0.3.0", - "p-timeout": "2.0.1", - "pify": "3.0.0", - "safe-buffer": "5.1.1", - "timed-out": "4.0.1", - "url-parse-lax": "3.0.0", - "url-to-options": "1.0.1" - } - }, - "graceful-fs": { - "version": "4.1.11", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz", - "integrity": "sha1-Dovf5NHduIVNZOBOp8AOKgJuVlg=", - "dev": true - }, - "grouped-queue": { - "version": "0.3.3", - "resolved": "https://registry.npmjs.org/grouped-queue/-/grouped-queue-0.3.3.tgz", - "integrity": "sha1-wWfSpTGcWg4JZO9qJbfC34mWyFw=", - "dev": true, - "requires": { - "lodash": "4.17.5" - } - }, - "har-schema": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-1.0.5.tgz", - "integrity": "sha1-0mMTX0MwfALGAq/I/pWXDAFRNp4=", - "dev": true - }, - "har-validator": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-4.2.1.tgz", - "integrity": "sha1-M0gdDxu/9gDdID11gSpqX7oALio=", - "dev": true, - "requires": { - "ajv": "4.11.8", - "har-schema": "1.0.5" - }, - "dependencies": { - "ajv": { - "version": "4.11.8", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-4.11.8.tgz", - "integrity": "sha1-gv+wKynmYq5TvcIK8VlHcGc5xTY=", - "dev": true, - "requires": { - "co": "4.6.0", - "json-stable-stringify": "1.0.1" - } - } - } - }, - "has-ansi": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz", - "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=", - "dev": true, - "requires": { - "ansi-regex": "2.1.1" - }, - "dependencies": { - "ansi-regex": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", - "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", - "dev": true - } - } - }, - "has-color": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/has-color/-/has-color-0.1.7.tgz", - "integrity": "sha1-ZxRKUmDDT8PMpnfQQdr1L+e3iy8=", - "dev": true - }, - "has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", - "dev": true - }, - "has-symbol-support-x": { - "version": "1.4.2", - "resolved": "https://registry.npmjs.org/has-symbol-support-x/-/has-symbol-support-x-1.4.2.tgz", - "integrity": "sha512-3ToOva++HaW+eCpgqZrCfN51IPB+7bJNVT6CUATzueB5Heb8o6Nam0V3HG5dlDvZU1Gn5QLcbahiKw/XVk5JJw==", - "dev": true - }, - "has-to-string-tag-x": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/has-to-string-tag-x/-/has-to-string-tag-x-1.4.1.tgz", - "integrity": "sha512-vdbKfmw+3LoOYVr+mtxHaX5a96+0f3DljYd8JOqvOLsf5mw2Otda2qCDT9qRqLAhrjyQ0h7ual5nOiASpsGNFw==", - "dev": true, - "requires": { - "has-symbol-support-x": "1.4.2" - } - }, - "has-value": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-value/-/has-value-1.0.0.tgz", - "integrity": "sha1-GLKB2lhbHFxR3vJMkw7SmgvmsXc=", - "dev": true, - "requires": { - "get-value": "2.0.6", - "has-values": "1.0.0", - "isobject": "3.0.1" - } - }, - "has-values": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-values/-/has-values-1.0.0.tgz", - "integrity": "sha1-lbC2P+whRmGab+V/51Yo1aOe/k8=", - "dev": true, - "requires": { - "is-number": "3.0.0", - "kind-of": "4.0.0" - }, - "dependencies": { - "kind-of": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-4.0.0.tgz", - "integrity": "sha1-IIE989cSkosgc3hpGkUGb65y3Vc=", - "dev": true, - "requires": { - "is-buffer": "1.1.6" - } - } - } - }, - "hash-base": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/hash-base/-/hash-base-2.0.2.tgz", - "integrity": "sha1-ZuodhW206KVHDK32/OI65SRO8uE=", - "dev": true, - "requires": { - "inherits": "2.0.3" - } - }, - "hash.js": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/hash.js/-/hash.js-1.1.3.tgz", - "integrity": "sha512-/UETyP0W22QILqS+6HowevwhEFJ3MBJnwTf75Qob9Wz9t0DPuisL8kW8YZMK62dHAKE1c1p+gY1TtOLY+USEHA==", - "dev": true, - "requires": { - "inherits": "2.0.3", - "minimalistic-assert": "1.0.0" - } - }, - "hawk": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/hawk/-/hawk-3.1.3.tgz", - "integrity": "sha1-B4REvXwWQLD+VA0sm3PVlnjo4cQ=", - "dev": true, - "requires": { - "boom": "2.10.1", - "cryptiles": "2.0.5", - "hoek": "2.16.3", - "sntp": "1.0.9" - } - }, - "hmac-drbg": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/hmac-drbg/-/hmac-drbg-1.0.1.tgz", - "integrity": "sha1-0nRXAQJabHdabFRXk+1QL8DGSaE=", - "dev": true, - "requires": { - "hash.js": "1.1.3", - "minimalistic-assert": "1.0.0", - "minimalistic-crypto-utils": "1.0.1" - } - }, - "hoek": { - "version": "2.16.3", - "resolved": "https://registry.npmjs.org/hoek/-/hoek-2.16.3.tgz", - "integrity": "sha1-ILt0A9POo5jpHcRxCo/xuCdKJe0=", - "dev": true - }, - "home-or-tmp": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/home-or-tmp/-/home-or-tmp-2.0.0.tgz", - "integrity": "sha1-42w/LSyufXRqhX440Y1fMqeILbg=", - "dev": true, - "requires": { - "os-homedir": "1.0.2", - "os-tmpdir": "1.0.2" - } - }, - "homedir-polyfill": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/homedir-polyfill/-/homedir-polyfill-1.0.1.tgz", - "integrity": "sha1-TCu8inWJmP7r9e1oWA921GdotLw=", - "dev": true, - "requires": { - "parse-passwd": "1.0.0" - } - }, - "hosted-git-info": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.5.0.tgz", - "integrity": "sha512-pNgbURSuab90KbTqvRPsseaTxOJCZBD0a7t+haSN33piP9cCM4l0CqdzAif2hUqm716UovKB2ROmiabGAKVXyg==", - "dev": true - }, - "http-cache-semantics": { - "version": "3.8.1", - "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-3.8.1.tgz", - "integrity": "sha512-5ai2iksyV8ZXmnZhHH4rWPoxxistEexSi5936zIQ1bnNTW5VnA85B6P/VpXiRM017IgRvb2kKo1a//y+0wSp3w==", - "dev": true - }, - "http-signature": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.1.1.tgz", - "integrity": "sha1-33LiZwZs0Kxn+3at+OE0qPvPkb8=", - "dev": true, - "requires": { - "assert-plus": "0.2.0", - "jsprim": "1.4.1", - "sshpk": "1.13.1" - } - }, - "https-browserify": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/https-browserify/-/https-browserify-1.0.0.tgz", - "integrity": "sha1-7AbBDgo0wPL68Zn3/X/Hj//QPHM=", - "dev": true - }, - "iconv-lite": { - "version": "0.4.19", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.19.tgz", - "integrity": "sha512-oTZqweIP51xaGPI4uPa56/Pri/480R+mo7SeU+YETByQNhDG55ycFyNLIgta9vXhILrxXDmF7ZGhqZIcuN0gJQ==", - "dev": true - }, - "ieee754": { - "version": "1.1.8", - "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.1.8.tgz", - "integrity": "sha1-vjPUCsEO8ZJnAfbwii2G+/0a0+Q=", - "dev": true - }, - "iferr": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/iferr/-/iferr-0.1.5.tgz", - "integrity": "sha1-xg7taebY/bazEEofy8ocGS3FtQE=", - "dev": true - }, - "imurmurhash": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", - "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", - "dev": true - }, - "indent-string": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-2.1.0.tgz", - "integrity": "sha1-ji1INIdCEhtKghi3oTfppSBJ3IA=", - "dev": true, - "requires": { - "repeating": "2.0.1" - } - }, - "indexof": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/indexof/-/indexof-0.0.1.tgz", - "integrity": "sha1-gtwzbSMrkGIXnQWrMpOmYFn9Q10=", - "dev": true - }, - "inflight": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", - "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", - "dev": true, - "requires": { - "once": "1.4.0", - "wrappy": "1.0.2" - } - }, - "inherits": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", - "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", - "dev": true - }, - "ini": { - "version": "1.3.5", - "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.5.tgz", - "integrity": "sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw==", - "dev": true - }, - "inquirer": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-5.1.0.tgz", - "integrity": "sha512-kn7N70US1MSZHZHSGJLiZ7iCwwncc7b0gc68YtlX29OjI3Mp0tSVV+snVXpZ1G+ONS3Ac9zd1m6hve2ibLDYfA==", - "dev": true, - "requires": { - "ansi-escapes": "3.0.0", - "chalk": "2.3.2", - "cli-cursor": "2.1.0", - "cli-width": "2.2.0", - "external-editor": "2.1.0", - "figures": "2.0.0", - "lodash": "4.17.5", - "mute-stream": "0.0.7", - "run-async": "2.3.0", - "rxjs": "5.5.6", - "string-width": "2.1.1", - "strip-ansi": "4.0.0", - "through": "2.3.8" - } - }, - "interpret": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.1.0.tgz", - "integrity": "sha1-ftGxQQxqDg94z5XTuEQMY/eLhhQ=", - "dev": true - }, - "into-stream": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/into-stream/-/into-stream-3.1.0.tgz", - "integrity": "sha1-lvsKk2wSur1v8XUqF9BWFqvQlMY=", - "dev": true, - "requires": { - "from2": "2.3.0", - "p-is-promise": "1.1.0" - } - }, - "invariant": { - "version": "2.2.3", - "resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.3.tgz", - "integrity": "sha512-7Z5PPegwDTyjbaeCnV0efcyS6vdKAU51kpEmS7QFib3P4822l8ICYyMn7qvJnc+WzLoDsuI9gPMKbJ8pCu8XtA==", - "dev": true, - "requires": { - "loose-envify": "1.3.1" - } - }, - "invert-kv": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/invert-kv/-/invert-kv-1.0.0.tgz", - "integrity": "sha1-EEqOSqym09jNFXqO+L+rLXo//bY=", - "dev": true - }, - "is-accessor-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", - "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", - "dev": true, - "requires": { - "kind-of": "6.0.2" - } - }, - "is-arrayish": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", - "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=", - "dev": true - }, - "is-binary-path": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-1.0.1.tgz", - "integrity": "sha1-dfFmQrSA8YenEcgUFh/TpKdlWJg=", - "dev": true, - "requires": { - "binary-extensions": "1.11.0" - } - }, - "is-buffer": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", - "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==", - "dev": true - }, - "is-builtin-module": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-builtin-module/-/is-builtin-module-1.0.0.tgz", - "integrity": "sha1-VAVy0096wxGfj3bDDLwbHgN6/74=", - "dev": true, - "requires": { - "builtin-modules": "1.1.1" - } - }, - "is-data-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", - "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", - "dev": true, - "requires": { - "kind-of": "6.0.2" - } - }, - "is-descriptor": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", - "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", - "dev": true, - "requires": { - "is-accessor-descriptor": "1.0.0", - "is-data-descriptor": "1.0.0", - "kind-of": "6.0.2" - } - }, - "is-dotfile": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/is-dotfile/-/is-dotfile-1.0.3.tgz", - "integrity": "sha1-pqLzL/0t+wT1yiXs0Pa4PPeYoeE=", - "dev": true - }, - "is-equal-shallow": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/is-equal-shallow/-/is-equal-shallow-0.1.3.tgz", - "integrity": "sha1-IjgJj8Ih3gvPpdnqxMRdY4qhxTQ=", - "dev": true, - "requires": { - "is-primitive": "2.0.0" - } - }, - "is-extendable": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", - "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=", - "dev": true - }, - "is-extglob": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", - "dev": true - }, - "is-finite": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-finite/-/is-finite-1.0.2.tgz", - "integrity": "sha1-zGZ3aVYCvlUO8R6LSqYwU0K20Ko=", - "dev": true, - "requires": { - "number-is-nan": "1.0.1" - } - }, - "is-fullwidth-code-point": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", - "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", - "dev": true - }, - "is-glob": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.0.tgz", - "integrity": "sha1-lSHHaEXMJhCoUgPd8ICpWML/q8A=", - "dev": true, - "requires": { - "is-extglob": "2.1.1" - } - }, - "is-number": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", - "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", - "dev": true, - "requires": { - "kind-of": "3.2.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "1.1.6" - } - } - } - }, - "is-object": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-object/-/is-object-1.0.1.tgz", - "integrity": "sha1-iVJojF7C/9awPsyF52ngKQMINHA=", - "dev": true - }, - "is-observable": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/is-observable/-/is-observable-0.2.0.tgz", - "integrity": "sha1-s2ExHYPG5dcmyr9eJQsCNxBvWuI=", - "dev": true, - "requires": { - "symbol-observable": "0.2.4" - }, - "dependencies": { - "symbol-observable": { - "version": "0.2.4", - "resolved": "https://registry.npmjs.org/symbol-observable/-/symbol-observable-0.2.4.tgz", - "integrity": "sha1-lag9smGG1q9+ehjb2XYKL4bQj0A=", - "dev": true - } - } - }, - "is-odd": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-odd/-/is-odd-2.0.0.tgz", - "integrity": "sha512-OTiixgpZAT1M4NHgS5IguFp/Vz2VI3U7Goh4/HA1adtwyLtSBrxYlcSYkhpAE07s4fKEcjrFxyvtQBND4vFQyQ==", - "dev": true, - "requires": { - "is-number": "4.0.0" - }, - "dependencies": { - "is-number": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-4.0.0.tgz", - "integrity": "sha512-rSklcAIlf1OmFdyAqbnWTLVelsQ58uvZ66S/ZyawjWqIviTWCjg2PzVGw8WUA+nNuPTqb4wgA+NszrJ+08LlgQ==", - "dev": true - } - } - }, - "is-plain-obj": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-1.1.0.tgz", - "integrity": "sha1-caUMhCnfync8kqOQpKA7OfzVHT4=", - "dev": true - }, - "is-plain-object": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", - "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", - "dev": true, - "requires": { - "isobject": "3.0.1" - } - }, - "is-posix-bracket": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/is-posix-bracket/-/is-posix-bracket-0.1.1.tgz", - "integrity": "sha1-MzTceXdDaOkvAW5vvAqI9c1ua8Q=", - "dev": true - }, - "is-primitive": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-primitive/-/is-primitive-2.0.0.tgz", - "integrity": "sha1-IHurkWOEmcB7Kt8kCkGochADRXU=", - "dev": true - }, - "is-promise": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-2.1.0.tgz", - "integrity": "sha1-eaKp7OfwlugPNtKy87wWwf9L8/o=", - "dev": true - }, - "is-retry-allowed": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-retry-allowed/-/is-retry-allowed-1.1.0.tgz", - "integrity": "sha1-EaBgVotnM5REAz0BJaYaINVk+zQ=", - "dev": true - }, - "is-scoped": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-scoped/-/is-scoped-1.0.0.tgz", - "integrity": "sha1-RJypgpnnEwOCViieyytUDcQ3yzA=", - "dev": true, - "requires": { - "scoped-regex": "1.0.0" - } - }, - "is-stream": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", - "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=", - "dev": true - }, - "is-typedarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", - "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=", - "dev": true - }, - "is-utf8": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/is-utf8/-/is-utf8-0.2.1.tgz", - "integrity": "sha1-Sw2hRCEE0bM2NA6AeX6GXPOffXI=", - "dev": true - }, - "is-windows": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz", - "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==", - "dev": true - }, - "isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", - "dev": true - }, - "isexe": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", - "dev": true - }, - "isobject": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", - "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", - "dev": true - }, - "isstream": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", - "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=", - "dev": true - }, - "istextorbinary": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/istextorbinary/-/istextorbinary-2.2.1.tgz", - "integrity": "sha512-TS+hoFl8Z5FAFMK38nhBkdLt44CclNRgDHWeMgsV8ko3nDlr/9UI2Sf839sW7enijf8oKsZYXRvM8g0it9Zmcw==", - "dev": true, - "requires": { - "binaryextensions": "2.1.1", - "editions": "1.3.4", - "textextensions": "2.2.0" - } - }, - "isurl": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isurl/-/isurl-1.0.0.tgz", - "integrity": "sha512-1P/yWsxPlDtn7QeRD+ULKQPaIaN6yF368GZ2vDfv0AL0NwpStafjWCDDdn0k8wgFMWpVAqG7oJhxHnlud42i9w==", - "dev": true, - "requires": { - "has-to-string-tag-x": "1.4.1", - "is-object": "1.0.1" - } - }, - "js-tokens": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-3.0.2.tgz", - "integrity": "sha1-mGbfOVECEw449/mWvOtlRDIJwls=", - "dev": true - }, - "jsbn": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", - "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=", - "dev": true, - "optional": true - }, - "jscodeshift": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/jscodeshift/-/jscodeshift-0.4.1.tgz", - "integrity": "sha512-iOX6If+hsw0q99V3n31t4f5VlD1TQZddH08xbT65ZqA7T4Vkx68emrDZMUOLVvCEAJ6NpAk7DECe3fjC/t52AQ==", - "dev": true, - "requires": { - "async": "1.5.2", - "babel-plugin-transform-flow-strip-types": "6.22.0", - "babel-preset-es2015": "6.24.1", - "babel-preset-stage-1": "6.24.1", - "babel-register": "6.26.0", - "babylon": "6.18.0", - "colors": "1.1.2", - "flow-parser": "0.66.0", - "lodash": "4.17.5", - "micromatch": "2.3.11", - "node-dir": "0.1.8", - "nomnom": "1.8.1", - "recast": "0.12.9", - "temp": "0.8.3", - "write-file-atomic": "1.3.4" - }, - "dependencies": { - "arr-diff": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-2.0.0.tgz", - "integrity": "sha1-jzuCf5Vai9ZpaX5KQlasPOrjVs8=", - "dev": true, - "requires": { - "arr-flatten": "1.1.0" - } - }, - "array-unique": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.2.1.tgz", - "integrity": "sha1-odl8yvy8JiXMcPrc6zalDFiwGlM=", - "dev": true - }, - "braces": { - "version": "1.8.5", - "resolved": "https://registry.npmjs.org/braces/-/braces-1.8.5.tgz", - "integrity": "sha1-uneWLhLf+WnWt2cR6RS3N4V79qc=", - "dev": true, - "requires": { - "expand-range": "1.8.2", - "preserve": "0.2.0", - "repeat-element": "1.1.2" - } - }, - "expand-brackets": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-0.1.5.tgz", - "integrity": "sha1-3wcoTjQqgHzXM6xa9yQR5YHRF3s=", - "dev": true, - "requires": { - "is-posix-bracket": "0.1.1" - } - }, - "extglob": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/extglob/-/extglob-0.3.2.tgz", - "integrity": "sha1-Lhj/PS9JqydlzskCPwEdqo2DSaE=", - "dev": true, - "requires": { - "is-extglob": "1.0.0" - } - }, - "is-extglob": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz", - "integrity": "sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA=", - "dev": true - }, - "is-glob": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-2.0.1.tgz", - "integrity": "sha1-0Jb5JqPe1WAPP9/ZEZjLCIjC2GM=", - "dev": true, - "requires": { - "is-extglob": "1.0.0" - } - }, - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "1.1.6" - } - }, - "micromatch": { - "version": "2.3.11", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-2.3.11.tgz", - "integrity": "sha1-hmd8l9FyCzY0MdBNDRUpO9OMFWU=", - "dev": true, - "requires": { - "arr-diff": "2.0.0", - "array-unique": "0.2.1", - "braces": "1.8.5", - "expand-brackets": "0.1.5", - "extglob": "0.3.2", - "filename-regex": "2.0.1", - "is-extglob": "1.0.0", - "is-glob": "2.0.1", - "kind-of": "3.2.2", - "normalize-path": "2.1.1", - "object.omit": "2.0.1", - "parse-glob": "3.0.4", - "regex-cache": "0.4.4" - } - }, - "recast": { - "version": "0.12.9", - "resolved": "https://registry.npmjs.org/recast/-/recast-0.12.9.tgz", - "integrity": "sha512-y7ANxCWmMW8xLOaiopiRDlyjQ9ajKRENBH+2wjntIbk3A6ZR1+BLQttkmSHMY7Arl+AAZFwJ10grg2T6f1WI8A==", - "dev": true, - "requires": { - "ast-types": "0.10.1", - "core-js": "2.5.3", - "esprima": "4.0.0", - "private": "0.1.8", - "source-map": "0.6.1" - } - }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - } - } - }, - "jsesc": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz", - "integrity": "sha1-597mbjXW/Bb3EP6R1c9p9w8IkR0=", - "dev": true - }, - "json-buffer": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.0.tgz", - "integrity": "sha1-Wx85evx11ne96Lz8Dkfh+aPZqJg=", - "dev": true - }, - "json-schema": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz", - "integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM=", - "dev": true - }, - "json-schema-traverse": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.3.1.tgz", - "integrity": "sha1-NJptRMU6Ud6JtAgFxdXlm0F9M0A=", - "dev": true - }, - "json-stable-stringify": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/json-stable-stringify/-/json-stable-stringify-1.0.1.tgz", - "integrity": "sha1-mnWdOcXy/1A/1TAGRu1EX4jE+a8=", - "dev": true, - "requires": { - "jsonify": "0.0.0" - } - }, - "json-stringify-safe": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", - "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=", - "dev": true - }, - "json5": { - "version": "0.5.1", - "resolved": "https://registry.npmjs.org/json5/-/json5-0.5.1.tgz", - "integrity": "sha1-Hq3nrMASA0rYTiOWdn6tn6VJWCE=", - "dev": true - }, - "jsonify": { - "version": "0.0.0", - "resolved": "https://registry.npmjs.org/jsonify/-/jsonify-0.0.0.tgz", - "integrity": "sha1-LHS27kHZPKUbe1qu6PUDYx0lKnM=", - "dev": true - }, - "jsprim": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.1.tgz", - "integrity": "sha1-MT5mvB5cwG5Di8G3SZwuXFastqI=", - "dev": true, - "requires": { - "assert-plus": "1.0.0", - "extsprintf": "1.3.0", - "json-schema": "0.2.3", - "verror": "1.10.0" - }, - "dependencies": { - "assert-plus": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", - "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", - "dev": true - } - } - }, - "keyv": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/keyv/-/keyv-3.0.0.tgz", - "integrity": "sha512-eguHnq22OE3uVoSYG0LVWNP+4ppamWr9+zWBe1bsNcovIMy6huUJFPgy4mGwCd/rnl3vOLGW1MTlu4c57CT1xA==", - "dev": true, - "requires": { - "json-buffer": "3.0.0" - } - }, - "kind-of": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", - "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==", - "dev": true - }, - "lazy-cache": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/lazy-cache/-/lazy-cache-2.0.2.tgz", - "integrity": "sha1-uRkKT5EzVGlIQIWfio9whNiCImQ=", - "dev": true, - "requires": { - "set-getter": "0.1.0" - } - }, - "lcid": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/lcid/-/lcid-1.0.0.tgz", - "integrity": "sha1-MIrMr6C8SDo4Z7S28rlQYlHRuDU=", - "dev": true, - "requires": { - "invert-kv": "1.0.0" - } - }, - "listr": { - "version": "0.13.0", - "resolved": "https://registry.npmjs.org/listr/-/listr-0.13.0.tgz", - "integrity": "sha1-ILsLowuuZg7oTMBQPfS+PVYjiH0=", - "dev": true, - "requires": { - "chalk": "1.1.3", - "cli-truncate": "0.2.1", - "figures": "1.7.0", - "indent-string": "2.1.0", - "is-observable": "0.2.0", - "is-promise": "2.1.0", - "is-stream": "1.1.0", - "listr-silent-renderer": "1.1.1", - "listr-update-renderer": "0.4.0", - "listr-verbose-renderer": "0.4.1", - "log-symbols": "1.0.2", - "log-update": "1.0.2", - "ora": "0.2.3", - "p-map": "1.2.0", - "rxjs": "5.5.6", - "stream-to-observable": "0.2.0", - "strip-ansi": "3.0.1" - }, - "dependencies": { - "ansi-regex": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", - "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", - "dev": true - }, - "ansi-styles": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", - "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", - "dev": true - }, - "chalk": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", - "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", - "dev": true, - "requires": { - "ansi-styles": "2.2.1", - "escape-string-regexp": "1.0.5", - "has-ansi": "2.0.0", - "strip-ansi": "3.0.1", - "supports-color": "2.0.0" - } - }, - "figures": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/figures/-/figures-1.7.0.tgz", - "integrity": "sha1-y+Hjr/zxzUS4DK3+0o3Hk6lwHS4=", - "dev": true, - "requires": { - "escape-string-regexp": "1.0.5", - "object-assign": "4.1.1" - } - }, - "log-symbols": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-1.0.2.tgz", - "integrity": "sha1-N2/3tY6jCGoPCfrMdGF+ylAeGhg=", - "dev": true, - "requires": { - "chalk": "1.1.3" - } - }, - "strip-ansi": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", - "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", - "dev": true, - "requires": { - "ansi-regex": "2.1.1" - } - }, - "supports-color": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", - "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", - "dev": true - } - } - }, - "listr-silent-renderer": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/listr-silent-renderer/-/listr-silent-renderer-1.1.1.tgz", - "integrity": "sha1-kktaN1cVN3C/Go4/v3S4u/P5JC4=", - "dev": true - }, - "listr-update-renderer": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/listr-update-renderer/-/listr-update-renderer-0.4.0.tgz", - "integrity": "sha1-NE2YDaLKLosUW6MFkI8yrj9MyKc=", - "dev": true, - "requires": { - "chalk": "1.1.3", - "cli-truncate": "0.2.1", - "elegant-spinner": "1.0.1", - "figures": "1.7.0", - "indent-string": "3.2.0", - "log-symbols": "1.0.2", - "log-update": "1.0.2", - "strip-ansi": "3.0.1" - }, - "dependencies": { - "ansi-regex": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", - "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", - "dev": true - }, - "ansi-styles": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", - "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", - "dev": true - }, - "chalk": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", - "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", - "dev": true, - "requires": { - "ansi-styles": "2.2.1", - "escape-string-regexp": "1.0.5", - "has-ansi": "2.0.0", - "strip-ansi": "3.0.1", - "supports-color": "2.0.0" - } - }, - "figures": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/figures/-/figures-1.7.0.tgz", - "integrity": "sha1-y+Hjr/zxzUS4DK3+0o3Hk6lwHS4=", - "dev": true, - "requires": { - "escape-string-regexp": "1.0.5", - "object-assign": "4.1.1" - } - }, - "indent-string": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-3.2.0.tgz", - "integrity": "sha1-Sl/W0nzDMvN+VBmlBNu4NxBckok=", - "dev": true - }, - "log-symbols": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-1.0.2.tgz", - "integrity": "sha1-N2/3tY6jCGoPCfrMdGF+ylAeGhg=", - "dev": true, - "requires": { - "chalk": "1.1.3" - } - }, - "strip-ansi": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", - "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", - "dev": true, - "requires": { - "ansi-regex": "2.1.1" - } - }, - "supports-color": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", - "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", - "dev": true - } - } - }, - "listr-verbose-renderer": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/listr-verbose-renderer/-/listr-verbose-renderer-0.4.1.tgz", - "integrity": "sha1-ggb0z21S3cWCfl/RSYng6WWTOjU=", - "dev": true, - "requires": { - "chalk": "1.1.3", - "cli-cursor": "1.0.2", - "date-fns": "1.29.0", - "figures": "1.7.0" - }, - "dependencies": { - "ansi-regex": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", - "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", - "dev": true - }, - "ansi-styles": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", - "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", - "dev": true - }, - "chalk": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", - "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", - "dev": true, - "requires": { - "ansi-styles": "2.2.1", - "escape-string-regexp": "1.0.5", - "has-ansi": "2.0.0", - "strip-ansi": "3.0.1", - "supports-color": "2.0.0" - } - }, - "cli-cursor": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-1.0.2.tgz", - "integrity": "sha1-ZNo/fValRBLll5S9Ytw1KV6PKYc=", - "dev": true, - "requires": { - "restore-cursor": "1.0.1" - } - }, - "figures": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/figures/-/figures-1.7.0.tgz", - "integrity": "sha1-y+Hjr/zxzUS4DK3+0o3Hk6lwHS4=", - "dev": true, - "requires": { - "escape-string-regexp": "1.0.5", - "object-assign": "4.1.1" - } - }, - "onetime": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-1.1.0.tgz", - "integrity": "sha1-ofeDj4MUxRbwXs78vEzP4EtO14k=", - "dev": true - }, - "restore-cursor": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-1.0.1.tgz", - "integrity": "sha1-NGYfRohjJ/7SmRR5FSJS35LapUE=", - "dev": true, - "requires": { - "exit-hook": "1.1.1", - "onetime": "1.1.0" - } - }, - "strip-ansi": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", - "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", - "dev": true, - "requires": { - "ansi-regex": "2.1.1" - } - }, - "supports-color": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", - "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", - "dev": true - } - } - }, - "load-json-file": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-2.0.0.tgz", - "integrity": "sha1-eUfkIUmvgNaWy/eXvKq8/h/inKg=", - "dev": true, - "requires": { - "graceful-fs": "4.1.11", - "parse-json": "2.2.0", - "pify": "2.3.0", - "strip-bom": "3.0.0" - }, - "dependencies": { - "pify": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", - "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", - "dev": true - } - } - }, - "loader-runner": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-2.3.0.tgz", - "integrity": "sha1-9IKuqC1UPgeSFwDVpG7yb9rGuKI=", - "dev": true - }, - "loader-utils": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.1.0.tgz", - "integrity": "sha1-yYrvSIvM7aL/teLeZG1qdUQp9c0=", - "dev": true, - "requires": { - "big.js": "3.2.0", - "emojis-list": "2.1.0", - "json5": "0.5.1" - } - }, - "locate-path": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", - "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=", - "dev": true, - "requires": { - "p-locate": "2.0.0", - "path-exists": "3.0.0" - } - }, - "lodash": { - "version": "4.17.5", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.5.tgz", - "integrity": "sha512-svL3uiZf1RwhH+cWrfZn3A4+U58wbP0tGVTLQPbjplZxZ8ROD9VLuNgsRniTlLe7OlSqR79RUehXgpBW/s0IQw==", - "dev": true - }, - "log-symbols": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-2.2.0.tgz", - "integrity": "sha512-VeIAFslyIerEJLXHziedo2basKbMKtTw3vfn5IzG0XTjhAVEJyNHnL2p7vc+wBDSdQuUpNw3M2u6xb9QsAY5Eg==", - "dev": true, - "requires": { - "chalk": "2.3.2" - } - }, - "log-update": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/log-update/-/log-update-1.0.2.tgz", - "integrity": "sha1-GZKfZMQJPS0ucHWh2tivWcKWuNE=", - "dev": true, - "requires": { - "ansi-escapes": "1.4.0", - "cli-cursor": "1.0.2" - }, - "dependencies": { - "ansi-escapes": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-1.4.0.tgz", - "integrity": "sha1-06ioOzGapneTZisT52HHkRQiMG4=", - "dev": true - }, - "cli-cursor": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-1.0.2.tgz", - "integrity": "sha1-ZNo/fValRBLll5S9Ytw1KV6PKYc=", - "dev": true, - "requires": { - "restore-cursor": "1.0.1" - } - }, - "onetime": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-1.1.0.tgz", - "integrity": "sha1-ofeDj4MUxRbwXs78vEzP4EtO14k=", - "dev": true - }, - "restore-cursor": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-1.0.1.tgz", - "integrity": "sha1-NGYfRohjJ/7SmRR5FSJS35LapUE=", - "dev": true, - "requires": { - "exit-hook": "1.1.1", - "onetime": "1.1.0" - } - } - } - }, - "loose-envify": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.3.1.tgz", - "integrity": "sha1-0aitM/qc4OcT1l/dCsi3SNR4yEg=", - "dev": true, - "requires": { - "js-tokens": "3.0.2" - } - }, - "lowercase-keys": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-1.0.0.tgz", - "integrity": "sha1-TjNms55/VFfjXxMkvfb4jQv8cwY=", - "dev": true - }, - "lru-cache": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.1.tgz", - "integrity": "sha512-q4spe4KTfsAS1SUHLO0wz8Qiyf1+vMIAgpRYioFYDMNqKfHQbg+AVDH3i4fvpl71/P1L0dBl+fQi+P37UYf0ew==", - "dev": true, - "requires": { - "pseudomap": "1.0.2", - "yallist": "2.1.2" - } - }, - "make-dir": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-1.2.0.tgz", - "integrity": "sha512-aNUAa4UMg/UougV25bbrU4ZaaKNjJ/3/xnvg/twpmKROPdKZPZ9wGgI0opdZzO8q/zUFawoUuixuOv33eZ61Iw==", - "dev": true, - "requires": { - "pify": "3.0.0" - } - }, - "map-cache": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/map-cache/-/map-cache-0.2.2.tgz", - "integrity": "sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8=", - "dev": true - }, - "map-visit": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/map-visit/-/map-visit-1.0.0.tgz", - "integrity": "sha1-7Nyo8TFE5mDxtb1B8S80edmN+48=", - "dev": true, - "requires": { - "object-visit": "1.0.1" - } - }, - "md5.js": { - "version": "1.3.4", - "resolved": "https://registry.npmjs.org/md5.js/-/md5.js-1.3.4.tgz", - "integrity": "sha1-6b296UogpawYsENA/Fdk1bCdkB0=", - "dev": true, - "requires": { - "hash-base": "3.0.4", - "inherits": "2.0.3" - }, - "dependencies": { - "hash-base": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/hash-base/-/hash-base-3.0.4.tgz", - "integrity": "sha1-X8hoaEfs1zSZQDMZprCj8/auSRg=", - "dev": true, - "requires": { - "inherits": "2.0.3", - "safe-buffer": "5.1.1" - } - } - } - }, - "mem": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/mem/-/mem-1.1.0.tgz", - "integrity": "sha1-Xt1StIXKHZAP5kiVUFOZoN+kX3Y=", - "dev": true, - "requires": { - "mimic-fn": "1.2.0" - } - }, - "mem-fs": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/mem-fs/-/mem-fs-1.1.3.tgz", - "integrity": "sha1-uK6NLj/Lb10/kWXBLUVRoGXZicw=", - "dev": true, - "requires": { - "through2": "2.0.3", - "vinyl": "1.2.0", - "vinyl-file": "2.0.0" - } - }, - "mem-fs-editor": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/mem-fs-editor/-/mem-fs-editor-3.0.2.tgz", - "integrity": "sha1-3Qpuryu4prN3QAZ6pUnrUwEFr58=", - "dev": true, - "requires": { - "commondir": "1.0.1", - "deep-extend": "0.4.2", - "ejs": "2.5.7", - "glob": "7.1.2", - "globby": "6.1.0", - "mkdirp": "0.5.1", - "multimatch": "2.1.0", - "rimraf": "2.6.2", - "through2": "2.0.3", - "vinyl": "2.1.0" - }, - "dependencies": { - "clone": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/clone/-/clone-2.1.1.tgz", - "integrity": "sha1-0hfR6WERjjrJpLi7oyhVU79kfNs=", - "dev": true - }, - "clone-stats": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/clone-stats/-/clone-stats-1.0.0.tgz", - "integrity": "sha1-s3gt/4u1R04Yuba/D9/ngvh3doA=", - "dev": true - }, - "replace-ext": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/replace-ext/-/replace-ext-1.0.0.tgz", - "integrity": "sha1-3mMSg3P8v3w8z6TeWkgMRaZ5WOs=", - "dev": true - }, - "vinyl": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/vinyl/-/vinyl-2.1.0.tgz", - "integrity": "sha1-Ah+cLPlR1rk5lDyJ617lrdT9kkw=", - "dev": true, - "requires": { - "clone": "2.1.1", - "clone-buffer": "1.0.0", - "clone-stats": "1.0.0", - "cloneable-readable": "1.0.0", - "remove-trailing-separator": "1.1.0", - "replace-ext": "1.0.0" - } - } - } - }, - "memory-fs": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/memory-fs/-/memory-fs-0.4.1.tgz", - "integrity": "sha1-OpoguEYlI+RHz7x+i7gO1me/xVI=", - "dev": true, - "requires": { - "errno": "0.1.7", - "readable-stream": "2.3.5" - } - }, - "micromatch": { - "version": "3.1.9", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.9.tgz", - "integrity": "sha512-SlIz6sv5UPaAVVFRKodKjCg48EbNoIhgetzfK/Cy0v5U52Z6zB136M8tp0UC9jM53LYbmIRihJszvvqpKkfm9g==", - "dev": true, - "requires": { - "arr-diff": "4.0.0", - "array-unique": "0.3.2", - "braces": "2.3.1", - "define-property": "2.0.2", - "extend-shallow": "3.0.2", - "extglob": "2.0.4", - "fragment-cache": "0.2.1", - "kind-of": "6.0.2", - "nanomatch": "1.2.9", - "object.pick": "1.3.0", - "regex-not": "1.0.2", - "snapdragon": "0.8.1", - "to-regex": "3.0.2" - } - }, - "miller-rabin": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/miller-rabin/-/miller-rabin-4.0.1.tgz", - "integrity": "sha512-115fLhvZVqWwHPbClyntxEVfVDfl9DLLTuJvq3g2O/Oxi8AiNouAHvDSzHS0viUJc+V5vm3eq91Xwqn9dp4jRA==", - "dev": true, - "requires": { - "bn.js": "4.11.8", - "brorand": "1.1.0" - } - }, - "mime-db": { - "version": "1.33.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.33.0.tgz", - "integrity": "sha512-BHJ/EKruNIqJf/QahvxwQZXKygOQ256myeN/Ew+THcAa5q+PjyTTMMeNQC4DZw5AwfvelsUrA6B67NKMqXDbzQ==", - "dev": true - }, - "mime-types": { - "version": "2.1.18", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.18.tgz", - "integrity": "sha512-lc/aahn+t4/SWV/qcmumYjymLsWfN3ELhpmVuUFjgsORruuZPVSwAQryq+HHGvO/SI2KVX26bx+En+zhM8g8hQ==", - "dev": true, - "requires": { - "mime-db": "1.33.0" - } - }, - "mimic-fn": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-1.2.0.tgz", - "integrity": "sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ==", - "dev": true - }, - "mimic-response": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-1.0.0.tgz", - "integrity": "sha1-3z02Uqc/3ta5sLJBRub9BSNTRY4=", - "dev": true - }, - "min-document": { - "version": "2.19.0", - "resolved": "https://registry.npmjs.org/min-document/-/min-document-2.19.0.tgz", - "integrity": "sha1-e9KC4/WELtKVu3SM3Z8f+iyCRoU=", - "dev": true, - "requires": { - "dom-walk": "0.1.1" - } - }, - "minimalistic-assert": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.0.tgz", - "integrity": "sha1-cCvi3aazf0g2vLP121ZkG2Sh09M=", - "dev": true - }, - "minimalistic-crypto-utils": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz", - "integrity": "sha1-9sAMHAsIIkblxNmd+4x8CDsrWCo=", - "dev": true - }, - "minimatch": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", - "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", - "dev": true, - "requires": { - "brace-expansion": "1.1.11" - } - }, - "minimist": { - "version": "0.0.8", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", - "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=", - "dev": true - }, - "mississippi": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/mississippi/-/mississippi-2.0.0.tgz", - "integrity": "sha512-zHo8v+otD1J10j/tC+VNoGK9keCuByhKovAvdn74dmxJl9+mWHnx6EMsDN4lgRoMI/eYo2nchAxniIbUPb5onw==", - "dev": true, - "requires": { - "concat-stream": "1.6.1", - "duplexify": "3.5.4", - "end-of-stream": "1.4.1", - "flush-write-stream": "1.0.2", - "from2": "2.3.0", - "parallel-transform": "1.1.0", - "pump": "2.0.1", - "pumpify": "1.4.0", - "stream-each": "1.2.2", - "through2": "2.0.3" - } - }, - "mixin-deep": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/mixin-deep/-/mixin-deep-1.3.1.tgz", - "integrity": "sha512-8ZItLHeEgaqEvd5lYBXfm4EZSFCX29Jb9K+lAHhDKzReKBQKj3R+7NOF6tjqYi9t4oI8VUfaWITJQm86wnXGNQ==", - "dev": true, - "requires": { - "for-in": "1.0.2", - "is-extendable": "1.0.1" - }, - "dependencies": { - "is-extendable": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", - "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", - "dev": true, - "requires": { - "is-plain-object": "2.0.4" - } - } - } - }, - "mkdirp": { - "version": "0.5.1", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", - "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", - "dev": true, - "requires": { - "minimist": "0.0.8" - } - }, - "move-concurrently": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/move-concurrently/-/move-concurrently-1.0.1.tgz", - "integrity": "sha1-viwAX9oy4LKa8fBdfEszIUxwH5I=", - "dev": true, - "requires": { - "aproba": "1.2.0", - "copy-concurrently": "1.0.5", - "fs-write-stream-atomic": "1.0.10", - "mkdirp": "0.5.1", - "rimraf": "2.6.2", - "run-queue": "1.0.3" - } - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", - "dev": true - }, - "multimatch": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/multimatch/-/multimatch-2.1.0.tgz", - "integrity": "sha1-nHkGoi+0wCkZ4vX3UWG0zb1LKis=", - "dev": true, - "requires": { - "array-differ": "1.0.0", - "array-union": "1.0.2", - "arrify": "1.0.1", - "minimatch": "3.0.4" - } - }, - "mute-stream": { - "version": "0.0.7", - "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.7.tgz", - "integrity": "sha1-MHXOk7whuPq0PhvE2n6BFe0ee6s=", - "dev": true - }, - "nan": { - "version": "2.9.2", - "resolved": "https://registry.npmjs.org/nan/-/nan-2.9.2.tgz", - "integrity": "sha512-ltW65co7f3PQWBDbqVvaU1WtFJUsNW7sWWm4HINhbMQIyVyzIeyZ8toX5TC5eeooE6piZoaEh4cZkueSKG3KYw==", - "dev": true, - "optional": true - }, - "nanomatch": { - "version": "1.2.9", - "resolved": "https://registry.npmjs.org/nanomatch/-/nanomatch-1.2.9.tgz", - "integrity": "sha512-n8R9bS8yQ6eSXaV6jHUpKzD8gLsin02w1HSFiegwrs9E098Ylhw5jdyKPaYqvHknHaSCKTPp7C8dGCQ0q9koXA==", - "dev": true, - "requires": { - "arr-diff": "4.0.0", - "array-unique": "0.3.2", - "define-property": "2.0.2", - "extend-shallow": "3.0.2", - "fragment-cache": "0.2.1", - "is-odd": "2.0.0", - "is-windows": "1.0.2", - "kind-of": "6.0.2", - "object.pick": "1.3.0", - "regex-not": "1.0.2", - "snapdragon": "0.8.1", - "to-regex": "3.0.2" - } - }, - "neo-async": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.5.0.tgz", - "integrity": "sha512-nJmSswG4As/MkRq7QZFuH/sf/yuv8ODdMZrY4Bedjp77a5MK4A6s7YbBB64c9u79EBUOfXUXBvArmvzTD0X+6g==", - "dev": true - }, - "nice-try": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.4.tgz", - "integrity": "sha512-2NpiFHqC87y/zFke0fC0spBXL3bBsoh/p5H1EFhshxjCR5+0g2d6BiXbUFz9v1sAcxsk2htp2eQnNIci2dIYcA==", - "dev": true - }, - "node-dir": { - "version": "0.1.8", - "resolved": "https://registry.npmjs.org/node-dir/-/node-dir-0.1.8.tgz", - "integrity": "sha1-VfuN62mQcHB/tn+RpGDwRIKUx30=", - "dev": true - }, - "node-libs-browser": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/node-libs-browser/-/node-libs-browser-2.1.0.tgz", - "integrity": "sha512-5AzFzdoIMb89hBGMZglEegffzgRg+ZFoUmisQ8HI4j1KDdpx13J0taNp2y9xPbur6W61gepGDDotGBVQ7mfUCg==", - "dev": true, - "requires": { - "assert": "1.4.1", - "browserify-zlib": "0.2.0", - "buffer": "4.9.1", - "console-browserify": "1.1.0", - "constants-browserify": "1.0.0", - "crypto-browserify": "3.12.0", - "domain-browser": "1.2.0", - "events": "1.1.1", - "https-browserify": "1.0.0", - "os-browserify": "0.3.0", - "path-browserify": "0.0.0", - "process": "0.11.10", - "punycode": "1.4.1", - "querystring-es3": "0.2.1", - "readable-stream": "2.3.5", - "stream-browserify": "2.0.1", - "stream-http": "2.8.0", - "string_decoder": "1.0.3", - "timers-browserify": "2.0.6", - "tty-browserify": "0.0.0", - "url": "0.11.0", - "util": "0.10.3", - "vm-browserify": "0.0.4" - } - }, - "nomnom": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/nomnom/-/nomnom-1.8.1.tgz", - "integrity": "sha1-IVH3Ikcrp55Qp2/BJbuMjy5Nwqc=", - "dev": true, - "requires": { - "chalk": "0.4.0", - "underscore": "1.6.0" - }, - "dependencies": { - "ansi-styles": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-1.0.0.tgz", - "integrity": "sha1-yxAt8cVvUSPquLZ817mAJ6AnkXg=", - "dev": true - }, - "chalk": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-0.4.0.tgz", - "integrity": "sha1-UZmj3c0MHv4jvAjBsCewYXbgxk8=", - "dev": true, - "requires": { - "ansi-styles": "1.0.0", - "has-color": "0.1.7", - "strip-ansi": "0.1.1" - } - }, - "strip-ansi": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-0.1.1.tgz", - "integrity": "sha1-OeipjQRNFQZgq+SmgIrPcLt7yZE=", - "dev": true - } - } - }, - "normalize-package-data": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.4.0.tgz", - "integrity": "sha512-9jjUFbTPfEy3R/ad/2oNbKtW9Hgovl5O1FvFWKkKblNXoN/Oou6+9+KKohPK13Yc3/TyunyWhJp6gvRNR/PPAw==", - "dev": true, - "requires": { - "hosted-git-info": "2.5.0", - "is-builtin-module": "1.0.0", - "semver": "5.5.0", - "validate-npm-package-license": "3.0.3" - } - }, - "normalize-path": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", - "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=", - "dev": true, - "requires": { - "remove-trailing-separator": "1.1.0" - } - }, - "normalize-url": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-2.0.1.tgz", - "integrity": "sha512-D6MUW4K/VzoJ4rJ01JFKxDrtY1v9wrgzCX5f2qj/lzH1m/lW6MhUZFKerVsnyjOhOsYzI9Kqqak+10l4LvLpMw==", - "dev": true, - "requires": { - "prepend-http": "2.0.0", - "query-string": "5.1.0", - "sort-keys": "2.0.0" - } - }, - "npm-run-path": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz", - "integrity": "sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8=", - "dev": true, - "requires": { - "path-key": "2.0.1" - } - }, - "number-is-nan": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", - "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=", - "dev": true - }, - "oauth-sign": { - "version": "0.8.2", - "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.8.2.tgz", - "integrity": "sha1-Rqarfwrq2N6unsBWV4C31O/rnUM=", - "dev": true - }, - "object-assign": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", - "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=", - "dev": true - }, - "object-copy": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/object-copy/-/object-copy-0.1.0.tgz", - "integrity": "sha1-fn2Fi3gb18mRpBupde04EnVOmYw=", - "dev": true, - "requires": { - "copy-descriptor": "0.1.1", - "define-property": "0.2.5", - "kind-of": "3.2.2" - }, - "dependencies": { - "define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "dev": true, - "requires": { - "is-descriptor": "0.1.6" - } - }, - "is-accessor-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", - "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", - "dev": true, - "requires": { - "kind-of": "3.2.2" - } - }, - "is-data-descriptor": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", - "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", - "dev": true, - "requires": { - "kind-of": "3.2.2" - } - }, - "is-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", - "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", - "dev": true, - "requires": { - "is-accessor-descriptor": "0.1.6", - "is-data-descriptor": "0.1.4", - "kind-of": "5.1.0" - }, - "dependencies": { - "kind-of": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", - "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", - "dev": true - } - } - }, - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "1.1.6" - } - } - } - }, - "object-visit": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/object-visit/-/object-visit-1.0.1.tgz", - "integrity": "sha1-95xEk68MU3e1n+OdOV5BBC3QRbs=", - "dev": true, - "requires": { - "isobject": "3.0.1" - } - }, - "object.omit": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/object.omit/-/object.omit-2.0.1.tgz", - "integrity": "sha1-Gpx0SCnznbuFjHbKNXmuKlTr0fo=", - "dev": true, - "requires": { - "for-own": "0.1.5", - "is-extendable": "0.1.1" - } - }, - "object.pick": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/object.pick/-/object.pick-1.3.0.tgz", - "integrity": "sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c=", - "dev": true, - "requires": { - "isobject": "3.0.1" - } - }, - "once": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", - "dev": true, - "requires": { - "wrappy": "1.0.2" - } - }, - "onetime": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-2.0.1.tgz", - "integrity": "sha1-BnQoIw/WdEOyeUsiu6UotoZ5YtQ=", - "dev": true, - "requires": { - "mimic-fn": "1.2.0" - } - }, - "ora": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/ora/-/ora-0.2.3.tgz", - "integrity": "sha1-N1J9Igrc1Tw5tzVx11QVbV22V6Q=", - "dev": true, - "requires": { - "chalk": "1.1.3", - "cli-cursor": "1.0.2", - "cli-spinners": "0.1.2", - "object-assign": "4.1.1" - }, - "dependencies": { - "ansi-regex": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", - "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", - "dev": true - }, - "ansi-styles": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", - "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", - "dev": true - }, - "chalk": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", - "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", - "dev": true, - "requires": { - "ansi-styles": "2.2.1", - "escape-string-regexp": "1.0.5", - "has-ansi": "2.0.0", - "strip-ansi": "3.0.1", - "supports-color": "2.0.0" - } - }, - "cli-cursor": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-1.0.2.tgz", - "integrity": "sha1-ZNo/fValRBLll5S9Ytw1KV6PKYc=", - "dev": true, - "requires": { - "restore-cursor": "1.0.1" - } - }, - "onetime": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-1.1.0.tgz", - "integrity": "sha1-ofeDj4MUxRbwXs78vEzP4EtO14k=", - "dev": true - }, - "restore-cursor": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-1.0.1.tgz", - "integrity": "sha1-NGYfRohjJ/7SmRR5FSJS35LapUE=", - "dev": true, - "requires": { - "exit-hook": "1.1.1", - "onetime": "1.1.0" - } - }, - "strip-ansi": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", - "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", - "dev": true, - "requires": { - "ansi-regex": "2.1.1" - } - }, - "supports-color": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", - "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", - "dev": true - } - } - }, - "os-browserify": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/os-browserify/-/os-browserify-0.3.0.tgz", - "integrity": "sha1-hUNzx/XCMVkU/Jv8a9gjj92h7Cc=", - "dev": true - }, - "os-homedir": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz", - "integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M=", - "dev": true - }, - "os-locale": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-2.1.0.tgz", - "integrity": "sha512-3sslG3zJbEYcaC4YVAvDorjGxc7tv6KVATnLPZONiljsUncvihe9BQoVCEs0RZ1kmf4Hk9OBqlZfJZWI4GanKA==", - "dev": true, - "requires": { - "execa": "0.7.0", - "lcid": "1.0.0", - "mem": "1.1.0" - } - }, - "os-shim": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/os-shim/-/os-shim-0.1.3.tgz", - "integrity": "sha1-a2LDeRz3kJ6jXtRuF2WLtBfLORc=", - "dev": true - }, - "os-tmpdir": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", - "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=", - "dev": true - }, - "p-cancelable": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-0.3.0.tgz", - "integrity": "sha512-RVbZPLso8+jFeq1MfNvgXtCRED2raz/dKpacfTNxsx6pLEpEomM7gah6VeHSYV3+vo0OAi4MkArtQcWWXuQoyw==", - "dev": true - }, - "p-each-series": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/p-each-series/-/p-each-series-1.0.0.tgz", - "integrity": "sha1-kw89Et0fUOdDRFeiLNbwSsatf3E=", - "dev": true, - "requires": { - "p-reduce": "1.0.0" - } - }, - "p-finally": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz", - "integrity": "sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4=", - "dev": true - }, - "p-is-promise": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/p-is-promise/-/p-is-promise-1.1.0.tgz", - "integrity": "sha1-nJRWmJ6fZYgBewQ01WCXZ1w9oF4=", - "dev": true - }, - "p-lazy": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/p-lazy/-/p-lazy-1.0.0.tgz", - "integrity": "sha1-7FPIAvLuOsKPFmzILQsrAt4nqDU=", - "dev": true - }, - "p-limit": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.2.0.tgz", - "integrity": "sha512-Y/OtIaXtUPr4/YpMv1pCL5L5ed0rumAaAeBSj12F+bSlMdys7i8oQF/GUJmfpTS/QoaRrS/k6pma29haJpsMng==", - "dev": true, - "requires": { - "p-try": "1.0.0" - } - }, - "p-locate": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", - "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=", - "dev": true, - "requires": { - "p-limit": "1.2.0" - } - }, - "p-map": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/p-map/-/p-map-1.2.0.tgz", - "integrity": "sha512-r6zKACMNhjPJMTl8KcFH4li//gkrXWfbD6feV8l6doRHlzljFWGJ2AP6iKaCJXyZmAUMOPtvbW7EXkbWO/pLEA==", - "dev": true - }, - "p-reduce": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/p-reduce/-/p-reduce-1.0.0.tgz", - "integrity": "sha1-GMKw3ZNqRpClKfgjH1ig/bakffo=", - "dev": true - }, - "p-timeout": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/p-timeout/-/p-timeout-2.0.1.tgz", - "integrity": "sha512-88em58dDVB/KzPEx1X0N3LwFfYZPyDc4B6eF38M1rk9VTZMbxXXgjugz8mmwpS9Ox4BDZ+t6t3QP5+/gazweIA==", - "dev": true, - "requires": { - "p-finally": "1.0.0" - } - }, - "p-try": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz", - "integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=", - "dev": true - }, - "pako": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.6.tgz", - "integrity": "sha512-lQe48YPsMJAig+yngZ87Lus+NF+3mtu7DVOBu6b/gHO1YpKwIj5AWjZ/TOS7i46HD/UixzWb1zeWDZfGZ3iYcg==", - "dev": true - }, - "parallel-transform": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/parallel-transform/-/parallel-transform-1.1.0.tgz", - "integrity": "sha1-1BDwZbBdojCB/NEPKIVMKb2jOwY=", - "dev": true, - "requires": { - "cyclist": "0.2.2", - "inherits": "2.0.3", - "readable-stream": "2.3.5" - } - }, - "parse-asn1": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/parse-asn1/-/parse-asn1-5.1.0.tgz", - "integrity": "sha1-N8T5t+06tlx0gXtfJICTf7+XxxI=", - "dev": true, - "requires": { - "asn1.js": "4.10.1", - "browserify-aes": "1.1.1", - "create-hash": "1.1.3", - "evp_bytestokey": "1.0.3", - "pbkdf2": "3.0.14" - } - }, - "parse-glob": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/parse-glob/-/parse-glob-3.0.4.tgz", - "integrity": "sha1-ssN2z7EfNVE7rdFz7wu246OIORw=", - "dev": true, - "requires": { - "glob-base": "0.3.0", - "is-dotfile": "1.0.3", - "is-extglob": "1.0.0", - "is-glob": "2.0.1" - }, - "dependencies": { - "is-extglob": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz", - "integrity": "sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA=", - "dev": true - }, - "is-glob": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-2.0.1.tgz", - "integrity": "sha1-0Jb5JqPe1WAPP9/ZEZjLCIjC2GM=", - "dev": true, - "requires": { - "is-extglob": "1.0.0" - } - } - } - }, - "parse-json": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz", - "integrity": "sha1-9ID0BDTvgHQfhGkJn43qGPVaTck=", - "dev": true, - "requires": { - "error-ex": "1.3.1" - } - }, - "parse-passwd": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/parse-passwd/-/parse-passwd-1.0.0.tgz", - "integrity": "sha1-bVuTSkVpk7I9N/QKOC1vFmao5cY=", - "dev": true - }, - "pascalcase": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/pascalcase/-/pascalcase-0.1.1.tgz", - "integrity": "sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ=", - "dev": true - }, - "path-browserify": { - "version": "0.0.0", - "resolved": "https://registry.npmjs.org/path-browserify/-/path-browserify-0.0.0.tgz", - "integrity": "sha1-oLhwcpquIUAFt9UDLsLLuw+0RRo=", - "dev": true - }, - "path-dirname": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/path-dirname/-/path-dirname-1.0.2.tgz", - "integrity": "sha1-zDPSTVJeCZpTiMAzbG4yuRYGCeA=", - "dev": true - }, - "path-exists": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", - "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", - "dev": true - }, - "path-is-absolute": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", - "dev": true - }, - "path-key": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", - "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=", - "dev": true - }, - "path-parse": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.5.tgz", - "integrity": "sha1-PBrfhx6pzWyUMbbqK9dKD/BVxME=", - "dev": true - }, - "path-type": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-2.0.0.tgz", - "integrity": "sha1-8BLMuEFbcJb8LaoQVMPXI4lZTHM=", - "dev": true, - "requires": { - "pify": "2.3.0" - }, - "dependencies": { - "pify": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", - "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", - "dev": true - } - } - }, - "pbkdf2": { - "version": "3.0.14", - "resolved": "https://registry.npmjs.org/pbkdf2/-/pbkdf2-3.0.14.tgz", - "integrity": "sha512-gjsZW9O34fm0R7PaLHRJmLLVfSoesxztjPjE9o6R+qtVJij90ltg1joIovN9GKrRW3t1PzhDDG3UMEMFfZ+1wA==", - "dev": true, - "requires": { - "create-hash": "1.1.3", - "create-hmac": "1.1.6", - "ripemd160": "2.0.1", - "safe-buffer": "5.1.1", - "sha.js": "2.4.10" - } - }, - "performance-now": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-0.2.0.tgz", - "integrity": "sha1-M+8wxcd9TqIcWlOGnZG1bY8lVeU=", - "dev": true - }, - "pify": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", - "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", - "dev": true - }, - "pinkie": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz", - "integrity": "sha1-clVrgM+g1IqXToDnckjoDtT3+HA=", - "dev": true - }, - "pinkie-promise": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz", - "integrity": "sha1-ITXW36ejWMBprJsXh3YogihFD/o=", - "dev": true, - "requires": { - "pinkie": "2.0.4" - } - }, - "pkg-dir": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-2.0.0.tgz", - "integrity": "sha1-9tXREJ4Z1j7fQo4L1X4Sd3YVM0s=", - "dev": true, - "requires": { - "find-up": "2.1.0" - } - }, - "posix-character-classes": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/posix-character-classes/-/posix-character-classes-0.1.1.tgz", - "integrity": "sha1-AerA/jta9xoqbAL+q7jB/vfgDqs=", - "dev": true - }, - "prepend-http": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/prepend-http/-/prepend-http-2.0.0.tgz", - "integrity": "sha1-6SQ0v6XqjBn0HN/UAddBo8gZ2Jc=", - "dev": true - }, - "preserve": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/preserve/-/preserve-0.2.0.tgz", - "integrity": "sha1-gV7R9uvGWSb4ZbMQwHE7yzMVzks=", - "dev": true - }, - "prettier": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/prettier/-/prettier-1.11.1.tgz", - "integrity": "sha512-T/KD65Ot0PB97xTrG8afQ46x3oiVhnfGjGESSI9NWYcG92+OUPZKkwHqGWXH2t9jK1crnQjubECW0FuOth+hxw==", - "dev": true - }, - "pretty-bytes": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/pretty-bytes/-/pretty-bytes-4.0.2.tgz", - "integrity": "sha1-sr+C5zUNZcbDOqlaqlpPYyf2HNk=", - "dev": true - }, - "private": { - "version": "0.1.8", - "resolved": "https://registry.npmjs.org/private/-/private-0.1.8.tgz", - "integrity": "sha512-VvivMrbvd2nKkiG38qjULzlc+4Vx4wm/whI9pQD35YrARNnhxeiRktSOhSukRLFNlzg6Br/cJPet5J/u19r/mg==", - "dev": true - }, - "process": { - "version": "0.11.10", - "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", - "integrity": "sha1-czIwDoQBYb2j5podHZGn1LwW8YI=", - "dev": true - }, - "process-nextick-args": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.0.tgz", - "integrity": "sha512-MtEC1TqN0EU5nephaJ4rAtThHtC86dNN9qCuEhtshvpVBkAW5ZO7BASN9REnF9eoXGcRub+pFuKEpOHE+HbEMw==", - "dev": true - }, - "promise-inflight": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/promise-inflight/-/promise-inflight-1.0.1.tgz", - "integrity": "sha1-mEcocL8igTL8vdhoEputEsPAKeM=", - "dev": true - }, - "prr": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/prr/-/prr-1.0.1.tgz", - "integrity": "sha1-0/wRS6BplaRexok/SEzrHXj19HY=", - "dev": true - }, - "pseudomap": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz", - "integrity": "sha1-8FKijacOYYkX7wqKw0wa5aaChrM=", - "dev": true - }, - "public-encrypt": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/public-encrypt/-/public-encrypt-4.0.0.tgz", - "integrity": "sha1-OfaZ86RlYN1eusvKaTyvfGXBjMY=", - "dev": true, - "requires": { - "bn.js": "4.11.8", - "browserify-rsa": "4.0.1", - "create-hash": "1.1.3", - "parse-asn1": "5.1.0", - "randombytes": "2.0.6" - } - }, - "pump": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/pump/-/pump-2.0.1.tgz", - "integrity": "sha512-ruPMNRkN3MHP1cWJc9OWr+T/xDP0jhXYCLfJcBuX54hhfIBnaQmAUMfDcG4DM5UMWByBbJY69QSphm3jtDKIkA==", - "dev": true, - "requires": { - "end-of-stream": "1.4.1", - "once": "1.4.0" - } - }, - "pumpify": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/pumpify/-/pumpify-1.4.0.tgz", - "integrity": "sha512-2kmNR9ry+Pf45opRVirpNuIFotsxUGLaYqxIwuR77AYrYRMuFCz9eryHBS52L360O+NcR383CL4QYlMKPq4zYA==", - "dev": true, - "requires": { - "duplexify": "3.5.4", - "inherits": "2.0.3", - "pump": "2.0.1" - } - }, - "punycode": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", - "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=", - "dev": true - }, - "qs": { - "version": "6.4.0", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.4.0.tgz", - "integrity": "sha1-E+JtKK1rD/qpExLNO/cI7TUecjM=", - "dev": true - }, - "query-string": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/query-string/-/query-string-5.1.0.tgz", - "integrity": "sha512-F3DkxxlY0AqD/rwe4YAwjRE2HjOkKW7TxsuteyrS/Jbwrxw887PqYBL4sWUJ9D/V1hmFns0SCD6FDyvlwo9RCQ==", - "dev": true, - "requires": { - "decode-uri-component": "0.2.0", - "object-assign": "4.1.1", - "strict-uri-encode": "1.1.0" - } - }, - "querystring": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/querystring/-/querystring-0.2.0.tgz", - "integrity": "sha1-sgmEkgO7Jd+CDadW50cAWHhSFiA=", - "dev": true - }, - "querystring-es3": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/querystring-es3/-/querystring-es3-0.2.1.tgz", - "integrity": "sha1-nsYfeQSYdXB9aUFFlv2Qek1xHnM=", - "dev": true - }, - "randomatic": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/randomatic/-/randomatic-1.1.7.tgz", - "integrity": "sha512-D5JUjPyJbaJDkuAazpVnSfVkLlpeO3wDlPROTMLGKG1zMFNFRgrciKo1ltz/AzNTkqE0HzDx655QOL51N06how==", - "dev": true, - "requires": { - "is-number": "3.0.0", - "kind-of": "4.0.0" - }, - "dependencies": { - "kind-of": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-4.0.0.tgz", - "integrity": "sha1-IIE989cSkosgc3hpGkUGb65y3Vc=", - "dev": true, - "requires": { - "is-buffer": "1.1.6" - } - } - } - }, - "randombytes": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.0.6.tgz", - "integrity": "sha512-CIQ5OFxf4Jou6uOKe9t1AOgqpeU5fd70A8NPdHSGeYXqXsPe6peOwI0cUl88RWZ6sP1vPMV3avd/R6cZ5/sP1A==", - "dev": true, - "requires": { - "safe-buffer": "5.1.1" - } - }, - "randomfill": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/randomfill/-/randomfill-1.0.4.tgz", - "integrity": "sha512-87lcbR8+MhcWcUiQ+9e+Rwx8MyR2P7qnt15ynUlbm3TU/fjbgz4GsvfSUDTemtCCtVCqb4ZcEFlyPNTh9bBTLw==", - "dev": true, - "requires": { - "randombytes": "2.0.6", - "safe-buffer": "5.1.1" - } - }, - "read-chunk": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/read-chunk/-/read-chunk-2.1.0.tgz", - "integrity": "sha1-agTAkoAF7Z1C4aasVgDhnLx/9lU=", - "dev": true, - "requires": { - "pify": "3.0.0", - "safe-buffer": "5.1.1" - } - }, - "read-pkg": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-2.0.0.tgz", - "integrity": "sha1-jvHAYjxqbbDcZxPEv6xGMysjaPg=", - "dev": true, - "requires": { - "load-json-file": "2.0.0", - "normalize-package-data": "2.4.0", - "path-type": "2.0.0" - } - }, - "read-pkg-up": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-2.0.0.tgz", - "integrity": "sha1-a3KoBImE4MQeeVEP1en6mbO1Sb4=", - "dev": true, - "requires": { - "find-up": "2.1.0", - "read-pkg": "2.0.0" - } - }, - "readable-stream": { - "version": "2.3.5", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.5.tgz", - "integrity": "sha512-tK0yDhrkygt/knjowCUiWP9YdV7c5R+8cR0r/kt9ZhBU906Fs6RpQJCEilamRJj1Nx2rWI6LkW9gKqjTkshhEw==", - "dev": true, - "requires": { - "core-util-is": "1.0.2", - "inherits": "2.0.3", - "isarray": "1.0.0", - "process-nextick-args": "2.0.0", - "safe-buffer": "5.1.1", - "string_decoder": "1.0.3", - "util-deprecate": "1.0.2" - } - }, - "readdirp": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-2.1.0.tgz", - "integrity": "sha1-TtCtBg3zBzMAxIRANz9y0cxkLXg=", - "dev": true, - "requires": { - "graceful-fs": "4.1.11", - "minimatch": "3.0.4", - "readable-stream": "2.3.5", - "set-immediate-shim": "1.0.1" - } - }, - "recast": { - "version": "0.14.4", - "resolved": "https://registry.npmjs.org/recast/-/recast-0.14.4.tgz", - "integrity": "sha512-b6fRXujYf8mTIyljymL3rglje1LfuGKdD44CuKs6o1B18MmZ+mEEpD5gsaxGVABZHyPvYwPLcyBTA/SvxtiyFg==", - "dev": true, - "requires": { - "ast-types": "0.11.2", - "esprima": "4.0.0", - "private": "0.1.8", - "source-map": "0.6.1" - }, - "dependencies": { - "ast-types": { - "version": "0.11.2", - "resolved": "https://registry.npmjs.org/ast-types/-/ast-types-0.11.2.tgz", - "integrity": "sha512-aL+pcOQ+6dpWd0xrUe+Obo2CgdkFvsntkXEmzZKqEN4cR0PStF+1MBuc4V+YZsv4Q36luvyjG7F4lc+wH2bmag==", - "dev": true - }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - } - } - }, - "rechoir": { - "version": "0.6.2", - "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.6.2.tgz", - "integrity": "sha1-hSBLVNuoLVdC4oyWdW70OvUOM4Q=", - "dev": true, - "requires": { - "resolve": "1.5.0" - } - }, - "regenerate": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.3.3.tgz", - "integrity": "sha512-jVpo1GadrDAK59t/0jRx5VxYWQEDkkEKi6+HjE3joFVLfDOh9Xrdh0dF1eSq+BI/SwvTQ44gSscJ8N5zYL61sg==", - "dev": true - }, - "regenerator-runtime": { - "version": "0.11.1", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz", - "integrity": "sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg==", - "dev": true - }, - "regenerator-transform": { - "version": "0.10.1", - "resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.10.1.tgz", - "integrity": "sha512-PJepbvDbuK1xgIgnau7Y90cwaAmO/LCLMI2mPvaXq2heGMR3aWW5/BQvYrhJ8jgmQjXewXvBjzfqKcVOmhjZ6Q==", - "dev": true, - "requires": { - "babel-runtime": "6.26.0", - "babel-types": "6.26.0", - "private": "0.1.8" - } - }, - "regex-cache": { - "version": "0.4.4", - "resolved": "https://registry.npmjs.org/regex-cache/-/regex-cache-0.4.4.tgz", - "integrity": "sha512-nVIZwtCjkC9YgvWkpM55B5rBhBYRZhAaJbgcFYXXsHnbZ9UZI9nnVWYZpBlCqv9ho2eZryPnWrZGsOdPwVWXWQ==", - "dev": true, - "requires": { - "is-equal-shallow": "0.1.3" - } - }, - "regex-not": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/regex-not/-/regex-not-1.0.2.tgz", - "integrity": "sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A==", - "dev": true, - "requires": { - "extend-shallow": "3.0.2", - "safe-regex": "1.1.0" - } - }, - "regexpu-core": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-2.0.0.tgz", - "integrity": "sha1-SdA4g3uNz4v6W5pCE5k45uoq4kA=", - "dev": true, - "requires": { - "regenerate": "1.3.3", - "regjsgen": "0.2.0", - "regjsparser": "0.1.5" - } - }, - "regjsgen": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.2.0.tgz", - "integrity": "sha1-bAFq3qxVT3WCP+N6wFuS1aTtsfc=", - "dev": true - }, - "regjsparser": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.1.5.tgz", - "integrity": "sha1-fuj4Tcb6eS0/0K4ijSS9lJ6tIFw=", - "dev": true, - "requires": { - "jsesc": "0.5.0" - } - }, - "remove-trailing-separator": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz", - "integrity": "sha1-wkvOKig62tW8P1jg1IJJuSN52O8=", - "dev": true - }, - "repeat-element": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.2.tgz", - "integrity": "sha1-7wiaF40Ug7quTZPrmLT55OEdmQo=", - "dev": true - }, - "repeat-string": { - "version": "1.6.1", - "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz", - "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc=", - "dev": true - }, - "repeating": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/repeating/-/repeating-2.0.1.tgz", - "integrity": "sha1-UhTFOpJtNVJwdSf7q0FdvAjQbdo=", - "dev": true, - "requires": { - "is-finite": "1.0.2" - } - }, - "replace-ext": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/replace-ext/-/replace-ext-0.0.1.tgz", - "integrity": "sha1-KbvZIHinOfC8zitO5B6DeVNSKSQ=", - "dev": true - }, - "request": { - "version": "2.81.0", - "resolved": "https://registry.npmjs.org/request/-/request-2.81.0.tgz", - "integrity": "sha1-xpKJRqDgbF+Nb4qTM0af/aRimKA=", - "dev": true, - "requires": { - "aws-sign2": "0.6.0", - "aws4": "1.6.0", - "caseless": "0.12.0", - "combined-stream": "1.0.6", - "extend": "3.0.1", - "forever-agent": "0.6.1", - "form-data": "2.1.4", - "har-validator": "4.2.1", - "hawk": "3.1.3", - "http-signature": "1.1.1", - "is-typedarray": "1.0.0", - "isstream": "0.1.2", - "json-stringify-safe": "5.0.1", - "mime-types": "2.1.18", - "oauth-sign": "0.8.2", - "performance-now": "0.2.0", - "qs": "6.4.0", - "safe-buffer": "5.1.1", - "stringstream": "0.0.5", - "tough-cookie": "2.3.4", - "tunnel-agent": "0.6.0", - "uuid": "3.2.1" - } - }, - "require-directory": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", - "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=", - "dev": true - }, - "require-main-filename": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-1.0.1.tgz", - "integrity": "sha1-l/cXtp1IeE9fUmpsWqj/3aBVpNE=", - "dev": true - }, - "resolve": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.5.0.tgz", - "integrity": "sha512-hgoSGrc3pjzAPHNBg+KnFcK2HwlHTs/YrAGUr6qgTVUZmXv1UEXXl0bZNBKMA9fud6lRYFdPGz0xXxycPzmmiw==", - "dev": true, - "requires": { - "path-parse": "1.0.5" - } - }, - "resolve-cwd": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-2.0.0.tgz", - "integrity": "sha1-AKn3OHVW4nA46uIyyqNypqWbZlo=", - "dev": true, - "requires": { - "resolve-from": "3.0.0" - } - }, - "resolve-dir": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/resolve-dir/-/resolve-dir-1.0.1.tgz", - "integrity": "sha1-eaQGRMNivoLybv/nOcm7U4IEb0M=", - "dev": true, - "requires": { - "expand-tilde": "2.0.2", - "global-modules": "1.0.0" - } - }, - "resolve-from": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-3.0.0.tgz", - "integrity": "sha1-six699nWiBvItuZTM17rywoYh0g=", - "dev": true - }, - "resolve-url": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/resolve-url/-/resolve-url-0.2.1.tgz", - "integrity": "sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo=", - "dev": true - }, - "responselike": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/responselike/-/responselike-1.0.2.tgz", - "integrity": "sha1-kYcg7ztjHFZCvgaPFa3lpG9Loec=", - "dev": true, - "requires": { - "lowercase-keys": "1.0.0" - } - }, - "restore-cursor": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-2.0.0.tgz", - "integrity": "sha1-n37ih/gv0ybU/RYpI9YhKe7g368=", - "dev": true, - "requires": { - "onetime": "2.0.1", - "signal-exit": "3.0.2" - } - }, - "ret": { - "version": "0.1.15", - "resolved": "https://registry.npmjs.org/ret/-/ret-0.1.15.tgz", - "integrity": "sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==", - "dev": true - }, - "rimraf": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.2.tgz", - "integrity": "sha512-lreewLK/BlghmxtfH36YYVg1i8IAce4TI7oao75I1g245+6BctqTVQiBP3YUJ9C6DQOXJmkYR9X9fCLtCOJc5w==", - "dev": true, - "requires": { - "glob": "7.1.2" - } - }, - "ripemd160": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/ripemd160/-/ripemd160-2.0.1.tgz", - "integrity": "sha1-D0WEKVxTo2KK9+bXmsohzlfRxuc=", - "dev": true, - "requires": { - "hash-base": "2.0.2", - "inherits": "2.0.3" - } - }, - "run-async": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.3.0.tgz", - "integrity": "sha1-A3GrSuC91yDUFm19/aZP96RFpsA=", - "dev": true, - "requires": { - "is-promise": "2.1.0" - } - }, - "run-queue": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/run-queue/-/run-queue-1.0.3.tgz", - "integrity": "sha1-6Eg5bwV9Ij8kOGkkYY4laUFh7Ec=", - "dev": true, - "requires": { - "aproba": "1.2.0" - } - }, - "rx": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/rx/-/rx-4.1.0.tgz", - "integrity": "sha1-pfE/957zt0D+MKqAP7CfmIBdR4I=", - "dev": true - }, - "rx-lite": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/rx-lite/-/rx-lite-4.0.8.tgz", - "integrity": "sha1-Cx4Rr4vESDbwSmQH6S2kJGe3lEQ=", - "dev": true - }, - "rx-lite-aggregates": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/rx-lite-aggregates/-/rx-lite-aggregates-4.0.8.tgz", - "integrity": "sha1-dTuHqJoRyVRnxKwWJsTvxOBcZ74=", - "dev": true, - "requires": { - "rx-lite": "4.0.8" - } - }, - "rxjs": { - "version": "5.5.6", - "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-5.5.6.tgz", - "integrity": "sha512-v4Q5HDC0FHAQ7zcBX7T2IL6O5ltl1a2GX4ENjPXg6SjDY69Cmx9v4113C99a4wGF16ClPv5Z8mghuYorVkg/kg==", - "dev": true, - "requires": { - "symbol-observable": "1.0.1" - } - }, - "safe-buffer": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.1.tgz", - "integrity": "sha512-kKvNJn6Mm93gAczWVJg7wH+wGYWNrDHdWvpUmHyEsgCtIwwo3bqPtV4tR5tuPaUhTOo/kvhVwd8XwwOllGYkbg==", - "dev": true - }, - "safe-regex": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/safe-regex/-/safe-regex-1.1.0.tgz", - "integrity": "sha1-QKNmnzsHfR6UPURinhV91IAjvy4=", - "dev": true, - "requires": { - "ret": "0.1.15" - } - }, - "schema-utils": { - "version": "0.4.5", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-0.4.5.tgz", - "integrity": "sha512-yYrjb9TX2k/J1Y5UNy3KYdZq10xhYcF8nMpAW6o3hy6Q8WSIEf9lJHG/ePnOBfziPM3fvQwfOwa13U/Fh8qTfA==", - "dev": true, - "requires": { - "ajv": "6.2.1", - "ajv-keywords": "3.1.0" - } - }, - "scoped-regex": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/scoped-regex/-/scoped-regex-1.0.0.tgz", - "integrity": "sha1-o0a7Gs1CB65wvXwMfKnlZra63bg=", - "dev": true - }, - "semver": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.5.0.tgz", - "integrity": "sha512-4SJ3dm0WAwWy/NVeioZh5AntkdJoWKxHxcmyP622fOkgHa4z3R0TdBJICINyaSDE6uNwVc8gZr+ZinwZAH4xIA==", - "dev": true - }, - "serialize-javascript": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-1.4.0.tgz", - "integrity": "sha1-fJWFFNtqwkQ6irwGLcn3iGp/YAU=", - "dev": true - }, - "set-blocking": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", - "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=", - "dev": true - }, - "set-getter": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/set-getter/-/set-getter-0.1.0.tgz", - "integrity": "sha1-12nBgsnVpR9AkUXy+6guXoboA3Y=", - "dev": true, - "requires": { - "to-object-path": "0.3.0" - } - }, - "set-immediate-shim": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/set-immediate-shim/-/set-immediate-shim-1.0.1.tgz", - "integrity": "sha1-SysbJ+uAip+NzEgaWOXlb1mfP2E=", - "dev": true - }, - "set-value": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/set-value/-/set-value-2.0.0.tgz", - "integrity": "sha512-hw0yxk9GT/Hr5yJEYnHNKYXkIA8mVJgd9ditYZCe16ZczcaELYYcfvaXesNACk2O8O0nTiPQcQhGUQj8JLzeeg==", - "dev": true, - "requires": { - "extend-shallow": "2.0.1", - "is-extendable": "0.1.1", - "is-plain-object": "2.0.4", - "split-string": "3.1.0" - }, - "dependencies": { - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "requires": { - "is-extendable": "0.1.1" - } - } - } - }, - "setimmediate": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz", - "integrity": "sha1-KQy7Iy4waULX1+qbg3Mqt4VvgoU=", - "dev": true - }, - "sha.js": { - "version": "2.4.10", - "resolved": "https://registry.npmjs.org/sha.js/-/sha.js-2.4.10.tgz", - "integrity": "sha512-vnwmrFDlOExK4Nm16J2KMWHLrp14lBrjxMxBJpu++EnsuBmpiYaM/MEs46Vxxm/4FvdP5yTwuCTO9it5FSjrqA==", - "dev": true, - "requires": { - "inherits": "2.0.3", - "safe-buffer": "5.1.1" - } - }, - "shebang-command": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", - "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=", - "dev": true, - "requires": { - "shebang-regex": "1.0.0" - } - }, - "shebang-regex": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", - "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=", - "dev": true - }, - "shelljs": { - "version": "0.7.8", - "resolved": "https://registry.npmjs.org/shelljs/-/shelljs-0.7.8.tgz", - "integrity": "sha1-3svPh0sNHl+3LhSxZKloMEjprLM=", - "dev": true, - "requires": { - "glob": "7.1.2", - "interpret": "1.1.0", - "rechoir": "0.6.2" - } - }, - "signal-exit": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz", - "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=", - "dev": true - }, - "slash": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-1.0.0.tgz", - "integrity": "sha1-xB8vbDn8FtHNF61LXYlhFK5HDVU=", - "dev": true - }, - "slice-ansi": { - "version": "0.0.4", - "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-0.0.4.tgz", - "integrity": "sha1-7b+JA/ZvfOL46v1s7tZeJkyDGzU=", - "dev": true - }, - "slide": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/slide/-/slide-1.1.6.tgz", - "integrity": "sha1-VusCfWW00tzmyy4tMsTUr8nh1wc=", - "dev": true - }, - "snapdragon": { - "version": "0.8.1", - "resolved": "https://registry.npmjs.org/snapdragon/-/snapdragon-0.8.1.tgz", - "integrity": "sha1-4StUh/re0+PeoKyR6UAL91tAE3A=", - "dev": true, - "requires": { - "base": "0.11.2", - "debug": "2.6.9", - "define-property": "0.2.5", - "extend-shallow": "2.0.1", - "map-cache": "0.2.2", - "source-map": "0.5.7", - "source-map-resolve": "0.5.1", - "use": "2.0.2" - }, - "dependencies": { - "define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "dev": true, - "requires": { - "is-descriptor": "0.1.6" - } - }, - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "requires": { - "is-extendable": "0.1.1" - } - }, - "is-accessor-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", - "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", - "dev": true, - "requires": { - "kind-of": "3.2.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "1.1.6" - } - } - } - }, - "is-data-descriptor": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", - "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", - "dev": true, - "requires": { - "kind-of": "3.2.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "1.1.6" - } - } - } - }, - "is-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", - "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", - "dev": true, - "requires": { - "is-accessor-descriptor": "0.1.6", - "is-data-descriptor": "0.1.4", - "kind-of": "5.1.0" - } - }, - "kind-of": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", - "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", - "dev": true - } - } - }, - "snapdragon-node": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/snapdragon-node/-/snapdragon-node-2.1.1.tgz", - "integrity": "sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw==", - "dev": true, - "requires": { - "define-property": "1.0.0", - "isobject": "3.0.1", - "snapdragon-util": "3.0.1" - }, - "dependencies": { - "define-property": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", - "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", - "dev": true, - "requires": { - "is-descriptor": "1.0.2" - } - } - } - }, - "snapdragon-util": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/snapdragon-util/-/snapdragon-util-3.0.1.tgz", - "integrity": "sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ==", - "dev": true, - "requires": { - "kind-of": "3.2.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "1.1.6" - } - } - } - }, - "sntp": { - "version": "1.0.9", - "resolved": "https://registry.npmjs.org/sntp/-/sntp-1.0.9.tgz", - "integrity": "sha1-ZUEYTMkK7qbG57NeJlkIJEPGYZg=", - "dev": true, - "requires": { - "hoek": "2.16.3" - } - }, - "sort-keys": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/sort-keys/-/sort-keys-2.0.0.tgz", - "integrity": "sha1-ZYU1WEhh7JfXMNbPQYIuH1ZoQSg=", - "dev": true, - "requires": { - "is-plain-obj": "1.1.0" - } - }, - "source-list-map": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/source-list-map/-/source-list-map-2.0.0.tgz", - "integrity": "sha512-I2UmuJSRr/T8jisiROLU3A3ltr+swpniSmNPI4Ml3ZCX6tVnDsuZzK7F2hl5jTqbZBWCEKlj5HRQiPExXLgE8A==", - "dev": true - }, - "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", - "dev": true - }, - "source-map-resolve": { - "version": "0.5.1", - "resolved": "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.5.1.tgz", - "integrity": "sha512-0KW2wvzfxm8NCTb30z0LMNyPqWCdDGE2viwzUaucqJdkTRXtZiSY3I+2A6nVAjmdOy0I4gU8DwnVVGsk9jvP2A==", - "dev": true, - "requires": { - "atob": "2.0.3", - "decode-uri-component": "0.2.0", - "resolve-url": "0.2.1", - "source-map-url": "0.4.0", - "urix": "0.1.0" - } - }, - "source-map-support": { - "version": "0.4.18", - "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.4.18.tgz", - "integrity": "sha512-try0/JqxPLF9nOjvSta7tVondkP5dwgyLDjVoyMDlmjugT2lRZ1OfsrYTkCd2hkDnJTKRbO/Rl3orm8vlsUzbA==", - "dev": true, - "requires": { - "source-map": "0.5.7" - } - }, - "source-map-url": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/source-map-url/-/source-map-url-0.4.0.tgz", - "integrity": "sha1-PpNdfd1zYxuXZZlW1VEo6HtQhKM=", - "dev": true - }, - "spawn-sync": { - "version": "1.0.15", - "resolved": "https://registry.npmjs.org/spawn-sync/-/spawn-sync-1.0.15.tgz", - "integrity": "sha1-sAeZVX63+wyDdsKdROih6mfldHY=", - "dev": true, - "requires": { - "concat-stream": "1.6.1", - "os-shim": "0.1.3" - } - }, - "spdx-correct": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.0.0.tgz", - "integrity": "sha512-N19o9z5cEyc8yQQPukRCZ9EUmb4HUpnrmaL/fxS2pBo2jbfcFRVuFZ/oFC+vZz0MNNk0h80iMn5/S6qGZOL5+g==", - "dev": true, - "requires": { - "spdx-expression-parse": "3.0.0", - "spdx-license-ids": "3.0.0" - } - }, - "spdx-exceptions": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.1.0.tgz", - "integrity": "sha512-4K1NsmrlCU1JJgUrtgEeTVyfx8VaYea9J9LvARxhbHtVtohPs/gFGG5yy49beySjlIMhhXZ4QqujIZEfS4l6Cg==", - "dev": true - }, - "spdx-expression-parse": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.0.tgz", - "integrity": "sha512-Yg6D3XpRD4kkOmTpdgbUiEJFKghJH03fiC1OPll5h/0sO6neh2jqRDVHOQ4o/LMea0tgCkbMgea5ip/e+MkWyg==", - "dev": true, - "requires": { - "spdx-exceptions": "2.1.0", - "spdx-license-ids": "3.0.0" - } - }, - "spdx-license-ids": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.0.tgz", - "integrity": "sha512-2+EPwgbnmOIl8HjGBXXMd9NAu02vLjOO1nWw4kmeRDFyHn+M/ETfHxQUK0oXg8ctgVnl9t3rosNVsZ1jG61nDA==", - "dev": true - }, - "split-string": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/split-string/-/split-string-3.1.0.tgz", - "integrity": "sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw==", - "dev": true, - "requires": { - "extend-shallow": "3.0.2" - } - }, - "sshpk": { - "version": "1.13.1", - "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.13.1.tgz", - "integrity": "sha1-US322mKHFEMW3EwY/hzx2UBzm+M=", - "dev": true, - "requires": { - "asn1": "0.2.3", - "assert-plus": "1.0.0", - "bcrypt-pbkdf": "1.0.1", - "dashdash": "1.14.1", - "ecc-jsbn": "0.1.1", - "getpass": "0.1.7", - "jsbn": "0.1.1", - "tweetnacl": "0.14.5" - }, - "dependencies": { - "assert-plus": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", - "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", - "dev": true - } - } - }, - "ssri": { - "version": "5.2.4", - "resolved": "https://registry.npmjs.org/ssri/-/ssri-5.2.4.tgz", - "integrity": "sha512-UnEAgMZa15973iH7cUi0AHjJn1ACDIkaMyZILoqwN6yzt+4P81I8tBc5Hl+qwi5auMplZtPQsHrPBR5vJLcQtQ==", - "dev": true, - "requires": { - "safe-buffer": "5.1.1" - } - }, - "static-extend": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/static-extend/-/static-extend-0.1.2.tgz", - "integrity": "sha1-YICcOcv/VTNyJv1eC1IPNB8ftcY=", - "dev": true, - "requires": { - "define-property": "0.2.5", - "object-copy": "0.1.0" - }, - "dependencies": { - "define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "dev": true, - "requires": { - "is-descriptor": "0.1.6" - } - }, - "is-accessor-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", - "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", - "dev": true, - "requires": { - "kind-of": "3.2.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "1.1.6" - } - } - } - }, - "is-data-descriptor": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", - "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", - "dev": true, - "requires": { - "kind-of": "3.2.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "1.1.6" - } - } - } - }, - "is-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", - "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", - "dev": true, - "requires": { - "is-accessor-descriptor": "0.1.6", - "is-data-descriptor": "0.1.4", - "kind-of": "5.1.0" - } - }, - "kind-of": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", - "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", - "dev": true - } - } - }, - "stream-browserify": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/stream-browserify/-/stream-browserify-2.0.1.tgz", - "integrity": "sha1-ZiZu5fm9uZQKTkUUyvtDu3Hlyds=", - "dev": true, - "requires": { - "inherits": "2.0.3", - "readable-stream": "2.3.5" - } - }, - "stream-each": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/stream-each/-/stream-each-1.2.2.tgz", - "integrity": "sha512-mc1dbFhGBxvTM3bIWmAAINbqiuAk9TATcfIQC8P+/+HJefgaiTlMn2dHvkX8qlI12KeYKSQ1Ua9RrIqrn1VPoA==", - "dev": true, - "requires": { - "end-of-stream": "1.4.1", - "stream-shift": "1.0.0" - } - }, - "stream-http": { - "version": "2.8.0", - "resolved": "https://registry.npmjs.org/stream-http/-/stream-http-2.8.0.tgz", - "integrity": "sha512-sZOFxI/5xw058XIRHl4dU3dZ+TTOIGJR78Dvo0oEAejIt4ou27k+3ne1zYmCV+v7UucbxIFQuOgnkTVHh8YPnw==", - "dev": true, - "requires": { - "builtin-status-codes": "3.0.0", - "inherits": "2.0.3", - "readable-stream": "2.3.5", - "to-arraybuffer": "1.0.1", - "xtend": "4.0.1" - } - }, - "stream-shift": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/stream-shift/-/stream-shift-1.0.0.tgz", - "integrity": "sha1-1cdSgl5TZ+eG944Y5EXqIjoVWVI=", - "dev": true - }, - "stream-to-observable": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/stream-to-observable/-/stream-to-observable-0.2.0.tgz", - "integrity": "sha1-WdbqOT2HwsDdrBCqDVYbxrpvDhA=", - "dev": true, - "requires": { - "any-observable": "0.2.0" - } - }, - "strict-uri-encode": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/strict-uri-encode/-/strict-uri-encode-1.1.0.tgz", - "integrity": "sha1-J5siXfHVgrH1TmWt3UNS4Y+qBxM=", - "dev": true - }, - "string-template": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/string-template/-/string-template-0.2.1.tgz", - "integrity": "sha1-QpMuWYo1LQH8IuwzZ9nYTuxsmt0=", - "dev": true - }, - "string-width": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", - "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", - "dev": true, - "requires": { - "is-fullwidth-code-point": "2.0.0", - "strip-ansi": "4.0.0" - } - }, - "string_decoder": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.0.3.tgz", - "integrity": "sha512-4AH6Z5fzNNBcH+6XDMfA/BTt87skxqJlO0lAh3Dker5zThcAxG6mKz+iGu308UKoPPQ8Dcqx/4JhujzltRa+hQ==", - "dev": true, - "requires": { - "safe-buffer": "5.1.1" - } - }, - "stringstream": { - "version": "0.0.5", - "resolved": "https://registry.npmjs.org/stringstream/-/stringstream-0.0.5.tgz", - "integrity": "sha1-TkhM1N5aC7vuGORjB3EKioFiGHg=", - "dev": true - }, - "strip-ansi": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", - "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", - "dev": true, - "requires": { - "ansi-regex": "3.0.0" - } - }, - "strip-bom": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", - "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=", - "dev": true - }, - "strip-bom-stream": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/strip-bom-stream/-/strip-bom-stream-2.0.0.tgz", - "integrity": "sha1-+H217yYT9paKpUWr/h7HKLaoKco=", - "dev": true, - "requires": { - "first-chunk-stream": "2.0.0", - "strip-bom": "2.0.0" - }, - "dependencies": { - "strip-bom": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-2.0.0.tgz", - "integrity": "sha1-YhmoVhZSBJHzV4i9vxRHqZx+aw4=", - "dev": true, - "requires": { - "is-utf8": "0.2.1" - } - } - } - }, - "strip-eof": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz", - "integrity": "sha1-u0P/VZim6wXYm1n80SnJgzE2Br8=", - "dev": true - }, - "supports-color": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.3.0.tgz", - "integrity": "sha512-0aP01LLIskjKs3lq52EC0aGBAJhLq7B2Rd8HC/DR/PtNNpcLilNmHC12O+hu0usQpo7wtHNRqtrhBwtDb0+dNg==", - "dev": true, - "requires": { - "has-flag": "3.0.0" - } - }, - "symbol-observable": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/symbol-observable/-/symbol-observable-1.0.1.tgz", - "integrity": "sha1-g0D8RwLDEi310iKI+IKD9RPT/dQ=", - "dev": true - }, - "tapable": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/tapable/-/tapable-1.0.0.tgz", - "integrity": "sha512-dQRhbNQkRnaqauC7WqSJ21EEksgT0fYZX2lqXzGkpo8JNig9zGZTYoMGvyI2nWmXlE2VSVXVDu7wLVGu/mQEsg==", - "dev": true - }, - "temp": { - "version": "0.8.3", - "resolved": "https://registry.npmjs.org/temp/-/temp-0.8.3.tgz", - "integrity": "sha1-4Ma8TSa5AxJEEOT+2BEDAU38H1k=", - "dev": true, - "requires": { - "os-tmpdir": "1.0.2", - "rimraf": "2.2.8" - }, - "dependencies": { - "rimraf": { - "version": "2.2.8", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.2.8.tgz", - "integrity": "sha1-5Dm+Kq7jJzIZUnMPmaiSnk/FBYI=", - "dev": true - } - } - }, - "text-table": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", - "integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=", - "dev": true - }, - "textextensions": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/textextensions/-/textextensions-2.2.0.tgz", - "integrity": "sha512-j5EMxnryTvKxwH2Cq+Pb43tsf6sdEgw6Pdwxk83mPaq0ToeFJt6WE4J3s5BqY7vmjlLgkgXvhtXUxo80FyBhCA==", - "dev": true - }, - "through": { - "version": "2.3.8", - "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", - "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=", - "dev": true - }, - "through2": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.3.tgz", - "integrity": "sha1-AARWmzfHx0ujnEPzzteNGtlBQL4=", - "dev": true, - "requires": { - "readable-stream": "2.3.5", - "xtend": "4.0.1" - } - }, - "timed-out": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/timed-out/-/timed-out-4.0.1.tgz", - "integrity": "sha1-8y6srFoXW+ol1/q1Zas+2HQe9W8=", - "dev": true - }, - "timers-browserify": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/timers-browserify/-/timers-browserify-2.0.6.tgz", - "integrity": "sha512-HQ3nbYRAowdVd0ckGFvmJPPCOH/CHleFN/Y0YQCX1DVaB7t+KFvisuyN09fuP8Jtp1CpfSh8O8bMkHbdbPe6Pw==", - "dev": true, - "requires": { - "setimmediate": "1.0.5" - } - }, - "tmp": { - "version": "0.0.33", - "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", - "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==", - "dev": true, - "requires": { - "os-tmpdir": "1.0.2" - } - }, - "to-arraybuffer": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/to-arraybuffer/-/to-arraybuffer-1.0.1.tgz", - "integrity": "sha1-fSKbH8xjfkZsoIEYCDanqr/4P0M=", - "dev": true - }, - "to-fast-properties": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-1.0.3.tgz", - "integrity": "sha1-uDVx+k2MJbguIxsG46MFXeTKGkc=", - "dev": true - }, - "to-object-path": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/to-object-path/-/to-object-path-0.3.0.tgz", - "integrity": "sha1-KXWIt7Dn4KwI4E5nL4XB9JmeF68=", - "dev": true, - "requires": { - "kind-of": "3.2.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "1.1.6" - } - } - } - }, - "to-regex": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/to-regex/-/to-regex-3.0.2.tgz", - "integrity": "sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw==", - "dev": true, - "requires": { - "define-property": "2.0.2", - "extend-shallow": "3.0.2", - "regex-not": "1.0.2", - "safe-regex": "1.1.0" - } - }, - "to-regex-range": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz", - "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=", - "dev": true, - "requires": { - "is-number": "3.0.0", - "repeat-string": "1.6.1" - } - }, - "tough-cookie": { - "version": "2.3.4", - "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.3.4.tgz", - "integrity": "sha512-TZ6TTfI5NtZnuyy/Kecv+CnoROnyXn2DN97LontgQpCwsX2XyLYCC0ENhYkehSOwAp8rTQKc/NUIF7BkQ5rKLA==", - "dev": true, - "requires": { - "punycode": "1.4.1" - } - }, - "trim-right": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/trim-right/-/trim-right-1.0.1.tgz", - "integrity": "sha1-yy4SAwZ+DI3h9hQJS5/kVwTqYAM=", - "dev": true - }, - "ts-loader": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/ts-loader/-/ts-loader-4.0.1.tgz", - "integrity": "sha512-dzgQnkAGY4sLqVw6t4LJH8FGR8j0zsPmC1Ff2ChzKhYO+hgWJkSEyrHTlSSZqn5oWr0Po7q/IRoeq8O4SNKQ9A==", - "dev": true, - "requires": { - "chalk": "2.3.2", - "enhanced-resolve": "4.0.0", - "loader-utils": "1.1.0", - "micromatch": "3.1.9", - "semver": "5.5.0" - } - }, - "tty-browserify": { - "version": "0.0.0", - "resolved": "https://registry.npmjs.org/tty-browserify/-/tty-browserify-0.0.0.tgz", - "integrity": "sha1-oVe6QC2iTpv5V/mqadUk7tQpAaY=", - "dev": true - }, - "tunnel-agent": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", - "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=", - "dev": true, - "requires": { - "safe-buffer": "5.1.1" - } - }, - "tweetnacl": { - "version": "0.14.5", - "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", - "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=", - "dev": true, - "optional": true - }, - "typedarray": { - "version": "0.0.6", - "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", - "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=", - "dev": true - }, - "typescript": { - "version": "2.7.2", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-2.7.2.tgz", - "integrity": "sha512-p5TCYZDAO0m4G344hD+wx/LATebLWZNkkh2asWUFqSsD2OrDNhbAHuSjobrmsUmdzjJjEeZVU9g1h3O6vpstnw==", - "dev": true - }, - "uglify-es": { - "version": "3.3.9", - "resolved": "https://registry.npmjs.org/uglify-es/-/uglify-es-3.3.9.tgz", - "integrity": "sha512-r+MU0rfv4L/0eeW3xZrd16t4NZfK8Ld4SWVglYBb7ez5uXFWHuVRs6xCTrf1yirs9a4j4Y27nn7SRfO6v67XsQ==", - "dev": true, - "requires": { - "commander": "2.13.0", - "source-map": "0.6.1" - }, - "dependencies": { - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - } - } - }, - "uglifyjs-webpack-plugin": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/uglifyjs-webpack-plugin/-/uglifyjs-webpack-plugin-1.2.2.tgz", - "integrity": "sha512-CG/NvzXfemUAm5Y4Guh5eEaJYHtkG7kKNpXEJHp9QpxsFVB5/qKvYWoMaq4sa99ccZ0hM3MK8vQV9XPZB4357A==", - "dev": true, - "requires": { - "cacache": "10.0.4", - "find-cache-dir": "1.0.0", - "schema-utils": "0.4.5", - "serialize-javascript": "1.4.0", - "source-map": "0.6.1", - "uglify-es": "3.3.9", - "webpack-sources": "1.1.0", - "worker-farm": "1.5.4" - }, - "dependencies": { - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - } - } - }, - "underscore": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.6.0.tgz", - "integrity": "sha1-izixDKze9jM3uLJOT/htRa6lKag=", - "dev": true - }, - "union-value": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/union-value/-/union-value-1.0.0.tgz", - "integrity": "sha1-XHHDTLW61dzr4+oM0IIHulqhrqQ=", - "dev": true, - "requires": { - "arr-union": "3.1.0", - "get-value": "2.0.6", - "is-extendable": "0.1.1", - "set-value": "0.4.3" - }, - "dependencies": { - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "requires": { - "is-extendable": "0.1.1" - } - }, - "set-value": { - "version": "0.4.3", - "resolved": "https://registry.npmjs.org/set-value/-/set-value-0.4.3.tgz", - "integrity": "sha1-fbCPnT0i3H945Trzw79GZuzfzPE=", - "dev": true, - "requires": { - "extend-shallow": "2.0.1", - "is-extendable": "0.1.1", - "is-plain-object": "2.0.4", - "to-object-path": "0.3.0" - } - } - } - }, - "unique-filename": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/unique-filename/-/unique-filename-1.1.0.tgz", - "integrity": "sha1-0F8v5AMlYIcfMOk8vnNe6iAVFPM=", - "dev": true, - "requires": { - "unique-slug": "2.0.0" - } - }, - "unique-slug": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/unique-slug/-/unique-slug-2.0.0.tgz", - "integrity": "sha1-22Z258fMBimHj/GWCXx4hVrp9Ks=", - "dev": true, - "requires": { - "imurmurhash": "0.1.4" - } - }, - "unset-value": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/unset-value/-/unset-value-1.0.0.tgz", - "integrity": "sha1-g3aHP30jNRef+x5vw6jtDfyKtVk=", - "dev": true, - "requires": { - "has-value": "0.3.1", - "isobject": "3.0.1" - }, - "dependencies": { - "has-value": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/has-value/-/has-value-0.3.1.tgz", - "integrity": "sha1-ex9YutpiyoJ+wKIHgCVlSEWZXh8=", - "dev": true, - "requires": { - "get-value": "2.0.6", - "has-values": "0.1.4", - "isobject": "2.1.0" - }, - "dependencies": { - "isobject": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", - "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=", - "dev": true, - "requires": { - "isarray": "1.0.0" - } - } - } - }, - "has-values": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/has-values/-/has-values-0.1.4.tgz", - "integrity": "sha1-bWHeldkd/Km5oCCJrThL/49it3E=", - "dev": true - } - } - }, - "untildify": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/untildify/-/untildify-3.0.2.tgz", - "integrity": "sha1-fx8wIFWz/qDz6B3HjrNnZstl4/E=", - "dev": true - }, - "upath": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/upath/-/upath-1.0.4.tgz", - "integrity": "sha512-d4SJySNBXDaQp+DPrziv3xGS6w3d2Xt69FijJr86zMPBy23JEloMCEOUBBzuN7xCtjLCnmB9tI/z7SBCahHBOw==", - "dev": true - }, - "urix": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/urix/-/urix-0.1.0.tgz", - "integrity": "sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI=", - "dev": true - }, - "url": { - "version": "0.11.0", - "resolved": "https://registry.npmjs.org/url/-/url-0.11.0.tgz", - "integrity": "sha1-ODjpfPxgUh63PFJajlW/3Z4uKPE=", - "dev": true, - "requires": { - "punycode": "1.3.2", - "querystring": "0.2.0" - }, - "dependencies": { - "punycode": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.3.2.tgz", - "integrity": "sha1-llOgNvt8HuQjQvIyXM7v6jkmxI0=", - "dev": true - } - } - }, - "url-parse-lax": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/url-parse-lax/-/url-parse-lax-3.0.0.tgz", - "integrity": "sha1-FrXK/Afb42dsGxmZF3gj1lA6yww=", - "dev": true, - "requires": { - "prepend-http": "2.0.0" - } - }, - "url-to-options": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/url-to-options/-/url-to-options-1.0.1.tgz", - "integrity": "sha1-FQWgOiiaSMvXpDTvuu7FBV9WM6k=", - "dev": true - }, - "urlgrey": { - "version": "0.4.4", - "resolved": "https://registry.npmjs.org/urlgrey/-/urlgrey-0.4.4.tgz", - "integrity": "sha1-iS/pWWCAXoVRnxzUOJ8stMu3ZS8=", - "dev": true - }, - "use": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/use/-/use-2.0.2.tgz", - "integrity": "sha1-riig1y+TvyJCKhii43mZMRLeyOg=", - "dev": true, - "requires": { - "define-property": "0.2.5", - "isobject": "3.0.1", - "lazy-cache": "2.0.2" - }, - "dependencies": { - "define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "dev": true, - "requires": { - "is-descriptor": "0.1.6" - } - }, - "is-accessor-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", - "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", - "dev": true, - "requires": { - "kind-of": "3.2.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "1.1.6" - } - } - } - }, - "is-data-descriptor": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", - "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", - "dev": true, - "requires": { - "kind-of": "3.2.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "1.1.6" - } - } - } - }, - "is-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", - "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", - "dev": true, - "requires": { - "is-accessor-descriptor": "0.1.6", - "is-data-descriptor": "0.1.4", - "kind-of": "5.1.0" - } - }, - "kind-of": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", - "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", - "dev": true - } - } - }, - "util": { - "version": "0.10.3", - "resolved": "https://registry.npmjs.org/util/-/util-0.10.3.tgz", - "integrity": "sha1-evsa/lCAUkZInj23/g7TeTNqwPk=", - "dev": true, - "requires": { - "inherits": "2.0.1" - }, - "dependencies": { - "inherits": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz", - "integrity": "sha1-sX0I0ya0Qj5Wjv9xn5GwscvfafE=", - "dev": true - } - } - }, - "util-deprecate": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=", - "dev": true - }, - "uuid": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.2.1.tgz", - "integrity": "sha512-jZnMwlb9Iku/O3smGWvZhauCf6cvvpKi4BKRiliS3cxnI+Gz9j5MEpTz2UFuXiKPJocb7gnsLHwiS05ige5BEA==", - "dev": true - }, - "v8-compile-cache": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-1.1.2.tgz", - "integrity": "sha512-ejdrifsIydN1XDH7EuR2hn8ZrkRKUYF7tUcBjBy/lhrCvs2K+zRlbW9UHc0IQ9RsYFZJFqJrieoIHfkCa0DBRA==", - "dev": true - }, - "validate-npm-package-license": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.3.tgz", - "integrity": "sha512-63ZOUnL4SIXj4L0NixR3L1lcjO38crAbgrTpl28t8jjrfuiOBL5Iygm+60qPs/KsZGzPNg6Smnc/oY16QTjF0g==", - "dev": true, - "requires": { - "spdx-correct": "3.0.0", - "spdx-expression-parse": "3.0.0" - } - }, - "verror": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", - "integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=", - "dev": true, - "requires": { - "assert-plus": "1.0.0", - "core-util-is": "1.0.2", - "extsprintf": "1.3.0" - }, - "dependencies": { - "assert-plus": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", - "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", - "dev": true - } - } - }, - "vinyl": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/vinyl/-/vinyl-1.2.0.tgz", - "integrity": "sha1-XIgDbPVl5d8FVYv8kR+GVt8hiIQ=", - "dev": true, - "requires": { - "clone": "1.0.3", - "clone-stats": "0.0.1", - "replace-ext": "0.0.1" - } - }, - "vinyl-file": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/vinyl-file/-/vinyl-file-2.0.0.tgz", - "integrity": "sha1-p+v1/779obfRjRQPyweyI++2dRo=", - "dev": true, - "requires": { - "graceful-fs": "4.1.11", - "pify": "2.3.0", - "pinkie-promise": "2.0.1", - "strip-bom": "2.0.0", - "strip-bom-stream": "2.0.0", - "vinyl": "1.2.0" - }, - "dependencies": { - "pify": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", - "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", - "dev": true - }, - "strip-bom": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-2.0.0.tgz", - "integrity": "sha1-YhmoVhZSBJHzV4i9vxRHqZx+aw4=", - "dev": true, - "requires": { - "is-utf8": "0.2.1" - } - } - } - }, - "vm-browserify": { - "version": "0.0.4", - "resolved": "https://registry.npmjs.org/vm-browserify/-/vm-browserify-0.0.4.tgz", - "integrity": "sha1-XX6kW7755Kb/ZflUOOCofDV9WnM=", - "dev": true, - "requires": { - "indexof": "0.0.1" - } - }, - "watchpack": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-1.5.0.tgz", - "integrity": "sha512-RSlipNQB1u48cq0wH/BNfCu1tD/cJ8ydFIkNYhp9o+3d+8unClkIovpW5qpFPgmL9OE48wfAnlZydXByWP82AA==", - "dev": true, - "requires": { - "chokidar": "2.0.2", - "graceful-fs": "4.1.11", - "neo-async": "2.5.0" - } - }, - "webpack": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/webpack/-/webpack-4.1.0.tgz", - "integrity": "sha512-ZFYcAZ44kOT+xsS5MS2H1fQr0PJkwQdYem/d17wacDkkupzsAkBJ3hDShWHdPVvWluFs6pfhHWw/dVso1m0rsA==", - "dev": true, - "requires": { - "acorn": "5.5.0", - "acorn-dynamic-import": "3.0.0", - "ajv": "6.2.1", - "ajv-keywords": "3.1.0", - "chrome-trace-event": "0.1.2", - "enhanced-resolve": "4.0.0", - "eslint-scope": "3.7.1", - "loader-runner": "2.3.0", - "loader-utils": "1.1.0", - "memory-fs": "0.4.1", - "micromatch": "3.1.9", - "mkdirp": "0.5.1", - "neo-async": "2.5.0", - "node-libs-browser": "2.1.0", - "schema-utils": "0.4.5", - "tapable": "1.0.0", - "uglifyjs-webpack-plugin": "1.2.2", - "watchpack": "1.5.0", - "webpack-sources": "1.1.0" - } - }, - "webpack-addons": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/webpack-addons/-/webpack-addons-1.1.5.tgz", - "integrity": "sha512-MGO0nVniCLFAQz1qv22zM02QPjcpAoJdy7ED0i3Zy7SY1IecgXCm460ib7H/Wq7e9oL5VL6S2BxaObxwIcag0g==", - "dev": true, - "requires": { - "jscodeshift": "0.4.1" - } - }, - "webpack-cli": { - "version": "2.0.10", - "resolved": "https://registry.npmjs.org/webpack-cli/-/webpack-cli-2.0.10.tgz", - "integrity": "sha512-PQWEOoXkhjBV4svPuESghZRc80VvDoSSRPaLiInWifDlRJgoPWpiLCFXyMLQTTaug7ApLrSEW7BcuwwY6DEv5w==", - "dev": true, - "requires": { - "chalk": "2.3.2", - "codecov": "3.0.0", - "cross-spawn": "6.0.5", - "diff": "3.5.0", - "enhanced-resolve": "4.0.0", - "glob-all": "3.1.0", - "global": "4.3.2", - "global-modules": "1.0.0", - "got": "8.2.0", - "inquirer": "5.1.0", - "interpret": "1.1.0", - "jscodeshift": "0.4.1", - "listr": "0.13.0", - "loader-utils": "1.1.0", - "lodash": "4.17.5", - "log-symbols": "2.2.0", - "mkdirp": "0.5.1", - "p-each-series": "1.0.0", - "p-lazy": "1.0.0", - "prettier": "1.11.1", - "recast": "0.14.4", - "resolve-cwd": "2.0.0", - "supports-color": "5.3.0", - "uglifyjs-webpack-plugin": "1.2.2", - "v8-compile-cache": "1.1.2", - "webpack-addons": "1.1.5", - "yargs": "9.0.1", - "yeoman-environment": "2.0.5", - "yeoman-generator": "github:ev1stensberg/generator#9e24fa31c85302ca1145ae34fc68b4f133251ca0" - } - }, - "webpack-sources": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-1.1.0.tgz", - "integrity": "sha512-aqYp18kPphgoO5c/+NaUvEeACtZjMESmDChuD3NBciVpah3XpMEU9VAAtIaB1BsfJWWTSdv8Vv1m3T0aRk2dUw==", - "dev": true, - "requires": { - "source-list-map": "2.0.0", - "source-map": "0.6.1" - }, - "dependencies": { - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - } - } - }, - "which": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/which/-/which-1.3.0.tgz", - "integrity": "sha512-xcJpopdamTuY5duC/KnTTNBraPK54YwpenP4lzxU8H91GudWpFv38u0CKjclE1Wi2EH2EDz5LRcHcKbCIzqGyg==", - "dev": true, - "requires": { - "isexe": "2.0.0" - } - }, - "which-module": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz", - "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=", - "dev": true - }, - "worker-farm": { - "version": "1.5.4", - "resolved": "https://registry.npmjs.org/worker-farm/-/worker-farm-1.5.4.tgz", - "integrity": "sha512-ITyClEvcfv0ozqJl1vmWFWhvI+OIrkbInYqkEPE50wFPXj8J9Gd3FYf8+CkZJXJJsQBYe+2DvmoK9Zhx5w8W+w==", - "dev": true, - "requires": { - "errno": "0.1.7", - "xtend": "4.0.1" - } - }, - "wrap-ansi": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-2.1.0.tgz", - "integrity": "sha1-2Pw9KE3QV5T+hJc8rs3Rz4JP3YU=", - "dev": true, - "requires": { - "string-width": "1.0.2", - "strip-ansi": "3.0.1" - }, - "dependencies": { - "ansi-regex": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", - "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", - "dev": true - }, - "is-fullwidth-code-point": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", - "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", - "dev": true, - "requires": { - "number-is-nan": "1.0.1" - } - }, - "string-width": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", - "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", - "dev": true, - "requires": { - "code-point-at": "1.1.0", - "is-fullwidth-code-point": "1.0.0", - "strip-ansi": "3.0.1" - } - }, - "strip-ansi": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", - "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", - "dev": true, - "requires": { - "ansi-regex": "2.1.1" - } - } - } - }, - "wrappy": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", - "dev": true - }, - "write-file-atomic": { - "version": "1.3.4", - "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-1.3.4.tgz", - "integrity": "sha1-+Aek8LHZ6ROuekgRLmzDrxmRtF8=", - "dev": true, - "requires": { - "graceful-fs": "4.1.11", - "imurmurhash": "0.1.4", - "slide": "1.1.6" - } - }, - "xtend": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.1.tgz", - "integrity": "sha1-pcbVMr5lbiPbgg77lDofBJmNY68=", - "dev": true - }, - "y18n": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.0.tgz", - "integrity": "sha512-r9S/ZyXu/Xu9q1tYlpsLIsa3EeLXXk0VwlxqTcFRfg9EhMW+17kbt9G0NrgCmhGb5vT2hyhJZLfDGx+7+5Uj/w==", - "dev": true - }, - "yallist": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz", - "integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=", - "dev": true - }, - "yargs": { - "version": "9.0.1", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-9.0.1.tgz", - "integrity": "sha1-UqzCP+7Kw0BCB47njAwAf1CF20w=", - "dev": true, - "requires": { - "camelcase": "4.1.0", - "cliui": "3.2.0", - "decamelize": "1.2.0", - "get-caller-file": "1.0.2", - "os-locale": "2.1.0", - "read-pkg-up": "2.0.0", - "require-directory": "2.1.1", - "require-main-filename": "1.0.1", - "set-blocking": "2.0.0", - "string-width": "2.1.1", - "which-module": "2.0.0", - "y18n": "3.2.1", - "yargs-parser": "7.0.0" - }, - "dependencies": { - "y18n": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-3.2.1.tgz", - "integrity": "sha1-bRX7qITAhnnA136I53WegR4H+kE=", - "dev": true - } - } - }, - "yargs-parser": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-7.0.0.tgz", - "integrity": "sha1-jQrELxbqVd69MyyvTEA4s+P139k=", - "dev": true, - "requires": { - "camelcase": "4.1.0" - } - }, - "yeoman-environment": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/yeoman-environment/-/yeoman-environment-2.0.5.tgz", - "integrity": "sha512-6/W7/B54OPHJXob0n0+pmkwFsirC8cokuQkPSmT/D0lCcSxkKtg/BA6ZnjUBIwjuGqmw3DTrT4en++htaUju5g==", - "dev": true, - "requires": { - "chalk": "2.3.2", - "debug": "3.1.0", - "diff": "3.5.0", - "escape-string-regexp": "1.0.5", - "globby": "6.1.0", - "grouped-queue": "0.3.3", - "inquirer": "3.3.0", - "is-scoped": "1.0.0", - "lodash": "4.17.5", - "log-symbols": "2.2.0", - "mem-fs": "1.1.3", - "text-table": "0.2.0", - "untildify": "3.0.2" - }, - "dependencies": { - "debug": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", - "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", - "dev": true, - "requires": { - "ms": "2.0.0" - } - }, - "inquirer": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-3.3.0.tgz", - "integrity": "sha512-h+xtnyk4EwKvFWHrUYsWErEVR+igKtLdchu+o0Z1RL7VU/jVMFbYir2bp6bAj8efFNxWqHX0dIss6fJQ+/+qeQ==", - "dev": true, - "requires": { - "ansi-escapes": "3.0.0", - "chalk": "2.3.2", - "cli-cursor": "2.1.0", - "cli-width": "2.2.0", - "external-editor": "2.1.0", - "figures": "2.0.0", - "lodash": "4.17.5", - "mute-stream": "0.0.7", - "run-async": "2.3.0", - "rx-lite": "4.0.8", - "rx-lite-aggregates": "4.0.8", - "string-width": "2.1.1", - "strip-ansi": "4.0.0", - "through": "2.3.8" - } - } - } - }, - "yeoman-generator": { - "version": "github:ev1stensberg/generator#9e24fa31c85302ca1145ae34fc68b4f133251ca0", - "dev": true, - "requires": { - "async": "2.6.0", - "chalk": "1.1.3", - "cli-table": "0.3.1", - "cross-spawn": "5.1.0", - "dargs": "5.1.0", - "dateformat": "2.2.0", - "debug": "2.6.9", - "detect-conflict": "1.0.1", - "error": "7.0.2", - "find-up": "2.1.0", - "github-username": "4.1.0", - "istextorbinary": "2.2.1", - "lodash": "4.17.5", - "mem-fs-editor": "3.0.2", - "minimist": "1.2.0", - "mkdirp": "0.5.1", - "pretty-bytes": "4.0.2", - "read-chunk": "2.1.0", - "read-pkg-up": "2.0.0", - "rimraf": "2.6.2", - "run-async": "2.3.0", - "shelljs": "0.7.8", - "text-table": "0.2.0", - "through2": "2.0.3", - "yeoman-environment": "1.6.6" - }, - "dependencies": { - "ansi-escapes": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-1.4.0.tgz", - "integrity": "sha1-06ioOzGapneTZisT52HHkRQiMG4=", - "dev": true - }, - "ansi-regex": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", - "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", - "dev": true - }, - "ansi-styles": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", - "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", - "dev": true - }, - "async": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/async/-/async-2.6.0.tgz", - "integrity": "sha512-xAfGg1/NTLBBKlHFmnd7PlmUW9KhVQIUuSrYem9xzFUZy13ScvtyGGejaae9iAVRiRq9+Cx7DPFaAAhCpyxyPw==", - "dev": true, - "requires": { - "lodash": "4.17.5" - } - }, - "chalk": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", - "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", - "dev": true, - "requires": { - "ansi-styles": "2.2.1", - "escape-string-regexp": "1.0.5", - "has-ansi": "2.0.0", - "strip-ansi": "3.0.1", - "supports-color": "2.0.0" - } - }, - "cli-cursor": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-1.0.2.tgz", - "integrity": "sha1-ZNo/fValRBLll5S9Ytw1KV6PKYc=", - "dev": true, - "requires": { - "restore-cursor": "1.0.1" - } - }, - "cross-spawn": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-5.1.0.tgz", - "integrity": "sha1-6L0O/uWPz/b4+UUQoKVUu/ojVEk=", - "dev": true, - "requires": { - "lru-cache": "4.1.1", - "shebang-command": "1.2.0", - "which": "1.3.0" - } - }, - "diff": { - "version": "2.2.3", - "resolved": "https://registry.npmjs.org/diff/-/diff-2.2.3.tgz", - "integrity": "sha1-YOr9DSjukG5Oj/ClLBIpUhAzv5k=", - "dev": true - }, - "external-editor": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-1.1.1.tgz", - "integrity": "sha1-Etew24UPf/fnCBuvQAVwAGDEYAs=", - "dev": true, - "requires": { - "extend": "3.0.1", - "spawn-sync": "1.0.15", - "tmp": "0.0.29" - } - }, - "figures": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/figures/-/figures-1.7.0.tgz", - "integrity": "sha1-y+Hjr/zxzUS4DK3+0o3Hk6lwHS4=", - "dev": true, - "requires": { - "escape-string-regexp": "1.0.5", - "object-assign": "4.1.1" - } - }, - "glob": { - "version": "6.0.4", - "resolved": "https://registry.npmjs.org/glob/-/glob-6.0.4.tgz", - "integrity": "sha1-DwiGD2oVUSey+t1PnOJLGqtuTSI=", - "dev": true, - "requires": { - "inflight": "1.0.6", - "inherits": "2.0.3", - "minimatch": "3.0.4", - "once": "1.4.0", - "path-is-absolute": "1.0.1" - } - }, - "globby": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/globby/-/globby-4.1.0.tgz", - "integrity": "sha1-CA9UVJ7BuCpsYOYx/ILhIR2+lfg=", - "dev": true, - "requires": { - "array-union": "1.0.2", - "arrify": "1.0.1", - "glob": "6.0.4", - "object-assign": "4.1.1", - "pify": "2.3.0", - "pinkie-promise": "2.0.1" - } - }, - "inquirer": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-1.2.3.tgz", - "integrity": "sha1-TexvMvN+97sLLtPx0aXD9UUHSRg=", - "dev": true, - "requires": { - "ansi-escapes": "1.4.0", - "chalk": "1.1.3", - "cli-cursor": "1.0.2", - "cli-width": "2.2.0", - "external-editor": "1.1.1", - "figures": "1.7.0", - "lodash": "4.17.5", - "mute-stream": "0.0.6", - "pinkie-promise": "2.0.1", - "run-async": "2.3.0", - "rx": "4.1.0", - "string-width": "1.0.2", - "strip-ansi": "3.0.1", - "through": "2.3.8" - } - }, - "is-fullwidth-code-point": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", - "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", - "dev": true, - "requires": { - "number-is-nan": "1.0.1" - } - }, - "log-symbols": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-1.0.2.tgz", - "integrity": "sha1-N2/3tY6jCGoPCfrMdGF+ylAeGhg=", - "dev": true, - "requires": { - "chalk": "1.1.3" - } - }, - "minimist": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", - "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", - "dev": true - }, - "mute-stream": { - "version": "0.0.6", - "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.6.tgz", - "integrity": "sha1-SJYrGeFp/R38JAs/HnMXYnu8R9s=", - "dev": true - }, - "onetime": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-1.1.0.tgz", - "integrity": "sha1-ofeDj4MUxRbwXs78vEzP4EtO14k=", - "dev": true - }, - "pify": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", - "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", - "dev": true - }, - "restore-cursor": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-1.0.1.tgz", - "integrity": "sha1-NGYfRohjJ/7SmRR5FSJS35LapUE=", - "dev": true, - "requires": { - "exit-hook": "1.1.1", - "onetime": "1.1.0" - } - }, - "string-width": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", - "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", - "dev": true, - "requires": { - "code-point-at": "1.1.0", - "is-fullwidth-code-point": "1.0.0", - "strip-ansi": "3.0.1" - } - }, - "strip-ansi": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", - "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", - "dev": true, - "requires": { - "ansi-regex": "2.1.1" - } - }, - "supports-color": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", - "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", - "dev": true - }, - "tmp": { - "version": "0.0.29", - "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.29.tgz", - "integrity": "sha1-8lEl/w3Z2jzLDC3Tce4SiLuRKMA=", - "dev": true, - "requires": { - "os-tmpdir": "1.0.2" - } - }, - "untildify": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/untildify/-/untildify-2.1.0.tgz", - "integrity": "sha1-F+soB5h/dpUunASF/DEdBqgmouA=", - "dev": true, - "requires": { - "os-homedir": "1.0.2" - } - }, - "yeoman-environment": { - "version": "1.6.6", - "resolved": "https://registry.npmjs.org/yeoman-environment/-/yeoman-environment-1.6.6.tgz", - "integrity": "sha1-zYX6Z9FWBg5EDXgH1+988NLR1nE=", - "dev": true, - "requires": { - "chalk": "1.1.3", - "debug": "2.6.9", - "diff": "2.2.3", - "escape-string-regexp": "1.0.5", - "globby": "4.1.0", - "grouped-queue": "0.3.3", - "inquirer": "1.2.3", - "lodash": "4.17.5", - "log-symbols": "1.0.2", - "mem-fs": "1.1.3", - "text-table": "0.2.0", - "untildify": "2.1.0" - } - } - } - } - } -} From e89b895f418761dc2ec7bbe532aecbb2c3a7abd8 Mon Sep 17 00:00:00 2001 From: Ramya Achutha Rao Date: Thu, 26 Apr 2018 11:50:54 -0700 Subject: [PATCH 151/830] Better fix for #48570 Ignore errors when resolving files to get workspace stats --- .../parts/stats/node/workspaceStats.ts | 30 +++++++++++-------- 1 file changed, 17 insertions(+), 13 deletions(-) diff --git a/src/vs/workbench/parts/stats/node/workspaceStats.ts b/src/vs/workbench/parts/stats/node/workspaceStats.ts index 2ee25366077..3eec8a04f22 100644 --- a/src/vs/workbench/parts/stats/node/workspaceStats.ts +++ b/src/vs/workbench/parts/stats/node/workspaceStats.ts @@ -255,9 +255,8 @@ export class WorkspaceStats implements IWorkbenchContribution { tags['workspace.roots'] = isEmpty ? 0 : workspace.folders.length; tags['workspace.empty'] = isEmpty; - let folders = !isEmpty ? workspace.folders.map(folder => folder.uri) : this.environmentService.appQuality !== 'stable' && this.findFolders(configuration); + const folders = !isEmpty ? workspace.folders.map(folder => folder.uri) : this.environmentService.appQuality !== 'stable' && this.findFolders(configuration); if (folders && folders.length && this.fileService) { - folders = folders.filter(x => x.scheme === 'file'); //return const files: IResolveFileResult[] = await this.fileService.resolveFiles(folders.map(resource => ({ resource }))); const names = ([]).concat(...files.map(result => result.success ? (result.stat.children || []) : [])).map(c => c.name); @@ -315,21 +314,26 @@ export class WorkspaceStats implements IWorkbenchContribution { if (nameSet.has('package.json')) { await TPromise.join(folders.map(async workspaceUri => { const uri = workspaceUri.with({ path: `${workspaceUri.path !== '/' ? workspaceUri.path : ''}/package.json` }); - const content = await this.fileService.resolveContent(uri, { acceptTextOnly: true }); - const packageJsonContents = JSON.parse(content.value); - if (packageJsonContents['dependencies']) { - for (let module of ModulesToLookFor) { - if ('react-native' === module) { - if (packageJsonContents['dependencies'][module]) { - tags['workspace.reactNative'] = true; - } - } else { - if (packageJsonContents['dependencies'][module]) { - tags['workspace.npm.' + module] = true; + try { + const content = await this.fileService.resolveContent(uri, { acceptTextOnly: true }); + const packageJsonContents = JSON.parse(content.value); + if (packageJsonContents['dependencies']) { + for (let module of ModulesToLookFor) { + if ('react-native' === module) { + if (packageJsonContents['dependencies'][module]) { + tags['workspace.reactNative'] = true; + } + } else { + if (packageJsonContents['dependencies'][module]) { + tags['workspace.npm.' + module] = true; + } } } } } + catch (e) { + // Ignore errors when resolving file or parsing file contents + } })); } } From e329bb6bb0b6f23620b7b8e9b7e80940ea900573 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Dirk=20B=C3=A4umer?= Date: Thu, 26 Apr 2018 22:46:58 +0200 Subject: [PATCH 152/830] Fixes #48711: TypeScript build task output not populating error list with `--pretty` on (#48744) --- extensions/typescript-language-features/package.json | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/extensions/typescript-language-features/package.json b/extensions/typescript-language-features/package.json index 1c2df7ca398..e37d075d183 100644 --- a/extensions/typescript-language-features/package.json +++ b/extensions/typescript-language-features/package.json @@ -541,12 +541,13 @@ "problemPatterns": [ { "name": "tsc", - "regexp": "^([^\\s].*)\\((\\d+|\\d+,\\d+|\\d+,\\d+,\\d+,\\d+)\\):\\s+(error|warning|info)\\s+(TS\\d+)\\s*:\\s*(.*)$", + "regexp": "^([^\\s].*)[\\(:](\\d+)[,:](\\d+)(?:\\):\\s+|\\s+-\\s+)(error|warning|info)\\s+(TS\\d+)\\s*:\\s*(.*)$", "file": 1, - "location": 2, - "severity": 3, - "code": 4, - "message": 5 + "line": 2, + "column": 3, + "severity": 4, + "code": 5, + "message": 6 } ], "problemMatchers": [ From e545ae6b34aae3f05a923d5258adbb58805ca27f Mon Sep 17 00:00:00 2001 From: Sandeep Somavarapu Date: Thu, 26 Apr 2018 23:16:52 +0200 Subject: [PATCH 153/830] #48373 Use read entry api --- src/typings/yauzl.d.ts | 1 + src/vs/base/node/zip.ts | 18 ++++++++++++------ 2 files changed, 13 insertions(+), 6 deletions(-) diff --git a/src/typings/yauzl.d.ts b/src/typings/yauzl.d.ts index 3bc78861ae9..3295c92ecb9 100644 --- a/src/typings/yauzl.d.ts +++ b/src/typings/yauzl.d.ts @@ -31,6 +31,7 @@ declare module 'yauzl' { } export class ZipFile extends EventEmitter { + readEntry(); openReadStream(entry: Entry, callback: (err?: Error, stream?: Readable) => void); close(); isOpen: boolean; diff --git a/src/vs/base/node/zip.ts b/src/vs/base/node/zip.ts index 0c034bf2820..0c575be1bef 100644 --- a/src/vs/base/node/zip.ts +++ b/src/vs/base/node/zip.ts @@ -96,6 +96,11 @@ function extractZip(zipfile: ZipFile, targetPath: string, options: IOptions, log return new TPromise((c, e) => { const throttler = new SimpleThrottler(); + const readNextEntry = () => { + extractedEntriesCount++; + zipfile.readEntry(); + }; + zipfile.once('error', e); zipfile.once('close', () => last.then(() => { if (isCanceled || zipfile.entryCount === extractedEntriesCount) { @@ -104,6 +109,7 @@ function extractZip(zipfile: ZipFile, targetPath: string, options: IOptions, log e(new ExtractError('Incomplete', new Error(nls.localize('incompleteExtract', "Incomplete. Found {0} of {1} entries", extractedEntriesCount, zipfile.entryCount)))); } }, e)); + zipfile.readEntry(); zipfile.on('entry', (entry: Entry) => { logService.debug(targetPath, 'Found', entry.fileName); @@ -112,7 +118,7 @@ function extractZip(zipfile: ZipFile, targetPath: string, options: IOptions, log } if (!options.sourcePathRegex.test(entry.fileName)) { - extractedEntriesCount++; + readNextEntry(); return; } @@ -121,14 +127,14 @@ function extractZip(zipfile: ZipFile, targetPath: string, options: IOptions, log // directory file names end with '/' if (/\/$/.test(fileName)) { const targetFileName = path.join(targetPath, fileName); - last = mkdirp(targetFileName).then(() => extractedEntriesCount++); + last = mkdirp(targetFileName).then(() => readNextEntry()); return; } const stream = ninvoke(zipfile, zipfile.openReadStream, entry); const mode = modeFromEntry(entry); - last = throttler.queue(() => stream.then(stream => extractEntry(stream, fileName, mode, targetPath, options).then(() => extractedEntriesCount++))); + last = throttler.queue(() => stream.then(stream => extractEntry(stream, fileName, mode, targetPath, options).then(() => readNextEntry()))); }); }, () => { logService.debug(targetPath, 'Cancelled.'); @@ -138,15 +144,15 @@ function extractZip(zipfile: ZipFile, targetPath: string, options: IOptions, log }).then(null, err => TPromise.wrapError(toExtractError(err))); } -function openZip(zipFile: string): TPromise { - return nfcall(_openZip, zipFile) +function openZip(zipFile: string, lazy: boolean = false): TPromise { + return nfcall(_openZip, zipFile, lazy ? { lazyEntries: true } : void 0) .then(null, err => TPromise.wrapError(toExtractError(err))); } export function extract(zipPath: string, targetPath: string, options: IExtractOptions = {}, logService: ILogService): TPromise { const sourcePathRegex = new RegExp(options.sourcePath ? `^${options.sourcePath}` : ''); - let promise = openZip(zipPath); + let promise = openZip(zipPath, true); if (options.overwrite) { promise = promise.then(zipfile => rimraf(targetPath).then(() => zipfile)); From a10799a60a74036fc29c9f276992df5e7774e39f Mon Sep 17 00:00:00 2001 From: Rob Lourens Date: Sun, 15 Apr 2018 19:22:20 -0700 Subject: [PATCH 154/830] Basic GUI for settings - #3355 --- .../browser/media/action-remove-dark.svg | 1 + .../browser/media/action-remove-focus.svg | 1 + .../browser/media/action-remove.svg | 1 + .../preferences/browser/media/preferences.css | 6 +- .../browser/media/settingsEditor2.css | 186 ++++++ .../preferences/browser/preferencesActions.ts | 19 + .../preferences/browser/settingsEditor2.ts | 575 ++++++++++++++++++ .../preferences.contribution.ts | 17 +- .../electron-browser/preferencesSearch.ts | 2 +- .../preferences/browser/preferencesService.ts | 7 +- .../preferences/common/preferences.ts | 5 + .../common/preferencesEditorInput.ts | 29 + .../preferences/common/preferencesModels.ts | 44 +- 13 files changed, 867 insertions(+), 26 deletions(-) create mode 100644 src/vs/workbench/parts/preferences/browser/media/action-remove-dark.svg create mode 100644 src/vs/workbench/parts/preferences/browser/media/action-remove-focus.svg create mode 100644 src/vs/workbench/parts/preferences/browser/media/action-remove.svg create mode 100644 src/vs/workbench/parts/preferences/browser/media/settingsEditor2.css create mode 100644 src/vs/workbench/parts/preferences/browser/settingsEditor2.ts diff --git a/src/vs/workbench/parts/preferences/browser/media/action-remove-dark.svg b/src/vs/workbench/parts/preferences/browser/media/action-remove-dark.svg new file mode 100644 index 00000000000..751e89b3b02 --- /dev/null +++ b/src/vs/workbench/parts/preferences/browser/media/action-remove-dark.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/vs/workbench/parts/preferences/browser/media/action-remove-focus.svg b/src/vs/workbench/parts/preferences/browser/media/action-remove-focus.svg new file mode 100644 index 00000000000..865c5aaea5a --- /dev/null +++ b/src/vs/workbench/parts/preferences/browser/media/action-remove-focus.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/vs/workbench/parts/preferences/browser/media/action-remove.svg b/src/vs/workbench/parts/preferences/browser/media/action-remove.svg new file mode 100644 index 00000000000..fde34404d4e --- /dev/null +++ b/src/vs/workbench/parts/preferences/browser/media/action-remove.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/vs/workbench/parts/preferences/browser/media/preferences.css b/src/vs/workbench/parts/preferences/browser/media/preferences.css index b16eea52446..3c896099dcc 100644 --- a/src/vs/workbench/parts/preferences/browser/media/preferences.css +++ b/src/vs/workbench/parts/preferences/browser/media/preferences.css @@ -40,7 +40,6 @@ .settings-tabs-widget > .monaco-action-bar .action-item .action-label { text-transform: uppercase; font-size: 11px; - margin-left: 33px; margin-right: 5px; cursor: pointer; display: flex; @@ -48,6 +47,11 @@ text-overflow: ellipsis; } +.default-preferences-editor-container > .preferences-header-container > .default-preferences-header, +.preferences-editor .settings-tabs-widget > .monaco-action-bar .action-item .action-label { + margin-left: 33px; +} + .settings-tabs-widget > .monaco-action-bar .action-item .action-label { display: block; } diff --git a/src/vs/workbench/parts/preferences/browser/media/settingsEditor2.css b/src/vs/workbench/parts/preferences/browser/media/settingsEditor2.css new file mode 100644 index 00000000000..bdf1fa429a7 --- /dev/null +++ b/src/vs/workbench/parts/preferences/browser/media/settingsEditor2.css @@ -0,0 +1,186 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ + +.settings-editor { + padding: 11px 0px 0px 27px; + max-width: 800px; + margin: auto; +} + +/* header styling */ + +.settings-editor > .settings-header { + padding: 0px 10px 0px 0px; +} + +.settings-editor > .settings-header > .search-container { + position: relative; +} + +.settings-editor > .settings-header .search-container > .settings-search-input { + vertical-align: middle; +} + +.settings-editor > .settings-header .search-container > .settings-search-input > .monaco-inputbox { + height: 30px; + width: 100%; +} + +.settings-editor > .settings-header .search-container > .settings-search-input > .monaco-inputbox .input { + font-size: 14px; + padding-left:10px; +} + +.settings-editor > .settings-header > .settings-header-controls-container { + margin-top: 7px; + display: flex; +} + +.settings-editor > .settings-header .settings-target-container { + flex: 1; +} + +.settings-editor > .settings-header .settings-tabs-widget > .monaco-action-bar .action-item:not(:first-child) .action-label { + margin-left: 33px; +} + +.settings-editor > .settings-header .open-settings-container { + /* compensate for 3px padding inside target widget, should be cleaned up */ + padding-top: 3px; + display: flex; + opacity: 0.7; +} + +.settings-editor > .settings-header .open-settings-container > .file-name { + text-decoration: underline; + cursor: pointer; + margin-left: 4px; +} + +.settings-editor > .settings-body .settings-nav-controls { + margin-bottom: 15px; + display: flex; +} + +.settings-editor > .settings-body .settings-nav-controls .monaco-custom-checkbox { + margin-right: 5px; +} + +.settings-editor > .settings-body .settings-list-container .settings-list-offset-helper { + opacity: 0; + position: absolute; +} + +.settings-editor > .settings-body .settings-nav-container { + margin-top: 18px; + margin-left: 410px; +} + +.settings-editor > .settings-body .settings-nav-container .settings-nav-controls-configured-only { + margin-right: 10px; +} + +.settings-editor > .settings-body .settings-list-container .monaco-list::before { + outline: none !important; +} + +.settings-editor > .settings-body .settings-list-container { + flex: 1; + border-spacing: 0; + border-collapse: separate; +} + +.settings-editor > .settings-body > .settings-list-container .monaco-list-row { + cursor: default; + white-space: normal; +} + +.settings-editor > .settings-body > .settings-list-container .monaco-list-row.odd { + background-color: rgba(130, 130, 130, 0.04); +} + +.settings-editor > .settings-body > .settings-list-container .monaco-list-row.setting-item { + padding: 3px 0px; +} + +.settings-editor > .settings-body > .settings-list-container .monaco-list-row > .setting-item-container { + display: flex; + height: 100%; +} + +.settings-editor > .settings-body > .settings-list-container .monaco-list-row > .setting-item-container > .setting-item-left { + width: 600px; +} + +.settings-editor > .settings-body > .settings-list-container .monaco-list-row > .setting-item-container > .setting-item-right { + flex: 1; + margin: 35px 10px; +} + +.settings-editor > .settings-body > .settings-list-container .monaco-list-row .setting-item-title { + line-height: initial; +} + +.settings-editor > .settings-body > .settings-list-container .monaco-list-row .setting-item-label { + font-size: 15px; + font-weight: bold; +} + +.settings-editor > .settings-body > .settings-list-container .monaco-list-row .setting-item-key { + margin-left: 10px; + font-family: Monaco, Menlo, Consolas, "Droid Sans Mono", "Inconsolata", "Courier New", monospace, "Droid Sans Fallback"; + font-size: 90%; + opacity: 0.8; + display: none; +} + +.settings-editor > .settings-body > .settings-list-container .monaco-list-row .setting-item-description { + opacity: 0.6; + margin-top: 5px; +} + +.settings-editor > .settings-body > .settings-list-container .monaco-list-row .setting-item-value { + display: flex; +} + +.settings-editor > .settings-body > .settings-list-container .monaco-list-row .monaco-select-box { + width: 100%; + font: inherit; +} + +.settings-editor .settings-nav-controls .monaco-custom-checkbox.unchecked, +.settings-editor > .settings-body > .settings-list-container .monaco-list-row .monaco-custom-checkbox.unchecked { + background: url("action-remove.svg") center center no-repeat; + /* Unchecked border style needs to be stylable on checkbox. Themeable? */ + border-color: #75715e !important; +} + +.settings-editor .settings-nav-controls .monaco-custom-checkbox.checked, +.settings-editor > .settings-body > .settings-list-container .monaco-list-row .monaco-custom-checkbox.checked { + background: url("action-remove-focus.svg") center center no-repeat; +} + +.settings-editor > .settings-body > .settings-list-container .monaco-list-row .monaco-custom-checkbox { + margin-left: auto; +} + +.settings-editor > .settings-body > .settings-list-container .monaco-list-row .setting-item-value > .setting-reset-button.monaco-button { + display: inline-block; + background: url("action-remove-dark.svg") center center no-repeat; + width: 16px; + height: 16px; + margin-left: 3px; + visibility: hidden; +} + +.settings-editor > .settings-body > .settings-list-container .monaco-list-row.is-configured:hover .setting-item-value > .setting-reset-button.monaco-button { + visibility: visible; +} + +.settings-editor > .settings-body > .settings-list-container .monaco-list-row .setting-item-overrides { + opacity: 0.6; + margin-top: 5px; + text-align: center; +} diff --git a/src/vs/workbench/parts/preferences/browser/preferencesActions.ts b/src/vs/workbench/parts/preferences/browser/preferencesActions.ts index da2948671a3..36af7cc2751 100644 --- a/src/vs/workbench/parts/preferences/browser/preferencesActions.ts +++ b/src/vs/workbench/parts/preferences/browser/preferencesActions.ts @@ -34,6 +34,25 @@ export class OpenRawDefaultSettingsAction extends Action { } } +export class OpenSettings2Action extends Action { + + public static readonly ID = 'workbench.action.openSettings2'; + public static readonly LABEL = nls.localize('openSettings2', "Open Settings (Experimental)"); + + constructor( + id: string, + label: string, + @IPreferencesService private preferencesService2: IPreferencesService + ) { + super(id, label); + } + + public run(event?: any): TPromise { + return this.preferencesService2.openSettings2(); + } +} + + export class OpenSettingsAction extends Action { public static readonly ID = 'workbench.action.openSettings'; diff --git a/src/vs/workbench/parts/preferences/browser/settingsEditor2.ts b/src/vs/workbench/parts/preferences/browser/settingsEditor2.ts new file mode 100644 index 00000000000..a0ad148fbc6 --- /dev/null +++ b/src/vs/workbench/parts/preferences/browser/settingsEditor2.ts @@ -0,0 +1,575 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ + +import * as DOM from 'vs/base/browser/dom'; +import { StandardKeyboardEvent } from 'vs/base/browser/keyboardEvent'; +import { Checkbox } from 'vs/base/browser/ui/checkbox/checkbox'; +import { InputBox } from 'vs/base/browser/ui/inputbox/inputBox'; +import { IDelegate, IRenderer } from 'vs/base/browser/ui/list/list'; +import { List } from 'vs/base/browser/ui/list/listWidget'; +import { SelectBox } from 'vs/base/browser/ui/selectBox/selectBox'; +import { IAction } from 'vs/base/common/actions'; +import { Delayer } from 'vs/base/common/async'; +import { Color } from 'vs/base/common/color'; +import { Emitter, Event } from 'vs/base/common/event'; +import { KeyCode } from 'vs/base/common/keyCodes'; +import { IDisposable, dispose } from 'vs/base/common/lifecycle'; +import { TPromise } from 'vs/base/common/winjs.base'; +import 'vs/css!./media/settingsEditor2'; +import { localize } from 'vs/nls'; +import { ConfigurationTarget, IConfigurationService } from 'vs/platform/configuration/common/configuration'; +import { IContextKey } from 'vs/platform/contextkey/common/contextkey'; +import { IContextMenuService, IContextViewService } from 'vs/platform/contextview/browser/contextView'; +import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation'; +import { WorkbenchList } from 'vs/platform/list/browser/listService'; +import { ITelemetryService } from 'vs/platform/telemetry/common/telemetry'; +import { attachInputBoxStyler, attachSelectBoxStyler, attachButtonStyler } from 'vs/platform/theme/common/styler'; +import { IThemeService } from 'vs/platform/theme/common/themeService'; +import { BaseEditor } from 'vs/workbench/browser/parts/editor/baseEditor'; +import { EditorOptions } from 'vs/workbench/common/editor'; +import { SearchWidget, SettingsTargetsWidget } from 'vs/workbench/parts/preferences/browser/preferencesWidgets'; +import { IPreferencesService, ISetting } from 'vs/workbench/services/preferences/common/preferences'; +import { PreferencesEditorInput2 } from 'vs/workbench/services/preferences/common/preferencesEditorInput'; +import { DefaultSettingsEditorModel } from 'vs/workbench/services/preferences/common/preferencesModels'; +import { Button } from 'vs/base/browser/ui/button/button'; +import { SettingMatches } from 'vs/workbench/parts/preferences/electron-browser/preferencesSearch'; + +const SETTINGS_ENTRY_TEMPLATE_ID = 'settings.entry.template'; +const SETTINGS_NAV_TEMPLATE_ID = 'settings.nav.template'; +const SETTINGS_GROUP_ENTRY_TEMPLATE_ID = 'settings.group.template'; + +interface IListEntry { + id: string; + templateId: string; +} + +interface ISettingItemEntry extends IListEntry { + key: string; + value: any; + isConfigured: boolean; + description: string; + overriddenScopeList: string[]; + type?: string | string[]; + enum?: string[]; +} + +interface INavListEntry extends IListEntry { + title: string; + index: number; +} + +interface IGroupTitleEntry extends IListEntry { + title: string; +} + +let $ = DOM.$; + +export class SettingsEditor2 extends BaseEditor { + + public static readonly ID: string = 'workbench.editor.settings2'; + + private defaultSettingsEditorModel: DefaultSettingsEditorModel; + + private headerContainer: HTMLElement; + private searchWidget: SearchWidget; + private settingsTargetsWidget: SettingsTargetsWidget; + + private showConfiguredSettingsOnly = false; + private showAllSettings = false; + + private settingsListContainer: HTMLElement; + private settingsList: List; + + private dimension: DOM.Dimension; + private delayedFiltering: Delayer; + private searchFocusContextKey: IContextKey; + + constructor( + @ITelemetryService telemetryService: ITelemetryService, + @IConfigurationService private configurationService: IConfigurationService, + @IThemeService themeService: IThemeService, + @IContextMenuService contextMenuService: IContextMenuService, + @IPreferencesService private preferencesService: IPreferencesService, + @IInstantiationService private instantiationService: IInstantiationService + ) { + super(SettingsEditor2.ID, telemetryService, themeService); + this.delayedFiltering = new Delayer(300); + this._register(configurationService.onDidChangeConfiguration(() => this.render())); + } + + createEditor(parent: HTMLElement): void { + const prefsEditorElement = DOM.append(parent, $('div', { class: 'settings-editor' })); + + this.createHeader(prefsEditorElement); + this.createBody(prefsEditorElement); + } + + setInput(input: PreferencesEditorInput2, options: EditorOptions): TPromise { + const oldInput = this.input; + return super.setInput(input) + .then(() => { + if (!input.matches(oldInput)) { + this.render(); + } + }); + } + + clearInput(): void { + super.clearInput(); + } + + layout(dimension: DOM.Dimension): void { + this.dimension = dimension; + this.searchWidget.layout(dimension); + + this.layoutSettingsList(); + this.render(); + } + + focus(): void { + this.searchWidget.focus(); + } + + getSecondaryActions(): IAction[] { + return [ + ]; + } + + search(filter: string): void { + this.searchWidget.focus(); + } + + clearSearchResults(): void { + this.searchWidget.clear(); + } + + private createHeader(parent: HTMLElement): void { + this.headerContainer = DOM.append(parent, $('.settings-header')); + + const searchContainer = DOM.append(this.headerContainer, $('.search-container')); + this.searchWidget = this._register(this.instantiationService.createInstance(SearchWidget, searchContainer, { + ariaLabel: localize('SearchSettings.AriaLabel', "Search settings"), + placeholder: localize('SearchSettings.Placeholder', "Search settings"), + focusKey: this.searchFocusContextKey + })); + this._register(this.searchWidget.onDidChange(searchValue => this.delayedFiltering.trigger(() => this.filterSettings()))); + + const headerControlsContainer = DOM.append(this.headerContainer, $('div.settings-header-controls-container')); + const targetWidgetContainer = DOM.append(headerControlsContainer, $('.settings-target-container')); + this.settingsTargetsWidget = this._register(this.instantiationService.createInstance(SettingsTargetsWidget, targetWidgetContainer)); + this.settingsTargetsWidget.settingsTarget = ConfigurationTarget.USER; + this.settingsTargetsWidget.onDidTargetChange(e => this.renderEntries()); + + this.createOpenSettingsElement(headerControlsContainer); + } + + private createOpenSettingsElement(parent: HTMLElement): void { + const openSettingsContainer = DOM.append(parent, $('.open-settings-container')); + DOM.append(openSettingsContainer, $('', null, localize('header-message', "For advanced customizations open and edit"))); + const fileElement = DOM.append(openSettingsContainer, $('.file-name', null, localize('settings-file-name', "settings.json"))); + fileElement.tabIndex = 0; + + this._register(DOM.addDisposableListener(fileElement, DOM.EventType.CLICK, () => this.preferencesService.openGlobalSettings())); + this._register(DOM.addDisposableListener(fileElement, DOM.EventType.KEY_UP, e => { + let keyboardEvent = new StandardKeyboardEvent(e); + switch (keyboardEvent.keyCode) { + case KeyCode.Enter: + this.preferencesService.openGlobalSettings(); + keyboardEvent.preventDefault(); + keyboardEvent.stopPropagation(); + return; + } + })); + } + + private createBody(parent: HTMLElement): void { + const bodyContainer = DOM.append(parent, $('.settings-body')); + + const navContainer = DOM.append(bodyContainer, $('.settings-nav-container')); + this.createNavControls(navContainer); + // this.createNavList(navContainer); + this.createList(bodyContainer); + } + + private createNavControls(parent: HTMLElement): void { + const navControls = DOM.append(parent, $('.settings-nav-controls')); + const configuredOnlyContainer = DOM.append(navControls, $('.settings-nav-controls-configured-only')); + const label = DOM.append(configuredOnlyContainer, $('span.settings-nav-controls-label.settings-nav-controls-configured-only')); + label.textContent = 'Show configured settings only'; + + const configuredOnlyCheckbox = new Checkbox({ + isChecked: this.showConfiguredSettingsOnly, + onChange: e => { + this.showConfiguredSettingsOnly = configuredOnlyCheckbox.checked; + this.render(); + }, + actionClassName: 'settings-nav-checkbox', + title: 'Show configured settings only' + }); + + configuredOnlyContainer.appendChild(configuredOnlyCheckbox.domNode); + + const allSettingsContainer = DOM.append(navControls, $('.settings-nav-controls-all-settings')); + const allSettingsLabel = DOM.append(allSettingsContainer, $('span.settings-nav-controls-label')); + allSettingsLabel.textContent = 'Show all settings'; + + const allSettingsCheckbox = new Checkbox({ + isChecked: this.showAllSettings, + onChange: e => { + this.showAllSettings = allSettingsCheckbox.checked; + this.render(); + }, + actionClassName: 'settings-nav-checkbox', + title: 'Show all settings' + }); + + allSettingsContainer.appendChild(allSettingsCheckbox.domNode); + } + + private createList(parent: HTMLElement): void { + this.settingsListContainer = DOM.append(parent, $('.settings-list-container')); + + const settingItemRenderer = this.instantiationService.createInstance(SettingItemRenderer); + settingItemRenderer.onDidChangeSetting(e => this.onDidChangeSetting(e.key, e.value)); + this.settingsList = this._register(this.instantiationService.createInstance( + WorkbenchList, + this.settingsListContainer, + new SettingItemDelegate(), + [settingItemRenderer, new GroupTitleRenderer()], + { + identityProvider: e => e.id, + ariaLabel: localize('settingsListLabel', "Settings"), + focusOnMouseDown: false, + selectOnMouseDown: false, + keyboardSupport: false, + mouseSupport: false + }) + ) as WorkbenchList; + + this.settingsList.style({ listHoverBackground: Color.transparent, listFocusOutline: Color.transparent }); + } + + private onDidChangeSetting(key: string, value: any): void { + this.configurationService.updateValue(key, value, this.settingsTargetsWidget.settingsTarget).then( + () => this.render(), + e => { + // ConfigurationService displays the error + }); + } + + private render(): TPromise { + if (this.input) { + return this.input.resolve() + .then((model: DefaultSettingsEditorModel) => this.defaultSettingsEditorModel = model) + .then(() => this.renderEntries()); + } + return TPromise.as(null); + } + + private filterSettings(): void { + this.renderEntries(); + } + + private renderEntries(): void { + if (this.defaultSettingsEditorModel) { + + const filter = this.searchWidget.getValue(); + + const entries: (ISettingItemEntry|IGroupTitleEntry)[] = []; + const navEntries: INavListEntry[] = []; + for (let groupIdx = 0; groupIdx < this.defaultSettingsEditorModel.settingsGroups.length; groupIdx++) { + if (groupIdx > 0 && !(this.showAllSettings || filter)) { + break; + } + + const group = this.defaultSettingsEditorModel.settingsGroups[groupIdx]; + const groupEntries = []; + for (const section of group.sections) { + for (const setting of section.settings) { + const matches = new SettingMatches(filter, setting, true, true, (filter, setting) => this.defaultSettingsEditorModel.findValueMatches(filter, setting)).matches; + + if (matches && matches.length) { + const entry = this.settingToEntry(setting); + if (!this.showConfiguredSettingsOnly || (this.showConfiguredSettingsOnly && entry.isConfigured)) { + groupEntries.push(entry); + } + } + } + } + + if (groupEntries.length) { + navEntries.push({ + id: group.id, + index: groupIdx, + title: group.title, + templateId: SETTINGS_NAV_TEMPLATE_ID + }); + + entries.push({ + id: group.id, + templateId: SETTINGS_GROUP_ENTRY_TEMPLATE_ID, + title: group.title + }); + + entries.push(...groupEntries); + } + } + + this.settingsList.splice(0, this.settingsList.length, entries); + // this.navList.splice(0, this.navList.length, navEntries); + } + } + + private settingToEntry(s: ISetting): ISettingItemEntry { + const targetSelector = this.settingsTargetsWidget.settingsTarget === ConfigurationTarget.USER ? 'user' : 'workspace'; + const inspected = this.configurationService.inspect(s.key); + const isConfigured = typeof inspected[targetSelector] !== 'undefined'; + const displayValue = isConfigured ? inspected[targetSelector] : inspected.default; + const overriddenScopeList = []; + if (targetSelector === 'user' && typeof inspected.workspace !== 'undefined') { + overriddenScopeList.push('Workspace'); + } + + if (targetSelector === 'workspace' && typeof inspected.user !== 'undefined') { + overriddenScopeList.push('User'); + } + + return { + id: s.key, + key: s.key, + value: displayValue, + isConfigured, + overriddenScopeList, + description: s.description.join('\n'), + enum: s.enum, + type: s.type, + templateId: SETTINGS_ENTRY_TEMPLATE_ID + }; + } + + private layoutSettingsList(): void { + const listHeight = this.dimension.height - (DOM.getDomNodePagePosition(this.headerContainer).height + 12 /*padding*/); + this.settingsListContainer.style.height = `${listHeight}px`; + this.settingsList.layout(listHeight); + } +} + +class SettingItemDelegate implements IDelegate { + + getHeight(entry: ISettingItemEntry) { + if (entry.templateId === SETTINGS_GROUP_ENTRY_TEMPLATE_ID) { + return 60; + } + + if (entry.templateId === SETTINGS_ENTRY_TEMPLATE_ID) { + // TODO dynamic height + return 105; + } + + return 0; + } + + getTemplateId(element: IListEntry) { + return element.templateId; + } +} + +interface ISettingItemTemplate { + parent: HTMLElement; + toDispose: IDisposable[]; + + containerElement: HTMLElement; + labelElement: HTMLElement; + keyElement: HTMLElement; + descriptionElement: HTMLElement; + valueElement: HTMLElement; + overridesElement: HTMLElement; +} + +interface INavItemTemplate { + parent: HTMLElement; + + labelElement: HTMLElement; +} + +interface IGroupTitleItemTemplate { + parent: HTMLElement; + + labelElement: HTMLElement; +} + +interface ISettingChangeEvent { + key: string; + value: any; // undefined => reset unconfigure +} + +class SettingItemRenderer implements IRenderer { + + /** + * TODO@roblou This shouldn't exist. List items should have actions or something + */ + private readonly _onDidChangeSetting: Emitter = new Emitter(); + public readonly onDidChangeSetting: Event = this._onDidChangeSetting.event; + + get templateId(): string { return SETTINGS_ENTRY_TEMPLATE_ID; } + + constructor( + @IContextViewService private contextViewService: IContextViewService, + @IThemeService private themeService: IThemeService + ) { } + + renderTemplate(parent: HTMLElement): ISettingItemTemplate { + DOM.addClass(parent, 'setting-item'); + + const itemContainer = DOM.append(parent, $('div.setting-item-container')); + const leftElement = DOM.append(itemContainer, $('.setting-item-left')); + const rightElement = DOM.append(itemContainer, $('.setting-item-right')); + + const titleElement = DOM.append(leftElement, $('div.setting-item-title')); + const labelElement = DOM.append(titleElement, $('span.setting-item-label')); + const keyElement = DOM.append(titleElement, $('span.setting-item-key')); + const descriptionElement = DOM.append(leftElement, $('div.setting-item-description')); + + const valueElement = DOM.append(rightElement, $('div.setting-item-value')); + const overridesElement = DOM.append(rightElement, $('div.setting-item-overrides')); + + return { + parent: parent, + toDispose: [], + + containerElement: itemContainer, + keyElement, + labelElement, + descriptionElement, + valueElement, + overridesElement + }; + } + + renderElement(entry: ISettingItemEntry, index: number, template: ISettingItemTemplate): void { + DOM.toggleClass(template.parent, 'odd', index % 2 === 1); + + template.keyElement.textContent = entry.key; + template.labelElement.textContent = settingKeyToLabel(entry.key); + template.descriptionElement.textContent = entry.description; + + DOM.toggleClass(template.parent, 'is-configured', entry.isConfigured); + this.renderValue(entry, template); + + const resetButton = new Button(template.valueElement); + resetButton.element.classList.add('setting-reset-button'); + attachButtonStyler(resetButton, this.themeService, { + buttonBackground: Color.transparent.toString(), + buttonHoverBackground: Color.transparent.toString() + }); + template.toDispose.push(resetButton.onDidClick(e => { + this._onDidChangeSetting.fire({ key: entry.key, value: undefined }); + })); + template.toDispose.push(resetButton); + + template.overridesElement.textContent = entry.overriddenScopeList.length ? 'Also configured in: ' + entry.overriddenScopeList.join(', ') : + ''; + } + + private renderValue(entry: ISettingItemEntry, template: ISettingItemTemplate): void { + const onChange = value => this._onDidChangeSetting.fire({ key: entry.key, value }); + template.valueElement.innerHTML = ''; + if (entry.type === 'string' && entry.enum) { + this.renderEnum(entry, template, onChange); + } else if (entry.type === 'boolean') { + this.renderBool(entry, template, onChange); + } else if (entry.type === 'string') { + this.renderText(entry, template, onChange); + } else if (entry.type === 'number') { + this.renderText(entry, template, value => onChange(parseInt(value))); + } else { + template.valueElement.textContent = 'Edit in settings.json!'; + } + } + + private renderBool(entry: ISettingItemEntry, template: ISettingItemTemplate, onChange: (value: boolean) => void): void { + const checkbox = new Checkbox({ + isChecked: entry.value, + title: entry.key, + onChange: e => onChange(checkbox.checked), + actionClassName: 'setting-value-checkbox' + }); + template.toDispose.push(checkbox); + + template.valueElement.appendChild(checkbox.domNode); + } + + private renderEnum(entry: ISettingItemEntry, template: ISettingItemTemplate, onChange: (value: string) => void): void { + const idx = entry.enum.indexOf(entry.value); + const selectBox = new SelectBox(entry.enum, idx, this.contextViewService); + template.toDispose.push(selectBox); + template.toDispose.push(attachSelectBoxStyler(selectBox, this.themeService)); + selectBox.render(template.valueElement); + + template.toDispose.push( + selectBox.onDidSelect(e => onChange(entry.enum[e.index]))); + } + + private renderText(entry: ISettingItemEntry, template: ISettingItemTemplate, onChange: (value: string) => void): void { + const inputBox = new InputBox(template.valueElement, this.contextViewService); + template.toDispose.push(attachInputBoxStyler(inputBox, this.themeService, { + })); + template.toDispose.push(inputBox); + inputBox.value = entry.value; + + template.toDispose.push( + inputBox.onDidChange(e => onChange(e))); + } + + disposeTemplate(template: ISettingItemTemplate): void { + dispose(template.toDispose); + } +} + +class GroupTitleRenderer implements IRenderer { + + get templateId(): string { return SETTINGS_GROUP_ENTRY_TEMPLATE_ID; } + + constructor( + ) { } + + renderTemplate(parent: HTMLElement): INavItemTemplate { + DOM.addClass(parent, 'group-title'); + + const labelElement = DOM.append(parent, $('h2.group-title-label')); + return { + parent: parent, + labelElement + }; + } + + renderElement(entry: IGroupTitleEntry, index: number, template: IGroupTitleItemTemplate): void { + template.labelElement.textContent = entry.title; + } + + disposeTemplate(template: ISettingItemTemplate): void { + dispose(template.toDispose); + } +} + +function settingKeyToLabel(key: string): string { + const lastDotIdx = key.lastIndexOf('.'); + if (lastDotIdx >= 0) { + key = key.substr(0, lastDotIdx) + ': ' + key.substr(lastDotIdx + 1); + } + + return key + .replace(/\.([a-z])/, (match, p1) => `.${p1.toUpperCase()}`) + .replace(/([a-z])([A-Z])/g, '$1 $2') // fooBar => foo Bar + .replace(/^[a-z]/g, match => match.toUpperCase()) // foo => Foo + .replace(/ [a-z]/g, match => match.toUpperCase()); // Foo bar => Foo Bar +} + +// registerThemingParticipant((theme: ITheme, collector: ICssStyleCollector) => { +// const listHighlightForegroundColor = theme.getColor(listHighlightForeground); +// if (listHighlightForegroundColor) { +// collector.addRule(`.keybindings-editor > .keybindings-body > .keybindings-list-container .monaco-list-row > .column .highlight { color: ${listHighlightForegroundColor}; }`); +// } +// }); diff --git a/src/vs/workbench/parts/preferences/electron-browser/preferences.contribution.ts b/src/vs/workbench/parts/preferences/electron-browser/preferences.contribution.ts index aa1599d77e3..7c897096b47 100644 --- a/src/vs/workbench/parts/preferences/electron-browser/preferences.contribution.ts +++ b/src/vs/workbench/parts/preferences/electron-browser/preferences.contribution.ts @@ -16,9 +16,10 @@ import { registerSingleton } from 'vs/platform/instantiation/common/extensions'; import { KeyMod, KeyChord, KeyCode } from 'vs/base/common/keyCodes'; import { SyncDescriptor } from 'vs/platform/instantiation/common/descriptors'; import { PreferencesEditor } from 'vs/workbench/parts/preferences/browser/preferencesEditor'; -import { DefaultPreferencesEditorInput, PreferencesEditorInput, KeybindingsEditorInput } from 'vs/workbench/services/preferences/common/preferencesEditorInput'; +import { SettingsEditor2 } from 'vs/workbench/parts/preferences/browser/settingsEditor2'; +import { DefaultPreferencesEditorInput, PreferencesEditorInput, KeybindingsEditorInput, PreferencesEditorInput2 } from 'vs/workbench/services/preferences/common/preferencesEditorInput'; import { KeybindingsEditor } from 'vs/workbench/parts/preferences/browser/keybindingsEditor'; -import { OpenRawDefaultSettingsAction, OpenSettingsAction, OpenGlobalSettingsAction, OpenGlobalKeybindingsFileAction, OpenWorkspaceSettingsAction, OpenFolderSettingsAction, ConfigureLanguageBasedSettingsAction, OPEN_FOLDER_SETTINGS_COMMAND, OpenGlobalKeybindingsAction } from 'vs/workbench/parts/preferences/browser/preferencesActions'; +import { OpenRawDefaultSettingsAction, OpenSettingsAction, OpenGlobalSettingsAction, OpenGlobalKeybindingsFileAction, OpenWorkspaceSettingsAction, OpenFolderSettingsAction, ConfigureLanguageBasedSettingsAction, OPEN_FOLDER_SETTINGS_COMMAND, OpenGlobalKeybindingsAction, OpenSettings2Action } from 'vs/workbench/parts/preferences/browser/preferencesActions'; import { IKeybindingsEditor, IPreferencesSearchService, CONTEXT_KEYBINDING_FOCUS, CONTEXT_KEYBINDINGS_EDITOR, CONTEXT_KEYBINDINGS_SEARCH_FOCUS, KEYBINDINGS_EDITOR_COMMAND_DEFINE, KEYBINDINGS_EDITOR_COMMAND_REMOVE, KEYBINDINGS_EDITOR_COMMAND_SEARCH, KEYBINDINGS_EDITOR_COMMAND_COPY, KEYBINDINGS_EDITOR_COMMAND_RESET, KEYBINDINGS_EDITOR_COMMAND_COPY_COMMAND, KEYBINDINGS_EDITOR_COMMAND_SHOW_SIMILAR, KEYBINDINGS_EDITOR_COMMAND_FOCUS_KEYBINDINGS, KEYBINDINGS_EDITOR_COMMAND_CLEAR_SEARCH_RESULTS @@ -47,6 +48,17 @@ Registry.as(EditorExtensions.Editors).registerEditor( ] ); +Registry.as(EditorExtensions.Editors).registerEditor( + new EditorDescriptor( + SettingsEditor2, + SettingsEditor2.ID, + nls.localize('defaultPreferencesEditor2', "Default Preferences Editor 2") + ), + [ + new SyncDescriptor(PreferencesEditorInput2) + ] +); + Registry.as(EditorExtensions.Editors).registerEditor( new EditorDescriptor( KeybindingsEditor, @@ -167,6 +179,7 @@ const category = nls.localize('preferences', "Preferences"); const registry = Registry.as(Extensions.WorkbenchActions); registry.registerWorkbenchAction(new SyncActionDescriptor(OpenRawDefaultSettingsAction, OpenRawDefaultSettingsAction.ID, OpenRawDefaultSettingsAction.LABEL), 'Preferences: Open Raw Default Settings', category); registry.registerWorkbenchAction(new SyncActionDescriptor(OpenSettingsAction, OpenSettingsAction.ID, OpenSettingsAction.LABEL, { primary: KeyMod.CtrlCmd | KeyCode.US_COMMA }), 'Preferences: Open Settings', category); +registry.registerWorkbenchAction(new SyncActionDescriptor(OpenSettings2Action, OpenSettings2Action.ID, OpenSettings2Action.LABEL), 'Preferences: Open Settings (Experimental)', category); registry.registerWorkbenchAction(new SyncActionDescriptor(OpenGlobalSettingsAction, OpenGlobalSettingsAction.ID, OpenGlobalSettingsAction.LABEL), 'Preferences: Open User Settings', category); registry.registerWorkbenchAction(new SyncActionDescriptor(OpenGlobalKeybindingsAction, OpenGlobalKeybindingsAction.ID, OpenGlobalKeybindingsAction.LABEL, { primary: KeyChord(KeyMod.CtrlCmd | KeyCode.KEY_K, KeyMod.CtrlCmd | KeyCode.KEY_S) }), 'Preferences: Open Keyboard Shortcuts', category); registry.registerWorkbenchAction(new SyncActionDescriptor(OpenGlobalKeybindingsFileAction, OpenGlobalKeybindingsFileAction.ID, OpenGlobalKeybindingsFileAction.LABEL, { primary: null }), 'Preferences: Open Keyboard Shortcuts File', category); diff --git a/src/vs/workbench/parts/preferences/electron-browser/preferencesSearch.ts b/src/vs/workbench/parts/preferences/electron-browser/preferencesSearch.ts index 3b40c62f656..06459e0d425 100644 --- a/src/vs/workbench/parts/preferences/electron-browser/preferencesSearch.ts +++ b/src/vs/workbench/parts/preferences/electron-browser/preferencesSearch.ts @@ -403,7 +403,7 @@ function remoteSettingToISetting(remoteSetting: IRemoteSetting): IExtensionSetti }; } -class SettingMatches { +export class SettingMatches { private readonly descriptionMatchingWords: Map = new Map(); private readonly keyMatchingWords: Map = new Map(); diff --git a/src/vs/workbench/services/preferences/browser/preferencesService.ts b/src/vs/workbench/services/preferences/browser/preferencesService.ts index c9e793a29d6..832ef7c16e5 100644 --- a/src/vs/workbench/services/preferences/browser/preferencesService.ts +++ b/src/vs/workbench/services/preferences/browser/preferencesService.ts @@ -24,7 +24,7 @@ import { IEnvironmentService } from 'vs/platform/environment/common/environment' import { IPreferencesService, IPreferencesEditorModel, ISetting, getSettingsTargetName, FOLDER_SETTINGS_PATH, DEFAULT_SETTINGS_EDITOR_SETTING } from 'vs/workbench/services/preferences/common/preferences'; import { SettingsEditorModel, DefaultSettingsEditorModel, DefaultKeybindingsEditorModel, defaultKeybindingsContents, DefaultSettings, WorkspaceConfigurationEditorModel } from 'vs/workbench/services/preferences/common/preferencesModels'; import { ITelemetryService } from 'vs/platform/telemetry/common/telemetry'; -import { DefaultPreferencesEditorInput, PreferencesEditorInput, KeybindingsEditorInput } from 'vs/workbench/services/preferences/common/preferencesEditorInput'; +import { DefaultPreferencesEditorInput, PreferencesEditorInput, KeybindingsEditorInput, PreferencesEditorInput2 } from 'vs/workbench/services/preferences/common/preferencesEditorInput'; import { ITextModelService } from 'vs/editor/common/services/resolverService'; import { getCodeEditor } from 'vs/editor/browser/services/codeEditorService'; import { EditOperation } from 'vs/editor/common/core/editOperation'; @@ -182,6 +182,11 @@ export class PreferencesService extends Disposable implements IPreferencesServic return this.openOrSwitchSettings(ConfigurationTarget.USER, this.userSettingsResource, options, position); } + openSettings2(): TPromise { + return this.createDefaultSettingsEditorModel(this.userSettingsResource) + .then(model => this.editorService.openEditor(this.instantiationService.createInstance(PreferencesEditorInput2, model), { pinned: true }).then(() => null)); + } + openWorkspaceSettings(options?: IEditorOptions, position?: EditorPosition): TPromise { if (this.contextService.getWorkbenchState() === WorkbenchState.EMPTY) { this.notificationService.info(nls.localize('openFolderFirst', "Open a folder first to create workspace settings")); diff --git a/src/vs/workbench/services/preferences/common/preferences.ts b/src/vs/workbench/services/preferences/common/preferences.ts index 0a4d82056b0..ccc4547988e 100644 --- a/src/vs/workbench/services/preferences/common/preferences.ts +++ b/src/vs/workbench/services/preferences/common/preferences.ts @@ -41,6 +41,10 @@ export interface ISetting { descriptionRanges: IRange[]; overrides?: ISetting[]; overrideOf?: ISetting; + + // TODO@roblou maybe need new type and new EditorModel for GUI editor instead of ISetting which is used for text settings editor + type?: string | string[]; + enum?: string[]; } export interface IExtensionSetting extends ISetting { @@ -138,6 +142,7 @@ export interface IPreferencesService { openRawDefaultSettings(): TPromise; openSettings(): TPromise; + openSettings2(): TPromise; openGlobalSettings(options?: IEditorOptions, position?: Position): TPromise; openWorkspaceSettings(options?: IEditorOptions, position?: Position): TPromise; openFolderSettings(folder: URI, options?: IEditorOptions, position?: Position): TPromise; diff --git a/src/vs/workbench/services/preferences/common/preferencesEditorInput.ts b/src/vs/workbench/services/preferences/common/preferencesEditorInput.ts index f8fb62cb73a..846574ab258 100644 --- a/src/vs/workbench/services/preferences/common/preferencesEditorInput.ts +++ b/src/vs/workbench/services/preferences/common/preferencesEditorInput.ts @@ -14,6 +14,7 @@ import { KeybindingsEditorModel } from 'vs/workbench/services/preferences/common import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation'; import { OS } from 'vs/base/common/platform'; import { TPromise } from 'vs/base/common/winjs.base'; +import { DefaultSettingsEditorModel } from './preferencesModels'; export class PreferencesEditorInput extends SideBySideEditorInput { public static readonly ID: string = 'workbench.editorinputs.preferencesEditorInput'; @@ -81,3 +82,31 @@ export class KeybindingsEditorInput extends EditorInput { return otherInput instanceof KeybindingsEditorInput; } } + +export class PreferencesEditorInput2 extends EditorInput { + + public static readonly ID: string = 'workbench.input.preferences2'; + + public readonly defaultSettingsEditorModel: DefaultSettingsEditorModel; + + constructor(model, @IInstantiationService instantiationService: IInstantiationService) { + super(); + this.defaultSettingsEditorModel = model; + } + + getTypeId(): string { + return PreferencesEditorInput2.ID; + } + + getName(): string { + return nls.localize('prefsEditorInput2', "Settings (Experimental)"); + } + + resolve(refresh?: boolean): TPromise { + return TPromise.wrap(this.defaultSettingsEditorModel); + } + + matches(otherInput: any): boolean { + return otherInput instanceof PreferencesEditorInput2; + } +} diff --git a/src/vs/workbench/services/preferences/common/preferencesModels.ts b/src/vs/workbench/services/preferences/common/preferencesModels.ts index a3ea720f8b6..a20abf46e45 100644 --- a/src/vs/workbench/services/preferences/common/preferencesModels.ts +++ b/src/vs/workbench/services/preferences/common/preferencesModels.ts @@ -3,25 +3,25 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import * as nls from 'vs/nls'; -import { assign } from 'vs/base/common/objects'; -import * as map from 'vs/base/common/map'; -import { tail, flatten } from 'vs/base/common/arrays'; -import URI from 'vs/base/common/uri'; -import { IReference, Disposable } from 'vs/base/common/lifecycle'; -import { Event, Emitter } from 'vs/base/common/event'; -import { Registry } from 'vs/platform/registry/common/platform'; -import { visit, JSONVisitor } from 'vs/base/common/json'; -import { ITextModel, IIdentifiedSingleEditOperation } from 'vs/editor/common/model'; -import { EditorModel } from 'vs/workbench/common/editor'; -import { IConfigurationNode, IConfigurationRegistry, Extensions, OVERRIDE_PROPERTY_PATTERN, IConfigurationPropertySchema, ConfigurationScope } from 'vs/platform/configuration/common/configurationRegistry'; -import { ISettingsEditorModel, IKeybindingsEditorModel, ISettingsGroup, ISetting, IFilterResult, IGroupFilter, ISettingMatcher, ISettingMatch, ISearchResultGroup, IFilterMetadata } from 'vs/workbench/services/preferences/common/preferences'; -import { IKeybindingService } from 'vs/platform/keybinding/common/keybinding'; -import { ITextEditorModel } from 'vs/editor/common/services/resolverService'; -import { IRange, Range } from 'vs/editor/common/core/range'; -import { ConfigurationTarget } from 'vs/platform/configuration/common/configuration'; -import { Selection } from 'vs/editor/common/core/selection'; +import { flatten, tail } from 'vs/base/common/arrays'; import { IStringDictionary } from 'vs/base/common/collections'; +import { Emitter, Event } from 'vs/base/common/event'; +import { JSONVisitor, visit } from 'vs/base/common/json'; +import { Disposable, IReference } from 'vs/base/common/lifecycle'; +import * as map from 'vs/base/common/map'; +import { assign } from 'vs/base/common/objects'; +import URI from 'vs/base/common/uri'; +import { IRange, Range } from 'vs/editor/common/core/range'; +import { Selection } from 'vs/editor/common/core/selection'; +import { IIdentifiedSingleEditOperation, ITextModel } from 'vs/editor/common/model'; +import { ITextEditorModel } from 'vs/editor/common/services/resolverService'; +import * as nls from 'vs/nls'; +import { ConfigurationTarget } from 'vs/platform/configuration/common/configuration'; +import { ConfigurationScope, Extensions, IConfigurationNode, IConfigurationPropertySchema, IConfigurationRegistry, OVERRIDE_PROPERTY_PATTERN } from 'vs/platform/configuration/common/configurationRegistry'; +import { IKeybindingService } from 'vs/platform/keybinding/common/keybinding'; +import { Registry } from 'vs/platform/registry/common/platform'; +import { EditorModel } from 'vs/workbench/common/editor'; +import { IFilterMetadata, IFilterResult, IGroupFilter, IKeybindingsEditorModel, ISearchResultGroup, ISetting, ISettingMatch, ISettingMatcher, ISettingsEditorModel, ISettingsGroup } from 'vs/workbench/services/preferences/common/preferences'; export abstract class AbstractSettingsModel extends EditorModel { @@ -470,7 +470,9 @@ export class DefaultSettings extends Disposable { value: setting.value, range: null, valueRange: null, - overrides: [] + overrides: [], + type: setting.type, + enum: setting.enum }; } return null; @@ -537,14 +539,14 @@ export class DefaultSettings extends Disposable { } private parseSettings(settingsObject: { [path: string]: IConfigurationPropertySchema; }): ISetting[] { - let result = []; + let result: ISetting[] = []; for (let key in settingsObject) { const prop = settingsObject[key]; if (!prop.deprecationMessage && this.matchesScope(prop)) { const value = prop.default; const description = (prop.description || '').split('\n'); const overrides = OVERRIDE_PROPERTY_PATTERN.test(key) ? this.parseOverrideSettings(prop.default) : []; - result.push({ key, value, description, range: null, keyRange: null, valueRange: null, descriptionRanges: [], overrides }); + result.push({ key, value, description, range: null, keyRange: null, valueRange: null, descriptionRanges: [], overrides, type: prop.type, enum: prop.enum }); } } return result; From c5e4b5f44657e7579675c57dab819a5de6fc335b Mon Sep 17 00:00:00 2001 From: Rob Lourens Date: Fri, 20 Apr 2018 13:45:44 -0700 Subject: [PATCH 155/830] Settings search in GUI - #3355 --- .../preferences/browser/settingsEditor2.ts | 215 ++++++++++++++++-- 1 file changed, 195 insertions(+), 20 deletions(-) diff --git a/src/vs/workbench/parts/preferences/browser/settingsEditor2.ts b/src/vs/workbench/parts/preferences/browser/settingsEditor2.ts index a0ad148fbc6..6f301f7ba45 100644 --- a/src/vs/workbench/parts/preferences/browser/settingsEditor2.ts +++ b/src/vs/workbench/parts/preferences/browser/settingsEditor2.ts @@ -11,7 +11,7 @@ import { IDelegate, IRenderer } from 'vs/base/browser/ui/list/list'; import { List } from 'vs/base/browser/ui/list/listWidget'; import { SelectBox } from 'vs/base/browser/ui/selectBox/selectBox'; import { IAction } from 'vs/base/common/actions'; -import { Delayer } from 'vs/base/common/async'; +import { Delayer, ThrottledDelayer } from 'vs/base/common/async'; import { Color } from 'vs/base/common/color'; import { Emitter, Event } from 'vs/base/common/event'; import { KeyCode } from 'vs/base/common/keyCodes'; @@ -30,11 +30,14 @@ import { IThemeService } from 'vs/platform/theme/common/themeService'; import { BaseEditor } from 'vs/workbench/browser/parts/editor/baseEditor'; import { EditorOptions } from 'vs/workbench/common/editor'; import { SearchWidget, SettingsTargetsWidget } from 'vs/workbench/parts/preferences/browser/preferencesWidgets'; -import { IPreferencesService, ISetting } from 'vs/workbench/services/preferences/common/preferences'; +import { IPreferencesService, ISetting, ISettingsEditorModel, ISearchResult } from 'vs/workbench/services/preferences/common/preferences'; import { PreferencesEditorInput2 } from 'vs/workbench/services/preferences/common/preferencesEditorInput'; import { DefaultSettingsEditorModel } from 'vs/workbench/services/preferences/common/preferencesModels'; import { Button } from 'vs/base/browser/ui/button/button'; -import { SettingMatches } from 'vs/workbench/parts/preferences/electron-browser/preferencesSearch'; +import { IPreferencesSearchService, ISearchProvider } from '../common/preferences'; +import { IProgressService } from 'vs/platform/progress/common/progress'; +import { isPromiseCanceledError, getErrorMessage } from 'vs/base/common/errors'; +import { ILogService } from 'vs/platform/log/common/log'; const SETTINGS_ENTRY_TEMPLATE_ID = 'settings.entry.template'; const SETTINGS_NAV_TEMPLATE_ID = 'settings.nav.template'; @@ -64,6 +67,11 @@ interface IGroupTitleEntry extends IListEntry { title: string; } +enum SearchResultIdx { + Local = 0, + Remote = 1 +} + let $ = DOM.$; export class SettingsEditor2 extends BaseEditor { @@ -83,19 +91,33 @@ export class SettingsEditor2 extends BaseEditor { private settingsList: List; private dimension: DOM.Dimension; - private delayedFiltering: Delayer; private searchFocusContextKey: IContextKey; + private delayedFilterLogging: Delayer; + private localSearchDelayer: Delayer; + private remoteSearchThrottle: ThrottledDelayer; + + private currentLocalSearchProvider: ISearchProvider; + private currentRemoteSearchProvider: ISearchProvider; + + private searchResults: ISearchResult[] = []; + constructor( @ITelemetryService telemetryService: ITelemetryService, @IConfigurationService private configurationService: IConfigurationService, @IThemeService themeService: IThemeService, @IContextMenuService contextMenuService: IContextMenuService, @IPreferencesService private preferencesService: IPreferencesService, - @IInstantiationService private instantiationService: IInstantiationService + @IInstantiationService private instantiationService: IInstantiationService, + @IPreferencesSearchService private preferencesSearchService: IPreferencesSearchService, + @IProgressService private progressService: IProgressService, + @ILogService private logService: ILogService ) { super(SettingsEditor2.ID, telemetryService, themeService); - this.delayedFiltering = new Delayer(300); + this.delayedFilterLogging = new Delayer(1000); + this.localSearchDelayer = new Delayer(100); + this.remoteSearchThrottle = new ThrottledDelayer(200); + this._register(configurationService.onDidChangeConfiguration(() => this.render())); } @@ -154,7 +176,7 @@ export class SettingsEditor2 extends BaseEditor { placeholder: localize('SearchSettings.Placeholder', "Search settings"), focusKey: this.searchFocusContextKey })); - this._register(this.searchWidget.onDidChange(searchValue => this.delayedFiltering.trigger(() => this.filterSettings()))); + this._register(this.searchWidget.onDidChange(() => this.onInputChanged())); const headerControlsContainer = DOM.append(this.headerContainer, $('div.settings-header-controls-container')); const targetWidgetContainer = DOM.append(headerControlsContainer, $('.settings-target-container')); @@ -268,19 +290,176 @@ export class SettingsEditor2 extends BaseEditor { return TPromise.as(null); } - private filterSettings(): void { - this.renderEntries(); + private onInputChanged(): void { + const query = this.searchWidget.getValue().trim(); + this.delayedFilterLogging.cancel(); + this.triggerSearch(query) + .then(() => { + // const result = this.preferencesRenderers.lastFilterResult; + // if (result) { + // this.delayedFilterLogging.trigger(() => this.reportFilteringUsed( + // query, + // this.preferencesRenderers.lastFilterResult)); + // } + }); + } + + private triggerSearch(query: string): TPromise { + if (query) { + return TPromise.join([ + this.localSearchDelayer.trigger(() => this.localFilterPreferences(query)), + this.remoteSearchThrottle.trigger(() => this.progressService.showWhile(this.remoteSearchPreferences(query), 500)) + ]) as TPromise; + } else { + // When clearing the input, update immediately to clear it + this.localSearchDelayer.cancel(); + // this.preferencesRenderers.localFilterPreferences(query); + + this.remoteSearchThrottle.cancel(); + // return this.preferencesRenderers.remoteSearchPreferences(query); + + this.searchResults = []; + this.renderEntries(); + return TPromise.wrap(null); + } + } + + private localFilterPreferences(query: string): TPromise { + this.currentLocalSearchProvider = this.preferencesSearchService.getLocalSearchProvider(query); + return this.filterOrSearchPreferences(query, SearchResultIdx.Local, this.currentLocalSearchProvider); + } + + private remoteSearchPreferences(query: string): TPromise { + this.currentRemoteSearchProvider = this.preferencesSearchService.getRemoteSearchProvider(query); + return this.filterOrSearchPreferences(query, SearchResultIdx.Remote, this.currentRemoteSearchProvider); + } + + private filterOrSearchPreferences(query: string, type: SearchResultIdx, searchProvider: ISearchProvider): TPromise { + // this.lastQuery = query; + + const filterPs: TPromise[] = [this._filterOrSearchPreferencesModel(query, this.defaultSettingsEditorModel, searchProvider)]; + // filterPs.push(this.searchAllSettingsTargets(query, searchProvider)); + + return TPromise.join(filterPs).then(results => { + const [result] = results; + this.searchResults[type] = result; + this.renderSearchResults(this.searchResults); + }); + } + + // private searchAllSettingsTargets(query: string, searchProvider: ISearchProvider): TPromise { + // const searchPs = [ + // this.searchSettingsTarget(query, searchProvider, ConfigurationTarget.WORKSPACE), + // this.searchSettingsTarget(query, searchProvider, ConfigurationTarget.USER) + // ]; + + // for (const folder of this.workspaceContextService.getWorkspace().folders) { + // const folderSettingsResource = this.preferencesService.getFolderSettingsResource(folder.uri); + // searchPs.push(this.searchSettingsTarget(query, searchProvider, folderSettingsResource)); + // } + + + // return TPromise.join(searchPs).then(() => { }); + // } + + // private searchSettingsTarget(query: string, provider: ISearchProvider, target: SettingsTarget): TPromise { + // if (!query) { + // // Don't open the other settings targets when query is empty + // this._onDidFilterResultsCountChange.fire({ target, count: 0 }); + // return TPromise.wrap(null); + // } + + // return this.getPreferencesEditorModel(target).then(model => { + // return model && this._filterOrSearchPreferencesModel('', model, provider); + // }).then(result => { + // const count = result ? this._flatten(result.filteredGroups).length : 0; + // this._onDidFilterResultsCountChange.fire({ target, count }); + // }, err => { + // if (!isPromiseCanceledError(err)) { + // return TPromise.wrapError(err); + // } + + // return null; + // }); + // } + + private _filterOrSearchPreferencesModel(filter: string, model: ISettingsEditorModel, provider: ISearchProvider): TPromise { + const searchP = provider ? provider.searchModel(model) : TPromise.wrap(null); + return searchP + .then(null, err => { + if (isPromiseCanceledError(err)) { + return TPromise.wrapError(err); + } else { + /* __GDPR__ + "defaultSettings.searchError" : { + "message": { "classification": "CallstackOrException", "purpose": "FeatureInsight" }, + "filter": { "classification": "SystemMetaData", "purpose": "FeatureInsight" } + } + */ + const message = getErrorMessage(err).trim(); + if (message && message !== 'Error') { + // "Error" = any generic network error + this.telemetryService.publicLog('defaultSettings.searchError', { message, filter }); + this.logService.info('Setting search error: ' + message); + } + return null; + } + }); + } + + // private async getPreferencesEditorModel(target: SettingsTarget): TPromise { + // const resource = target === ConfigurationTarget.USER ? this.preferencesService.userSettingsResource : + // target === ConfigurationTarget.WORKSPACE ? this.preferencesService.workspaceSettingsResource : + // target; + + // if (!resource) { + // return null; + // } + + // const targetKey = resource.toString(); + // if (!this._prefsModelsForSearch.has(targetKey)) { + // try { + // const model = this._register(await this.preferencesService.createPreferencesEditorModel(resource)); + // this._prefsModelsForSearch.set(targetKey, model); + // } catch (e) { + // // Will throw when the settings file doesn't exist. + // return null; + // } + // } + + // return this._prefsModelsForSearch.get(targetKey); + // } + + private renderSearchResults(searchResults: ISearchResult[]): void { + const entries: ISettingItemEntry[] = []; + const seenSettings = new Set(); + + for (let result of searchResults) { + if (!result) { + continue; + } + + for (let match of result.filterMatches) { + if (!seenSettings.has(match.setting.key)) { + const entry = this.settingToEntry(match.setting); + if (!this.showConfiguredSettingsOnly || entry.isConfigured) { + seenSettings.add(entry.key); + entries.push(entry); + } + } + } + } + + this.settingsList.splice(0, this.settingsList.length, entries); } private renderEntries(): void { if (this.defaultSettingsEditorModel) { - const filter = this.searchWidget.getValue(); - - const entries: (ISettingItemEntry|IGroupTitleEntry)[] = []; + const entries: (ISettingItemEntry | IGroupTitleEntry)[] = []; const navEntries: INavListEntry[] = []; for (let groupIdx = 0; groupIdx < this.defaultSettingsEditorModel.settingsGroups.length; groupIdx++) { - if (groupIdx > 0 && !(this.showAllSettings || filter)) { + if (groupIdx > 0 && !(this.showAllSettings)) { break; } @@ -288,13 +467,9 @@ export class SettingsEditor2 extends BaseEditor { const groupEntries = []; for (const section of group.sections) { for (const setting of section.settings) { - const matches = new SettingMatches(filter, setting, true, true, (filter, setting) => this.defaultSettingsEditorModel.findValueMatches(filter, setting)).matches; - - if (matches && matches.length) { - const entry = this.settingToEntry(setting); - if (!this.showConfiguredSettingsOnly || (this.showConfiguredSettingsOnly && entry.isConfigured)) { - groupEntries.push(entry); - } + const entry = this.settingToEntry(setting); + if (!this.showConfiguredSettingsOnly || (this.showConfiguredSettingsOnly && entry.isConfigured)) { + groupEntries.push(entry); } } } From 8766048cc2048d07bf1d514ce82938aee32964fa Mon Sep 17 00:00:00 2001 From: Rob Lourens Date: Fri, 20 Apr 2018 17:08:44 -0700 Subject: [PATCH 156/830] #3355 - Move "Show all settings" toggle to list item after Commonly Used --- .../browser/media/settingsEditor2.css | 27 ++-- .../preferences/browser/settingsEditor2.ts | 145 ++++++++++-------- 2 files changed, 99 insertions(+), 73 deletions(-) diff --git a/src/vs/workbench/parts/preferences/browser/media/settingsEditor2.css b/src/vs/workbench/parts/preferences/browser/media/settingsEditor2.css index bdf1fa429a7..e4277c2144d 100644 --- a/src/vs/workbench/parts/preferences/browser/media/settingsEditor2.css +++ b/src/vs/workbench/parts/preferences/browser/media/settingsEditor2.css @@ -59,29 +59,24 @@ margin-left: 4px; } -.settings-editor > .settings-body .settings-nav-controls { - margin-bottom: 15px; +.settings-editor > .settings-header .settings-nav-controls { display: flex; } -.settings-editor > .settings-body .settings-nav-controls .monaco-custom-checkbox { +.settings-editor > .settings-header .settings-nav-controls .monaco-custom-checkbox { margin-right: 5px; } +.settings-editor > .settings-header .settings-nav-container { + margin-top: 18px; + margin-left: 560px; +} + .settings-editor > .settings-body .settings-list-container .settings-list-offset-helper { opacity: 0; position: absolute; } -.settings-editor > .settings-body .settings-nav-container { - margin-top: 18px; - margin-left: 410px; -} - -.settings-editor > .settings-body .settings-nav-container .settings-nav-controls-configured-only { - margin-right: 10px; -} - .settings-editor > .settings-body .settings-list-container .monaco-list::before { outline: none !important; } @@ -184,3 +179,11 @@ margin-top: 5px; text-align: center; } + +.settings-editor > .settings-body > .settings-list-container .monaco-list-row.all-settings { + display: flex; +} + +.settings-editor > .settings-body > .settings-list-container .monaco-list-row.all-settings .all-settings-button { + margin: auto; +} diff --git a/src/vs/workbench/parts/preferences/browser/settingsEditor2.ts b/src/vs/workbench/parts/preferences/browser/settingsEditor2.ts index 6f301f7ba45..1e2a70e3a82 100644 --- a/src/vs/workbench/parts/preferences/browser/settingsEditor2.ts +++ b/src/vs/workbench/parts/preferences/browser/settingsEditor2.ts @@ -15,7 +15,7 @@ import { Delayer, ThrottledDelayer } from 'vs/base/common/async'; import { Color } from 'vs/base/common/color'; import { Emitter, Event } from 'vs/base/common/event'; import { KeyCode } from 'vs/base/common/keyCodes'; -import { IDisposable, dispose } from 'vs/base/common/lifecycle'; +import { IDisposable, dispose, Disposable } from 'vs/base/common/lifecycle'; import { TPromise } from 'vs/base/common/winjs.base'; import 'vs/css!./media/settingsEditor2'; import { localize } from 'vs/nls'; @@ -40,8 +40,10 @@ import { isPromiseCanceledError, getErrorMessage } from 'vs/base/common/errors'; import { ILogService } from 'vs/platform/log/common/log'; const SETTINGS_ENTRY_TEMPLATE_ID = 'settings.entry.template'; -const SETTINGS_NAV_TEMPLATE_ID = 'settings.nav.template'; const SETTINGS_GROUP_ENTRY_TEMPLATE_ID = 'settings.group.template'; +const BUTTON_ROW_ENTRY_TEMPLATE = 'settings.buttonRow.template'; + +const ALL_SETTINGS_BUTTON_ID = 'allSettings'; interface IListEntry { id: string; @@ -58,15 +60,14 @@ interface ISettingItemEntry extends IListEntry { enum?: string[]; } -interface INavListEntry extends IListEntry { - title: string; - index: number; -} - interface IGroupTitleEntry extends IListEntry { title: string; } +interface IButtonRowEntry extends IListEntry { + label: string; +} + enum SearchResultIdx { Local = 0, Remote = 1 @@ -185,6 +186,9 @@ export class SettingsEditor2 extends BaseEditor { this.settingsTargetsWidget.onDidTargetChange(e => this.renderEntries()); this.createOpenSettingsElement(headerControlsContainer); + + const navContainer = DOM.append(this.headerContainer, $('.settings-nav-container')); + this.createNavControls(navContainer); } private createOpenSettingsElement(parent: HTMLElement): void { @@ -209,8 +213,6 @@ export class SettingsEditor2 extends BaseEditor { private createBody(parent: HTMLElement): void { const bodyContainer = DOM.append(parent, $('.settings-body')); - const navContainer = DOM.append(bodyContainer, $('.settings-nav-container')); - this.createNavControls(navContainer); // this.createNavList(navContainer); this.createList(bodyContainer); } @@ -232,34 +234,22 @@ export class SettingsEditor2 extends BaseEditor { }); configuredOnlyContainer.appendChild(configuredOnlyCheckbox.domNode); - - const allSettingsContainer = DOM.append(navControls, $('.settings-nav-controls-all-settings')); - const allSettingsLabel = DOM.append(allSettingsContainer, $('span.settings-nav-controls-label')); - allSettingsLabel.textContent = 'Show all settings'; - - const allSettingsCheckbox = new Checkbox({ - isChecked: this.showAllSettings, - onChange: e => { - this.showAllSettings = allSettingsCheckbox.checked; - this.render(); - }, - actionClassName: 'settings-nav-checkbox', - title: 'Show all settings' - }); - - allSettingsContainer.appendChild(allSettingsCheckbox.domNode); } private createList(parent: HTMLElement): void { this.settingsListContainer = DOM.append(parent, $('.settings-list-container')); const settingItemRenderer = this.instantiationService.createInstance(SettingItemRenderer); - settingItemRenderer.onDidChangeSetting(e => this.onDidChangeSetting(e.key, e.value)); + this._register(settingItemRenderer.onDidChangeSetting(e => this.onDidChangeSetting(e.key, e.value))); + + const buttonItemRenderer = new ButtonRowRenderer(); + this._register(buttonItemRenderer.onDidClick(e => this.onShowAllSettingsClicked())); + this.settingsList = this._register(this.instantiationService.createInstance( WorkbenchList, this.settingsListContainer, new SettingItemDelegate(), - [settingItemRenderer, new GroupTitleRenderer()], + [settingItemRenderer, new GroupTitleRenderer(), buttonItemRenderer], { identityProvider: e => e.id, ariaLabel: localize('settingsListLabel', "Settings"), @@ -273,6 +263,11 @@ export class SettingsEditor2 extends BaseEditor { this.settingsList.style({ listHoverBackground: Color.transparent, listFocusOutline: Color.transparent }); } + private onShowAllSettingsClicked(): void { + this.showAllSettings = !this.showAllSettings; + this.render(); + } + private onDidChangeSetting(key: string, value: any): void { this.configurationService.updateValue(key, value, this.settingsTargetsWidget.settingsTarget).then( () => this.render(), @@ -293,15 +288,7 @@ export class SettingsEditor2 extends BaseEditor { private onInputChanged(): void { const query = this.searchWidget.getValue().trim(); this.delayedFilterLogging.cancel(); - this.triggerSearch(query) - .then(() => { - // const result = this.preferencesRenderers.lastFilterResult; - // if (result) { - // this.delayedFilterLogging.trigger(() => this.reportFilteringUsed( - // query, - // this.preferencesRenderers.lastFilterResult)); - // } - }); + this.triggerSearch(query); } private triggerSearch(query: string): TPromise { @@ -456,8 +443,7 @@ export class SettingsEditor2 extends BaseEditor { private renderEntries(): void { if (this.defaultSettingsEditorModel) { - const entries: (ISettingItemEntry | IGroupTitleEntry)[] = []; - const navEntries: INavListEntry[] = []; + const entries: IListEntry[] = []; for (let groupIdx = 0; groupIdx < this.defaultSettingsEditorModel.settingsGroups.length; groupIdx++) { if (groupIdx > 0 && !(this.showAllSettings)) { break; @@ -475,13 +461,6 @@ export class SettingsEditor2 extends BaseEditor { } if (groupEntries.length) { - navEntries.push({ - id: group.id, - index: groupIdx, - title: group.title, - templateId: SETTINGS_NAV_TEMPLATE_ID - }); - entries.push({ id: group.id, templateId: SETTINGS_GROUP_ENTRY_TEMPLATE_ID, @@ -490,10 +469,20 @@ export class SettingsEditor2 extends BaseEditor { entries.push(...groupEntries); } + + if (groupIdx === 0) { + const showAllSettingsLabel = this.showAllSettings ? + localize('showFewerSettingsLabel', "Show Fewer Settings") : + localize('showAllSettingsLabel', "Show All Settings"); + entries.push({ + id: ALL_SETTINGS_BUTTON_ID, + label: showAllSettingsLabel, + templateId: BUTTON_ROW_ENTRY_TEMPLATE + }); + } } this.settingsList.splice(0, this.settingsList.length, entries); - // this.navList.splice(0, this.navList.length, navEntries); } } @@ -533,7 +522,7 @@ export class SettingsEditor2 extends BaseEditor { class SettingItemDelegate implements IDelegate { - getHeight(entry: ISettingItemEntry) { + getHeight(entry: IListEntry) { if (entry.templateId === SETTINGS_GROUP_ENTRY_TEMPLATE_ID) { return 60; } @@ -543,6 +532,10 @@ class SettingItemDelegate implements IDelegate { return 105; } + if (entry.templateId === BUTTON_ROW_ENTRY_TEMPLATE) { + return 60; + } + return 0; } @@ -563,16 +556,17 @@ interface ISettingItemTemplate { overridesElement: HTMLElement; } -interface INavItemTemplate { +interface IGroupTitleTemplate { parent: HTMLElement; - labelElement: HTMLElement; } -interface IGroupTitleItemTemplate { +interface IButtonRowTemplate { parent: HTMLElement; + toDispose: IDisposable[]; - labelElement: HTMLElement; + button: Button; + entry?: IButtonRowEntry; } interface ISettingChangeEvent { @@ -582,9 +576,6 @@ interface ISettingChangeEvent { class SettingItemRenderer implements IRenderer { - /** - * TODO@roblou This shouldn't exist. List items should have actions or something - */ private readonly _onDidChangeSetting: Emitter = new Emitter(); public readonly onDidChangeSetting: Event = this._onDidChangeSetting.event; @@ -703,14 +694,11 @@ class SettingItemRenderer implements IRenderer { +class GroupTitleRenderer implements IRenderer { get templateId(): string { return SETTINGS_GROUP_ENTRY_TEMPLATE_ID; } - constructor( - ) { } - - renderTemplate(parent: HTMLElement): INavItemTemplate { + renderTemplate(parent: HTMLElement): IGroupTitleTemplate { DOM.addClass(parent, 'group-title'); const labelElement = DOM.append(parent, $('h2.group-title-label')); @@ -720,11 +708,46 @@ class GroupTitleRenderer implements IRenderer { + + private readonly _onDidClick: Emitter = new Emitter(); + public readonly onDidClick: Event = this._onDidClick.event; + + get templateId(): string { return BUTTON_ROW_ENTRY_TEMPLATE; } + + renderTemplate(parent: HTMLElement): IButtonRowTemplate { + DOM.addClass(parent, 'all-settings'); + + const buttonElement = DOM.append(parent, $('.all-settings-button')); + + const button = new Button(buttonElement); + const toDispose: IDisposable[] = [button]; + + const template: IButtonRowTemplate = { + parent: parent, + toDispose, + + button + }; + toDispose.push(button.onDidClick(e => this._onDidClick.fire(template.entry && template.entry.label))); + + return template; + } + + renderElement(entry: IButtonRowEntry, index: number, template: IButtonRowTemplate): void { + template.button.label = entry.label; + template.entry = entry; + } + + disposeTemplate(template: IButtonRowTemplate): void { dispose(template.toDispose); } } From 6cab13e0639798b3d63840c730ccf20fe9c3ada6 Mon Sep 17 00:00:00 2001 From: Rob Lourens Date: Fri, 20 Apr 2018 17:34:10 -0700 Subject: [PATCH 157/830] #3355 - Style configured setting value inputs --- .../browser/media/settingsEditor2.css | 8 ++++- .../preferences/browser/settingsEditor2.ts | 32 +++++++++++++------ 2 files changed, 29 insertions(+), 11 deletions(-) diff --git a/src/vs/workbench/parts/preferences/browser/media/settingsEditor2.css b/src/vs/workbench/parts/preferences/browser/media/settingsEditor2.css index e4277c2144d..f569a61ca32 100644 --- a/src/vs/workbench/parts/preferences/browser/media/settingsEditor2.css +++ b/src/vs/workbench/parts/preferences/browser/media/settingsEditor2.css @@ -30,7 +30,7 @@ .settings-editor > .settings-header .search-container > .settings-search-input > .monaco-inputbox .input { font-size: 14px; - padding-left:10px; + padding-left: 10px; } .settings-editor > .settings-header > .settings-header-controls-container { @@ -143,6 +143,7 @@ .settings-editor > .settings-body > .settings-list-container .monaco-list-row .monaco-select-box { width: 100%; font: inherit; + height: 26px; } .settings-editor .settings-nav-controls .monaco-custom-checkbox.unchecked, @@ -187,3 +188,8 @@ .settings-editor > .settings-body > .settings-list-container .monaco-list-row.all-settings .all-settings-button { margin: auto; } + +.settings-editor > .settings-body > .settings-list-container .monaco-list-row.all-settings .all-settings-button .monaco-button { + padding-left: 10px; + padding-right: 10px; +} \ No newline at end of file diff --git a/src/vs/workbench/parts/preferences/browser/settingsEditor2.ts b/src/vs/workbench/parts/preferences/browser/settingsEditor2.ts index 1e2a70e3a82..0a017382629 100644 --- a/src/vs/workbench/parts/preferences/browser/settingsEditor2.ts +++ b/src/vs/workbench/parts/preferences/browser/settingsEditor2.ts @@ -15,7 +15,7 @@ import { Delayer, ThrottledDelayer } from 'vs/base/common/async'; import { Color } from 'vs/base/common/color'; import { Emitter, Event } from 'vs/base/common/event'; import { KeyCode } from 'vs/base/common/keyCodes'; -import { IDisposable, dispose, Disposable } from 'vs/base/common/lifecycle'; +import { IDisposable, dispose } from 'vs/base/common/lifecycle'; import { TPromise } from 'vs/base/common/winjs.base'; import 'vs/css!./media/settingsEditor2'; import { localize } from 'vs/nls'; @@ -38,6 +38,7 @@ import { IPreferencesSearchService, ISearchProvider } from '../common/preference import { IProgressService } from 'vs/platform/progress/common/progress'; import { isPromiseCanceledError, getErrorMessage } from 'vs/base/common/errors'; import { ILogService } from 'vs/platform/log/common/log'; +import { registerColor } from 'vs/platform/theme/common/colorRegistry'; const SETTINGS_ENTRY_TEMPLATE_ID = 'settings.entry.template'; const SETTINGS_GROUP_ENTRY_TEMPLATE_ID = 'settings.group.template'; @@ -73,7 +74,20 @@ enum SearchResultIdx { Remote = 1 } -let $ = DOM.$; +const $ = DOM.$; + + +export const configuredItemBackground = registerColor('settings.configuredItemBackground', { + dark: '#0d466c', + light: '#0d466c', + hc: '#000000' +}, localize('configuredItemBackground', "The background color for a configured setting.")); + +export const configuredItemForeground = registerColor('settings.configuredItemForeground', { + dark: '#dddddd', + light: '#dddddd', + hc: '#dddddd' +}, localize('configuredItemForeground', "The foreground color for a configured setting.")); export class SettingsEditor2 extends BaseEditor { @@ -671,7 +685,10 @@ class SettingItemRenderer implements IRenderer void): void { const inputBox = new InputBox(template.valueElement, this.contextViewService); template.toDispose.push(attachInputBoxStyler(inputBox, this.themeService, { + inputBackground: entry.isConfigured ? configuredItemBackground : undefined, + inputForeground: entry.isConfigured ? configuredItemForeground : undefined })); template.toDispose.push(inputBox); inputBox.value = entry.value; @@ -764,10 +783,3 @@ function settingKeyToLabel(key: string): string { .replace(/^[a-z]/g, match => match.toUpperCase()) // foo => Foo .replace(/ [a-z]/g, match => match.toUpperCase()); // Foo bar => Foo Bar } - -// registerThemingParticipant((theme: ITheme, collector: ICssStyleCollector) => { -// const listHighlightForegroundColor = theme.getColor(listHighlightForeground); -// if (listHighlightForegroundColor) { -// collector.addRule(`.keybindings-editor > .keybindings-body > .keybindings-list-container .monaco-list-row > .column .highlight { color: ${listHighlightForegroundColor}; }`); -// } -// }); From 55a47818e4e41597ad772cf8fa72a47bbfecfb1c Mon Sep 17 00:00:00 2001 From: Rob Lourens Date: Fri, 20 Apr 2018 18:47:32 -0700 Subject: [PATCH 158/830] #3355 - move "open config file" and "show overrides" --- .../browser/media/settingsEditor2.css | 39 +++++------ .../preferences/browser/settingsEditor2.ts | 66 +++++++------------ 2 files changed, 38 insertions(+), 67 deletions(-) diff --git a/src/vs/workbench/parts/preferences/browser/media/settingsEditor2.css b/src/vs/workbench/parts/preferences/browser/media/settingsEditor2.css index f569a61ca32..80e2eae62a0 100644 --- a/src/vs/workbench/parts/preferences/browser/media/settingsEditor2.css +++ b/src/vs/workbench/parts/preferences/browser/media/settingsEditor2.css @@ -33,7 +33,7 @@ padding-left: 10px; } -.settings-editor > .settings-header > .settings-header-controls-container { +.settings-editor > .settings-header > .settings-header-controls { margin-top: 7px; display: flex; } @@ -46,30 +46,22 @@ margin-left: 33px; } -.settings-editor > .settings-header .open-settings-container { - /* compensate for 3px padding inside target widget, should be cleaned up */ - padding-top: 3px; +.settings-editor > .settings-header > .settings-header-controls .settings-header-controls-right { display: flex; +} + +.settings-editor > .settings-header > .settings-header-controls .settings-header-controls-right .open-settings-button, +.settings-editor > .settings-header > .settings-header-controls .settings-header-controls-right .open-settings-button:hover, +.settings-editor > .settings-header > .settings-header-controls .settings-header-controls-right .open-settings-button:active { + background: none; opacity: 0.7; -} - -.settings-editor > .settings-header .open-settings-container > .file-name { text-decoration: underline; - cursor: pointer; - margin-left: 4px; } -.settings-editor > .settings-header .settings-nav-controls { - display: flex; -} - -.settings-editor > .settings-header .settings-nav-controls .monaco-custom-checkbox { - margin-right: 5px; -} - -.settings-editor > .settings-header .settings-nav-container { - margin-top: 18px; - margin-left: 560px; +.settings-editor > .settings-header > .settings-header-controls .settings-header-controls-right .configured-only-button { + white-space: nowrap; + padding: 4px 10px; + margin-right: 10px; } .settings-editor > .settings-body .settings-list-container .settings-list-offset-helper { @@ -111,7 +103,7 @@ .settings-editor > .settings-body > .settings-list-container .monaco-list-row > .setting-item-container > .setting-item-right { flex: 1; - margin: 35px 10px; + margin: 21px 10px; } .settings-editor > .settings-body > .settings-list-container .monaco-list-row .setting-item-title { @@ -134,6 +126,8 @@ .settings-editor > .settings-body > .settings-list-container .monaco-list-row .setting-item-description { opacity: 0.6; margin-top: 5px; + height: 36px; + overflow: hidden; } .settings-editor > .settings-body > .settings-list-container .monaco-list-row .setting-item-value { @@ -146,14 +140,12 @@ height: 26px; } -.settings-editor .settings-nav-controls .monaco-custom-checkbox.unchecked, .settings-editor > .settings-body > .settings-list-container .monaco-list-row .monaco-custom-checkbox.unchecked { background: url("action-remove.svg") center center no-repeat; /* Unchecked border style needs to be stylable on checkbox. Themeable? */ border-color: #75715e !important; } -.settings-editor .settings-nav-controls .monaco-custom-checkbox.checked, .settings-editor > .settings-body > .settings-list-container .monaco-list-row .monaco-custom-checkbox.checked { background: url("action-remove-focus.svg") center center no-repeat; } @@ -167,6 +159,7 @@ background: url("action-remove-dark.svg") center center no-repeat; width: 16px; height: 16px; + margin: auto; margin-left: 3px; visibility: hidden; } diff --git a/src/vs/workbench/parts/preferences/browser/settingsEditor2.ts b/src/vs/workbench/parts/preferences/browser/settingsEditor2.ts index 0a017382629..da0f634da14 100644 --- a/src/vs/workbench/parts/preferences/browser/settingsEditor2.ts +++ b/src/vs/workbench/parts/preferences/browser/settingsEditor2.ts @@ -4,7 +4,6 @@ *--------------------------------------------------------------------------------------------*/ import * as DOM from 'vs/base/browser/dom'; -import { StandardKeyboardEvent } from 'vs/base/browser/keyboardEvent'; import { Checkbox } from 'vs/base/browser/ui/checkbox/checkbox'; import { InputBox } from 'vs/base/browser/ui/inputbox/inputBox'; import { IDelegate, IRenderer } from 'vs/base/browser/ui/list/list'; @@ -14,7 +13,6 @@ import { IAction } from 'vs/base/common/actions'; import { Delayer, ThrottledDelayer } from 'vs/base/common/async'; import { Color } from 'vs/base/common/color'; import { Emitter, Event } from 'vs/base/common/event'; -import { KeyCode } from 'vs/base/common/keyCodes'; import { IDisposable, dispose } from 'vs/base/common/lifecycle'; import { TPromise } from 'vs/base/common/winjs.base'; import 'vs/css!./media/settingsEditor2'; @@ -101,6 +99,7 @@ export class SettingsEditor2 extends BaseEditor { private showConfiguredSettingsOnly = false; private showAllSettings = false; + private showConfiguredSettingsOnlyButton: Button; private settingsListContainer: HTMLElement; private settingsList: List; @@ -193,63 +192,37 @@ export class SettingsEditor2 extends BaseEditor { })); this._register(this.searchWidget.onDidChange(() => this.onInputChanged())); - const headerControlsContainer = DOM.append(this.headerContainer, $('div.settings-header-controls-container')); + const headerControlsContainer = DOM.append(this.headerContainer, $('div.settings-header-controls')); const targetWidgetContainer = DOM.append(headerControlsContainer, $('.settings-target-container')); this.settingsTargetsWidget = this._register(this.instantiationService.createInstance(SettingsTargetsWidget, targetWidgetContainer)); this.settingsTargetsWidget.settingsTarget = ConfigurationTarget.USER; this.settingsTargetsWidget.onDidTargetChange(e => this.renderEntries()); - this.createOpenSettingsElement(headerControlsContainer); - - const navContainer = DOM.append(this.headerContainer, $('.settings-nav-container')); - this.createNavControls(navContainer); + this.createHeaderControls(headerControlsContainer); } - private createOpenSettingsElement(parent: HTMLElement): void { - const openSettingsContainer = DOM.append(parent, $('.open-settings-container')); - DOM.append(openSettingsContainer, $('', null, localize('header-message', "For advanced customizations open and edit"))); - const fileElement = DOM.append(openSettingsContainer, $('.file-name', null, localize('settings-file-name', "settings.json"))); - fileElement.tabIndex = 0; + private createHeaderControls(parent: HTMLElement): void { + const headerControlsContainerRight = DOM.append(parent, $('.settings-header-controls-right')); - this._register(DOM.addDisposableListener(fileElement, DOM.EventType.CLICK, () => this.preferencesService.openGlobalSettings())); - this._register(DOM.addDisposableListener(fileElement, DOM.EventType.KEY_UP, e => { - let keyboardEvent = new StandardKeyboardEvent(e); - switch (keyboardEvent.keyCode) { - case KeyCode.Enter: - this.preferencesService.openGlobalSettings(); - keyboardEvent.preventDefault(); - keyboardEvent.stopPropagation(); - return; - } - })); + this.showConfiguredSettingsOnlyButton = this._register(new Button(headerControlsContainerRight, { title: true })); + this.showConfiguredSettingsOnlyButton.label = localize('showOverrides', "Show overrides"); + this.showConfiguredSettingsOnlyButton.element.classList.add('configured-only-button'); + + this._register(this.showConfiguredSettingsOnlyButton.onDidClick(() => this.onShowConfiguredOnlyClicked())); + + const openSettingsButton = this._register(new Button(headerControlsContainerRight, { title: true, buttonBackground: null })); + openSettingsButton.label = localize('openSettingsLabel', "Open config file"); + openSettingsButton.element.classList.add('open-settings-button'); + + this._register(openSettingsButton.onDidClick(() => this.preferencesService.openGlobalSettings())); } private createBody(parent: HTMLElement): void { const bodyContainer = DOM.append(parent, $('.settings-body')); - // this.createNavList(navContainer); this.createList(bodyContainer); } - private createNavControls(parent: HTMLElement): void { - const navControls = DOM.append(parent, $('.settings-nav-controls')); - const configuredOnlyContainer = DOM.append(navControls, $('.settings-nav-controls-configured-only')); - const label = DOM.append(configuredOnlyContainer, $('span.settings-nav-controls-label.settings-nav-controls-configured-only')); - label.textContent = 'Show configured settings only'; - - const configuredOnlyCheckbox = new Checkbox({ - isChecked: this.showConfiguredSettingsOnly, - onChange: e => { - this.showConfiguredSettingsOnly = configuredOnlyCheckbox.checked; - this.render(); - }, - actionClassName: 'settings-nav-checkbox', - title: 'Show configured settings only' - }); - - configuredOnlyContainer.appendChild(configuredOnlyCheckbox.domNode); - } - private createList(parent: HTMLElement): void { this.settingsListContainer = DOM.append(parent, $('.settings-list-container')); @@ -282,6 +255,11 @@ export class SettingsEditor2 extends BaseEditor { this.render(); } + private onShowConfiguredOnlyClicked(): void { + this.showConfiguredSettingsOnly = !this.showConfiguredSettingsOnly; + this.render(); + } + private onDidChangeSetting(key: string, value: any): void { this.configurationService.updateValue(key, value, this.settingsTargetsWidget.settingsTarget).then( () => this.render(), @@ -543,7 +521,7 @@ class SettingItemDelegate implements IDelegate { if (entry.templateId === SETTINGS_ENTRY_TEMPLATE_ID) { // TODO dynamic height - return 105; + return 75; } if (entry.templateId === BUTTON_ROW_ENTRY_TEMPLATE) { From d653e9caf129b70dd0b1b6e88ee72e5b0cc91e0b Mon Sep 17 00:00:00 2001 From: Rob Lourens Date: Fri, 20 Apr 2018 19:01:12 -0700 Subject: [PATCH 159/830] #3355 - Move "also configured in..." to next to title --- .../browser/media/settingsEditor2.css | 13 +++++----- .../preferences/browser/settingsEditor2.ts | 24 ++++++++++--------- 2 files changed, 19 insertions(+), 18 deletions(-) diff --git a/src/vs/workbench/parts/preferences/browser/media/settingsEditor2.css b/src/vs/workbench/parts/preferences/browser/media/settingsEditor2.css index 80e2eae62a0..6b334ce3689 100644 --- a/src/vs/workbench/parts/preferences/browser/media/settingsEditor2.css +++ b/src/vs/workbench/parts/preferences/browser/media/settingsEditor2.css @@ -110,6 +110,11 @@ line-height: initial; } +.settings-editor > .settings-body > .settings-list-container .monaco-list-row .setting-item-title .setting-item-overrides { + opacity: 0.5; + margin-left: 10px; +} + .settings-editor > .settings-body > .settings-list-container .monaco-list-row .setting-item-label { font-size: 15px; font-weight: bold; @@ -124,7 +129,7 @@ } .settings-editor > .settings-body > .settings-list-container .monaco-list-row .setting-item-description { - opacity: 0.6; + opacity: 0.7; margin-top: 5px; height: 36px; overflow: hidden; @@ -168,12 +173,6 @@ visibility: visible; } -.settings-editor > .settings-body > .settings-list-container .monaco-list-row .setting-item-overrides { - opacity: 0.6; - margin-top: 5px; - text-align: center; -} - .settings-editor > .settings-body > .settings-list-container .monaco-list-row.all-settings { display: flex; } diff --git a/src/vs/workbench/parts/preferences/browser/settingsEditor2.ts b/src/vs/workbench/parts/preferences/browser/settingsEditor2.ts index da0f634da14..444904fc12c 100644 --- a/src/vs/workbench/parts/preferences/browser/settingsEditor2.ts +++ b/src/vs/workbench/parts/preferences/browser/settingsEditor2.ts @@ -192,7 +192,7 @@ export class SettingsEditor2 extends BaseEditor { })); this._register(this.searchWidget.onDidChange(() => this.onInputChanged())); - const headerControlsContainer = DOM.append(this.headerContainer, $('div.settings-header-controls')); + const headerControlsContainer = DOM.append(this.headerContainer, $('.settings-header-controls')); const targetWidgetContainer = DOM.append(headerControlsContainer, $('.settings-target-container')); this.settingsTargetsWidget = this._register(this.instantiationService.createInstance(SettingsTargetsWidget, targetWidgetContainer)); this.settingsTargetsWidget.settingsTarget = ConfigurationTarget.USER; @@ -542,7 +542,7 @@ interface ISettingItemTemplate { containerElement: HTMLElement; labelElement: HTMLElement; - keyElement: HTMLElement; + // keyElement: HTMLElement; descriptionElement: HTMLElement; valueElement: HTMLElement; overridesElement: HTMLElement; @@ -581,24 +581,24 @@ class SettingItemRenderer implements IRenderer Date: Thu, 26 Apr 2018 23:11:39 -0700 Subject: [PATCH 160/830] [css] update service to pull out #48601 --- extensions/css-language-features/server/package.json | 2 +- extensions/css-language-features/server/yarn.lock | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/extensions/css-language-features/server/package.json b/extensions/css-language-features/server/package.json index a3169e7f339..2eb8e49941a 100644 --- a/extensions/css-language-features/server/package.json +++ b/extensions/css-language-features/server/package.json @@ -8,7 +8,7 @@ "node": "*" }, "dependencies": { - "vscode-css-languageservice": "^3.0.9-next.13", + "vscode-css-languageservice": "^3.0.9-next.14", "vscode-languageserver": "^4.0.0", "vscode-languageserver-protocol-foldingprovider": "^2.0.0-next.2" }, diff --git a/extensions/css-language-features/server/yarn.lock b/extensions/css-language-features/server/yarn.lock index 8fab5223e9f..9ab19c4c0ac 100644 --- a/extensions/css-language-features/server/yarn.lock +++ b/extensions/css-language-features/server/yarn.lock @@ -10,9 +10,9 @@ version "7.0.43" resolved "https://registry.yarnpkg.com/@types/node/-/node-7.0.43.tgz#a187e08495a075f200ca946079c914e1a5fe962c" -vscode-css-languageservice@^3.0.9-next.13: - version "3.0.9-next.13" - resolved "https://registry.yarnpkg.com/vscode-css-languageservice/-/vscode-css-languageservice-3.0.9-next.13.tgz#84dfe85211081659c0f0f44b153e4a0ecd54f53c" +vscode-css-languageservice@^3.0.9-next.14: + version "3.0.9-next.14" + resolved "https://registry.yarnpkg.com/vscode-css-languageservice/-/vscode-css-languageservice-3.0.9-next.14.tgz#156822b2d8c56487ffd47105cc884fa3983664ca" dependencies: vscode-languageserver-types "^3.6.1" vscode-nls "^3.2.1" From 89cc36ed79aca226b66a3eb7ce4efdd732d01379 Mon Sep 17 00:00:00 2001 From: Sandeep Somavarapu Date: Fri, 27 Apr 2018 09:29:10 +0200 Subject: [PATCH 161/830] FIx #48794 --- src/vs/workbench/browser/parts/views/panelViewlet.ts | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/src/vs/workbench/browser/parts/views/panelViewlet.ts b/src/vs/workbench/browser/parts/views/panelViewlet.ts index 44d08bb945f..1feb682d145 100644 --- a/src/vs/workbench/browser/parts/views/panelViewlet.ts +++ b/src/vs/workbench/browser/parts/views/panelViewlet.ts @@ -88,7 +88,7 @@ export abstract class ViewletPanel extends Panel { }); this.disposables.push(this.toolbar); - this.updateActions(); + this.setActions(); const onDidRelevantConfigurationChange = filterEvent(this.configurationService.onDidChangeConfiguration, e => e.affectsConfiguration(ViewletPanel.AlwaysShowActionsConfig)); onDidRelevantConfigurationChange(this.updateActionsVisibility, this, this.disposables); @@ -103,17 +103,21 @@ export abstract class ViewletPanel extends Panel { this._onDidFocus.fire(); } - protected updateActions(): void { + private setActions(): void { this.toolbar.setActions(prepareActions(this.getActions()), prepareActions(this.getSecondaryActions()))(); this.toolbar.context = this.getActionsContext(); - this._onDidChangeTitleArea.fire(); } - protected updateActionsVisibility(): void { + private updateActionsVisibility(): void { const shouldAlwaysShowActions = this.configurationService.getValue('workbench.view.alwaysShowHeaderActions'); toggleClass(this.headerContainer, 'actions-always-visible', shouldAlwaysShowActions); } + protected updateActions(): void { + this.setActions(); + this._onDidChangeTitleArea.fire(); + } + getActions(): IAction[] { return []; } From 4023504404595fb9ccda05d68dfc4f180b99a9cf Mon Sep 17 00:00:00 2001 From: Sandeep Somavarapu Date: Fri, 27 Apr 2018 10:23:22 +0200 Subject: [PATCH 162/830] Fix #48788 --- src/vs/workbench/api/browser/viewsContainersExtensionPoint.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/vs/workbench/api/browser/viewsContainersExtensionPoint.ts b/src/vs/workbench/api/browser/viewsContainersExtensionPoint.ts index 5fd69ca019e..6b91f2d6634 100644 --- a/src/vs/workbench/api/browser/viewsContainersExtensionPoint.ts +++ b/src/vs/workbench/api/browser/viewsContainersExtensionPoint.ts @@ -114,11 +114,11 @@ class ViewsContainersExtensionHandler implements IWorkbenchContribution { for (let descriptor of viewsContainersDescriptors) { if (typeof descriptor.id !== 'string') { - collector.error(localize('requireidstring', "property `{0}` is mandatory and must be of type `string`. Allowed only alphanumeric letters, '_', '-'.", 'id')); + collector.error(localize('requireidstring', "property `{0}` is mandatory and must be of type `string`. Only alphanumeric characters, '_', and '-' are allowed.", 'id')); return false; } if (!(/^[a-z0-9_-]+$/i.test(descriptor.id))) { - collector.error(localize('requireidstring', "property `{0}` is mandatory and must be of type `string`. Allowed only alphanumeric letters, '_', '-'.", 'id')); + collector.error(localize('requireidstring', "property `{0}` is mandatory and must be of type `string`. Only alphanumeric characters, '_', and '-' are allowed.", 'id')); return false; } if (typeof descriptor.title !== 'string') { From e679bfee4360cb1bc152e6e0ea7583d8d042e07e Mon Sep 17 00:00:00 2001 From: isidor Date: Fri, 27 Apr 2018 10:28:56 +0200 Subject: [PATCH 163/830] fix tests on win --- src/vs/workbench/parts/files/common/explorerModel.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/vs/workbench/parts/files/common/explorerModel.ts b/src/vs/workbench/parts/files/common/explorerModel.ts index 15eb534b531..bc440771cac 100644 --- a/src/vs/workbench/parts/files/common/explorerModel.ts +++ b/src/vs/workbench/parts/files/common/explorerModel.ts @@ -338,7 +338,7 @@ export class ExplorerItem { if (resource && this.resource.scheme === resource.scheme && this.resource.authority === resource.authority && (isLinux ? startsWith(resource.path, this.resource.path) : startsWithIgnoreCase(resource.path, this.resource.path)) ) { - return this.findByPath(rtrim(resource.path, paths.nativeSep), this.resource.path.length); + return this.findByPath(rtrim(resource.path, paths.sep), this.resource.path.length); } return null; //Unable to find From 75e88b676f868eebb4e3516347f8b0c540451216 Mon Sep 17 00:00:00 2001 From: Johannes Rieken Date: Fri, 27 Apr 2018 10:52:06 +0200 Subject: [PATCH 164/830] print more information when flacky test fails --- .../src/singlefolder-tests/window.test.ts | 20 +++++++++++-------- 1 file changed, 12 insertions(+), 8 deletions(-) diff --git a/extensions/vscode-api-tests/src/singlefolder-tests/window.test.ts b/extensions/vscode-api-tests/src/singlefolder-tests/window.test.ts index 286936c8659..80396b5f456 100644 --- a/extensions/vscode-api-tests/src/singlefolder-tests/window.test.ts +++ b/extensions/vscode-api-tests/src/singlefolder-tests/window.test.ts @@ -133,7 +133,11 @@ suite('window namespace tests', () => { assert.ok(window.activeTextEditor!.document === docB); assert.equal(window.activeTextEditor!.viewColumn, ViewColumn.Two); - await window.showTextDocument(docC); + const editor = await window.showTextDocument(docC); + assert.ok( + window.activeTextEditor === editor, + `wanted fileName:${editor.document.fileName}/viewColumn:${editor.viewColumn} but got fileName:${window.activeTextEditor!.document.fileName}/viewColumn:${window.activeTextEditor!.viewColumn}. a:${docA.fileName}, b:${docB.fileName}, c:${docC.fileName}` + ); assert.ok(window.activeTextEditor!.document === docC); assert.equal(window.activeTextEditor!.viewColumn, ViewColumn.One); }); @@ -377,13 +381,13 @@ suite('window namespace tests', () => { accept.then(() => assert.ok(false), err => assert.ok(err)) .then(() => new Promise(resolve => setTimeout(resolve, 10))) ]) - .then(() => { - const close = commands.executeCommand('workbench.action.closeQuickOpen'); - return Promise.all([result, close]) - .then(([value]) => { - assert.equal(value, undefined); - }); - }); + .then(() => { + const close = commands.executeCommand('workbench.action.closeQuickOpen'); + return Promise.all([result, close]) + .then(([value]) => { + assert.equal(value, undefined); + }); + }); }); From 2018ae3a6db94d3156ed8e055c35a1db1abc4288 Mon Sep 17 00:00:00 2001 From: Johannes Rieken Date: Fri, 27 Apr 2018 11:12:34 +0200 Subject: [PATCH 165/830] remote - fix jsdoc --- src/vs/vscode.d.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/vs/vscode.d.ts b/src/vs/vscode.d.ts index 668c13ef6cc..5ac3654f76d 100644 --- a/src/vs/vscode.d.ts +++ b/src/vs/vscode.d.ts @@ -5013,10 +5013,10 @@ declare module 'vscode' { * * @param uri The uri of the file. * @param content The new content of the file. - * @param options Defines is missing files should or must be created. + * @param options Defines if missing files should or must be created. * @throws [`FileNotFound`](#FileSystemError.FileNotFound) when `uri` doesn't exist and `create` is not set. * @throws [`FileNotFound`](#FileSystemError.FileNotFound) when the parent of `uri` doesn't exist and `create` is set. - * @throws [`FileExists`](#FileSystemError.FileExists) when `uri` already exists and `overwrite` is set. + * @throws [`FileExists`](#FileSystemError.FileExists) when `uri` already exists, `create` is set but `overwrite` is not set. * @throws [`NoPermissions`](#FileSystemError.NoPermissions) when permissions aren't sufficient. */ writeFile(uri: Uri, content: Uint8Array, options: { create: boolean, overwrite: boolean }): void | Thenable; From a87b3967302941d21c2848b5d5d95747a2597d67 Mon Sep 17 00:00:00 2001 From: Erich Gamma Date: Fri, 27 Apr 2018 11:26:51 +0200 Subject: [PATCH 166/830] FIxing #48806 npm.enableScriptExplorer requires reloading the window --- extensions/npm/README.md | 2 +- extensions/npm/package.json | 5 ++--- extensions/npm/package.nls.json | 2 +- extensions/npm/src/main.ts | 19 +++++++++++++------ 4 files changed, 17 insertions(+), 11 deletions(-) diff --git a/extensions/npm/README.md b/extensions/npm/README.md index 33d85a1f547..1946e16a958 100644 --- a/extensions/npm/README.md +++ b/extensions/npm/README.md @@ -14,4 +14,4 @@ For more information about auto detection of Tasks pls see the [documentation](h - `npm.runSilent` run npm script with the `--silent` option, the default is `false`. - `npm.packageManager` the package manager used to run the scripts: `npm` or `yarn`, the default is `npm`. - `npm.exclude` glob patterns for folders that should be excluded from automatic script detection. The pattern is matched against the **absolute path** of the package.json. For example, to exclude all test folders use '**/test/**'. -- `npm.enableScriptExplorer` enable an explorer view for npm scripts when the workspace contains a 'package.json' file. +- `npm.enableScriptExplorer` enable an explorer view for npm scripts. diff --git a/extensions/npm/package.json b/extensions/npm/package.json index 5affb9009f4..7df53cb226a 100644 --- a/extensions/npm/package.json +++ b/extensions/npm/package.json @@ -30,8 +30,7 @@ "activationEvents": [ "onCommand:workbench.action.tasks.runTask", "onLanguage:json", - "onView:npm", - "workspaceContains:**/package.json" + "onView:npm" ], "contributes": { "views": { @@ -39,7 +38,7 @@ { "id": "npm", "name": "%view.name%", - "when": "hasNpmScripts" + "when": "showExplorer" } ] }, diff --git a/extensions/npm/package.nls.json b/extensions/npm/package.nls.json index 9caaff63fc3..a3b43f64c0b 100644 --- a/extensions/npm/package.nls.json +++ b/extensions/npm/package.nls.json @@ -5,7 +5,7 @@ "config.npm.runSilent": "Run npm commands with the `--silent` option.", "config.npm.packageManager": "The package manager used to run scripts.", "config.npm.exclude": "Configure glob patterns for folders that should be excluded from automatic script detection.", - "config.npm.enableScriptExplorer": "Enable an explorer view for npm scripts, when the workspace contains a 'package.json' file.", + "config.npm.enableScriptExplorer": "Enable an explorer view for npm scripts.", "npm.parseError": "Npm task detection: failed to parse the file {0}", "taskdef.script": "The npm script to customize.", "taskdef.path": "The path to the folder of the package.json file that provides the script. Can be ommitted.", diff --git a/extensions/npm/src/main.ts b/extensions/npm/src/main.ts index d3ebc055c7d..ef0c87d7467 100644 --- a/extensions/npm/src/main.ts +++ b/extensions/npm/src/main.ts @@ -9,7 +9,7 @@ import * as vscode from 'vscode'; import { addJSONProviders } from './features/jsonContributions'; import { NpmScriptsTreeDataProvider } from './npmView'; -import { provideNpmScripts, hasNpmScripts, explorerIsEnabled } from './tasks'; +import { provideNpmScripts, explorerIsEnabled } from './tasks'; let taskProvider: vscode.Disposable | undefined; @@ -17,7 +17,12 @@ export async function activate(context: vscode.ExtensionContext): Promise taskProvider = registerTaskProvider(); registerExplorer(context); configureHttpRequest(); - vscode.workspace.onDidChangeConfiguration(() => configureHttpRequest()); + vscode.workspace.onDidChangeConfiguration((e) => { + configureHttpRequest(); + if (e.affectsConfiguration('npm.enableScriptExplorer')) { + updateExplorerVisibility(); + } + }); context.subscriptions.push(addJSONProviders(httpRequest.xhr)); } @@ -36,14 +41,16 @@ function registerTaskProvider(): vscode.Disposable | undefined { return undefined; } +function updateExplorerVisibility() { + vscode.commands.executeCommand('setContext', 'showExplorer', explorerIsEnabled()); +} + async function registerExplorer(context: vscode.ExtensionContext) { - if (explorerIsEnabled() && vscode.workspace.workspaceFolders) { + if (vscode.workspace.workspaceFolders) { let treeDataProvider = vscode.window.registerTreeDataProvider('npm', new NpmScriptsTreeDataProvider(context)); context.subscriptions.push(treeDataProvider); - if (await hasNpmScripts()) { - vscode.commands.executeCommand('setContext', 'hasNpmScripts', true); - } } + updateExplorerVisibility(); } function configureHttpRequest() { From d7164a1c9cbecf9b3fbb6986105e9b51eaf39f25 Mon Sep 17 00:00:00 2001 From: Johannes Rieken Date: Fri, 27 Apr 2018 11:28:37 +0200 Subject: [PATCH 167/830] remote - more jsdoc polish --- src/vs/vscode.d.ts | 32 +++++++++++++++++++------------- 1 file changed, 19 insertions(+), 13 deletions(-) diff --git a/src/vs/vscode.d.ts b/src/vs/vscode.d.ts index 5ac3654f76d..fb1a8f215b7 100644 --- a/src/vs/vscode.d.ts +++ b/src/vs/vscode.d.ts @@ -4952,7 +4952,8 @@ declare module 'vscode' { * paths, e.g. `foo:/my/path` is a child of `foo:/my/` and a parent of `foo:/my/path/deeper`. * * *Note 2:* There is an activation event `onFileSystem:` that fires when a file * or folder is being accessed. - * + * * *Note 3:* The word 'file' is often used to denote all [kinds](#FileType) of files, e.g. + * folders, symbolic links, and regular files. */ export interface FileSystemProvider { @@ -4965,23 +4966,28 @@ declare module 'vscode' { /** * 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 this `uri`. + * @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. * - * @param uri The uri of the file to retrieve meta data about. + * @param uri The uri of the file to retrieve metadata about. * @return The file metadata about the file. * @throws [`FileNotFound`](#FileSystemError.FileNotFound) when `uri` doesn't exist. */ stat(uri: Uri): FileStat | Thenable; /** - * Retrieve the meta data of all entries of a [directory](#FileType.Directory) + * Retrieve all entries of a [directory](#FileType.Directory). * * @param uri The uri of the folder. * @return An array of name/type-tuples or a thenable that resolves to such. @@ -4990,10 +4996,10 @@ declare module 'vscode' { readDirectory(uri: Uri): [string, FileType][] | Thenable<[string, FileType][]>; /** - * Create a new directory. *Note* that new files are created via `write`-calls. + * Create a new directory (Note, that new files are created via `write`-calls). * * @param uri The uri of the new folder. - * @throws [`FileNotFound`](#FileSystemError.FileNotFound) when the parent of `uri` doesn't exist. + * @throws [`FileNotFound`](#FileSystemError.FileNotFound) when the parent of `uri` doesn't exist, e.g. no mkdirp-logic required. * @throws [`FileExists`](#FileSystemError.FileExists) when `uri` already exists. * @throws [`NoPermissions`](#FileSystemError.NoPermissions) when permissions aren't sufficient. */ @@ -5015,7 +5021,7 @@ declare module 'vscode' { * @param content The new content of the file. * @param options Defines if missing files should or must be created. * @throws [`FileNotFound`](#FileSystemError.FileNotFound) when `uri` doesn't exist and `create` is not set. - * @throws [`FileNotFound`](#FileSystemError.FileNotFound) when the parent of `uri` doesn't exist and `create` is set. + * @throws [`FileNotFound`](#FileSystemError.FileNotFound) when the parent of `uri` doesn't exist and `create` is set, e.g. no mkdirp-logic required. * @throws [`FileExists`](#FileSystemError.FileExists) when `uri` already exists, `create` is set but `overwrite` is not set. * @throws [`NoPermissions`](#FileSystemError.NoPermissions) when permissions aren't sufficient. */ @@ -5034,11 +5040,11 @@ declare module 'vscode' { /** * Rename a file or folder. * - * @param oldUri The existing file or folder. - * @param newUri The target location. + * @param oldUri The existing file. + * @param newUri The new location. * @param options Defines if existing files should be overwriten. * @throws [`FileNotFound`](#FileSystemError.FileNotFound) when `oldUri` doesn't exist. - * @throws [`FileNotFound`](#FileSystemError.FileNotFound) when parent of `newUri` doesn't exist + * @throws [`FileNotFound`](#FileSystemError.FileNotFound) when parent of `newUri` doesn't exist, e.g. no mkdirp-logic required. * @throws [`FileExists`](#FileSystemError.FileExists) when `newUri` exists and when the `overwrite` option is not `true`. * @throws [`NoPermissions`](#FileSystemError.NoPermissions) when permissions aren't sufficient. */ @@ -5048,11 +5054,11 @@ declare module 'vscode' { * Copy files or folders. Implementing this function is optional but it will speedup * the copy operation. * - * @param source The existing file or folder. + * @param source The existing file. * @param destination The destination location. * @param options Defines if existing files should be overwriten. - * @throws [`FileNotFound`](#FileSystemError.FileNotFound) when `source` doesn't exist - * @throws [`FileNotFound`](#FileSystemError.FileNotFound) when parent of `destination` doesn't exist + * @throws [`FileNotFound`](#FileSystemError.FileNotFound) when `source` doesn't exist. + * @throws [`FileNotFound`](#FileSystemError.FileNotFound) when parent of `destination` doesn't exist, e.g. no mkdirp-logic required. * @throws [`FileExists`](#FileSystemError.FileExists) when `destination` exists and when the `overwrite` option is not `true`. * @throws [`NoPermissions`](#FileSystemError.NoPermissions) when permissions aren't sufficient. */ From c0e52d19ad338ad7dcc3888cd871031024c83604 Mon Sep 17 00:00:00 2001 From: Erich Gamma Date: Fri, 27 Apr 2018 11:35:19 +0200 Subject: [PATCH 168/830] amend to fix for #48806 --- extensions/npm/package.json | 3 ++- extensions/npm/src/main.ts | 2 +- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/extensions/npm/package.json b/extensions/npm/package.json index 7df53cb226a..5776ad8f3a6 100644 --- a/extensions/npm/package.json +++ b/extensions/npm/package.json @@ -30,7 +30,8 @@ "activationEvents": [ "onCommand:workbench.action.tasks.runTask", "onLanguage:json", - "onView:npm" + "onView:npm", + "workspaceContains:**/package.json" ], "contributes": { "views": { diff --git a/extensions/npm/src/main.ts b/extensions/npm/src/main.ts index ef0c87d7467..0349a21bac1 100644 --- a/extensions/npm/src/main.ts +++ b/extensions/npm/src/main.ts @@ -49,8 +49,8 @@ async function registerExplorer(context: vscode.ExtensionContext) { if (vscode.workspace.workspaceFolders) { let treeDataProvider = vscode.window.registerTreeDataProvider('npm', new NpmScriptsTreeDataProvider(context)); context.subscriptions.push(treeDataProvider); + updateExplorerVisibility(); } - updateExplorerVisibility(); } function configureHttpRequest() { From 9a7fe683a8b938718a3b6015faca28f2d145e20f Mon Sep 17 00:00:00 2001 From: Erich Gamma Date: Fri, 27 Apr 2018 12:05:35 +0200 Subject: [PATCH 169/830] Do not activate on '**/package.json' but only on 'package.json' --- extensions/npm/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/extensions/npm/package.json b/extensions/npm/package.json index 5776ad8f3a6..0f30a0a9301 100644 --- a/extensions/npm/package.json +++ b/extensions/npm/package.json @@ -31,7 +31,7 @@ "onCommand:workbench.action.tasks.runTask", "onLanguage:json", "onView:npm", - "workspaceContains:**/package.json" + "workspaceContains:package.json" ], "contributes": { "views": { From ad9e9c84c2d53c47dc3b0dd1c4d6e70d97d8a6e5 Mon Sep 17 00:00:00 2001 From: Johannes Rieken Date: Fri, 27 Apr 2018 12:39:30 +0200 Subject: [PATCH 170/830] fix #48813 --- .../services/files/electron-browser/remoteFileService.ts | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/vs/workbench/services/files/electron-browser/remoteFileService.ts b/src/vs/workbench/services/files/electron-browser/remoteFileService.ts index ee79fee02c7..d7e46928ec3 100644 --- a/src/vs/workbench/services/files/electron-browser/remoteFileService.ts +++ b/src/vs/workbench/services/files/electron-browser/remoteFileService.ts @@ -11,7 +11,7 @@ import { TernarySearchTree, keys } from 'vs/base/common/map'; import { Schemas } from 'vs/base/common/network'; import URI from 'vs/base/common/uri'; import { TPromise } from 'vs/base/common/winjs.base'; -import { IDecodeStreamOptions, decodeStream, toDecodeStream } from 'vs/base/node/encoding'; +import { IDecodeStreamOptions, toDecodeStream, encodeStream } from 'vs/base/node/encoding'; import { ITextResourceConfigurationService } from 'vs/editor/common/services/resourceConfiguration'; import { localize } from 'vs/nls'; import { IConfigurationService } from 'vs/platform/configuration/common/configuration'; @@ -472,10 +472,10 @@ export class RemoteFileService extends FileService { private _writeFile(provider: IFileSystemProvider, resource: URI, snapshot: ITextSnapshot, preferredEncoding: string, options: FileWriteOptions): TPromise { const readable = createReadableOfSnapshot(snapshot); const encoding = this.encoding.getWriteEncoding(resource, preferredEncoding); - const decoder = decodeStream(encoding); + const encoder = encodeStream(encoding); const target = createWritableOfProvider(provider, resource, options); return new TPromise((resolve, reject) => { - readable.pipe(decoder).pipe(target); + readable.pipe(encoder).pipe(target); target.once('error', err => reject(err)); target.once('finish', _ => resolve(void 0)); }).then(_ => { From c7218a88f3c9bff6248b5212d9b7f35e6b63e332 Mon Sep 17 00:00:00 2001 From: isidor Date: Fri, 27 Apr 2018 12:39:41 +0200 Subject: [PATCH 171/830] fixes #43516 --- .../parts/debug/electron-browser/debugService.ts | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/src/vs/workbench/parts/debug/electron-browser/debugService.ts b/src/vs/workbench/parts/debug/electron-browser/debugService.ts index fafa45301fb..464731341ec 100644 --- a/src/vs/workbench/parts/debug/electron-browser/debugService.ts +++ b/src/vs/workbench/parts/debug/electron-browser/debugService.ts @@ -154,11 +154,17 @@ export class DebugService implements debug.IDebugService { const session = process.session; if (broadcast.channel === EXTENSION_ATTACH_BROADCAST_CHANNEL) { - this.onSessionEnd(session); + const initialAttach = process.configuration.request === 'launch'; process.configuration.request = 'attach'; process.configuration.port = broadcast.payload.port; - this.doCreateProcess(process.session.root, process.configuration, process.getId()); + // Do not end process on initial attach (since the request is still 'launch') + if (initialAttach) { + session.attach(process.configuration); + } else { + this.onSessionEnd(session); + this.doCreateProcess(process.session.root, process.configuration, process.getId()); + } return; } From 470d92886a599302aa16e84ea8330817a7faef6f Mon Sep 17 00:00:00 2001 From: Johannes Rieken Date: Fri, 27 Apr 2018 14:37:34 +0200 Subject: [PATCH 172/830] jsdoc polish --- src/vs/vscode.d.ts | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/src/vs/vscode.d.ts b/src/vs/vscode.d.ts index fb1a8f215b7..dcb29cd3d1f 100644 --- a/src/vs/vscode.d.ts +++ b/src/vs/vscode.d.ts @@ -88,9 +88,13 @@ declare module 'vscode' { export interface TextDocument { /** - * The associated URI for this document. Most documents have the __file__-scheme, indicating that they - * represent files on disk. However, some documents may have other schemes indicating that they are not - * available on disk. + * The associated uri for this document. + * + * *Note* that most documents use the `file`-scheme, which means they are files on disk. However, **not** all documents are + * saved on disk and therefore the `scheme` must be checked before trying to access the underlying file or siblings on disk. + * + * @see [FileSystemProvider](#FileSystemProvider) + * @see [TextDocumentContentProvider](#TextDocumentContentProvider) */ readonly uri: Uri; From 1638acdd62d94bc4d991e8cab1d672260493f82f Mon Sep 17 00:00:00 2001 From: Erich Gamma Date: Fri, 27 Apr 2018 15:54:05 +0200 Subject: [PATCH 173/830] #48832 filter out synthetic install tasks --- extensions/npm/src/npmView.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/extensions/npm/src/npmView.ts b/extensions/npm/src/npmView.ts index dbcfaffccaa..2df1e9a8b16 100644 --- a/extensions/npm/src/npmView.ts +++ b/extensions/npm/src/npmView.ts @@ -298,7 +298,7 @@ export class NpmScriptsTreeDataProvider implements TreeDataProvider { let packageJson = null; tasks.forEach(each => { - if (isWorkspaceFolder(each.scope)) { + if (isWorkspaceFolder(each.scope) && each.name !== 'install') { folder = folders.get(each.scope.name); if (!folder) { folder = new Folder(each.scope); From f251d22e73e05c7455e7970d1d617fbe2c17efb6 Mon Sep 17 00:00:00 2001 From: Christof Marti Date: Fri, 27 Apr 2018 17:32:55 +0200 Subject: [PATCH 174/830] 1.24 begins --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 7d31972f2b7..7e8cda5c439 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "code-oss-dev", - "version": "1.23.0", + "version": "1.24.0", "distro": "ba59d3ae8e284d5cfe6803e1101e9d86163ab256", "author": { "name": "Microsoft Corporation" From 034871d86ec160a503502e4bc7d4e619a6f8f2e9 Mon Sep 17 00:00:00 2001 From: Alex Dima Date: Fri, 27 Apr 2018 12:34:52 +0200 Subject: [PATCH 175/830] Fixes #41825: Special handling of quotes in surround selection --- .../common/controller/cursorTypeOperations.ts | 11 +++++ .../test/browser/controller/cursor.test.ts | 43 +++++++++++++++++-- 2 files changed, 51 insertions(+), 3 deletions(-) diff --git a/src/vs/editor/common/controller/cursorTypeOperations.ts b/src/vs/editor/common/controller/cursorTypeOperations.ts index 12077751e66..fd13e810462 100644 --- a/src/vs/editor/common/controller/cursorTypeOperations.ts +++ b/src/vs/editor/common/controller/cursorTypeOperations.ts @@ -579,6 +579,8 @@ export class TypeOperations { return false; } + const isTypingAQuoteCharacter = (ch === '\'' || ch === '"'); + for (let i = 0, len = selections.length; i < len; i++) { const selection = selections[i]; @@ -603,6 +605,15 @@ export class TypeOperations { if (selectionContainsOnlyWhitespace) { return false; } + + if (isTypingAQuoteCharacter && selection.startLineNumber === selection.endLineNumber && selection.startColumn + 1 === selection.endColumn) { + const selectionText = model.getValueInRange(selection); + if ((selectionText === '\'' || selectionText === '"')) { + // Typing a quote character on top of another quote character + // => disable surround selection type + return false; + } + } } return true; diff --git a/src/vs/editor/test/browser/controller/cursor.test.ts b/src/vs/editor/test/browser/controller/cursor.test.ts index c7e109750ea..e53b9143fef 100644 --- a/src/vs/editor/test/browser/controller/cursor.test.ts +++ b/src/vs/editor/test/browser/controller/cursor.test.ts @@ -1220,7 +1220,7 @@ suite('Editor Controller - Regression tests', () => { constructor() { super(languageId); this._register(LanguageConfigurationRegistry.register(this.getLanguageIdentifier(), { - surroundingPairs: [{ open: '"', close: '"' }] + surroundingPairs: [{ open: '%', close: '%' }] })); } } @@ -1231,8 +1231,8 @@ suite('Editor Controller - Regression tests', () => { withTestCodeEditor(null, { model: model }, (editor, cursor) => { editor.setSelection(new Selection(1, 1, 1, 2)); - cursorCommand(cursor, H.Type, { text: '"' }, 'keyboard'); - assert.equal(model.getValue(EndOfLinePreference.LF), '"\'"👁\'', 'assert1'); + cursorCommand(cursor, H.Type, { text: '%' }, 'keyboard'); + assert.equal(model.getValue(EndOfLinePreference.LF), '%\'%👁\'', 'assert1'); cursorCommand(cursor, H.Undo, {}); assert.equal(model.getValue(EndOfLinePreference.LF), '\'👁\'', 'assert2'); @@ -4159,6 +4159,43 @@ suite('autoClosingPairs', () => { mode.dispose(); }); + test('issue #41825: Special handling of quotes in surrounding pairs', () => { + const languageId = new LanguageIdentifier('myMode', 3); + class MyMode extends MockMode { + constructor() { + super(languageId); + this._register(LanguageConfigurationRegistry.register(this.getLanguageIdentifier(), { + surroundingPairs: [ + { open: '"', close: '"' }, + { open: '\'', close: '\'' }, + ] + })); + } + } + + const mode = new MyMode(); + const model = createTextModel('var x = \'hi\';', undefined, languageId); + + withTestCodeEditor(null, { model: model }, (editor, cursor) => { + editor.setSelections([ + new Selection(1, 9, 1, 10), + new Selection(1, 12, 1, 13) + ]); + cursorCommand(cursor, H.Type, { text: '"' }, 'keyboard'); + assert.equal(model.getValue(EndOfLinePreference.LF), 'var x = "hi";', 'assert1'); + + editor.setSelections([ + new Selection(1, 9, 1, 10), + new Selection(1, 12, 1, 13) + ]); + cursorCommand(cursor, H.Type, { text: '\'' }, 'keyboard'); + assert.equal(model.getValue(EndOfLinePreference.LF), 'var x = \'hi\';', 'assert2'); + }); + + model.dispose(); + mode.dispose(); + }); + test('All cursors should do the same thing when deleting left', () => { let mode = new AutoClosingMode(); let model = createTextModel( From e67edc80eced5f71f711f88537696f7b2bf9f945 Mon Sep 17 00:00:00 2001 From: Alex Dima Date: Fri, 27 Apr 2018 12:41:55 +0200 Subject: [PATCH 176/830] Fixes #42833: Allow multiple cursors everywhere in read only editors --- .../editor/browser/controller/coreCommands.ts | 17 ----------------- 1 file changed, 17 deletions(-) diff --git a/src/vs/editor/browser/controller/coreCommands.ts b/src/vs/editor/browser/controller/coreCommands.ts index 9c2f797ec84..238b9b74d5c 100644 --- a/src/vs/editor/browser/controller/coreCommands.ts +++ b/src/vs/editor/browser/controller/coreCommands.ts @@ -704,10 +704,6 @@ export namespace CoreNavigationCommands { public runCoreEditorCommand(cursors: ICursors, args: any): void { const context = cursors.context; - if (context.config.readOnly) { - return; - } - let newState: CursorState; if (args.wholeLine) { newState = CursorMoveCommands.line(context, cursors.getPrimaryCursor(), false, args.position, args.viewPosition); @@ -769,10 +765,6 @@ export namespace CoreNavigationCommands { public runCoreEditorCommand(cursors: ICursors, args: any): void { const context = cursors.context; - if (context.config.readOnly) { - return; - } - const lastAddedCursorIndex = cursors.getLastAddedCursorIndex(); let newStates = cursors.getAll().slice(0); @@ -1251,9 +1243,6 @@ export namespace CoreNavigationCommands { public runCoreEditorCommand(cursors: ICursors, args: any): void { const context = cursors.context; - if (context.config.readOnly) { - return; - } const lastAddedCursorIndex = cursors.getLastAddedCursorIndex(); @@ -1312,12 +1301,6 @@ export namespace CoreNavigationCommands { } public runCoreEditorCommand(cursors: ICursors, args: any): void { - const context = cursors.context; - - if (context.config.readOnly) { - return; - } - const lastAddedCursorIndex = cursors.getLastAddedCursorIndex(); let newStates = cursors.getAll().slice(0); From 9f5fd606327970edacfdbd091b80ed2788159cdc Mon Sep 17 00:00:00 2001 From: Alex Dima Date: Fri, 27 Apr 2018 14:34:11 +0200 Subject: [PATCH 177/830] Fixes Microsoft/monaco-editor#334: Forward standalone editor options to configuration service --- .../common/config/commonEditorConfig.ts | 20 ++++++++++++++++ .../standalone/browser/simpleServices.ts | 19 +++++++++++++++ .../browser/standaloneCodeEditor.ts | 23 +++++++++++++++++-- .../standalone/browser/standaloneEditor.ts | 7 ++++-- 4 files changed, 65 insertions(+), 4 deletions(-) diff --git a/src/vs/editor/common/config/commonEditorConfig.ts b/src/vs/editor/common/config/commonEditorConfig.ts index 70f7b4053ee..443d4163469 100644 --- a/src/vs/editor/common/config/commonEditorConfig.ts +++ b/src/vs/editor/common/config/commonEditorConfig.ts @@ -700,4 +700,24 @@ const editorConfiguration: IConfigurationNode = { } }; +let cachedEditorConfigurationKeys: { [key: string]: boolean; } = null; +function getEditorConfigurationKeys(): { [key: string]: boolean; } { + if (cachedEditorConfigurationKeys === null) { + cachedEditorConfigurationKeys = Object.create(null); + Object.keys(editorConfiguration.properties).forEach((prop) => { + cachedEditorConfigurationKeys[prop] = true; + }); + } + return cachedEditorConfigurationKeys; +} + +export function isEditorConfigurationKey(key: string): boolean { + const editorConfigurationKeys = getEditorConfigurationKeys(); + return (editorConfigurationKeys[`editor.${key}`] || false); +} +export function isDiffEditorConfigurationKey(key: string): boolean { + const editorConfigurationKeys = getEditorConfigurationKeys(); + return (editorConfigurationKeys[`diffEditor.${key}`] || false); +} + configurationRegistry.registerConfiguration(editorConfiguration); diff --git a/src/vs/editor/standalone/browser/simpleServices.ts b/src/vs/editor/standalone/browser/simpleServices.ts index a09429f1137..4a3c0f43cb2 100644 --- a/src/vs/editor/standalone/browser/simpleServices.ts +++ b/src/vs/editor/standalone/browser/simpleServices.ts @@ -41,6 +41,7 @@ import { ITextModel } from 'vs/editor/common/model'; import { INotificationService, INotification, INotificationHandle, NoOpNotification, IPromptChoice } from 'vs/platform/notification/common/notification'; import { IConfirmation, IConfirmationResult, IDialogService, IDialogOptions } from 'vs/platform/dialogs/common/dialogs'; import { IPosition, Position as Pos } from 'vs/editor/common/core/position'; +import { isEditorConfigurationKey, isDiffEditorConfigurationKey } from 'vs/editor/common/config/commonEditorConfig'; export class SimpleEditor implements IEditor { @@ -495,6 +496,7 @@ export class SimpleConfigurationService implements IConfigurationService { } public updateValue(key: string, value: any, arg3?: any, arg4?: any): TPromise { + this.configuration().updateValue(key, value); return TPromise.as(null); } @@ -620,3 +622,20 @@ export class SimpleWorkspaceContextService implements IWorkspaceContextService { return true; } } + +export function applyConfigurationValues(configurationService: IConfigurationService, source: any, isDiffEditor: boolean): void { + if (!source) { + return; + } + if (!(configurationService instanceof SimpleConfigurationService)) { + return; + } + Object.keys(source).forEach((key) => { + if (isEditorConfigurationKey(key)) { + configurationService.updateValue(`editor.${key}`, source[key]); + } + if (isDiffEditor && isDiffEditorConfigurationKey(key)) { + configurationService.updateValue(`diffEditor.${key}`, source[key]); + } + }); +} diff --git a/src/vs/editor/standalone/browser/standaloneCodeEditor.ts b/src/vs/editor/standalone/browser/standaloneCodeEditor.ts index 53a9a83ed47..46b15a7bf8f 100644 --- a/src/vs/editor/standalone/browser/standaloneCodeEditor.ts +++ b/src/vs/editor/standalone/browser/standaloneCodeEditor.ts @@ -16,7 +16,7 @@ import { IModelChangedEvent } from 'vs/editor/common/editorCommon'; import { ITextModel } from 'vs/editor/common/model'; import { ICodeEditorService } from 'vs/editor/browser/services/codeEditorService'; import { IEditorWorkerService } from 'vs/editor/common/services/editorWorkerService'; -import { StandaloneKeybindingService } from 'vs/editor/standalone/browser/simpleServices'; +import { StandaloneKeybindingService, applyConfigurationValues } from 'vs/editor/standalone/browser/simpleServices'; import { IEditorContextViewService } from 'vs/editor/standalone/browser/standaloneServices'; import { CodeEditor } from 'vs/editor/browser/codeEditor'; import { DiffEditorWidget } from 'vs/editor/browser/widget/diffEditorWidget'; @@ -30,6 +30,7 @@ import * as aria from 'vs/base/browser/ui/aria/aria'; import * as nls from 'vs/nls'; import * as browser from 'vs/base/browser/browser'; import { INotificationService } from 'vs/platform/notification/common/notification'; +import { IConfigurationService } from 'vs/platform/configuration/common/configuration'; /** * Description of an action contribution @@ -284,6 +285,7 @@ export class StandaloneCodeEditor extends CodeEditor implements IStandaloneCodeE export class StandaloneEditor extends StandaloneCodeEditor implements IStandaloneCodeEditor { private _contextViewService: IEditorContextViewService; + private readonly _configurationService: IConfigurationService; private _ownsModel: boolean; constructor( @@ -298,7 +300,9 @@ export class StandaloneEditor extends StandaloneCodeEditor implements IStandalon @IContextViewService contextViewService: IContextViewService, @IStandaloneThemeService themeService: IStandaloneThemeService, @INotificationService notificationService: INotificationService, + @IConfigurationService configurationService: IConfigurationService ) { + applyConfigurationValues(configurationService, options, false); options = options || {}; if (typeof options.theme === 'string') { themeService.setTheme(options.theme); @@ -308,6 +312,7 @@ export class StandaloneEditor extends StandaloneCodeEditor implements IStandalon super(domElement, options, instantiationService, codeEditorService, commandService, contextKeyService, keybindingService, themeService, notificationService); this._contextViewService = contextViewService; + this._configurationService = configurationService; this._register(toDispose); if (typeof model === 'undefined') { @@ -331,6 +336,11 @@ export class StandaloneEditor extends StandaloneCodeEditor implements IStandalon super.dispose(); } + public updateOptions(newOptions: IEditorOptions): void { + applyConfigurationValues(this._configurationService, newOptions, false); + super.updateOptions(newOptions); + } + _attachModel(model: ITextModel): void { super._attachModel(model); if (this._view) { @@ -350,6 +360,7 @@ export class StandaloneEditor extends StandaloneCodeEditor implements IStandalon export class StandaloneDiffEditor extends DiffEditorWidget implements IStandaloneDiffEditor { private _contextViewService: IEditorContextViewService; + private readonly _configurationService: IConfigurationService; constructor( domElement: HTMLElement, @@ -362,8 +373,10 @@ export class StandaloneDiffEditor extends DiffEditorWidget implements IStandalon @IEditorWorkerService editorWorkerService: IEditorWorkerService, @ICodeEditorService codeEditorService: ICodeEditorService, @IStandaloneThemeService themeService: IStandaloneThemeService, - @INotificationService notificationService: INotificationService + @INotificationService notificationService: INotificationService, + @IConfigurationService configurationService: IConfigurationService ) { + applyConfigurationValues(configurationService, options, true); options = options || {}; if (typeof options.theme === 'string') { options.theme = themeService.setTheme(options.theme); @@ -372,6 +385,7 @@ export class StandaloneDiffEditor extends DiffEditorWidget implements IStandalon super(domElement, options, editorWorkerService, contextKeyService, instantiationService, codeEditorService, themeService, notificationService); this._contextViewService = contextViewService; + this._configurationService = configurationService; this._register(toDispose); @@ -382,6 +396,11 @@ export class StandaloneDiffEditor extends DiffEditorWidget implements IStandalon super.dispose(); } + public updateOptions(newOptions: IDiffEditorOptions): void { + applyConfigurationValues(this._configurationService, newOptions, true); + super.updateOptions(newOptions); + } + protected _createInnerEditor(instantiationService: IInstantiationService, container: HTMLElement, options: IEditorOptions): CodeEditor { return instantiationService.createInstance(StandaloneCodeEditor, container, options); } diff --git a/src/vs/editor/standalone/browser/standaloneEditor.ts b/src/vs/editor/standalone/browser/standaloneEditor.ts index f6fbf6ba71d..1612563d285 100644 --- a/src/vs/editor/standalone/browser/standaloneEditor.ts +++ b/src/vs/editor/standalone/browser/standaloneEditor.ts @@ -38,6 +38,7 @@ import * as editorOptions from 'vs/editor/common/config/editorOptions'; import { CursorChangeReason } from 'vs/editor/common/controller/cursorEvents'; import { ITextModel, OverviewRulerLane, EndOfLinePreference, DefaultEndOfLine, EndOfLineSequence, TrackedRangeStickiness, TextModelResolvedOptions, FindMatch } from 'vs/editor/common/model'; import { INotificationService } from 'vs/platform/notification/common/notification'; +import { IConfigurationService } from 'vs/platform/configuration/common/configuration'; function withAllStandaloneServices(domElement: HTMLElement, override: IEditorOverrideServices, callback: (services: DynamicStandaloneServices) => T): T { let services = new DynamicStandaloneServices(domElement, override); @@ -90,7 +91,8 @@ export function create(domElement: HTMLElement, options?: IEditorConstructionOpt services.get(IKeybindingService), services.get(IContextViewService), services.get(IStandaloneThemeService), - services.get(INotificationService) + services.get(INotificationService), + services.get(IConfigurationService), ); }); } @@ -124,7 +126,8 @@ export function createDiffEditor(domElement: HTMLElement, options?: IDiffEditorC services.get(IEditorWorkerService), services.get(ICodeEditorService), services.get(IStandaloneThemeService), - services.get(INotificationService) + services.get(INotificationService), + services.get(IConfigurationService), ); }); } From f5fdb8e04178a6f63611cd1ad671cb4a4571f6e9 Mon Sep 17 00:00:00 2001 From: Alex Dima Date: Fri, 27 Apr 2018 14:45:57 +0200 Subject: [PATCH 178/830] Fixes #43208: Add editor.scrollBeyondLastColumn --- src/vs/editor/common/config/commonEditorConfig.ts | 5 +++++ src/vs/editor/common/config/editorOptions.ts | 10 ++++++++++ src/vs/editor/common/viewLayout/viewLayout.ts | 5 ++--- src/vs/monaco.d.ts | 6 ++++++ 4 files changed, 23 insertions(+), 3 deletions(-) diff --git a/src/vs/editor/common/config/commonEditorConfig.ts b/src/vs/editor/common/config/commonEditorConfig.ts index 443d4163469..62af9556a22 100644 --- a/src/vs/editor/common/config/commonEditorConfig.ts +++ b/src/vs/editor/common/config/commonEditorConfig.ts @@ -254,6 +254,11 @@ const editorConfiguration: IConfigurationNode = { 'default': EDITOR_DEFAULTS.viewInfo.scrollBeyondLastLine, 'description': nls.localize('scrollBeyondLastLine', "Controls if the editor will scroll beyond the last line") }, + 'editor.scrollBeyondLastColumn': { + 'type': 'number', + 'default': EDITOR_DEFAULTS.viewInfo.scrollBeyondLastColumn, + 'description': nls.localize('scrollBeyondLastColumn', "Controls if the editor will scroll beyond the last column") + }, 'editor.smoothScrolling': { 'type': 'boolean', 'default': EDITOR_DEFAULTS.viewInfo.smoothScrolling, diff --git a/src/vs/editor/common/config/editorOptions.ts b/src/vs/editor/common/config/editorOptions.ts index 02f732afc75..c7ea7ee336c 100644 --- a/src/vs/editor/common/config/editorOptions.ts +++ b/src/vs/editor/common/config/editorOptions.ts @@ -300,6 +300,11 @@ export interface IEditorOptions { * Defaults to true. */ scrollBeyondLastLine?: boolean; + /** + * Enable that scrolling can go beyond the last column by a number of columns. + * Defaults to 5. + */ + scrollBeyondLastColumn?: number; /** * Enable that the editor animates scrolling to a position. * Defaults to false. @@ -825,6 +830,7 @@ export interface InternalEditorViewOptions { readonly cursorWidth: number; readonly hideCursorInOverviewRuler: boolean; readonly scrollBeyondLastLine: boolean; + readonly scrollBeyondLastColumn: number; readonly smoothScrolling: boolean; readonly stopRenderingLineAfter: number; readonly renderWhitespace: 'none' | 'boundary' | 'all'; @@ -1105,6 +1111,7 @@ export class InternalEditorOptions { && a.cursorWidth === b.cursorWidth && a.hideCursorInOverviewRuler === b.hideCursorInOverviewRuler && a.scrollBeyondLastLine === b.scrollBeyondLastLine + && a.scrollBeyondLastColumn === b.scrollBeyondLastColumn && a.smoothScrolling === b.smoothScrolling && a.stopRenderingLineAfter === b.stopRenderingLineAfter && a.renderWhitespace === b.renderWhitespace @@ -1718,6 +1725,7 @@ export class EditorOptionsValidator { cursorWidth: _clampedInt(opts.cursorWidth, defaults.cursorWidth, 0, Number.MAX_VALUE), hideCursorInOverviewRuler: _boolean(opts.hideCursorInOverviewRuler, defaults.hideCursorInOverviewRuler), scrollBeyondLastLine: _boolean(opts.scrollBeyondLastLine, defaults.scrollBeyondLastLine), + scrollBeyondLastColumn: _clampedInt(opts.scrollBeyondLastColumn, defaults.scrollBeyondLastColumn, 0, Constants.MAX_SAFE_SMALL_INTEGER), smoothScrolling: _boolean(opts.smoothScrolling, defaults.smoothScrolling), stopRenderingLineAfter: _clampedInt(opts.stopRenderingLineAfter, defaults.stopRenderingLineAfter, -1, Constants.MAX_SAFE_SMALL_INTEGER), renderWhitespace: renderWhitespace, @@ -1830,6 +1838,7 @@ export class InternalEditorOptionsFactory { cursorWidth: opts.viewInfo.cursorWidth, hideCursorInOverviewRuler: opts.viewInfo.hideCursorInOverviewRuler, scrollBeyondLastLine: opts.viewInfo.scrollBeyondLastLine, + scrollBeyondLastColumn: opts.viewInfo.scrollBeyondLastColumn, smoothScrolling: opts.viewInfo.smoothScrolling, stopRenderingLineAfter: opts.viewInfo.stopRenderingLineAfter, renderWhitespace: (accessibilityIsOn ? 'none' : opts.viewInfo.renderWhitespace), // DISABLED WHEN SCREEN READER IS ATTACHED @@ -2280,6 +2289,7 @@ export const EDITOR_DEFAULTS: IValidatedEditorOptions = { cursorWidth: 0, hideCursorInOverviewRuler: false, scrollBeyondLastLine: true, + scrollBeyondLastColumn: 5, smoothScrolling: false, stopRenderingLineAfter: 10000, renderWhitespace: 'none', diff --git a/src/vs/editor/common/viewLayout/viewLayout.ts b/src/vs/editor/common/viewLayout/viewLayout.ts index b43776b2eeb..b67e48873bc 100644 --- a/src/vs/editor/common/viewLayout/viewLayout.ts +++ b/src/vs/editor/common/viewLayout/viewLayout.ts @@ -18,8 +18,6 @@ const SMOOTH_SCROLLING_TIME = 125; export class ViewLayout extends Disposable implements IViewLayout { - static LINES_HORIZONTAL_EXTRA_PX = 30; - private readonly _configuration: editorCommon.IConfiguration; private readonly _linesLayout: LinesLayout; @@ -143,7 +141,8 @@ export class ViewLayout extends Disposable implements IViewLayout { private _computeScrollWidth(maxLineWidth: number, viewportWidth: number): number { let isViewportWrapping = this._configuration.editor.wrappingInfo.isViewportWrapping; if (!isViewportWrapping) { - return Math.max(maxLineWidth + ViewLayout.LINES_HORIZONTAL_EXTRA_PX, viewportWidth); + const extraHorizontalSpace = this._configuration.editor.viewInfo.scrollBeyondLastColumn * this._configuration.editor.fontInfo.typicalHalfwidthCharacterWidth; + return Math.max(maxLineWidth + extraHorizontalSpace, viewportWidth); } return Math.max(maxLineWidth, viewportWidth); } diff --git a/src/vs/monaco.d.ts b/src/vs/monaco.d.ts index 6c8b58194f0..f13a380b04a 100644 --- a/src/vs/monaco.d.ts +++ b/src/vs/monaco.d.ts @@ -2623,6 +2623,11 @@ declare namespace monaco.editor { * Defaults to true. */ scrollBeyondLastLine?: boolean; + /** + * Enable that scrolling can go beyond the last column by a number of columns. + * Defaults to 5. + */ + scrollBeyondLastColumn?: number; /** * Enable that the editor animates scrolling to a position. * Defaults to false. @@ -3088,6 +3093,7 @@ declare namespace monaco.editor { readonly cursorWidth: number; readonly hideCursorInOverviewRuler: boolean; readonly scrollBeyondLastLine: boolean; + readonly scrollBeyondLastColumn: number; readonly smoothScrolling: boolean; readonly stopRenderingLineAfter: number; readonly renderWhitespace: 'none' | 'boundary' | 'all'; From 7e5232aa0faee684dfa834f6053dd3f9f99a1fcf Mon Sep 17 00:00:00 2001 From: Alex Dima Date: Fri, 27 Apr 2018 15:27:25 +0200 Subject: [PATCH 179/830] Fixes #44206: Inform when a large file is opened and features are turned off --- .../codeEditor/codeEditor.contribution.ts | 1 + .../largeFileOptimizations.ts | 85 +++++++++++++++++++ 2 files changed, 86 insertions(+) create mode 100644 src/vs/workbench/parts/codeEditor/electron-browser/largeFileOptimizations.ts diff --git a/src/vs/workbench/parts/codeEditor/codeEditor.contribution.ts b/src/vs/workbench/parts/codeEditor/codeEditor.contribution.ts index 96f5b32b7f0..cc4c07f981a 100644 --- a/src/vs/workbench/parts/codeEditor/codeEditor.contribution.ts +++ b/src/vs/workbench/parts/codeEditor/codeEditor.contribution.ts @@ -5,6 +5,7 @@ import './electron-browser/accessibility'; import './electron-browser/inspectKeybindings'; +import './electron-browser/largeFileOptimizations'; import './electron-browser/menuPreventer'; import './electron-browser/selectionClipboard'; import './electron-browser/textMate/inspectTMScopes'; diff --git a/src/vs/workbench/parts/codeEditor/electron-browser/largeFileOptimizations.ts b/src/vs/workbench/parts/codeEditor/electron-browser/largeFileOptimizations.ts new file mode 100644 index 00000000000..da82995fb98 --- /dev/null +++ b/src/vs/workbench/parts/codeEditor/electron-browser/largeFileOptimizations.ts @@ -0,0 +1,85 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +'use strict'; + +import * as nls from 'vs/nls'; +import * as path from 'path'; +import { Disposable } from 'vs/base/common/lifecycle'; +import { IEditorContribution } from 'vs/editor/common/editorCommon'; +import { ICodeEditor } from 'vs/editor/browser/editorBrowser'; +import { registerEditorContribution } from 'vs/editor/browser/editorExtensions'; +import { INotificationService, Severity } from 'vs/platform/notification/common/notification'; +import { IStorageService, StorageScope } from 'vs/platform/storage/common/storage'; +import { IConfigurationService } from 'vs/platform/configuration/common/configuration'; + +/** + * Shows a message when opening a large file which has been memory optimized (and features disabled). + */ +export class LargeFileOptimizationsWarner extends Disposable implements IEditorContribution { + + private static readonly ID = 'editor.contrib.largeFileOptimizationsWarner'; + + private _isDisabled: boolean; + + constructor( + private readonly _editor: ICodeEditor, + @INotificationService private readonly _notificationService: INotificationService, + @IConfigurationService private readonly _configurationService: IConfigurationService, + @IStorageService private readonly _storageService: IStorageService, + ) { + super(); + + this._isDisabled = this._storageService.getBoolean('editor.neverPromptForLargeFiles', StorageScope.GLOBAL, false); + + this._register(this._editor.onDidChangeModel((e) => { + const model = this._editor.getModel(); + if (!model) { + return; + } + if (this._isDisabled) { + return; + } + + if (model.isTooLargeForTokenization()) { + const message = nls.localize( + { + key: 'largeFile', + comment: [ + 'Variable 0 will be a file name.' + ] + }, + "{0}: tokenization, wrapping and folding have been turned off for this large file in order to reduce memory usage and avoid freezing or crashing.", + path.basename(model.uri.path) + ); + + this._notificationService.prompt(Severity.Info, message, [ + { + label: nls.localize('neverShowAgain', "OK. Never show again"), + run: () => { + this._isDisabled = true; + this._storageService.store('editor.neverPromptForLargeFiles', true, StorageScope.GLOBAL); + } + }, + { + label: nls.localize('removeOptimizations', "Forcefully enable features"), + run: () => { + this._configurationService.updateValue(`editor.largeFileOptimizations`, false).then(() => { + this._notificationService.info(nls.localize('reopenFilePrompt', "Please reopen file in order for this setting to take effect.")); + }, (err) => { + this._notificationService.error(err); + }); + } + } + ]); + } + })); + } + + public getId(): string { + return LargeFileOptimizationsWarner.ID; + } +} + +registerEditorContribution(LargeFileOptimizationsWarner); From ea68cdf398a1a9401b93917745681a526a12816e Mon Sep 17 00:00:00 2001 From: Alex Dima Date: Fri, 27 Apr 2018 15:28:57 +0200 Subject: [PATCH 180/830] Use model.isTooLargeForSyncing to avoid syncing --- src/vs/editor/common/services/editorWorkerServiceImpl.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/vs/editor/common/services/editorWorkerServiceImpl.ts b/src/vs/editor/common/services/editorWorkerServiceImpl.ts index 86885e233fc..efbf104f703 100644 --- a/src/vs/editor/common/services/editorWorkerServiceImpl.ts +++ b/src/vs/editor/common/services/editorWorkerServiceImpl.ts @@ -37,7 +37,7 @@ function canSyncModel(modelService: IModelService, resource: URI): boolean { if (!model) { return false; } - if (model.isTooLargeForTokenization()) { + if (model.isTooLargeForSyncing()) { return false; } return true; @@ -265,7 +265,7 @@ class EditorModelManager extends Disposable { if (!model) { return; } - if (model.isTooLargeForTokenization()) { + if (model.isTooLargeForSyncing()) { return; } From 6d04391fe1345256fabe013083b3ed99f9aa06dc Mon Sep 17 00:00:00 2001 From: Alex Dima Date: Fri, 27 Apr 2018 16:14:55 +0200 Subject: [PATCH 181/830] Fixes #34855: Add syntax highlighting for deleted lines in inline diff editor --- .../editor/browser/widget/diffEditorWidget.ts | 59 ++++++------------- 1 file changed, 19 insertions(+), 40 deletions(-) diff --git a/src/vs/editor/browser/widget/diffEditorWidget.ts b/src/vs/editor/browser/widget/diffEditorWidget.ts index 4eb32cd0085..ef061943e1e 100644 --- a/src/vs/editor/browser/widget/diffEditorWidget.ts +++ b/src/vs/editor/browser/widget/diffEditorWidget.ts @@ -23,13 +23,11 @@ import { LineDecoration } from 'vs/editor/common/viewLayout/lineDecorations'; import { renderViewLine, RenderLineInput } from 'vs/editor/common/viewLayout/viewLineRenderer'; import * as editorBrowser from 'vs/editor/browser/editorBrowser'; import { CodeEditor } from 'vs/editor/browser/codeEditor'; -import { LineTokens } from 'vs/editor/common/core/lineTokens'; import { Configuration } from 'vs/editor/browser/config/configuration'; import { Position, IPosition } from 'vs/editor/common/core/position'; import { Selection, ISelection } from 'vs/editor/common/core/selection'; import { InlineDecoration, InlineDecorationType, ViewLineRenderingData } from 'vs/editor/common/viewModel/viewModel'; import { ServiceCollection } from 'vs/platform/instantiation/common/serviceCollection'; -import { ColorId, MetadataConsts, FontStyle } from 'vs/editor/common/modes'; import { Event, Emitter } from 'vs/base/common/event'; import * as editorOptions from 'vs/editor/common/config/editorOptions'; import { registerThemingParticipant, IThemeService, ITheme, getThemeTypeSelector } from 'vs/platform/theme/common/themeService'; @@ -1175,7 +1173,7 @@ interface IDataSource { getModifiedEditor(): editorBrowser.ICodeEditor; } -class DiffEditorWidgetStyle extends Disposable { +abstract class DiffEditorWidgetStyle extends Disposable { _dataSource: IDataSource; _insertColor: Color; @@ -1223,17 +1221,9 @@ class DiffEditorWidgetStyle extends Disposable { }; } - _getViewZones(lineChanges: editorCommon.ILineChange[], originalForeignVZ: IEditorWhitespace[], modifiedForeignVZ: IEditorWhitespace[], originalEditor: editorBrowser.ICodeEditor, modifiedEditor: editorBrowser.ICodeEditor, renderIndicators: boolean): IEditorsZones { - return null; - } - - _getOriginalEditorDecorations(lineChanges: editorCommon.ILineChange[], ignoreTrimWhitespace: boolean, renderIndicators: boolean, originalEditor: editorBrowser.ICodeEditor, modifiedEditor: editorBrowser.ICodeEditor): IEditorDiffDecorations { - return null; - } - - _getModifiedEditorDecorations(lineChanges: editorCommon.ILineChange[], ignoreTrimWhitespace: boolean, renderIndicators: boolean, originalEditor: editorBrowser.ICodeEditor, modifiedEditor: editorBrowser.ICodeEditor): IEditorDiffDecorations { - return null; - } + protected abstract _getViewZones(lineChanges: editorCommon.ILineChange[], originalForeignVZ: IEditorWhitespace[], modifiedForeignVZ: IEditorWhitespace[], originalEditor: editorBrowser.ICodeEditor, modifiedEditor: editorBrowser.ICodeEditor, renderIndicators: boolean): IEditorsZones; + protected abstract _getOriginalEditorDecorations(lineChanges: editorCommon.ILineChange[], ignoreTrimWhitespace: boolean, renderIndicators: boolean, originalEditor: editorBrowser.ICodeEditor, modifiedEditor: editorBrowser.ICodeEditor): IEditorDiffDecorations; + protected abstract _getModifiedEditorDecorations(lineChanges: editorCommon.ILineChange[], ignoreTrimWhitespace: boolean, renderIndicators: boolean, originalEditor: editorBrowser.ICodeEditor, modifiedEditor: editorBrowser.ICodeEditor): IEditorDiffDecorations; } interface IMyViewZone extends editorBrowser.IViewZone { @@ -1617,12 +1607,12 @@ class DiffEdtorWidgetSideBySide extends DiffEditorWidgetStyle implements IDiffEd return this._dataSource.getHeight(); } - _getViewZones(lineChanges: editorCommon.ILineChange[], originalForeignVZ: IEditorWhitespace[], modifiedForeignVZ: IEditorWhitespace[], originalEditor: editorBrowser.ICodeEditor, modifiedEditor: editorBrowser.ICodeEditor): IEditorsZones { + protected _getViewZones(lineChanges: editorCommon.ILineChange[], originalForeignVZ: IEditorWhitespace[], modifiedForeignVZ: IEditorWhitespace[], originalEditor: editorBrowser.ICodeEditor, modifiedEditor: editorBrowser.ICodeEditor): IEditorsZones { let c = new SideBySideViewZonesComputer(lineChanges, originalForeignVZ, modifiedForeignVZ); return c.getViewZones(); } - _getOriginalEditorDecorations(lineChanges: editorCommon.ILineChange[], ignoreTrimWhitespace: boolean, renderIndicators: boolean, originalEditor: editorBrowser.ICodeEditor, modifiedEditor: editorBrowser.ICodeEditor): IEditorDiffDecorations { + protected _getOriginalEditorDecorations(lineChanges: editorCommon.ILineChange[], ignoreTrimWhitespace: boolean, renderIndicators: boolean, originalEditor: editorBrowser.ICodeEditor, modifiedEditor: editorBrowser.ICodeEditor): IEditorDiffDecorations { const overviewZoneColor = this._removeColor.toString(); let result: IEditorDiffDecorations = { @@ -1682,7 +1672,7 @@ class DiffEdtorWidgetSideBySide extends DiffEditorWidgetStyle implements IDiffEd return result; } - _getModifiedEditorDecorations(lineChanges: editorCommon.ILineChange[], ignoreTrimWhitespace: boolean, renderIndicators: boolean, originalEditor: editorBrowser.ICodeEditor, modifiedEditor: editorBrowser.ICodeEditor): IEditorDiffDecorations { + protected _getModifiedEditorDecorations(lineChanges: editorCommon.ILineChange[], ignoreTrimWhitespace: boolean, renderIndicators: boolean, originalEditor: editorBrowser.ICodeEditor, modifiedEditor: editorBrowser.ICodeEditor): IEditorDiffDecorations { const overviewZoneColor = this._insertColor.toString(); let result: IEditorDiffDecorations = { @@ -1749,7 +1739,7 @@ class SideBySideViewZonesComputer extends ViewZonesComputer { super(lineChanges, originalForeignVZ, modifiedForeignVZ); } - _produceOriginalFromDiff(lineChange: editorCommon.ILineChange, lineChangeOriginalLength: number, lineChangeModifiedLength: number): IMyViewZone { + protected _produceOriginalFromDiff(lineChange: editorCommon.ILineChange, lineChangeOriginalLength: number, lineChangeModifiedLength: number): IMyViewZone { if (lineChangeModifiedLength > lineChangeOriginalLength) { return { afterLineNumber: Math.max(lineChange.originalStartLineNumber, lineChange.originalEndLineNumber), @@ -1760,7 +1750,7 @@ class SideBySideViewZonesComputer extends ViewZonesComputer { return null; } - _produceModifiedFromDiff(lineChange: editorCommon.ILineChange, lineChangeOriginalLength: number, lineChangeModifiedLength: number): IMyViewZone { + protected _produceModifiedFromDiff(lineChange: editorCommon.ILineChange, lineChangeOriginalLength: number, lineChangeModifiedLength: number): IMyViewZone { if (lineChangeOriginalLength > lineChangeModifiedLength) { return { afterLineNumber: Math.max(lineChange.modifiedStartLineNumber, lineChange.modifiedEndLineNumber), @@ -1797,12 +1787,12 @@ class DiffEdtorWidgetInline extends DiffEditorWidgetStyle implements IDiffEditor // Nothing to do.. } - _getViewZones(lineChanges: editorCommon.ILineChange[], originalForeignVZ: IEditorWhitespace[], modifiedForeignVZ: IEditorWhitespace[], originalEditor: editorBrowser.ICodeEditor, modifiedEditor: editorBrowser.ICodeEditor, renderIndicators: boolean): IEditorsZones { + protected _getViewZones(lineChanges: editorCommon.ILineChange[], originalForeignVZ: IEditorWhitespace[], modifiedForeignVZ: IEditorWhitespace[], originalEditor: editorBrowser.ICodeEditor, modifiedEditor: editorBrowser.ICodeEditor, renderIndicators: boolean): IEditorsZones { let computer = new InlineViewZonesComputer(lineChanges, originalForeignVZ, modifiedForeignVZ, originalEditor, modifiedEditor, renderIndicators); return computer.getViewZones(); } - _getOriginalEditorDecorations(lineChanges: editorCommon.ILineChange[], ignoreTrimWhitespace: boolean, renderIndicators: boolean, originalEditor: editorBrowser.ICodeEditor, modifiedEditor: editorBrowser.ICodeEditor): IEditorDiffDecorations { + protected _getOriginalEditorDecorations(lineChanges: editorCommon.ILineChange[], ignoreTrimWhitespace: boolean, renderIndicators: boolean, originalEditor: editorBrowser.ICodeEditor, modifiedEditor: editorBrowser.ICodeEditor): IEditorDiffDecorations { const overviewZoneColor = this._removeColor.toString(); let result: IEditorDiffDecorations = { @@ -1831,7 +1821,7 @@ class DiffEdtorWidgetInline extends DiffEditorWidgetStyle implements IDiffEditor return result; } - _getModifiedEditorDecorations(lineChanges: editorCommon.ILineChange[], ignoreTrimWhitespace: boolean, renderIndicators: boolean, originalEditor: editorBrowser.ICodeEditor, modifiedEditor: editorBrowser.ICodeEditor): IEditorDiffDecorations { + protected _getModifiedEditorDecorations(lineChanges: editorCommon.ILineChange[], ignoreTrimWhitespace: boolean, renderIndicators: boolean, originalEditor: editorBrowser.ICodeEditor, modifiedEditor: editorBrowser.ICodeEditor): IEditorDiffDecorations { const overviewZoneColor = this._insertColor.toString(); let result: IEditorDiffDecorations = { @@ -1913,7 +1903,7 @@ class InlineViewZonesComputer extends ViewZonesComputer { this.renderIndicators = renderIndicators; } - _produceOriginalFromDiff(lineChange: editorCommon.ILineChange, lineChangeOriginalLength: number, lineChangeModifiedLength: number): IMyViewZone { + protected _produceOriginalFromDiff(lineChange: editorCommon.ILineChange, lineChangeOriginalLength: number, lineChangeModifiedLength: number): IMyViewZone { let marginDomNode = document.createElement('div'); marginDomNode.className = 'inline-added-margin-view-zone'; Configuration.applyFontInfoSlow(marginDomNode, this.modifiedEditorConfiguration.fontInfo); @@ -1926,7 +1916,7 @@ class InlineViewZonesComputer extends ViewZonesComputer { }; } - _produceModifiedFromDiff(lineChange: editorCommon.ILineChange, lineChangeOriginalLength: number, lineChangeModifiedLength: number): IMyViewZone { + protected _produceModifiedFromDiff(lineChange: editorCommon.ILineChange, lineChangeOriginalLength: number, lineChangeModifiedLength: number): IMyViewZone { let decorations: InlineDecoration[] = []; if (lineChange.charChanges) { for (let j = 0, lengthJ = lineChange.charChanges.length; j < lengthJ; j++) { @@ -1946,7 +1936,7 @@ class InlineViewZonesComputer extends ViewZonesComputer { let lineDecorationsWidth = this.modifiedEditorConfiguration.layoutInfo.decorationsWidth; let lineHeight = this.modifiedEditorConfiguration.lineHeight; for (let lineNumber = lineChange.originalStartLineNumber; lineNumber <= lineChange.originalEndLineNumber; lineNumber++) { - this.renderOriginalLine(lineNumber - lineChange.originalStartLineNumber, this.originalModel, this.modifiedEditorConfiguration, this.modifiedEditorTabSize, lineNumber, decorations, sb); + this._renderOriginalLine(lineNumber - lineChange.originalStartLineNumber, this.originalModel, this.modifiedEditorConfiguration, this.modifiedEditorTabSize, lineNumber, decorations, sb); if (this.renderIndicators) { let index = lineNumber - lineChange.originalStartLineNumber; @@ -1975,22 +1965,11 @@ class InlineViewZonesComputer extends ViewZonesComputer { }; } - private renderOriginalLine(count: number, originalModel: ITextModel, config: editorOptions.InternalEditorOptions, tabSize: number, lineNumber: number, decorations: InlineDecoration[], sb: IStringBuilder): void { - let lineContent = originalModel.getLineContent(lineNumber); + private _renderOriginalLine(count: number, originalModel: ITextModel, config: editorOptions.InternalEditorOptions, tabSize: number, lineNumber: number, decorations: InlineDecoration[], sb: IStringBuilder): void { + const lineTokens = originalModel.getLineTokens(lineNumber); + const lineContent = lineTokens.getLineContent(); - let actualDecorations = LineDecoration.filter(decorations, lineNumber, 1, lineContent.length + 1); - - const defaultMetadata = ( - (FontStyle.None << MetadataConsts.FONT_STYLE_OFFSET) - | (ColorId.DefaultForeground << MetadataConsts.FOREGROUND_OFFSET) - | (ColorId.DefaultBackground << MetadataConsts.BACKGROUND_OFFSET) - ) >>> 0; - - const tokens = new Uint32Array(2); - tokens[0] = lineContent.length; - tokens[1] = defaultMetadata; - - const lineTokens = new LineTokens(tokens, lineContent); + const actualDecorations = LineDecoration.filter(decorations, lineNumber, 1, lineContent.length + 1); sb.appendASCIIString('
    { + + if (!this._documentHasFocus()) { + // Focus has been lost => leave chord mode + this._leaveChordMode(); + return; + } + + if (Date.now() - chordEnterTime > 5000) { + // 5 seconds elapsed => leave chord mode + this._leaveChordMode(); + } + + }, 500); + } + + private _leaveChordMode(): void { + if (this._currentChordStatusMessage) { + this._currentChordStatusMessage.dispose(); + this._currentChordStatusMessage = null; + } + this._currentChordChecker.cancel(); + this._currentChord = null; + } + protected _dispatch(e: IKeyboardEvent, target: IContextKeyServiceTarget): boolean { let shouldPreventDefault = false; @@ -135,13 +171,7 @@ export abstract class AbstractKeybindingService implements IKeybindingService { if (resolveResult && resolveResult.enterChord) { shouldPreventDefault = true; - this._currentChord = { - keypress: firstPart, - label: keypressLabel - }; - if (this._statusService) { - this._currentChordStatusMessage = this._statusService.setStatusMessage(nls.localize('first.chord', "({0}) was pressed. Waiting for second key of chord...", keypressLabel)); - } + this._enterChordMode(firstPart, keypressLabel); return shouldPreventDefault; } @@ -151,11 +181,8 @@ export abstract class AbstractKeybindingService implements IKeybindingService { shouldPreventDefault = true; } } - if (this._currentChordStatusMessage) { - this._currentChordStatusMessage.dispose(); - this._currentChordStatusMessage = null; - } - this._currentChord = null; + + this._leaveChordMode(); if (resolveResult && resolveResult.commandId) { if (!resolveResult.bubble) { diff --git a/src/vs/platform/keybinding/test/common/abstractKeybindingService.test.ts b/src/vs/platform/keybinding/test/common/abstractKeybindingService.test.ts index 44ea5de8c5d..4de70895b8a 100644 --- a/src/vs/platform/keybinding/test/common/abstractKeybindingService.test.ts +++ b/src/vs/platform/keybinding/test/common/abstractKeybindingService.test.ts @@ -49,6 +49,10 @@ suite('AbstractKeybindingService', () => { return this._resolver; } + protected _documentHasFocus(): boolean { + return true; + } + public resolveKeybinding(kb: Keybinding): ResolvedKeybinding[] { return [new USLayoutResolvedKeybinding(kb, OS)]; } diff --git a/src/vs/workbench/services/keybinding/electron-browser/keybindingService.ts b/src/vs/workbench/services/keybinding/electron-browser/keybindingService.ts index 94cce17a1d0..e7f59e3cd19 100644 --- a/src/vs/workbench/services/keybinding/electron-browser/keybindingService.ts +++ b/src/vs/workbench/services/keybinding/electron-browser/keybindingService.ts @@ -291,8 +291,7 @@ export class WorkbenchKeybindingService extends AbstractKeybindingService { this._cachedResolver = null; this._firstTimeComputingResolver = true; - this.userKeybindings = new ConfigWatcher(environmentService.appKeybindingsPath, { defaultConfig: [], onError: error => onUnexpectedError(error) }); - this.toDispose.push(this.userKeybindings); + this.userKeybindings = this._register(new ConfigWatcher(environmentService.appKeybindingsPath, { defaultConfig: [], onError: error => onUnexpectedError(error) })); keybindingsExtPoint.setHandler((extensions) => { let commandAdded = false; @@ -306,12 +305,12 @@ export class WorkbenchKeybindingService extends AbstractKeybindingService { } }); - this.toDispose.push(this.userKeybindings.onDidUpdateConfiguration(event => this.updateResolver({ + this._register(this.userKeybindings.onDidUpdateConfiguration(event => this.updateResolver({ source: KeybindingSource.User, keybindings: event.config }))); - this.toDispose.push(dom.addDisposableListener(windowElement, dom.EventType.KEY_DOWN, (e: KeyboardEvent) => { + this._register(dom.addDisposableListener(windowElement, dom.EventType.KEY_DOWN, (e: KeyboardEvent) => { let keyEvent = new StandardKeyboardEvent(e); let shouldPreventDefault = this._dispatch(keyEvent, keyEvent.target); if (shouldPreventDefault) { @@ -367,6 +366,10 @@ export class WorkbenchKeybindingService extends AbstractKeybindingService { return this._cachedResolver; } + protected _documentHasFocus(): boolean { + return document.hasFocus(); + } + private _resolveKeybindingItems(items: IKeybindingItem[], isDefault: boolean): ResolvedKeybindingItem[] { let result: ResolvedKeybindingItem[] = [], resultLen = 0; for (let i = 0, len = items.length; i < len; i++) { From b612d2e8f8cef6b66290aed3ef9571ae03331ac3 Mon Sep 17 00:00:00 2001 From: Alex Dima Date: Fri, 27 Apr 2018 16:46:45 +0200 Subject: [PATCH 183/830] Fixes #40965: Increas largest possible zooming font size --- src/vs/editor/common/config/editorZoom.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/vs/editor/common/config/editorZoom.ts b/src/vs/editor/common/config/editorZoom.ts index f7884ada948..6d57611f1c9 100644 --- a/src/vs/editor/common/config/editorZoom.ts +++ b/src/vs/editor/common/config/editorZoom.ts @@ -24,7 +24,7 @@ export const EditorZoom: IEditorZoom = new class implements IEditorZoom { } public setZoomLevel(zoomLevel: number): void { - zoomLevel = Math.min(Math.max(-9, zoomLevel), 9); + zoomLevel = Math.min(Math.max(-5, zoomLevel), 20); if (this._zoomLevel === zoomLevel) { return; } From 4cb1ed9281f71b23760a9eccc5f135a8d35fce3f Mon Sep 17 00:00:00 2001 From: Alex Dima Date: Fri, 27 Apr 2018 16:56:52 +0200 Subject: [PATCH 184/830] Fixes #48838: Add font zooming actions --- src/vs/editor/contrib/fontZoom/fontZoom.ts | 62 ++++++++++++++++++++++ src/vs/editor/editor.all.ts | 1 + 2 files changed, 63 insertions(+) create mode 100644 src/vs/editor/contrib/fontZoom/fontZoom.ts diff --git a/src/vs/editor/contrib/fontZoom/fontZoom.ts b/src/vs/editor/contrib/fontZoom/fontZoom.ts new file mode 100644 index 00000000000..ea53f238ab2 --- /dev/null +++ b/src/vs/editor/contrib/fontZoom/fontZoom.ts @@ -0,0 +1,62 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +'use strict'; + +import * as nls from 'vs/nls'; +import { registerEditorAction, ServicesAccessor, EditorAction } from 'vs/editor/browser/editorExtensions'; +import { ICodeEditor } from 'vs/editor/browser/editorBrowser'; +import { EditorZoom } from 'vs/editor/common/config/editorZoom'; + +class EditorFontZoomIn extends EditorAction { + + constructor() { + super({ + id: 'editor.action.fontZoomIn', + label: nls.localize('EditorFontZoomIn.label', "Editor Font Zoom In"), + alias: 'Editor Font Zoom In', + precondition: null + }); + } + + public run(accessor: ServicesAccessor, editor: ICodeEditor): void { + EditorZoom.setZoomLevel(EditorZoom.getZoomLevel() + 1); + } +} + +class EditorFontZoomOut extends EditorAction { + + constructor() { + super({ + id: 'editor.action.fontZoomOut', + label: nls.localize('EditorFontZoomOut.label', "Editor Font Zoom Out"), + alias: 'Editor Font Zoom Out', + precondition: null + }); + } + + public run(accessor: ServicesAccessor, editor: ICodeEditor): void { + EditorZoom.setZoomLevel(EditorZoom.getZoomLevel() - 1); + } +} + +class EditorFontZoomReset extends EditorAction { + + constructor() { + super({ + id: 'editor.action.fontZoomReset', + label: nls.localize('EditorFontZoomReset.label', "Editor Font Zoom Reset"), + alias: 'Editor Font Zoom Reset', + precondition: null + }); + } + + public run(accessor: ServicesAccessor, editor: ICodeEditor): void { + EditorZoom.setZoomLevel(0); + } +} + +registerEditorAction(EditorFontZoomIn); +registerEditorAction(EditorFontZoomOut); +registerEditorAction(EditorFontZoomReset); diff --git a/src/vs/editor/editor.all.ts b/src/vs/editor/editor.all.ts index 07cbf332285..b33b825bc45 100644 --- a/src/vs/editor/editor.all.ts +++ b/src/vs/editor/editor.all.ts @@ -22,6 +22,7 @@ import 'vs/editor/contrib/cursorUndo/cursorUndo'; import 'vs/editor/contrib/dnd/dnd'; import 'vs/editor/contrib/find/findController'; import 'vs/editor/contrib/folding/folding'; +import 'vs/editor/contrib/fontZoom/fontZoom'; import 'vs/editor/contrib/format/formatActions'; import 'vs/editor/contrib/goToDeclaration/goToDeclarationCommands'; import 'vs/editor/contrib/goToDeclaration/goToDeclarationMouse'; From dac897f3a10c1a8a317b62929e89b6fede28612c Mon Sep 17 00:00:00 2001 From: Alex Dima Date: Fri, 27 Apr 2018 17:52:19 +0200 Subject: [PATCH 185/830] Fixes #10143: Add minWidthInPx to view zones --- src/vs/editor/browser/editorBrowser.ts | 5 +++ .../browser/viewParts/lines/viewLines.ts | 1 + .../browser/viewParts/viewZones/viewZones.ts | 16 ++++++-- .../editor/browser/widget/diffEditorWidget.ts | 13 ++++-- .../editor/common/viewLayout/linesLayout.ts | 8 +++- src/vs/editor/common/viewLayout/viewLayout.ts | 7 ++-- .../common/viewLayout/whitespaceComputer.ts | 40 +++++++++++++++++-- src/vs/editor/common/viewModel/viewModel.ts | 2 +- .../common/viewLayout/linesLayout.test.ts | 22 +++++----- .../viewLayout/whitespaceComputer.test.ts | 32 +++++++-------- src/vs/monaco.d.ts | 5 +++ 11 files changed, 108 insertions(+), 43 deletions(-) diff --git a/src/vs/editor/browser/editorBrowser.ts b/src/vs/editor/browser/editorBrowser.ts index 18810f9d54f..ff442f819c5 100644 --- a/src/vs/editor/browser/editorBrowser.ts +++ b/src/vs/editor/browser/editorBrowser.ts @@ -53,6 +53,11 @@ export interface IViewZone { * If neither `heightInPx` nor `heightInLines` is specified, a default of `heightInLines` = 1 will be chosen. */ heightInPx?: number; + /** + * The minimum width in px of the view zone. + * If this is set, the editor will ensure that the scroll width is >= than this value. + */ + minWidthInPx?: number; /** * The dom node of the view zone */ diff --git a/src/vs/editor/browser/viewParts/lines/viewLines.ts b/src/vs/editor/browser/viewParts/lines/viewLines.ts index c42f3e90d14..ed037cd2092 100644 --- a/src/vs/editor/browser/viewParts/lines/viewLines.ts +++ b/src/vs/editor/browser/viewParts/lines/viewLines.ts @@ -271,6 +271,7 @@ export class ViewLines extends ViewPart implements IVisibleLinesHost, return this._visibleLines.onTokensChanged(e); } public onZonesChanged(e: viewEvents.ViewZonesChangedEvent): boolean { + this._context.viewLayout.onMaxLineWidthChanged(this._maxLineWidth); return this._visibleLines.onZonesChanged(e); } public onThemeChanged(e: viewEvents.ViewThemeChangedEvent): boolean { diff --git a/src/vs/editor/browser/viewParts/viewZones/viewZones.ts b/src/vs/editor/browser/viewParts/viewZones/viewZones.ts index 175b237a2dd..ac975b5135c 100644 --- a/src/vs/editor/browser/viewParts/viewZones/viewZones.ts +++ b/src/vs/editor/browser/viewParts/viewZones/viewZones.ts @@ -25,6 +25,7 @@ export interface IMyViewZone { interface IComputedViewZoneProps { afterViewLineNumber: number; heightInPx: number; + minWidthInPx: number; } export class ViewZones extends ViewPart { @@ -138,7 +139,8 @@ export class ViewZones extends ViewPart { if (zone.afterLineNumber === 0) { return { afterViewLineNumber: 0, - heightInPx: this._heightInPixels(zone) + heightInPx: this._heightInPixels(zone), + minWidthInPx: this._minWidthInPixels(zone) }; } @@ -177,13 +179,14 @@ export class ViewZones extends ViewPart { let isVisible = this._context.model.coordinatesConverter.modelPositionIsVisible(zoneBeforeModelPosition); return { afterViewLineNumber: viewPosition.lineNumber, - heightInPx: (isVisible ? this._heightInPixels(zone) : 0) + heightInPx: (isVisible ? this._heightInPixels(zone) : 0), + minWidthInPx: this._minWidthInPixels(zone) }; } public addZone(zone: IViewZone): number { let props = this._computeWhitespaceProps(zone); - let whitespaceId = this._context.viewLayout.addWhitespace(props.afterViewLineNumber, this._getZoneOrdinal(zone), props.heightInPx); + let whitespaceId = this._context.viewLayout.addWhitespace(props.afterViewLineNumber, this._getZoneOrdinal(zone), props.heightInPx, props.minWidthInPx); let myZone: IMyViewZone = { whitespaceId: whitespaceId, @@ -275,6 +278,13 @@ export class ViewZones extends ViewPart { return this._lineHeight; } + private _minWidthInPixels(zone: IViewZone): number { + if (typeof zone.minWidthInPx === 'number') { + return zone.minWidthInPx; + } + return 0; + } + private _safeCallOnComputedHeight(zone: IViewZone, height: number): void { if (typeof zone.onComputedHeight === 'function') { try { diff --git a/src/vs/editor/browser/widget/diffEditorWidget.ts b/src/vs/editor/browser/widget/diffEditorWidget.ts index ef061943e1e..14a41c8c4d3 100644 --- a/src/vs/editor/browser/widget/diffEditorWidget.ts +++ b/src/vs/editor/browser/widget/diffEditorWidget.ts @@ -1935,8 +1935,10 @@ class InlineViewZonesComputer extends ViewZonesComputer { let marginHTML: string[] = []; let lineDecorationsWidth = this.modifiedEditorConfiguration.layoutInfo.decorationsWidth; let lineHeight = this.modifiedEditorConfiguration.lineHeight; + const typicalHalfwidthCharacterWidth = this.modifiedEditorConfiguration.fontInfo.typicalHalfwidthCharacterWidth; + let maxCharsPerLine = 0; for (let lineNumber = lineChange.originalStartLineNumber; lineNumber <= lineChange.originalEndLineNumber; lineNumber++) { - this._renderOriginalLine(lineNumber - lineChange.originalStartLineNumber, this.originalModel, this.modifiedEditorConfiguration, this.modifiedEditorTabSize, lineNumber, decorations, sb); + maxCharsPerLine = Math.max(maxCharsPerLine, this._renderOriginalLine(lineNumber - lineChange.originalStartLineNumber, this.originalModel, this.modifiedEditorConfiguration, this.modifiedEditorTabSize, lineNumber, decorations, sb)); if (this.renderIndicators) { let index = lineNumber - lineChange.originalStartLineNumber; @@ -1945,6 +1947,7 @@ class InlineViewZonesComputer extends ViewZonesComputer { ]); } } + maxCharsPerLine += this.modifiedEditorConfiguration.viewInfo.scrollBeyondLastColumn; let domNode = document.createElement('div'); domNode.className = 'view-lines line-delete'; @@ -1960,12 +1963,13 @@ class InlineViewZonesComputer extends ViewZonesComputer { shouldNotShrink: true, afterLineNumber: (lineChange.modifiedEndLineNumber === 0 ? lineChange.modifiedStartLineNumber : lineChange.modifiedStartLineNumber - 1), heightInLines: lineChangeOriginalLength, + minWidthInPx: (maxCharsPerLine * typicalHalfwidthCharacterWidth), domNode: domNode, marginDomNode: marginDomNode }; } - private _renderOriginalLine(count: number, originalModel: ITextModel, config: editorOptions.InternalEditorOptions, tabSize: number, lineNumber: number, decorations: InlineDecoration[], sb: IStringBuilder): void { + private _renderOriginalLine(count: number, originalModel: ITextModel, config: editorOptions.InternalEditorOptions, tabSize: number, lineNumber: number, decorations: InlineDecoration[], sb: IStringBuilder): number { const lineTokens = originalModel.getLineTokens(lineNumber); const lineContent = lineTokens.getLineContent(); @@ -1982,7 +1986,7 @@ class InlineViewZonesComputer extends ViewZonesComputer { const isBasicASCII = ViewLineRenderingData.isBasicASCII(lineContent, originalModel.mightContainNonBasicASCII()); const containsRTL = ViewLineRenderingData.containsRTL(lineContent, isBasicASCII, originalModel.mightContainRTL()); - renderViewLine(new RenderLineInput( + const output = renderViewLine(new RenderLineInput( (config.fontInfo.isMonospace && !config.viewInfo.disableMonospaceOptimizations), lineContent, isBasicASCII, @@ -1999,6 +2003,9 @@ class InlineViewZonesComputer extends ViewZonesComputer { ), sb); sb.appendASCIIString('
    '); + + const absoluteOffsets = output.characterMapping.getAbsoluteOffsets(); + return absoluteOffsets.length > 0 ? absoluteOffsets[absoluteOffsets.length - 1] : 0; } } diff --git a/src/vs/editor/common/viewLayout/linesLayout.ts b/src/vs/editor/common/viewLayout/linesLayout.ts index 324450d4f52..2d917534369 100644 --- a/src/vs/editor/common/viewLayout/linesLayout.ts +++ b/src/vs/editor/common/viewLayout/linesLayout.ts @@ -64,8 +64,8 @@ export class LinesLayout { * @param heightInPx The height of the whitespace, in pixels. * @return An id that can be used later to mutate or delete the whitespace */ - public insertWhitespace(afterLineNumber: number, ordinal: number, heightInPx: number): number { - return this._whitespaces.insertWhitespace(afterLineNumber, ordinal, heightInPx); + public insertWhitespace(afterLineNumber: number, ordinal: number, heightInPx: number, minWidth: number): number { + return this._whitespaces.insertWhitespace(afterLineNumber, ordinal, heightInPx, minWidth); } /** @@ -155,6 +155,10 @@ export class LinesLayout { return this._whitespaces.getCount() > 0; } + public getWhitespaceMinWidth(): number { + return this._whitespaces.getMinWidth(); + } + /** * Check if `verticalOffset` is below all lines. */ diff --git a/src/vs/editor/common/viewLayout/viewLayout.ts b/src/vs/editor/common/viewLayout/viewLayout.ts index b67e48873bc..693162c10dc 100644 --- a/src/vs/editor/common/viewLayout/viewLayout.ts +++ b/src/vs/editor/common/viewLayout/viewLayout.ts @@ -142,7 +142,8 @@ export class ViewLayout extends Disposable implements IViewLayout { let isViewportWrapping = this._configuration.editor.wrappingInfo.isViewportWrapping; if (!isViewportWrapping) { const extraHorizontalSpace = this._configuration.editor.viewInfo.scrollBeyondLastColumn * this._configuration.editor.fontInfo.typicalHalfwidthCharacterWidth; - return Math.max(maxLineWidth + extraHorizontalSpace, viewportWidth); + const whitespaceMinWidth = this._linesLayout.getWhitespaceMinWidth(); + return Math.max(maxLineWidth + extraHorizontalSpace, viewportWidth, whitespaceMinWidth); } return Math.max(maxLineWidth, viewportWidth); } @@ -173,8 +174,8 @@ export class ViewLayout extends Disposable implements IViewLayout { // ---- IVerticalLayoutProvider - public addWhitespace(afterLineNumber: number, ordinal: number, height: number): number { - return this._linesLayout.insertWhitespace(afterLineNumber, ordinal, height); + public addWhitespace(afterLineNumber: number, ordinal: number, height: number, minWidth: number): number { + return this._linesLayout.insertWhitespace(afterLineNumber, ordinal, height, minWidth); } public changeWhitespace(id: number, newAfterLineNumber: number, newHeight: number): boolean { return this._linesLayout.changeWhitespace(id, newAfterLineNumber, newHeight); diff --git a/src/vs/editor/common/viewLayout/whitespaceComputer.ts b/src/vs/editor/common/viewLayout/whitespaceComputer.ts index cc06e51f057..169523f8aba 100644 --- a/src/vs/editor/common/viewLayout/whitespaceComputer.ts +++ b/src/vs/editor/common/viewLayout/whitespaceComputer.ts @@ -21,6 +21,11 @@ export class WhitespaceComputer { */ private _heights: number[]; + /** + * minWidths[i] is the min width in pixels for whitespace at index i + */ + private _minWidths: number[]; + /** * afterLineNumbers[i] is the line number whitespace at index i is after */ @@ -58,8 +63,11 @@ export class WhitespaceComputer { */ private _lastWhitespaceId: number; + private _minWidth: number; + constructor() { this._heights = []; + this._minWidths = []; this._ids = []; this._afterLineNumbers = []; this._ordinals = []; @@ -67,6 +75,7 @@ export class WhitespaceComputer { this._prefixSumValidIndex = -1; this._whitespaceId2Index = {}; this._lastWhitespaceId = 0; + this._minWidth = -1; /* marker for not being computed */ } /** @@ -105,25 +114,29 @@ export class WhitespaceComputer { * @param heightInPx The height of the whitespace, in pixels. * @return An id that can be used later to mutate or delete the whitespace */ - public insertWhitespace(afterLineNumber: number, ordinal: number, heightInPx: number): number { + public insertWhitespace(afterLineNumber: number, ordinal: number, heightInPx: number, minWidth: number): number { afterLineNumber = afterLineNumber | 0; ordinal = ordinal | 0; heightInPx = heightInPx | 0; + minWidth = minWidth | 0; let id = (++this._lastWhitespaceId); let insertionIndex = WhitespaceComputer.findInsertionIndex(this._afterLineNumbers, afterLineNumber, this._ordinals, ordinal); - this._insertWhitespaceAtIndex(id, insertionIndex, afterLineNumber, ordinal, heightInPx); + this._insertWhitespaceAtIndex(id, insertionIndex, afterLineNumber, ordinal, heightInPx, minWidth); + this._minWidth = -1; /* marker for not being computed */ return id; } - private _insertWhitespaceAtIndex(id: number, insertIndex: number, afterLineNumber: number, ordinal: number, heightInPx: number): void { + private _insertWhitespaceAtIndex(id: number, insertIndex: number, afterLineNumber: number, ordinal: number, heightInPx: number, minWidth: number): void { id = id | 0; insertIndex = insertIndex | 0; afterLineNumber = afterLineNumber | 0; ordinal = ordinal | 0; heightInPx = heightInPx | 0; + minWidth = minWidth | 0; this._heights.splice(insertIndex, 0, heightInPx); + this._minWidths.splice(insertIndex, 0, minWidth); this._ids.splice(insertIndex, 0, id); this._afterLineNumbers.splice(insertIndex, 0, afterLineNumber); this._ordinals.splice(insertIndex, 0, ordinal); @@ -202,12 +215,15 @@ export class WhitespaceComputer { // Record old height let heightInPx = this._heights[index]; + // Record old min width + let minWidth = this._minWidths[index]; + // Since changing `afterLineNumber` can trigger a reordering, we're gonna remove this whitespace this.removeWhitespace(id); // And add it again let insertionIndex = WhitespaceComputer.findInsertionIndex(this._afterLineNumbers, newAfterLineNumber, this._ordinals, ordinal); - this._insertWhitespaceAtIndex(id, insertionIndex, newAfterLineNumber, ordinal, heightInPx); + this._insertWhitespaceAtIndex(id, insertionIndex, newAfterLineNumber, ordinal, heightInPx, minWidth); return true; } @@ -230,6 +246,7 @@ export class WhitespaceComputer { let index = this._whitespaceId2Index[sid]; delete this._whitespaceId2Index[sid]; this._removeWhitespaceAtIndex(index); + this._minWidth = -1; /* marker for not being computed */ return true; } @@ -240,6 +257,7 @@ export class WhitespaceComputer { removeIndex = removeIndex | 0; this._heights.splice(removeIndex, 1); + this._minWidths.splice(removeIndex, 1); this._ids.splice(removeIndex, 1); this._afterLineNumbers.splice(removeIndex, 1); this._ordinals.splice(removeIndex, 1); @@ -410,6 +428,20 @@ export class WhitespaceComputer { return this._heights.length; } + /** + * The maximum min width for all whitespaces. + */ + public getMinWidth(): number { + if (this._minWidth === -1) { + let minWidth = 0; + for (let i = 0, len = this._minWidths.length; i < len; i++) { + minWidth = Math.max(minWidth, this._minWidths[i]); + } + this._minWidth = minWidth; + } + return this._minWidth; + } + /** * Get the `afterLineNumber` for whitespace at index `index`. * diff --git a/src/vs/editor/common/viewModel/viewModel.ts b/src/vs/editor/common/viewModel/viewModel.ts index ba1096ea74f..2ad4bb879a4 100644 --- a/src/vs/editor/common/viewModel/viewModel.ts +++ b/src/vs/editor/common/viewModel/viewModel.ts @@ -75,7 +75,7 @@ export interface IViewLayout { * Reserve rendering space. * @return an identifier that can be later used to remove or change the whitespace. */ - addWhitespace(afterLineNumber: number, ordinal: number, height: number): number; + addWhitespace(afterLineNumber: number, ordinal: number, height: number, minWidth: number): number; /** * Change the properties of a whitespace. */ diff --git a/src/vs/editor/test/common/viewLayout/linesLayout.test.ts b/src/vs/editor/test/common/viewLayout/linesLayout.test.ts index bfa6699d0bf..b4a29248b27 100644 --- a/src/vs/editor/test/common/viewLayout/linesLayout.test.ts +++ b/src/vs/editor/test/common/viewLayout/linesLayout.test.ts @@ -41,7 +41,7 @@ suite('Editor ViewLayout - LinesLayout', () => { assert.equal(linesLayout.getLineNumberAtOrAfterVerticalOffset(29), 3); // Add whitespace of height 5px after 2nd line - linesLayout.insertWhitespace(2, 0, 5); + linesLayout.insertWhitespace(2, 0, 5, 0); // lines: [0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1] // whitespace: a(2,5) assert.equal(linesLayout.getLinesTotalHeight(), 105); @@ -65,8 +65,8 @@ suite('Editor ViewLayout - LinesLayout', () => { assert.equal(linesLayout.getLineNumberAtOrAfterVerticalOffset(105), 10); // Add two more whitespaces of height 5px - linesLayout.insertWhitespace(3, 0, 5); - linesLayout.insertWhitespace(4, 0, 5); + linesLayout.insertWhitespace(3, 0, 5, 0); + linesLayout.insertWhitespace(4, 0, 5, 0); // lines: [0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1] // whitespace: a(2,5), b(3, 5), c(4, 5) assert.equal(linesLayout.getLinesTotalHeight(), 115); @@ -122,7 +122,7 @@ suite('Editor ViewLayout - LinesLayout', () => { // Start off with 10 lines and one whitespace after line 2, of height 5 var linesLayout = new LinesLayout(10, 1); - var a = linesLayout.insertWhitespace(2, 0, 5); + var a = linesLayout.insertWhitespace(2, 0, 5, 0); // 10 lines // whitespace: - a(2,5) @@ -218,7 +218,7 @@ suite('Editor ViewLayout - LinesLayout', () => { test('LinesLayout getLineNumberAtOrAfterVerticalOffset', () => { var linesLayout = new LinesLayout(10, 1); - linesLayout.insertWhitespace(6, 0, 10); + linesLayout.insertWhitespace(6, 0, 10, 0); // 10 lines // whitespace: - a(6,10) @@ -267,7 +267,7 @@ suite('Editor ViewLayout - LinesLayout', () => { test('LinesLayout getCenteredLineInViewport', () => { var linesLayout = new LinesLayout(10, 1); - linesLayout.insertWhitespace(6, 0, 10); + linesLayout.insertWhitespace(6, 0, 10, 0); // 10 lines // whitespace: - a(6,10) @@ -350,7 +350,7 @@ suite('Editor ViewLayout - LinesLayout', () => { test('LinesLayout getLinesViewportData 1', () => { var linesLayout = new LinesLayout(10, 10); - linesLayout.insertWhitespace(6, 0, 100); + linesLayout.insertWhitespace(6, 0, 100, 0); // 10 lines // whitespace: - a(6,100) @@ -484,8 +484,8 @@ suite('Editor ViewLayout - LinesLayout', () => { test('LinesLayout getLinesViewportData 2 & getWhitespaceViewportData', () => { var linesLayout = new LinesLayout(10, 10); - var a = linesLayout.insertWhitespace(6, 0, 100); - var b = linesLayout.insertWhitespace(7, 0, 50); + var a = linesLayout.insertWhitespace(6, 0, 100, 0); + var b = linesLayout.insertWhitespace(7, 0, 50, 0); // 10 lines // whitespace: - a(6,100), b(7, 50) @@ -555,8 +555,8 @@ suite('Editor ViewLayout - LinesLayout', () => { test('LinesLayout getWhitespaceAtVerticalOffset', () => { var linesLayout = new LinesLayout(10, 10); - var a = linesLayout.insertWhitespace(6, 0, 100); - var b = linesLayout.insertWhitespace(7, 0, 50); + var a = linesLayout.insertWhitespace(6, 0, 100, 0); + var b = linesLayout.insertWhitespace(7, 0, 50, 0); var whitespace = linesLayout.getWhitespaceAtVerticalOffset(0); assert.equal(whitespace, null); diff --git a/src/vs/editor/test/common/viewLayout/whitespaceComputer.test.ts b/src/vs/editor/test/common/viewLayout/whitespaceComputer.test.ts index 54109d713d2..dfcb55a7255 100644 --- a/src/vs/editor/test/common/viewLayout/whitespaceComputer.test.ts +++ b/src/vs/editor/test/common/viewLayout/whitespaceComputer.test.ts @@ -14,7 +14,7 @@ suite('Editor ViewLayout - WhitespaceComputer', () => { var whitespaceComputer = new WhitespaceComputer(); // Insert a whitespace after line number 2, of height 10 - var a = whitespaceComputer.insertWhitespace(2, 0, 10); + var a = whitespaceComputer.insertWhitespace(2, 0, 10, 0); // whitespaces: a(2, 10) assert.equal(whitespaceComputer.getCount(), 1); assert.equal(whitespaceComputer.getAfterLineNumberForWhitespaceIndex(0), 2); @@ -27,7 +27,7 @@ suite('Editor ViewLayout - WhitespaceComputer', () => { assert.equal(whitespaceComputer.getAccumulatedHeightBeforeLineNumber(4), 10); // Insert a whitespace again after line number 2, of height 20 - var b = whitespaceComputer.insertWhitespace(2, 0, 20); + var b = whitespaceComputer.insertWhitespace(2, 0, 20, 0); // whitespaces: a(2, 10), b(2, 20) assert.equal(whitespaceComputer.getCount(), 2); assert.equal(whitespaceComputer.getAfterLineNumberForWhitespaceIndex(0), 2); @@ -72,7 +72,7 @@ suite('Editor ViewLayout - WhitespaceComputer', () => { assert.equal(whitespaceComputer.getAccumulatedHeightBeforeLineNumber(4), 10); // Add a whitespace before the first line of height 50 - b = whitespaceComputer.insertWhitespace(0, 0, 50); + b = whitespaceComputer.insertWhitespace(0, 0, 50, 0); // whitespaces: b(0, 50), a(2, 10) assert.equal(whitespaceComputer.getCount(), 2); assert.equal(whitespaceComputer.getAfterLineNumberForWhitespaceIndex(0), 0); @@ -88,7 +88,7 @@ suite('Editor ViewLayout - WhitespaceComputer', () => { assert.equal(whitespaceComputer.getAccumulatedHeightBeforeLineNumber(4), 60); // Add a whitespace after line 4 of height 20 - whitespaceComputer.insertWhitespace(4, 0, 20); + whitespaceComputer.insertWhitespace(4, 0, 20, 0); // whitespaces: b(0, 50), a(2, 10), c(4, 20) assert.equal(whitespaceComputer.getCount(), 3); assert.equal(whitespaceComputer.getAfterLineNumberForWhitespaceIndex(0), 0); @@ -108,7 +108,7 @@ suite('Editor ViewLayout - WhitespaceComputer', () => { assert.equal(whitespaceComputer.getAccumulatedHeightBeforeLineNumber(5), 80); // Add a whitespace after line 3 of height 30 - whitespaceComputer.insertWhitespace(3, 0, 30); + whitespaceComputer.insertWhitespace(3, 0, 30, 0); // whitespaces: b(0, 50), a(2, 10), d(3, 30), c(4, 20) assert.equal(whitespaceComputer.getCount(), 4); assert.equal(whitespaceComputer.getAfterLineNumberForWhitespaceIndex(0), 0); @@ -379,9 +379,9 @@ suite('Editor ViewLayout - WhitespaceComputer', () => { test('WhitespaceComputer changeWhitespaceAfterLineNumber & getFirstWhitespaceIndexAfterLineNumber', () => { var whitespaceComputer = new WhitespaceComputer(); - var a = whitespaceComputer.insertWhitespace(0, 0, 1); - var b = whitespaceComputer.insertWhitespace(7, 0, 1); - var c = whitespaceComputer.insertWhitespace(3, 0, 1); + var a = whitespaceComputer.insertWhitespace(0, 0, 1, 0); + var b = whitespaceComputer.insertWhitespace(7, 0, 1, 0); + var c = whitespaceComputer.insertWhitespace(3, 0, 1, 0); assert.equal(whitespaceComputer.getIdForWhitespaceIndex(0), a); // 0 assert.equal(whitespaceComputer.getAfterLineNumberForWhitespaceIndex(0), 0); @@ -504,32 +504,32 @@ suite('Editor ViewLayout - WhitespaceComputer', () => { test('WhitespaceComputer Bug', () => { var whitespaceComputer = new WhitespaceComputer(); - var a = whitespaceComputer.insertWhitespace(0, 0, 1); - var b = whitespaceComputer.insertWhitespace(7, 0, 1); + var a = whitespaceComputer.insertWhitespace(0, 0, 1, 0); + var b = whitespaceComputer.insertWhitespace(7, 0, 1, 0); assert.equal(whitespaceComputer.getIdForWhitespaceIndex(0), a); // 0 assert.equal(whitespaceComputer.getIdForWhitespaceIndex(1), b); // 7 - var c = whitespaceComputer.insertWhitespace(3, 0, 1); + var c = whitespaceComputer.insertWhitespace(3, 0, 1, 0); assert.equal(whitespaceComputer.getIdForWhitespaceIndex(0), a); // 0 assert.equal(whitespaceComputer.getIdForWhitespaceIndex(1), c); // 3 assert.equal(whitespaceComputer.getIdForWhitespaceIndex(2), b); // 7 - var d = whitespaceComputer.insertWhitespace(2, 0, 1); + var d = whitespaceComputer.insertWhitespace(2, 0, 1, 0); assert.equal(whitespaceComputer.getIdForWhitespaceIndex(0), a); // 0 assert.equal(whitespaceComputer.getIdForWhitespaceIndex(1), d); // 2 assert.equal(whitespaceComputer.getIdForWhitespaceIndex(2), c); // 3 assert.equal(whitespaceComputer.getIdForWhitespaceIndex(3), b); // 7 - var e = whitespaceComputer.insertWhitespace(8, 0, 1); + var e = whitespaceComputer.insertWhitespace(8, 0, 1, 0); assert.equal(whitespaceComputer.getIdForWhitespaceIndex(0), a); // 0 assert.equal(whitespaceComputer.getIdForWhitespaceIndex(1), d); // 2 assert.equal(whitespaceComputer.getIdForWhitespaceIndex(2), c); // 3 assert.equal(whitespaceComputer.getIdForWhitespaceIndex(3), b); // 7 assert.equal(whitespaceComputer.getIdForWhitespaceIndex(4), e); // 8 - var f = whitespaceComputer.insertWhitespace(11, 0, 1); + var f = whitespaceComputer.insertWhitespace(11, 0, 1, 0); assert.equal(whitespaceComputer.getIdForWhitespaceIndex(0), a); // 0 assert.equal(whitespaceComputer.getIdForWhitespaceIndex(1), d); // 2 assert.equal(whitespaceComputer.getIdForWhitespaceIndex(2), c); // 3 @@ -537,7 +537,7 @@ suite('Editor ViewLayout - WhitespaceComputer', () => { assert.equal(whitespaceComputer.getIdForWhitespaceIndex(4), e); // 8 assert.equal(whitespaceComputer.getIdForWhitespaceIndex(5), f); // 11 - var g = whitespaceComputer.insertWhitespace(10, 0, 1); + var g = whitespaceComputer.insertWhitespace(10, 0, 1, 0); assert.equal(whitespaceComputer.getIdForWhitespaceIndex(0), a); // 0 assert.equal(whitespaceComputer.getIdForWhitespaceIndex(1), d); // 2 assert.equal(whitespaceComputer.getIdForWhitespaceIndex(2), c); // 3 @@ -546,7 +546,7 @@ suite('Editor ViewLayout - WhitespaceComputer', () => { assert.equal(whitespaceComputer.getIdForWhitespaceIndex(5), g); // 10 assert.equal(whitespaceComputer.getIdForWhitespaceIndex(6), f); // 11 - var h = whitespaceComputer.insertWhitespace(0, 0, 1); + var h = whitespaceComputer.insertWhitespace(0, 0, 1, 0); assert.equal(whitespaceComputer.getIdForWhitespaceIndex(0), a); // 0 assert.equal(whitespaceComputer.getIdForWhitespaceIndex(1), h); // 0 assert.equal(whitespaceComputer.getIdForWhitespaceIndex(2), d); // 2 diff --git a/src/vs/monaco.d.ts b/src/vs/monaco.d.ts index f13a380b04a..982c5add923 100644 --- a/src/vs/monaco.d.ts +++ b/src/vs/monaco.d.ts @@ -3340,6 +3340,11 @@ declare namespace monaco.editor { * If neither `heightInPx` nor `heightInLines` is specified, a default of `heightInLines` = 1 will be chosen. */ heightInPx?: number; + /** + * The minimum width in px of the view zone. + * If this is set, the editor will ensure that the scroll width is >= than this value. + */ + minWidthInPx?: number; /** * The dom node of the view zone */ From 29bead35f2a5339482158a7d48f7f0f3955629e2 Mon Sep 17 00:00:00 2001 From: Alex Dima Date: Fri, 27 Apr 2018 19:44:53 +0200 Subject: [PATCH 186/830] Fix tests --- .../common/config/commonEditorConfig.test.ts | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/src/vs/editor/test/common/config/commonEditorConfig.test.ts b/src/vs/editor/test/common/config/commonEditorConfig.test.ts index ef16d492ef5..ca6db025c79 100644 --- a/src/vs/editor/test/common/config/commonEditorConfig.test.ts +++ b/src/vs/editor/test/common/config/commonEditorConfig.test.ts @@ -32,25 +32,25 @@ suite('Common Editor Config', () => { assert.equal(zoom.getZoomLevel(), 9); zoom.setZoomLevel(-9); - assert.equal(zoom.getZoomLevel(), -9); + assert.equal(zoom.getZoomLevel(), -5); - zoom.setZoomLevel(10); - assert.equal(zoom.getZoomLevel(), 9); + zoom.setZoomLevel(20); + assert.equal(zoom.getZoomLevel(), 20); zoom.setZoomLevel(-10); - assert.equal(zoom.getZoomLevel(), -9); + assert.equal(zoom.getZoomLevel(), -5); zoom.setZoomLevel(9.1); - assert.equal(zoom.getZoomLevel(), 9); + assert.equal(zoom.getZoomLevel(), 9.1); zoom.setZoomLevel(-9.1); - assert.equal(zoom.getZoomLevel(), -9); + assert.equal(zoom.getZoomLevel(), -5); zoom.setZoomLevel(Infinity); - assert.equal(zoom.getZoomLevel(), 9); + assert.equal(zoom.getZoomLevel(), 20); zoom.setZoomLevel(Number.NEGATIVE_INFINITY); - assert.equal(zoom.getZoomLevel(), -9); + assert.equal(zoom.getZoomLevel(), -5); }); class TestWrappingConfiguration extends TestConfiguration { From 871e8a08e82ee13905610fdd2b6a3078b39816b6 Mon Sep 17 00:00:00 2001 From: Rob Lourens Date: Fri, 27 Apr 2018 12:49:33 -0700 Subject: [PATCH 187/830] Fix settings editor checkboxes, styling. #3355 --- .../browser/media/settingsEditor2.css | 30 ++++++++++++------- .../preferences/browser/settingsEditor2.ts | 22 +++++++------- 2 files changed, 31 insertions(+), 21 deletions(-) diff --git a/src/vs/workbench/parts/preferences/browser/media/settingsEditor2.css b/src/vs/workbench/parts/preferences/browser/media/settingsEditor2.css index 6b334ce3689..c2163f7701e 100644 --- a/src/vs/workbench/parts/preferences/browser/media/settingsEditor2.css +++ b/src/vs/workbench/parts/preferences/browser/media/settingsEditor2.css @@ -35,6 +35,7 @@ .settings-editor > .settings-header > .settings-header-controls { margin-top: 7px; + height: 30px; display: flex; } @@ -46,6 +47,11 @@ margin-left: 33px; } +.settings-editor > .settings-header .settings-tabs-widget .monaco-action-bar .action-item .dropdown-icon { + /** The tab widget container height is shorter than elsewhere, need to tweak this */ + padding-top: 3px; +} + .settings-editor > .settings-header > .settings-header-controls .settings-header-controls-right { display: flex; } @@ -62,6 +68,7 @@ white-space: nowrap; padding: 4px 10px; margin-right: 10px; + height: 26px; } .settings-editor > .settings-body .settings-list-container .settings-list-offset-helper { @@ -145,18 +152,19 @@ height: 26px; } -.settings-editor > .settings-body > .settings-list-container .monaco-list-row .monaco-custom-checkbox.unchecked { - background: url("action-remove.svg") center center no-repeat; - /* Unchecked border style needs to be stylable on checkbox. Themeable? */ - border-color: #75715e !important; -} - -.settings-editor > .settings-body > .settings-list-container .monaco-list-row .monaco-custom-checkbox.checked { - background: url("action-remove-focus.svg") center center no-repeat; -} - -.settings-editor > .settings-body > .settings-list-container .monaco-list-row .monaco-custom-checkbox { +.settings-editor > .settings-body > .settings-list-container .monaco-list-row .setting-value-checkbox { margin-left: auto; + position: relative; +} + +.settings-editor > .settings-body > .settings-list-container .monaco-list-row.is-configured .setting-value-checkbox::after { + content: ' '; + display: block; + height: 3px; + width: 18px; + position: absolute; + top: 15px; + left: -3px; } .settings-editor > .settings-body > .settings-list-container .monaco-list-row .setting-item-value > .setting-reset-button.monaco-button { diff --git a/src/vs/workbench/parts/preferences/browser/settingsEditor2.ts b/src/vs/workbench/parts/preferences/browser/settingsEditor2.ts index 444904fc12c..d5c0ffa18e7 100644 --- a/src/vs/workbench/parts/preferences/browser/settingsEditor2.ts +++ b/src/vs/workbench/parts/preferences/browser/settingsEditor2.ts @@ -4,7 +4,6 @@ *--------------------------------------------------------------------------------------------*/ import * as DOM from 'vs/base/browser/dom'; -import { Checkbox } from 'vs/base/browser/ui/checkbox/checkbox'; import { InputBox } from 'vs/base/browser/ui/inputbox/inputBox'; import { IDelegate, IRenderer } from 'vs/base/browser/ui/list/list'; import { List } from 'vs/base/browser/ui/list/listWidget'; @@ -24,7 +23,7 @@ import { IInstantiationService } from 'vs/platform/instantiation/common/instanti import { WorkbenchList } from 'vs/platform/list/browser/listService'; import { ITelemetryService } from 'vs/platform/telemetry/common/telemetry'; import { attachInputBoxStyler, attachSelectBoxStyler, attachButtonStyler } from 'vs/platform/theme/common/styler'; -import { IThemeService } from 'vs/platform/theme/common/themeService'; +import { IThemeService, registerThemingParticipant, ITheme, ICssStyleCollector } from 'vs/platform/theme/common/themeService'; import { BaseEditor } from 'vs/workbench/browser/parts/editor/baseEditor'; import { EditorOptions } from 'vs/workbench/common/editor'; import { SearchWidget, SettingsTargetsWidget } from 'vs/workbench/parts/preferences/browser/preferencesWidgets'; @@ -650,15 +649,11 @@ class SettingItemRenderer implements IRenderer void): void { - const checkbox = new Checkbox({ - isChecked: entry.value, - title: entry.key, - onChange: e => onChange(checkbox.checked), - actionClassName: 'setting-value-checkbox' - }); - template.toDispose.push(checkbox); + const checkboxElement = DOM.append(template.valueElement, $('input.setting-value-checkbox')); + checkboxElement.type = 'checkbox'; + checkboxElement.checked = entry.value; - template.valueElement.appendChild(checkbox.domNode); + template.toDispose.push(DOM.addDisposableListener(checkboxElement, 'change', e => onChange(checkboxElement.checked))); } private renderEnum(entry: ISettingItemEntry, template: ISettingItemTemplate, onChange: (value: string) => void): void { @@ -763,3 +758,10 @@ function settingKeyToLabel(key: string): string { .replace(/^[a-z]/g, match => match.toUpperCase()) // foo => Foo .replace(/ [a-z]/g, match => match.toUpperCase()); // Foo bar => Foo Bar } + +registerThemingParticipant((theme: ITheme, collector: ICssStyleCollector) => { + const configuredItemBackgroundColor = theme.getColor(configuredItemBackground); + if (configuredItemBackgroundColor) { + collector.addRule(`.settings-editor > .settings-body > .settings-list-container .monaco-list-row.is-configured .setting-value-checkbox::after { background-color: ${configuredItemBackgroundColor}; }`); + } +}); From 240b485783b52923e6d6ca99cac8ff0466cf3cf4 Mon Sep 17 00:00:00 2001 From: Joao Moreno Date: Fri, 27 Apr 2018 22:38:27 +0200 Subject: [PATCH 188/830] remove experiment --- src/vs/base/browser/ui/splitview/grid.ts | 149 ----------------------- test/grid.html | 59 --------- 2 files changed, 208 deletions(-) delete mode 100644 src/vs/base/browser/ui/splitview/grid.ts delete mode 100644 test/grid.html diff --git a/src/vs/base/browser/ui/splitview/grid.ts b/src/vs/base/browser/ui/splitview/grid.ts deleted file mode 100644 index 8b1a537955d..00000000000 --- a/src/vs/base/browser/ui/splitview/grid.ts +++ /dev/null @@ -1,149 +0,0 @@ -/*--------------------------------------------------------------------------------------------- - * Copyright (c) Microsoft Corporation. All rights reserved. - * Licensed under the MIT License. See License.txt in the project root for license information. - *--------------------------------------------------------------------------------------------*/ - -'use strict'; - -import { Event, anyEvent } from 'vs/base/common/event'; -import { Orientation } from 'vs/base/browser/ui/sash/sash'; -import { append, $ } from 'vs/base/browser/dom'; -import { SplitView, IView } from 'vs/base/browser/ui/splitview/splitview'; -export { Orientation } from 'vs/base/browser/ui/sash/sash'; - -export class GridNode implements IView { - - get minimumSize(): number { - let result = 0; - - for (const child of this.children) { - for (const grandchild of child.children) { - result += grandchild.minimumSize; - } - } - - return result === 0 ? 50 : result; - } - - readonly maximumSize = Number.MAX_VALUE; - - private _onDidChange: Event = Event.None; - get onDidChange(): Event { - return this._onDidChange; - } - - protected orientation: Orientation | undefined; - protected size: number | undefined; - protected orthogonalSize: number | undefined; - private splitview: SplitView | undefined; - private children: GridNode[] = []; - private color: string | undefined; - - constructor(private parent?: GridNode, orthogonalSize?: number, color?: string) { - this.orthogonalSize = orthogonalSize; - this.color = color || `hsl(${Math.round(Math.random() * 360)}, 72%, 72%)`; - } - - render(container: HTMLElement): void { - container = append(container, $('.node')); - container.style.backgroundColor = this.color; - - append(container, $('.action', { onclick: () => this.split(container, Orientation.HORIZONTAL) }, '⬌')); - append(container, $('.action', { onclick: () => this.split(container, Orientation.VERTICAL) }, '⬍')); - } - - protected split(container: HTMLElement, orientation: Orientation): void { - if (this.parent && this.parent.orientation === orientation) { - const index = this.parent.children.indexOf(this); - this.parent.addChild(this.size / 2, this.orthogonalSize, index + 1); - } else { - this.branch(container, orientation); - } - } - - protected branch(container: HTMLElement, orientation: Orientation): void { - this.orientation = orientation; - container.innerHTML = ''; - - this.splitview = new SplitView(container, { orientation }); - this.layout(this.size); - this.orthogonalLayout(this.orthogonalSize); - - this.addChild(this.orthogonalSize / 2, this.size, 0, this.color); - this.addChild(this.orthogonalSize / 2, this.size); - } - - layout(size: number): void { - this.size = size; - - for (const child of this.children) { - child.orthogonalLayout(size); - } - } - - orthogonalLayout(size: number): void { - this.orthogonalSize = size; - - if (this.splitview) { - this.splitview.layout(size); - } - } - - private addChild(size: number, orthogonalSize: number, index?: number, color?: string): void { - const child = new GridNode(this, orthogonalSize, color); - this.splitview.addView(child, size, index); - - if (typeof index === 'number') { - this.children.splice(index, 0, child); - } else { - this.children.push(child); - } - - this._onDidChange = anyEvent(...this.children.map(c => c.onDidChange)); - } -} - -export class RootGridNode extends GridNode { - - private width: number; - private height: number; - - protected branch(container: HTMLElement, orientation: Orientation): void { - if (orientation === Orientation.VERTICAL) { - this.size = this.width; - this.orthogonalSize = this.height; - } else { - this.size = this.height; - this.orthogonalSize = this.width; - } - - super.branch(container, orientation); - } - - layoutBox(width: number, height: number): void { - if (this.orientation === Orientation.VERTICAL) { - this.layout(width); - this.orthogonalLayout(height); - } else if (this.orientation === Orientation.HORIZONTAL) { - this.layout(height); - this.orthogonalLayout(width); - } else { - this.width = width; - this.height = height; - } - } -} - -export class Grid { - - private root: RootGridNode; - - constructor(container: HTMLElement) { - this.root = new RootGridNode(); - this.root.render(container); - } - - layout(width: number, height: number): void { - this.root.layoutBox(width, height); - } -} diff --git a/test/grid.html b/test/grid.html deleted file mode 100644 index a455621fea8..00000000000 --- a/test/grid.html +++ /dev/null @@ -1,59 +0,0 @@ - - - - - - - Grid Example - - - - - - - - - - - \ No newline at end of file From 5ac83b84270692bf3678bf2de28fdb60181519cd Mon Sep 17 00:00:00 2001 From: Rob Lourens Date: Fri, 27 Apr 2018 14:00:57 -0700 Subject: [PATCH 189/830] #3355 - open correct settings scope when "open config file" is pressed --- .../parts/preferences/browser/settingsEditor2.ts | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-) diff --git a/src/vs/workbench/parts/preferences/browser/settingsEditor2.ts b/src/vs/workbench/parts/preferences/browser/settingsEditor2.ts index d5c0ffa18e7..b1868472b51 100644 --- a/src/vs/workbench/parts/preferences/browser/settingsEditor2.ts +++ b/src/vs/workbench/parts/preferences/browser/settingsEditor2.ts @@ -36,6 +36,7 @@ import { IProgressService } from 'vs/platform/progress/common/progress'; import { isPromiseCanceledError, getErrorMessage } from 'vs/base/common/errors'; import { ILogService } from 'vs/platform/log/common/log'; import { registerColor } from 'vs/platform/theme/common/colorRegistry'; +import { IEditor } from 'vs/platform/editor/common/editor'; const SETTINGS_ENTRY_TEMPLATE_ID = 'settings.entry.template'; const SETTINGS_GROUP_ENTRY_TEMPLATE_ID = 'settings.group.template'; @@ -213,7 +214,19 @@ export class SettingsEditor2 extends BaseEditor { openSettingsButton.label = localize('openSettingsLabel', "Open config file"); openSettingsButton.element.classList.add('open-settings-button'); - this._register(openSettingsButton.onDidClick(() => this.preferencesService.openGlobalSettings())); + this._register(openSettingsButton.onDidClick(() => this.openSettingsFile())); + } + + private openSettingsFile(): TPromise { + const currentSettingsTarget = this.settingsTargetsWidget.settingsTarget; + + if (currentSettingsTarget === ConfigurationTarget.USER) { + return this.preferencesService.openGlobalSettings(); + } else if (currentSettingsTarget === ConfigurationTarget.WORKSPACE) { + return this.preferencesService.openWorkspaceSettings(); + } else { + return this.preferencesService.openFolderSettings(currentSettingsTarget); + } } private createBody(parent: HTMLElement): void { From f2bf3adb19f4b03c12eeee1f48058489922ff374 Mon Sep 17 00:00:00 2001 From: Rob Lourens Date: Fri, 27 Apr 2018 14:35:00 -0700 Subject: [PATCH 190/830] #3355 - Maintain focus across a settings list render --- .../preferences/browser/settingsEditor2.ts | 95 +++++++++++-------- 1 file changed, 53 insertions(+), 42 deletions(-) diff --git a/src/vs/workbench/parts/preferences/browser/settingsEditor2.ts b/src/vs/workbench/parts/preferences/browser/settingsEditor2.ts index b1868472b51..8cba5f3d993 100644 --- a/src/vs/workbench/parts/preferences/browser/settingsEditor2.ts +++ b/src/vs/workbench/parts/preferences/browser/settingsEditor2.ts @@ -273,11 +273,8 @@ export class SettingsEditor2 extends BaseEditor { } private onDidChangeSetting(key: string, value: any): void { - this.configurationService.updateValue(key, value, this.settingsTargetsWidget.settingsTarget).then( - () => this.render(), - e => { - // ConfigurationService displays the error - }); + // ConfigurationService displays the error + this.configurationService.updateValue(key, value, this.settingsTargetsWidget.settingsTarget); } private render(): TPromise { @@ -445,48 +442,62 @@ export class SettingsEditor2 extends BaseEditor { } private renderEntries(): void { - if (this.defaultSettingsEditorModel) { + if (!this.defaultSettingsEditorModel) { + return; + } - const entries: IListEntry[] = []; - for (let groupIdx = 0; groupIdx < this.defaultSettingsEditorModel.settingsGroups.length; groupIdx++) { - if (groupIdx > 0 && !(this.showAllSettings)) { - break; - } + const focusedRowItem = DOM.findParentWithClass(document.activeElement, 'monaco-list-row'); + const focusedRowId = focusedRowItem && focusedRowItem.id; - const group = this.defaultSettingsEditorModel.settingsGroups[groupIdx]; - const groupEntries = []; - for (const section of group.sections) { - for (const setting of section.settings) { - const entry = this.settingToEntry(setting); - if (!this.showConfiguredSettingsOnly || (this.showConfiguredSettingsOnly && entry.isConfigured)) { - groupEntries.push(entry); - } + const entries: IListEntry[] = []; + for (let groupIdx = 0; groupIdx < this.defaultSettingsEditorModel.settingsGroups.length; groupIdx++) { + if (groupIdx > 0 && !(this.showAllSettings)) { + break; + } + + const group = this.defaultSettingsEditorModel.settingsGroups[groupIdx]; + const groupEntries = []; + for (const section of group.sections) { + for (const setting of section.settings) { + const entry = this.settingToEntry(setting); + if (!this.showConfiguredSettingsOnly || (this.showConfiguredSettingsOnly && entry.isConfigured)) { + groupEntries.push(entry); } } - - if (groupEntries.length) { - entries.push({ - id: group.id, - templateId: SETTINGS_GROUP_ENTRY_TEMPLATE_ID, - title: group.title - }); - - entries.push(...groupEntries); - } - - if (groupIdx === 0) { - const showAllSettingsLabel = this.showAllSettings ? - localize('showFewerSettingsLabel', "Show Fewer Settings") : - localize('showAllSettingsLabel', "Show All Settings"); - entries.push({ - id: ALL_SETTINGS_BUTTON_ID, - label: showAllSettingsLabel, - templateId: BUTTON_ROW_ENTRY_TEMPLATE - }); - } } - this.settingsList.splice(0, this.settingsList.length, entries); + if (groupEntries.length) { + entries.push({ + id: group.id, + templateId: SETTINGS_GROUP_ENTRY_TEMPLATE_ID, + title: group.title + }); + + entries.push(...groupEntries); + } + + if (groupIdx === 0) { + const showAllSettingsLabel = this.showAllSettings ? + localize('showFewerSettingsLabel', "Show Fewer Settings") : + localize('showAllSettingsLabel', "Show All Settings"); + entries.push({ + id: ALL_SETTINGS_BUTTON_ID, + label: showAllSettingsLabel, + templateId: BUTTON_ROW_ENTRY_TEMPLATE + }); + } + } + + this.settingsList.splice(0, this.settingsList.length, entries); + + // Hack to restore the same focused element after editing. + // TODO@roblou figure out the whole keyboard navigation story + if (focusedRowId) { + const rowSelector = `.monaco-list-row#${focusedRowId}`; + const inputElementToFocus: HTMLElement = this.settingsListContainer.querySelector(`${rowSelector} input, ${rowSelector} select`); + if (inputElementToFocus) { + inputElementToFocus.focus(); + } } } @@ -662,7 +673,7 @@ class SettingItemRenderer implements IRenderer void): void { - const checkboxElement = DOM.append(template.valueElement, $('input.setting-value-checkbox')); + const checkboxElement = DOM.append(template.valueElement, $('input.setting-value-checkbox.setting-value-input')); checkboxElement.type = 'checkbox'; checkboxElement.checked = entry.value; From 4090c6f793d7948c7f383d9bb38a37f33ac17d1f Mon Sep 17 00:00:00 2001 From: Rob Lourens Date: Fri, 27 Apr 2018 14:38:11 -0700 Subject: [PATCH 191/830] #3355 - Keep setting value width, shrink description first --- .../parts/preferences/browser/media/settingsEditor2.css | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/vs/workbench/parts/preferences/browser/media/settingsEditor2.css b/src/vs/workbench/parts/preferences/browser/media/settingsEditor2.css index c2163f7701e..b6964662e04 100644 --- a/src/vs/workbench/parts/preferences/browser/media/settingsEditor2.css +++ b/src/vs/workbench/parts/preferences/browser/media/settingsEditor2.css @@ -105,11 +105,11 @@ } .settings-editor > .settings-body > .settings-list-container .monaco-list-row > .setting-item-container > .setting-item-left { - width: 600px; + flex: 1; } .settings-editor > .settings-body > .settings-list-container .monaco-list-row > .setting-item-container > .setting-item-right { - flex: 1; + min-width: 180px; margin: 21px 10px; } From 3c053a5153566de115ad022b3628de25e97a71f9 Mon Sep 17 00:00:00 2001 From: Joao Moreno Date: Fri, 27 Apr 2018 23:57:52 +0200 Subject: [PATCH 192/830] wip: splitview without render --- src/vs/base/browser/ui/splitview/panelview.ts | 19 ++++++++----------- src/vs/base/browser/ui/splitview/splitview.ts | 4 ++-- .../browser/ui/splitview/splitview.test.ts | 17 ++++++++--------- .../browser/parts/views/panelViewlet.ts | 6 +++--- .../parts/scm/electron-browser/scmViewlet.ts | 4 ++-- .../parts/terminal/browser/terminalTab.ts | 17 +++++++---------- 6 files changed, 30 insertions(+), 37 deletions(-) diff --git a/src/vs/base/browser/ui/splitview/panelview.ts b/src/vs/base/browser/ui/splitview/panelview.ts index d7079513a78..df6af706446 100644 --- a/src/vs/base/browser/ui/splitview/panelview.ts +++ b/src/vs/base/browser/ui/splitview/panelview.ts @@ -42,23 +42,19 @@ export abstract class Panel implements IView { private ariaHeaderLabel: string; private styles: IPanelStyles | undefined = undefined; - private el: HTMLElement; + readonly element: HTMLElement; private header: HTMLElement; protected disposables: IDisposable[] = []; private _onDidChange = new Emitter(); readonly onDidChange: Event = this._onDidChange.event; - get element(): HTMLElement { - return this.el; - } - get draggableElement(): HTMLElement { return this.header; } get dropTargetElement(): HTMLElement { - return this.el; + return this.element; } private _dropBackground: Color | undefined; @@ -109,6 +105,9 @@ export abstract class Panel implements IView { this.ariaHeaderLabel = options.ariaHeaderLabel || ''; this._minimumBodySize = typeof options.minimumBodySize === 'number' ? options.minimumBodySize : 120; this._maximumBodySize = typeof options.maximumBodySize === 'number' ? options.maximumBodySize : Number.POSITIVE_INFINITY; + + this.element = $('.panel'); + this.render(); } isExpanded(): boolean { @@ -139,11 +138,9 @@ export abstract class Panel implements IView { this._onDidChange.fire(); } - render(container: HTMLElement): void { - this.el = append(container, $('.panel')); - + protected render(): void { this.header = $('.panel-header'); - append(this.el, this.header); + append(this.element, this.header); this.header.setAttribute('tabindex', '0'); this.header.setAttribute('role', 'toolbar'); this.header.setAttribute('aria-label', this.ariaHeaderLabel); @@ -177,7 +174,7 @@ export abstract class Panel implements IView { // onHeaderKeyDown.filter(e => e.keyCode === KeyCode.DownArrow) // .event(focusNext, this, this.disposables); - const body = append(this.el, $('.panel-body')); + const body = append(this.element, $('.panel-body')); this.renderBody(body); } diff --git a/src/vs/base/browser/ui/splitview/splitview.ts b/src/vs/base/browser/ui/splitview/splitview.ts index 7971784ad65..a1ba96155a9 100644 --- a/src/vs/base/browser/ui/splitview/splitview.ts +++ b/src/vs/base/browser/ui/splitview/splitview.ts @@ -20,10 +20,10 @@ export interface ISplitViewOptions { } export interface IView { + readonly element: HTMLElement; readonly minimumSize: number; readonly maximumSize: number; readonly onDidChange: Event; - render(container: HTMLElement, orientation: Orientation): void; layout(size: number, orientation: Orientation): void; } @@ -169,7 +169,7 @@ export class SplitView implements IDisposable { this.sashItems.splice(index - 1, 0, sashItem); } - view.render(container, this.orientation); + container.appendChild(view.element); this.relayout(index); this.state = State.Idle; } diff --git a/src/vs/base/test/browser/ui/splitview/splitview.test.ts b/src/vs/base/test/browser/ui/splitview/splitview.test.ts index 63c683e689a..870e7063eb1 100644 --- a/src/vs/base/test/browser/ui/splitview/splitview.test.ts +++ b/src/vs/base/test/browser/ui/splitview/splitview.test.ts @@ -19,8 +19,11 @@ class TestView implements IView { get maximumSize(): number { return this._maximumSize; } set maximumSize(size: number) { this._maximumSize = size; this._onDidChange.fire(); } - private _onDidRender = new Emitter<{ container: HTMLElement; orientation: Orientation }>(); - readonly onDidRender = this._onDidRender.event; + private _element: HTMLElement = document.createElement('div'); + get element(): HTMLElement { this._onDidGetElement.fire(); return this._element; } + + private _onDidGetElement = new Emitter(); + readonly onDidGetElement = this._onDidGetElement.event; private _size = 0; get size(): number { return this._size; } @@ -37,10 +40,6 @@ class TestView implements IView { assert(_minimumSize <= _maximumSize, 'splitview view minimum size must be <= maximum size'); } - render(container: HTMLElement, orientation: Orientation): void { - this._onDidRender.fire({ container, orientation }); - } - layout(size: number, orientation: Orientation): void { this._size = size; this._onDidLayout.fire({ size, orientation }); @@ -52,7 +51,7 @@ class TestView implements IView { dispose(): void { this._onDidChange.dispose(); - this._onDidRender.dispose(); + this._onDidGetElement.dispose(); this._onDidLayout.dispose(); this._onDidFocus.dispose(); } @@ -136,7 +135,7 @@ suite('Splitview', () => { const layoutDisposable = view.onDidLayout(() => didLayout = true); let didRender = false; - const renderDisposable = view.onDidRender(() => didRender = true); + const renderDisposable = view.onDidGetElement(() => didRender = true); splitview.addView(view, 20); @@ -322,7 +321,7 @@ suite('Splitview', () => { splitview.addView(view1, 142, 0); assert.equal(view1.size, 986, 'first view is stretched'); - view2.onDidRender(() => { + view2.onDidGetElement(() => { assert.throws(() => splitview.resizeView(1, 922)); assert.throws(() => splitview.resizeView(1, 922)); }); diff --git a/src/vs/workbench/browser/parts/views/panelViewlet.ts b/src/vs/workbench/browser/parts/views/panelViewlet.ts index 1feb682d145..98a400b0198 100644 --- a/src/vs/workbench/browser/parts/views/panelViewlet.ts +++ b/src/vs/workbench/browser/parts/views/panelViewlet.ts @@ -65,10 +65,10 @@ export abstract class ViewletPanel extends Panel { this.actionRunner = options.actionRunner; } - render(container: HTMLElement): void { - super.render(container); + protected render(): void { + super.render(); - const focusTracker = trackFocus(container); + const focusTracker = trackFocus(this.element); this.disposables.push(focusTracker); this.disposables.push(focusTracker.onDidFocus(() => this._onDidFocus.fire())); } diff --git a/src/vs/workbench/parts/scm/electron-browser/scmViewlet.ts b/src/vs/workbench/parts/scm/electron-browser/scmViewlet.ts index dc29571df77..929068c4e3f 100644 --- a/src/vs/workbench/parts/scm/electron-browser/scmViewlet.ts +++ b/src/vs/workbench/parts/scm/electron-browser/scmViewlet.ts @@ -768,8 +768,8 @@ export class RepositoryPanel extends ViewletPanel { this.menus = instantiationService.createInstance(SCMMenus, repository.provider); } - render(container: HTMLElement): void { - super.render(container); + protected render(): void { + super.render(); this.menus.onDidChangeTitle(this.updateActions, this, this.disposables); } diff --git a/src/vs/workbench/parts/terminal/browser/terminalTab.ts b/src/vs/workbench/parts/terminal/browser/terminalTab.ts index 81d906b9fc2..ff96195e5bc 100644 --- a/src/vs/workbench/parts/terminal/browser/terminalTab.ts +++ b/src/vs/workbench/parts/terminal/browser/terminalTab.ts @@ -115,9 +115,8 @@ class SplitPaneContainer { } private _addChild(size: number, instance: ITerminalInstance, index: number): void { - const child = new SplitPane(this.orientation === Orientation.HORIZONTAL ? this._height : this._width); + const child = new SplitPane(instance, this.orientation === Orientation.HORIZONTAL ? this._height : this._width); child.orientation = this.orientation; - child.instance = instance; if (typeof index === 'number') { this._children.splice(index, 0, child); } else { @@ -197,23 +196,21 @@ class SplitPane implements IView { public minimumSize: number = SPLIT_PANE_MIN_SIZE; public maximumSize: number = Number.MAX_VALUE; - public instance: ITerminalInstance; public orientation: Orientation | undefined; protected _size: number; private _onDidChange: Event = Event.None; public get onDidChange(): Event { return this._onDidChange; } + readonly element: HTMLElement; + constructor( + readonly instance: ITerminalInstance, public orthogonalSize: number ) { - } - - public render(container: HTMLElement): void { - if (!container) { - return; - } - this.instance.attachToElement(container); + this.element = document.createElement('div'); + this.element.className = 'terminal-split-pane'; + this.instance.attachToElement(this.element); } public layout(size: number): void { From 9b945201e7466c2320292a58a3fc1e84b2241086 Mon Sep 17 00:00:00 2001 From: Joao Moreno Date: Fri, 27 Apr 2018 23:58:32 +0200 Subject: [PATCH 193/830] splitview: remove render from panel ctor --- src/vs/base/browser/ui/splitview/panelview.ts | 8 +++++--- src/vs/workbench/browser/parts/views/panelViewlet.ts | 2 +- src/vs/workbench/browser/parts/views/viewsViewlet.ts | 9 +++++---- .../parts/scm/electron-browser/scmViewlet.ts | 11 +++++++++-- 4 files changed, 20 insertions(+), 10 deletions(-) diff --git a/src/vs/base/browser/ui/splitview/panelview.ts b/src/vs/base/browser/ui/splitview/panelview.ts index df6af706446..ded88cfc84f 100644 --- a/src/vs/base/browser/ui/splitview/panelview.ts +++ b/src/vs/base/browser/ui/splitview/panelview.ts @@ -30,6 +30,9 @@ export interface IPanelStyles { headerHighContrastBorder?: Color; } +/** + * Remember to call render after ctor + */ export abstract class Panel implements IView { private static readonly HEADER_SIZE = 22; @@ -40,7 +43,7 @@ export abstract class Panel implements IView { private _minimumBodySize: number; private _maximumBodySize: number; private ariaHeaderLabel: string; - private styles: IPanelStyles | undefined = undefined; + private styles: IPanelStyles = {}; readonly element: HTMLElement; private header: HTMLElement; @@ -107,7 +110,6 @@ export abstract class Panel implements IView { this._maximumBodySize = typeof options.maximumBodySize === 'number' ? options.maximumBodySize : Number.POSITIVE_INFINITY; this.element = $('.panel'); - this.render(); } isExpanded(): boolean { @@ -138,7 +140,7 @@ export abstract class Panel implements IView { this._onDidChange.fire(); } - protected render(): void { + render(): void { this.header = $('.panel-header'); append(this.element, this.header); this.header.setAttribute('tabindex', '0'); diff --git a/src/vs/workbench/browser/parts/views/panelViewlet.ts b/src/vs/workbench/browser/parts/views/panelViewlet.ts index 98a400b0198..6e3c1054c28 100644 --- a/src/vs/workbench/browser/parts/views/panelViewlet.ts +++ b/src/vs/workbench/browser/parts/views/panelViewlet.ts @@ -65,7 +65,7 @@ export abstract class ViewletPanel extends Panel { this.actionRunner = options.actionRunner; } - protected render(): void { + render(): void { super.render(); const focusTracker = trackFocus(this.element); diff --git a/src/vs/workbench/browser/parts/views/viewsViewlet.ts b/src/vs/workbench/browser/parts/views/viewsViewlet.ts index 18f58d76c88..254d56bd510 100644 --- a/src/vs/workbench/browser/parts/views/viewsViewlet.ts +++ b/src/vs/workbench/browser/parts/views/viewsViewlet.ts @@ -382,7 +382,7 @@ export class ViewsViewlet extends PanelViewlet implements IViewsViewlet { for (const viewDescriptor of toAdd) { let viewState = this.viewsStates.get(viewDescriptor.id); let index = visible.indexOf(viewDescriptor); - const view = this.createView(viewDescriptor, + const panel = this.createView(viewDescriptor, { id: viewDescriptor.id, name: viewDescriptor.name, @@ -390,10 +390,11 @@ export class ViewsViewlet extends PanelViewlet implements IViewsViewlet { expanded: !(viewState ? viewState.collapsed : viewDescriptor.collapsed), viewletSettings: this.viewletSettings }); - toCreate.push(view); + panel.render(); + toCreate.push(panel); const size = (viewState && viewState.size) || 200; - panelsToAdd.push({ panel: view, size, index }); + panelsToAdd.push({ panel, size, index }); } this.addPanels(panelsToAdd); @@ -586,7 +587,7 @@ export class ViewsViewlet extends PanelViewlet implements IViewsViewlet { } protected createView(viewDescriptor: IViewDescriptor, options: IViewletViewOptions): ViewsViewletPanel { - return this.instantiationService.createInstance(viewDescriptor.ctor, options); + return this.instantiationService.createInstance(viewDescriptor.ctor, options) as ViewsViewletPanel; } protected get views(): ViewsViewletPanel[] { diff --git a/src/vs/workbench/parts/scm/electron-browser/scmViewlet.ts b/src/vs/workbench/parts/scm/electron-browser/scmViewlet.ts index 929068c4e3f..607c9ed2ab9 100644 --- a/src/vs/workbench/parts/scm/electron-browser/scmViewlet.ts +++ b/src/vs/workbench/parts/scm/electron-browser/scmViewlet.ts @@ -768,7 +768,7 @@ export class RepositoryPanel extends ViewletPanel { this.menus = instantiationService.createInstance(SCMMenus, repository.provider); } - protected render(): void { + render(): void { super.render(); this.menus.onDidChangeTitle(this.updateActions, this, this.disposables); } @@ -1168,6 +1168,7 @@ export class SCMViewlet extends PanelViewlet implements IViewModel, IViewsViewle if (shouldMainPanelBeVisible) { this.mainPanel = this.instantiationService.createInstance(MainPanel, this); + this.mainPanel.render(); this.addPanels([{ panel: this.mainPanel, size: this.mainPanel.minimumSize, index: 0 }]); const selectionChangeDisposable = this.mainPanel.onSelectionChange(this.onSelectionChange, this); @@ -1302,7 +1303,11 @@ export class SCMViewlet extends PanelViewlet implements IViewModel, IViewsViewle // Collect new selected panels const newRepositoryPanels = repositories .filter(r => this.repositoryPanels.every(p => p.repository !== r)) - .map(r => this.instantiationService.createInstance(RepositoryPanel, r, this)); + .map(r => { + const panel = this.instantiationService.createInstance(RepositoryPanel, r, this); + panel.render(); + return panel; + }); // Add new selected panels let index = repositoryPanels.length + (this.mainPanel ? 1 : 0); @@ -1364,6 +1369,8 @@ export class SCMViewlet extends PanelViewlet implements IViewModel, IViewsViewle viewletSettings: {} // what is this }) as ViewsViewletPanel; + panel.render(); + this.addPanels([{ panel, size: size || panel.minimumSize, index: start + index }]); panel.setVisible(true); From ee36a84ff1abb0b8bc7509f651b0d97a734cd14c Mon Sep 17 00:00:00 2001 From: Joao Moreno Date: Sat, 28 Apr 2018 00:06:27 +0200 Subject: [PATCH 194/830] document panelview --- src/vs/base/browser/ui/splitview/panelview.ts | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/src/vs/base/browser/ui/splitview/panelview.ts b/src/vs/base/browser/ui/splitview/panelview.ts index ded88cfc84f..be1634767d2 100644 --- a/src/vs/base/browser/ui/splitview/panelview.ts +++ b/src/vs/base/browser/ui/splitview/panelview.ts @@ -31,7 +31,13 @@ export interface IPanelStyles { } /** - * Remember to call render after ctor + * A Panel is a structured SplitView view. + * + * WARNING: You must call `render()` after you contruct it. + * It can't be done automatically at the end of the ctor + * because of the order of property initialization in TypeScript. + * Subclasses wouldn't be able to set own properties + * before the `render()` call, thus forbiding their use. */ export abstract class Panel implements IView { From fb01d75c833a65b1c26a8d6e421017f1dcb68687 Mon Sep 17 00:00:00 2001 From: Rob Lourens Date: Fri, 27 Apr 2018 15:41:08 -0700 Subject: [PATCH 195/830] #3355 - Change "Show overrides" to a checkbox for now --- .../browser/media/settingsEditor2.css | 16 +++++++++------- .../parts/preferences/browser/settingsEditor2.ts | 16 +++++++++------- 2 files changed, 18 insertions(+), 14 deletions(-) diff --git a/src/vs/workbench/parts/preferences/browser/media/settingsEditor2.css b/src/vs/workbench/parts/preferences/browser/media/settingsEditor2.css index b6964662e04..e8a53c03843 100644 --- a/src/vs/workbench/parts/preferences/browser/media/settingsEditor2.css +++ b/src/vs/workbench/parts/preferences/browser/media/settingsEditor2.css @@ -39,10 +39,6 @@ display: flex; } -.settings-editor > .settings-header .settings-target-container { - flex: 1; -} - .settings-editor > .settings-header .settings-tabs-widget > .monaco-action-bar .action-item:not(:first-child) .action-label { margin-left: 33px; } @@ -53,6 +49,8 @@ } .settings-editor > .settings-header > .settings-header-controls .settings-header-controls-right { + margin-left: auto; + padding-top: 3px; display: flex; } @@ -61,14 +59,18 @@ .settings-editor > .settings-header > .settings-header-controls .settings-header-controls-right .open-settings-button:active { background: none; opacity: 0.7; + padding: 0; text-decoration: underline; } -.settings-editor > .settings-header > .settings-header-controls .settings-header-controls-right .configured-only-button { +.settings-editor > .settings-header > .settings-header-controls .settings-header-controls-right #configured-only-checkbox { + flex-shrink: 0; +} + +.settings-editor > .settings-header > .settings-header-controls .settings-header-controls-right .configured-only-label { white-space: nowrap; - padding: 4px 10px; margin-right: 10px; - height: 26px; + margin-left: 2px; } .settings-editor > .settings-body .settings-list-container .settings-list-offset-helper { diff --git a/src/vs/workbench/parts/preferences/browser/settingsEditor2.ts b/src/vs/workbench/parts/preferences/browser/settingsEditor2.ts index 8cba5f3d993..e40e1561712 100644 --- a/src/vs/workbench/parts/preferences/browser/settingsEditor2.ts +++ b/src/vs/workbench/parts/preferences/browser/settingsEditor2.ts @@ -99,7 +99,7 @@ export class SettingsEditor2 extends BaseEditor { private showConfiguredSettingsOnly = false; private showAllSettings = false; - private showConfiguredSettingsOnlyButton: Button; + private showConfiguredSettingsOnlyCheckbox: HTMLInputElement; private settingsListContainer: HTMLElement; private settingsList: List; @@ -204,13 +204,15 @@ export class SettingsEditor2 extends BaseEditor { private createHeaderControls(parent: HTMLElement): void { const headerControlsContainerRight = DOM.append(parent, $('.settings-header-controls-right')); - this.showConfiguredSettingsOnlyButton = this._register(new Button(headerControlsContainerRight, { title: true })); - this.showConfiguredSettingsOnlyButton.label = localize('showOverrides', "Show overrides"); - this.showConfiguredSettingsOnlyButton.element.classList.add('configured-only-button'); + this.showConfiguredSettingsOnlyCheckbox = DOM.append(headerControlsContainerRight, $('input#configured-only-checkbox')); + this.showConfiguredSettingsOnlyCheckbox.type = 'checkbox'; + const showConfiguredSettingsOnlyLabel = DOM.append(headerControlsContainerRight, $('label.configured-only-label')); + showConfiguredSettingsOnlyLabel.textContent = localize('showOverriddenOnly', "Show overridden only"); + showConfiguredSettingsOnlyLabel.htmlFor = 'configured-only-checkbox'; - this._register(this.showConfiguredSettingsOnlyButton.onDidClick(() => this.onShowConfiguredOnlyClicked())); + this._register(DOM.addDisposableListener(this.showConfiguredSettingsOnlyCheckbox, 'change', e => this.onShowConfiguredOnlyClicked())); - const openSettingsButton = this._register(new Button(headerControlsContainerRight, { title: true, buttonBackground: null })); + const openSettingsButton = this._register(new Button(headerControlsContainerRight, { title: true, buttonBackground: null, buttonHoverBackground: null })); openSettingsButton.label = localize('openSettingsLabel', "Open config file"); openSettingsButton.element.classList.add('open-settings-button'); @@ -268,7 +270,7 @@ export class SettingsEditor2 extends BaseEditor { } private onShowConfiguredOnlyClicked(): void { - this.showConfiguredSettingsOnly = !this.showConfiguredSettingsOnly; + this.showConfiguredSettingsOnly = this.showConfiguredSettingsOnlyCheckbox.checked; this.render(); } From 1b3a77a98f40408db8b151f603f0d7f2830707b5 Mon Sep 17 00:00:00 2001 From: Rob Lourens Date: Fri, 27 Apr 2018 15:56:51 -0700 Subject: [PATCH 196/830] #3355 - Fix settings search + Show Overridden Only --- .../preferences/browser/settingsEditor2.ts | 112 ++++-------------- 1 file changed, 26 insertions(+), 86 deletions(-) diff --git a/src/vs/workbench/parts/preferences/browser/settingsEditor2.ts b/src/vs/workbench/parts/preferences/browser/settingsEditor2.ts index e40e1561712..2e94c0e1ef5 100644 --- a/src/vs/workbench/parts/preferences/browser/settingsEditor2.ts +++ b/src/vs/workbench/parts/preferences/browser/settingsEditor2.ts @@ -114,7 +114,7 @@ export class SettingsEditor2 extends BaseEditor { private currentLocalSearchProvider: ISearchProvider; private currentRemoteSearchProvider: ISearchProvider; - private searchResults: ISearchResult[] = []; + private searchResults: ISearchResult[]; constructor( @ITelemetryService telemetryService: ITelemetryService, @@ -303,12 +303,9 @@ export class SettingsEditor2 extends BaseEditor { } else { // When clearing the input, update immediately to clear it this.localSearchDelayer.cancel(); - // this.preferencesRenderers.localFilterPreferences(query); - this.remoteSearchThrottle.cancel(); - // return this.preferencesRenderers.remoteSearchPreferences(query); - this.searchResults = []; + this.searchResults = null; this.renderEntries(); return TPromise.wrap(null); } @@ -325,54 +322,16 @@ export class SettingsEditor2 extends BaseEditor { } private filterOrSearchPreferences(query: string, type: SearchResultIdx, searchProvider: ISearchProvider): TPromise { - // this.lastQuery = query; - const filterPs: TPromise[] = [this._filterOrSearchPreferencesModel(query, this.defaultSettingsEditorModel, searchProvider)]; - // filterPs.push(this.searchAllSettingsTargets(query, searchProvider)); return TPromise.join(filterPs).then(results => { const [result] = results; + this.searchResults = this.searchResults || []; this.searchResults[type] = result; - this.renderSearchResults(this.searchResults); + this.render(); }); } - // private searchAllSettingsTargets(query: string, searchProvider: ISearchProvider): TPromise { - // const searchPs = [ - // this.searchSettingsTarget(query, searchProvider, ConfigurationTarget.WORKSPACE), - // this.searchSettingsTarget(query, searchProvider, ConfigurationTarget.USER) - // ]; - - // for (const folder of this.workspaceContextService.getWorkspace().folders) { - // const folderSettingsResource = this.preferencesService.getFolderSettingsResource(folder.uri); - // searchPs.push(this.searchSettingsTarget(query, searchProvider, folderSettingsResource)); - // } - - - // return TPromise.join(searchPs).then(() => { }); - // } - - // private searchSettingsTarget(query: string, provider: ISearchProvider, target: SettingsTarget): TPromise { - // if (!query) { - // // Don't open the other settings targets when query is empty - // this._onDidFilterResultsCountChange.fire({ target, count: 0 }); - // return TPromise.wrap(null); - // } - - // return this.getPreferencesEditorModel(target).then(model => { - // return model && this._filterOrSearchPreferencesModel('', model, provider); - // }).then(result => { - // const count = result ? this._flatten(result.filteredGroups).length : 0; - // this._onDidFilterResultsCountChange.fire({ target, count }); - // }, err => { - // if (!isPromiseCanceledError(err)) { - // return TPromise.wrapError(err); - // } - - // return null; - // }); - // } - private _filterOrSearchPreferencesModel(filter: string, model: ISettingsEditorModel, provider: ISearchProvider): TPromise { const searchP = provider ? provider.searchModel(model) : TPromise.wrap(null); return searchP @@ -397,30 +356,7 @@ export class SettingsEditor2 extends BaseEditor { }); } - // private async getPreferencesEditorModel(target: SettingsTarget): TPromise { - // const resource = target === ConfigurationTarget.USER ? this.preferencesService.userSettingsResource : - // target === ConfigurationTarget.WORKSPACE ? this.preferencesService.workspaceSettingsResource : - // target; - - // if (!resource) { - // return null; - // } - - // const targetKey = resource.toString(); - // if (!this._prefsModelsForSearch.has(targetKey)) { - // try { - // const model = this._register(await this.preferencesService.createPreferencesEditorModel(resource)); - // this._prefsModelsForSearch.set(targetKey, model); - // } catch (e) { - // // Will throw when the settings file doesn't exist. - // return null; - // } - // } - - // return this._prefsModelsForSearch.get(targetKey); - // } - - private renderSearchResults(searchResults: ISearchResult[]): void { + private getEntriesFromSearch(searchResults: ISearchResult[]): IListEntry[] { const entries: ISettingItemEntry[] = []; const seenSettings = new Set(); @@ -440,7 +376,7 @@ export class SettingsEditor2 extends BaseEditor { } } - this.settingsList.splice(0, this.settingsList.length, entries); + return entries; } private renderEntries(): void { @@ -451,6 +387,24 @@ export class SettingsEditor2 extends BaseEditor { const focusedRowItem = DOM.findParentWithClass(document.activeElement, 'monaco-list-row'); const focusedRowId = focusedRowItem && focusedRowItem.id; + const entries = this.searchResults ? + this.getEntriesFromSearch(this.searchResults) : + this.getEntriesFromModel(); + + this.settingsList.splice(0, this.settingsList.length, entries); + + // Hack to restore the same focused element after editing. + // TODO@roblou figure out the whole keyboard navigation story + if (focusedRowId) { + const rowSelector = `.monaco-list-row#${focusedRowId}`; + const inputElementToFocus: HTMLElement = this.settingsListContainer.querySelector(`${rowSelector} input, ${rowSelector} select`); + if (inputElementToFocus) { + inputElementToFocus.focus(); + } + } + } + + private getEntriesFromModel(): IListEntry[] { const entries: IListEntry[] = []; for (let groupIdx = 0; groupIdx < this.defaultSettingsEditorModel.settingsGroups.length; groupIdx++) { if (groupIdx > 0 && !(this.showAllSettings)) { @@ -462,7 +416,7 @@ export class SettingsEditor2 extends BaseEditor { for (const section of group.sections) { for (const setting of section.settings) { const entry = this.settingToEntry(setting); - if (!this.showConfiguredSettingsOnly || (this.showConfiguredSettingsOnly && entry.isConfigured)) { + if (!this.showConfiguredSettingsOnly || entry.isConfigured) { groupEntries.push(entry); } } @@ -490,17 +444,7 @@ export class SettingsEditor2 extends BaseEditor { } } - this.settingsList.splice(0, this.settingsList.length, entries); - - // Hack to restore the same focused element after editing. - // TODO@roblou figure out the whole keyboard navigation story - if (focusedRowId) { - const rowSelector = `.monaco-list-row#${focusedRowId}`; - const inputElementToFocus: HTMLElement = this.settingsListContainer.querySelector(`${rowSelector} input, ${rowSelector} select`); - if (inputElementToFocus) { - inputElementToFocus.focus(); - } - } + return entries; } private settingToEntry(s: ISetting): ISettingItemEntry { @@ -567,7 +511,6 @@ interface ISettingItemTemplate { containerElement: HTMLElement; labelElement: HTMLElement; - // keyElement: HTMLElement; descriptionElement: HTMLElement; valueElement: HTMLElement; overridesElement: HTMLElement; @@ -612,7 +555,6 @@ class SettingItemRenderer implements IRenderer Date: Fri, 27 Apr 2018 16:02:12 -0700 Subject: [PATCH 197/830] Make webview options optional Fixes #48594 --- src/vs/vscode.d.ts | 2 +- src/vs/workbench/api/node/extHostWebview.ts | 3 ++- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/src/vs/vscode.d.ts b/src/vs/vscode.d.ts index dcb29cd3d1f..4c2b1d89ee8 100644 --- a/src/vs/vscode.d.ts +++ b/src/vs/vscode.d.ts @@ -5732,7 +5732,7 @@ declare module 'vscode' { * * @return New webview panel. */ - export function createWebviewPanel(viewType: string, title: string, position: ViewColumn, options: WebviewPanelOptions & WebviewOptions): WebviewPanel; + export function createWebviewPanel(viewType: string, title: string, position: ViewColumn, options?: WebviewPanelOptions & WebviewOptions): WebviewPanel; /** * Set a message to the status bar. This is a short hand for the more powerful diff --git a/src/vs/workbench/api/node/extHostWebview.ts b/src/vs/workbench/api/node/extHostWebview.ts index e91157377ab..285c1722e97 100644 --- a/src/vs/workbench/api/node/extHostWebview.ts +++ b/src/vs/workbench/api/node/extHostWebview.ts @@ -201,9 +201,10 @@ export class ExtHostWebviews implements ExtHostWebviewsShape { viewType: string, title: string, viewColumn: vscode.ViewColumn, - options: vscode.WebviewPanelOptions & vscode.WebviewOptions, + options: (vscode.WebviewPanelOptions & vscode.WebviewOptions) | undefined, extensionFolderPath: string ): vscode.WebviewPanel { + options = options || {}; const handle = ExtHostWebviews.webviewHandlePool++ + ''; this._proxy.$createWebviewPanel(handle, viewType, title, typeConverters.fromViewColumn(viewColumn), options, extensionFolderPath); From 8578f0241e1a64fb5af8ee1b030e42579ef9cd6f Mon Sep 17 00:00:00 2001 From: Matt Bierner Date: Fri, 27 Apr 2018 16:40:45 -0700 Subject: [PATCH 198/830] Add preserveFocus option for webviews Fixes #14311 --- src/vs/vscode.d.ts | 7 ++++--- .../api/electron-browser/mainThreadWebview.ts | 8 ++++---- src/vs/workbench/api/node/extHost.api.impl.ts | 4 ++-- src/vs/workbench/api/node/extHost.protocol.ts | 4 ++-- src/vs/workbench/api/node/extHostWebview.ts | 17 +++++++++++++---- .../electron-browser/webviewEditorService.ts | 16 +++++++++------- 6 files changed, 34 insertions(+), 22 deletions(-) diff --git a/src/vs/vscode.d.ts b/src/vs/vscode.d.ts index 4c2b1d89ee8..656d89760b1 100644 --- a/src/vs/vscode.d.ts +++ b/src/vs/vscode.d.ts @@ -5217,8 +5217,9 @@ declare module 'vscode' { * 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): void; + reveal(viewColumn?: ViewColumn, preserveFocus?: boolean): void; /** * Dispose of the webview panel. @@ -5727,12 +5728,12 @@ declare module 'vscode' { * * @param viewType Identifies the type of the webview panel. * @param title Title of the panel. - * @param position Editor column to show the new panel in. + * @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, position: ViewColumn, options?: WebviewPanelOptions & WebviewOptions): WebviewPanel; + 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 diff --git a/src/vs/workbench/api/electron-browser/mainThreadWebview.ts b/src/vs/workbench/api/electron-browser/mainThreadWebview.ts index d6255bc4454..4139bbcab43 100644 --- a/src/vs/workbench/api/electron-browser/mainThreadWebview.ts +++ b/src/vs/workbench/api/electron-browser/mainThreadWebview.ts @@ -69,11 +69,11 @@ export class MainThreadWebviews implements MainThreadWebviewsShape, WebviewReviv handle: WebviewPanelHandle, viewType: string, title: string, - column: Position, + showOptions: { viewColumn: Position, preserveFocus: boolean }, options: WebviewInputOptions, extensionFolderPath: string ): void { - const webview = this._webviewService.createWebview(MainThreadWebviews.viewType, title, column, options, extensionFolderPath, this.createWebviewEventDelegate(handle)); + const webview = this._webviewService.createWebview(MainThreadWebviews.viewType, title, showOptions, options, extensionFolderPath, this.createWebviewEventDelegate(handle)); webview.state = { viewType: viewType, state: undefined @@ -98,13 +98,13 @@ export class MainThreadWebviews implements MainThreadWebviewsShape, WebviewReviv webview.html = value; } - $reveal(handle: WebviewPanelHandle, column: Position | null): void { + $reveal(handle: WebviewPanelHandle, viewColumn: Position | null, preserveFocus: boolean): void { const webview = this.getWebview(handle); if (webview.isDisposed()) { return; } - this._webviewService.revealWebview(webview, column); + this._webviewService.revealWebview(webview, viewColumn, preserveFocus); } async $postMessage(handle: WebviewPanelHandle, message: any): TPromise { diff --git a/src/vs/workbench/api/node/extHost.api.impl.ts b/src/vs/workbench/api/node/extHost.api.impl.ts index 1599bef1be7..198fc6026bb 100644 --- a/src/vs/workbench/api/node/extHost.api.impl.ts +++ b/src/vs/workbench/api/node/extHost.api.impl.ts @@ -409,8 +409,8 @@ export function createApiFactory( createOutputChannel(name: string): vscode.OutputChannel { return extHostOutputService.createOutputChannel(name); }, - createWebviewPanel(viewType: string, title: string, column: vscode.ViewColumn, options: vscode.WebviewPanelOptions & vscode.WebviewOptions): vscode.WebviewPanel { - return extHostWebviews.createWebview(viewType, title, column, options, extension.extensionFolderPath); + createWebviewPanel(viewType: string, title: string, showOptions: vscode.ViewColumn | { viewColumn: vscode.ViewColumn, preserveFocus?: boolean }, options: vscode.WebviewPanelOptions & vscode.WebviewOptions): vscode.WebviewPanel { + return extHostWebviews.createWebview(viewType, title, showOptions, options, extension.extensionFolderPath); }, createTerminal(nameOrOptions: vscode.TerminalOptions | string, shellPath?: string, shellArgs?: string[]): vscode.Terminal { if (typeof nameOrOptions === 'object') { diff --git a/src/vs/workbench/api/node/extHost.protocol.ts b/src/vs/workbench/api/node/extHost.protocol.ts index 67ab3eab780..6d252aab2b4 100644 --- a/src/vs/workbench/api/node/extHost.protocol.ts +++ b/src/vs/workbench/api/node/extHost.protocol.ts @@ -354,9 +354,9 @@ export interface MainThreadTelemetryShape extends IDisposable { export type WebviewPanelHandle = string; export interface MainThreadWebviewsShape extends IDisposable { - $createWebviewPanel(handle: WebviewPanelHandle, viewType: string, title: string, column: EditorPosition, options: vscode.WebviewPanelOptions & vscode.WebviewOptions, extensionFolderPath: string): void; + $createWebviewPanel(handle: WebviewPanelHandle, viewType: string, title: string, viewOptions: { viewColumn: EditorPosition, preserveFocus: boolean }, options: vscode.WebviewPanelOptions & vscode.WebviewOptions, extensionFolderPath: string): void; $disposeWebview(handle: WebviewPanelHandle): void; - $reveal(handle: WebviewPanelHandle, column: EditorPosition | undefined): void; + $reveal(handle: WebviewPanelHandle, viewColumn: EditorPosition | null, preserveFocus: boolean): void; $setTitle(handle: WebviewPanelHandle, value: string): void; $setHtml(handle: WebviewPanelHandle, value: string): void; $postMessage(handle: WebviewPanelHandle, value: any): Thenable; diff --git a/src/vs/workbench/api/node/extHostWebview.ts b/src/vs/workbench/api/node/extHostWebview.ts index 285c1722e97..6744106acdf 100644 --- a/src/vs/workbench/api/node/extHostWebview.ts +++ b/src/vs/workbench/api/node/extHostWebview.ts @@ -171,9 +171,11 @@ export class ExtHostWebviewPanel implements vscode.WebviewPanel { return this._proxy.$postMessage(this._handle, message); } - public reveal(viewColumn?: vscode.ViewColumn): void { + public reveal(viewColumn?: vscode.ViewColumn, preserveFocus?: boolean): void { this.assertNotDisposed(); - this._proxy.$reveal(this._handle, viewColumn ? typeConverters.fromViewColumn(viewColumn) : undefined); + this._proxy.$reveal(this._handle, + viewColumn ? typeConverters.fromViewColumn(viewColumn) : undefined, + !!preserveFocus); } private assertNotDisposed() { @@ -200,13 +202,20 @@ export class ExtHostWebviews implements ExtHostWebviewsShape { createWebview( viewType: string, title: string, - viewColumn: vscode.ViewColumn, + showOptions: vscode.ViewColumn | { viewColumn: vscode.ViewColumn, preserveFocus?: boolean }, options: (vscode.WebviewPanelOptions & vscode.WebviewOptions) | undefined, extensionFolderPath: string ): vscode.WebviewPanel { options = options || {}; + + const viewColumn = typeof showOptions === 'object' ? showOptions.viewColumn : showOptions; + const webviewShowOptions = { + viewColumn: typeConverters.fromViewColumn(viewColumn), + preserveFocus: typeof showOptions === 'object' && !!showOptions.preserveFocus + }; + const handle = ExtHostWebviews.webviewHandlePool++ + ''; - this._proxy.$createWebviewPanel(handle, viewType, title, typeConverters.fromViewColumn(viewColumn), options, extensionFolderPath); + this._proxy.$createWebviewPanel(handle, viewType, title, webviewShowOptions, options, extensionFolderPath); const webview = new ExtHostWebview(handle, this._proxy, options); const panel = new ExtHostWebviewPanel(handle, this._proxy, viewType, title, viewColumn, options, webview); diff --git a/src/vs/workbench/parts/webview/electron-browser/webviewEditorService.ts b/src/vs/workbench/parts/webview/electron-browser/webviewEditorService.ts index bb51f95542b..a2394bbfc06 100644 --- a/src/vs/workbench/parts/webview/electron-browser/webviewEditorService.ts +++ b/src/vs/workbench/parts/webview/electron-browser/webviewEditorService.ts @@ -21,7 +21,7 @@ export interface IWebviewEditorService { createWebview( viewType: string, title: string, - column: Position, + showOptions: { viewColumn: Position, preserveFocus: boolean }, options: WebviewInputOptions, extensionFolderPath: string, events: WebviewEvents @@ -37,7 +37,8 @@ export interface IWebviewEditorService { revealWebview( webview: WebviewEditorInput, - column: Position | null + column: Position | null, + preserveFocus: boolean ): void; registerReviver( @@ -86,24 +87,25 @@ export class WebviewEditorService implements IWebviewEditorService { createWebview( viewType: string, title: string, - column: Position, + showOptions: { viewColumn: Position, preserveFocus: boolean }, options: vscode.WebviewOptions, extensionFolderPath: string, events: WebviewEvents ): WebviewEditorInput { const webviewInput = this._instantiationService.createInstance(WebviewEditorInput, viewType, title, options, {}, events, extensionFolderPath, undefined); - this._editorService.openEditor(webviewInput, { pinned: true }, column); + this._editorService.openEditor(webviewInput, { pinned: true, preserveFocus: showOptions.preserveFocus }, showOptions.viewColumn); return webviewInput; } revealWebview( webview: WebviewEditorInput, - column: Position | null + column: Position | null, + preserveFocus: boolean ): void { if (!column || webview.position === column) { - this._editorService.openEditor(webview, { preserveFocus: false }, column || webview.position); + this._editorService.openEditor(webview, { preserveFocus }, column || webview.position); } else { - this._editorGroupService.moveEditor(webview, webview.position, column, { preserveFocus: false }); + this._editorGroupService.moveEditor(webview, webview.position, column, { preserveFocus }); } } From 8616dbae8bc2abf7972a45449b0fb6b2b2d0f429 Mon Sep 17 00:00:00 2001 From: Andre Weinand Date: Sat, 28 Apr 2018 08:58:01 +0200 Subject: [PATCH 199/830] change debug autoassign to isi --- .github/classifier.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/classifier.yml b/.github/classifier.yml index af9e2f84e41..2a39464380b 100644 --- a/.github/classifier.yml +++ b/.github/classifier.yml @@ -10,7 +10,7 @@ color-picker: [], css-less-sass: [ aeschli ], debug: { - assignees: [ weinand ], + assignees: [ isidorn ], assignLabel: false }, diff-editor: [], From fcfe2790005c428a4d8e5bd6e63896ed66523715 Mon Sep 17 00:00:00 2001 From: Aleksey Glazkov Date: Sat, 28 Apr 2018 14:03:00 -0400 Subject: [PATCH 200/830] fixes 48891 --- .../workbench/parts/terminal/browser/terminalWidgetManager.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/vs/workbench/parts/terminal/browser/terminalWidgetManager.ts b/src/vs/workbench/parts/terminal/browser/terminalWidgetManager.ts index 4a1fb003d5e..789410926ff 100644 --- a/src/vs/workbench/parts/terminal/browser/terminalWidgetManager.ts +++ b/src/vs/workbench/parts/terminal/browser/terminalWidgetManager.ts @@ -77,7 +77,7 @@ class MessageWidget { this._domNode = document.createElement('div'); this._domNode.style.position = 'absolute'; this._domNode.style.left = `${_left}px`; - this._domNode.style.bottom = `${_container.offsetHeight - _top}px`; + this._domNode.style.bottom = `${_container.offsetHeight - (_top > 29 ? _top : 29)}px`; this._domNode.classList.add('terminal-message-widget', 'fadeIn'); this._domNode.textContent = _text; this._container.appendChild(this._domNode); From c3805d820b7d54b8916b44360233c3fb30130ccb Mon Sep 17 00:00:00 2001 From: Aleksey Glazkov Date: Sat, 28 Apr 2018 15:12:15 -0400 Subject: [PATCH 201/830] errors appeared after 216151379f09aefe0b4cae4671feca085ac9e027, ee36a84ff1abb0b8bc7509f651b0d97a734cd14c and 8578f0241e1a64fb5af8ee1b030e42579ef9cd6f --- .../parts/update/electron-browser/releaseNotesEditor.ts | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/src/vs/workbench/parts/update/electron-browser/releaseNotesEditor.ts b/src/vs/workbench/parts/update/electron-browser/releaseNotesEditor.ts index 30e519743fc..7d2a718c7ab 100644 --- a/src/vs/workbench/parts/update/electron-browser/releaseNotesEditor.ts +++ b/src/vs/workbench/parts/update/electron-browser/releaseNotesEditor.ts @@ -76,14 +76,15 @@ export class ReleaseNotesManager { if (this._currentReleaseNotes) { this._currentReleaseNotes.setName(title); this._currentReleaseNotes.html = html; - this._webviewEditorService.revealWebview(this._currentReleaseNotes, activeEditor ? activeEditor.position : undefined); + this._webviewEditorService.revealWebview(this._currentReleaseNotes, activeEditor ? activeEditor.position : undefined, true); } else { this._currentReleaseNotes = this._webviewEditorService.createWebview( 'releaseNotes', title, - activeEditor ? activeEditor.position : Position.ONE, + { viewColumn: activeEditor ? activeEditor.position : Position.ONE, preserveFocus: true }, { tryRestoreScrollPosition: true, enableFindWidget: true }, - undefined, { + undefined, + { onDidClickLink: uri => this.onDidClickLink(uri), onDispose: () => { this._currentReleaseNotes = undefined; } }); From 61aa2e587cd31c285661c7fba4d04062632e1bc6 Mon Sep 17 00:00:00 2001 From: Rob Lourens Date: Sat, 28 Apr 2018 13:23:19 -0700 Subject: [PATCH 202/830] #3355 - Implement telemetry for new settings editor --- .../preferences/browser/settingsEditor2.ts | 54 +++++++++++++++++-- 1 file changed, 49 insertions(+), 5 deletions(-) diff --git a/src/vs/workbench/parts/preferences/browser/settingsEditor2.ts b/src/vs/workbench/parts/preferences/browser/settingsEditor2.ts index 2e94c0e1ef5..9ec58780983 100644 --- a/src/vs/workbench/parts/preferences/browser/settingsEditor2.ts +++ b/src/vs/workbench/parts/preferences/browser/settingsEditor2.ts @@ -32,7 +32,6 @@ import { PreferencesEditorInput2 } from 'vs/workbench/services/preferences/commo import { DefaultSettingsEditorModel } from 'vs/workbench/services/preferences/common/preferencesModels'; import { Button } from 'vs/base/browser/ui/button/button'; import { IPreferencesSearchService, ISearchProvider } from '../common/preferences'; -import { IProgressService } from 'vs/platform/progress/common/progress'; import { isPromiseCanceledError, getErrorMessage } from 'vs/base/common/errors'; import { ILogService } from 'vs/platform/log/common/log'; import { registerColor } from 'vs/platform/theme/common/colorRegistry'; @@ -124,7 +123,6 @@ export class SettingsEditor2 extends BaseEditor { @IPreferencesService private preferencesService: IPreferencesService, @IInstantiationService private instantiationService: IInstantiationService, @IPreferencesSearchService private preferencesSearchService: IPreferencesSearchService, - @IProgressService private progressService: IProgressService, @ILogService private logService: ILogService ) { super(SettingsEditor2.ID, telemetryService, themeService); @@ -291,14 +289,18 @@ export class SettingsEditor2 extends BaseEditor { private onInputChanged(): void { const query = this.searchWidget.getValue().trim(); this.delayedFilterLogging.cancel(); - this.triggerSearch(query); + this.triggerSearch(query).then(() => { + if (query && this.searchResults) { + this.delayedFilterLogging.trigger(() => this.reportFilteringUsed(query, this.searchResults)); + } + }); } private triggerSearch(query: string): TPromise { if (query) { return TPromise.join([ this.localSearchDelayer.trigger(() => this.localFilterPreferences(query)), - this.remoteSearchThrottle.trigger(() => this.progressService.showWhile(this.remoteSearchPreferences(query), 500)) + this.remoteSearchThrottle.trigger(() => this.remoteSearchPreferences(query), 500) ]) as TPromise; } else { // When clearing the input, update immediately to clear it @@ -311,6 +313,48 @@ export class SettingsEditor2 extends BaseEditor { } } + private reportFilteringUsed(query: string, results: ISearchResult[]): void { + const nlpResult = results[SearchResultIdx.Remote]; + const nlpMetadata = nlpResult && nlpResult.metadata; + + const durations = {}; + durations['nlpResult'] = nlpMetadata && nlpMetadata.duration; + + // Count unique results + const counts = {}; + const filterResult = results[SearchResultIdx.Local]; + counts['filterResult'] = filterResult.filterMatches.length; + if (nlpResult && nlpResult.filterMatches.length) { + const localMatchKeys = new Set(); + filterResult.filterMatches + .forEach(m => localMatchKeys.add(m.setting.key)); + + counts['nlpResult'] = nlpResult.filterMatches + .filter(m => !localMatchKeys.has(m.setting.key)) + .length; + } + + const requestCount = nlpMetadata && nlpMetadata.requestCount; + + const data = { + query, + durations, + counts, + requestCount + }; + + /* __GDPR__ + "settingsEditor.filter" : { + "query": { "classification": "CustomerContent", "purpose": "FeatureInsight" }, + "durations.nlpResult" : { "classification": "SystemMetaData", "purpose": "FeatureInsight", "isMeasurement": true }, + "counts.nlpResult" : { "classification": "SystemMetaData", "purpose": "FeatureInsight", "isMeasurement": true }, + "counts.filterResult" : { "classification": "SystemMetaData", "purpose": "FeatureInsight", "isMeasurement": true }, + "requestCount" : { "classification": "SystemMetaData", "purpose": "FeatureInsight", "isMeasurement": true } + } + */ + this.telemetryService.publicLog('defaultSettings.filter', data); + } + private localFilterPreferences(query: string): TPromise { this.currentLocalSearchProvider = this.preferencesSearchService.getLocalSearchProvider(query); return this.filterOrSearchPreferences(query, SearchResultIdx.Local, this.currentLocalSearchProvider); @@ -328,7 +372,7 @@ export class SettingsEditor2 extends BaseEditor { const [result] = results; this.searchResults = this.searchResults || []; this.searchResults[type] = result; - this.render(); + return this.render(); }); } From 1800414c23e543239b42c72e396a1b88e74b6e3c Mon Sep 17 00:00:00 2001 From: Rob Lourens Date: Sat, 28 Apr 2018 15:32:33 -0700 Subject: [PATCH 203/830] #3355 - implement setting change telemetry --- .../preferences/browser/settingsEditor2.ts | 170 +++++++++++++++--- 1 file changed, 145 insertions(+), 25 deletions(-) diff --git a/src/vs/workbench/parts/preferences/browser/settingsEditor2.ts b/src/vs/workbench/parts/preferences/browser/settingsEditor2.ts index 9ec58780983..628a4d74e7d 100644 --- a/src/vs/workbench/parts/preferences/browser/settingsEditor2.ts +++ b/src/vs/workbench/parts/preferences/browser/settingsEditor2.ts @@ -4,6 +4,9 @@ *--------------------------------------------------------------------------------------------*/ import * as DOM from 'vs/base/browser/dom'; +import * as arrays from 'vs/base/common/arrays'; +import * as objects from 'vs/base/common/objects'; +import { Button } from 'vs/base/browser/ui/button/button'; import { InputBox } from 'vs/base/browser/ui/inputbox/inputBox'; import { IDelegate, IRenderer } from 'vs/base/browser/ui/list/list'; import { List } from 'vs/base/browser/ui/list/listWidget'; @@ -11,6 +14,7 @@ import { SelectBox } from 'vs/base/browser/ui/selectBox/selectBox'; import { IAction } from 'vs/base/common/actions'; import { Delayer, ThrottledDelayer } from 'vs/base/common/async'; import { Color } from 'vs/base/common/color'; +import { getErrorMessage, isPromiseCanceledError } from 'vs/base/common/errors'; import { Emitter, Event } from 'vs/base/common/event'; import { IDisposable, dispose } from 'vs/base/common/lifecycle'; import { TPromise } from 'vs/base/common/winjs.base'; @@ -19,23 +23,21 @@ import { localize } from 'vs/nls'; import { ConfigurationTarget, IConfigurationService } from 'vs/platform/configuration/common/configuration'; import { IContextKey } from 'vs/platform/contextkey/common/contextkey'; import { IContextMenuService, IContextViewService } from 'vs/platform/contextview/browser/contextView'; +import { IEditor } from 'vs/platform/editor/common/editor'; import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation'; import { WorkbenchList } from 'vs/platform/list/browser/listService'; +import { ILogService } from 'vs/platform/log/common/log'; import { ITelemetryService } from 'vs/platform/telemetry/common/telemetry'; -import { attachInputBoxStyler, attachSelectBoxStyler, attachButtonStyler } from 'vs/platform/theme/common/styler'; -import { IThemeService, registerThemingParticipant, ITheme, ICssStyleCollector } from 'vs/platform/theme/common/themeService'; +import { registerColor } from 'vs/platform/theme/common/colorRegistry'; +import { attachButtonStyler, attachInputBoxStyler, attachSelectBoxStyler } from 'vs/platform/theme/common/styler'; +import { ICssStyleCollector, ITheme, IThemeService, registerThemingParticipant } from 'vs/platform/theme/common/themeService'; import { BaseEditor } from 'vs/workbench/browser/parts/editor/baseEditor'; import { EditorOptions } from 'vs/workbench/common/editor'; -import { SearchWidget, SettingsTargetsWidget } from 'vs/workbench/parts/preferences/browser/preferencesWidgets'; -import { IPreferencesService, ISetting, ISettingsEditorModel, ISearchResult } from 'vs/workbench/services/preferences/common/preferences'; +import { SearchWidget, SettingsTargetsWidget, SettingsTarget } from 'vs/workbench/parts/preferences/browser/preferencesWidgets'; +import { IPreferencesService, ISearchResult, ISetting, ISettingsEditorModel } from 'vs/workbench/services/preferences/common/preferences'; import { PreferencesEditorInput2 } from 'vs/workbench/services/preferences/common/preferencesEditorInput'; import { DefaultSettingsEditorModel } from 'vs/workbench/services/preferences/common/preferencesModels'; -import { Button } from 'vs/base/browser/ui/button/button'; import { IPreferencesSearchService, ISearchProvider } from '../common/preferences'; -import { isPromiseCanceledError, getErrorMessage } from 'vs/base/common/errors'; -import { ILogService } from 'vs/platform/log/common/log'; -import { registerColor } from 'vs/platform/theme/common/colorRegistry'; -import { IEditor } from 'vs/platform/editor/common/editor'; const SETTINGS_ENTRY_TEMPLATE_ID = 'settings.entry.template'; const SETTINGS_GROUP_ENTRY_TEMPLATE_ID = 'settings.group.template'; @@ -106,6 +108,7 @@ export class SettingsEditor2 extends BaseEditor { private dimension: DOM.Dimension; private searchFocusContextKey: IContextKey; + private delayedModifyLogging: Delayer; private delayedFilterLogging: Delayer; private localSearchDelayer: Delayer; private remoteSearchThrottle: ThrottledDelayer; @@ -113,7 +116,8 @@ export class SettingsEditor2 extends BaseEditor { private currentLocalSearchProvider: ISearchProvider; private currentRemoteSearchProvider: ISearchProvider; - private searchResults: ISearchResult[]; + private searchResultModel: SearchResultModel; + private pendingSettingModifiedReport: { key: string, value: any }; constructor( @ITelemetryService telemetryService: ITelemetryService, @@ -126,9 +130,11 @@ export class SettingsEditor2 extends BaseEditor { @ILogService private logService: ILogService ) { super(SettingsEditor2.ID, telemetryService, themeService); + this.delayedModifyLogging = new Delayer(1000); this.delayedFilterLogging = new Delayer(1000); this.localSearchDelayer = new Delayer(100); this.remoteSearchThrottle = new ThrottledDelayer(200); + this.searchResultModel = new SearchResultModel(); this._register(configurationService.onDidChangeConfiguration(() => this.render())); } @@ -275,6 +281,79 @@ export class SettingsEditor2 extends BaseEditor { private onDidChangeSetting(key: string, value: any): void { // ConfigurationService displays the error this.configurationService.updateValue(key, value, this.settingsTargetsWidget.settingsTarget); + + const reportModifiedProps = { + key, + query: this.searchWidget.getValue(), + searchResults: this.searchResultModel.getUniqueResults(), + rawResults: this.searchResultModel.getRawResults(), + showConfiguredOnly: this.showConfiguredSettingsOnly, + isReset: typeof value === 'undefined', + settingsTarget: this.settingsTargetsWidget.settingsTarget as SettingsTarget + }; + + if (this.pendingSettingModifiedReport && key !== this.pendingSettingModifiedReport.key) { + this.reportModifiedSetting(reportModifiedProps); + } + + this.pendingSettingModifiedReport = { key, value }; + this.delayedModifyLogging.trigger(() => this.reportModifiedSetting(reportModifiedProps)); + } + + private reportModifiedSetting(props: { key: string, query: string, searchResults: ISearchResult[], rawResults: ISearchResult[], showConfiguredOnly: boolean, isReset: boolean, settingsTarget: SettingsTarget }): void { + this.pendingSettingModifiedReport = null; + + const remoteResult = props.searchResults && props.searchResults[SearchResultIdx.Remote]; + const localResult = props.searchResults && props.searchResults[SearchResultIdx.Local]; + + let groupId = undefined; + let nlpIndex = undefined; + let displayIndex = undefined; + if (props.searchResults) { + const localIndex = arrays.firstIndex(localResult.filterMatches, m => m.setting.key === props.key); + groupId = localIndex >= 0 ? + 'local' : + 'remote'; + + displayIndex = localIndex >= 0 ? + localIndex : + remoteResult && (arrays.firstIndex(remoteResult.filterMatches, m => m.setting.key === props.key) + localResult.filterMatches.length); + + const rawResults = this.searchResultModel.getRawResults(); + if (rawResults[SearchResultIdx.Remote]) { + const _nlpIndex = arrays.firstIndex(rawResults[SearchResultIdx.Remote].filterMatches, m => m.setting.key === props.key); + nlpIndex = _nlpIndex >= 0 ? _nlpIndex : undefined; + } + } + + const reportedTarget = props.settingsTarget === ConfigurationTarget.USER ? 'user' : + props.settingsTarget === ConfigurationTarget.WORKSPACE ? 'workspace' : + 'folder'; + + const data = { + key: props.key, + query: props.query, + groupId, + nlpIndex, + displayIndex, + showConfiguredOnly: props.showConfiguredOnly, + isReset: props.isReset, + target: reportedTarget + }; + + /* __GDPR__ + "settingEditor.settingModified" : { + "key" : { "classification": "SystemMetaData", "purpose": "FeatureInsight" }, + "query" : { "classification": "CustomerContent", "purpose": "FeatureInsight" }, + "groupId" : { "classification": "SystemMetaData", "purpose": "FeatureInsight" }, + "nlpIndex" : { "classification": "SystemMetaData", "purpose": "FeatureInsight", "isMeasurement": true }, + "displayIndex" : { "classification": "SystemMetaData", "purpose": "FeatureInsight", "isMeasurement": true }, + "showConfiguredOnly" : { "classification": "SystemMetaData", "purpose": "FeatureInsight" }, + "isReset" : { "classification": "SystemMetaData", "purpose": "FeatureInsight" }, + "target" : { "classification": "SystemMetaData", "purpose": "FeatureInsight" } + } + */ + this.telemetryService.publicLog('settingEditor.settingModified', data); } private render(): TPromise { @@ -290,8 +369,8 @@ export class SettingsEditor2 extends BaseEditor { const query = this.searchWidget.getValue().trim(); this.delayedFilterLogging.cancel(); this.triggerSearch(query).then(() => { - if (query && this.searchResults) { - this.delayedFilterLogging.trigger(() => this.reportFilteringUsed(query, this.searchResults)); + if (query && this.searchResultModel.hasResults()) { + this.delayedFilterLogging.trigger(() => this.reportFilteringUsed(query, this.searchResultModel.getUniqueResults())); } }); } @@ -307,7 +386,7 @@ export class SettingsEditor2 extends BaseEditor { this.localSearchDelayer.cancel(); this.remoteSearchThrottle.cancel(); - this.searchResults = null; + this.searchResultModel.clear(); this.renderEntries(); return TPromise.wrap(null); } @@ -324,14 +403,8 @@ export class SettingsEditor2 extends BaseEditor { const counts = {}; const filterResult = results[SearchResultIdx.Local]; counts['filterResult'] = filterResult.filterMatches.length; - if (nlpResult && nlpResult.filterMatches.length) { - const localMatchKeys = new Set(); - filterResult.filterMatches - .forEach(m => localMatchKeys.add(m.setting.key)); - - counts['nlpResult'] = nlpResult.filterMatches - .filter(m => !localMatchKeys.has(m.setting.key)) - .length; + if (nlpResult) { + counts['nlpResult'] = nlpResult.filterMatches.length; } const requestCount = nlpMetadata && nlpMetadata.requestCount; @@ -370,8 +443,7 @@ export class SettingsEditor2 extends BaseEditor { return TPromise.join(filterPs).then(results => { const [result] = results; - this.searchResults = this.searchResults || []; - this.searchResults[type] = result; + this.searchResultModel.setResult(type, result); return this.render(); }); } @@ -431,8 +503,8 @@ export class SettingsEditor2 extends BaseEditor { const focusedRowItem = DOM.findParentWithClass(document.activeElement, 'monaco-list-row'); const focusedRowId = focusedRowItem && focusedRowItem.id; - const entries = this.searchResults ? - this.getEntriesFromSearch(this.searchResults) : + const entries = this.searchResultModel.hasResults() ? + this.getEntriesFromSearch(this.searchResultModel.getUniqueResults()) : this.getEntriesFromModel(); this.settingsList.splice(0, this.settingsList.length, entries); @@ -775,3 +847,51 @@ registerThemingParticipant((theme: ITheme, collector: ICssStyleCollector) => { collector.addRule(`.settings-editor > .settings-body > .settings-list-container .monaco-list-row.is-configured .setting-value-checkbox::after { background-color: ${configuredItemBackgroundColor}; }`); } }); + +class SearchResultModel { + private rawSearchResults: ISearchResult[]; + private cachedUniqueSearchResults: ISearchResult[]; + + getUniqueResults(): ISearchResult[] { + if (this.cachedUniqueSearchResults) { + return this.cachedUniqueSearchResults; + } + + if (!this.rawSearchResults) { + return null; + } + + const localMatchKeys = new Set(); + const localResult = objects.deepClone(this.rawSearchResults[SearchResultIdx.Local]); + if (localResult) { + localResult.filterMatches.forEach(m => localMatchKeys.add(m.setting.key)); + } + + const remoteResult = objects.deepClone(this.rawSearchResults[SearchResultIdx.Remote]); + if (remoteResult) { + remoteResult.filterMatches = remoteResult.filterMatches.filter(m => !localMatchKeys.has(m.setting.key)); + } + + this.cachedUniqueSearchResults = [localResult, remoteResult]; + return this.cachedUniqueSearchResults; + } + + getRawResults(): ISearchResult[] { + return this.rawSearchResults; + } + + hasResults(): boolean { + return !!this.rawSearchResults; + } + + clear(): void { + this.cachedUniqueSearchResults = null; + this.rawSearchResults = null; + } + + setResult(type: SearchResultIdx, result: ISearchResult): void { + this.cachedUniqueSearchResults = null; + this.rawSearchResults = this.rawSearchResults || []; + this.rawSearchResults[type] = result; + } +} From 7446ff4604ead86255999e5a27867fb9ef332adb Mon Sep 17 00:00:00 2001 From: Rob Lourens Date: Sat, 28 Apr 2018 16:32:09 -0700 Subject: [PATCH 204/830] #3355 - ensure UI is rerendered when changing a setting, even if it doesn't result in a onDidChangeConfiguration firing --- .../parts/preferences/browser/settingsEditor2.ts | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/src/vs/workbench/parts/preferences/browser/settingsEditor2.ts b/src/vs/workbench/parts/preferences/browser/settingsEditor2.ts index 628a4d74e7d..a56b59fe2e6 100644 --- a/src/vs/workbench/parts/preferences/browser/settingsEditor2.ts +++ b/src/vs/workbench/parts/preferences/browser/settingsEditor2.ts @@ -136,7 +136,7 @@ export class SettingsEditor2 extends BaseEditor { this.remoteSearchThrottle = new ThrottledDelayer(200); this.searchResultModel = new SearchResultModel(); - this._register(configurationService.onDidChangeConfiguration(() => this.render())); + this._register(configurationService.onDidChangeConfiguration(() => this.renderEntries())); } createEditor(parent: HTMLElement): void { @@ -279,8 +279,10 @@ export class SettingsEditor2 extends BaseEditor { } private onDidChangeSetting(key: string, value: any): void { - // ConfigurationService displays the error - this.configurationService.updateValue(key, value, this.settingsTargetsWidget.settingsTarget); + // ConfigurationService displays the error if this fails. + // Force a render afterwards because onDidConfigurationUpdate doesn't fire if the update doesn't result in an effective setting value change + this.configurationService.updateValue(key, value, this.settingsTargetsWidget.settingsTarget) + .then(() => this.renderEntries()); const reportModifiedProps = { key, From 0aad2574786b61976f29d633af11bf4f6a39cb46 Mon Sep 17 00:00:00 2001 From: Rob Lourens Date: Sat, 28 Apr 2018 17:03:02 -0700 Subject: [PATCH 205/830] #3355 - Fix settings editor list theming --- .../parts/preferences/browser/media/settingsEditor2.css | 4 ++++ .../workbench/parts/preferences/browser/settingsEditor2.ts | 6 +++--- 2 files changed, 7 insertions(+), 3 deletions(-) diff --git a/src/vs/workbench/parts/preferences/browser/media/settingsEditor2.css b/src/vs/workbench/parts/preferences/browser/media/settingsEditor2.css index e8a53c03843..2c909354ed2 100644 --- a/src/vs/workbench/parts/preferences/browser/media/settingsEditor2.css +++ b/src/vs/workbench/parts/preferences/browser/media/settingsEditor2.css @@ -97,6 +97,10 @@ background-color: rgba(130, 130, 130, 0.04); } +.settings-editor > .settings-body > .settings-list-container .monaco-list-row:not(.odd) { + background-color: initial; +} + .settings-editor > .settings-body > .settings-list-container .monaco-list-row.setting-item { padding: 3px 0px; } diff --git a/src/vs/workbench/parts/preferences/browser/settingsEditor2.ts b/src/vs/workbench/parts/preferences/browser/settingsEditor2.ts index a56b59fe2e6..7ce46bae8ea 100644 --- a/src/vs/workbench/parts/preferences/browser/settingsEditor2.ts +++ b/src/vs/workbench/parts/preferences/browser/settingsEditor2.ts @@ -78,13 +78,13 @@ const $ = DOM.$; export const configuredItemBackground = registerColor('settings.configuredItemBackground', { dark: '#0d466c', - light: '#0d466c', - hc: '#000000' + light: '#c5e6ff', + hc: '#0d466c' }, localize('configuredItemBackground', "The background color for a configured setting.")); export const configuredItemForeground = registerColor('settings.configuredItemForeground', { dark: '#dddddd', - light: '#dddddd', + light: '#6c6c6c', hc: '#dddddd' }, localize('configuredItemForeground', "The foreground color for a configured setting.")); From 8777d694ad2bca12171220fdcd0e7cad797ac8fa Mon Sep 17 00:00:00 2001 From: Matt Bierner Date: Sat, 28 Apr 2018 17:31:07 -0700 Subject: [PATCH 206/830] Fix release notes build error --- .../parts/update/electron-browser/releaseNotesEditor.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/vs/workbench/parts/update/electron-browser/releaseNotesEditor.ts b/src/vs/workbench/parts/update/electron-browser/releaseNotesEditor.ts index 30e519743fc..11d224517bc 100644 --- a/src/vs/workbench/parts/update/electron-browser/releaseNotesEditor.ts +++ b/src/vs/workbench/parts/update/electron-browser/releaseNotesEditor.ts @@ -76,12 +76,12 @@ export class ReleaseNotesManager { if (this._currentReleaseNotes) { this._currentReleaseNotes.setName(title); this._currentReleaseNotes.html = html; - this._webviewEditorService.revealWebview(this._currentReleaseNotes, activeEditor ? activeEditor.position : undefined); + this._webviewEditorService.revealWebview(this._currentReleaseNotes, activeEditor ? activeEditor.position : undefined, false); } else { this._currentReleaseNotes = this._webviewEditorService.createWebview( 'releaseNotes', title, - activeEditor ? activeEditor.position : Position.ONE, + { viewColumn: activeEditor ? activeEditor.position : Position.ONE, preserveFocus: false }, { tryRestoreScrollPosition: true, enableFindWidget: true }, undefined, { onDidClickLink: uri => this.onDidClickLink(uri), From 11834f354f7e7abe068ad26cabcce5095279a186 Mon Sep 17 00:00:00 2001 From: Yuki Ueda Date: Sun, 29 Apr 2018 09:36:23 +0900 Subject: [PATCH 207/830] Highlight escaped characters in default Light+ (Fix #48638) (#48746) * highlight escaped characters in default Light+(Fix #48638) * fix constant.character.escape * fix constant.character.escape again --- extensions/theme-defaults/themes/light_plus.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/extensions/theme-defaults/themes/light_plus.json b/extensions/theme-defaults/themes/light_plus.json index a4b6b642a9a..a3b31dcc05d 100644 --- a/extensions/theme-defaults/themes/light_plus.json +++ b/extensions/theme-defaults/themes/light_plus.json @@ -156,7 +156,7 @@ { "scope": "constant.character.escape", "settings": { - "foreground": "#a31515" + "foreground": "#ff0000" } } From ac69540858bf91bd8f51c8cc24568fb0b63506eb Mon Sep 17 00:00:00 2001 From: Matt Bierner Date: Sat, 28 Apr 2018 17:54:54 -0700 Subject: [PATCH 208/830] Updating tests for light+ escape coloring grammar changes --- .../bat/test/colorize-results/test_bat.json | 4 ++-- .../json/test/colorize-results/test_json.json | 2 +- .../make/test/colorize-results/makefile.json | 10 +++++----- .../perl/test/colorize-results/test2_pl.json | 8 ++++---- .../perl/test/colorize-results/test_pl.json | 18 +++++++++--------- .../test/colorize-results/issue-28354_php.json | 4 ++-- .../ruby/test/colorize-results/test_rb.json | 8 ++++---- .../scss/test/colorize-results/test_scss.json | 6 +++--- 8 files changed, 30 insertions(+), 30 deletions(-) diff --git a/extensions/bat/test/colorize-results/test_bat.json b/extensions/bat/test/colorize-results/test_bat.json index 789c3bc3e72..3c2abc5d2dc 100644 --- a/extensions/bat/test/colorize-results/test_bat.json +++ b/extensions/bat/test/colorize-results/test_bat.json @@ -488,7 +488,7 @@ "t": "source.batchfile constant.character.escape.batchfile", "r": { "dark_plus": "constant.character.escape: #D7BA7D", - "light_plus": "constant.character.escape: #A31515", + "light_plus": "constant.character.escape: #FF0000", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", "hc_black": "constant.character: #569CD6" @@ -510,7 +510,7 @@ "t": "source.batchfile constant.character.escape.batchfile", "r": { "dark_plus": "constant.character.escape: #D7BA7D", - "light_plus": "constant.character.escape: #A31515", + "light_plus": "constant.character.escape: #FF0000", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", "hc_black": "constant.character: #569CD6" diff --git a/extensions/json/test/colorize-results/test_json.json b/extensions/json/test/colorize-results/test_json.json index f5295bcf70a..19641069faa 100644 --- a/extensions/json/test/colorize-results/test_json.json +++ b/extensions/json/test/colorize-results/test_json.json @@ -389,7 +389,7 @@ "t": "source.json meta.structure.dictionary.json meta.structure.dictionary.value.json meta.structure.dictionary.json meta.structure.dictionary.value.json string.quoted.double.json constant.character.escape.json", "r": { "dark_plus": "constant.character.escape: #D7BA7D", - "light_plus": "constant.character.escape: #A31515", + "light_plus": "constant.character.escape: #FF0000", "dark_vs": "string: #CE9178", "light_vs": "string: #A31515", "hc_black": "constant.character: #569CD6" diff --git a/extensions/make/test/colorize-results/makefile.json b/extensions/make/test/colorize-results/makefile.json index 94d9b456703..03fbc6814fb 100644 --- a/extensions/make/test/colorize-results/makefile.json +++ b/extensions/make/test/colorize-results/makefile.json @@ -136,7 +136,7 @@ "t": "source.makefile meta.scope.target.makefile meta.scope.prerequisites.makefile constant.character.escape.continuation.makefile", "r": { "dark_plus": "constant.character.escape: #D7BA7D", - "light_plus": "constant.character.escape: #A31515", + "light_plus": "constant.character.escape: #FF0000", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", "hc_black": "constant.character: #569CD6" @@ -279,7 +279,7 @@ "t": "source.makefile meta.scope.target.makefile meta.scope.prerequisites.makefile constant.character.escape.continuation.makefile", "r": { "dark_plus": "constant.character.escape: #D7BA7D", - "light_plus": "constant.character.escape: #A31515", + "light_plus": "constant.character.escape: #FF0000", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", "hc_black": "constant.character: #569CD6" @@ -323,7 +323,7 @@ "t": "source.makefile meta.scope.target.makefile meta.scope.prerequisites.makefile comment.line.number-sign.makefile constant.character.escape.continuation.makefile", "r": { "dark_plus": "constant.character.escape: #D7BA7D", - "light_plus": "constant.character.escape: #A31515", + "light_plus": "constant.character.escape: #FF0000", "dark_vs": "comment: #608B4E", "light_vs": "comment: #008000", "hc_black": "constant.character: #569CD6" @@ -378,7 +378,7 @@ "t": "source.makefile comment.line.number-sign.makefile constant.character.escape.continuation.makefile", "r": { "dark_plus": "constant.character.escape: #D7BA7D", - "light_plus": "constant.character.escape: #A31515", + "light_plus": "constant.character.escape: #FF0000", "dark_vs": "comment: #608B4E", "light_vs": "comment: #008000", "hc_black": "constant.character: #569CD6" @@ -554,7 +554,7 @@ "t": "source.makefile meta.scope.target.makefile meta.scope.prerequisites.makefile constant.character.escape.continuation.makefile", "r": { "dark_plus": "constant.character.escape: #D7BA7D", - "light_plus": "constant.character.escape: #A31515", + "light_plus": "constant.character.escape: #FF0000", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", "hc_black": "constant.character: #569CD6" diff --git a/extensions/perl/test/colorize-results/test2_pl.json b/extensions/perl/test/colorize-results/test2_pl.json index bf690458af4..99e22463982 100644 --- a/extensions/perl/test/colorize-results/test2_pl.json +++ b/extensions/perl/test/colorize-results/test2_pl.json @@ -1302,7 +1302,7 @@ "t": "source.perl string.regexp.find.perl constant.character.escape.perl", "r": { "dark_plus": "constant.character.escape: #D7BA7D", - "light_plus": "constant.character.escape: #A31515", + "light_plus": "constant.character.escape: #FF0000", "dark_vs": "string.regexp: #D16969", "light_vs": "string.regexp: #811F3F", "hc_black": "constant.character: #569CD6" @@ -1324,7 +1324,7 @@ "t": "source.perl string.regexp.find.perl constant.character.escape.perl", "r": { "dark_plus": "constant.character.escape: #D7BA7D", - "light_plus": "constant.character.escape: #A31515", + "light_plus": "constant.character.escape: #FF0000", "dark_vs": "string.regexp: #D16969", "light_vs": "string.regexp: #811F3F", "hc_black": "constant.character: #569CD6" @@ -1346,7 +1346,7 @@ "t": "source.perl string.regexp.find.perl constant.character.escape.perl", "r": { "dark_plus": "constant.character.escape: #D7BA7D", - "light_plus": "constant.character.escape: #A31515", + "light_plus": "constant.character.escape: #FF0000", "dark_vs": "string.regexp: #D16969", "light_vs": "string.regexp: #811F3F", "hc_black": "constant.character: #569CD6" @@ -1775,7 +1775,7 @@ "t": "source.perl string.regexp.find.perl constant.character.escape.perl", "r": { "dark_plus": "constant.character.escape: #D7BA7D", - "light_plus": "constant.character.escape: #A31515", + "light_plus": "constant.character.escape: #FF0000", "dark_vs": "string.regexp: #D16969", "light_vs": "string.regexp: #811F3F", "hc_black": "constant.character: #569CD6" diff --git a/extensions/perl/test/colorize-results/test_pl.json b/extensions/perl/test/colorize-results/test_pl.json index e6551c2c639..7e575aa4652 100644 --- a/extensions/perl/test/colorize-results/test_pl.json +++ b/extensions/perl/test/colorize-results/test_pl.json @@ -389,7 +389,7 @@ "t": "source.perl string.regexp.find.perl constant.character.escape.perl", "r": { "dark_plus": "constant.character.escape: #D7BA7D", - "light_plus": "constant.character.escape: #A31515", + "light_plus": "constant.character.escape: #FF0000", "dark_vs": "string.regexp: #D16969", "light_vs": "string.regexp: #811F3F", "hc_black": "constant.character: #569CD6" @@ -411,7 +411,7 @@ "t": "source.perl string.regexp.find.perl constant.character.escape.perl", "r": { "dark_plus": "constant.character.escape: #D7BA7D", - "light_plus": "constant.character.escape: #A31515", + "light_plus": "constant.character.escape: #FF0000", "dark_vs": "string.regexp: #D16969", "light_vs": "string.regexp: #811F3F", "hc_black": "constant.character: #569CD6" @@ -433,7 +433,7 @@ "t": "source.perl string.regexp.find.perl constant.character.escape.perl", "r": { "dark_plus": "constant.character.escape: #D7BA7D", - "light_plus": "constant.character.escape: #A31515", + "light_plus": "constant.character.escape: #FF0000", "dark_vs": "string.regexp: #D16969", "light_vs": "string.regexp: #811F3F", "hc_black": "constant.character: #569CD6" @@ -455,7 +455,7 @@ "t": "source.perl string.regexp.find.perl constant.character.escape.perl", "r": { "dark_plus": "constant.character.escape: #D7BA7D", - "light_plus": "constant.character.escape: #A31515", + "light_plus": "constant.character.escape: #FF0000", "dark_vs": "string.regexp: #D16969", "light_vs": "string.regexp: #811F3F", "hc_black": "constant.character: #569CD6" @@ -477,7 +477,7 @@ "t": "source.perl string.regexp.find.perl constant.character.escape.perl", "r": { "dark_plus": "constant.character.escape: #D7BA7D", - "light_plus": "constant.character.escape: #A31515", + "light_plus": "constant.character.escape: #FF0000", "dark_vs": "string.regexp: #D16969", "light_vs": "string.regexp: #811F3F", "hc_black": "constant.character: #569CD6" @@ -675,7 +675,7 @@ "t": "source.perl string.quoted.double.perl constant.character.escape.perl", "r": { "dark_plus": "constant.character.escape: #D7BA7D", - "light_plus": "constant.character.escape: #A31515", + "light_plus": "constant.character.escape: #FF0000", "dark_vs": "string: #CE9178", "light_vs": "string: #A31515", "hc_black": "constant.character: #569CD6" @@ -950,7 +950,7 @@ "t": "source.perl string.quoted.double.perl constant.character.escape.perl", "r": { "dark_plus": "constant.character.escape: #D7BA7D", - "light_plus": "constant.character.escape: #A31515", + "light_plus": "constant.character.escape: #FF0000", "dark_vs": "string: #CE9178", "light_vs": "string: #A31515", "hc_black": "constant.character: #569CD6" @@ -1445,7 +1445,7 @@ "t": "source.perl string.quoted.double.perl constant.character.escape.perl", "r": { "dark_plus": "constant.character.escape: #D7BA7D", - "light_plus": "constant.character.escape: #A31515", + "light_plus": "constant.character.escape: #FF0000", "dark_vs": "string: #CE9178", "light_vs": "string: #A31515", "hc_black": "constant.character: #569CD6" @@ -2281,7 +2281,7 @@ "t": "source.perl string.quoted.double.perl constant.character.escape.perl", "r": { "dark_plus": "constant.character.escape: #D7BA7D", - "light_plus": "constant.character.escape: #A31515", + "light_plus": "constant.character.escape: #FF0000", "dark_vs": "string: #CE9178", "light_vs": "string: #A31515", "hc_black": "constant.character: #569CD6" diff --git a/extensions/php/test/colorize-results/issue-28354_php.json b/extensions/php/test/colorize-results/issue-28354_php.json index ec02263f54e..cc9924d3945 100644 --- a/extensions/php/test/colorize-results/issue-28354_php.json +++ b/extensions/php/test/colorize-results/issue-28354_php.json @@ -279,7 +279,7 @@ "t": "text.html.php meta.embedded.block.html source.js meta.embedded.block.php source.php string.quoted.single.php constant.character.escape.php", "r": { "dark_plus": "constant.character.escape: #D7BA7D", - "light_plus": "constant.character.escape: #A31515", + "light_plus": "constant.character.escape: #FF0000", "dark_vs": "string: #CE9178", "light_vs": "string: #A31515", "hc_black": "constant.character: #569CD6" @@ -378,7 +378,7 @@ "t": "text.html.php meta.embedded.block.html source.js meta.embedded.block.php source.php string.quoted.single.php constant.character.escape.php", "r": { "dark_plus": "constant.character.escape: #D7BA7D", - "light_plus": "constant.character.escape: #A31515", + "light_plus": "constant.character.escape: #FF0000", "dark_vs": "string: #CE9178", "light_vs": "string: #A31515", "hc_black": "constant.character: #569CD6" diff --git a/extensions/ruby/test/colorize-results/test_rb.json b/extensions/ruby/test/colorize-results/test_rb.json index 996dbbf0192..4a5fa89c87e 100644 --- a/extensions/ruby/test/colorize-results/test_rb.json +++ b/extensions/ruby/test/colorize-results/test_rb.json @@ -2501,7 +2501,7 @@ "t": "source.ruby string.regexp.classic.ruby meta.group.regexp.ruby constant.character.escape.ruby", "r": { "dark_plus": "constant.character.escape: #D7BA7D", - "light_plus": "constant.character.escape: #A31515", + "light_plus": "constant.character.escape: #FF0000", "dark_vs": "string.regexp: #D16969", "light_vs": "string.regexp: #811F3F", "hc_black": "constant.character: #569CD6" @@ -2523,7 +2523,7 @@ "t": "source.ruby string.regexp.classic.ruby meta.group.regexp.ruby constant.character.escape.ruby", "r": { "dark_plus": "constant.character.escape: #D7BA7D", - "light_plus": "constant.character.escape: #A31515", + "light_plus": "constant.character.escape: #FF0000", "dark_vs": "string.regexp: #D16969", "light_vs": "string.regexp: #811F3F", "hc_black": "constant.character: #569CD6" @@ -2545,7 +2545,7 @@ "t": "source.ruby string.regexp.classic.ruby meta.group.regexp.ruby constant.character.escape.ruby", "r": { "dark_plus": "constant.character.escape: #D7BA7D", - "light_plus": "constant.character.escape: #A31515", + "light_plus": "constant.character.escape: #FF0000", "dark_vs": "string.regexp: #D16969", "light_vs": "string.regexp: #811F3F", "hc_black": "constant.character: #569CD6" @@ -2578,7 +2578,7 @@ "t": "source.ruby string.regexp.classic.ruby meta.group.regexp.ruby meta.group.regexp.ruby constant.character.escape.ruby", "r": { "dark_plus": "constant.character.escape: #D7BA7D", - "light_plus": "constant.character.escape: #A31515", + "light_plus": "constant.character.escape: #FF0000", "dark_vs": "string.regexp: #D16969", "light_vs": "string.regexp: #811F3F", "hc_black": "constant.character: #569CD6" diff --git a/extensions/scss/test/colorize-results/test_scss.json b/extensions/scss/test/colorize-results/test_scss.json index cc598d4c7a2..9528b311bae 100644 --- a/extensions/scss/test/colorize-results/test_scss.json +++ b/extensions/scss/test/colorize-results/test_scss.json @@ -20717,7 +20717,7 @@ "t": "source.css.scss meta.at-rule.each.scss meta.at-rule.while.scss meta.property-list.scss meta.property-list.scss meta.property-value.scss string.quoted.single.scss constant.character.escape.scss", "r": { "dark_plus": "constant.character.escape: #D7BA7D", - "light_plus": "constant.character.escape: #A31515", + "light_plus": "constant.character.escape: #FF0000", "dark_vs": "string: #CE9178", "light_vs": "string: #A31515", "hc_black": "constant.character: #569CD6" @@ -20838,7 +20838,7 @@ "t": "source.css.scss meta.at-rule.each.scss meta.at-rule.while.scss meta.property-list.scss meta.property-value.scss string.quoted.single.scss constant.character.escape.scss", "r": { "dark_plus": "constant.character.escape: #D7BA7D", - "light_plus": "constant.character.escape: #A31515", + "light_plus": "constant.character.escape: #FF0000", "dark_vs": "string: #CE9178", "light_vs": "string: #A31515", "hc_black": "constant.character: #569CD6" @@ -20915,7 +20915,7 @@ "t": "source.css.scss meta.at-rule.each.scss meta.at-rule.while.scss meta.property-list.scss meta.property-value.scss string.quoted.double.scss constant.character.escape.scss", "r": { "dark_plus": "constant.character.escape: #D7BA7D", - "light_plus": "constant.character.escape: #A31515", + "light_plus": "constant.character.escape: #FF0000", "dark_vs": "string: #CE9178", "light_vs": "string: #A31515", "hc_black": "constant.character: #569CD6" From 5e9454432ee008ca8fd89337908c201f148d886a Mon Sep 17 00:00:00 2001 From: Ramya Achutha Rao Date: Sat, 28 Apr 2018 19:24:58 -0700 Subject: [PATCH 209/830] Understanding user interaction in the extension editor --- .../electron-browser/extensionEditor.ts | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/src/vs/workbench/parts/extensions/electron-browser/extensionEditor.ts b/src/vs/workbench/parts/extensions/electron-browser/extensionEditor.ts index ea7188eab8e..bf2fb8027a6 100644 --- a/src/vs/workbench/parts/extensions/electron-browser/extensionEditor.ts +++ b/src/vs/workbench/parts/extensions/electron-browser/extensionEditor.ts @@ -178,6 +178,7 @@ export class ExtensionEditor extends BaseEditor { private transientDisposables: IDisposable[] = []; private disposables: IDisposable[]; private activeWebview: WebviewElement; + private editorLoadComplete: boolean = false; constructor( @ITelemetryService telemetryService: ITelemetryService, @@ -268,6 +269,7 @@ export class ExtensionEditor extends BaseEditor { } setInput(input: ExtensionsInput, options: EditorOptions): TPromise { + this.editorLoadComplete = false; const extension = input.extension; this.transientDisposables = dispose(this.transientDisposables); @@ -379,6 +381,7 @@ export class ExtensionEditor extends BaseEditor { this.navbar.push(NavbarSection.Changelog, localize('changelog', "Changelog")); this.navbar.push(NavbarSection.Dependencies, localize('dependencies', "Dependencies")); + this.editorLoadComplete = true; return super.setInput(input, options); } @@ -406,6 +409,18 @@ export class ExtensionEditor extends BaseEditor { } private onNavbarChange(extension: IExtension, id: string): void { + if (this.editorLoadComplete) { + /* __GDPR__ + "extensionEditor:navbarChange" : { + "recommendationReason": { "classification": "SystemMetaData", "purpose": "FeatureInsight", "isMeasurement": true }, + "${include}": [ + "${GalleryExtensionTelemetryData}" + ] + } + */ + this.telemetryService.publicLog('extensionEditor:navbarChange', assign(extension.telemetryData, { navItem: id })); + } + this.contentDisposables = dispose(this.contentDisposables); this.content.innerHTML = ''; this.activeWebview = null; From dd696eff55839f262d1101d499942d52efffb31b Mon Sep 17 00:00:00 2001 From: Rob Lourens Date: Sat, 28 Apr 2018 21:03:42 -0700 Subject: [PATCH 210/830] Add SettingsEditor2InputFactory so the settings editor can be persisted open --- .../preferences/browser/settingsEditor2.ts | 10 +++--- .../preferences.contribution.ts | 18 ++++++++-- .../electron-browser/preferencesSearch.ts | 2 +- .../preferences/browser/preferencesService.ts | 5 ++- .../common/preferencesEditorInput.ts | 34 +++++++++---------- 5 files changed, 40 insertions(+), 29 deletions(-) diff --git a/src/vs/workbench/parts/preferences/browser/settingsEditor2.ts b/src/vs/workbench/parts/preferences/browser/settingsEditor2.ts index 7ce46bae8ea..0322955dabd 100644 --- a/src/vs/workbench/parts/preferences/browser/settingsEditor2.ts +++ b/src/vs/workbench/parts/preferences/browser/settingsEditor2.ts @@ -4,19 +4,19 @@ *--------------------------------------------------------------------------------------------*/ import * as DOM from 'vs/base/browser/dom'; -import * as arrays from 'vs/base/common/arrays'; -import * as objects from 'vs/base/common/objects'; import { Button } from 'vs/base/browser/ui/button/button'; import { InputBox } from 'vs/base/browser/ui/inputbox/inputBox'; import { IDelegate, IRenderer } from 'vs/base/browser/ui/list/list'; import { List } from 'vs/base/browser/ui/list/listWidget'; import { SelectBox } from 'vs/base/browser/ui/selectBox/selectBox'; import { IAction } from 'vs/base/common/actions'; +import * as arrays from 'vs/base/common/arrays'; import { Delayer, ThrottledDelayer } from 'vs/base/common/async'; import { Color } from 'vs/base/common/color'; import { getErrorMessage, isPromiseCanceledError } from 'vs/base/common/errors'; import { Emitter, Event } from 'vs/base/common/event'; import { IDisposable, dispose } from 'vs/base/common/lifecycle'; +import * as objects from 'vs/base/common/objects'; import { TPromise } from 'vs/base/common/winjs.base'; import 'vs/css!./media/settingsEditor2'; import { localize } from 'vs/nls'; @@ -33,9 +33,9 @@ import { attachButtonStyler, attachInputBoxStyler, attachSelectBoxStyler } from import { ICssStyleCollector, ITheme, IThemeService, registerThemingParticipant } from 'vs/platform/theme/common/themeService'; import { BaseEditor } from 'vs/workbench/browser/parts/editor/baseEditor'; import { EditorOptions } from 'vs/workbench/common/editor'; -import { SearchWidget, SettingsTargetsWidget, SettingsTarget } from 'vs/workbench/parts/preferences/browser/preferencesWidgets'; +import { SearchWidget, SettingsTarget, SettingsTargetsWidget } from 'vs/workbench/parts/preferences/browser/preferencesWidgets'; import { IPreferencesService, ISearchResult, ISetting, ISettingsEditorModel } from 'vs/workbench/services/preferences/common/preferences'; -import { PreferencesEditorInput2 } from 'vs/workbench/services/preferences/common/preferencesEditorInput'; +import { SettingsEditor2Input } from 'vs/workbench/services/preferences/common/preferencesEditorInput'; import { DefaultSettingsEditorModel } from 'vs/workbench/services/preferences/common/preferencesModels'; import { IPreferencesSearchService, ISearchProvider } from '../common/preferences'; @@ -146,7 +146,7 @@ export class SettingsEditor2 extends BaseEditor { this.createBody(prefsEditorElement); } - setInput(input: PreferencesEditorInput2, options: EditorOptions): TPromise { + setInput(input: SettingsEditor2Input, options: EditorOptions): TPromise { const oldInput = this.input; return super.setInput(input) .then(() => { diff --git a/src/vs/workbench/parts/preferences/electron-browser/preferences.contribution.ts b/src/vs/workbench/parts/preferences/electron-browser/preferences.contribution.ts index 7c897096b47..f3e03e7e6d8 100644 --- a/src/vs/workbench/parts/preferences/electron-browser/preferences.contribution.ts +++ b/src/vs/workbench/parts/preferences/electron-browser/preferences.contribution.ts @@ -17,7 +17,7 @@ import { KeyMod, KeyChord, KeyCode } from 'vs/base/common/keyCodes'; import { SyncDescriptor } from 'vs/platform/instantiation/common/descriptors'; import { PreferencesEditor } from 'vs/workbench/parts/preferences/browser/preferencesEditor'; import { SettingsEditor2 } from 'vs/workbench/parts/preferences/browser/settingsEditor2'; -import { DefaultPreferencesEditorInput, PreferencesEditorInput, KeybindingsEditorInput, PreferencesEditorInput2 } from 'vs/workbench/services/preferences/common/preferencesEditorInput'; +import { DefaultPreferencesEditorInput, PreferencesEditorInput, KeybindingsEditorInput, SettingsEditor2Input } from 'vs/workbench/services/preferences/common/preferencesEditorInput'; import { KeybindingsEditor } from 'vs/workbench/parts/preferences/browser/keybindingsEditor'; import { OpenRawDefaultSettingsAction, OpenSettingsAction, OpenGlobalSettingsAction, OpenGlobalKeybindingsFileAction, OpenWorkspaceSettingsAction, OpenFolderSettingsAction, ConfigureLanguageBasedSettingsAction, OPEN_FOLDER_SETTINGS_COMMAND, OpenGlobalKeybindingsAction, OpenSettings2Action } from 'vs/workbench/parts/preferences/browser/preferencesActions'; import { @@ -52,10 +52,10 @@ Registry.as(EditorExtensions.Editors).registerEditor( new EditorDescriptor( SettingsEditor2, SettingsEditor2.ID, - nls.localize('defaultPreferencesEditor2', "Default Preferences Editor 2") + nls.localize('settingsEditor2', "Settings Editor 2") ), [ - new SyncDescriptor(PreferencesEditorInput2) + new SyncDescriptor(SettingsEditor2Input) ] ); @@ -147,6 +147,17 @@ class KeybindingsEditorInputFactory implements IEditorInputFactory { } } +class SettingsEditor2InputFactory implements IEditorInputFactory { + + public serialize(editorInput: SettingsEditor2Input): string { + return JSON.stringify({}); + } + + public deserialize(instantiationService: IInstantiationService, serializedEditorInput: string): EditorInput { + return instantiationService.createInstance(SettingsEditor2Input); + } +} + interface ISerializedDefaultPreferencesEditorInput { resource: string; @@ -173,6 +184,7 @@ class DefaultPreferencesEditorInputFactory implements IEditorInputFactory { Registry.as(EditorInputExtensions.EditorInputFactories).registerEditorInputFactory(PreferencesEditorInput.ID, PreferencesEditorInputFactory); Registry.as(EditorInputExtensions.EditorInputFactories).registerEditorInputFactory(DefaultPreferencesEditorInput.ID, DefaultPreferencesEditorInputFactory); Registry.as(EditorInputExtensions.EditorInputFactories).registerEditorInputFactory(KeybindingsEditorInput.ID, KeybindingsEditorInputFactory); +Registry.as(EditorInputExtensions.EditorInputFactories).registerEditorInputFactory(SettingsEditor2Input.ID, SettingsEditor2InputFactory); // Contribute Global Actions const category = nls.localize('preferences', "Preferences"); diff --git a/src/vs/workbench/parts/preferences/electron-browser/preferencesSearch.ts b/src/vs/workbench/parts/preferences/electron-browser/preferencesSearch.ts index 06459e0d425..3b40c62f656 100644 --- a/src/vs/workbench/parts/preferences/electron-browser/preferencesSearch.ts +++ b/src/vs/workbench/parts/preferences/electron-browser/preferencesSearch.ts @@ -403,7 +403,7 @@ function remoteSettingToISetting(remoteSetting: IRemoteSetting): IExtensionSetti }; } -export class SettingMatches { +class SettingMatches { private readonly descriptionMatchingWords: Map = new Map(); private readonly keyMatchingWords: Map = new Map(); diff --git a/src/vs/workbench/services/preferences/browser/preferencesService.ts b/src/vs/workbench/services/preferences/browser/preferencesService.ts index 832ef7c16e5..87340293eed 100644 --- a/src/vs/workbench/services/preferences/browser/preferencesService.ts +++ b/src/vs/workbench/services/preferences/browser/preferencesService.ts @@ -24,7 +24,7 @@ import { IEnvironmentService } from 'vs/platform/environment/common/environment' import { IPreferencesService, IPreferencesEditorModel, ISetting, getSettingsTargetName, FOLDER_SETTINGS_PATH, DEFAULT_SETTINGS_EDITOR_SETTING } from 'vs/workbench/services/preferences/common/preferences'; import { SettingsEditorModel, DefaultSettingsEditorModel, DefaultKeybindingsEditorModel, defaultKeybindingsContents, DefaultSettings, WorkspaceConfigurationEditorModel } from 'vs/workbench/services/preferences/common/preferencesModels'; import { ITelemetryService } from 'vs/platform/telemetry/common/telemetry'; -import { DefaultPreferencesEditorInput, PreferencesEditorInput, KeybindingsEditorInput, PreferencesEditorInput2 } from 'vs/workbench/services/preferences/common/preferencesEditorInput'; +import { DefaultPreferencesEditorInput, PreferencesEditorInput, KeybindingsEditorInput, SettingsEditor2Input } from 'vs/workbench/services/preferences/common/preferencesEditorInput'; import { ITextModelService } from 'vs/editor/common/services/resolverService'; import { getCodeEditor } from 'vs/editor/browser/services/codeEditorService'; import { EditOperation } from 'vs/editor/common/core/editOperation'; @@ -183,8 +183,7 @@ export class PreferencesService extends Disposable implements IPreferencesServic } openSettings2(): TPromise { - return this.createDefaultSettingsEditorModel(this.userSettingsResource) - .then(model => this.editorService.openEditor(this.instantiationService.createInstance(PreferencesEditorInput2, model), { pinned: true }).then(() => null)); + return this.editorService.openEditor(this.instantiationService.createInstance(SettingsEditor2Input), { pinned: true }).then(() => null); } openWorkspaceSettings(options?: IEditorOptions, position?: EditorPosition): TPromise { diff --git a/src/vs/workbench/services/preferences/common/preferencesEditorInput.ts b/src/vs/workbench/services/preferences/common/preferencesEditorInput.ts index 846574ab258..668c6ff31cb 100644 --- a/src/vs/workbench/services/preferences/common/preferencesEditorInput.ts +++ b/src/vs/workbench/services/preferences/common/preferencesEditorInput.ts @@ -3,17 +3,18 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import * as nls from 'vs/nls'; -import { SideBySideEditorInput, EditorInput } from 'vs/workbench/common/editor'; -import { Verbosity } from 'vs/platform/editor/common/editor'; -import { ResourceEditorInput } from 'vs/workbench/common/editor/resourceEditorInput'; +import { OS } from 'vs/base/common/platform'; import URI from 'vs/base/common/uri'; +import { TPromise } from 'vs/base/common/winjs.base'; import { ITextModelService } from 'vs/editor/common/services/resolverService'; +import * as nls from 'vs/nls'; +import { Verbosity } from 'vs/platform/editor/common/editor'; +import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation'; +import { EditorInput, SideBySideEditorInput } from 'vs/workbench/common/editor'; +import { ResourceEditorInput } from 'vs/workbench/common/editor/resourceEditorInput'; import { IHashService } from 'vs/workbench/services/hash/common/hashService'; import { KeybindingsEditorModel } from 'vs/workbench/services/preferences/common/keybindingsEditorModel'; -import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation'; -import { OS } from 'vs/base/common/platform'; -import { TPromise } from 'vs/base/common/winjs.base'; +import { IPreferencesService } from './preferences'; import { DefaultSettingsEditorModel } from './preferencesModels'; export class PreferencesEditorInput extends SideBySideEditorInput { @@ -83,30 +84,29 @@ export class KeybindingsEditorInput extends EditorInput { } } -export class PreferencesEditorInput2 extends EditorInput { +export class SettingsEditor2Input extends EditorInput { - public static readonly ID: string = 'workbench.input.preferences2'; + public static readonly ID: string = 'workbench.input.settings2'; - public readonly defaultSettingsEditorModel: DefaultSettingsEditorModel; - - constructor(model, @IInstantiationService instantiationService: IInstantiationService) { + constructor( + @IPreferencesService private preferencesService: IPreferencesService + ) { super(); - this.defaultSettingsEditorModel = model; } getTypeId(): string { - return PreferencesEditorInput2.ID; + return SettingsEditor2Input.ID; } getName(): string { - return nls.localize('prefsEditorInput2', "Settings (Experimental)"); + return nls.localize('settingsEditor2InputName', "Settings (Experimental)"); } resolve(refresh?: boolean): TPromise { - return TPromise.wrap(this.defaultSettingsEditorModel); + return >this.preferencesService.createPreferencesEditorModel(URI.parse('vscode://defaultsettings/0/settings.json')); } matches(otherInput: any): boolean { - return otherInput instanceof PreferencesEditorInput2; + return otherInput instanceof SettingsEditor2Input; } } From e431f9e5220bb0aa4f4a52eb76b8a840b742f7ad Mon Sep 17 00:00:00 2001 From: Rob Lourens Date: Sat, 28 Apr 2018 21:52:38 -0700 Subject: [PATCH 211/830] Settings editor - make "edit in settings.json" buttons functional --- .../browser/media/settingsEditor2.css | 12 ++++++++++++ .../parts/preferences/browser/settingsEditor2.ts | 16 ++++++++++++++-- 2 files changed, 26 insertions(+), 2 deletions(-) diff --git a/src/vs/workbench/parts/preferences/browser/media/settingsEditor2.css b/src/vs/workbench/parts/preferences/browser/media/settingsEditor2.css index 2c909354ed2..2c69067c373 100644 --- a/src/vs/workbench/parts/preferences/browser/media/settingsEditor2.css +++ b/src/vs/workbench/parts/preferences/browser/media/settingsEditor2.css @@ -152,6 +152,18 @@ display: flex; } +.settings-editor > .settings-body > .settings-list-container .monaco-list-row .setting-item-value > .edit-in-settings-button, +.settings-editor > .settings-body > .settings-list-container .monaco-list-row .setting-item-value > .edit-in-settings-button:hover, +.settings-editor > .settings-body > .settings-list-container .monaco-list-row .setting-item-value > .edit-in-settings-button:active { + margin: auto; + text-decoration: underline; + opacity: 0.7; +} + +.settings-editor > .settings-body > .settings-list-container .monaco-list-row .setting-item-value > .edit-in-settings-button + .setting-reset-button.monaco-button { + display: none; +} + .settings-editor > .settings-body > .settings-list-container .monaco-list-row .monaco-select-box { width: 100%; font: inherit; diff --git a/src/vs/workbench/parts/preferences/browser/settingsEditor2.ts b/src/vs/workbench/parts/preferences/browser/settingsEditor2.ts index 0322955dabd..fa457535547 100644 --- a/src/vs/workbench/parts/preferences/browser/settingsEditor2.ts +++ b/src/vs/workbench/parts/preferences/browser/settingsEditor2.ts @@ -217,7 +217,7 @@ export class SettingsEditor2 extends BaseEditor { this._register(DOM.addDisposableListener(this.showConfiguredSettingsOnlyCheckbox, 'change', e => this.onShowConfiguredOnlyClicked())); const openSettingsButton = this._register(new Button(headerControlsContainerRight, { title: true, buttonBackground: null, buttonHoverBackground: null })); - openSettingsButton.label = localize('openSettingsLabel', "Open config file"); + openSettingsButton.label = localize('openSettingsLabel', "Open settings.json"); openSettingsButton.element.classList.add('open-settings-button'); this._register(openSettingsButton.onDidClick(() => this.openSettingsFile())); @@ -246,6 +246,7 @@ export class SettingsEditor2 extends BaseEditor { const settingItemRenderer = this.instantiationService.createInstance(SettingItemRenderer); this._register(settingItemRenderer.onDidChangeSetting(e => this.onDidChangeSetting(e.key, e.value))); + this._register(settingItemRenderer.onDidOpenSettings(() => this.openSettingsFile())); const buttonItemRenderer = new ButtonRowRenderer(); this._register(buttonItemRenderer.onDidClick(e => this.onShowAllSettingsClicked())); @@ -657,6 +658,9 @@ class SettingItemRenderer implements IRenderer = new Emitter(); public readonly onDidChangeSetting: Event = this._onDidChangeSetting.event; + private readonly _onDidOpenSettings: Emitter = new Emitter(); + public readonly onDidOpenSettings: Event = this._onDidOpenSettings.event; + get templateId(): string { return SETTINGS_ENTRY_TEMPLATE_ID; } constructor( @@ -728,7 +732,7 @@ class SettingItemRenderer implements IRenderer onChange(parseInt(value))); } else { - template.valueElement.textContent = 'Edit in settings.json!'; + this.renderEditInSettingsJson(entry, template); } } @@ -767,6 +771,14 @@ class SettingItemRenderer implements IRenderer onChange(e))); } + private renderEditInSettingsJson(entry: ISettingItemEntry, template: ISettingItemTemplate): void { + const openSettingsButton = new Button(template.valueElement, { title: true, buttonBackground: null, buttonHoverBackground: null }); + openSettingsButton.onDidClick(() => this._onDidOpenSettings.fire()); + openSettingsButton.label = localize('editInSettingsJson', "Edit in settings.json"); + openSettingsButton.element.classList.add('edit-in-settings-button'); + template.toDispose.push(openSettingsButton); + } + disposeTemplate(template: ISettingItemTemplate): void { dispose(template.toDispose); } From b936b570bdf314fee71252a729b65fec2389ff52 Mon Sep 17 00:00:00 2001 From: Ramya Achutha Rao Date: Sat, 28 Apr 2018 23:47:38 -0700 Subject: [PATCH 212/830] Understanding user interaction in the activity bar --- .../parts/activitybar/activitybarActions.ts | 16 +++++++++++++++- .../electron-browser/extensionEditor.ts | 2 +- 2 files changed, 16 insertions(+), 2 deletions(-) diff --git a/src/vs/workbench/browser/parts/activitybar/activitybarActions.ts b/src/vs/workbench/browser/parts/activitybar/activitybarActions.ts index 96ec92771ac..366b81fe440 100644 --- a/src/vs/workbench/browser/parts/activitybar/activitybarActions.ts +++ b/src/vs/workbench/browser/parts/activitybar/activitybarActions.ts @@ -22,6 +22,7 @@ import { StandardMouseEvent } from 'vs/base/browser/mouseEvent'; import { KeyCode } from 'vs/base/common/keyCodes'; import { StandardKeyboardEvent } from 'vs/base/browser/keyboardEvent'; import { ActivityAction, ActivityActionItem, ICompositeBarColors } from 'vs/workbench/browser/parts/compositebar/compositeBarActions'; +import { ITelemetryService } from 'vs/platform/telemetry/common/telemetry'; export class ViewletActivityAction extends ActivityAction { @@ -32,7 +33,8 @@ export class ViewletActivityAction extends ActivityAction { constructor( activity: IActivity, @IViewletService private viewletService: IViewletService, - @IPartService private partService: IPartService + @IPartService private partService: IPartService, + @ITelemetryService private telemetryService: ITelemetryService ) { super(activity); } @@ -54,11 +56,23 @@ export class ViewletActivityAction extends ActivityAction { // Hide sidebar if selected viewlet already visible if (sideBarVisible && activeViewlet && activeViewlet.getId() === this.activity.id) { + this.logAction('hide'); return this.partService.setSideBarHidden(true); } + this.logAction('show'); return this.viewletService.openViewlet(this.activity.id, true).then(() => this.activate()); } + + private logAction(action: string) { + /* __GDPR__ + "activityBarAction" : { + "viewletId": { "classification": "SystemMetaData", "purpose": "FeatureInsight" }, + "action": { "classification": "SystemMetaData", "purpose": "FeatureInsight" } + } + */ + this.telemetryService.publicLog('activityBarAction', { viewletId: this.activity.id, action }); + } } export class ToggleViewletAction extends Action { diff --git a/src/vs/workbench/parts/extensions/electron-browser/extensionEditor.ts b/src/vs/workbench/parts/extensions/electron-browser/extensionEditor.ts index bf2fb8027a6..bdcf15d35d8 100644 --- a/src/vs/workbench/parts/extensions/electron-browser/extensionEditor.ts +++ b/src/vs/workbench/parts/extensions/electron-browser/extensionEditor.ts @@ -412,7 +412,7 @@ export class ExtensionEditor extends BaseEditor { if (this.editorLoadComplete) { /* __GDPR__ "extensionEditor:navbarChange" : { - "recommendationReason": { "classification": "SystemMetaData", "purpose": "FeatureInsight", "isMeasurement": true }, + "navItem": { "classification": "SystemMetaData", "purpose": "FeatureInsight" }, "${include}": [ "${GalleryExtensionTelemetryData}" ] From c9dec77d3d63598240a3cae4e688ec27ef296761 Mon Sep 17 00:00:00 2001 From: Erich Gamma Date: Sun, 29 Apr 2018 16:50:35 +0200 Subject: [PATCH 213/830] cache the provided tasks --- extensions/npm/src/main.ts | 20 ++++++++++++++++---- 1 file changed, 16 insertions(+), 4 deletions(-) diff --git a/extensions/npm/src/main.ts b/extensions/npm/src/main.ts index 0349a21bac1..8eda53a9441 100644 --- a/extensions/npm/src/main.ts +++ b/extensions/npm/src/main.ts @@ -14,7 +14,7 @@ import { provideNpmScripts, explorerIsEnabled } from './tasks'; let taskProvider: vscode.Disposable | undefined; export async function activate(context: vscode.ExtensionContext): Promise { - taskProvider = registerTaskProvider(); + taskProvider = registerTaskProvider(context); registerExplorer(context); configureHttpRequest(); vscode.workspace.onDidChangeConfiguration((e) => { @@ -26,11 +26,23 @@ export async function activate(context: vscode.ExtensionContext): Promise context.subscriptions.push(addJSONProviders(httpRequest.xhr)); } -function registerTaskProvider(): vscode.Disposable | undefined { +function registerTaskProvider(context: vscode.ExtensionContext): vscode.Disposable | undefined { if (vscode.workspace.workspaceFolders) { + let cachedTasks: vscode.Task[] | undefined = undefined; + + let flushCache = () => cachedTasks = undefined; + let watcher = vscode.workspace.createFileSystemWatcher('**/package.json'); + watcher.onDidChange((_e) => flushCache()); + watcher.onDidDelete((_e) => flushCache()); + watcher.onDidCreate((_e) => flushCache()); + context.subscriptions.push(watcher); + let provider: vscode.TaskProvider = { - provideTasks: () => { - return provideNpmScripts(); + provideTasks: async () => { + if (!cachedTasks) { + cachedTasks = await provideNpmScripts(); + } + return cachedTasks; }, resolveTask(_task: vscode.Task): vscode.Task | undefined { return undefined; From e72ea2399be2d01927ab4e3c60fb5fba72a17da6 Mon Sep 17 00:00:00 2001 From: Erich Gamma Date: Sun, 29 Apr 2018 17:26:25 +0200 Subject: [PATCH 214/830] Switch to use the JSON parser --- extensions/npm/src/tasks.ts | 49 ++++++++++++++++++++++++++++++++----- 1 file changed, 43 insertions(+), 6 deletions(-) diff --git a/extensions/npm/src/tasks.ts b/extensions/npm/src/tasks.ts index be689debdba..9256d54579c 100644 --- a/extensions/npm/src/tasks.ts +++ b/extensions/npm/src/tasks.ts @@ -9,6 +9,7 @@ import * as path from 'path'; import * as fs from 'fs'; import * as minimatch from 'minimatch'; import * as nls from 'vscode-nls'; +import { JSONVisitor, visit, ParseErrorCode } from 'jsonc-parser/lib/main'; const localize = nls.loadMessageBundle(); @@ -235,23 +236,59 @@ async function readFile(file: string): Promise { }); } -export async function getScripts(packageJsonUri: Uri): Promise { +export type StringMap = { [s: string]: string; }; + +async function findAllScripts(buffer: string): Promise { + var scripts: StringMap = {}; + let script: string | undefined = undefined; + let inScripts = false; + + let visitor: JSONVisitor = { + onError(_error: ParseErrorCode, _offset: number, _length: number) { + // TODO inform user about the parse error + }, + onObjectEnd() { + if (inScripts) { + inScripts = false; + } + }, + onLiteralValue(value: any, _offset: number, _length: number) { + console.log(value); + if (script) { + scripts[script] = value; + script = undefined; + } + }, + onObjectProperty(property: string, _offset: number, _length: number) { + if (property === 'scripts') { + inScripts = true; + } + else if (inScripts) { + script = property; + } + } + }; + visit(buffer, visitor); + return scripts; +} + +export async function getScripts(packageJsonUri: Uri): Promise { if (packageJsonUri.scheme !== 'file') { - return null; + return undefined; } let packageJson = packageJsonUri.fsPath; if (!await exists(packageJson)) { - return null; + return undefined; } try { var contents = await readFile(packageJson); - var json = JSON.parse(contents); - return json.scripts; + var json = findAllScripts(contents);//JSON.parse(contents); + return json; } catch (e) { - let localizedParseError = localize('npm.parseError', 'Npm task detection: failed to parse the file {0}', packageJsonUri); + let localizedParseError = localize('npm.parseError', 'Npm task detection: failed to parse the file {0}', packageJsonUri.fsPath); throw new Error(localizedParseError); } } From fdd6df33b75bcdf5ca86ba777c515ceb09b760b0 Mon Sep 17 00:00:00 2001 From: Christof Marti Date: Mon, 30 Apr 2018 08:54:44 +0200 Subject: [PATCH 215/830] Pass focus to editor when closing (#48847) --- .../browser/parts/quickinput/quickInput.ts | 22 +++++++++++++++++-- 1 file changed, 20 insertions(+), 2 deletions(-) diff --git a/src/vs/workbench/browser/parts/quickinput/quickInput.ts b/src/vs/workbench/browser/parts/quickinput/quickInput.ts index 54c49535f2b..f82473876f9 100644 --- a/src/vs/workbench/browser/parts/quickinput/quickInput.ts +++ b/src/vs/workbench/browser/parts/quickinput/quickInput.ts @@ -33,6 +33,7 @@ import { Button } from 'vs/base/browser/ui/button/button'; import { dispose, IDisposable } from 'vs/base/common/lifecycle'; import { onUnexpectedError, canceled } from 'vs/base/common/errors'; import Severity from 'vs/base/common/severity'; +import { IWorkbenchEditorService } from 'vs/workbench/services/editor/common/editorService'; const $ = dom.$; @@ -221,6 +222,7 @@ export class QuickInputService extends Component implements IQuickInputService { @IInstantiationService private instantiationService: IInstantiationService, @IPartService private partService: IPartService, @IQuickOpenService private quickOpenService: IQuickOpenService, + @IWorkbenchEditorService private editorService: IWorkbenchEditorService, @IThemeService themeService: IThemeService ) { super(QuickInputService.ID, themeService); @@ -327,7 +329,7 @@ export class QuickInputService extends Component implements IQuickInputService { } } if (!this.ignoreFocusLost && !this.environmentService.args['sticky-quickopen'] && this.configurationService.getValue(CLOSE_ON_FOCUS_LOST_CONFIG)) { - this.close(); + this.close(undefined, true); } })); this.toUnbind.push(dom.addDisposableListener(this.container, dom.EventType.KEY_DOWN, (e: KeyboardEvent) => { @@ -364,22 +366,38 @@ export class QuickInputService extends Component implements IQuickInputService { this.updateStyles(); } - private close(ok?: true | Thenable) { + private close(ok?: true | Thenable, focusLost?: boolean) { + if (this.container.style.display === 'none') { + return TPromise.as(undefined); + } if (this.controller) { const resolved = this.controller.resolve(ok); if (resolved) { const result = resolved .then(() => { this.container.style.display = 'none'; + if (!focusLost) { + this.restoreFocus(); + } }); result.then(null, onUnexpectedError); return result; } } this.container.style.display = 'none'; + if (!focusLost) { + this.restoreFocus(); + } return TPromise.as(undefined); } + private restoreFocus(): void { + const editor = this.editorService.getActiveEditor(); + if (editor) { + editor.focus(); + } + } + pick(picks: TPromise, options: IPickOptions = {}, token?: CancellationToken): TPromise { return this.show({ type: 'selectMany', From 6039d2451d4458381bb985b231b4d647c7409c14 Mon Sep 17 00:00:00 2001 From: Joao Moreno Date: Mon, 30 Apr 2018 09:45:16 +0200 Subject: [PATCH 216/830] update proxy modules related to #48804 --- package.json | 4 ++-- yarn.lock | 52 ++++++++++++++++++++++++++++++++-------------------- 2 files changed, 34 insertions(+), 22 deletions(-) diff --git a/package.json b/package.json index 7e8cda5c439..b136a090051 100644 --- a/package.json +++ b/package.json @@ -28,8 +28,8 @@ "gc-signals": "^0.0.1", "getmac": "1.0.7", "graceful-fs": "4.1.11", - "http-proxy-agent": "0.2.7", - "https-proxy-agent": "0.3.6", + "http-proxy-agent": "^2.1.0", + "https-proxy-agent": "^2.2.1", "iconv-lite": "0.4.19", "jschardet": "1.6.0", "keytar": "^4.0.5", diff --git a/yarn.lock b/yarn.lock index 8395ed9b532..d7f185e5600 100644 --- a/yarn.lock +++ b/yarn.lock @@ -76,9 +76,11 @@ acorn@^5.2.1: version "5.2.1" resolved "https://registry.yarnpkg.com/acorn/-/acorn-5.2.1.tgz#317ac7821826c22c702d66189ab8359675f135d7" -agent-base@~1.0.1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/agent-base/-/agent-base-1.0.2.tgz#6890d3fb217004b62b70f8928e0fae5f8952a706" +agent-base@4, agent-base@^4.1.0: + version "4.2.0" + resolved "https://registry.yarnpkg.com/agent-base/-/agent-base-4.2.0.tgz#9838b5c3392b962bad031e6a4c5e1024abec45ce" + dependencies: + es6-promisify "^5.0.0" ajv-keywords@^1.0.0: version "1.5.1" @@ -1075,7 +1077,7 @@ debug-fabulous@0.0.X: lazy-debug-legacy "0.0.X" object-assign "4.1.0" -debug@2, debug@2.2.0, debug@~2.2.0: +debug@2.2.0, debug@~2.2.0: version "2.2.0" resolved "https://registry.yarnpkg.com/debug/-/debug-2.2.0.tgz#f87057e995b1a1f6ae6a4960664137bc56f039da" dependencies: @@ -1087,6 +1089,12 @@ debug@2.6.9, debug@2.X, debug@^2.1.1, debug@^2.1.3, debug@^2.2.0: dependencies: ms "2.0.0" +debug@3.1.0, debug@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/debug/-/debug-3.1.0.tgz#5bb5a0672628b64149566ba16819e61518c67261" + dependencies: + ms "2.0.0" + decamelize@^1.0.0, decamelize@^1.1.1, decamelize@^1.1.2: version "1.2.0" resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-1.2.0.tgz#f6534d15148269b20352e7bee26f501f9a191290" @@ -1365,6 +1373,16 @@ es6-map@^0.1.3: es6-symbol "~3.1.1" event-emitter "~0.3.5" +es6-promise@^4.0.3: + version "4.2.4" + resolved "https://registry.yarnpkg.com/es6-promise/-/es6-promise-4.2.4.tgz#dc4221c2b16518760bd8c39a52d8f356fc00ed29" + +es6-promisify@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/es6-promisify/-/es6-promisify-5.0.0.tgz#5109d62f3e56ea967c4b63505aef08291c8a5203" + dependencies: + es6-promise "^4.0.3" + es6-set@~0.1.5: version "0.1.5" resolved "https://registry.yarnpkg.com/es6-set/-/es6-set-0.1.5.tgz#d2b3ec5d4d800ced818db538d28974db0a73ccb1" @@ -1632,10 +1650,6 @@ extend-shallow@^2.0.1: dependencies: is-extendable "^0.1.0" -extend@3: - version "3.0.0" - resolved "https://registry.yarnpkg.com/extend/-/extend-3.0.0.tgz#5a474353b9f3353ddd8176dfd37b91c83a46f1d4" - extend@^3.0.0, extend@~3.0.0, extend@~3.0.1: version "3.0.1" resolved "https://registry.yarnpkg.com/extend/-/extend-3.0.1.tgz#a755ea7bc1adfcc5a31ce7e762dbaadc5e636444" @@ -2648,13 +2662,12 @@ http-errors@1.6.2, http-errors@~1.6.2: setprototypeof "1.0.3" statuses ">= 1.3.1 < 2" -http-proxy-agent@0.2.7: - version "0.2.7" - resolved "https://registry.yarnpkg.com/http-proxy-agent/-/http-proxy-agent-0.2.7.tgz#e17fda65f0902d952ce7921e62c7ff8862655a5e" +http-proxy-agent@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/http-proxy-agent/-/http-proxy-agent-2.1.0.tgz#e4821beef5b2142a2026bd73926fe537631c5405" dependencies: - agent-base "~1.0.1" - debug "2" - extend "3" + agent-base "4" + debug "3.1.0" http-signature@~0.10.0: version "0.10.1" @@ -2680,13 +2693,12 @@ http-signature@~1.2.0: jsprim "^1.2.2" sshpk "^1.7.0" -https-proxy-agent@0.3.6: - version "0.3.6" - resolved "https://registry.yarnpkg.com/https-proxy-agent/-/https-proxy-agent-0.3.6.tgz#713fa38e5d353f50eb14a342febe29033ed1619b" +https-proxy-agent@^2.2.1: + version "2.2.1" + resolved "https://registry.yarnpkg.com/https-proxy-agent/-/https-proxy-agent-2.2.1.tgz#51552970fa04d723e04c56d04178c3f92592bbc0" dependencies: - agent-base "~1.0.1" - debug "2" - extend "3" + agent-base "^4.1.0" + debug "^3.1.0" husky@^0.13.1: version "0.13.4" From 0cf27e0055f9886c6e594085a5dc41deffee2054 Mon Sep 17 00:00:00 2001 From: Joao Moreno Date: Mon, 30 Apr 2018 09:49:05 +0200 Subject: [PATCH 217/830] update semver related to #48804 --- package.json | 2 +- yarn.lock | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/package.json b/package.json index b136a090051..9ee97afab1e 100644 --- a/package.json +++ b/package.json @@ -38,7 +38,7 @@ "native-keymap": "1.2.5", "native-watchdog": "0.3.0", "node-pty": "0.7.4", - "semver": "4.3.6", + "semver": "^5.5.0", "spdlog": "0.6.0", "sudo-prompt": "^8.0.0", "v8-inspect-profiler": "^0.0.7", diff --git a/yarn.lock b/yarn.lock index d7f185e5600..2bed6960b32 100644 --- a/yarn.lock +++ b/yarn.lock @@ -5032,11 +5032,11 @@ semaphore@1.0.5: version "5.4.1" resolved "https://registry.yarnpkg.com/semver/-/semver-5.4.1.tgz#e059c09d8571f0540823733433505d3a2f00b18e" -semver@4.3.6, semver@^4.1.0, semver@^4.3.4: +semver@^4.1.0, semver@^4.3.4: version "4.3.6" resolved "https://registry.yarnpkg.com/semver/-/semver-4.3.6.tgz#300bc6e0e86374f7ba61068b5b1ecd57fc6532da" -semver@^5.4.1: +semver@^5.4.1, semver@^5.5.0: version "5.5.0" resolved "https://registry.yarnpkg.com/semver/-/semver-5.5.0.tgz#dc4bbc7a6ca9d916dee5d43516f0092b58f7b8ab" From 17e78c426ee2301c3e99de23ac38889ed2e1208c Mon Sep 17 00:00:00 2001 From: Joao Moreno Date: Mon, 30 Apr 2018 09:51:18 +0200 Subject: [PATCH 218/830] update yauzl related to #48804 --- package.json | 2 +- yarn.lock | 9 +-------- 2 files changed, 2 insertions(+), 9 deletions(-) diff --git a/package.json b/package.json index 9ee97afab1e..375e4793bf0 100644 --- a/package.json +++ b/package.json @@ -48,7 +48,7 @@ "vscode-ripgrep": "^0.8.1", "vscode-textmate": "^3.3.3", "vscode-xterm": "3.4.0-beta3", - "yauzl": "2.8.0" + "yauzl": "^2.9.1" }, "devDependencies": { "7zip": "0.0.6", diff --git a/yarn.lock b/yarn.lock index 2bed6960b32..accb3c29ee4 100644 --- a/yarn.lock +++ b/yarn.lock @@ -6171,14 +6171,7 @@ yauzl@2.4.1: dependencies: fd-slicer "~1.0.1" -yauzl@2.8.0: - version "2.8.0" - resolved "https://registry.yarnpkg.com/yauzl/-/yauzl-2.8.0.tgz#79450aff22b2a9c5a41ef54e02db907ccfbf9ee2" - dependencies: - buffer-crc32 "~0.2.3" - fd-slicer "~1.0.1" - -yauzl@^2.2.1, yauzl@^2.3.1: +yauzl@^2.2.1, yauzl@^2.3.1, yauzl@^2.9.1: version "2.9.1" resolved "https://registry.yarnpkg.com/yauzl/-/yauzl-2.9.1.tgz#a81981ea70a57946133883f029c5821a89359a7f" dependencies: From 4a77765661999bc9831af5cea7883f397a83021d Mon Sep 17 00:00:00 2001 From: Johannes Rieken Date: Mon, 30 Apr 2018 10:00:49 +0200 Subject: [PATCH 219/830] debt - better way to track keys in tst --- src/vs/base/common/iterator.ts | 7 +- src/vs/base/common/map.ts | 90 ++++++++++--------- src/vs/base/test/common/map.test.ts | 32 +++++-- .../decorations/browser/decorationsService.ts | 12 +-- 4 files changed, 81 insertions(+), 60 deletions(-) diff --git a/src/vs/base/common/iterator.ts b/src/vs/base/common/iterator.ts index 7c2f0fabc1e..7f3c3de302c 100644 --- a/src/vs/base/common/iterator.ts +++ b/src/vs/base/common/iterator.ts @@ -5,8 +5,13 @@ 'use strict'; +export interface IIteratorResult { + readonly done: boolean; + readonly value: T; +} + export interface IIterator { - next(): { readonly done: boolean, readonly value: E }; + next(): IIteratorResult; } export interface INextIterator { diff --git a/src/vs/base/common/map.ts b/src/vs/base/common/map.ts index 55e4fa20e9a..7a21c9eb66b 100644 --- a/src/vs/base/common/map.ts +++ b/src/vs/base/common/map.ts @@ -6,6 +6,8 @@ 'use strict'; import URI from 'vs/base/common/uri'; +import { CharCode } from 'vs/base/common/charCode'; +import { IIterator } from './iterator'; export function values(set: Set): V[]; export function values(map: Map): V[]; @@ -35,7 +37,6 @@ export function getOrSet(map: Map, key: K, value: V): V { export interface IKeyIterator { reset(key: string): this; next(): this; - join(parts: string[]): string; hasNext(): boolean; cmp(a: string): number; @@ -58,10 +59,6 @@ export class StringIterator implements IKeyIterator { return this; } - join(parts: string[]): string { - return parts.join(''); - } - hasNext(): boolean { return this._pos < this._value.length - 1; } @@ -79,9 +76,6 @@ export class StringIterator implements IKeyIterator { export class PathIterator implements IKeyIterator { - private static readonly _fwd = '/'.charCodeAt(0); - private static readonly _bwd = '\\'.charCodeAt(0); - private _value: string; private _from: number; private _to: number; @@ -97,17 +91,13 @@ export class PathIterator implements IKeyIterator { return this._to < this._value.length; } - join(parts: string[]): string { - return parts.join('/'); - } - next(): this { // this._data = key.split(/[\\/]/).filter(s => !!s); this._from = this._to; let justSeps = true; for (; this._to < this._value.length; this._to++) { const ch = this._value.charCodeAt(this._to); - if (ch === PathIterator._fwd || ch === PathIterator._bwd) { + if (ch === CharCode.Slash || ch === CharCode.Backslash) { if (justSeps) { this._from++; } else { @@ -150,14 +140,15 @@ export class PathIterator implements IKeyIterator { } class TernarySearchTreeNode { - str: string; - element: E; + segment: string; + value: E; + key: string; left: TernarySearchTreeNode; mid: TernarySearchTreeNode; right: TernarySearchTreeNode; isEmpty(): boolean { - return !this.left && !this.mid && !this.right && !this.element; + return !this.left && !this.mid && !this.right && !this.value; } } @@ -188,17 +179,17 @@ export class TernarySearchTree { if (!this._root) { this._root = new TernarySearchTreeNode(); - this._root.str = iter.value(); + this._root.segment = iter.value(); } node = this._root; while (true) { - let val = iter.cmp(node.str); + let val = iter.cmp(node.segment); if (val > 0) { // left if (!node.left) { node.left = new TernarySearchTreeNode(); - node.left.str = iter.value(); + node.left.segment = iter.value(); } node = node.left; @@ -206,7 +197,7 @@ export class TernarySearchTree { // right if (!node.right) { node.right = new TernarySearchTreeNode(); - node.right.str = iter.value(); + node.right.segment = iter.value(); } node = node.right; @@ -215,15 +206,16 @@ export class TernarySearchTree { iter.next(); if (!node.mid) { node.mid = new TernarySearchTreeNode(); - node.mid.str = iter.value(); + node.mid.segment = iter.value(); } node = node.mid; } else { break; } } - const oldElement = node.element; - node.element = element; + const oldElement = node.value; + node.value = element; + node.key = key; return oldElement; } @@ -231,7 +223,7 @@ export class TernarySearchTree { let iter = this._iter.reset(key); let node = this._root; while (node) { - let val = iter.cmp(node.str); + let val = iter.cmp(node.segment); if (val > 0) { // left node = node.left; @@ -246,7 +238,7 @@ export class TernarySearchTree { break; } } - return node ? node.element : undefined; + return node ? node.value : undefined; } delete(key: string): void { @@ -257,7 +249,7 @@ export class TernarySearchTree { // find and unset node while (node) { - let val = iter.cmp(node.str); + let val = iter.cmp(node.segment); if (val > 0) { // left stack.push([1, node]); @@ -273,7 +265,7 @@ export class TernarySearchTree { node = node.mid; } else { // remove element - node.element = undefined; + node.value = undefined; // clean up empty nodes while (stack.length > 0 && node.isEmpty()) { @@ -295,7 +287,7 @@ export class TernarySearchTree { let node = this._root; let candidate: E; while (node) { - let val = iter.cmp(node.str); + let val = iter.cmp(node.segment); if (val > 0) { // left node = node.left; @@ -305,20 +297,20 @@ export class TernarySearchTree { } else if (iter.hasNext()) { // mid iter.next(); - candidate = node.element || candidate; + candidate = node.value || candidate; node = node.mid; } else { break; } } - return node && node.element || candidate; + return node && node.value || candidate; } - findSuperstr(key: string): TernarySearchTree { + findSuperstr(key: string): IIterator { let iter = this._iter.reset(key); let node = this._root; while (node) { - let val = iter.cmp(node.str); + let val = iter.cmp(node.segment); if (val > 0) { // left node = node.left; @@ -333,37 +325,47 @@ export class TernarySearchTree { // collect if (!node.mid) { return undefined; + } else { + return this._nodeIterator(node.mid); } - let ret = new TernarySearchTree(this._iter); - ret._root = node.mid; - return ret; } } return undefined; } forEach(callback: (value: E, index: string) => any) { - this._forEach(this._root, [], callback); + this._forEach(this._root, callback); } - private _forEach(node: TernarySearchTreeNode, parts: string[], callback: (value: E, index: string) => any) { + private _forEach(node: TernarySearchTreeNode, callback: (value: E, index: string) => any) { if (node) { // left - this._forEach(node.left, parts, callback); + this._forEach(node.left, callback); // node - parts.push(node.str); - if (node.element) { - callback(node.element, this._iter.join(parts)); + if (node.value) { + // callback(node.value, this._iter.join(parts)); + callback(node.value, node.key); } // mid - this._forEach(node.mid, parts, callback); - parts.pop(); + this._forEach(node.mid, callback); // right - this._forEach(node.right, parts, callback); + this._forEach(node.right, callback); } } + + private *_nodeIterator(node: TernarySearchTreeNode): any & IIterator { + if (node) { + yield* this._nodeIterator(node.left); + if (node.value) { + yield node.value; + } + yield* this._nodeIterator(node.mid); + yield* this._nodeIterator(node.right); + } + } + } export class ResourceMap { diff --git a/src/vs/base/test/common/map.test.ts b/src/vs/base/test/common/map.test.ts index 33924f78f72..23bbe9352ce 100644 --- a/src/vs/base/test/common/map.test.ts +++ b/src/vs/base/test/common/map.test.ts @@ -8,6 +8,7 @@ import { ResourceMap, TernarySearchTree, PathIterator, StringIterator, LinkedMap, Touch, LRUCache } from 'vs/base/common/map'; import * as assert from 'assert'; import URI from 'vs/base/common/uri'; +import { IIteratorResult } from 'vs/base/common/iterator'; suite('Map', () => { @@ -418,17 +419,30 @@ suite('Map', () => { map.set('/user/foo/flip/flop', 3); map.set('/usr/foo', 4); - const elements = map.findSuperstr('/user'); + let item: IIteratorResult; + let iter = map.findSuperstr('/user'); - assertTernarySearchTree(elements, ['foo/bar', 1], ['foo', 2], ['foo/flip/flop', 3]); - // assert.equal(elements.length, 3); - assert.equal(elements.get('foo/bar'), 1); - assert.equal(elements.get('foo'), 2); - assert.equal(elements.get('foo/flip/flop'), 3); + item = iter.next(); + assert.equal(item.value, 2); + assert.equal(item.done, false); + item = iter.next(); + assert.equal(item.value, 1); + assert.equal(item.done, false); + item = iter.next(); + assert.equal(item.value, 3); + assert.equal(item.done, false); + item = iter.next(); + assert.equal(item.value, undefined); + assert.equal(item.done, true); - assertTernarySearchTree(map.findSuperstr('/usr'), ['foo', 4]); - assert.equal(map.findSuperstr('/usr/foo'), undefined); - assert.equal(map.get('/usr/foo'), 4); + iter = map.findSuperstr('/usr'); + item = iter.next(); + assert.equal(item.value, 4); + assert.equal(item.done, false); + + item = iter.next(); + assert.equal(item.value, undefined); + assert.equal(item.done, true); assert.equal(map.findSuperstr('/not'), undefined); assert.equal(map.findSuperstr('/us'), undefined); diff --git a/src/vs/workbench/services/decorations/browser/decorationsService.ts b/src/vs/workbench/services/decorations/browser/decorationsService.ts index 26f60f74f1d..423bded4a78 100644 --- a/src/vs/workbench/services/decorations/browser/decorationsService.ts +++ b/src/vs/workbench/services/decorations/browser/decorationsService.ts @@ -287,13 +287,13 @@ class DecorationProviderWrapper { if (includeChildren) { // (resolved) children - const childTree = this.data.findSuperstr(key); - if (childTree) { - childTree.forEach(value => { - if (value && !isThenable(value)) { - callback(value, true); + const iter = this.data.findSuperstr(key); + if (iter) { + for (let item = iter.next(); !item.done; item = iter.next()) { + if (item.value && !isThenable(item.value)) { + callback(item.value, true); } - }); + } } } } From 467a559a3e1c461630b2a5e315bebef20ded98ea Mon Sep 17 00:00:00 2001 From: Johannes Rieken Date: Mon, 30 Apr 2018 10:42:23 +0200 Subject: [PATCH 220/830] add comment about symbolic links, #47475 --- src/vs/vscode.d.ts | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/vs/vscode.d.ts b/src/vs/vscode.d.ts index 656d89760b1..4aea8f60dec 100644 --- a/src/vs/vscode.d.ts +++ b/src/vs/vscode.d.ts @@ -4819,7 +4819,9 @@ declare module 'vscode' { } /** - * Enumeration of file types. + * Enumeration of file types. The types `File` and `Directory` can also be + * a symbolic links, in that use `FileType.File | FileType.SymbolicLink` and + * `FileType.Directory | FileType.SymbolicLink`. */ export enum FileType { /** From 65f198eb3ad5489db5b614026d378e6b90445ce2 Mon Sep 17 00:00:00 2001 From: Johannes Rieken Date: Mon, 30 Apr 2018 11:02:16 +0200 Subject: [PATCH 221/830] fix #48807 --- src/vs/platform/contextkey/browser/contextKeyService.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/vs/platform/contextkey/browser/contextKeyService.ts b/src/vs/platform/contextkey/browser/contextKeyService.ts index 4d272d3e30e..b661d0e0c0e 100644 --- a/src/vs/platform/contextkey/browser/contextKeyService.ts +++ b/src/vs/platform/contextkey/browser/contextKeyService.ts @@ -89,7 +89,7 @@ class ConfigAwareContextValuesContainer extends Context { const contextKey = `config.${configKey}`; if (contextKey in this._value) { this._value[contextKey] = this._configurationService.getValue(configKey); - this._emitter.fire(configKey); + this._emitter.fire(contextKey); } } } From c79a472c153f540cba0bbd82ba1d276ec31782d7 Mon Sep 17 00:00:00 2001 From: isidor Date: Mon, 30 Apr 2018 11:29:26 +0200 Subject: [PATCH 222/830] debug: use readonly modifier more --- src/vs/base/common/arrays.ts | 6 +- src/vs/workbench/parts/debug/common/debug.ts | 79 ++++++++++--------- .../debugEditorContribution.ts | 2 +- 3 files changed, 44 insertions(+), 43 deletions(-) diff --git a/src/vs/base/common/arrays.ts b/src/vs/base/common/arrays.ts index 2dad9022f32..7f3672e1b4a 100644 --- a/src/vs/base/common/arrays.ts +++ b/src/vs/base/common/arrays.ts @@ -338,7 +338,7 @@ export function uniqueFilter(keyFn: (t: T) => string): (t: T) => boolean { }; } -export function firstIndex(array: T[], fn: (item: T) => boolean): number { +export function firstIndex(array: T[] | ReadonlyArray, fn: (item: T) => boolean): number { for (let i = 0; i < array.length; i++) { const element = array[i]; @@ -350,7 +350,7 @@ export function firstIndex(array: T[], fn: (item: T) => boolean): number { return -1; } -export function first(array: T[], fn: (item: T) => boolean, notFoundValue: T = null): T { +export function first(array: T[] | ReadonlyArray, fn: (item: T) => boolean, notFoundValue: T = null): T { const index = firstIndex(array, fn); return index < 0 ? notFoundValue : array[index]; } @@ -454,4 +454,4 @@ export function shuffle(array: T[]): void { array[i] = array[j]; array[j] = temp; } -} \ No newline at end of file +} diff --git a/src/vs/workbench/parts/debug/common/debug.ts b/src/vs/workbench/parts/debug/common/debug.ts index d3c699c7c20..8c14a6e49c7 100644 --- a/src/vs/workbench/parts/debug/common/debug.ts +++ b/src/vs/workbench/parts/debug/common/debug.ts @@ -81,36 +81,36 @@ export interface ITreeElement { export interface IReplElement extends ITreeElement { toString(): string; - sourceData?: IReplElementSource; + readonly sourceData?: IReplElementSource; } export interface IReplElementSource { - source: Source; - lineNumber: number; - column: number; + readonly source: Source; + readonly lineNumber: number; + readonly column: number; } export interface IExpressionContainer extends ITreeElement { - hasChildren: boolean; - getChildren(): TPromise; + readonly hasChildren: boolean; + getChildren(): TPromise>; } export interface IExpression extends IReplElement, IExpressionContainer { name: string; - value: string; - valueChanged?: boolean; - type?: string; + readonly value: string; + readonly valueChanged?: boolean; + readonly type?: string; } export interface ISession { - root: IWorkspaceFolder; + readonly root: IWorkspaceFolder; stackTrace(args: DebugProtocol.StackTraceArguments): TPromise; exceptionInfo(args: DebugProtocol.ExceptionInfoArguments): TPromise; scopes(args: DebugProtocol.ScopesArguments): TPromise; variables(args: DebugProtocol.VariablesArguments): TPromise; evaluate(args: DebugProtocol.EvaluateArguments): TPromise; - capabilities: DebugProtocol.Capabilities; + readonly capabilities: DebugProtocol.Capabilities; disconnect(restart?: boolean, force?: boolean): TPromise; custom(request: string, args: any): TPromise; onDidEvent: Event; @@ -140,9 +140,9 @@ export enum ProcessState { export interface IProcess extends ITreeElement { getName(includeRoot: boolean): string; - configuration: IConfig; - session: ISession; - state: ProcessState; + readonly configuration: IConfig; + readonly session: ISession; + readonly state: ProcessState; getSourceForUri(modelUri: uri): Source; getThread(threadId: number): IThread; getAllThreads(): IThread[]; @@ -155,33 +155,33 @@ export interface IThread extends ITreeElement { /** * Process the thread belongs to */ - process: IProcess; + readonly process: IProcess; /** * Id of the thread generated by the debug adapter backend. */ - threadId: number; + readonly threadId: number; /** * Name of the thread. */ - name: string; + readonly name: string; /** * Information about the current thread stop event. Null if thread is not stopped. */ - stoppedDetails: IRawStoppedDetails; + readonly stoppedDetails: IRawStoppedDetails; /** * Information about the exception if an 'exception' stopped event raised and DA supports the 'exceptionInfo' request, otherwise null. */ - exceptionInfo: TPromise; + readonly exceptionInfo: TPromise; /** * Gets the callstack if it has already been received from the debug * adapter, otherwise it returns null. */ - getCallStack(): IStackFrame[]; + getCallStack(): ReadonlyArray; /** * Invalidates the callstack cache @@ -192,7 +192,7 @@ export interface IThread extends ITreeElement { * Indicates whether this thread is stopped. The callstack for stopped * threads can be retrieved from the debug adapter. */ - stopped: boolean; + readonly stopped: boolean; next(): TPromise; stepIn(): TPromise; @@ -205,20 +205,20 @@ export interface IThread extends ITreeElement { } export interface IScope extends IExpressionContainer { - name: string; - expensive: boolean; - range?: IRange; + readonly name: string; + readonly expensive: boolean; + readonly range?: IRange; } export interface IStackFrame extends ITreeElement { - thread: IThread; - name: string; - presentationHint: string; - frameId: number; - range: IRange; - source: Source; - getScopes(): TPromise; - getMostSpecificScopes(range: IRange): TPromise; + readonly thread: IThread; + readonly name: string; + readonly presentationHint: string; + readonly frameId: number; + readonly range: IRange; + readonly source: Source; + getScopes(): TPromise>; + getMostSpecificScopes(range: IRange): TPromise>; restart(): TPromise; toString(): string; openInEditor(editorService: IWorkbenchEditorService, preserveFocus?: boolean, sideBySide?: boolean): TPromise; @@ -481,14 +481,14 @@ export interface IConfigurationManager { /** * Returns an object containing the selected launch configuration and the selected configuration name. Both these fields can be null (no folder workspace). */ - selectedConfiguration: { + readonly selectedConfiguration: { launch: ILaunch; name: string; }; selectConfiguration(launch: ILaunch, name?: string, debugStarted?: boolean): void; - getLaunches(): ILaunch[]; + getLaunches(): ReadonlyArray; getLaunch(workspaceUri: uri): ILaunch | undefined; @@ -514,22 +514,22 @@ export interface ILaunch { /** * Resource pointing to the launch.json this object is wrapping. */ - uri: uri; + readonly uri: uri; /** * Name of the launch. */ - name: string; + readonly name: string; /** * Workspace of the launch. Can be null. */ - workspace: IWorkspaceFolder; + readonly workspace: IWorkspaceFolder; /** * Should this launch be shown in the debug dropdown. */ - hidden: boolean; + readonly hidden: boolean; /** * Returns a configuration with the specified name. @@ -569,7 +569,7 @@ export interface IDebugService { /** * Gets the current debug state. */ - state: State; + readonly state: State; /** * Allows to register on debug state changes. @@ -720,6 +720,7 @@ export enum BreakpointWidgetContext { HIT_COUNT = 1, LOG_MESSAGE = 2 } + export interface IDebugEditorContribution extends IEditorContribution { showHover(range: Range, focus: boolean): TPromise; showBreakpointWidget(lineNumber: number, column: number, context?: BreakpointWidgetContext): void; diff --git a/src/vs/workbench/parts/debug/electron-browser/debugEditorContribution.ts b/src/vs/workbench/parts/debug/electron-browser/debugEditorContribution.ts index 4605fadbd7b..9abb1705673 100644 --- a/src/vs/workbench/parts/debug/electron-browser/debugEditorContribution.ts +++ b/src/vs/workbench/parts/debug/electron-browser/debugEditorContribution.ts @@ -592,7 +592,7 @@ export class DebugEditorContribution implements IDebugEditorContribution { })); } - private createInlineValueDecorationsInsideRange(expressions: IExpression[], range: Range): IDecorationOptions[] { + private createInlineValueDecorationsInsideRange(expressions: ReadonlyArray, range: Range): IDecorationOptions[] { const nameValueMap = new Map(); for (let expr of expressions) { nameValueMap.set(expr.name, expr.value); From 34b34f813a344298b4b554ce41463f5be7e4eaae Mon Sep 17 00:00:00 2001 From: Christof Marti Date: Mon, 30 Apr 2018 11:49:40 +0200 Subject: [PATCH 223/830] Remove IQuickOpenService.input() (fixes #48940) --- src/vs/platform/quickOpen/common/quickOpen.ts | 5 -- .../platform/quickinput/common/quickInput.ts | 10 +++ .../parts/quickopen/quickOpenController.ts | 82 +------------------ .../electron-browser/terminalActions.ts | 7 +- .../url/electron-browser/url.contribution.ts | 6 +- .../workbench/test/browser/quickopen.test.ts | 4 - 6 files changed, 19 insertions(+), 95 deletions(-) diff --git a/src/vs/platform/quickOpen/common/quickOpen.ts b/src/vs/platform/quickOpen/common/quickOpen.ts index bb886241cf7..57cc17bc9cd 100644 --- a/src/vs/platform/quickOpen/common/quickOpen.ts +++ b/src/vs/platform/quickOpen/common/quickOpen.ts @@ -165,11 +165,6 @@ export interface IQuickOpenService { */ navigate(next: boolean, quickNavigate?: IQuickNavigateConfiguration): void; - /** - * Opens the quick open box for user input and returns a promise with the user typed value if any. - */ - input(options?: IInputOptions, token?: CancellationToken): TPromise; - /** * Accepts the selected value in quick open if visible. */ diff --git a/src/vs/platform/quickinput/common/quickInput.ts b/src/vs/platform/quickinput/common/quickInput.ts index cd9097598e1..6c741b5a2c8 100644 --- a/src/vs/platform/quickinput/common/quickInput.ts +++ b/src/vs/platform/quickinput/common/quickInput.ts @@ -15,9 +15,19 @@ export interface IQuickInputService { _serviceBrand: any; + /** + * For multi-select only. WIP. + */ pick(picks: TPromise, options?: IPickOptions, token?: CancellationToken): TPromise; + + /** + * Opens the quick open box for user input and returns a promise with the user typed value if any. + */ input(options?: IInputOptions, token?: CancellationToken): TPromise; + focus(): void; + accept(): TPromise; + cancel(): TPromise; } diff --git a/src/vs/workbench/browser/parts/quickopen/quickOpenController.ts b/src/vs/workbench/browser/parts/quickopen/quickOpenController.ts index da5281628c2..9e9040fc431 100644 --- a/src/vs/workbench/browser/parts/quickopen/quickOpenController.ts +++ b/src/vs/workbench/browser/parts/quickopen/quickOpenController.ts @@ -35,7 +35,7 @@ import { IPartService } from 'vs/workbench/services/part/common/partService'; import { QuickOpenHandler, QuickOpenHandlerDescriptor, IQuickOpenRegistry, Extensions, EditorQuickOpenEntry, CLOSE_ON_FOCUS_LOST_CONFIG } from 'vs/workbench/browser/quickopen'; import * as errors from 'vs/base/common/errors'; import { IWorkbenchEditorService } from 'vs/workbench/services/editor/common/editorService'; -import { IPickOpenEntry, IFilePickOpenEntry, IInputOptions, IQuickOpenService, IPickOptions, IShowOptions, IPickOpenItem } from 'vs/platform/quickOpen/common/quickOpen'; +import { IPickOpenEntry, IFilePickOpenEntry, IQuickOpenService, IPickOptions, IShowOptions, IPickOpenItem } from 'vs/platform/quickOpen/common/quickOpen'; import { IConfigurationService } from 'vs/platform/configuration/common/configuration'; import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation'; import { IWorkspaceContextService } from 'vs/platform/workspace/common/workspace'; @@ -163,86 +163,6 @@ export class QuickOpenController extends Component implements IQuickOpenService } } - public input(options: IInputOptions = {}, token: CancellationToken = CancellationToken.None): TPromise { - if (this.pickOpenWidget && this.pickOpenWidget.isVisible()) { - this.pickOpenWidget.hide(HideReason.CANCELED); - } - - const defaultMessage = options.prompt - ? nls.localize('inputModeEntryDescription', "{0} (Press 'Enter' to confirm or 'Escape' to cancel)", options.prompt) - : nls.localize('inputModeEntry', "Press 'Enter' to confirm your input or 'Escape' to cancel"); - - let currentPick = defaultMessage; - let currentValidation: TPromise; - let currentDecoration: Severity; - let lastValue: string; - - const init = (resolve: (value: IPickOpenEntry | TPromise) => any, reject: (value: any) => any) => { - - // open quick pick with just one choice. we will recurse whenever - // the validation/success message changes - this.doPick(TPromise.as([{ label: currentPick, tooltip: currentPick /* make sure message/validation can be read through the hover */ }]), { - ignoreFocusLost: options.ignoreFocusLost, - autoFocus: { autoFocusFirstEntry: true }, - password: options.password, - placeHolder: options.placeHolder, - value: lastValue === void 0 ? options.value : lastValue, - valueSelection: options.valueSelection, - inputDecoration: currentDecoration, - onDidType: (value) => { - if (lastValue !== value) { - - lastValue = value; - - if (options.validateInput) { - if (currentValidation) { - currentValidation.cancel(); - } - - currentValidation = TPromise.timeout(100).then(() => { - return options.validateInput(value).then(message => { - currentDecoration = !!message ? Severity.Error : void 0; - const newPick = message || defaultMessage; - if (newPick !== currentPick) { - options.valueSelection = null; - currentPick = newPick; - resolve(new TPromise(init)); - } - - return !message; - }); - }, err => { - // ignore - return null; - }); - } - } - } - }, token).then(resolve, reject); - }; - - return new TPromise(init).then(item => { - - if (!currentValidation) { - if (options.validateInput) { - currentValidation = options - .validateInput(lastValue === void 0 ? options.value : lastValue) - .then(message => !message); - } else { - currentValidation = TPromise.as(true); - } - } - - return currentValidation.then(valid => { - if (valid && item) { - return lastValue === void 0 ? (options.value || '') : lastValue; - } - - return void 0; - }); - }); - } - public pick(picks: TPromise, options?: IPickOptions, token?: CancellationToken): TPromise; public pick(picks: TPromise, options?: IPickOptions, token?: CancellationToken): TPromise; public pick(picks: string[], options?: IPickOptions, token?: CancellationToken): TPromise; diff --git a/src/vs/workbench/parts/terminal/electron-browser/terminalActions.ts b/src/vs/workbench/parts/terminal/electron-browser/terminalActions.ts index 6ceee359222..8c77df4b3d2 100644 --- a/src/vs/workbench/parts/terminal/electron-browser/terminalActions.ts +++ b/src/vs/workbench/parts/terminal/electron-browser/terminalActions.ts @@ -17,6 +17,7 @@ import { IPanelService } from 'vs/workbench/services/panel/common/panelService'; import { attachSelectBoxStyler } from 'vs/platform/theme/common/styler'; import { IThemeService } from 'vs/platform/theme/common/themeService'; import { IQuickOpenService, IPickOptions } from 'vs/platform/quickOpen/common/quickOpen'; +import { IQuickInputService } from 'vs/platform/quickInput/common/quickInput'; import { ActionBarContributor } from 'vs/workbench/browser/actions'; import { TerminalEntry } from 'vs/workbench/parts/terminal/browser/terminalQuickOpen'; import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation'; @@ -898,6 +899,7 @@ export class RenameTerminalAction extends Action { constructor( id: string, label: string, @IQuickOpenService protected quickOpenService: IQuickOpenService, + @IQuickInputService protected quickInputService: IQuickInputService, @ITerminalService protected terminalService: ITerminalService ) { super(id, label); @@ -908,7 +910,7 @@ export class RenameTerminalAction extends Action { if (!terminalInstance) { return TPromise.as(void 0); } - return this.quickOpenService.input({ + return this.quickInputService.input({ value: terminalInstance.title, prompt: nls.localize('workbench.action.terminal.rename.prompt', "Enter terminal name"), }).then(name => { @@ -1034,9 +1036,10 @@ export class RenameTerminalQuickOpenAction extends RenameTerminalAction { id: string, label: string, private terminal: TerminalEntry, @IQuickOpenService quickOpenService: IQuickOpenService, + @IQuickInputService quickInputService: IQuickInputService, @ITerminalService terminalService: ITerminalService ) { - super(id, label, quickOpenService, terminalService); + super(id, label, quickOpenService, quickInputService, terminalService); this.class = 'quick-open-terminal-configure'; } diff --git a/src/vs/workbench/parts/url/electron-browser/url.contribution.ts b/src/vs/workbench/parts/url/electron-browser/url.contribution.ts index edbcc48c138..89f325aabad 100644 --- a/src/vs/workbench/parts/url/electron-browser/url.contribution.ts +++ b/src/vs/workbench/parts/url/electron-browser/url.contribution.ts @@ -8,7 +8,7 @@ import { SyncActionDescriptor } from 'vs/platform/actions/common/actions'; import { Registry } from 'vs/platform/registry/common/platform'; import { Extensions as ActionExtensions, IWorkbenchActionRegistry } from 'vs/workbench/common/actions'; import { IURLService } from 'vs/platform/url/common/url'; -import { IQuickOpenService } from 'vs/platform/quickOpen/common/quickOpen'; +import { IQuickInputService } from 'vs/platform/quickInput/common/quickInput'; import URI from 'vs/base/common/uri'; import { TPromise } from 'vs/base/common/winjs.base'; import { Action } from 'vs/base/common/actions'; @@ -22,13 +22,13 @@ export class OpenUrlAction extends Action { id: string, label: string, @IURLService private urlService: IURLService, - @IQuickOpenService private quickOpenService: IQuickOpenService, + @IQuickInputService private quickInputService: IQuickInputService, ) { super(id, label); } async run(): TPromise { - const input = await this.quickOpenService.input({ prompt: 'URL to open' }); + const input = await this.quickInputService.input({ prompt: 'URL to open' }); const uri = URI.parse(input); this.urlService.open(uri); diff --git a/src/vs/workbench/test/browser/quickopen.test.ts b/src/vs/workbench/test/browser/quickopen.test.ts index ea2c744785b..c0117ba0b4b 100644 --- a/src/vs/workbench/test/browser/quickopen.test.ts +++ b/src/vs/workbench/test/browser/quickopen.test.ts @@ -26,10 +26,6 @@ export class TestQuickOpenService implements IQuickOpenService { return TPromise.as(null); } - input(options?: any, token?: any): Promise { - return TPromise.as(null); - } - accept(): void { } From fdba0ec7b00683d6109f9f899bda0a4d79ed88e4 Mon Sep 17 00:00:00 2001 From: Alex Dima Date: Mon, 30 Apr 2018 12:07:06 +0200 Subject: [PATCH 224/830] Avoid inner-loop closure allocation --- src/vs/editor/common/model/indentationGuesser.ts | 14 +++++--------- 1 file changed, 5 insertions(+), 9 deletions(-) diff --git a/src/vs/editor/common/model/indentationGuesser.ts b/src/vs/editor/common/model/indentationGuesser.ts index c000376b200..133efa4e5a8 100644 --- a/src/vs/editor/common/model/indentationGuesser.ts +++ b/src/vs/editor/common/model/indentationGuesser.ts @@ -99,21 +99,17 @@ export function guessIndentation(source: ITextBuffer, defaultTabSize: number, de for (let lineNumber = 1; lineNumber <= linesCount; lineNumber++) { let currentLineLength = source.getLineLength(lineNumber); let currentLineText = source.getLineContent(lineNumber); - let charCodeAt: (offset: number) => number; - if (currentLineLength > 65536) { - // if the text buffer is chunk based, so long lines are cons-string, v8 will flattern the string when we check charCode. - // checking charCode on chunks directly is cheaper. - charCodeAt = (offset: number) => source.getLineCharCode(lineNumber, offset); - } else { - charCodeAt = (offset: number) => currentLineText.charCodeAt(offset); - } + + // if the text buffer is chunk based, so long lines are cons-string, v8 will flattern the string when we check charCode. + // checking charCode on chunks directly is cheaper. + const useCurrentLineText = (currentLineLength <= 65536); let currentLineHasContent = false; // does `currentLineText` contain non-whitespace chars let currentLineIndentation = 0; // index at which `currentLineText` contains the first non-whitespace char let currentLineSpacesCount = 0; // count of spaces found in `currentLineText` indentation let currentLineTabsCount = 0; // count of tabs found in `currentLineText` indentation for (let j = 0, lenJ = currentLineLength; j < lenJ; j++) { - let charCode = charCodeAt(j); + let charCode = (useCurrentLineText ? currentLineText.charCodeAt(j) : source.getLineCharCode(lineNumber, j)); if (charCode === CharCode.Tab) { currentLineTabsCount++; From 977396b7d0e88897ee9fe432378baf14689dedf5 Mon Sep 17 00:00:00 2001 From: Alex Dima Date: Mon, 30 Apr 2018 12:11:20 +0200 Subject: [PATCH 225/830] Fixes #44991 --- .../editor/common/model/indentationGuesser.ts | 6 ------ .../test/common/model/textModel.test.ts | 21 ++++++++++++++++++- 2 files changed, 20 insertions(+), 7 deletions(-) diff --git a/src/vs/editor/common/model/indentationGuesser.ts b/src/vs/editor/common/model/indentationGuesser.ts index 133efa4e5a8..3f89f6d9cd3 100644 --- a/src/vs/editor/common/model/indentationGuesser.ts +++ b/src/vs/editor/common/model/indentationGuesser.ts @@ -143,12 +143,6 @@ export function guessIndentation(source: ITextBuffer, defaultTabSize: number, de previousLineIndentation = currentLineIndentation; } - // Take into account the last line as well - let deltaSpacesCount = spacesDiff(previousLineText, previousLineIndentation, '', 0); - if (deltaSpacesCount <= MAX_ALLOWED_TAB_SIZE_GUESS) { - spacesDiffCount[deltaSpacesCount]++; - } - let insertSpaces = defaultInsertSpaces; if (linesIndentedWithTabsCount !== linesIndentedWithSpacesCount) { insertSpaces = (linesIndentedWithTabsCount < linesIndentedWithSpacesCount); diff --git a/src/vs/editor/test/common/model/textModel.test.ts b/src/vs/editor/test/common/model/textModel.test.ts index e6d83dbe0ba..1cbf9e890cb 100644 --- a/src/vs/editor/test/common/model/textModel.test.ts +++ b/src/vs/editor/test/common/model/textModel.test.ts @@ -508,7 +508,7 @@ suite('Editor Model - TextModel', () => { ' x', ' x', ], '6x4, 2x5, 4x8'); - assertGuess(true, 4, [ + assertGuess(true, undefined, [ 'x', ' x', ' x', @@ -531,6 +531,25 @@ suite('Editor Model - TextModel', () => { ], 'mixed whitespace 2'); }); + test('issue #44991: Wrong indentation size auto-detection', () => { + assertGuess(true, 4, [ + 'a = 10 # 0 space indent', + 'b = 5 # 0 space indent', + 'if a > 10: # 0 space indent', + ' a += 1 # 4 space indent delta 4 spaces', + ' if b > 5: # 4 space indent', + ' b += 1 # 8 space indent delta 4 spaces', + ' b += 1 # 8 space indent', + ' b += 1 # 8 space indent', + '# comment line 1 # 0 space indent delta 8 spaces', + '# comment line 2 # 0 space indent', + '# comment line 3 # 0 space indent', + ' b += 1 # 8 space indent delta 8 spaces', + ' b += 1 # 8 space indent', + ' b += 1 # 8 space indent', + ]); + }); + test('validatePosition', () => { let m = TextModel.createFromString('line one\nline two'); From 8d139ed565b85c7a8bd3817fa4d5486eb629597f Mon Sep 17 00:00:00 2001 From: Alex Dima Date: Mon, 30 Apr 2018 12:25:37 +0200 Subject: [PATCH 226/830] Fixes #33456 --- .../electron-browser/toggleMinimap.ts | 36 +++++++++--------- .../toggleRenderControlCharacter.ts | 37 ++++++++++--------- .../toggleRenderWhitespace.ts | 35 ++++++++++-------- 3 files changed, 59 insertions(+), 49 deletions(-) diff --git a/src/vs/workbench/parts/codeEditor/electron-browser/toggleMinimap.ts b/src/vs/workbench/parts/codeEditor/electron-browser/toggleMinimap.ts index 7e34a56e4bb..8361e7b855b 100644 --- a/src/vs/workbench/parts/codeEditor/electron-browser/toggleMinimap.ts +++ b/src/vs/workbench/parts/codeEditor/electron-browser/toggleMinimap.ts @@ -5,28 +5,30 @@ 'use strict'; import * as nls from 'vs/nls'; -import { registerEditorAction, ServicesAccessor, EditorAction } from 'vs/editor/browser/editorExtensions'; import { IConfigurationService, ConfigurationTarget } from 'vs/platform/configuration/common/configuration'; -import { ICodeEditor } from 'vs/editor/browser/editorBrowser'; +import { Registry } from 'vs/platform/registry/common/platform'; +import { IWorkbenchActionRegistry, Extensions as ActionExtensions } from 'vs/workbench/common/actions'; +import { Action } from 'vs/base/common/actions'; +import { TPromise } from 'vs/base/common/winjs.base'; +import { SyncActionDescriptor } from 'vs/platform/actions/common/actions'; -export class ToggleMinimapAction extends EditorAction { +export class ToggleMinimapAction extends Action { + public static readonly ID = 'editor.action.toggleMinimap'; + public static readonly LABEL = nls.localize('toggleMinimap', "View: Toggle Minimap"); - constructor() { - super({ - id: 'editor.action.toggleMinimap', - label: nls.localize('toggleMinimap', "View: Toggle Minimap"), - alias: 'View: Toggle Minimap', - precondition: null - }); + constructor( + id: string, + label: string, + @IConfigurationService private readonly _configurationService: IConfigurationService + ) { + super(id, label); } - public run(accessor: ServicesAccessor, editor: ICodeEditor): void { - const configurationService = accessor.get(IConfigurationService); - - const newValue = !editor.getConfiguration().viewInfo.minimap.enabled; - - configurationService.updateValue('editor.minimap.enabled', newValue, ConfigurationTarget.USER); + public run(): TPromise { + const newValue = !this._configurationService.getValue('editor.minimap.enabled'); + return this._configurationService.updateValue('editor.minimap.enabled', newValue, ConfigurationTarget.USER); } } -registerEditorAction(ToggleMinimapAction); +const registry = Registry.as(ActionExtensions.WorkbenchActions); +registry.registerWorkbenchAction(new SyncActionDescriptor(ToggleMinimapAction, ToggleMinimapAction.ID, ToggleMinimapAction.LABEL), 'View: Toggle Minimap'); diff --git a/src/vs/workbench/parts/codeEditor/electron-browser/toggleRenderControlCharacter.ts b/src/vs/workbench/parts/codeEditor/electron-browser/toggleRenderControlCharacter.ts index b9a12fda3c7..7c35e71b00c 100644 --- a/src/vs/workbench/parts/codeEditor/electron-browser/toggleRenderControlCharacter.ts +++ b/src/vs/workbench/parts/codeEditor/electron-browser/toggleRenderControlCharacter.ts @@ -5,28 +5,31 @@ 'use strict'; import * as nls from 'vs/nls'; -import { registerEditorAction, ServicesAccessor, EditorAction } from 'vs/editor/browser/editorExtensions'; import { IConfigurationService, ConfigurationTarget } from 'vs/platform/configuration/common/configuration'; -import { ICodeEditor } from 'vs/editor/browser/editorBrowser'; +import { Registry } from 'vs/platform/registry/common/platform'; +import { IWorkbenchActionRegistry, Extensions as ActionExtensions } from 'vs/workbench/common/actions'; +import { Action } from 'vs/base/common/actions'; +import { TPromise } from 'vs/base/common/winjs.base'; +import { SyncActionDescriptor } from 'vs/platform/actions/common/actions'; -export class ToggleRenderControlCharacterAction extends EditorAction { +export class ToggleRenderControlCharacterAction extends Action { - constructor() { - super({ - id: 'editor.action.toggleRenderControlCharacter', - label: nls.localize('toggleRenderControlCharacters', "View: Toggle Control Characters"), - alias: 'View: Toggle Control Characters', - precondition: null - }); + public static readonly ID = 'editor.action.toggleRenderControlCharacter'; + public static readonly LABEL = nls.localize('toggleRenderControlCharacters', "View: Toggle Control Characters"); + + constructor( + id: string, + label: string, + @IConfigurationService private readonly _configurationService: IConfigurationService + ) { + super(id, label); } - public run(accessor: ServicesAccessor, editor: ICodeEditor): void { - const configurationService = accessor.get(IConfigurationService); - - let newRenderControlCharacters = !editor.getConfiguration().viewInfo.renderControlCharacters; - - configurationService.updateValue('editor.renderControlCharacters', newRenderControlCharacters, ConfigurationTarget.USER); + public run(): TPromise { + let newRenderControlCharacters = !this._configurationService.getValue('editor.renderControlCharacters'); + return this._configurationService.updateValue('editor.renderControlCharacters', newRenderControlCharacters, ConfigurationTarget.USER); } } -registerEditorAction(ToggleRenderControlCharacterAction); +const registry = Registry.as(ActionExtensions.WorkbenchActions); +registry.registerWorkbenchAction(new SyncActionDescriptor(ToggleRenderControlCharacterAction, ToggleRenderControlCharacterAction.ID, ToggleRenderControlCharacterAction.LABEL), 'View: Toggle Control Characters'); diff --git a/src/vs/workbench/parts/codeEditor/electron-browser/toggleRenderWhitespace.ts b/src/vs/workbench/parts/codeEditor/electron-browser/toggleRenderWhitespace.ts index 9fcb8b26e76..856e35dce60 100644 --- a/src/vs/workbench/parts/codeEditor/electron-browser/toggleRenderWhitespace.ts +++ b/src/vs/workbench/parts/codeEditor/electron-browser/toggleRenderWhitespace.ts @@ -5,25 +5,29 @@ 'use strict'; import * as nls from 'vs/nls'; -import { registerEditorAction, ServicesAccessor, EditorAction } from 'vs/editor/browser/editorExtensions'; import { IConfigurationService, ConfigurationTarget } from 'vs/platform/configuration/common/configuration'; -import { ICodeEditor } from 'vs/editor/browser/editorBrowser'; +import { Registry } from 'vs/platform/registry/common/platform'; +import { IWorkbenchActionRegistry, Extensions as ActionExtensions } from 'vs/workbench/common/actions'; +import { Action } from 'vs/base/common/actions'; +import { TPromise } from 'vs/base/common/winjs.base'; +import { SyncActionDescriptor } from 'vs/platform/actions/common/actions'; -export class ToggleRenderWhitespaceAction extends EditorAction { +export class ToggleRenderWhitespaceAction extends Action { - constructor() { - super({ - id: 'editor.action.toggleRenderWhitespace', - label: nls.localize('toggleRenderWhitespace', "View: Toggle Render Whitespace"), - alias: 'View: Toggle Render Whitespace', - precondition: null - }); + public static readonly ID = 'editor.action.toggleRenderWhitespace'; + public static readonly LABEL = nls.localize('toggleRenderWhitespace', "View: Toggle Render Whitespace"); + + constructor( + id: string, + label: string, + @IConfigurationService private readonly _configurationService: IConfigurationService + ) { + super(id, label); } - public run(accessor: ServicesAccessor, editor: ICodeEditor): void { - const configurationService = accessor.get(IConfigurationService); + public run(): TPromise { + const renderWhitespace = this._configurationService.getValue('editor.renderWhitespace'); - let renderWhitespace = editor.getConfiguration().viewInfo.renderWhitespace; let newRenderWhitespace: string; if (renderWhitespace === 'none') { newRenderWhitespace = 'all'; @@ -31,8 +35,9 @@ export class ToggleRenderWhitespaceAction extends EditorAction { newRenderWhitespace = 'none'; } - configurationService.updateValue('editor.renderWhitespace', newRenderWhitespace, ConfigurationTarget.USER); + return this._configurationService.updateValue('editor.renderWhitespace', newRenderWhitespace, ConfigurationTarget.USER); } } -registerEditorAction(ToggleRenderWhitespaceAction); +const registry = Registry.as(ActionExtensions.WorkbenchActions); +registry.registerWorkbenchAction(new SyncActionDescriptor(ToggleRenderWhitespaceAction, ToggleRenderWhitespaceAction.ID, ToggleRenderWhitespaceAction.LABEL), 'View: Toggle Render Whitespace'); From 727774d6bc32b7a49078f123a8abe5cd0b72aef3 Mon Sep 17 00:00:00 2001 From: Johannes Rieken Date: Mon, 30 Apr 2018 12:30:12 +0200 Subject: [PATCH 227/830] debt - make bulkEdit a service so that we can add create/delete/rename file to it --- build/lib/i18n.resources.json | 6 +- .../browser/services/bulkEditService.ts | 32 +++++ .../contrib/codeAction/codeActionCommands.ts | 17 +-- src/vs/editor/contrib/rename/rename.ts | 20 ++- .../standalone/browser/simpleServices.ts | 48 ++++++- .../standalone/browser/standaloneServices.ts | 5 +- .../mainThreadDocumentsAndEditors.ts | 7 +- .../api/electron-browser/mainThreadEditors.ts | 62 +++------ .../mainThreadSaveParticipant.ts | 8 +- .../parts/search/browser/replaceService.ts | 13 +- .../electron-browser/bulkEditService.ts} | 120 +++++++++++++----- .../api/mainThreadEditors.test.ts | 8 +- src/vs/workbench/workbench.main.ts | 3 + 13 files changed, 224 insertions(+), 125 deletions(-) create mode 100644 src/vs/editor/browser/services/bulkEditService.ts rename src/vs/{editor/browser/services/bulkEdit.ts => workbench/services/bulkEdit/electron-browser/bulkEditService.ts} (73%) diff --git a/build/lib/i18n.resources.json b/build/lib/i18n.resources.json index 4cf0bc4cf6a..0c22b17f5ef 100644 --- a/build/lib/i18n.resources.json +++ b/build/lib/i18n.resources.json @@ -150,6 +150,10 @@ "name": "vs/workbench/services/actions", "project": "vscode-workbench" }, + { + "name": "vs/workbench/services/bulkEdit", + "project": "vscode-workbench" + }, { "name": "vs/workbench/services/configuration", "project": "vscode-workbench" @@ -219,4 +223,4 @@ "project": "vscode-preferences" } ] -} \ No newline at end of file +} diff --git a/src/vs/editor/browser/services/bulkEditService.ts b/src/vs/editor/browser/services/bulkEditService.ts new file mode 100644 index 00000000000..8bbde13a40f --- /dev/null +++ b/src/vs/editor/browser/services/bulkEditService.ts @@ -0,0 +1,32 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +'use strict'; + +import { createDecorator } from 'vs/platform/instantiation/common/instantiation'; +import { WorkspaceEdit } from 'vs/editor/common/modes'; +import { TPromise } from 'vs/base/common/winjs.base'; +import { ICodeEditor } from '../editorBrowser'; +import { Selection } from 'vs/editor/common/core/selection'; +import { IProgressRunner } from 'vs/platform/progress/common/progress'; + +export const IBulkEditService = createDecorator('IWorkspaceEditService'); + + +export interface IBulkEditOptions { + editor?: ICodeEditor; + progress?: IProgressRunner; +} + +export interface IBulkEditResult { + selection: Selection; + ariaSummary: string; +} + +export interface IBulkEditService { + _serviceBrand: any; + + apply(edit: WorkspaceEdit, options: IBulkEditOptions): TPromise; +} + diff --git a/src/vs/editor/contrib/codeAction/codeActionCommands.ts b/src/vs/editor/contrib/codeAction/codeActionCommands.ts index d356d916ed8..3a14450abf1 100644 --- a/src/vs/editor/contrib/codeAction/codeActionCommands.ts +++ b/src/vs/editor/contrib/codeAction/codeActionCommands.ts @@ -8,18 +8,14 @@ import { IDisposable, dispose } from 'vs/base/common/lifecycle'; import { TPromise } from 'vs/base/common/winjs.base'; import { ICodeEditor } from 'vs/editor/browser/editorBrowser'; import { EditorAction, EditorCommand, ServicesAccessor } from 'vs/editor/browser/editorExtensions'; -import { BulkEdit } from 'vs/editor/browser/services/bulkEdit'; import { IEditorContribution } from 'vs/editor/common/editorCommon'; import { EditorContextKeys } from 'vs/editor/common/editorContextKeys'; import { CodeAction } from 'vs/editor/common/modes'; -import { ITextModelService } from 'vs/editor/common/services/resolverService'; import { MessageController } from 'vs/editor/contrib/message/messageController'; import * as nls from 'vs/nls'; import { ICommandService } from 'vs/platform/commands/common/commands'; import { ContextKeyExpr, IContextKeyService } from 'vs/platform/contextkey/common/contextkey'; import { IContextMenuService } from 'vs/platform/contextview/browser/contextView'; -import { IFileService } from 'vs/platform/files/common/files'; -import { optional } from 'vs/platform/instantiation/common/instantiation'; import { IKeybindingService } from 'vs/platform/keybinding/common/keybinding'; import { IMarkerService } from 'vs/platform/markers/common/markers'; import { CodeActionModel, CodeActionsComputeEvent, SUPPORTED_CODE_ACTIONS } from './codeActionModel'; @@ -27,6 +23,7 @@ import { CodeActionAutoApply, CodeActionFilter, CodeActionKind } from './codeAct import { CodeActionContextMenu } from './codeActionWidget'; import { LightBulbWidget } from './lightBulbWidget'; import { escapeRegExpCharacters } from 'vs/base/common/strings'; +import { IBulkEditService } from '../../browser/services/bulkEditService'; function contextKeyForSupportedActions(kind: CodeActionKind) { return ContextKeyExpr.regex( @@ -54,8 +51,7 @@ export class QuickFixController implements IEditorContribution { @ICommandService private readonly _commandService: ICommandService, @IContextMenuService contextMenuService: IContextMenuService, @IKeybindingService private readonly _keybindingService: IKeybindingService, - @ITextModelService private readonly _textModelService: ITextModelService, - @optional(IFileService) private _fileService: IFileService + @IBulkEditService private readonly _bulkEditService: IBulkEditService ) { this._editor = editor; this._model = new CodeActionModel(this._editor, markerService, contextKeyService); @@ -131,19 +127,18 @@ export class QuickFixController implements IEditorContribution { } private async _onApplyCodeAction(action: CodeAction): TPromise { - await applyCodeAction(action, this._textModelService, this._fileService, this._commandService, this._editor); + await applyCodeAction(action, this._bulkEditService, this._commandService, this._editor); } } export async function applyCodeAction( action: CodeAction, - textModelService: ITextModelService, - fileService: IFileService, + bulkEditService: IBulkEditService, commandService: ICommandService, editor: ICodeEditor, ) { if (action.edit) { - await BulkEdit.perform(action.edit.edits, textModelService, fileService, editor); + await bulkEditService.apply(action.edit, { editor }); } if (action.command) { await commandService.executeCommand(action.command.id, ...action.command.arguments); @@ -332,4 +327,4 @@ export class OrganizeImportsAction extends EditorAction { { kind: CodeActionKind.SourceOrganizeImports, includeSourceActions: true }, CodeActionAutoApply.IfSingle); } -} \ No newline at end of file +} diff --git a/src/vs/editor/contrib/rename/rename.ts b/src/vs/editor/contrib/rename/rename.ts index 803d4ac0b8c..380edcb04c9 100644 --- a/src/vs/editor/contrib/rename/rename.ts +++ b/src/vs/editor/contrib/rename/rename.ts @@ -9,18 +9,14 @@ import * as nls from 'vs/nls'; import { illegalArgument } from 'vs/base/common/errors'; import { KeyMod, KeyCode } from 'vs/base/common/keyCodes'; import { TPromise } from 'vs/base/common/winjs.base'; -import { IFileService } from 'vs/platform/files/common/files'; import { RawContextKey, IContextKey, IContextKeyService, ContextKeyExpr } from 'vs/platform/contextkey/common/contextkey'; import { IProgressService } from 'vs/platform/progress/common/progress'; import { registerEditorAction, registerEditorContribution, ServicesAccessor, EditorAction, EditorCommand, registerEditorCommand, registerDefaultLanguageCommand } from 'vs/editor/browser/editorExtensions'; import { IEditorContribution } from 'vs/editor/common/editorCommon'; import { ITextModel } from 'vs/editor/common/model'; import { EditorContextKeys } from 'vs/editor/common/editorContextKeys'; -import { BulkEdit } from 'vs/editor/browser/services/bulkEdit'; import { ICodeEditor } from 'vs/editor/browser/editorBrowser'; import RenameInputField from './renameInputField'; -import { ITextModelService } from 'vs/editor/common/services/resolverService'; -import { optional } from 'vs/platform/instantiation/common/instantiation'; import { IThemeService } from 'vs/platform/theme/common/themeService'; import { asWinJsPromise } from 'vs/base/common/async'; import { WorkspaceEdit, RenameProviderRegistry, RenameProvider, RenameLocation } from 'vs/editor/common/modes'; @@ -31,6 +27,7 @@ import { MessageController } from 'vs/editor/contrib/message/messageController'; import { EditorState, CodeEditorStateFlag } from 'vs/editor/browser/core/editorState'; import { KeybindingsRegistry } from 'vs/platform/keybinding/common/keybindingsRegistry'; import { INotificationService } from 'vs/platform/notification/common/notification'; +import { IBulkEditService } from '../../browser/services/bulkEditService'; class RenameSkeleton { @@ -111,11 +108,10 @@ class RenameController implements IEditorContribution { constructor( private editor: ICodeEditor, @INotificationService private readonly _notificationService: INotificationService, - @ITextModelService private readonly _textModelResolverService: ITextModelService, + @IBulkEditService private readonly _bulkEditService: IBulkEditService, @IProgressService private readonly _progressService: IProgressService, @IContextKeyService contextKeyService: IContextKeyService, @IThemeService themeService: IThemeService, - @optional(IFileService) private _fileService: IFileService ) { this._renameInputField = new RenameInputField(editor, themeService); this._renameInputVisible = CONTEXT_RENAME_INPUT_VISIBLE.bindTo(contextKeyService); @@ -168,7 +164,6 @@ class RenameController implements IEditorContribution { this.editor.focus(); - const edit = new BulkEdit(this.editor, null, this._textModelResolverService, this._fileService); const state = new EditorState(this.editor, CodeEditorStateFlag.Position | CodeEditorStateFlag.Value | CodeEditorStateFlag.Selection | CodeEditorStateFlag.Scroll); const renameOperation = skeleton.provideRenameEdits(newNameOrFocusFlag, 0, [], Range.lift(loc.range).getStartPosition()).then(result => { @@ -180,14 +175,15 @@ class RenameController implements IEditorContribution { } return undefined; } - edit.add(result.edits); - return edit.perform().then(selection => { - if (selection) { - this.editor.setSelection(selection); + return this._bulkEditService.apply(result, { editor: this.editor }).then(result => { + if (result.selection) { + this.editor.setSelection(result.selection); } // alert - alert(nls.localize('aria', "Successfully renamed '{0}' to '{1}'. Summary: {2}", loc.text, newNameOrFocusFlag, edit.ariaMessage())); + if (result.ariaSummary) { + alert(nls.localize('aria', "Successfully renamed '{0}' to '{1}'. Summary: {2}", loc.text, newNameOrFocusFlag, result.ariaSummary)); + } }); }, err => { diff --git a/src/vs/editor/standalone/browser/simpleServices.ts b/src/vs/editor/standalone/browser/simpleServices.ts index ed7728c315d..f1e4783dda8 100644 --- a/src/vs/editor/standalone/browser/simpleServices.ts +++ b/src/vs/editor/standalone/browser/simpleServices.ts @@ -36,12 +36,17 @@ import { ITelemetryService, ITelemetryInfo } from 'vs/platform/telemetry/common/ import { ResolvedKeybinding, Keybinding, createKeybinding, SimpleKeybinding } from 'vs/base/common/keyCodes'; import { ResolvedKeybindingItem } from 'vs/platform/keybinding/common/resolvedKeybindingItem'; import { OS } from 'vs/base/common/platform'; -import { IRange } from 'vs/editor/common/core/range'; +import { IRange, Range } from 'vs/editor/common/core/range'; import { ITextModel } from 'vs/editor/common/model'; import { INotificationService, INotification, INotificationHandle, NoOpNotification, IPromptChoice } from 'vs/platform/notification/common/notification'; import { IConfirmation, IConfirmationResult, IDialogService, IDialogOptions } from 'vs/platform/dialogs/common/dialogs'; import { IPosition, Position as Pos } from 'vs/editor/common/core/position'; import { isEditorConfigurationKey, isDiffEditorConfigurationKey } from 'vs/editor/common/config/commonEditorConfig'; +import { IBulkEditService, IBulkEditOptions, IBulkEditResult } from 'vs/editor/browser/services/bulkEditService'; +import { WorkspaceEdit, isResourceTextEdit, TextEdit } from 'vs/editor/common/modes'; +import { IModelService } from 'vs/editor/common/services/modelService'; +import { EditOperation } from 'vs/editor/common/core/editOperation'; +import { localize } from 'vs/nls'; export class SimpleEditor implements IEditor { @@ -643,3 +648,44 @@ export function applyConfigurationValues(configurationService: IConfigurationSer } }); } + +export class SimpleBulkEditService implements IBulkEditService { + _serviceBrand: any; + + constructor(private readonly _modelService: IModelService) { + // + } + + apply(workspaceEdit: WorkspaceEdit, options: IBulkEditOptions): TPromise { + + let edits = new Map(); + + for (let edit of workspaceEdit.edits) { + if (!isResourceTextEdit(edit)) { + return TPromise.wrapError(new Error('bad edit - only text edits are supported')); + } + let model = this._modelService.getModel(edit.resource); + if (!model) { + return TPromise.wrapError(new Error('bad edit - model not found')); + } + let array = edits.get(model); + if (!array) { + array = []; + } + edits.set(model, array.concat(edit.edits)); + } + + let totalEdits = 0; + let totalFiles = 0; + edits.forEach((edits, model) => { + model.applyEdits(edits.map(edit => EditOperation.replaceMove(Range.lift(edit.range), edit.text))); + totalFiles += 1; + totalEdits += edits.length; + }); + + return TPromise.as({ + selection: undefined, + ariaSummary: localize('summary', 'Made {0} edits in {1} files', totalEdits, totalFiles) + }); + } +} diff --git a/src/vs/editor/standalone/browser/standaloneServices.ts b/src/vs/editor/standalone/browser/standaloneServices.ts index b1086e42833..b59efb0e7ec 100644 --- a/src/vs/editor/standalone/browser/standaloneServices.ts +++ b/src/vs/editor/standalone/browser/standaloneServices.ts @@ -33,7 +33,7 @@ import { CodeEditorServiceImpl } from 'vs/editor/browser/services/codeEditorServ import { SimpleConfigurationService, SimpleResourceConfigurationService, SimpleMenuService, SimpleProgressService, StandaloneCommandService, StandaloneKeybindingService, SimpleNotificationService, - StandaloneTelemetryService, SimpleWorkspaceContextService, SimpleDialogService + StandaloneTelemetryService, SimpleWorkspaceContextService, SimpleDialogService, SimpleBulkEditService } from 'vs/editor/standalone/browser/simpleServices'; import { ContextKeyService } from 'vs/platform/contextkey/browser/contextKeyService'; import { IMenuService } from 'vs/platform/actions/common/actions'; @@ -43,6 +43,7 @@ import { ILogService, NullLogService } from 'vs/platform/log/common/log'; import { INotificationService } from 'vs/platform/notification/common/notification'; import { IDialogService } from 'vs/platform/dialogs/common/dialogs'; import { IListService, ListService } from 'vs/platform/list/browser/listService'; +import { IBulkEditService } from 'vs/editor/browser/services/bulkEditService'; export interface IEditorContextViewService extends IContextViewService { dispose(): void; @@ -192,6 +193,8 @@ export class DynamicStandaloneServices extends Disposable { ensure(IContextMenuService, () => this._register(new ContextMenuService(domElement, telemetryService, notificationService, contextViewService))); ensure(IMenuService, () => new SimpleMenuService(commandService)); + + ensure(IBulkEditService, () => new SimpleBulkEditService(StaticServices.modelService.get(IModelService))); } public get(serviceId: ServiceIdentifier): T { diff --git a/src/vs/workbench/api/electron-browser/mainThreadDocumentsAndEditors.ts b/src/vs/workbench/api/electron-browser/mainThreadDocumentsAndEditors.ts index 5a121fa26d7..167dac86d2b 100644 --- a/src/vs/workbench/api/electron-browser/mainThreadDocumentsAndEditors.ts +++ b/src/vs/workbench/api/electron-browser/mainThreadDocumentsAndEditors.ts @@ -24,6 +24,7 @@ import { IUntitledEditorService } from 'vs/workbench/services/untitled/common/un import { IEditorGroupService } from 'vs/workbench/services/group/common/groupService'; import { isCodeEditor, isDiffEditor, ICodeEditor } from 'vs/editor/browser/editorBrowser'; import URI from 'vs/base/common/uri'; +import { IBulkEditService } from 'vs/editor/browser/services/bulkEditService'; namespace mapset { @@ -310,14 +311,16 @@ export class MainThreadDocumentsAndEditors { @IFileService fileService: IFileService, @ITextModelService textModelResolverService: ITextModelService, @IUntitledEditorService untitledEditorService: IUntitledEditorService, - @IEditorGroupService editorGroupService: IEditorGroupService + @IEditorGroupService editorGroupService: IEditorGroupService, + @IBulkEditService bulkEditService: IBulkEditService, + ) { this._proxy = extHostContext.getProxy(ExtHostContext.ExtHostDocumentsAndEditors); const mainThreadDocuments = new MainThreadDocuments(this, extHostContext, this._modelService, modeService, this._textFileService, fileService, textModelResolverService, untitledEditorService); extHostContext.set(MainContext.MainThreadDocuments, mainThreadDocuments); - const mainThreadTextEditors = new MainThreadTextEditors(this, extHostContext, codeEditorService, this._workbenchEditorService, editorGroupService, textModelResolverService, fileService, this._modelService); + const mainThreadTextEditors = new MainThreadTextEditors(this, extHostContext, codeEditorService, bulkEditService, this._workbenchEditorService, editorGroupService); extHostContext.set(MainContext.MainThreadTextEditors, mainThreadTextEditors); // It is expected that the ctor of the state computer calls our `_onDelta`. diff --git a/src/vs/workbench/api/electron-browser/mainThreadEditors.ts b/src/vs/workbench/api/electron-browser/mainThreadEditors.ts index a47b82e3c7b..df45221c509 100644 --- a/src/vs/workbench/api/electron-browser/mainThreadEditors.ts +++ b/src/vs/workbench/api/electron-browser/mainThreadEditors.ts @@ -4,29 +4,24 @@ *--------------------------------------------------------------------------------------------*/ 'use strict'; -import URI, { UriComponents } from 'vs/base/common/uri'; -import { IDisposable, dispose } from 'vs/base/common/lifecycle'; import { disposed } from 'vs/base/common/errors'; -import { TPromise } from 'vs/base/common/winjs.base'; -import { IDecorationRenderOptions, IDecorationOptions, ILineChange } from 'vs/editor/common/editorCommon'; -import { ISingleEditOperation } from 'vs/editor/common/model'; -import { ICodeEditorService } from 'vs/editor/browser/services/codeEditorService'; -import { IWorkbenchEditorService } from 'vs/workbench/services/editor/common/editorService'; -import { IEditorGroupService } from 'vs/workbench/services/group/common/groupService'; -import { Position as EditorPosition, ITextEditorOptions } from 'vs/platform/editor/common/editor'; -import { MainThreadTextEditor } from './mainThreadEditor'; -import { ITextEditorConfigurationUpdate, TextEditorRevealType, IApplyEditsOptions, IUndoStopOptions, WorkspaceEditDto, reviveWorkspaceEditDto } from 'vs/workbench/api/node/extHost.protocol'; -import { MainThreadDocumentsAndEditors } from './mainThreadDocumentsAndEditors'; +import { IDisposable, dispose } from 'vs/base/common/lifecycle'; import { equals as objectEquals } from 'vs/base/common/objects'; -import { ExtHostContext, MainThreadTextEditorsShape, ExtHostEditorsShape, ITextDocumentShowOptions, ITextEditorPositionData, IExtHostContext } from '../node/extHost.protocol'; +import URI, { UriComponents } from 'vs/base/common/uri'; +import { TPromise } from 'vs/base/common/winjs.base'; +import { IBulkEditService } from 'vs/editor/browser/services/bulkEditService'; +import { ICodeEditorService } from 'vs/editor/browser/services/codeEditorService'; import { IRange } from 'vs/editor/common/core/range'; import { ISelection } from 'vs/editor/common/core/selection'; -import { ITextModelService } from 'vs/editor/common/services/resolverService'; -import { IFileService } from 'vs/platform/files/common/files'; -import { BulkEdit } from 'vs/editor/browser/services/bulkEdit'; -import { IModelService } from 'vs/editor/common/services/modelService'; -import { isCodeEditor, ICodeEditor } from 'vs/editor/browser/editorBrowser'; -import { isResourceFileEdit } from 'vs/editor/common/modes'; +import { IDecorationOptions, IDecorationRenderOptions, ILineChange } from 'vs/editor/common/editorCommon'; +import { ISingleEditOperation } from 'vs/editor/common/model'; +import { ITextEditorOptions, Position as EditorPosition } from 'vs/platform/editor/common/editor'; +import { IApplyEditsOptions, ITextEditorConfigurationUpdate, IUndoStopOptions, TextEditorRevealType, WorkspaceEditDto, reviveWorkspaceEditDto } from 'vs/workbench/api/node/extHost.protocol'; +import { IWorkbenchEditorService } from 'vs/workbench/services/editor/common/editorService'; +import { IEditorGroupService } from 'vs/workbench/services/group/common/groupService'; +import { ExtHostContext, ExtHostEditorsShape, IExtHostContext, ITextDocumentShowOptions, ITextEditorPositionData, MainThreadTextEditorsShape } from '../node/extHost.protocol'; +import { MainThreadDocumentsAndEditors } from './mainThreadDocumentsAndEditors'; +import { MainThreadTextEditor } from './mainThreadEditor'; export class MainThreadTextEditors implements MainThreadTextEditorsShape { @@ -42,11 +37,9 @@ export class MainThreadTextEditors implements MainThreadTextEditorsShape { documentsAndEditors: MainThreadDocumentsAndEditors, extHostContext: IExtHostContext, @ICodeEditorService private readonly _codeEditorService: ICodeEditorService, + @IBulkEditService private readonly _bulkEditService: IBulkEditService, @IWorkbenchEditorService workbenchEditorService: IWorkbenchEditorService, @IEditorGroupService editorGroupService: IEditorGroupService, - @ITextModelService private readonly _textModelResolverService: ITextModelService, - @IFileService private readonly _fileService: IFileService, - @IModelService private readonly _modelService: IModelService, ) { this._proxy = extHostContext.getProxy(ExtHostContext.ExtHostEditors); this._documentsAndEditors = documentsAndEditors; @@ -209,31 +202,8 @@ export class MainThreadTextEditors implements MainThreadTextEditorsShape { } $tryApplyWorkspaceEdit(dto: WorkspaceEditDto): TPromise { - const { edits } = reviveWorkspaceEditDto(dto); - - // First check if loaded models were not changed in the meantime - for (let i = 0, len = edits.length; i < len; i++) { - const edit = edits[i]; - if (!isResourceFileEdit(edit) && edit.modelVersionId) { - let model = this._modelService.getModel(edit.resource); - if (model && model.getVersionId() !== edit.modelVersionId) { - // model changed in the meantime - return TPromise.as(false); - } - } - } - - let codeEditor: ICodeEditor; - let editor = this._workbenchEditorService.getActiveEditor(); - if (editor) { - let candidate = editor.getControl(); - if (isCodeEditor(candidate)) { - codeEditor = candidate; - } - } - - return BulkEdit.perform(edits, this._textModelResolverService, this._fileService, codeEditor).then(() => true); + return this._bulkEditService.apply({ edits }, undefined).then(() => true, err => false); } $tryInsertSnippet(id: string, template: string, ranges: IRange[], opts: IUndoStopOptions): TPromise { diff --git a/src/vs/workbench/api/electron-browser/mainThreadSaveParticipant.ts b/src/vs/workbench/api/electron-browser/mainThreadSaveParticipant.ts index ddeba980ac2..12f214ffe96 100644 --- a/src/vs/workbench/api/electron-browser/mainThreadSaveParticipant.ts +++ b/src/vs/workbench/api/electron-browser/mainThreadSaveParticipant.ts @@ -30,14 +30,13 @@ import { isFalsyOrEmpty } from 'vs/base/common/arrays'; import { ILogService } from 'vs/platform/log/common/log'; import { shouldSynchronizeModel } from 'vs/editor/common/services/modelService'; import { SnippetController2 } from 'vs/editor/contrib/snippet/snippetController2'; -import { ITextModelService } from 'vs/editor/common/services/resolverService'; import { ICommandService } from 'vs/platform/commands/common/commands'; -import { IFileService } from 'vs/platform/files/common/files'; import { CodeActionKind } from 'vs/editor/contrib/codeAction/codeActionTrigger'; import { CodeAction } from 'vs/editor/common/modes'; import { applyCodeAction } from 'vs/editor/contrib/codeAction/codeActionCommands'; import { getCodeActions } from 'vs/editor/contrib/codeAction/codeAction'; import { ICodeActionsOnSaveOptions } from 'vs/editor/common/config/editorOptions'; +import { IBulkEditService } from 'vs/editor/browser/services/bulkEditService'; export interface ISaveParticipantParticipant extends ISaveParticipant { // progressMessage: string; @@ -270,8 +269,7 @@ class FormatOnSaveParticipant implements ISaveParticipantParticipant { class CodeActionOnParticipant implements ISaveParticipant { constructor( - @ITextModelService private readonly _textModelService: ITextModelService, - @IFileService private readonly _fileService: IFileService, + @IBulkEditService private readonly _bulkEditService: IBulkEditService, @ICommandService private readonly _commandService: ICommandService, @ICodeEditorService private readonly _codeEditorService: ICodeEditorService, @IConfigurationService private readonly _configurationService: IConfigurationService @@ -309,7 +307,7 @@ class CodeActionOnParticipant implements ISaveParticipant { private async applyCodeActions(actionsToRun: CodeAction[], editor: ICodeEditor) { for (const action of actionsToRun) { - await applyCodeAction(action, this._textModelService, this._fileService, this._commandService, editor); + await applyCodeAction(action, this._bulkEditService, this._commandService, editor); } } diff --git a/src/vs/workbench/parts/search/browser/replaceService.ts b/src/vs/workbench/parts/search/browser/replaceService.ts index 1d904f9fff1..56e2cf51b59 100644 --- a/src/vs/workbench/parts/search/browser/replaceService.ts +++ b/src/vs/workbench/parts/search/browser/replaceService.ts @@ -15,7 +15,6 @@ import { IWorkbenchEditorService } from 'vs/workbench/services/editor/common/edi import { IModelService } from 'vs/editor/common/services/modelService'; import { IModeService } from 'vs/editor/common/services/modeService'; import { Match, FileMatch, FileMatchOrMatch, ISearchWorkbenchService } from 'vs/workbench/parts/search/common/searchModel'; -import { BulkEdit } from 'vs/editor/browser/services/bulkEdit'; import { IProgressRunner } from 'vs/platform/progress/common/progress'; import { IDiffEditor } from 'vs/editor/browser/editorBrowser'; import { ITextModelService, ITextModelContentProvider } from 'vs/editor/common/services/resolverService'; @@ -23,10 +22,10 @@ import { IWorkbenchContribution } from 'vs/workbench/common/contributions'; import { ScrollType } from 'vs/editor/common/editorCommon'; import { ITextModel } from 'vs/editor/common/model'; import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation'; -import { IFileService } from 'vs/platform/files/common/files'; import { ResourceTextEdit } from 'vs/editor/common/modes'; import { createTextBufferFactoryFromSnapshot } from 'vs/editor/common/model/textModel'; import { ITextFileService } from 'vs/workbench/services/textfile/common/textfiles'; +import { IBulkEditService } from 'vs/editor/browser/services/bulkEditService'; const REPLACE_PREVIEW = 'replacePreview'; @@ -95,10 +94,10 @@ export class ReplaceService implements IReplaceService { public _serviceBrand: any; constructor( - @IFileService private fileService: IFileService, @ITextFileService private textFileService: ITextFileService, @IEditorService private editorService: IWorkbenchEditorService, - @ITextModelService private textModelResolverService: ITextModelService + @ITextModelService private textModelResolverService: ITextModelService, + @IBulkEditService private bulkEditorService: IBulkEditService ) { } public replace(match: Match): TPromise; @@ -108,8 +107,6 @@ export class ReplaceService implements IReplaceService { const edits: ResourceTextEdit[] = []; - let bulkEdit = new BulkEdit(null, progress, this.textModelResolverService, this.fileService); - if (arg instanceof Match) { let match = arg; edits.push(this.createEdit(match, match.replaceString, resource)); @@ -128,8 +125,8 @@ export class ReplaceService implements IReplaceService { }); } - bulkEdit.add(edits); - return bulkEdit.perform().then(() => this.textFileService.saveAll(edits.map(e => e.resource))); + return this.bulkEditorService.apply({ edits }, { progress }).then(() => this.textFileService.saveAll(edits.map(e => e.resource))); + } public openReplacePreview(element: FileMatchOrMatch, preserveFocus?: boolean, sideBySide?: boolean, pinned?: boolean): TPromise { diff --git a/src/vs/editor/browser/services/bulkEdit.ts b/src/vs/workbench/services/bulkEdit/electron-browser/bulkEditService.ts similarity index 73% rename from src/vs/editor/browser/services/bulkEdit.ts rename to src/vs/workbench/services/bulkEdit/electron-browser/bulkEditService.ts index 6753f7bb6e1..291e49fbb73 100644 --- a/src/vs/editor/browser/services/bulkEdit.ts +++ b/src/vs/workbench/services/bulkEdit/electron-browser/bulkEditService.ts @@ -4,40 +4,40 @@ *--------------------------------------------------------------------------------------------*/ 'use strict'; -import * as nls from 'vs/nls'; -import { IDisposable, dispose, IReference } from 'vs/base/common/lifecycle'; + +import { getPathLabel } from 'vs/base/common/labels'; +import { IDisposable, IReference, dispose } from 'vs/base/common/lifecycle'; import URI from 'vs/base/common/uri'; import { TPromise } from 'vs/base/common/winjs.base'; -import { ITextModelService, ITextEditorModel } from 'vs/editor/common/services/resolverService'; -import { IFileService, FileChangeType } from 'vs/platform/files/common/files'; +import { ICodeEditor, isCodeEditor } from 'vs/editor/browser/editorBrowser'; +import { IBulkEditOptions, IBulkEditResult, IBulkEditService } from 'vs/editor/browser/services/bulkEditService'; import { EditOperation } from 'vs/editor/common/core/editOperation'; import { Range } from 'vs/editor/common/core/range'; import { Selection } from 'vs/editor/common/core/selection'; -import { IIdentifiedSingleEditOperation, ITextModel, EndOfLineSequence } from 'vs/editor/common/model'; -import { IProgressRunner, emptyProgressRunner, IProgress } from 'vs/platform/progress/common/progress'; -import { ICodeEditor } from 'vs/editor/browser/editorBrowser'; -import { optional } from 'vs/platform/instantiation/common/instantiation'; -import { ResourceTextEdit, ResourceFileEdit, isResourceFileEdit, isResourceTextEdit } from 'vs/editor/common/modes'; -import { getPathLabel } from 'vs/base/common/labels'; +import { EndOfLineSequence, IIdentifiedSingleEditOperation, ITextModel } from 'vs/editor/common/model'; +import { ResourceFileEdit, ResourceTextEdit, WorkspaceEdit, isResourceFileEdit, isResourceTextEdit } from 'vs/editor/common/modes'; +import { IModelService } from 'vs/editor/common/services/modelService'; +import { ITextEditorModel, ITextModelService } from 'vs/editor/common/services/resolverService'; +import { localize } from 'vs/nls'; +import { FileChangeType, IFileService } from 'vs/platform/files/common/files'; +import { registerSingleton } from 'vs/platform/instantiation/common/extensions'; +import { IProgress, IProgressRunner, emptyProgressRunner } from 'vs/platform/progress/common/progress'; +import { IWorkbenchEditorService } from 'vs/workbench/services/editor/common/editorService'; +abstract class Recording { -abstract class IRecording { + static start(fileService: IFileService): Recording { - static start(fileService: IFileService): IRecording { - - const _changes = new Set(); + let _changes = new Set(); let stop: IDisposable; - if (fileService) { - // watch only when there is a fileservice available - stop = fileService.onFileChanges(event => { - for (const change of event.changes) { - if (change.type === FileChangeType.UPDATED) { - _changes.add(change.resource.toString()); - } + stop = fileService.onFileChanges(event => { + for (const change of event.changes) { + if (change.type === FileChangeType.UPDATED) { + _changes.add(change.resource.toString()); } - }); - } + } + }); return { stop() { return dispose(stop); }, @@ -258,12 +258,6 @@ export type Edit = ResourceFileEdit | ResourceTextEdit; export class BulkEdit { - static perform(edits: Edit[], textModelService: ITextModelService, fileService: IFileService, editor: ICodeEditor): TPromise { - const edit = new BulkEdit(editor, null, textModelService, fileService); - edit.add(edits); - return edit.perform(); - } - private _edits: Edit[] = []; private _editor: ICodeEditor; private _progress: IProgressRunner; @@ -272,7 +266,7 @@ export class BulkEdit { editor: ICodeEditor, progress: IProgressRunner, @ITextModelService private readonly _textModelService: ITextModelService, - @optional(IFileService) private _fileService: IFileService + @IFileService private readonly _fileService: IFileService ) { this._editor = editor; this._progress = progress || emptyProgressRunner; @@ -290,11 +284,11 @@ export class BulkEdit { const editCount = this._edits.reduce((prev, cur) => isResourceFileEdit(cur) ? prev : prev + cur.edits.length, 0); const resourceCount = this._edits.length; if (editCount === 0) { - return nls.localize('summary.0', "Made no edits"); + return localize('summary.0', "Made no edits"); } else if (editCount > 1 && resourceCount > 1) { - return nls.localize('summary.nm', "Made {0} text edits in {1} files", editCount, resourceCount); + return localize('summary.nm', "Made {0} text edits in {1} files", editCount, resourceCount); } else { - return nls.localize('summary.n0', "Made {0} text edits in one file", editCount, resourceCount); + return localize('summary.n0', "Made {0} text edits in one file", editCount, resourceCount); } } @@ -358,7 +352,7 @@ export class BulkEdit { private async _performTextEdits(edits: ResourceTextEdit[], progress: IProgress): TPromise { - const recording = IRecording.start(this._fileService); + const recording = Recording.start(this._fileService); const model = new BulkEditModel(this._textModelService, this._editor, edits, progress); await model.prepare(); @@ -371,7 +365,7 @@ export class BulkEdit { if (conflicts.length > 0) { model.dispose(); - throw new Error(nls.localize('conflict', "These files have changed in the meantime: {0}", conflicts.join(', '))); + throw new Error(localize('conflict', "These files have changed in the meantime: {0}", conflicts.join(', '))); } const selection = await model.apply(); @@ -379,3 +373,59 @@ export class BulkEdit { return selection; } } + +export class BulkEditService implements IBulkEditService { + + _serviceBrand: any; + + constructor( + @IModelService private readonly _modelService: IModelService, + @IWorkbenchEditorService private readonly _workbenchEditorService: IWorkbenchEditorService, + @ITextModelService private readonly _textModelService: ITextModelService, + @IFileService private readonly _fileService: IFileService + ) { + + } + + apply(edit: WorkspaceEdit, options: IBulkEditOptions = {}): TPromise { + + let { edits } = edit; + let codeEditor = options.editor; + + // First check if loaded models were not changed in the meantime + for (let i = 0, len = edits.length; i < len; i++) { + const edit = edits[i]; + if (!isResourceFileEdit(edit) && typeof edit.modelVersionId === 'number') { + let model = this._modelService.getModel(edit.resource); + if (model && model.getVersionId() !== edit.modelVersionId) { + // model changed in the meantime + return TPromise.wrapError(new Error(`${model.uri.toString()} has changed in the meantime`)); + } + } + } + + // try to find code editor + // todo@joh, prefer edit that gets edited + if (!codeEditor) { + let editor = this._workbenchEditorService.getActiveEditor(); + if (editor) { + let candidate = editor.getControl(); + if (isCodeEditor(candidate)) { + codeEditor = candidate; + } + } + } + + const bulkEdit = new BulkEdit(options.editor, options.progress, this._textModelService, this._fileService); + bulkEdit.add(edits); + return bulkEdit.perform().then(selection => { + return { + selection, + ariaSummary: bulkEdit.ariaMessage() + }; + }); + } +} + + +registerSingleton(IBulkEditService, BulkEditService); diff --git a/src/vs/workbench/test/electron-browser/api/mainThreadEditors.test.ts b/src/vs/workbench/test/electron-browser/api/mainThreadEditors.test.ts index 60ef0f54790..2a5fbc98574 100644 --- a/src/vs/workbench/test/electron-browser/api/mainThreadEditors.test.ts +++ b/src/vs/workbench/test/electron-browser/api/mainThreadEditors.test.ts @@ -27,6 +27,7 @@ import { TestFileService } from 'vs/workbench/test/workbenchTestServices'; import { TPromise } from 'vs/base/common/winjs.base'; import { IFileStat } from 'vs/platform/files/common/files'; import { ResourceTextEdit } from 'vs/editor/common/modes'; +import { BulkEditService } from '../../../services/bulkEdit/electron-browser/bulkEditService'; suite('MainThreadEditors', () => { @@ -80,6 +81,8 @@ suite('MainThreadEditors', () => { onEditorGroupMoved = Event.None; }; + const bulkEditService = new BulkEditService(modelService, workbenchEditorService, null, fileService); + const rpcProtocol = new TestRPCProtocol(); rpcProtocol.set(ExtHostContext.ExtHostDocuments, new class extends mock() { $acceptModelChanged(): void { @@ -101,17 +104,16 @@ suite('MainThreadEditors', () => { null, null, editorGroupService, + bulkEditService, ); editors = new MainThreadTextEditors( documentAndEditor, SingleProxyRPCProtocol(null), codeEditorService, + bulkEditService, workbenchEditorService, editorGroupService, - null, - fileService, - modelService ); }); diff --git a/src/vs/workbench/workbench.main.ts b/src/vs/workbench/workbench.main.ts index e5cbc7ad2bf..78ae4f9f1ea 100644 --- a/src/vs/workbench/workbench.main.ts +++ b/src/vs/workbench/workbench.main.ts @@ -131,3 +131,6 @@ import 'vs/workbench/parts/themes/test/electron-browser/themes.test.contribution import 'vs/workbench/parts/watermark/electron-browser/watermark'; import 'vs/workbench/parts/welcome/overlay/browser/welcomeOverlay'; + +// services +import 'vs/workbench/services/bulkEdit/electron-browser/bulkEditService'; From 484175b94ea3f68d5f1e872a99ee47b451d9190f Mon Sep 17 00:00:00 2001 From: Johannes Rieken Date: Mon, 30 Apr 2018 12:41:28 +0200 Subject: [PATCH 228/830] wtf file watching --- .../electron-browser/api/mainThreadDocumentsAndEditors.test.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/src/vs/workbench/test/electron-browser/api/mainThreadDocumentsAndEditors.test.ts b/src/vs/workbench/test/electron-browser/api/mainThreadDocumentsAndEditors.test.ts index 3431b411e91..78b4a771edf 100644 --- a/src/vs/workbench/test/electron-browser/api/mainThreadDocumentsAndEditors.test.ts +++ b/src/vs/workbench/test/electron-browser/api/mainThreadDocumentsAndEditors.test.ts @@ -65,6 +65,7 @@ suite('MainThreadDocumentsAndEditors', () => { null, null, editorGroupService, + null ); /* tslint:enable */ }); From 16909577223cd1b2981b63e071d6ecfe5422e4f4 Mon Sep 17 00:00:00 2001 From: Alex Dima Date: Mon, 30 Apr 2018 12:43:26 +0200 Subject: [PATCH 229/830] Fixes #33659: Reveal first diff immediately --- src/vs/editor/browser/widget/diffNavigator.ts | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/src/vs/editor/browser/widget/diffNavigator.ts b/src/vs/editor/browser/widget/diffNavigator.ts index 5b6497052bd..051efeac72f 100644 --- a/src/vs/editor/browser/widget/diffNavigator.ts +++ b/src/vs/editor/browser/widget/diffNavigator.ts @@ -99,7 +99,7 @@ export class DiffNavigator { if (this._editor.getLineChanges() !== null) { this.revealFirst = false; this.nextIdx = -1; - this.next(); + this.next(ScrollType.Immediate); } } } @@ -167,7 +167,7 @@ export class DiffNavigator { } } - private _move(fwd: boolean): void { + private _move(fwd: boolean, scrollType: ScrollType): void { assert.ok(!this.disposed, 'Illegal State - diff navigator has been disposed'); if (!this.canNavigate()) { @@ -194,7 +194,7 @@ export class DiffNavigator { try { let pos = info.range.getStartPosition(); this._editor.setPosition(pos); - this._editor.revealPositionInCenter(pos, ScrollType.Smooth); + this._editor.revealPositionInCenter(pos, scrollType); } finally { this.ignoreSelectionChange = false; } @@ -204,12 +204,12 @@ export class DiffNavigator { return this.ranges && this.ranges.length > 0; } - next(): void { - this._move(true); + next(scrollType: ScrollType = ScrollType.Smooth): void { + this._move(true, scrollType); } - previous(): void { - this._move(false); + previous(scrollType: ScrollType = ScrollType.Smooth): void { + this._move(false, scrollType); } dispose(): void { From 24300d5fd7f8c1c57f90270f2806ee200269b743 Mon Sep 17 00:00:00 2001 From: Johannes Rieken Date: Mon, 30 Apr 2018 14:03:26 +0200 Subject: [PATCH 230/830] fix #41852 --- .../editor/contrib/parameterHints/parameterHintsWidget.ts | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/src/vs/editor/contrib/parameterHints/parameterHintsWidget.ts b/src/vs/editor/contrib/parameterHints/parameterHintsWidget.ts index 2c874d77fd5..6dc6bb6e29c 100644 --- a/src/vs/editor/contrib/parameterHints/parameterHintsWidget.ts +++ b/src/vs/editor/contrib/parameterHints/parameterHintsWidget.ts @@ -67,6 +67,7 @@ export class ParameterHintsModel extends Disposable { this._register(this.editor.onDidChangeModel(e => this.onModelChanged())); this._register(this.editor.onDidChangeModelLanguage(_ => this.onModelChanged())); this._register(this.editor.onDidChangeCursorSelection(e => this.onCursorChange(e))); + this._register(this.editor.onDidChangeModelContent(e => this.onModelContentChange())); this._register(SignatureHelpProviderRegistry.onDidChange(this.onModelChanged, this)); this.onEditorConfigurationChange(); @@ -162,6 +163,12 @@ export class ParameterHintsModel extends Disposable { } } + private onModelContentChange(): void { + if (this.isTriggered()) { + this.trigger(); + } + } + private onEditorConfigurationChange(): void { this.enabled = this.editor.getConfiguration().contribInfo.parameterHints; From 9a00b80cb560787c2e818e7c0e4d92709608e3fb Mon Sep 17 00:00:00 2001 From: Johannes Rieken Date: Mon, 30 Apr 2018 14:14:42 +0200 Subject: [PATCH 231/830] update dependencies, #48804 --- package.json | 2 +- yarn.lock | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/package.json b/package.json index 375e4793bf0..7f782a0c057 100644 --- a/package.json +++ b/package.json @@ -41,7 +41,7 @@ "semver": "^5.5.0", "spdlog": "0.6.0", "sudo-prompt": "^8.0.0", - "v8-inspect-profiler": "^0.0.7", + "v8-inspect-profiler": "^0.0.8", "vscode-chokidar": "1.6.2", "vscode-debugprotocol": "1.28.0", "vscode-nsfw": "1.0.17", diff --git a/yarn.lock b/yarn.lock index accb3c29ee4..3cddadb8ef0 100644 --- a/yarn.lock +++ b/yarn.lock @@ -5763,9 +5763,9 @@ uuid@^3.0.0, uuid@^3.1.0: version "3.1.0" resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.1.0.tgz#3dd3d3e790abc24d7b0d3a034ffababe28ebbc04" -v8-inspect-profiler@^0.0.7: - version "0.0.7" - resolved "https://registry.yarnpkg.com/v8-inspect-profiler/-/v8-inspect-profiler-0.0.7.tgz#f3b3438680f71961b9647514fe7b9f8748abc462" +v8-inspect-profiler@^0.0.8: + version "0.0.8" + resolved "https://registry.yarnpkg.com/v8-inspect-profiler/-/v8-inspect-profiler-0.0.8.tgz#4d6bedb7c3d1bfc69e5bfdc2ded3d6784a5a76a6" dependencies: chrome-remote-interface "^0.25.3" From ce55e9dbeeba2e41985efef394754a1e946b877c Mon Sep 17 00:00:00 2001 From: Johannes Rieken Date: Mon, 30 Apr 2018 14:24:29 +0200 Subject: [PATCH 232/830] fix #45764 --- .../contrib/referenceSearch/media/referencesWidget.css | 5 ----- 1 file changed, 5 deletions(-) diff --git a/src/vs/editor/contrib/referenceSearch/media/referencesWidget.css b/src/vs/editor/contrib/referenceSearch/media/referencesWidget.css index cc49758d1dd..fd910d83a76 100644 --- a/src/vs/editor/contrib/referenceSearch/media/referencesWidget.css +++ b/src/vs/editor/contrib/referenceSearch/media/referencesWidget.css @@ -9,11 +9,6 @@ border-bottom-width: 1px; } -.monaco-editor .zone-widget .zone-widget-container.reference-zone-widget.results-loaded { - -webkit-transition: height 100ms ease-in; - transition: height 100ms ease-in; -} - .monaco-editor .reference-zone-widget .inline { display: inline-block; vertical-align: top; From 6c81948133c96d17bfecf1d6c4078e6541c0d801 Mon Sep 17 00:00:00 2001 From: Alex Dima Date: Mon, 30 Apr 2018 14:42:19 +0200 Subject: [PATCH 233/830] Have the TestCodeEditor extend from CodeEditorWidget --- .../codeAction/test/codeActionModel.test.ts | 2 +- .../multicursor/test/multicursor.test.ts | 2 - .../test/parameterHintsModel.test.ts | 27 +-- .../snippet/test/snippetController2.test.ts | 2 +- .../snippet/test/snippetSession.test.ts | 2 +- .../contrib/suggest/test/suggestModel.test.ts | 27 +-- .../editor/test/browser/editorTestServices.ts | 47 ++++++ src/vs/editor/test/browser/testCodeEditor.ts | 159 ++++++------------ .../test/browser/testCodeEditorService.ts | 15 -- .../parts/editor/rangeDecorations.test.ts | 2 +- .../api/mainThreadDocumentsAndEditors.test.ts | 38 +++-- .../api/mainThreadEditors.test.ts | 2 +- 12 files changed, 143 insertions(+), 182 deletions(-) create mode 100644 src/vs/editor/test/browser/editorTestServices.ts delete mode 100644 src/vs/editor/test/browser/testCodeEditorService.ts diff --git a/src/vs/editor/contrib/codeAction/test/codeActionModel.test.ts b/src/vs/editor/contrib/codeAction/test/codeActionModel.test.ts index 3b41bb9f7b3..5ecc2949f62 100644 --- a/src/vs/editor/contrib/codeAction/test/codeActionModel.test.ts +++ b/src/vs/editor/contrib/codeAction/test/codeActionModel.test.ts @@ -33,7 +33,7 @@ suite('CodeAction', () => { }); markerService = new MarkerService(); model = TextModel.createFromString('foobar foo bar\nfarboo far boo', undefined, languageIdentifier, uri); - editor = createTestCodeEditor(model); + editor = createTestCodeEditor({ model: model }); editor.setPosition({ lineNumber: 1, column: 1 }); }); diff --git a/src/vs/editor/contrib/multicursor/test/multicursor.test.ts b/src/vs/editor/contrib/multicursor/test/multicursor.test.ts index 56a43c01f36..92437bddc97 100644 --- a/src/vs/editor/contrib/multicursor/test/multicursor.test.ts +++ b/src/vs/editor/contrib/multicursor/test/multicursor.test.ts @@ -107,8 +107,6 @@ suite('Multicursor selection', () => { let multiCursorSelectController = editor.registerAndInstantiateContribution(MultiCursorSelectionController); let selectHighlightsAction = new SelectHighlightsAction(); - editor._isFocused = false; - editor.setSelection(new Selection(1, 1, 1, 1)); findController.getState().change({ searchString: 'some+thing', isRegex: true, isRevealed: true }, false); diff --git a/src/vs/editor/contrib/parameterHints/test/parameterHintsModel.test.ts b/src/vs/editor/contrib/parameterHints/test/parameterHintsModel.test.ts index 4dce80655b2..566c400dad3 100644 --- a/src/vs/editor/contrib/parameterHints/test/parameterHintsModel.test.ts +++ b/src/vs/editor/contrib/parameterHints/test/parameterHintsModel.test.ts @@ -11,32 +11,21 @@ import { Position } from 'vs/editor/common/core/position'; import { ITextModel } from 'vs/editor/common/model'; import { TextModel } from 'vs/editor/common/model/textModel'; import { SignatureHelp, SignatureHelpProvider, SignatureHelpProviderRegistry } from 'vs/editor/common/modes'; -import { MockScopeLocation, TestCodeEditor } from 'vs/editor/test/browser/testCodeEditor'; -import { IContextKeyService } from 'vs/platform/contextkey/common/contextkey'; -import { InstantiationService } from 'vs/platform/instantiation/common/instantiationService'; +import { TestCodeEditor, createTestCodeEditor } from 'vs/editor/test/browser/testCodeEditor'; import { ServiceCollection } from 'vs/platform/instantiation/common/serviceCollection'; -import { MockContextKeyService } from 'vs/platform/keybinding/test/common/mockKeybindingService'; -import { INotificationService } from 'vs/platform/notification/common/notification'; -import { TestNotificationService } from 'vs/platform/notification/test/common/testNotificationService'; import { IStorageService, NullStorageService } from 'vs/platform/storage/common/storage'; import { ITelemetryService } from 'vs/platform/telemetry/common/telemetry'; import { NullTelemetryService } from 'vs/platform/telemetry/common/telemetryUtils'; import { ParameterHintsModel } from '../parameterHintsWidget'; function createMockEditor(model: TextModel): TestCodeEditor { - const contextKeyService = new MockContextKeyService(); - const telemetryService = NullTelemetryService; - const notificationService = new TestNotificationService(); - const instantiationService = new InstantiationService(new ServiceCollection( - [IContextKeyService, contextKeyService], - [ITelemetryService, telemetryService], - [IStorageService, NullStorageService], - [INotificationService, TestNotificationService] - )); - - const editor = new TestCodeEditor(new MockScopeLocation(), {}, false, instantiationService, contextKeyService, notificationService); - editor.setModel(model); - return editor; + return createTestCodeEditor({ + model: model, + serviceCollection: new ServiceCollection( + [ITelemetryService, NullTelemetryService], + [IStorageService, NullStorageService] + ) + }); } diff --git a/src/vs/editor/contrib/snippet/test/snippetController2.test.ts b/src/vs/editor/contrib/snippet/test/snippetController2.test.ts index 526dcb3dc1a..cae9c96ccf9 100644 --- a/src/vs/editor/contrib/snippet/test/snippetController2.test.ts +++ b/src/vs/editor/contrib/snippet/test/snippetController2.test.ts @@ -37,7 +37,7 @@ suite('SnippetController2', function () { setup(function () { contextKeys = new MockContextKeyService(); model = TextModel.createFromString('if\n $state\nfi'); - editor = createTestCodeEditor(model); + editor = createTestCodeEditor({ model: model }); editor.setSelections([new Selection(1, 1, 1, 1), new Selection(2, 5, 2, 5)]); assert.equal(model.getEOL(), '\n'); }); diff --git a/src/vs/editor/contrib/snippet/test/snippetSession.test.ts b/src/vs/editor/contrib/snippet/test/snippetSession.test.ts index 4ac23a4d40c..6c9ea6728db 100644 --- a/src/vs/editor/contrib/snippet/test/snippetSession.test.ts +++ b/src/vs/editor/contrib/snippet/test/snippetSession.test.ts @@ -28,7 +28,7 @@ suite('SnippetSession', function () { setup(function () { model = TextModel.createFromString('function foo() {\n console.log(a);\n}'); - editor = createTestCodeEditor(model); + editor = createTestCodeEditor({ model: model }); editor.setSelections([new Selection(1, 1, 1, 1), new Selection(2, 5, 2, 5)]); assert.equal(model.getEOL(), '\n'); }); diff --git a/src/vs/editor/contrib/suggest/test/suggestModel.test.ts b/src/vs/editor/contrib/suggest/test/suggestModel.test.ts index c6e4aa184b2..881410ed76b 100644 --- a/src/vs/editor/contrib/suggest/test/suggestModel.test.ts +++ b/src/vs/editor/contrib/suggest/test/suggestModel.test.ts @@ -12,11 +12,8 @@ import { TextModel } from 'vs/editor/common/model/textModel'; import { Handler } from 'vs/editor/common/editorCommon'; import { ISuggestSupport, ISuggestResult, SuggestRegistry, SuggestTriggerKind, LanguageIdentifier, TokenizationRegistry, IState, MetadataConsts } from 'vs/editor/common/modes'; import { SuggestModel, LineContext } from 'vs/editor/contrib/suggest/suggestModel'; -import { TestCodeEditor, MockScopeLocation } from 'vs/editor/test/browser/testCodeEditor'; +import { TestCodeEditor, createTestCodeEditor } from 'vs/editor/test/browser/testCodeEditor'; import { ServiceCollection } from 'vs/platform/instantiation/common/serviceCollection'; -import { InstantiationService } from 'vs/platform/instantiation/common/instantiationService'; -import { IContextKeyService } from 'vs/platform/contextkey/common/contextkey'; -import { MockContextKeyService } from 'vs/platform/keybinding/test/common/mockKeybindingService'; import { ITelemetryService } from 'vs/platform/telemetry/common/telemetry'; import { NullTelemetryService } from 'vs/platform/telemetry/common/telemetryUtils'; import { EditOperation } from 'vs/editor/common/core/editOperation'; @@ -31,23 +28,15 @@ import { MockMode } from 'vs/editor/test/common/mocks/mockMode'; import { LanguageConfigurationRegistry } from 'vs/editor/common/modes/languageConfigurationRegistry'; import { TokenizationResult2 } from 'vs/editor/common/core/token'; import { NULL_STATE } from 'vs/editor/common/modes/nullMode'; -import { TestNotificationService } from 'vs/platform/notification/test/common/testNotificationService'; -import { INotificationService } from 'vs/platform/notification/common/notification'; function createMockEditor(model: TextModel): TestCodeEditor { - const contextKeyService = new MockContextKeyService(); - const telemetryService = NullTelemetryService; - const notificationService = new TestNotificationService(); - const instantiationService = new InstantiationService(new ServiceCollection( - [IContextKeyService, contextKeyService], - [ITelemetryService, telemetryService], - [IStorageService, NullStorageService], - [INotificationService, TestNotificationService] - )); - - const editor = new TestCodeEditor(new MockScopeLocation(), {}, false, instantiationService, contextKeyService, notificationService); - editor.setModel(model); - return editor; + return createTestCodeEditor({ + model: model, + serviceCollection: new ServiceCollection( + [ITelemetryService, NullTelemetryService], + [IStorageService, NullStorageService] + ) + }); } suite('SuggestModel - Context', function () { diff --git a/src/vs/editor/test/browser/editorTestServices.ts b/src/vs/editor/test/browser/editorTestServices.ts new file mode 100644 index 00000000000..6d30cd4876a --- /dev/null +++ b/src/vs/editor/test/browser/editorTestServices.ts @@ -0,0 +1,47 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +'use strict'; + +import { IModelDecorationOptions } from 'vs/editor/common/model'; +import { IDecorationRenderOptions } from 'vs/editor/common/editorCommon'; +import { AbstractCodeEditorService } from 'vs/editor/browser/services/abstractCodeEditorService'; +import { ICommandService, ICommandEvent, CommandsRegistry } from 'vs/platform/commands/common/commands'; +import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation'; +import { Emitter, Event } from 'vs/base/common/event'; +import { TPromise } from 'vs/base/common/winjs.base'; + +export class TestCodeEditorService extends AbstractCodeEditorService { + public registerDecorationType(key: string, options: IDecorationRenderOptions, parentTypeKey?: string): void { } + public removeDecorationType(key: string): void { } + public resolveDecorationOptions(decorationTypeKey: string, writable: boolean): IModelDecorationOptions { return null; } +} + +export class TestCommandService implements ICommandService { + _serviceBrand: any; + + private readonly _instantiationService: IInstantiationService; + + private readonly _onWillExecuteCommand: Emitter = new Emitter(); + public readonly onWillExecuteCommand: Event = this._onWillExecuteCommand.event; + + constructor(instantiationService: IInstantiationService) { + this._instantiationService = instantiationService; + } + + public executeCommand(id: string, ...args: any[]): TPromise { + const command = CommandsRegistry.getCommand(id); + if (!command) { + return TPromise.wrapError(new Error(`command '${id}' not found`)); + } + + try { + this._onWillExecuteCommand.fire({ commandId: id }); + const result = this._instantiationService.invokeFunction.apply(this._instantiationService, [command.handler].concat(args)); + return TPromise.as(result); + } catch (err) { + return TPromise.wrapError(err); + } + } +} diff --git a/src/vs/editor/test/browser/testCodeEditor.ts b/src/vs/editor/test/browser/testCodeEditor.ts index 0c0759e7a08..e3ee7932fea 100644 --- a/src/vs/editor/test/browser/testCodeEditor.ts +++ b/src/vs/editor/test/browser/testCodeEditor.ts @@ -8,7 +8,6 @@ import { ServiceCollection } from 'vs/platform/instantiation/common/serviceColle import { InstantiationService } from 'vs/platform/instantiation/common/instantiationService'; import { IContextKeyService, IContextKeyServiceTarget } from 'vs/platform/contextkey/common/contextkey'; import { MockContextKeyService } from 'vs/platform/keybinding/test/common/mockKeybindingService'; -import { CommonCodeEditor } from 'vs/editor/common/commonCodeEditor'; import { CommonEditorConfiguration } from 'vs/editor/common/config/commonEditorConfig'; import { Cursor } from 'vs/editor/common/controller/cursor'; import * as editorCommon from 'vs/editor/common/editorCommon'; @@ -16,126 +15,62 @@ import * as editorBrowser from 'vs/editor/browser/editorBrowser'; import { TextModel } from 'vs/editor/common/model/textModel'; import { TestConfiguration } from 'vs/editor/test/common/mocks/testConfiguration'; import * as editorOptions from 'vs/editor/common/config/editorOptions'; -import { IDisposable } from 'vs/base/common/lifecycle'; -import { Event, Emitter } from 'vs/base/common/event'; -import { IKeyboardEvent } from 'vs/base/browser/keyboardEvent'; -import { IPosition } from 'vs/editor/common/core/position'; -import { EditorExtensionsRegistry } from 'vs/editor/browser/editorExtensions'; -import { TPromise } from 'vs/base/common/winjs.base'; -import { onUnexpectedError } from 'vs/base/common/errors'; -import { IModelDecorationOptions, ITextModel } from 'vs/editor/common/model'; +import { EditorAction } from 'vs/editor/browser/editorExtensions'; +import { ITextModel } from 'vs/editor/common/model'; import { TestNotificationService } from 'vs/platform/notification/test/common/testNotificationService'; import { INotificationService } from 'vs/platform/notification/common/notification'; +import { CodeEditorWidget } from 'vs/editor/browser/widget/codeEditorWidget'; +import { IConstructorSignature1 } from 'vs/platform/instantiation/common/instantiation'; +import { TestCodeEditorService, TestCommandService } from 'vs/editor/test/browser/editorTestServices'; +import { ICodeEditorService } from 'vs/editor/browser/services/codeEditorService'; +import { ICommandService } from 'vs/platform/commands/common/commands'; +import { TestThemeService } from 'vs/platform/theme/test/common/testThemeService'; +import { IThemeService } from 'vs/platform/theme/common/themeService'; -export class TestCodeEditor extends CommonCodeEditor implements editorBrowser.ICodeEditor { +export class TestCodeEditor extends CodeEditorWidget implements editorBrowser.ICodeEditor { - private readonly _onMouseUp: Emitter = this._register(new Emitter()); - public readonly onMouseUp: Event = this._onMouseUp.event; - - private readonly _onMouseDown: Emitter = this._register(new Emitter()); - public readonly onMouseDown: Event = this._onMouseDown.event; - - private readonly _onMouseDrag: Emitter = this._register(new Emitter()); - public readonly onMouseDrag: Event = this._onMouseDrag.event; - - private readonly _onMouseDrop: Emitter = this._register(new Emitter()); - public readonly onMouseDrop: Event = this._onMouseDrop.event; - - private readonly _onContextMenu: Emitter = this._register(new Emitter()); - public readonly onContextMenu: Event = this._onContextMenu.event; - - private readonly _onMouseMove: Emitter = this._register(new Emitter()); - public readonly onMouseMove: Event = this._onMouseMove.event; - - private readonly _onMouseLeave: Emitter = this._register(new Emitter()); - public readonly onMouseLeave: Event = this._onMouseLeave.event; - - private readonly _onKeyUp: Emitter = this._register(new Emitter()); - public readonly onKeyUp: Event = this._onKeyUp.event; - - private readonly _onKeyDown: Emitter = this._register(new Emitter()); - public readonly onKeyDown: Event = this._onKeyDown.event; - - private readonly _onDidScrollChange: Emitter = this._register(new Emitter()); - public readonly onDidScrollChange: Event = this._onDidScrollChange.event; - - private readonly _onDidChangeViewZones: Emitter = this._register(new Emitter()); - public readonly onDidChangeViewZones: Event = this._onDidChangeViewZones.event; - - public _isFocused = true; + protected _getContributions(): IConstructorSignature1[] { + return []; + } + protected _getActions(): EditorAction[] { + return []; + } + //#region testing overrides protected _createConfiguration(options: editorOptions.IEditorOptions): CommonEditorConfiguration { return new TestConfiguration(options); } + protected _createView(): void { + // Never create a view + } + //#endregion - public layout(dimension?: editorCommon.IDimension): void { } - - public focus(): void { } - public isFocused(): boolean { return this._isFocused; } - public hasWidgetFocus(): boolean { return true; } - - protected _enableEmptySelectionClipboard(): boolean { return false; } - protected _scheduleAtNextAnimationFrame(callback: () => void): IDisposable { throw new Error('Notimplemented'); } - protected _createView(): void { } - - protected _registerDecorationType(key: string, options: editorCommon.IDecorationRenderOptions, parentTypeKey?: string): void { throw new Error('NotImplemented'); } - protected _removeDecorationType(key: string): void { throw new Error('NotImplemented'); } - protected _resolveDecorationOptions(typeKey: string, writable: boolean): IModelDecorationOptions { throw new Error('NotImplemented'); } - - // --- test utils - getCursor(): Cursor { + //#region Testing utils + public getCursor(): Cursor { return this.cursor; } - public registerAndInstantiateContribution(ctor: any): T { let r = this._instantiationService.createInstance(ctor, this); this._contributions[r.getId()] = r; return r; } - public dispose() { super.dispose(); if (this.model) { this.model.dispose(); + this.model = null; } - this._contextKeyService.dispose(); } - - protected _triggerEditorCommand(source: string, handlerId: string, payload: any): boolean { - const command = EditorExtensionsRegistry.getEditorCommand(handlerId); - if (command) { - payload = payload || {}; - payload.source = source; - TPromise.as(command.runEditorCommand(null, this, payload)).done(null, onUnexpectedError); - return true; - } - - return false; - } - - //#region ICodeEditor - getDomNode(): HTMLElement { throw new Error('Not implemented'); } - addContentWidget(widget: editorBrowser.IContentWidget): void { throw new Error('Not implemented'); } - layoutContentWidget(widget: editorBrowser.IContentWidget): void { throw new Error('Not implemented'); } - removeContentWidget(widget: editorBrowser.IContentWidget): void { throw new Error('Not implemented'); } - addOverlayWidget(widget: editorBrowser.IOverlayWidget): void { throw new Error('Not implemented'); } - layoutOverlayWidget(widget: editorBrowser.IOverlayWidget): void { throw new Error('Not implemented'); } - removeOverlayWidget(widget: editorBrowser.IOverlayWidget): void { throw new Error('Not implemented'); } - changeViewZones(callback: (accessor: editorBrowser.IViewZoneChangeAccessor) => void): void { throw new Error('Not implemented'); } - getOffsetForColumn(lineNumber: number, column: number): number { throw new Error('Not implemented'); } - render(): void { throw new Error('Not implemented'); } - getTargetAtClientPoint(clientX: number, clientY: number): editorBrowser.IMouseTarget { throw new Error('Not implemented'); } - getScrolledVisiblePosition(position: IPosition): { top: number; left: number; height: number; } { throw new Error('Not implemented'); } - applyFontInfo(target: HTMLElement): void { throw new Error('Not implemented'); } - //#endregion ICodeEditor } -export class MockScopeLocation implements IContextKeyServiceTarget { +class TestEditorDomElement { parentElement: IContextKeyServiceTarget = null; setAttribute(attr: string, value: string): void { } removeAttribute(attr: string): void { } hasAttribute(attr: string): boolean { return false; } getAttribute(attr: string): string { return undefined; } + addEventListener(event: string): void { } + removeEventListener(event: string): void { } } export interface TestCodeEditorCreationOptions extends editorOptions.IEditorOptions { @@ -148,36 +83,38 @@ export interface TestCodeEditorCreationOptions extends editorOptions.IEditorOpti export function withTestCodeEditor(text: string[], options: TestCodeEditorCreationOptions, callback: (editor: TestCodeEditor, cursor: Cursor) => void): void { // create a model if necessary and remember it in order to dispose it. - let modelToDispose: TextModel = null; if (!options.model) { - modelToDispose = TextModel.createFromString(text.join('\n')); - options.model = modelToDispose; + options.model = TextModel.createFromString(text.join('\n')); } - let editor = _createTestCodeEditor(options); + let editor = createTestCodeEditor(options); callback(editor, editor.getCursor()); - if (modelToDispose) { - modelToDispose.dispose(); - } editor.dispose(); } -export function createTestCodeEditor(model: ITextModel): TestCodeEditor { - return _createTestCodeEditor({ model: model }); -} +export function createTestCodeEditor(options: TestCodeEditorCreationOptions): TestCodeEditor { -function _createTestCodeEditor(options: TestCodeEditorCreationOptions): TestCodeEditor { + const services: ServiceCollection = options.serviceCollection || new ServiceCollection(); + const instantiationService = new InstantiationService(services); - let contextKeyService = new MockContextKeyService(); - let notificationService = new TestNotificationService(); + if (!services.has(ICodeEditorService)) { + services.set(ICodeEditorService, new TestCodeEditorService()); + } + if (!services.has(IContextKeyService)) { + services.set(IContextKeyService, new MockContextKeyService()); + } + if (!services.has(INotificationService)) { + services.set(INotificationService, new TestNotificationService()); + } + if (!services.has(ICommandService)) { + services.set(ICommandService, new TestCommandService(instantiationService)); + } + if (!services.has(IThemeService)) { + services.set(IThemeService, new TestThemeService()); + } - let services = options.serviceCollection || new ServiceCollection(); - services.set(IContextKeyService, contextKeyService); - services.set(INotificationService, notificationService); - let instantiationService = new InstantiationService(services); - - let editor = new TestCodeEditor(new MockScopeLocation(), options, false, instantiationService, contextKeyService, notificationService); + const editor = instantiationService.createInstance(TestCodeEditor, new TestEditorDomElement(), options, false); editor.setModel(options.model); return editor; } diff --git a/src/vs/editor/test/browser/testCodeEditorService.ts b/src/vs/editor/test/browser/testCodeEditorService.ts deleted file mode 100644 index 89c107a8b5f..00000000000 --- a/src/vs/editor/test/browser/testCodeEditorService.ts +++ /dev/null @@ -1,15 +0,0 @@ -/*--------------------------------------------------------------------------------------------- - * Copyright (c) Microsoft Corporation. All rights reserved. - * Licensed under the MIT License. See License.txt in the project root for license information. - *--------------------------------------------------------------------------------------------*/ -'use strict'; - -import { IModelDecorationOptions } from 'vs/editor/common/model'; -import { IDecorationRenderOptions } from 'vs/editor/common/editorCommon'; -import { AbstractCodeEditorService } from 'vs/editor/browser/services/abstractCodeEditorService'; - -export class TestCodeEditorService extends AbstractCodeEditorService { - public registerDecorationType(key: string, options: IDecorationRenderOptions, parentTypeKey?: string): void { } - public removeDecorationType(key: string): void { } - public resolveDecorationOptions(decorationTypeKey: string, writable: boolean): IModelDecorationOptions { return null; } -} diff --git a/src/vs/workbench/test/browser/parts/editor/rangeDecorations.test.ts b/src/vs/workbench/test/browser/parts/editor/rangeDecorations.test.ts index 57c5403cc6d..f6c72985b7f 100644 --- a/src/vs/workbench/test/browser/parts/editor/rangeDecorations.test.ts +++ b/src/vs/workbench/test/browser/parts/editor/rangeDecorations.test.ts @@ -40,7 +40,7 @@ suite('Editor - Range decorations', () => { instantiationService.stub(IModelService, stubModelService(instantiationService)); text = 'LINE1' + '\n' + 'LINE2' + '\n' + 'LINE3' + '\n' + 'LINE4' + '\r\n' + 'LINE5'; model = aModel(URI.file('some_file')); - codeEditor = createTestCodeEditor(model); + codeEditor = createTestCodeEditor({ model: model }); mockEditorService(codeEditor.getModel().uri); instantiationService.stub(WorkbenchEditorService.IWorkbenchEditorService, 'getActiveEditor', { getControl: () => { return codeEditor; } }); diff --git a/src/vs/workbench/test/electron-browser/api/mainThreadDocumentsAndEditors.test.ts b/src/vs/workbench/test/electron-browser/api/mainThreadDocumentsAndEditors.test.ts index 78b4a771edf..62f363e6098 100644 --- a/src/vs/workbench/test/electron-browser/api/mainThreadDocumentsAndEditors.test.ts +++ b/src/vs/workbench/test/electron-browser/api/mainThreadDocumentsAndEditors.test.ts @@ -10,14 +10,17 @@ import { MainThreadDocumentsAndEditors } from 'vs/workbench/api/electron-browser import { SingleProxyRPCProtocol } from './testRPCProtocol'; import { TestConfigurationService } from 'vs/platform/configuration/test/common/testConfigurationService'; import { ModelServiceImpl } from 'vs/editor/common/services/modelServiceImpl'; -import { TestCodeEditorService } from 'vs/editor/test/browser/testCodeEditorService'; +import { TestCodeEditorService } from 'vs/editor/test/browser/editorTestServices'; import { ITextFileService } from 'vs/workbench/services/textfile/common/textfiles'; import { IWorkbenchEditorService } from 'vs/workbench/services/editor/common/editorService'; import { ExtHostDocumentsAndEditorsShape, IDocumentsAndEditorsDelta } from 'vs/workbench/api/node/extHost.protocol'; -import { createTestCodeEditor } from 'vs/editor/test/browser/testCodeEditor'; +import { createTestCodeEditor, TestCodeEditor } from 'vs/editor/test/browser/testCodeEditor'; import { mock } from 'vs/workbench/test/electron-browser/api/mock'; import { IEditorGroupService } from 'vs/workbench/services/group/common/groupService'; import { Event } from 'vs/base/common/event'; +import { ITextModel } from 'vs/editor/common/model'; +import { ServiceCollection } from 'vs/platform/instantiation/common/serviceCollection'; +import { ICodeEditorService } from 'vs/editor/browser/services/codeEditorService'; suite('MainThreadDocumentsAndEditors', () => { @@ -28,6 +31,15 @@ suite('MainThreadDocumentsAndEditors', () => { let deltas: IDocumentsAndEditorsDelta[] = []; const hugeModelString = new Array(2 + (50 * 1024 * 1024)).join('-'); + function myCreateTestCodeEditor(model: ITextModel): TestCodeEditor { + return createTestCodeEditor({ + model: model, + serviceCollection: new ServiceCollection( + [ICodeEditorService, codeEditorService] + ) + }); + } + setup(() => { deltas.length = 0; const configService = new TestConfigurationService(); @@ -120,18 +132,17 @@ suite('MainThreadDocumentsAndEditors', () => { this.timeout(1000 * 60); // increase timeout for this one test const model = modelService.createModel(hugeModelString, null, null); - const editor = createTestCodeEditor(model); + const editor = myCreateTestCodeEditor(model); assert.equal(deltas.length, 1); deltas.length = 0; - codeEditorService.addCodeEditor(editor); assert.equal(deltas.length, 0); + + editor.dispose(); }); test('ignore editor w/o model', () => { - const editor = createTestCodeEditor(null); - editor.setModel(null); - codeEditorService.addCodeEditor(editor); + const editor = myCreateTestCodeEditor(null); assert.equal(deltas.length, 1); const [delta] = deltas; assert.equal(delta.newActiveEditor, null); @@ -139,13 +150,15 @@ suite('MainThreadDocumentsAndEditors', () => { assert.equal(delta.removedDocuments, undefined); assert.equal(delta.addedEditors, undefined); assert.equal(delta.removedEditors, undefined); + + editor.dispose(); }); test('editor with model', () => { deltas.length = 0; const model = modelService.createModel('farboo', null, null); - codeEditorService.addCodeEditor(createTestCodeEditor(model)); + const editor = myCreateTestCodeEditor(model); assert.equal(deltas.length, 2); const [first, second] = deltas; @@ -159,14 +172,15 @@ suite('MainThreadDocumentsAndEditors', () => { assert.equal(second.addedDocuments, undefined); assert.equal(second.removedDocuments, undefined); assert.equal(second.removedEditors, undefined); - assert.equal(typeof second.newActiveEditor, 'string'); + assert.equal(second.newActiveEditor, undefined); + + editor.dispose(); }); test('editor with dispos-ed/-ing model', () => { modelService.createModel('foobar', null, null); const model = modelService.createModel('farboo', null, null); - const editor = createTestCodeEditor(model); - codeEditorService.addCodeEditor(editor); + const editor = myCreateTestCodeEditor(model); // ignore things until now deltas.length = 0; @@ -180,5 +194,7 @@ suite('MainThreadDocumentsAndEditors', () => { assert.equal(first.removedDocuments.length, 1); assert.equal(first.addedDocuments, undefined); assert.equal(first.addedEditors, undefined); + + editor.dispose(); }); }); diff --git a/src/vs/workbench/test/electron-browser/api/mainThreadEditors.test.ts b/src/vs/workbench/test/electron-browser/api/mainThreadEditors.test.ts index 2a5fbc98574..5940c9449bb 100644 --- a/src/vs/workbench/test/electron-browser/api/mainThreadEditors.test.ts +++ b/src/vs/workbench/test/electron-browser/api/mainThreadEditors.test.ts @@ -10,7 +10,7 @@ import { MainThreadDocumentsAndEditors } from 'vs/workbench/api/electron-browser import { SingleProxyRPCProtocol, TestRPCProtocol } from './testRPCProtocol'; import { TestConfigurationService } from 'vs/platform/configuration/test/common/testConfigurationService'; import { ModelServiceImpl } from 'vs/editor/common/services/modelServiceImpl'; -import { TestCodeEditorService } from 'vs/editor/test/browser/testCodeEditorService'; +import { TestCodeEditorService } from 'vs/editor/test/browser/editorTestServices'; import { ITextFileService } from 'vs/workbench/services/textfile/common/textfiles'; import { IWorkbenchEditorService } from 'vs/workbench/services/editor/common/editorService'; import { ExtHostDocumentsAndEditorsShape, ExtHostContext, ExtHostDocumentsShape } from 'vs/workbench/api/node/extHost.protocol'; From 37c7bdb4f6bad43e1a66b9c0b4cb36f647eed0ef Mon Sep 17 00:00:00 2001 From: Alex Dima Date: Mon, 30 Apr 2018 15:17:20 +0200 Subject: [PATCH 234/830] Eliminate CommonCodeEditor --- src/vs/editor/browser/view/viewController.ts | 6 +- src/vs/editor/browser/view/viewImpl.ts | 4 +- .../editor/browser/widget/codeEditorWidget.ts | 1321 ++++++++++++++++- src/vs/editor/common/commonCodeEditor.ts | 1270 ---------------- .../common/config/commonEditorConfig.ts | 3 + src/vs/editor/common/editorCommon.ts | 6 +- src/vs/editor/test/browser/testCodeEditor.ts | 3 +- 7 files changed, 1268 insertions(+), 1345 deletions(-) delete mode 100644 src/vs/editor/common/commonCodeEditor.ts diff --git a/src/vs/editor/browser/view/viewController.ts b/src/vs/editor/browser/view/viewController.ts index 31233148de5..9b436287c58 100644 --- a/src/vs/editor/browser/view/viewController.ts +++ b/src/vs/editor/browser/view/viewController.ts @@ -11,7 +11,7 @@ import { IEditorMouseEvent } from 'vs/editor/browser/editorBrowser'; import { IViewModel } from 'vs/editor/common/viewModel/viewModel'; import { ViewOutgoingEvents } from 'vs/editor/browser/view/viewOutgoingEvents'; import { CoreNavigationCommands, CoreEditorCommand } from 'vs/editor/browser/controller/coreCommands'; -import { Configuration } from 'vs/editor/browser/config/configuration'; +import { IConfiguration } from 'vs/editor/common/editorCommon'; export interface ExecCoreEditorCommandFunc { (editorCommand: CoreEditorCommand, args: any): void; @@ -47,14 +47,14 @@ export interface ICommandDelegate { export class ViewController { - private readonly configuration: Configuration; + private readonly configuration: IConfiguration; private readonly viewModel: IViewModel; private readonly _execCoreEditorCommandFunc: ExecCoreEditorCommandFunc; private readonly outgoingEvents: ViewOutgoingEvents; private readonly commandDelegate: ICommandDelegate; constructor( - configuration: Configuration, + configuration: IConfiguration, viewModel: IViewModel, execCommandFunc: ExecCoreEditorCommandFunc, outgoingEvents: ViewOutgoingEvents, diff --git a/src/vs/editor/browser/view/viewImpl.ts b/src/vs/editor/browser/view/viewImpl.ts index ce4b080de4a..f619f1adef4 100644 --- a/src/vs/editor/browser/view/viewImpl.ts +++ b/src/vs/editor/browser/view/viewImpl.ts @@ -10,7 +10,7 @@ import * as dom from 'vs/base/browser/dom'; import { FastDomNode, createFastDomNode } from 'vs/base/browser/fastDomNode'; import { Range } from 'vs/editor/common/core/range'; import { ViewEventHandler } from 'vs/editor/common/viewModel/viewEventHandler'; -import { Configuration } from 'vs/editor/browser/config/configuration'; +import { IConfiguration } from 'vs/editor/common/editorCommon'; import { TextAreaHandler, ITextAreaHandlerHelper } from 'vs/editor/browser/controller/textAreaHandler'; import { PointerHandler } from 'vs/editor/browser/controller/pointerHandler'; import * as editorBrowser from 'vs/editor/browser/editorBrowser'; @@ -93,7 +93,7 @@ export class View extends ViewEventHandler { constructor( commandDelegate: ICommandDelegate, - configuration: Configuration, + configuration: IConfiguration, themeService: IThemeService, model: IViewModel, cursor: Cursor, diff --git a/src/vs/editor/browser/widget/codeEditorWidget.ts b/src/vs/editor/browser/widget/codeEditorWidget.ts index 7103fb97b39..a7492e4662c 100644 --- a/src/vs/editor/browser/widget/codeEditorWidget.ts +++ b/src/vs/editor/browser/widget/codeEditorWidget.ts @@ -6,37 +6,107 @@ import 'vs/css!./media/editor'; import 'vs/css!./media/tokens'; -import { onUnexpectedError } from 'vs/base/common/errors'; -import { TPromise } from 'vs/base/common/winjs.base'; +import * as nls from 'vs/nls'; import * as dom from 'vs/base/browser/dom'; -import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation'; -import { ICommandService } from 'vs/platform/commands/common/commands'; -import { IContextKeyService } from 'vs/platform/contextkey/common/contextkey'; -import { CommonCodeEditor } from 'vs/editor/common/commonCodeEditor'; -import { CommonEditorConfiguration } from 'vs/editor/common/config/commonEditorConfig'; -import * as editorCommon from 'vs/editor/common/editorCommon'; -import { EditorAction, EditorExtensionsRegistry, IEditorContributionCtor } from 'vs/editor/browser/editorExtensions'; -import { ICodeEditorService } from 'vs/editor/browser/services/codeEditorService'; -import { Configuration } from 'vs/editor/browser/config/configuration'; -import * as editorBrowser from 'vs/editor/browser/editorBrowser'; -import { View, IOverlayWidgetData, IContentWidgetData } from 'vs/editor/browser/view/viewImpl'; -import { Disposable, IDisposable } from 'vs/base/common/lifecycle'; +import { onUnexpectedError } from 'vs/base/common/errors'; import { Event, Emitter } from 'vs/base/common/event'; +import { Disposable, IDisposable, dispose } from 'vs/base/common/lifecycle'; +import { TPromise } from 'vs/base/common/winjs.base'; +import { ServicesAccessor, IInstantiationService } from 'vs/platform/instantiation/common/instantiation'; +import { ServiceCollection } from 'vs/platform/instantiation/common/serviceCollection'; +import { IContextKey, IContextKeyService } from 'vs/platform/contextkey/common/contextkey'; +import { Configuration } from 'vs/editor/browser/config/configuration'; +import { Cursor, CursorStateChangedEvent } from 'vs/editor/common/controller/cursor'; +import { CursorColumns, ICursors, CursorConfiguration } from 'vs/editor/common/controller/cursorCommon'; +import { Position, IPosition } from 'vs/editor/common/core/position'; +import { Range, IRange } from 'vs/editor/common/core/range'; +import { Selection, ISelection } from 'vs/editor/common/core/selection'; +import * as editorCommon from 'vs/editor/common/editorCommon'; +import { ViewModel } from 'vs/editor/common/viewModel/viewModelImpl'; +import { hash } from 'vs/base/common/hash'; +import { IModelContentChangedEvent, IModelDecorationsChangedEvent, IModelLanguageChangedEvent, IModelOptionsChangedEvent, IModelLanguageConfigurationChangedEvent } from 'vs/editor/common/model/textModelEvents'; +import * as editorOptions from 'vs/editor/common/config/editorOptions'; +import { ICursorPositionChangedEvent, ICursorSelectionChangedEvent } from 'vs/editor/common/controller/cursorEvents'; +import { EditorContextKeys } from 'vs/editor/common/editorContextKeys'; +import { VerticalRevealType } from 'vs/editor/common/view/viewEvents'; +import { ModelDecorationOptions } from 'vs/editor/common/model/textModel'; +import { IEditorWhitespace } from 'vs/editor/common/viewLayout/whitespaceComputer'; +import * as modes from 'vs/editor/common/modes'; +import { Schemas } from 'vs/base/common/network'; +import { ITextModel, EndOfLinePreference, IIdentifiedSingleEditOperation, IModelDecorationsChangeAccessor, IModelDecoration, IModelDeltaDecoration, IModelDecorationOptions } from 'vs/editor/common/model'; +import { INotificationService } from 'vs/platform/notification/common/notification'; +import * as editorBrowser from 'vs/editor/browser/editorBrowser'; import { IKeyboardEvent } from 'vs/base/browser/keyboardEvent'; -import { InternalEditorAction } from 'vs/editor/common/editorAction'; -import { IEditorOptions } from 'vs/editor/common/config/editorOptions'; -import { IPosition, Position } from 'vs/editor/common/core/position'; -import { CoreEditorCommand } from 'vs/editor/browser/controller/coreCommands'; +import { ICodeEditorService } from 'vs/editor/browser/services/codeEditorService'; +import { ICommandService } from 'vs/platform/commands/common/commands'; import { IThemeService, registerThemingParticipant } from 'vs/platform/theme/common/themeService'; +import { IContentWidgetData, IOverlayWidgetData, View } from 'vs/editor/browser/view/viewImpl'; +import { IEditorContributionCtor, EditorAction, EditorExtensionsRegistry } from 'vs/editor/browser/editorExtensions'; +import { IMouseEvent } from 'vs/base/browser/mouseEvent'; +import { InternalEditorAction } from 'vs/editor/common/editorAction'; +import { ICommandDelegate } from 'vs/editor/browser/view/viewController'; +import { CoreEditorCommand } from 'vs/editor/browser/controller/coreCommands'; import { editorErrorForeground, editorErrorBorder, editorWarningForeground, editorWarningBorder, editorInfoBorder, editorInfoForeground, editorHintForeground, editorHintBorder } from 'vs/editor/common/view/editorColorRegistry'; import { Color } from 'vs/base/common/color'; -import { IMouseEvent } from 'vs/base/browser/mouseEvent'; import { ClassName } from 'vs/editor/common/model/intervalTree'; -import { ITextModel, IModelDecorationOptions } from 'vs/editor/common/model'; -import { ICommandDelegate } from 'vs/editor/browser/view/viewController'; -import { INotificationService } from 'vs/platform/notification/common/notification'; -export abstract class CodeEditorWidget extends CommonCodeEditor implements editorBrowser.ICodeEditor { +let EDITOR_ID = 0; + +export abstract class CodeEditorWidget extends Disposable implements editorBrowser.ICodeEditor { + + //#region Eventing + private readonly _onDidDispose: Emitter = this._register(new Emitter()); + public readonly onDidDispose: Event = this._onDidDispose.event; + + private readonly _onDidChangeModelContent: Emitter = this._register(new Emitter()); + public readonly onDidChangeModelContent: Event = this._onDidChangeModelContent.event; + + private readonly _onDidChangeModelLanguage: Emitter = this._register(new Emitter()); + public readonly onDidChangeModelLanguage: Event = this._onDidChangeModelLanguage.event; + + private readonly _onDidChangeModelLanguageConfiguration: Emitter = this._register(new Emitter()); + public readonly onDidChangeModelLanguageConfiguration: Event = this._onDidChangeModelLanguageConfiguration.event; + + private readonly _onDidChangeModelOptions: Emitter = this._register(new Emitter()); + public readonly onDidChangeModelOptions: Event = this._onDidChangeModelOptions.event; + + private readonly _onDidChangeModelDecorations: Emitter = this._register(new Emitter()); + public readonly onDidChangeModelDecorations: Event = this._onDidChangeModelDecorations.event; + + private readonly _onDidChangeConfiguration: Emitter = this._register(new Emitter()); + public readonly onDidChangeConfiguration: Event = this._onDidChangeConfiguration.event; + + protected readonly _onDidChangeModel: Emitter = this._register(new Emitter()); + public readonly onDidChangeModel: Event = this._onDidChangeModel.event; + + private readonly _onDidChangeCursorPosition: Emitter = this._register(new Emitter()); + public readonly onDidChangeCursorPosition: Event = this._onDidChangeCursorPosition.event; + + private readonly _onDidChangeCursorSelection: Emitter = this._register(new Emitter()); + public readonly onDidChangeCursorSelection: Event = this._onDidChangeCursorSelection.event; + + private readonly _onDidAttemptReadOnlyEdit: Emitter = this._register(new Emitter()); + public readonly onDidAttemptReadOnlyEdit: Event = this._onDidAttemptReadOnlyEdit.event; + + private readonly _onDidLayoutChange: Emitter = this._register(new Emitter()); + public readonly onDidLayoutChange: Event = this._onDidLayoutChange.event; + + protected _editorTextFocus: BooleanEventEmitter = this._register(new BooleanEventEmitter()); + public readonly onDidFocusEditorText: Event = this._editorTextFocus.onDidChangeToTrue; + public readonly onDidBlurEditorText: Event = this._editorTextFocus.onDidChangeToFalse; + + protected _editorFocus: BooleanEventEmitter = this._register(new BooleanEventEmitter()); + public readonly onDidFocusEditor: Event = this._editorFocus.onDidChangeToTrue; + public readonly onDidBlurEditor: Event = this._editorFocus.onDidChangeToFalse; + + private readonly _onWillType: Emitter = this._register(new Emitter()); + public readonly onWillType = this._onWillType.event; + + private readonly _onDidType: Emitter = this._register(new Emitter()); + public readonly onDidType = this._onDidType.event; + + private readonly _onDidPaste: Emitter = this._register(new Emitter()); + public readonly onDidPaste = this._onDidPaste.event; private readonly _onMouseUp: Emitter = this._register(new Emitter()); public readonly onMouseUp: Event = this._onMouseUp.event; @@ -70,24 +140,48 @@ export abstract class CodeEditorWidget extends CommonCodeEditor implements edito private readonly _onDidChangeViewZones: Emitter = this._register(new Emitter()); public readonly onDidChangeViewZones: Event = this._onDidChangeViewZones.event; + //#endregion - private _codeEditorService: ICodeEditorService; - private _commandService: ICommandService; - private _themeService: IThemeService; + public readonly isSimpleWidget: boolean; + + private readonly domElement: HTMLElement; + private readonly id: number; + private readonly _configuration: editorCommon.IConfiguration; + + protected _contributions: { [key: string]: editorCommon.IEditorContribution; }; + protected _actions: { [key: string]: editorCommon.IEditorAction; }; + + // --- Members logically associated to a model + protected model: ITextModel; + private listenersToRemove: IDisposable[]; + private hasView: boolean; + + private viewModel: ViewModel; + protected cursor: Cursor; + + protected readonly _instantiationService: IInstantiationService; + protected readonly _contextKeyService: IContextKeyService; + private readonly _notificationService: INotificationService; + private readonly _codeEditorService: ICodeEditorService; + private readonly _commandService: ICommandService; + private readonly _themeService: IThemeService; - protected domElement: HTMLElement; private _focusTracker: CodeEditorWidgetFocusTracker; - _configuration: Configuration; - private contentWidgets: { [key: string]: IContentWidgetData; }; private overlayWidgets: { [key: string]: IOverlayWidgetData; }; - _view: View; + protected _view: View; + + /** + * map from "parent" decoration type to live decoration ids. + */ + private _decorationTypeKeysToIds: { [decorationTypeKey: string]: string[] }; + private _decorationTypeSubtypes: { [decorationTypeKey: string]: { [subtype: string]: boolean } }; constructor( domElement: HTMLElement, - options: IEditorOptions, + options: editorOptions.IEditorOptions, isSimpleWidget: boolean, @IInstantiationService instantiationService: IInstantiationService, @ICodeEditorService codeEditorService: ICodeEditorService, @@ -96,10 +190,37 @@ export abstract class CodeEditorWidget extends CommonCodeEditor implements edito @IThemeService themeService: IThemeService, @INotificationService notificationService: INotificationService ) { - super(domElement, options, isSimpleWidget, instantiationService, contextKeyService, notificationService); + super(); + this.domElement = domElement; + this.id = (++EDITOR_ID); + this._decorationTypeKeysToIds = {}; + this._decorationTypeSubtypes = {}; + this.isSimpleWidget = isSimpleWidget; + + options = options || {}; + this._configuration = this._register(this._createConfiguration(options)); + this._register(this._configuration.onDidChange((e) => { + this._onDidChangeConfiguration.fire(e); + + if (e.layoutInfo) { + this._onDidLayoutChange.fire(this._configuration.editor.layoutInfo); + } + })); + + this._contextKeyService = this._register(contextKeyService.createScoped(this.domElement)); + this._notificationService = notificationService; this._codeEditorService = codeEditorService; this._commandService = commandService; this._themeService = themeService; + this._register(new EditorContextKeysManager(this, this._contextKeyService)); + this._register(new EditorModeContext(this, this._contextKeyService)); + + this._instantiationService = instantiationService.createChild(new ServiceCollection([IContextKeyService, this._contextKeyService])); + + this._attachModel(null); + + this._contributions = {}; + this._actions = {}; this._focusTracker = new CodeEditorWidgetFocusTracker(domElement); this._focusTracker.onChange(() => { @@ -139,11 +260,19 @@ export abstract class CodeEditorWidget extends CommonCodeEditor implements edito this._codeEditorService.addCodeEditor(this); } + protected _createConfiguration(options: editorOptions.IEditorOptions): editorCommon.IConfiguration { + return new Configuration(options, this.domElement); + } + protected abstract _getContributions(): IEditorContributionCtor[]; protected abstract _getActions(): EditorAction[]; - protected _createConfiguration(options: IEditorOptions): CommonEditorConfiguration { - return new Configuration(options, this.domElement); + public getId(): string { + return this.getEditorType() + ':' + this.id; + } + + public getEditorType(): string { + return editorCommon.EditorType.ICodeEditor; } public dispose(): void { @@ -153,9 +282,781 @@ export abstract class CodeEditorWidget extends CommonCodeEditor implements edito this.overlayWidgets = {}; this._focusTracker.dispose(); + + let keys = Object.keys(this._contributions); + for (let i = 0, len = keys.length; i < len; i++) { + let contributionId = keys[i]; + this._contributions[contributionId].dispose(); + } + this._contributions = {}; + + // editor actions don't need to be disposed + this._actions = {}; + this._removeDecorationTypes(); + this._postDetachModelCleanup(this._detachModel()); + + this._onDidDispose.fire(); + super.dispose(); } + public invokeWithinContext(fn: (accessor: ServicesAccessor) => T): T { + return this._instantiationService.invokeFunction(fn); + } + + public updateOptions(newOptions: editorOptions.IEditorOptions): void { + this._configuration.updateOptions(newOptions); + } + + public getConfiguration(): editorOptions.InternalEditorOptions { + return this._configuration.editor; + } + + public getRawConfiguration(): editorOptions.IEditorOptions { + return this._configuration.getRawOptions(); + } + + public getValue(options: { preserveBOM: boolean; lineEnding: string; } = null): string { + if (this.model) { + let preserveBOM: boolean = (options && options.preserveBOM) ? true : false; + let eolPreference = EndOfLinePreference.TextDefined; + if (options && options.lineEnding && options.lineEnding === '\n') { + eolPreference = EndOfLinePreference.LF; + } else if (options && options.lineEnding && options.lineEnding === '\r\n') { + eolPreference = EndOfLinePreference.CRLF; + } + return this.model.getValue(eolPreference, preserveBOM); + } + return ''; + } + + public setValue(newValue: string): void { + if (this.model) { + this.model.setValue(newValue); + } + } + + public getModel(): ITextModel { + return this.model; + } + + public setModel(model: ITextModel = null): void { + if (this.model === model) { + // Current model is the new model + return; + } + + let detachedModel = this._detachModel(); + this._attachModel(model); + + let e: editorCommon.IModelChangedEvent = { + oldModelUrl: detachedModel ? detachedModel.uri : null, + newModelUrl: model ? model.uri : null + }; + + this._removeDecorationTypes(); + this._onDidChangeModel.fire(e); + this._postDetachModelCleanup(detachedModel); + } + + private _removeDecorationTypes(): void { + this._decorationTypeKeysToIds = {}; + if (this._decorationTypeSubtypes) { + for (let decorationType in this._decorationTypeSubtypes) { + let subTypes = this._decorationTypeSubtypes[decorationType]; + for (let subType in subTypes) { + this._removeDecorationType(decorationType + '-' + subType); + } + } + this._decorationTypeSubtypes = {}; + } + } + + public getVisibleRanges(): Range[] { + if (!this.hasView) { + return []; + } + return this.viewModel.getVisibleRanges(); + } + + public getWhitespaces(): IEditorWhitespace[] { + if (!this.hasView) { + return []; + } + return this.viewModel.viewLayout.getWhitespaces(); + } + + protected _getVerticalOffsetForPosition(modelLineNumber: number, modelColumn: number): number { + let modelPosition = this.model.validatePosition({ + lineNumber: modelLineNumber, + column: modelColumn + }); + let viewPosition = this.viewModel.coordinatesConverter.convertModelPositionToViewPosition(modelPosition); + return this.viewModel.viewLayout.getVerticalOffsetForLineNumber(viewPosition.lineNumber); + } + + public getTopForLineNumber(lineNumber: number): number { + if (!this.hasView) { + return -1; + } + return this._getVerticalOffsetForPosition(lineNumber, 1); + } + + public getTopForPosition(lineNumber: number, column: number): number { + if (!this.hasView) { + return -1; + } + return this._getVerticalOffsetForPosition(lineNumber, column); + } + + public setHiddenAreas(ranges: IRange[]): void { + if (this.viewModel) { + this.viewModel.setHiddenAreas(ranges.map(r => Range.lift(r))); + } + } + + public getVisibleColumnFromPosition(rawPosition: IPosition): number { + if (!this.model) { + return rawPosition.column; + } + + let position = this.model.validatePosition(rawPosition); + let tabSize = this.model.getOptions().tabSize; + + return CursorColumns.visibleColumnFromColumn(this.model.getLineContent(position.lineNumber), position.column, tabSize) + 1; + } + + public getPosition(): Position { + if (!this.cursor) { + return null; + } + return this.cursor.getPosition().clone(); + } + + public setPosition(position: IPosition): void { + if (!this.cursor) { + return; + } + if (!Position.isIPosition(position)) { + throw new Error('Invalid arguments'); + } + this.cursor.setSelections('api', [{ + selectionStartLineNumber: position.lineNumber, + selectionStartColumn: position.column, + positionLineNumber: position.lineNumber, + positionColumn: position.column + }]); + } + + private _sendRevealRange(modelRange: Range, verticalType: VerticalRevealType, revealHorizontal: boolean, scrollType: editorCommon.ScrollType): void { + if (!this.model || !this.cursor) { + return; + } + if (!Range.isIRange(modelRange)) { + throw new Error('Invalid arguments'); + } + const validatedModelRange = this.model.validateRange(modelRange); + const viewRange = this.viewModel.coordinatesConverter.convertModelRangeToViewRange(validatedModelRange); + + this.cursor.emitCursorRevealRange(viewRange, verticalType, revealHorizontal, scrollType); + } + + public revealLine(lineNumber: number, scrollType: editorCommon.ScrollType = editorCommon.ScrollType.Smooth): void { + this._revealLine(lineNumber, VerticalRevealType.Simple, scrollType); + } + + public revealLineInCenter(lineNumber: number, scrollType: editorCommon.ScrollType = editorCommon.ScrollType.Smooth): void { + this._revealLine(lineNumber, VerticalRevealType.Center, scrollType); + } + + public revealLineInCenterIfOutsideViewport(lineNumber: number, scrollType: editorCommon.ScrollType = editorCommon.ScrollType.Smooth): void { + this._revealLine(lineNumber, VerticalRevealType.CenterIfOutsideViewport, scrollType); + } + + private _revealLine(lineNumber: number, revealType: VerticalRevealType, scrollType: editorCommon.ScrollType): void { + if (typeof lineNumber !== 'number') { + throw new Error('Invalid arguments'); + } + + this._sendRevealRange( + new Range(lineNumber, 1, lineNumber, 1), + revealType, + false, + scrollType + ); + } + + public revealPosition(position: IPosition, scrollType: editorCommon.ScrollType = editorCommon.ScrollType.Smooth): void { + this._revealPosition( + position, + VerticalRevealType.Simple, + true, + scrollType + ); + } + + public revealPositionInCenter(position: IPosition, scrollType: editorCommon.ScrollType = editorCommon.ScrollType.Smooth): void { + this._revealPosition( + position, + VerticalRevealType.Center, + true, + scrollType + ); + } + + public revealPositionInCenterIfOutsideViewport(position: IPosition, scrollType: editorCommon.ScrollType = editorCommon.ScrollType.Smooth): void { + this._revealPosition( + position, + VerticalRevealType.CenterIfOutsideViewport, + true, + scrollType + ); + } + + private _revealPosition(position: IPosition, verticalType: VerticalRevealType, revealHorizontal: boolean, scrollType: editorCommon.ScrollType): void { + if (!Position.isIPosition(position)) { + throw new Error('Invalid arguments'); + } + + this._sendRevealRange( + new Range(position.lineNumber, position.column, position.lineNumber, position.column), + verticalType, + revealHorizontal, + scrollType + ); + } + + public getSelection(): Selection { + if (!this.cursor) { + return null; + } + return this.cursor.getSelection().clone(); + } + + public getSelections(): Selection[] { + if (!this.cursor) { + return null; + } + let selections = this.cursor.getSelections(); + let result: Selection[] = []; + for (let i = 0, len = selections.length; i < len; i++) { + result[i] = selections[i].clone(); + } + return result; + } + + public setSelection(range: IRange): void; + public setSelection(editorRange: Range): void; + public setSelection(selection: ISelection): void; + public setSelection(editorSelection: Selection): void; + public setSelection(something: any): void { + let isSelection = Selection.isISelection(something); + let isRange = Range.isIRange(something); + + if (!isSelection && !isRange) { + throw new Error('Invalid arguments'); + } + + if (isSelection) { + this._setSelectionImpl(something); + } else if (isRange) { + // act as if it was an IRange + let selection: ISelection = { + selectionStartLineNumber: something.startLineNumber, + selectionStartColumn: something.startColumn, + positionLineNumber: something.endLineNumber, + positionColumn: something.endColumn + }; + this._setSelectionImpl(selection); + } + } + + private _setSelectionImpl(sel: ISelection): void { + if (!this.cursor) { + return; + } + let selection = new Selection(sel.selectionStartLineNumber, sel.selectionStartColumn, sel.positionLineNumber, sel.positionColumn); + this.cursor.setSelections('api', [selection]); + } + + public revealLines(startLineNumber: number, endLineNumber: number, scrollType: editorCommon.ScrollType = editorCommon.ScrollType.Smooth): void { + this._revealLines( + startLineNumber, + endLineNumber, + VerticalRevealType.Simple, + scrollType + ); + } + + public revealLinesInCenter(startLineNumber: number, endLineNumber: number, scrollType: editorCommon.ScrollType = editorCommon.ScrollType.Smooth): void { + this._revealLines( + startLineNumber, + endLineNumber, + VerticalRevealType.Center, + scrollType + ); + } + + public revealLinesInCenterIfOutsideViewport(startLineNumber: number, endLineNumber: number, scrollType: editorCommon.ScrollType = editorCommon.ScrollType.Smooth): void { + this._revealLines( + startLineNumber, + endLineNumber, + VerticalRevealType.CenterIfOutsideViewport, + scrollType + ); + } + + private _revealLines(startLineNumber: number, endLineNumber: number, verticalType: VerticalRevealType, scrollType: editorCommon.ScrollType): void { + if (typeof startLineNumber !== 'number' || typeof endLineNumber !== 'number') { + throw new Error('Invalid arguments'); + } + + this._sendRevealRange( + new Range(startLineNumber, 1, endLineNumber, 1), + verticalType, + false, + scrollType + ); + } + + public revealRange(range: IRange, scrollType: editorCommon.ScrollType = editorCommon.ScrollType.Smooth, revealVerticalInCenter: boolean = false, revealHorizontal: boolean = true): void { + this._revealRange( + range, + revealVerticalInCenter ? VerticalRevealType.Center : VerticalRevealType.Simple, + revealHorizontal, + scrollType + ); + } + + public revealRangeInCenter(range: IRange, scrollType: editorCommon.ScrollType = editorCommon.ScrollType.Smooth): void { + this._revealRange( + range, + VerticalRevealType.Center, + true, + scrollType + ); + } + + public revealRangeInCenterIfOutsideViewport(range: IRange, scrollType: editorCommon.ScrollType = editorCommon.ScrollType.Smooth): void { + this._revealRange( + range, + VerticalRevealType.CenterIfOutsideViewport, + true, + scrollType + ); + } + + public revealRangeAtTop(range: IRange, scrollType: editorCommon.ScrollType = editorCommon.ScrollType.Smooth): void { + this._revealRange( + range, + VerticalRevealType.Top, + true, + scrollType + ); + } + + private _revealRange(range: IRange, verticalType: VerticalRevealType, revealHorizontal: boolean, scrollType: editorCommon.ScrollType): void { + if (!Range.isIRange(range)) { + throw new Error('Invalid arguments'); + } + + this._sendRevealRange( + Range.lift(range), + verticalType, + revealHorizontal, + scrollType + ); + } + + public setSelections(ranges: ISelection[]): void { + if (!this.cursor) { + return; + } + if (!ranges || ranges.length === 0) { + throw new Error('Invalid arguments'); + } + for (let i = 0, len = ranges.length; i < len; i++) { + if (!Selection.isISelection(ranges[i])) { + throw new Error('Invalid arguments'); + } + } + this.cursor.setSelections('api', ranges); + } + + public getScrollWidth(): number { + if (!this.hasView) { + return -1; + } + return this.viewModel.viewLayout.getScrollWidth(); + } + public getScrollLeft(): number { + if (!this.hasView) { + return -1; + } + return this.viewModel.viewLayout.getCurrentScrollLeft(); + } + + public getScrollHeight(): number { + if (!this.hasView) { + return -1; + } + return this.viewModel.viewLayout.getScrollHeight(); + } + public getScrollTop(): number { + if (!this.hasView) { + return -1; + } + return this.viewModel.viewLayout.getCurrentScrollTop(); + } + + public setScrollLeft(newScrollLeft: number): void { + if (!this.hasView) { + return; + } + if (typeof newScrollLeft !== 'number') { + throw new Error('Invalid arguments'); + } + this.viewModel.viewLayout.setScrollPositionNow({ + scrollLeft: newScrollLeft + }); + } + public setScrollTop(newScrollTop: number): void { + if (!this.hasView) { + return; + } + if (typeof newScrollTop !== 'number') { + throw new Error('Invalid arguments'); + } + this.viewModel.viewLayout.setScrollPositionNow({ + scrollTop: newScrollTop + }); + } + public setScrollPosition(position: editorCommon.INewScrollPosition): void { + if (!this.hasView) { + return; + } + this.viewModel.viewLayout.setScrollPositionNow(position); + } + + public saveViewState(): editorCommon.ICodeEditorViewState { + if (!this.cursor || !this.hasView) { + return null; + } + const contributionsState: { [key: string]: any } = {}; + + const keys = Object.keys(this._contributions); + for (let i = 0, len = keys.length; i < len; i++) { + const id = keys[i]; + const contribution = this._contributions[id]; + if (typeof contribution.saveViewState === 'function') { + contributionsState[id] = contribution.saveViewState(); + } + } + + const cursorState = this.cursor.saveState(); + const viewState = this.viewModel.saveState(); + return { + cursorState: cursorState, + viewState: viewState, + contributionsState: contributionsState + }; + } + + public restoreViewState(s: editorCommon.ICodeEditorViewState): void { + if (!this.cursor || !this.hasView) { + return; + } + if (s && s.cursorState && s.viewState) { + let codeEditorState = s; + let cursorState = codeEditorState.cursorState; + if (Array.isArray(cursorState)) { + this.cursor.restoreState(cursorState); + } else { + // Backwards compatibility + this.cursor.restoreState([cursorState]); + } + + let contributionsState = s.contributionsState || {}; + let keys = Object.keys(this._contributions); + for (let i = 0, len = keys.length; i < len; i++) { + let id = keys[i]; + let contribution = this._contributions[id]; + if (typeof contribution.restoreViewState === 'function') { + contribution.restoreViewState(contributionsState[id]); + } + } + + const reducedState = this.viewModel.reduceRestoreState(s.viewState); + const linesViewportData = this.viewModel.viewLayout.getLinesViewportDataAtScrollTop(reducedState.scrollTop); + const startPosition = this.viewModel.coordinatesConverter.convertViewPositionToModelPosition(new Position(linesViewportData.startLineNumber, 1)); + const endPosition = this.viewModel.coordinatesConverter.convertViewPositionToModelPosition(new Position(linesViewportData.endLineNumber, 1)); + this.model.tokenizeViewport(startPosition.lineNumber, endPosition.lineNumber); + this._view.restoreState(reducedState); + } + } + + public onVisible(): void { + } + + public onHide(): void { + } + + public getContribution(id: string): T { + return (this._contributions[id] || null); + } + + public getActions(): editorCommon.IEditorAction[] { + let result: editorCommon.IEditorAction[] = []; + + let keys = Object.keys(this._actions); + for (let i = 0, len = keys.length; i < len; i++) { + let id = keys[i]; + result.push(this._actions[id]); + } + + return result; + } + + public getSupportedActions(): editorCommon.IEditorAction[] { + let result = this.getActions(); + + result = result.filter(action => action.isSupported()); + + return result; + } + + public getAction(id: string): editorCommon.IEditorAction { + return this._actions[id] || null; + } + + public trigger(source: string, handlerId: string, payload: any): void { + payload = payload || {}; + + // Special case for typing + if (handlerId === editorCommon.Handler.Type) { + if (!this.cursor || typeof payload.text !== 'string' || payload.text.length === 0) { + // nothing to do + return; + } + if (source === 'keyboard') { + this._onWillType.fire(payload.text); + } + this.cursor.trigger(source, handlerId, payload); + if (source === 'keyboard') { + this._onDidType.fire(payload.text); + } + return; + } + + // Special case for pasting + if (handlerId === editorCommon.Handler.Paste) { + if (!this.cursor || typeof payload.text !== 'string' || payload.text.length === 0) { + // nothing to do + return; + } + const startPosition = this.cursor.getSelection().getStartPosition(); + this.cursor.trigger(source, handlerId, payload); + const endPosition = this.cursor.getSelection().getStartPosition(); + if (source === 'keyboard') { + this._onDidPaste.fire( + new Range(startPosition.lineNumber, startPosition.column, endPosition.lineNumber, endPosition.column) + ); + } + return; + } + + const action = this.getAction(handlerId); + if (action) { + TPromise.as(action.run()).then(null, onUnexpectedError); + return; + } + + if (!this.cursor) { + return; + } + + if (this._triggerEditorCommand(source, handlerId, payload)) { + return; + } + + this.cursor.trigger(source, handlerId, payload); + } + + private _triggerEditorCommand(source: string, handlerId: string, payload: any): boolean { + const command = EditorExtensionsRegistry.getEditorCommand(handlerId); + if (command) { + payload = payload || {}; + payload.source = source; + TPromise.as(command.runEditorCommand(null, this, payload)).done(null, onUnexpectedError); + return true; + } + + return false; + } + + public _getCursors(): ICursors { + return this.cursor; + } + + public _getCursorConfiguration(): CursorConfiguration { + return this.cursor.context.config; + } + + public pushUndoStop(): boolean { + if (!this.model) { + return false; + } + if (this._configuration.editor.readOnly) { + // read only editor => sorry! + return false; + } + this.model.pushStackElement(); + return true; + } + + public executeEdits(source: string, edits: IIdentifiedSingleEditOperation[], endCursorState?: Selection[]): boolean { + if (!this.cursor) { + // no view, no cursor + return false; + } + if (this._configuration.editor.readOnly) { + // read only editor => sorry! + return false; + } + + this.model.pushEditOperations(this.cursor.getSelections(), edits, () => { + return endCursorState ? endCursorState : null; + }); + + if (endCursorState) { + this.cursor.setSelections(source, endCursorState); + } + + return true; + } + + public executeCommand(source: string, command: editorCommon.ICommand): void { + if (!this.cursor) { + return; + } + this.cursor.trigger(source, editorCommon.Handler.ExecuteCommand, command); + } + + public executeCommands(source: string, commands: editorCommon.ICommand[]): void { + if (!this.cursor) { + return; + } + this.cursor.trigger(source, editorCommon.Handler.ExecuteCommands, commands); + } + + public changeDecorations(callback: (changeAccessor: IModelDecorationsChangeAccessor) => any): any { + if (!this.model) { + // console.warn('Cannot change decorations on editor that is not attached to a model'); + // callback will not be called + return null; + } + return this.model.changeDecorations(callback, this.id); + } + + public getLineDecorations(lineNumber: number): IModelDecoration[] { + if (!this.model) { + return null; + } + return this.model.getLineDecorations(lineNumber, this.id, this._configuration.editor.readOnly); + } + + public deltaDecorations(oldDecorations: string[], newDecorations: IModelDeltaDecoration[]): string[] { + if (!this.model) { + return []; + } + + if (oldDecorations.length === 0 && newDecorations.length === 0) { + return oldDecorations; + } + + return this.model.deltaDecorations(oldDecorations, newDecorations, this.id); + } + + public setDecorations(decorationTypeKey: string, decorationOptions: editorCommon.IDecorationOptions[]): void { + + let newDecorationsSubTypes: { [key: string]: boolean } = {}; + let oldDecorationsSubTypes = this._decorationTypeSubtypes[decorationTypeKey] || {}; + this._decorationTypeSubtypes[decorationTypeKey] = newDecorationsSubTypes; + + let newModelDecorations: IModelDeltaDecoration[] = []; + + for (let decorationOption of decorationOptions) { + let typeKey = decorationTypeKey; + if (decorationOption.renderOptions) { + // identify custom reder options by a hash code over all keys and values + // For custom render options register a decoration type if necessary + let subType = hash(decorationOption.renderOptions).toString(16); + // The fact that `decorationTypeKey` appears in the typeKey has no influence + // it is just a mechanism to get predictable and unique keys (repeatable for the same options and unique across clients) + typeKey = decorationTypeKey + '-' + subType; + if (!oldDecorationsSubTypes[subType] && !newDecorationsSubTypes[subType]) { + // decoration type did not exist before, register new one + this._registerDecorationType(typeKey, decorationOption.renderOptions, decorationTypeKey); + } + newDecorationsSubTypes[subType] = true; + } + let opts = this._resolveDecorationOptions(typeKey, !!decorationOption.hoverMessage); + if (decorationOption.hoverMessage) { + opts.hoverMessage = decorationOption.hoverMessage; + } + newModelDecorations.push({ range: decorationOption.range, options: opts }); + } + + // remove decoration sub types that are no longer used, deregister decoration type if necessary + for (let subType in oldDecorationsSubTypes) { + if (!newDecorationsSubTypes[subType]) { + this._removeDecorationType(decorationTypeKey + '-' + subType); + } + } + + // update all decorations + let oldDecorationsIds = this._decorationTypeKeysToIds[decorationTypeKey] || []; + this._decorationTypeKeysToIds[decorationTypeKey] = this.deltaDecorations(oldDecorationsIds, newModelDecorations); + } + + public setDecorationsFast(decorationTypeKey: string, ranges: IRange[]): void { + + // remove decoration sub types that are no longer used, deregister decoration type if necessary + let oldDecorationsSubTypes = this._decorationTypeSubtypes[decorationTypeKey] || {}; + for (let subType in oldDecorationsSubTypes) { + this._removeDecorationType(decorationTypeKey + '-' + subType); + } + this._decorationTypeSubtypes[decorationTypeKey] = {}; + + const opts = ModelDecorationOptions.createDynamic(this._resolveDecorationOptions(decorationTypeKey, false)); + let newModelDecorations: IModelDeltaDecoration[] = new Array(ranges.length); + for (let i = 0, len = ranges.length; i < len; i++) { + newModelDecorations[i] = { range: ranges[i], options: opts }; + } + + // update all decorations + let oldDecorationsIds = this._decorationTypeKeysToIds[decorationTypeKey] || []; + this._decorationTypeKeysToIds[decorationTypeKey] = this.deltaDecorations(oldDecorationsIds, newModelDecorations); + } + + public removeDecorations(decorationTypeKey: string): void { + // remove decorations for type and sub type + let oldDecorationsIds = this._decorationTypeKeysToIds[decorationTypeKey]; + if (oldDecorationsIds) { + this.deltaDecorations(oldDecorationsIds, []); + } + if (this._decorationTypeKeysToIds.hasOwnProperty(decorationTypeKey)) { + delete this._decorationTypeKeysToIds[decorationTypeKey]; + } + if (this._decorationTypeSubtypes.hasOwnProperty(decorationTypeKey)) { + delete this._decorationTypeSubtypes[decorationTypeKey]; + } + } + + public getLayoutInfo(): editorOptions.EditorLayoutInfo { + return this._configuration.editor.layoutInfo; + } + public createOverviewRuler(cssClassName: string): editorBrowser.IOverviewRuler { return this._view.createOverviewRuler(cssClassName); } @@ -325,10 +1226,80 @@ export abstract class CodeEditorWidget extends CommonCodeEditor implements edito Configuration.applyFontInfoSlow(target, this._configuration.editor.fontInfo); } - _attachModel(model: ITextModel): void { + protected _attachModel(model: ITextModel): void { this._view = null; - super._attachModel(model); + this.model = model ? model : null; + this.listenersToRemove = []; + this.viewModel = null; + this.cursor = null; + + if (this.model) { + this.domElement.setAttribute('data-mode-id', this.model.getLanguageIdentifier().language); + this._configuration.setIsDominatedByLongLines(this.model.isDominatedByLongLines()); + this._configuration.setMaxLineNumber(this.model.getLineCount()); + + this.model.onBeforeAttached(); + + this.viewModel = new ViewModel(this.id, this._configuration, this.model, (callback) => dom.scheduleAtNextAnimationFrame(callback)); + + this.listenersToRemove.push(this.model.onDidChangeDecorations((e) => this._onDidChangeModelDecorations.fire(e))); + this.listenersToRemove.push(this.model.onDidChangeLanguage((e) => { + if (!this.model) { + return; + } + this.domElement.setAttribute('data-mode-id', this.model.getLanguageIdentifier().language); + this._onDidChangeModelLanguage.fire(e); + })); + this.listenersToRemove.push(this.model.onDidChangeLanguageConfiguration((e) => this._onDidChangeModelLanguageConfiguration.fire(e))); + this.listenersToRemove.push(this.model.onDidChangeContent((e) => this._onDidChangeModelContent.fire(e))); + this.listenersToRemove.push(this.model.onDidChangeOptions((e) => this._onDidChangeModelOptions.fire(e))); + // Someone might destroy the model from under the editor, so prevent any exceptions by setting a null model + this.listenersToRemove.push(this.model.onWillDispose(() => this.setModel(null))); + + this.cursor = new Cursor( + this._configuration, + this.model, + this.viewModel + ); + + this._createView(); + + this.listenersToRemove.push(this.cursor.onDidReachMaxCursorCount(() => { + this._notificationService.warn(nls.localize('cursors.maximum', "The number of cursors has been limited to {0}.", Cursor.MAX_CURSOR_COUNT)); + })); + + this.listenersToRemove.push(this.cursor.onDidAttemptReadOnlyEdit(() => { + this._onDidAttemptReadOnlyEdit.fire(void 0); + })); + + this.listenersToRemove.push(this.cursor.onDidChange((e: CursorStateChangedEvent) => { + + let positions: Position[] = []; + for (let i = 0, len = e.selections.length; i < len; i++) { + positions[i] = e.selections[i].getPosition(); + } + + const e1: ICursorPositionChangedEvent = { + position: positions[0], + secondaryPositions: positions.slice(1), + reason: e.reason, + source: e.source + }; + this._onDidChangeCursorPosition.fire(e1); + + const e2: ICursorSelectionChangedEvent = { + selection: e.selections[0], + secondarySelections: e.selections.slice(1), + source: e.source, + reason: e.reason + }; + this._onDidChangeCursorSelection.fire(e2); + })); + + } else { + this.hasView = false; + } if (this._view) { this.domElement.appendChild(this._view.domNode.domNode); @@ -351,10 +1322,6 @@ export abstract class CodeEditorWidget extends CommonCodeEditor implements edito } } - protected _scheduleAtNextAnimationFrame(callback: () => void): IDisposable { - return dom.scheduleAtNextAnimationFrame(callback); - } - protected _createView(): void { let commandDelegate: ICommandDelegate; if (this.isSimpleWidget) { @@ -445,18 +1412,9 @@ export abstract class CodeEditorWidget extends CommonCodeEditor implements edito viewEventBus.onKeyDown = (e) => this._onKeyDown.fire(e); } - public restoreViewState(s: editorCommon.ICodeEditorViewState): void { - super.restoreViewState(s); - if (!this.cursor || !this.hasView) { - return; - } - if (s && s.cursorState && s.viewState) { - const reducedState = this.viewModel.reduceRestoreState(s.viewState); - const linesViewportData = this.viewModel.viewLayout.getLinesViewportDataAtScrollTop(reducedState.scrollTop); - const startPosition = this.viewModel.coordinatesConverter.convertViewPositionToModelPosition(new Position(linesViewportData.startLineNumber, 1)); - const endPosition = this.viewModel.coordinatesConverter.convertViewPositionToModelPosition(new Position(linesViewportData.endLineNumber, 1)); - this.model.tokenizeViewport(startPosition.lineNumber, endPosition.lineNumber); - this._view.restoreState(reducedState); + protected _postDetachModelCleanup(detachedModel: ITextModel): void { + if (detachedModel) { + detachedModel.removeAllDecorationsWithOwnerId(this.id); } } @@ -469,7 +1427,28 @@ export abstract class CodeEditorWidget extends CommonCodeEditor implements edito this._view = null; } - let result = super._detachModel(); + if (this.model) { + this.model.onBeforeDetached(); + } + + this.hasView = false; + + this.listenersToRemove = dispose(this.listenersToRemove); + + if (this.cursor) { + this.cursor.dispose(); + this.cursor = null; + } + + if (this.viewModel) { + this.viewModel.dispose(); + this.viewModel = null; + } + + let result = this.model; + this.model = null; + + this.domElement.removeAttribute('data-mode-id'); if (removeDomNode) { this.domElement.removeChild(removeDomNode); @@ -478,32 +1457,240 @@ export abstract class CodeEditorWidget extends CommonCodeEditor implements edito return result; } - // BEGIN decorations - - protected _registerDecorationType(key: string, options: editorCommon.IDecorationRenderOptions, parentTypeKey?: string): void { + private _registerDecorationType(key: string, options: editorCommon.IDecorationRenderOptions, parentTypeKey?: string): void { this._codeEditorService.registerDecorationType(key, options, parentTypeKey); } - protected _removeDecorationType(key: string): void { + private _removeDecorationType(key: string): void { this._codeEditorService.removeDecorationType(key); } - protected _resolveDecorationOptions(typeKey: string, writable: boolean): IModelDecorationOptions { + private _resolveDecorationOptions(typeKey: string, writable: boolean): IModelDecorationOptions { return this._codeEditorService.resolveDecorationOptions(typeKey, writable); } - // END decorations + /* __GDPR__FRAGMENT__ + "EditorTelemetryData" : {} + */ + public getTelemetryData(): { [key: string]: any; } { + return null; + } +} - protected _triggerEditorCommand(source: string, handlerId: string, payload: any): boolean { - const command = EditorExtensionsRegistry.getEditorCommand(handlerId); - if (command) { - payload = payload || {}; - payload.source = source; - TPromise.as(command.runEditorCommand(null, this, payload)).done(null, onUnexpectedError); - return true; +const enum BooleanEventValue { + NotSet, + False, + True +} + +export class BooleanEventEmitter extends Disposable { + private readonly _onDidChangeToTrue: Emitter = this._register(new Emitter()); + public readonly onDidChangeToTrue: Event = this._onDidChangeToTrue.event; + + private readonly _onDidChangeToFalse: Emitter = this._register(new Emitter()); + public readonly onDidChangeToFalse: Event = this._onDidChangeToFalse.event; + + private _value: BooleanEventValue; + + constructor() { + super(); + this._value = BooleanEventValue.NotSet; + } + + public setValue(_value: boolean) { + let value = (_value ? BooleanEventValue.True : BooleanEventValue.False); + if (this._value === value) { + return; } + this._value = value; + if (this._value === BooleanEventValue.True) { + this._onDidChangeToTrue.fire(); + } else if (this._value === BooleanEventValue.False) { + this._onDidChangeToFalse.fire(); + } + } +} - return false; +class EditorContextKeysManager extends Disposable { + + private _editor: CodeEditorWidget; + private _editorFocus: IContextKey; + private _textInputFocus: IContextKey; + private _editorTextFocus: IContextKey; + private _editorTabMovesFocus: IContextKey; + private _editorReadonly: IContextKey; + private _hasMultipleSelections: IContextKey; + private _hasNonEmptySelection: IContextKey; + + constructor( + editor: CodeEditorWidget, + contextKeyService: IContextKeyService + ) { + super(); + + this._editor = editor; + + contextKeyService.createKey('editorId', editor.getId()); + this._editorFocus = EditorContextKeys.focus.bindTo(contextKeyService); + this._textInputFocus = EditorContextKeys.textInputFocus.bindTo(contextKeyService); + this._editorTextFocus = EditorContextKeys.editorTextFocus.bindTo(contextKeyService); + this._editorTabMovesFocus = EditorContextKeys.tabMovesFocus.bindTo(contextKeyService); + this._editorReadonly = EditorContextKeys.readOnly.bindTo(contextKeyService); + this._hasMultipleSelections = EditorContextKeys.hasMultipleSelections.bindTo(contextKeyService); + this._hasNonEmptySelection = EditorContextKeys.hasNonEmptySelection.bindTo(contextKeyService); + + this._register(this._editor.onDidChangeConfiguration(() => this._updateFromConfig())); + this._register(this._editor.onDidChangeCursorSelection(() => this._updateFromSelection())); + this._register(this._editor.onDidFocusEditor(() => this._updateFromFocus())); + this._register(this._editor.onDidBlurEditor(() => this._updateFromFocus())); + this._register(this._editor.onDidFocusEditorText(() => this._updateFromFocus())); + this._register(this._editor.onDidBlurEditorText(() => this._updateFromFocus())); + + this._updateFromConfig(); + this._updateFromSelection(); + this._updateFromFocus(); + } + + private _updateFromConfig(): void { + let config = this._editor.getConfiguration(); + + this._editorTabMovesFocus.set(config.tabFocusMode); + this._editorReadonly.set(config.readOnly); + } + + private _updateFromSelection(): void { + let selections = this._editor.getSelections(); + if (!selections) { + this._hasMultipleSelections.reset(); + this._hasNonEmptySelection.reset(); + } else { + this._hasMultipleSelections.set(selections.length > 1); + this._hasNonEmptySelection.set(selections.some(s => !s.isEmpty())); + } + } + + private _updateFromFocus(): void { + this._editorFocus.set(this._editor.hasWidgetFocus() && !this._editor.isSimpleWidget); + this._editorTextFocus.set(this._editor.isFocused() && !this._editor.isSimpleWidget); + this._textInputFocus.set(this._editor.isFocused()); + } +} + +export class EditorModeContext extends Disposable { + + private _editor: CodeEditorWidget; + + private _langId: IContextKey; + private _hasCompletionItemProvider: IContextKey; + private _hasCodeActionsProvider: IContextKey; + private _hasCodeLensProvider: IContextKey; + private _hasDefinitionProvider: IContextKey; + private _hasImplementationProvider: IContextKey; + private _hasTypeDefinitionProvider: IContextKey; + private _hasHoverProvider: IContextKey; + private _hasDocumentHighlightProvider: IContextKey; + private _hasDocumentSymbolProvider: IContextKey; + private _hasReferenceProvider: IContextKey; + private _hasRenameProvider: IContextKey; + private _hasDocumentFormattingProvider: IContextKey; + private _hasDocumentSelectionFormattingProvider: IContextKey; + private _hasSignatureHelpProvider: IContextKey; + private _isInWalkThrough: IContextKey; + + constructor( + editor: CodeEditorWidget, + contextKeyService: IContextKeyService + ) { + super(); + this._editor = editor; + + this._langId = EditorContextKeys.languageId.bindTo(contextKeyService); + this._hasCompletionItemProvider = EditorContextKeys.hasCompletionItemProvider.bindTo(contextKeyService); + this._hasCodeActionsProvider = EditorContextKeys.hasCodeActionsProvider.bindTo(contextKeyService); + this._hasCodeLensProvider = EditorContextKeys.hasCodeLensProvider.bindTo(contextKeyService); + this._hasDefinitionProvider = EditorContextKeys.hasDefinitionProvider.bindTo(contextKeyService); + this._hasImplementationProvider = EditorContextKeys.hasImplementationProvider.bindTo(contextKeyService); + this._hasTypeDefinitionProvider = EditorContextKeys.hasTypeDefinitionProvider.bindTo(contextKeyService); + this._hasHoverProvider = EditorContextKeys.hasHoverProvider.bindTo(contextKeyService); + this._hasDocumentHighlightProvider = EditorContextKeys.hasDocumentHighlightProvider.bindTo(contextKeyService); + this._hasDocumentSymbolProvider = EditorContextKeys.hasDocumentSymbolProvider.bindTo(contextKeyService); + this._hasReferenceProvider = EditorContextKeys.hasReferenceProvider.bindTo(contextKeyService); + this._hasRenameProvider = EditorContextKeys.hasRenameProvider.bindTo(contextKeyService); + this._hasDocumentFormattingProvider = EditorContextKeys.hasDocumentFormattingProvider.bindTo(contextKeyService); + this._hasDocumentSelectionFormattingProvider = EditorContextKeys.hasDocumentSelectionFormattingProvider.bindTo(contextKeyService); + this._hasSignatureHelpProvider = EditorContextKeys.hasSignatureHelpProvider.bindTo(contextKeyService); + this._isInWalkThrough = EditorContextKeys.isInEmbeddedEditor.bindTo(contextKeyService); + + const update = () => this._update(); + + // update when model/mode changes + this._register(editor.onDidChangeModel(update)); + this._register(editor.onDidChangeModelLanguage(update)); + + // update when registries change + this._register(modes.SuggestRegistry.onDidChange(update)); + this._register(modes.CodeActionProviderRegistry.onDidChange(update)); + this._register(modes.CodeLensProviderRegistry.onDidChange(update)); + this._register(modes.DefinitionProviderRegistry.onDidChange(update)); + this._register(modes.ImplementationProviderRegistry.onDidChange(update)); + this._register(modes.TypeDefinitionProviderRegistry.onDidChange(update)); + this._register(modes.HoverProviderRegistry.onDidChange(update)); + this._register(modes.DocumentHighlightProviderRegistry.onDidChange(update)); + this._register(modes.DocumentSymbolProviderRegistry.onDidChange(update)); + this._register(modes.ReferenceProviderRegistry.onDidChange(update)); + this._register(modes.RenameProviderRegistry.onDidChange(update)); + this._register(modes.DocumentFormattingEditProviderRegistry.onDidChange(update)); + this._register(modes.DocumentRangeFormattingEditProviderRegistry.onDidChange(update)); + this._register(modes.SignatureHelpProviderRegistry.onDidChange(update)); + + update(); + } + + dispose() { + super.dispose(); + } + + reset() { + this._langId.reset(); + this._hasCompletionItemProvider.reset(); + this._hasCodeActionsProvider.reset(); + this._hasCodeLensProvider.reset(); + this._hasDefinitionProvider.reset(); + this._hasImplementationProvider.reset(); + this._hasTypeDefinitionProvider.reset(); + this._hasHoverProvider.reset(); + this._hasDocumentHighlightProvider.reset(); + this._hasDocumentSymbolProvider.reset(); + this._hasReferenceProvider.reset(); + this._hasRenameProvider.reset(); + this._hasDocumentFormattingProvider.reset(); + this._hasDocumentSelectionFormattingProvider.reset(); + this._hasSignatureHelpProvider.reset(); + this._isInWalkThrough.reset(); + } + + private _update() { + const model = this._editor.getModel(); + if (!model) { + this.reset(); + return; + } + this._langId.set(model.getLanguageIdentifier().language); + this._hasCompletionItemProvider.set(modes.SuggestRegistry.has(model)); + this._hasCodeActionsProvider.set(modes.CodeActionProviderRegistry.has(model)); + this._hasCodeLensProvider.set(modes.CodeLensProviderRegistry.has(model)); + this._hasDefinitionProvider.set(modes.DefinitionProviderRegistry.has(model)); + this._hasImplementationProvider.set(modes.ImplementationProviderRegistry.has(model)); + this._hasTypeDefinitionProvider.set(modes.TypeDefinitionProviderRegistry.has(model)); + this._hasHoverProvider.set(modes.HoverProviderRegistry.has(model)); + this._hasDocumentHighlightProvider.set(modes.DocumentHighlightProviderRegistry.has(model)); + this._hasDocumentSymbolProvider.set(modes.DocumentSymbolProviderRegistry.has(model)); + this._hasReferenceProvider.set(modes.ReferenceProviderRegistry.has(model)); + this._hasRenameProvider.set(modes.RenameProviderRegistry.has(model)); + this._hasSignatureHelpProvider.set(modes.SignatureHelpProviderRegistry.has(model)); + this._hasDocumentFormattingProvider.set(modes.DocumentFormattingEditProviderRegistry.has(model) || modes.DocumentRangeFormattingEditProviderRegistry.has(model)); + this._hasDocumentSelectionFormattingProvider.set(modes.DocumentRangeFormattingEditProviderRegistry.has(model)); + this._isInWalkThrough.set(model.uri.scheme === Schemas.walkThroughSnippet); } } diff --git a/src/vs/editor/common/commonCodeEditor.ts b/src/vs/editor/common/commonCodeEditor.ts deleted file mode 100644 index 99b0be6b3aa..00000000000 --- a/src/vs/editor/common/commonCodeEditor.ts +++ /dev/null @@ -1,1270 +0,0 @@ -/*--------------------------------------------------------------------------------------------- - * Copyright (c) Microsoft Corporation. All rights reserved. - * Licensed under the MIT License. See License.txt in the project root for license information. - *--------------------------------------------------------------------------------------------*/ -'use strict'; - -import * as nls from 'vs/nls'; -import { onUnexpectedError } from 'vs/base/common/errors'; -import { Event, Emitter } from 'vs/base/common/event'; -import { Disposable, IDisposable, dispose } from 'vs/base/common/lifecycle'; -import { TPromise } from 'vs/base/common/winjs.base'; -import { ServicesAccessor, IInstantiationService } from 'vs/platform/instantiation/common/instantiation'; -import { ServiceCollection } from 'vs/platform/instantiation/common/serviceCollection'; -import { IContextKey, IContextKeyServiceTarget, IContextKeyService } from 'vs/platform/contextkey/common/contextkey'; -import { CommonEditorConfiguration } from 'vs/editor/common/config/commonEditorConfig'; -import { Cursor, CursorStateChangedEvent } from 'vs/editor/common/controller/cursor'; -import { CursorColumns, ICursors, CursorConfiguration } from 'vs/editor/common/controller/cursorCommon'; -import { Position, IPosition } from 'vs/editor/common/core/position'; -import { Range, IRange } from 'vs/editor/common/core/range'; -import { Selection, ISelection } from 'vs/editor/common/core/selection'; -import * as editorCommon from 'vs/editor/common/editorCommon'; -import { ViewModel } from 'vs/editor/common/viewModel/viewModelImpl'; -import { hash } from 'vs/base/common/hash'; -import { IModelContentChangedEvent, IModelDecorationsChangedEvent, IModelLanguageChangedEvent, IModelOptionsChangedEvent, IModelLanguageConfigurationChangedEvent } from 'vs/editor/common/model/textModelEvents'; -import * as editorOptions from 'vs/editor/common/config/editorOptions'; -import { ICursorPositionChangedEvent, ICursorSelectionChangedEvent } from 'vs/editor/common/controller/cursorEvents'; -import { EditorContextKeys } from 'vs/editor/common/editorContextKeys'; -import { VerticalRevealType } from 'vs/editor/common/view/viewEvents'; -import { ModelDecorationOptions } from 'vs/editor/common/model/textModel'; -import { IEditorWhitespace } from 'vs/editor/common/viewLayout/whitespaceComputer'; -import * as modes from 'vs/editor/common/modes'; -import { Schemas } from 'vs/base/common/network'; -import { ITextModel, EndOfLinePreference, IIdentifiedSingleEditOperation, IModelDecorationsChangeAccessor, IModelDecoration, IModelDeltaDecoration, IModelDecorationOptions } from 'vs/editor/common/model'; -import { INotificationService } from 'vs/platform/notification/common/notification'; - -let EDITOR_ID = 0; - -export abstract class CommonCodeEditor extends Disposable { - - private readonly _onDidDispose: Emitter = this._register(new Emitter()); - public readonly onDidDispose: Event = this._onDidDispose.event; - - private readonly _onDidChangeModelContent: Emitter = this._register(new Emitter()); - public readonly onDidChangeModelContent: Event = this._onDidChangeModelContent.event; - - private readonly _onDidChangeModelLanguage: Emitter = this._register(new Emitter()); - public readonly onDidChangeModelLanguage: Event = this._onDidChangeModelLanguage.event; - - private readonly _onDidChangeModelLanguageConfiguration: Emitter = this._register(new Emitter()); - public readonly onDidChangeModelLanguageConfiguration: Event = this._onDidChangeModelLanguageConfiguration.event; - - private readonly _onDidChangeModelOptions: Emitter = this._register(new Emitter()); - public readonly onDidChangeModelOptions: Event = this._onDidChangeModelOptions.event; - - private readonly _onDidChangeModelDecorations: Emitter = this._register(new Emitter()); - public readonly onDidChangeModelDecorations: Event = this._onDidChangeModelDecorations.event; - - private readonly _onDidChangeConfiguration: Emitter = this._register(new Emitter()); - public readonly onDidChangeConfiguration: Event = this._onDidChangeConfiguration.event; - - protected readonly _onDidChangeModel: Emitter = this._register(new Emitter()); - public readonly onDidChangeModel: Event = this._onDidChangeModel.event; - - private readonly _onDidChangeCursorPosition: Emitter = this._register(new Emitter()); - public readonly onDidChangeCursorPosition: Event = this._onDidChangeCursorPosition.event; - - private readonly _onDidChangeCursorSelection: Emitter = this._register(new Emitter()); - public readonly onDidChangeCursorSelection: Event = this._onDidChangeCursorSelection.event; - - private readonly _onDidAttemptReadOnlyEdit: Emitter = this._register(new Emitter()); - public readonly onDidAttemptReadOnlyEdit: Event = this._onDidAttemptReadOnlyEdit.event; - - private readonly _onDidLayoutChange: Emitter = this._register(new Emitter()); - public readonly onDidLayoutChange: Event = this._onDidLayoutChange.event; - - protected _editorTextFocus: BooleanEventEmitter = this._register(new BooleanEventEmitter()); - public readonly onDidFocusEditorText: Event = this._editorTextFocus.onDidChangeToTrue; - public readonly onDidBlurEditorText: Event = this._editorTextFocus.onDidChangeToFalse; - - protected _editorFocus: BooleanEventEmitter = this._register(new BooleanEventEmitter()); - public readonly onDidFocusEditor: Event = this._editorFocus.onDidChangeToTrue; - public readonly onDidBlurEditor: Event = this._editorFocus.onDidChangeToFalse; - - private readonly _onWillType: Emitter = this._register(new Emitter()); - public readonly onWillType = this._onWillType.event; - - private readonly _onDidType: Emitter = this._register(new Emitter()); - public readonly onDidType = this._onDidType.event; - - private readonly _onDidPaste: Emitter = this._register(new Emitter()); - public readonly onDidPaste = this._onDidPaste.event; - - public readonly isSimpleWidget: boolean; - - protected readonly domElement: IContextKeyServiceTarget; - protected readonly id: number; - protected readonly _configuration: CommonEditorConfiguration; - - protected _contributions: { [key: string]: editorCommon.IEditorContribution; }; - protected _actions: { [key: string]: editorCommon.IEditorAction; }; - - // --- Members logically associated to a model - protected model: ITextModel; - protected listenersToRemove: IDisposable[]; - protected hasView: boolean; - - protected viewModel: ViewModel; - protected cursor: Cursor; - - protected readonly _instantiationService: IInstantiationService; - protected readonly _contextKeyService: IContextKeyService; - protected readonly _notificationService: INotificationService; - - /** - * map from "parent" decoration type to live decoration ids. - */ - private _decorationTypeKeysToIds: { [decorationTypeKey: string]: string[] }; - private _decorationTypeSubtypes: { [decorationTypeKey: string]: { [subtype: string]: boolean } }; - - - constructor( - domElement: IContextKeyServiceTarget, - options: editorOptions.IEditorOptions, - isSimpleWidget: boolean, - instantiationService: IInstantiationService, - contextKeyService: IContextKeyService, - notificationService: INotificationService, - ) { - super(); - this.domElement = domElement; - this.id = (++EDITOR_ID); - this._decorationTypeKeysToIds = {}; - this._decorationTypeSubtypes = {}; - this.isSimpleWidget = isSimpleWidget; - - options = options || {}; - this._configuration = this._register(this._createConfiguration(options)); - this._register(this._configuration.onDidChange((e) => { - this._onDidChangeConfiguration.fire(e); - - if (e.layoutInfo) { - this._onDidLayoutChange.fire(this._configuration.editor.layoutInfo); - } - })); - - this._contextKeyService = this._register(contextKeyService.createScoped(this.domElement)); - this._notificationService = notificationService; - this._register(new EditorContextKeysManager(this, this._contextKeyService)); - this._register(new EditorModeContext(this, this._contextKeyService)); - - this._instantiationService = instantiationService.createChild(new ServiceCollection([IContextKeyService, this._contextKeyService])); - - this._attachModel(null); - - this._contributions = {}; - this._actions = {}; - } - - protected abstract _createConfiguration(options: editorOptions.IEditorOptions): CommonEditorConfiguration; - - public getId(): string { - return this.getEditorType() + ':' + this.id; - } - - public getEditorType(): string { - return editorCommon.EditorType.ICodeEditor; - } - - public dispose(): void { - let keys = Object.keys(this._contributions); - for (let i = 0, len = keys.length; i < len; i++) { - let contributionId = keys[i]; - this._contributions[contributionId].dispose(); - } - this._contributions = {}; - - // editor actions don't need to be disposed - this._actions = {}; - this._removeDecorationTypes(); - this._postDetachModelCleanup(this._detachModel()); - - this._onDidDispose.fire(); - - super.dispose(); - } - - public invokeWithinContext(fn: (accessor: ServicesAccessor) => T): T { - return this._instantiationService.invokeFunction(fn); - } - - public updateOptions(newOptions: editorOptions.IEditorOptions): void { - this._configuration.updateOptions(newOptions); - } - - public getConfiguration(): editorOptions.InternalEditorOptions { - return this._configuration.editor; - } - - public getRawConfiguration(): editorOptions.IEditorOptions { - return this._configuration.getRawOptions(); - } - - public getValue(options: { preserveBOM: boolean; lineEnding: string; } = null): string { - if (this.model) { - let preserveBOM: boolean = (options && options.preserveBOM) ? true : false; - let eolPreference = EndOfLinePreference.TextDefined; - if (options && options.lineEnding && options.lineEnding === '\n') { - eolPreference = EndOfLinePreference.LF; - } else if (options && options.lineEnding && options.lineEnding === '\r\n') { - eolPreference = EndOfLinePreference.CRLF; - } - return this.model.getValue(eolPreference, preserveBOM); - } - return ''; - } - - public setValue(newValue: string): void { - if (this.model) { - this.model.setValue(newValue); - } - } - - public getModel(): ITextModel { - return this.model; - } - - public setModel(model: ITextModel = null): void { - if (this.model === model) { - // Current model is the new model - return; - } - - let detachedModel = this._detachModel(); - this._attachModel(model); - - let e: editorCommon.IModelChangedEvent = { - oldModelUrl: detachedModel ? detachedModel.uri : null, - newModelUrl: model ? model.uri : null - }; - - this._removeDecorationTypes(); - this._onDidChangeModel.fire(e); - this._postDetachModelCleanup(detachedModel); - } - - private _removeDecorationTypes(): void { - this._decorationTypeKeysToIds = {}; - if (this._decorationTypeSubtypes) { - for (let decorationType in this._decorationTypeSubtypes) { - let subTypes = this._decorationTypeSubtypes[decorationType]; - for (let subType in subTypes) { - this._removeDecorationType(decorationType + '-' + subType); - } - } - this._decorationTypeSubtypes = {}; - } - } - - public getVisibleRanges(): Range[] { - if (!this.hasView) { - return []; - } - return this.viewModel.getVisibleRanges(); - } - - public getWhitespaces(): IEditorWhitespace[] { - if (!this.hasView) { - return []; - } - return this.viewModel.viewLayout.getWhitespaces(); - } - - protected _getVerticalOffsetForPosition(modelLineNumber: number, modelColumn: number): number { - let modelPosition = this.model.validatePosition({ - lineNumber: modelLineNumber, - column: modelColumn - }); - let viewPosition = this.viewModel.coordinatesConverter.convertModelPositionToViewPosition(modelPosition); - return this.viewModel.viewLayout.getVerticalOffsetForLineNumber(viewPosition.lineNumber); - } - - public getTopForLineNumber(lineNumber: number): number { - if (!this.hasView) { - return -1; - } - return this._getVerticalOffsetForPosition(lineNumber, 1); - } - - public getTopForPosition(lineNumber: number, column: number): number { - if (!this.hasView) { - return -1; - } - return this._getVerticalOffsetForPosition(lineNumber, column); - } - - public setHiddenAreas(ranges: IRange[]): void { - if (this.viewModel) { - this.viewModel.setHiddenAreas(ranges.map(r => Range.lift(r))); - } - } - - public getVisibleColumnFromPosition(rawPosition: IPosition): number { - if (!this.model) { - return rawPosition.column; - } - - let position = this.model.validatePosition(rawPosition); - let tabSize = this.model.getOptions().tabSize; - - return CursorColumns.visibleColumnFromColumn(this.model.getLineContent(position.lineNumber), position.column, tabSize) + 1; - } - - public getPosition(): Position { - if (!this.cursor) { - return null; - } - return this.cursor.getPosition().clone(); - } - - public setPosition(position: IPosition): void { - if (!this.cursor) { - return; - } - if (!Position.isIPosition(position)) { - throw new Error('Invalid arguments'); - } - this.cursor.setSelections('api', [{ - selectionStartLineNumber: position.lineNumber, - selectionStartColumn: position.column, - positionLineNumber: position.lineNumber, - positionColumn: position.column - }]); - } - - private _sendRevealRange(modelRange: Range, verticalType: VerticalRevealType, revealHorizontal: boolean, scrollType: editorCommon.ScrollType): void { - if (!this.model || !this.cursor) { - return; - } - if (!Range.isIRange(modelRange)) { - throw new Error('Invalid arguments'); - } - const validatedModelRange = this.model.validateRange(modelRange); - const viewRange = this.viewModel.coordinatesConverter.convertModelRangeToViewRange(validatedModelRange); - - this.cursor.emitCursorRevealRange(viewRange, verticalType, revealHorizontal, scrollType); - } - - public revealLine(lineNumber: number, scrollType: editorCommon.ScrollType = editorCommon.ScrollType.Smooth): void { - this._revealLine(lineNumber, VerticalRevealType.Simple, scrollType); - } - - public revealLineInCenter(lineNumber: number, scrollType: editorCommon.ScrollType = editorCommon.ScrollType.Smooth): void { - this._revealLine(lineNumber, VerticalRevealType.Center, scrollType); - } - - public revealLineInCenterIfOutsideViewport(lineNumber: number, scrollType: editorCommon.ScrollType = editorCommon.ScrollType.Smooth): void { - this._revealLine(lineNumber, VerticalRevealType.CenterIfOutsideViewport, scrollType); - } - - private _revealLine(lineNumber: number, revealType: VerticalRevealType, scrollType: editorCommon.ScrollType): void { - if (typeof lineNumber !== 'number') { - throw new Error('Invalid arguments'); - } - - this._sendRevealRange( - new Range(lineNumber, 1, lineNumber, 1), - revealType, - false, - scrollType - ); - } - - public revealPosition(position: IPosition, scrollType: editorCommon.ScrollType = editorCommon.ScrollType.Smooth): void { - this._revealPosition( - position, - VerticalRevealType.Simple, - true, - scrollType - ); - } - - public revealPositionInCenter(position: IPosition, scrollType: editorCommon.ScrollType = editorCommon.ScrollType.Smooth): void { - this._revealPosition( - position, - VerticalRevealType.Center, - true, - scrollType - ); - } - - public revealPositionInCenterIfOutsideViewport(position: IPosition, scrollType: editorCommon.ScrollType = editorCommon.ScrollType.Smooth): void { - this._revealPosition( - position, - VerticalRevealType.CenterIfOutsideViewport, - true, - scrollType - ); - } - - private _revealPosition(position: IPosition, verticalType: VerticalRevealType, revealHorizontal: boolean, scrollType: editorCommon.ScrollType): void { - if (!Position.isIPosition(position)) { - throw new Error('Invalid arguments'); - } - - this._sendRevealRange( - new Range(position.lineNumber, position.column, position.lineNumber, position.column), - verticalType, - revealHorizontal, - scrollType - ); - } - - public getSelection(): Selection { - if (!this.cursor) { - return null; - } - return this.cursor.getSelection().clone(); - } - - public getSelections(): Selection[] { - if (!this.cursor) { - return null; - } - let selections = this.cursor.getSelections(); - let result: Selection[] = []; - for (let i = 0, len = selections.length; i < len; i++) { - result[i] = selections[i].clone(); - } - return result; - } - - public setSelection(range: IRange): void; - public setSelection(editorRange: Range): void; - public setSelection(selection: ISelection): void; - public setSelection(editorSelection: Selection): void; - public setSelection(something: any): void { - let isSelection = Selection.isISelection(something); - let isRange = Range.isIRange(something); - - if (!isSelection && !isRange) { - throw new Error('Invalid arguments'); - } - - if (isSelection) { - this._setSelectionImpl(something); - } else if (isRange) { - // act as if it was an IRange - let selection: ISelection = { - selectionStartLineNumber: something.startLineNumber, - selectionStartColumn: something.startColumn, - positionLineNumber: something.endLineNumber, - positionColumn: something.endColumn - }; - this._setSelectionImpl(selection); - } - } - - private _setSelectionImpl(sel: ISelection): void { - if (!this.cursor) { - return; - } - let selection = new Selection(sel.selectionStartLineNumber, sel.selectionStartColumn, sel.positionLineNumber, sel.positionColumn); - this.cursor.setSelections('api', [selection]); - } - - public revealLines(startLineNumber: number, endLineNumber: number, scrollType: editorCommon.ScrollType = editorCommon.ScrollType.Smooth): void { - this._revealLines( - startLineNumber, - endLineNumber, - VerticalRevealType.Simple, - scrollType - ); - } - - public revealLinesInCenter(startLineNumber: number, endLineNumber: number, scrollType: editorCommon.ScrollType = editorCommon.ScrollType.Smooth): void { - this._revealLines( - startLineNumber, - endLineNumber, - VerticalRevealType.Center, - scrollType - ); - } - - public revealLinesInCenterIfOutsideViewport(startLineNumber: number, endLineNumber: number, scrollType: editorCommon.ScrollType = editorCommon.ScrollType.Smooth): void { - this._revealLines( - startLineNumber, - endLineNumber, - VerticalRevealType.CenterIfOutsideViewport, - scrollType - ); - } - - private _revealLines(startLineNumber: number, endLineNumber: number, verticalType: VerticalRevealType, scrollType: editorCommon.ScrollType): void { - if (typeof startLineNumber !== 'number' || typeof endLineNumber !== 'number') { - throw new Error('Invalid arguments'); - } - - this._sendRevealRange( - new Range(startLineNumber, 1, endLineNumber, 1), - verticalType, - false, - scrollType - ); - } - - public revealRange(range: IRange, scrollType: editorCommon.ScrollType = editorCommon.ScrollType.Smooth, revealVerticalInCenter: boolean = false, revealHorizontal: boolean = true): void { - this._revealRange( - range, - revealVerticalInCenter ? VerticalRevealType.Center : VerticalRevealType.Simple, - revealHorizontal, - scrollType - ); - } - - public revealRangeInCenter(range: IRange, scrollType: editorCommon.ScrollType = editorCommon.ScrollType.Smooth): void { - this._revealRange( - range, - VerticalRevealType.Center, - true, - scrollType - ); - } - - public revealRangeInCenterIfOutsideViewport(range: IRange, scrollType: editorCommon.ScrollType = editorCommon.ScrollType.Smooth): void { - this._revealRange( - range, - VerticalRevealType.CenterIfOutsideViewport, - true, - scrollType - ); - } - - public revealRangeAtTop(range: IRange, scrollType: editorCommon.ScrollType = editorCommon.ScrollType.Smooth): void { - this._revealRange( - range, - VerticalRevealType.Top, - true, - scrollType - ); - } - - private _revealRange(range: IRange, verticalType: VerticalRevealType, revealHorizontal: boolean, scrollType: editorCommon.ScrollType): void { - if (!Range.isIRange(range)) { - throw new Error('Invalid arguments'); - } - - this._sendRevealRange( - Range.lift(range), - verticalType, - revealHorizontal, - scrollType - ); - } - - public setSelections(ranges: ISelection[]): void { - if (!this.cursor) { - return; - } - if (!ranges || ranges.length === 0) { - throw new Error('Invalid arguments'); - } - for (let i = 0, len = ranges.length; i < len; i++) { - if (!Selection.isISelection(ranges[i])) { - throw new Error('Invalid arguments'); - } - } - this.cursor.setSelections('api', ranges); - } - - public getScrollWidth(): number { - if (!this.hasView) { - return -1; - } - return this.viewModel.viewLayout.getScrollWidth(); - } - public getScrollLeft(): number { - if (!this.hasView) { - return -1; - } - return this.viewModel.viewLayout.getCurrentScrollLeft(); - } - - public getScrollHeight(): number { - if (!this.hasView) { - return -1; - } - return this.viewModel.viewLayout.getScrollHeight(); - } - public getScrollTop(): number { - if (!this.hasView) { - return -1; - } - return this.viewModel.viewLayout.getCurrentScrollTop(); - } - - public setScrollLeft(newScrollLeft: number): void { - if (!this.hasView) { - return; - } - if (typeof newScrollLeft !== 'number') { - throw new Error('Invalid arguments'); - } - this.viewModel.viewLayout.setScrollPositionNow({ - scrollLeft: newScrollLeft - }); - } - public setScrollTop(newScrollTop: number): void { - if (!this.hasView) { - return; - } - if (typeof newScrollTop !== 'number') { - throw new Error('Invalid arguments'); - } - this.viewModel.viewLayout.setScrollPositionNow({ - scrollTop: newScrollTop - }); - } - public setScrollPosition(position: editorCommon.INewScrollPosition): void { - if (!this.hasView) { - return; - } - this.viewModel.viewLayout.setScrollPositionNow(position); - } - - public saveViewState(): editorCommon.ICodeEditorViewState { - if (!this.cursor || !this.hasView) { - return null; - } - const contributionsState: { [key: string]: any } = {}; - - const keys = Object.keys(this._contributions); - for (let i = 0, len = keys.length; i < len; i++) { - const id = keys[i]; - const contribution = this._contributions[id]; - if (typeof contribution.saveViewState === 'function') { - contributionsState[id] = contribution.saveViewState(); - } - } - - const cursorState = this.cursor.saveState(); - const viewState = this.viewModel.saveState(); - return { - cursorState: cursorState, - viewState: viewState, - contributionsState: contributionsState - }; - } - - public restoreViewState(s: editorCommon.ICodeEditorViewState): void { - if (!this.cursor || !this.hasView) { - return; - } - if (s && s.cursorState && s.viewState) { - let codeEditorState = s; - let cursorState = codeEditorState.cursorState; - if (Array.isArray(cursorState)) { - this.cursor.restoreState(cursorState); - } else { - // Backwards compatibility - this.cursor.restoreState([cursorState]); - } - - let contributionsState = s.contributionsState || {}; - let keys = Object.keys(this._contributions); - for (let i = 0, len = keys.length; i < len; i++) { - let id = keys[i]; - let contribution = this._contributions[id]; - if (typeof contribution.restoreViewState === 'function') { - contribution.restoreViewState(contributionsState[id]); - } - } - } - } - - public onVisible(): void { - } - - public onHide(): void { - } - - public abstract layout(dimension?: editorCommon.IDimension): void; - - public abstract focus(): void; - public abstract isFocused(): boolean; - public abstract hasWidgetFocus(): boolean; - - public getContribution(id: string): T { - return (this._contributions[id] || null); - } - - public getActions(): editorCommon.IEditorAction[] { - let result: editorCommon.IEditorAction[] = []; - - let keys = Object.keys(this._actions); - for (let i = 0, len = keys.length; i < len; i++) { - let id = keys[i]; - result.push(this._actions[id]); - } - - return result; - } - - public getSupportedActions(): editorCommon.IEditorAction[] { - let result = this.getActions(); - - result = result.filter(action => action.isSupported()); - - return result; - } - - public getAction(id: string): editorCommon.IEditorAction { - return this._actions[id] || null; - } - - public trigger(source: string, handlerId: string, payload: any): void { - payload = payload || {}; - - // Special case for typing - if (handlerId === editorCommon.Handler.Type) { - if (!this.cursor || typeof payload.text !== 'string' || payload.text.length === 0) { - // nothing to do - return; - } - if (source === 'keyboard') { - this._onWillType.fire(payload.text); - } - this.cursor.trigger(source, handlerId, payload); - if (source === 'keyboard') { - this._onDidType.fire(payload.text); - } - return; - } - - // Special case for pasting - if (handlerId === editorCommon.Handler.Paste) { - if (!this.cursor || typeof payload.text !== 'string' || payload.text.length === 0) { - // nothing to do - return; - } - const startPosition = this.cursor.getSelection().getStartPosition(); - this.cursor.trigger(source, handlerId, payload); - const endPosition = this.cursor.getSelection().getStartPosition(); - if (source === 'keyboard') { - this._onDidPaste.fire( - new Range(startPosition.lineNumber, startPosition.column, endPosition.lineNumber, endPosition.column) - ); - } - return; - } - - const action = this.getAction(handlerId); - if (action) { - TPromise.as(action.run()).then(null, onUnexpectedError); - return; - } - - if (!this.cursor) { - return; - } - - if (this._triggerEditorCommand(source, handlerId, payload)) { - return; - } - - this.cursor.trigger(source, handlerId, payload); - } - - protected abstract _triggerEditorCommand(source: string, handlerId: string, payload: any): boolean; - - public _getCursors(): ICursors { - return this.cursor; - } - - public _getCursorConfiguration(): CursorConfiguration { - return this.cursor.context.config; - } - - public pushUndoStop(): boolean { - if (!this.model) { - return false; - } - if (this._configuration.editor.readOnly) { - // read only editor => sorry! - return false; - } - this.model.pushStackElement(); - return true; - } - - public executeEdits(source: string, edits: IIdentifiedSingleEditOperation[], endCursorState?: Selection[]): boolean { - if (!this.cursor) { - // no view, no cursor - return false; - } - if (this._configuration.editor.readOnly) { - // read only editor => sorry! - return false; - } - - this.model.pushEditOperations(this.cursor.getSelections(), edits, () => { - return endCursorState ? endCursorState : null; - }); - - if (endCursorState) { - this.cursor.setSelections(source, endCursorState); - } - - return true; - } - - public executeCommand(source: string, command: editorCommon.ICommand): void { - if (!this.cursor) { - return; - } - this.cursor.trigger(source, editorCommon.Handler.ExecuteCommand, command); - } - - public executeCommands(source: string, commands: editorCommon.ICommand[]): void { - if (!this.cursor) { - return; - } - this.cursor.trigger(source, editorCommon.Handler.ExecuteCommands, commands); - } - - public changeDecorations(callback: (changeAccessor: IModelDecorationsChangeAccessor) => any): any { - if (!this.model) { - // console.warn('Cannot change decorations on editor that is not attached to a model'); - // callback will not be called - return null; - } - return this.model.changeDecorations(callback, this.id); - } - - public getLineDecorations(lineNumber: number): IModelDecoration[] { - if (!this.model) { - return null; - } - return this.model.getLineDecorations(lineNumber, this.id, this._configuration.editor.readOnly); - } - - public deltaDecorations(oldDecorations: string[], newDecorations: IModelDeltaDecoration[]): string[] { - if (!this.model) { - return []; - } - - if (oldDecorations.length === 0 && newDecorations.length === 0) { - return oldDecorations; - } - - return this.model.deltaDecorations(oldDecorations, newDecorations, this.id); - } - - public setDecorations(decorationTypeKey: string, decorationOptions: editorCommon.IDecorationOptions[]): void { - - let newDecorationsSubTypes: { [key: string]: boolean } = {}; - let oldDecorationsSubTypes = this._decorationTypeSubtypes[decorationTypeKey] || {}; - this._decorationTypeSubtypes[decorationTypeKey] = newDecorationsSubTypes; - - let newModelDecorations: IModelDeltaDecoration[] = []; - - for (let decorationOption of decorationOptions) { - let typeKey = decorationTypeKey; - if (decorationOption.renderOptions) { - // identify custom reder options by a hash code over all keys and values - // For custom render options register a decoration type if necessary - let subType = hash(decorationOption.renderOptions).toString(16); - // The fact that `decorationTypeKey` appears in the typeKey has no influence - // it is just a mechanism to get predictable and unique keys (repeatable for the same options and unique across clients) - typeKey = decorationTypeKey + '-' + subType; - if (!oldDecorationsSubTypes[subType] && !newDecorationsSubTypes[subType]) { - // decoration type did not exist before, register new one - this._registerDecorationType(typeKey, decorationOption.renderOptions, decorationTypeKey); - } - newDecorationsSubTypes[subType] = true; - } - let opts = this._resolveDecorationOptions(typeKey, !!decorationOption.hoverMessage); - if (decorationOption.hoverMessage) { - opts.hoverMessage = decorationOption.hoverMessage; - } - newModelDecorations.push({ range: decorationOption.range, options: opts }); - } - - // remove decoration sub types that are no longer used, deregister decoration type if necessary - for (let subType in oldDecorationsSubTypes) { - if (!newDecorationsSubTypes[subType]) { - this._removeDecorationType(decorationTypeKey + '-' + subType); - } - } - - // update all decorations - let oldDecorationsIds = this._decorationTypeKeysToIds[decorationTypeKey] || []; - this._decorationTypeKeysToIds[decorationTypeKey] = this.deltaDecorations(oldDecorationsIds, newModelDecorations); - } - - public setDecorationsFast(decorationTypeKey: string, ranges: IRange[]): void { - - // remove decoration sub types that are no longer used, deregister decoration type if necessary - let oldDecorationsSubTypes = this._decorationTypeSubtypes[decorationTypeKey] || {}; - for (let subType in oldDecorationsSubTypes) { - this._removeDecorationType(decorationTypeKey + '-' + subType); - } - this._decorationTypeSubtypes[decorationTypeKey] = {}; - - const opts = ModelDecorationOptions.createDynamic(this._resolveDecorationOptions(decorationTypeKey, false)); - let newModelDecorations: IModelDeltaDecoration[] = new Array(ranges.length); - for (let i = 0, len = ranges.length; i < len; i++) { - newModelDecorations[i] = { range: ranges[i], options: opts }; - } - - // update all decorations - let oldDecorationsIds = this._decorationTypeKeysToIds[decorationTypeKey] || []; - this._decorationTypeKeysToIds[decorationTypeKey] = this.deltaDecorations(oldDecorationsIds, newModelDecorations); - } - - public removeDecorations(decorationTypeKey: string): void { - // remove decorations for type and sub type - let oldDecorationsIds = this._decorationTypeKeysToIds[decorationTypeKey]; - if (oldDecorationsIds) { - this.deltaDecorations(oldDecorationsIds, []); - } - if (this._decorationTypeKeysToIds.hasOwnProperty(decorationTypeKey)) { - delete this._decorationTypeKeysToIds[decorationTypeKey]; - } - if (this._decorationTypeSubtypes.hasOwnProperty(decorationTypeKey)) { - delete this._decorationTypeSubtypes[decorationTypeKey]; - } - } - - public getLayoutInfo(): editorOptions.EditorLayoutInfo { - return this._configuration.editor.layoutInfo; - } - - protected _attachModel(model: ITextModel): void { - this.model = model ? model : null; - this.listenersToRemove = []; - this.viewModel = null; - this.cursor = null; - - if (this.model) { - this.domElement.setAttribute('data-mode-id', this.model.getLanguageIdentifier().language); - this._configuration.setIsDominatedByLongLines(this.model.isDominatedByLongLines()); - this._configuration.setMaxLineNumber(this.model.getLineCount()); - - this.model.onBeforeAttached(); - - this.viewModel = new ViewModel(this.id, this._configuration, this.model, (callback) => this._scheduleAtNextAnimationFrame(callback)); - - this.listenersToRemove.push(this.model.onDidChangeDecorations((e) => this._onDidChangeModelDecorations.fire(e))); - this.listenersToRemove.push(this.model.onDidChangeLanguage((e) => { - if (!this.model) { - return; - } - this.domElement.setAttribute('data-mode-id', this.model.getLanguageIdentifier().language); - this._onDidChangeModelLanguage.fire(e); - })); - this.listenersToRemove.push(this.model.onDidChangeLanguageConfiguration((e) => this._onDidChangeModelLanguageConfiguration.fire(e))); - this.listenersToRemove.push(this.model.onDidChangeContent((e) => this._onDidChangeModelContent.fire(e))); - this.listenersToRemove.push(this.model.onDidChangeOptions((e) => this._onDidChangeModelOptions.fire(e))); - // Someone might destroy the model from under the editor, so prevent any exceptions by setting a null model - this.listenersToRemove.push(this.model.onWillDispose(() => this.setModel(null))); - - this.cursor = new Cursor( - this._configuration, - this.model, - this.viewModel - ); - - this._createView(); - - this.listenersToRemove.push(this.cursor.onDidReachMaxCursorCount(() => { - this._notificationService.warn(nls.localize('cursors.maximum', "The number of cursors has been limited to {0}.", Cursor.MAX_CURSOR_COUNT)); - })); - - this.listenersToRemove.push(this.cursor.onDidAttemptReadOnlyEdit(() => { - this._onDidAttemptReadOnlyEdit.fire(void 0); - })); - - this.listenersToRemove.push(this.cursor.onDidChange((e: CursorStateChangedEvent) => { - - let positions: Position[] = []; - for (let i = 0, len = e.selections.length; i < len; i++) { - positions[i] = e.selections[i].getPosition(); - } - - const e1: ICursorPositionChangedEvent = { - position: positions[0], - secondaryPositions: positions.slice(1), - reason: e.reason, - source: e.source - }; - this._onDidChangeCursorPosition.fire(e1); - - const e2: ICursorSelectionChangedEvent = { - selection: e.selections[0], - secondarySelections: e.selections.slice(1), - source: e.source, - reason: e.reason - }; - this._onDidChangeCursorSelection.fire(e2); - })); - - } else { - this.hasView = false; - } - } - - protected abstract _scheduleAtNextAnimationFrame(callback: () => void): IDisposable; - protected abstract _createView(): void; - - protected _postDetachModelCleanup(detachedModel: ITextModel): void { - if (detachedModel) { - detachedModel.removeAllDecorationsWithOwnerId(this.id); - } - } - - protected _detachModel(): ITextModel { - if (this.model) { - this.model.onBeforeDetached(); - } - - this.hasView = false; - - this.listenersToRemove = dispose(this.listenersToRemove); - - if (this.cursor) { - this.cursor.dispose(); - this.cursor = null; - } - - if (this.viewModel) { - this.viewModel.dispose(); - this.viewModel = null; - } - - let result = this.model; - this.model = null; - - this.domElement.removeAttribute('data-mode-id'); - - return result; - } - - protected abstract _registerDecorationType(key: string, options: editorCommon.IDecorationRenderOptions, parentTypeKey?: string): void; - protected abstract _removeDecorationType(key: string): void; - protected abstract _resolveDecorationOptions(typeKey: string, writable: boolean): IModelDecorationOptions; - - /* __GDPR__FRAGMENT__ - "EditorTelemetryData" : {} - */ - public getTelemetryData(): { [key: string]: any; } { - return null; - } -} - -const enum BooleanEventValue { - NotSet, - False, - True -} - -export class BooleanEventEmitter extends Disposable { - private readonly _onDidChangeToTrue: Emitter = this._register(new Emitter()); - public readonly onDidChangeToTrue: Event = this._onDidChangeToTrue.event; - - private readonly _onDidChangeToFalse: Emitter = this._register(new Emitter()); - public readonly onDidChangeToFalse: Event = this._onDidChangeToFalse.event; - - private _value: BooleanEventValue; - - constructor() { - super(); - this._value = BooleanEventValue.NotSet; - } - - public setValue(_value: boolean) { - let value = (_value ? BooleanEventValue.True : BooleanEventValue.False); - if (this._value === value) { - return; - } - this._value = value; - if (this._value === BooleanEventValue.True) { - this._onDidChangeToTrue.fire(); - } else if (this._value === BooleanEventValue.False) { - this._onDidChangeToFalse.fire(); - } - } -} - -class EditorContextKeysManager extends Disposable { - - private _editor: CommonCodeEditor; - private _editorFocus: IContextKey; - private _textInputFocus: IContextKey; - private _editorTextFocus: IContextKey; - private _editorTabMovesFocus: IContextKey; - private _editorReadonly: IContextKey; - private _hasMultipleSelections: IContextKey; - private _hasNonEmptySelection: IContextKey; - - constructor( - editor: CommonCodeEditor, - contextKeyService: IContextKeyService - ) { - super(); - - this._editor = editor; - - contextKeyService.createKey('editorId', editor.getId()); - this._editorFocus = EditorContextKeys.focus.bindTo(contextKeyService); - this._textInputFocus = EditorContextKeys.textInputFocus.bindTo(contextKeyService); - this._editorTextFocus = EditorContextKeys.editorTextFocus.bindTo(contextKeyService); - this._editorTabMovesFocus = EditorContextKeys.tabMovesFocus.bindTo(contextKeyService); - this._editorReadonly = EditorContextKeys.readOnly.bindTo(contextKeyService); - this._hasMultipleSelections = EditorContextKeys.hasMultipleSelections.bindTo(contextKeyService); - this._hasNonEmptySelection = EditorContextKeys.hasNonEmptySelection.bindTo(contextKeyService); - - this._register(this._editor.onDidChangeConfiguration(() => this._updateFromConfig())); - this._register(this._editor.onDidChangeCursorSelection(() => this._updateFromSelection())); - this._register(this._editor.onDidFocusEditor(() => this._updateFromFocus())); - this._register(this._editor.onDidBlurEditor(() => this._updateFromFocus())); - this._register(this._editor.onDidFocusEditorText(() => this._updateFromFocus())); - this._register(this._editor.onDidBlurEditorText(() => this._updateFromFocus())); - - this._updateFromConfig(); - this._updateFromSelection(); - this._updateFromFocus(); - } - - private _updateFromConfig(): void { - let config = this._editor.getConfiguration(); - - this._editorTabMovesFocus.set(config.tabFocusMode); - this._editorReadonly.set(config.readOnly); - } - - private _updateFromSelection(): void { - let selections = this._editor.getSelections(); - if (!selections) { - this._hasMultipleSelections.reset(); - this._hasNonEmptySelection.reset(); - } else { - this._hasMultipleSelections.set(selections.length > 1); - this._hasNonEmptySelection.set(selections.some(s => !s.isEmpty())); - } - } - - private _updateFromFocus(): void { - this._editorFocus.set(this._editor.hasWidgetFocus() && !this._editor.isSimpleWidget); - this._editorTextFocus.set(this._editor.isFocused() && !this._editor.isSimpleWidget); - this._textInputFocus.set(this._editor.isFocused()); - } -} - -export class EditorModeContext extends Disposable { - - private _editor: CommonCodeEditor; - - private _langId: IContextKey; - private _hasCompletionItemProvider: IContextKey; - private _hasCodeActionsProvider: IContextKey; - private _hasCodeLensProvider: IContextKey; - private _hasDefinitionProvider: IContextKey; - private _hasImplementationProvider: IContextKey; - private _hasTypeDefinitionProvider: IContextKey; - private _hasHoverProvider: IContextKey; - private _hasDocumentHighlightProvider: IContextKey; - private _hasDocumentSymbolProvider: IContextKey; - private _hasReferenceProvider: IContextKey; - private _hasRenameProvider: IContextKey; - private _hasDocumentFormattingProvider: IContextKey; - private _hasDocumentSelectionFormattingProvider: IContextKey; - private _hasSignatureHelpProvider: IContextKey; - private _isInWalkThrough: IContextKey; - - constructor( - editor: CommonCodeEditor, - contextKeyService: IContextKeyService - ) { - super(); - this._editor = editor; - - this._langId = EditorContextKeys.languageId.bindTo(contextKeyService); - this._hasCompletionItemProvider = EditorContextKeys.hasCompletionItemProvider.bindTo(contextKeyService); - this._hasCodeActionsProvider = EditorContextKeys.hasCodeActionsProvider.bindTo(contextKeyService); - this._hasCodeLensProvider = EditorContextKeys.hasCodeLensProvider.bindTo(contextKeyService); - this._hasDefinitionProvider = EditorContextKeys.hasDefinitionProvider.bindTo(contextKeyService); - this._hasImplementationProvider = EditorContextKeys.hasImplementationProvider.bindTo(contextKeyService); - this._hasTypeDefinitionProvider = EditorContextKeys.hasTypeDefinitionProvider.bindTo(contextKeyService); - this._hasHoverProvider = EditorContextKeys.hasHoverProvider.bindTo(contextKeyService); - this._hasDocumentHighlightProvider = EditorContextKeys.hasDocumentHighlightProvider.bindTo(contextKeyService); - this._hasDocumentSymbolProvider = EditorContextKeys.hasDocumentSymbolProvider.bindTo(contextKeyService); - this._hasReferenceProvider = EditorContextKeys.hasReferenceProvider.bindTo(contextKeyService); - this._hasRenameProvider = EditorContextKeys.hasRenameProvider.bindTo(contextKeyService); - this._hasDocumentFormattingProvider = EditorContextKeys.hasDocumentFormattingProvider.bindTo(contextKeyService); - this._hasDocumentSelectionFormattingProvider = EditorContextKeys.hasDocumentSelectionFormattingProvider.bindTo(contextKeyService); - this._hasSignatureHelpProvider = EditorContextKeys.hasSignatureHelpProvider.bindTo(contextKeyService); - this._isInWalkThrough = EditorContextKeys.isInEmbeddedEditor.bindTo(contextKeyService); - - const update = () => this._update(); - - // update when model/mode changes - this._register(editor.onDidChangeModel(update)); - this._register(editor.onDidChangeModelLanguage(update)); - - // update when registries change - this._register(modes.SuggestRegistry.onDidChange(update)); - this._register(modes.CodeActionProviderRegistry.onDidChange(update)); - this._register(modes.CodeLensProviderRegistry.onDidChange(update)); - this._register(modes.DefinitionProviderRegistry.onDidChange(update)); - this._register(modes.ImplementationProviderRegistry.onDidChange(update)); - this._register(modes.TypeDefinitionProviderRegistry.onDidChange(update)); - this._register(modes.HoverProviderRegistry.onDidChange(update)); - this._register(modes.DocumentHighlightProviderRegistry.onDidChange(update)); - this._register(modes.DocumentSymbolProviderRegistry.onDidChange(update)); - this._register(modes.ReferenceProviderRegistry.onDidChange(update)); - this._register(modes.RenameProviderRegistry.onDidChange(update)); - this._register(modes.DocumentFormattingEditProviderRegistry.onDidChange(update)); - this._register(modes.DocumentRangeFormattingEditProviderRegistry.onDidChange(update)); - this._register(modes.SignatureHelpProviderRegistry.onDidChange(update)); - - update(); - } - - dispose() { - super.dispose(); - } - - reset() { - this._langId.reset(); - this._hasCompletionItemProvider.reset(); - this._hasCodeActionsProvider.reset(); - this._hasCodeLensProvider.reset(); - this._hasDefinitionProvider.reset(); - this._hasImplementationProvider.reset(); - this._hasTypeDefinitionProvider.reset(); - this._hasHoverProvider.reset(); - this._hasDocumentHighlightProvider.reset(); - this._hasDocumentSymbolProvider.reset(); - this._hasReferenceProvider.reset(); - this._hasRenameProvider.reset(); - this._hasDocumentFormattingProvider.reset(); - this._hasDocumentSelectionFormattingProvider.reset(); - this._hasSignatureHelpProvider.reset(); - this._isInWalkThrough.reset(); - } - - private _update() { - const model = this._editor.getModel(); - if (!model) { - this.reset(); - return; - } - this._langId.set(model.getLanguageIdentifier().language); - this._hasCompletionItemProvider.set(modes.SuggestRegistry.has(model)); - this._hasCodeActionsProvider.set(modes.CodeActionProviderRegistry.has(model)); - this._hasCodeLensProvider.set(modes.CodeLensProviderRegistry.has(model)); - this._hasDefinitionProvider.set(modes.DefinitionProviderRegistry.has(model)); - this._hasImplementationProvider.set(modes.ImplementationProviderRegistry.has(model)); - this._hasTypeDefinitionProvider.set(modes.TypeDefinitionProviderRegistry.has(model)); - this._hasHoverProvider.set(modes.HoverProviderRegistry.has(model)); - this._hasDocumentHighlightProvider.set(modes.DocumentHighlightProviderRegistry.has(model)); - this._hasDocumentSymbolProvider.set(modes.DocumentSymbolProviderRegistry.has(model)); - this._hasReferenceProvider.set(modes.ReferenceProviderRegistry.has(model)); - this._hasRenameProvider.set(modes.RenameProviderRegistry.has(model)); - this._hasSignatureHelpProvider.set(modes.SignatureHelpProviderRegistry.has(model)); - this._hasDocumentFormattingProvider.set(modes.DocumentFormattingEditProviderRegistry.has(model) || modes.DocumentRangeFormattingEditProviderRegistry.has(model)); - this._hasDocumentSelectionFormattingProvider.set(modes.DocumentRangeFormattingEditProviderRegistry.has(model)); - this._isInWalkThrough.set(model.uri.scheme === Schemas.walkThroughSnippet); - } -} diff --git a/src/vs/editor/common/config/commonEditorConfig.ts b/src/vs/editor/common/config/commonEditorConfig.ts index 62af9556a22..a5d84b4f7be 100644 --- a/src/vs/editor/common/config/commonEditorConfig.ts +++ b/src/vs/editor/common/config/commonEditorConfig.ts @@ -90,6 +90,9 @@ export abstract class CommonEditorConfiguration extends Disposable implements ed this._register(TabFocus.onDidChangeTabFocus(_ => this._recomputeOptions())); } + public observeReferenceElement(dimension?: editorCommon.IDimension): void { + } + public dispose(): void { super.dispose(); } diff --git a/src/vs/editor/common/editorCommon.ts b/src/vs/editor/common/editorCommon.ts index 8be479866df..bb9f0a7745f 100644 --- a/src/vs/editor/common/editorCommon.ts +++ b/src/vs/editor/common/editorCommon.ts @@ -150,12 +150,16 @@ export interface ILineChange extends IChange { /** * @internal */ -export interface IConfiguration { +export interface IConfiguration extends IDisposable { onDidChange(listener: (e: editorOptions.IConfigurationChangedEvent) => void): IDisposable; readonly editor: editorOptions.InternalEditorOptions; setMaxLineNumber(maxLineNumber: number): void; + updateOptions(newOptions: editorOptions.IEditorOptions): void; + getRawOptions(): editorOptions.IEditorOptions; + observeReferenceElement(dimension?: IDimension): void; + setIsDominatedByLongLines(isDominatedByLongLines: boolean): void; } // --- view diff --git a/src/vs/editor/test/browser/testCodeEditor.ts b/src/vs/editor/test/browser/testCodeEditor.ts index e3ee7932fea..86dda0c7543 100644 --- a/src/vs/editor/test/browser/testCodeEditor.ts +++ b/src/vs/editor/test/browser/testCodeEditor.ts @@ -8,7 +8,6 @@ import { ServiceCollection } from 'vs/platform/instantiation/common/serviceColle import { InstantiationService } from 'vs/platform/instantiation/common/instantiationService'; import { IContextKeyService, IContextKeyServiceTarget } from 'vs/platform/contextkey/common/contextkey'; import { MockContextKeyService } from 'vs/platform/keybinding/test/common/mockKeybindingService'; -import { CommonEditorConfiguration } from 'vs/editor/common/config/commonEditorConfig'; import { Cursor } from 'vs/editor/common/controller/cursor'; import * as editorCommon from 'vs/editor/common/editorCommon'; import * as editorBrowser from 'vs/editor/browser/editorBrowser'; @@ -37,7 +36,7 @@ export class TestCodeEditor extends CodeEditorWidget implements editorBrowser.IC } //#region testing overrides - protected _createConfiguration(options: editorOptions.IEditorOptions): CommonEditorConfiguration { + protected _createConfiguration(options: editorOptions.IEditorOptions): editorCommon.IConfiguration { return new TestConfiguration(options); } protected _createView(): void { From e95910adc961c0148ce37064158921fd84bb6943 Mon Sep 17 00:00:00 2001 From: Alex Dima Date: Mon, 30 Apr 2018 15:31:49 +0200 Subject: [PATCH 235/830] Eliminate CodeEditor --- src/vs/editor/browser/codeEditor.ts | 39 ------------------- .../editor/browser/widget/codeEditorWidget.ts | 11 ++++-- .../editor/browser/widget/diffEditorWidget.ts | 14 +++---- .../widget/embeddedCodeEditorWidget.ts | 6 +-- .../browser/standaloneCodeEditor.ts | 8 ++-- .../browser/parts/editor/textEditor.ts | 4 +- .../preferences/browser/preferencesEditor.ts | 12 +++--- .../electron-browser/dirtydiffDecorator.ts | 6 +-- .../electron-browser/walkThroughPart.ts | 8 ++-- 9 files changed, 37 insertions(+), 71 deletions(-) delete mode 100644 src/vs/editor/browser/codeEditor.ts diff --git a/src/vs/editor/browser/codeEditor.ts b/src/vs/editor/browser/codeEditor.ts deleted file mode 100644 index 160eac3591e..00000000000 --- a/src/vs/editor/browser/codeEditor.ts +++ /dev/null @@ -1,39 +0,0 @@ -/*--------------------------------------------------------------------------------------------- - * Copyright (c) Microsoft Corporation. All rights reserved. - * Licensed under the MIT License. See License.txt in the project root for license information. - *--------------------------------------------------------------------------------------------*/ -'use strict'; - -import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation'; -import { ICommandService } from 'vs/platform/commands/common/commands'; -import { IContextKeyService } from 'vs/platform/contextkey/common/contextkey'; -import { ICodeEditorService } from 'vs/editor/browser/services/codeEditorService'; -import { CodeEditorWidget } from 'vs/editor/browser/widget/codeEditorWidget'; -import { EditorAction, EditorExtensionsRegistry, IEditorContributionCtor } from 'vs/editor/browser/editorExtensions'; -import { IEditorOptions } from 'vs/editor/common/config/editorOptions'; -import { IThemeService } from 'vs/platform/theme/common/themeService'; -import { INotificationService } from 'vs/platform/notification/common/notification'; - -export class CodeEditor extends CodeEditorWidget { - - constructor( - domElement: HTMLElement, - options: IEditorOptions, - @IInstantiationService instantiationService: IInstantiationService, - @ICodeEditorService codeEditorService: ICodeEditorService, - @ICommandService commandService: ICommandService, - @IContextKeyService contextKeyService: IContextKeyService, - @IThemeService themeService: IThemeService, - @INotificationService notificationService: INotificationService - ) { - super(domElement, options, false, instantiationService, codeEditorService, commandService, contextKeyService, themeService, notificationService); - } - - protected _getContributions(): IEditorContributionCtor[] { - return EditorExtensionsRegistry.getEditorContributions(); - } - - protected _getActions(): EditorAction[] { - return EditorExtensionsRegistry.getEditorActions(); - } -} diff --git a/src/vs/editor/browser/widget/codeEditorWidget.ts b/src/vs/editor/browser/widget/codeEditorWidget.ts index a7492e4662c..e9feea81e13 100644 --- a/src/vs/editor/browser/widget/codeEditorWidget.ts +++ b/src/vs/editor/browser/widget/codeEditorWidget.ts @@ -52,7 +52,7 @@ import { ClassName } from 'vs/editor/common/model/intervalTree'; let EDITOR_ID = 0; -export abstract class CodeEditorWidget extends Disposable implements editorBrowser.ICodeEditor { +export class CodeEditorWidget extends Disposable implements editorBrowser.ICodeEditor { //#region Eventing private readonly _onDidDispose: Emitter = this._register(new Emitter()); @@ -264,8 +264,13 @@ export abstract class CodeEditorWidget extends Disposable implements editorBrows return new Configuration(options, this.domElement); } - protected abstract _getContributions(): IEditorContributionCtor[]; - protected abstract _getActions(): EditorAction[]; + protected _getContributions(): IEditorContributionCtor[] { + return EditorExtensionsRegistry.getEditorContributions(); + } + + protected _getActions(): EditorAction[] { + return EditorExtensionsRegistry.getEditorActions(); + } public getId(): string { return this.getEditorType() + ':' + this.id; diff --git a/src/vs/editor/browser/widget/diffEditorWidget.ts b/src/vs/editor/browser/widget/diffEditorWidget.ts index 14a41c8c4d3..e766e3da62e 100644 --- a/src/vs/editor/browser/widget/diffEditorWidget.ts +++ b/src/vs/editor/browser/widget/diffEditorWidget.ts @@ -22,7 +22,7 @@ import { IEditorWorkerService } from 'vs/editor/common/services/editorWorkerServ import { LineDecoration } from 'vs/editor/common/viewLayout/lineDecorations'; import { renderViewLine, RenderLineInput } from 'vs/editor/common/viewLayout/viewLineRenderer'; import * as editorBrowser from 'vs/editor/browser/editorBrowser'; -import { CodeEditor } from 'vs/editor/browser/codeEditor'; +import { CodeEditorWidget } from 'vs/editor/browser/widget/codeEditorWidget'; import { Configuration } from 'vs/editor/browser/config/configuration'; import { Position, IPosition } from 'vs/editor/common/core/position'; import { Selection, ISelection } from 'vs/editor/common/core/selection'; @@ -85,7 +85,7 @@ class VisualEditorState { return allViewZones.filter((z) => !this._zonesMap[String(z.id)]); } - public clean(editor: CodeEditor): void { + public clean(editor: CodeEditorWidget): void { // (1) View zones if (this._zones.length > 0) { editor.changeViewZones((viewChangeAccessor: editorBrowser.IViewZoneChangeAccessor) => { @@ -101,7 +101,7 @@ class VisualEditorState { this._decorations = editor.deltaDecorations(this._decorations, []); } - public apply(editor: CodeEditor, overviewRuler: editorBrowser.IOverviewRuler, newDecorations: IEditorDiffDecorationsWithZones, restoreScrollState: boolean): void { + public apply(editor: CodeEditorWidget, overviewRuler: editorBrowser.IOverviewRuler, newDecorations: IEditorDiffDecorationsWithZones, restoreScrollState: boolean): void { const scrollState = restoreScrollState ? StableEditorScrollState.capture(editor) : null; @@ -160,12 +160,12 @@ export class DiffEditorWidget extends Disposable implements editorBrowser.IDiffE private _reviewHeight: number; private readonly _measureDomElementToken: number; - private originalEditor: CodeEditor; + private originalEditor: CodeEditorWidget; private _originalDomNode: HTMLElement; private _originalEditorState: VisualEditorState; private _originalOverviewRuler: editorBrowser.IOverviewRuler; - private modifiedEditor: CodeEditor; + private modifiedEditor: CodeEditorWidget; private _modifiedDomNode: HTMLElement; private _modifiedEditorState: VisualEditorState; private _modifiedOverviewRuler: editorBrowser.IOverviewRuler; @@ -468,8 +468,8 @@ export class DiffEditorWidget extends Disposable implements editorBrowser.IDiffE })); } - protected _createInnerEditor(instantiationService: IInstantiationService, container: HTMLElement, options: editorOptions.IEditorOptions): CodeEditor { - return instantiationService.createInstance(CodeEditor, container, options); + protected _createInnerEditor(instantiationService: IInstantiationService, container: HTMLElement, options: editorOptions.IEditorOptions): CodeEditorWidget { + return instantiationService.createInstance(CodeEditorWidget, container, options, false); } public dispose(): void { diff --git a/src/vs/editor/browser/widget/embeddedCodeEditorWidget.ts b/src/vs/editor/browser/widget/embeddedCodeEditorWidget.ts index b24d4a9b62d..d459bb2087e 100644 --- a/src/vs/editor/browser/widget/embeddedCodeEditorWidget.ts +++ b/src/vs/editor/browser/widget/embeddedCodeEditorWidget.ts @@ -10,14 +10,14 @@ import { ICommandService } from 'vs/platform/commands/common/commands'; import { IContextKeyService } from 'vs/platform/contextkey/common/contextkey'; import { ICodeEditorService } from 'vs/editor/browser/services/codeEditorService'; import { ICodeEditor } from 'vs/editor/browser/editorBrowser'; -import { CodeEditor } from 'vs/editor/browser/codeEditor'; +import { CodeEditorWidget } from 'vs/editor/browser/widget/codeEditorWidget'; import { IConfigurationChangedEvent, IEditorOptions, IDiffEditorOptions } from 'vs/editor/common/config/editorOptions'; import { IThemeService } from 'vs/platform/theme/common/themeService'; import { DiffEditorWidget } from 'vs/editor/browser/widget/diffEditorWidget'; import { IEditorWorkerService } from 'vs/editor/common/services/editorWorkerService'; import { INotificationService } from 'vs/platform/notification/common/notification'; -export class EmbeddedCodeEditorWidget extends CodeEditor { +export class EmbeddedCodeEditorWidget extends CodeEditorWidget { private _parentEditor: ICodeEditor; private _overwriteOptions: IEditorOptions; @@ -33,7 +33,7 @@ export class EmbeddedCodeEditorWidget extends CodeEditor { @IThemeService themeService: IThemeService, @INotificationService notificationService: INotificationService ) { - super(domElement, parentEditor.getRawConfiguration(), instantiationService, codeEditorService, commandService, contextKeyService, themeService, notificationService); + super(domElement, parentEditor.getRawConfiguration(), false, instantiationService, codeEditorService, commandService, contextKeyService, themeService, notificationService); this._parentEditor = parentEditor; this._overwriteOptions = options; diff --git a/src/vs/editor/standalone/browser/standaloneCodeEditor.ts b/src/vs/editor/standalone/browser/standaloneCodeEditor.ts index 46b15a7bf8f..dd0969f9f16 100644 --- a/src/vs/editor/standalone/browser/standaloneCodeEditor.ts +++ b/src/vs/editor/standalone/browser/standaloneCodeEditor.ts @@ -18,7 +18,7 @@ import { ICodeEditorService } from 'vs/editor/browser/services/codeEditorService import { IEditorWorkerService } from 'vs/editor/common/services/editorWorkerService'; import { StandaloneKeybindingService, applyConfigurationValues } from 'vs/editor/standalone/browser/simpleServices'; import { IEditorContextViewService } from 'vs/editor/standalone/browser/standaloneServices'; -import { CodeEditor } from 'vs/editor/browser/codeEditor'; +import { CodeEditorWidget } from 'vs/editor/browser/widget/codeEditorWidget'; import { DiffEditorWidget } from 'vs/editor/browser/widget/diffEditorWidget'; import { ICodeEditor, IDiffEditor } from 'vs/editor/browser/editorBrowser'; import { IStandaloneThemeService } from 'vs/editor/standalone/common/standaloneThemeService'; @@ -153,7 +153,7 @@ function createAriaDomNode() { /** * A code editor to be used both by the standalone editor and the standalone diff editor. */ -export class StandaloneCodeEditor extends CodeEditor implements IStandaloneCodeEditor { +export class StandaloneCodeEditor extends CodeEditorWidget implements IStandaloneCodeEditor { private _standaloneKeybindingService: StandaloneKeybindingService; @@ -175,7 +175,7 @@ export class StandaloneCodeEditor extends CodeEditor implements IStandaloneCodeE ? nls.localize('accessibilityHelpMessageIE', "Press Ctrl+F1 for Accessibility Options.") : nls.localize('accessibilityHelpMessage', "Press Alt+F1 for Accessibility Options.") ); - super(domElement, options, instantiationService, codeEditorService, commandService, contextKeyService, themeService, notificationService); + super(domElement, options, false, instantiationService, codeEditorService, commandService, contextKeyService, themeService, notificationService); if (keybindingService instanceof StandaloneKeybindingService) { this._standaloneKeybindingService = keybindingService; @@ -401,7 +401,7 @@ export class StandaloneDiffEditor extends DiffEditorWidget implements IStandalon super.updateOptions(newOptions); } - protected _createInnerEditor(instantiationService: IInstantiationService, container: HTMLElement, options: IEditorOptions): CodeEditor { + protected _createInnerEditor(instantiationService: IInstantiationService, container: HTMLElement, options: IEditorOptions): CodeEditorWidget { return instantiationService.createInstance(StandaloneCodeEditor, container, options); } diff --git a/src/vs/workbench/browser/parts/editor/textEditor.ts b/src/vs/workbench/browser/parts/editor/textEditor.ts index f8342b510f5..0c0c2f2fa1d 100644 --- a/src/vs/workbench/browser/parts/editor/textEditor.ts +++ b/src/vs/workbench/browser/parts/editor/textEditor.ts @@ -12,7 +12,7 @@ import * as objects from 'vs/base/common/objects'; import * as types from 'vs/base/common/types'; import * as errors from 'vs/base/common/errors'; import * as DOM from 'vs/base/browser/dom'; -import { CodeEditor } from 'vs/editor/browser/codeEditor'; +import { CodeEditorWidget } from 'vs/editor/browser/widget/codeEditorWidget'; import { EditorInput, EditorOptions, EditorViewStateMemento } from 'vs/workbench/common/editor'; import { BaseEditor } from 'vs/workbench/browser/parts/editor/baseEditor'; import { IEditorViewState, IEditor } from 'vs/editor/common/editorCommon'; @@ -182,7 +182,7 @@ export abstract class BaseTextEditor extends BaseEditor { protected createEditorControl(parent: HTMLElement, configuration: IEditorOptions): IEditor { // Use a getter for the instantiation service since some subclasses might use scoped instantiation services - return this.instantiationService.createInstance(CodeEditor, parent, configuration); + return this.instantiationService.createInstance(CodeEditorWidget, parent, configuration, false); } public setInput(input: EditorInput, options?: EditorOptions): TPromise { diff --git a/src/vs/workbench/parts/preferences/browser/preferencesEditor.ts b/src/vs/workbench/parts/preferences/browser/preferencesEditor.ts index 7e9a04f3ab4..d3247d4fdc5 100644 --- a/src/vs/workbench/parts/preferences/browser/preferencesEditor.ts +++ b/src/vs/workbench/parts/preferences/browser/preferencesEditor.ts @@ -20,7 +20,7 @@ import { ResourceEditorModel } from 'vs/workbench/common/editor/resourceEditorMo import { IEditorControl, Position } from 'vs/platform/editor/common/editor'; import * as editorCommon from 'vs/editor/common/editorCommon'; import { BaseTextEditor } from 'vs/workbench/browser/parts/editor/textEditor'; -import { CodeEditor } from 'vs/editor/browser/codeEditor'; +import { CodeEditorWidget } from 'vs/editor/browser/widget/codeEditorWidget'; import { IInstantiationService, ServicesAccessor } from 'vs/platform/instantiation/common/instantiation'; import { IPreferencesSearchService, @@ -782,7 +782,7 @@ class SideBySidePreferencesWidget extends Widget { this.defaultPreferencesEditor = this._register(this.instantiationService.createInstance(DefaultPreferencesEditor)); this.defaultPreferencesEditor.create(this.defaultPreferencesEditorContainer); this.defaultPreferencesEditor.setVisible(true); - (this.defaultPreferencesEditor.getControl()).onDidFocusEditor(() => this.lastFocusedEditor = this.defaultPreferencesEditor); + (this.defaultPreferencesEditor.getControl()).onDidFocusEditor(() => this.lastFocusedEditor = this.defaultPreferencesEditor); this.editablePreferencesEditorContainer = DOM.append(parentElement, DOM.$('.editable-preferences-editor-container')); this.editablePreferencesEditorContainer.style.position = 'absolute'; @@ -879,7 +879,7 @@ class SideBySidePreferencesWidget extends Widget { this.editablePreferencesEditor = editor; this.editablePreferencesEditor.create(this.editablePreferencesEditorContainer); this.editablePreferencesEditor.setVisible(true); - (this.editablePreferencesEditor.getControl()).onDidFocusEditor(() => this.lastFocusedEditor = this.editablePreferencesEditor); + (this.editablePreferencesEditor.getControl()).onDidFocusEditor(() => this.lastFocusedEditor = this.editablePreferencesEditor); this.lastFocusedEditor = this.editablePreferencesEditor; return editor; @@ -887,7 +887,7 @@ class SideBySidePreferencesWidget extends Widget { private updateInput(editor: BaseEditor, input: EditorInput, editorContributionId: string, associatedPreferencesModelUri: URI, options: EditorOptions): TPromise> { return editor.setInput(input, options) - .then(() => (editor.getControl()).getContribution(editorContributionId).updatePreferencesRenderer(associatedPreferencesModelUri)); + .then(() => (editor.getControl()).getContribution(editorContributionId).updatePreferencesRenderer(associatedPreferencesModelUri)); } private createSash(parentElement: HTMLElement): void { @@ -966,7 +966,7 @@ export class DefaultPreferencesEditor extends BaseTextEditor { } public createEditorControl(parent: HTMLElement, configuration: IEditorOptions): editorCommon.IEditor { - const editor = this.instantiationService.createInstance(DefaultPreferencesCodeEditor, parent, configuration); + const editor = this.instantiationService.createInstance(DefaultPreferencesCodeEditor, parent, configuration, false); // Inform user about editor being readonly if user starts type this.toUnbind.push(editor.onDidType(() => this.showReadonlyHint(editor))); @@ -1030,7 +1030,7 @@ export class DefaultPreferencesEditor extends BaseTextEditor { } } -class DefaultPreferencesCodeEditor extends CodeEditor { +class DefaultPreferencesCodeEditor extends CodeEditorWidget { protected _getContributions(): IEditorContributionCtor[] { let contributions = super._getContributions(); diff --git a/src/vs/workbench/parts/scm/electron-browser/dirtydiffDecorator.ts b/src/vs/workbench/parts/scm/electron-browser/dirtydiffDecorator.ts index 1a1374cd6c1..5f140409ece 100644 --- a/src/vs/workbench/parts/scm/electron-browser/dirtydiffDecorator.ts +++ b/src/vs/workbench/parts/scm/electron-browser/dirtydiffDecorator.ts @@ -13,7 +13,7 @@ import { IDisposable, dispose, toDisposable, empty as EmptyDisposable, combinedD import { TPromise } from 'vs/base/common/winjs.base'; import { Event, Emitter, anyEvent as anyEvent, filterEvent, once } from 'vs/base/common/event'; import * as ext from 'vs/workbench/common/contributions'; -import { CodeEditor } from 'vs/editor/browser/codeEditor'; +import { CodeEditorWidget } from 'vs/editor/browser/widget/codeEditorWidget'; import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation'; import { ITextModelService } from 'vs/editor/common/services/resolverService'; import { IWorkbenchEditorService } from 'vs/workbench/services/editor/common/editorService'; @@ -1190,11 +1190,11 @@ export class DirtyDiffWorkbenchController implements ext.IWorkbenchContribution, .map(e => e.getControl()) // only interested in code editor widgets - .filter(c => c instanceof CodeEditor) + .filter(c => c instanceof CodeEditorWidget) // set model registry and map to models .map(editor => { - const codeEditor = editor as CodeEditor; + const codeEditor = editor as CodeEditorWidget; const controller = DirtyDiffController.get(codeEditor); controller.modelRegistry = this; return codeEditor.getModel(); diff --git a/src/vs/workbench/parts/welcome/walkThrough/electron-browser/walkThroughPart.ts b/src/vs/workbench/parts/welcome/walkThrough/electron-browser/walkThroughPart.ts index 8198c3ea31c..3f4b727db77 100644 --- a/src/vs/workbench/parts/welcome/walkThrough/electron-browser/walkThroughPart.ts +++ b/src/vs/workbench/parts/welcome/walkThrough/electron-browser/walkThroughPart.ts @@ -19,7 +19,7 @@ import { WalkThroughInput } from 'vs/workbench/parts/welcome/walkThrough/node/wa import { IOpenerService } from 'vs/platform/opener/common/opener'; import { marked } from 'vs/base/common/marked/marked'; import { IModelService } from 'vs/editor/common/services/modelService'; -import { CodeEditor } from 'vs/editor/browser/codeEditor'; +import { CodeEditorWidget } from 'vs/editor/browser/widget/codeEditorWidget'; import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation'; import { IKeybindingService } from 'vs/platform/keybinding/common/keybinding'; import { localize } from 'vs/nls'; @@ -55,7 +55,7 @@ interface IWalkThroughEditorViewState { viewState: IViewState; } -class WalkThroughCodeEditor extends CodeEditor { +class WalkThroughCodeEditor extends CodeEditorWidget { constructor( domElement: HTMLElement, @@ -68,7 +68,7 @@ class WalkThroughCodeEditor extends CodeEditor { @IThemeService themeService: IThemeService, @INotificationService notificationService: INotificationService, ) { - super(domElement, options, instantiationService, codeEditorService, commandService, contextKeyService, themeService, notificationService); + super(domElement, options, false, instantiationService, codeEditorService, commandService, contextKeyService, themeService, notificationService); } getTelemetryData() { @@ -214,7 +214,7 @@ export class WalkThroughPart extends BaseEditor { size(this.content, dimension.width, dimension.height); this.updateSizeClasses(); this.contentDisposables.forEach(disposable => { - if (disposable instanceof CodeEditor) { + if (disposable instanceof CodeEditorWidget) { disposable.layout(); } }); From deb2f763521ff5ee8693286bc0c7c5134e08b23a Mon Sep 17 00:00:00 2001 From: Alex Dima Date: Mon, 30 Apr 2018 16:04:37 +0200 Subject: [PATCH 236/830] Introduce and adopt ICodeEditorWidgetOptions --- .../editor/browser/widget/codeEditorWidget.ts | 45 +++++++++++------ .../editor/browser/widget/diffEditorWidget.ts | 2 +- .../widget/embeddedCodeEditorWidget.ts | 2 +- .../browser/standaloneCodeEditor.ts | 2 +- src/vs/editor/test/browser/testCodeEditor.ts | 24 +++++----- .../browser/parts/editor/textEditor.ts | 2 +- .../electron-browser/breakpointWidget.ts | 6 ++- .../parts/debug/electron-browser/repl.ts | 5 +- .../electron-browser/simpleDebugEditor.ts | 48 ++++++------------- .../preferences/browser/preferencesEditor.ts | 23 ++++----- .../electron-browser/walkThroughPart.ts | 28 ++--------- 11 files changed, 81 insertions(+), 106 deletions(-) diff --git a/src/vs/editor/browser/widget/codeEditorWidget.ts b/src/vs/editor/browser/widget/codeEditorWidget.ts index e9feea81e13..82b66dc7bf6 100644 --- a/src/vs/editor/browser/widget/codeEditorWidget.ts +++ b/src/vs/editor/browser/widget/codeEditorWidget.ts @@ -41,7 +41,7 @@ import { ICodeEditorService } from 'vs/editor/browser/services/codeEditorService import { ICommandService } from 'vs/platform/commands/common/commands'; import { IThemeService, registerThemingParticipant } from 'vs/platform/theme/common/themeService'; import { IContentWidgetData, IOverlayWidgetData, View } from 'vs/editor/browser/view/viewImpl'; -import { IEditorContributionCtor, EditorAction, EditorExtensionsRegistry } from 'vs/editor/browser/editorExtensions'; +import { IEditorContributionCtor, EditorExtensionsRegistry } from 'vs/editor/browser/editorExtensions'; import { IMouseEvent } from 'vs/base/browser/mouseEvent'; import { InternalEditorAction } from 'vs/editor/common/editorAction'; import { ICommandDelegate } from 'vs/editor/browser/view/viewController'; @@ -52,6 +52,26 @@ import { ClassName } from 'vs/editor/common/model/intervalTree'; let EDITOR_ID = 0; +export interface ICodeEditorWidgetOptions { + /** + * Is this a simple widget (not a real code editor) ? + * Defaults to false. + */ + isSimpleWidget?: boolean; + + /** + * Contributions to instantiate. + * Defaults to EditorExtensionsRegistry.getEditorContributions(). + */ + contributions?: IEditorContributionCtor[]; + + /** + * Telemetry data associated with this CodeEditorWidget. + * Defaults to null. + */ + telemetryData?: object; +} + export class CodeEditorWidget extends Disposable implements editorBrowser.ICodeEditor { //#region Eventing @@ -143,6 +163,7 @@ export class CodeEditorWidget extends Disposable implements editorBrowser.ICodeE //#endregion public readonly isSimpleWidget: boolean; + private readonly _telemetryData: object; private readonly domElement: HTMLElement; private readonly id: number; @@ -182,7 +203,7 @@ export class CodeEditorWidget extends Disposable implements editorBrowser.ICodeE constructor( domElement: HTMLElement, options: editorOptions.IEditorOptions, - isSimpleWidget: boolean, + codeEditorWidgetOptions: ICodeEditorWidgetOptions, @IInstantiationService instantiationService: IInstantiationService, @ICodeEditorService codeEditorService: ICodeEditorService, @ICommandService commandService: ICommandService, @@ -195,7 +216,8 @@ export class CodeEditorWidget extends Disposable implements editorBrowser.ICodeE this.id = (++EDITOR_ID); this._decorationTypeKeysToIds = {}; this._decorationTypeSubtypes = {}; - this.isSimpleWidget = isSimpleWidget; + this.isSimpleWidget = codeEditorWidgetOptions.isSimpleWidget || false; + this._telemetryData = codeEditorWidgetOptions.telemetryData || null; options = options || {}; this._configuration = this._register(this._createConfiguration(options)); @@ -230,7 +252,10 @@ export class CodeEditorWidget extends Disposable implements editorBrowser.ICodeE this.contentWidgets = {}; this.overlayWidgets = {}; - let contributions = this._getContributions(); + let contributions: IEditorContributionCtor[] = codeEditorWidgetOptions.contributions; + if (!Array.isArray(contributions)) { + contributions = EditorExtensionsRegistry.getEditorContributions(); + } for (let i = 0, len = contributions.length; i < len; i++) { let ctor = contributions[i]; try { @@ -241,7 +266,7 @@ export class CodeEditorWidget extends Disposable implements editorBrowser.ICodeE } } - this._getActions().forEach((action) => { + EditorExtensionsRegistry.getEditorActions().forEach((action) => { const internalAction = new InternalEditorAction( action.id, action.label, @@ -264,14 +289,6 @@ export class CodeEditorWidget extends Disposable implements editorBrowser.ICodeE return new Configuration(options, this.domElement); } - protected _getContributions(): IEditorContributionCtor[] { - return EditorExtensionsRegistry.getEditorContributions(); - } - - protected _getActions(): EditorAction[] { - return EditorExtensionsRegistry.getEditorActions(); - } - public getId(): string { return this.getEditorType() + ':' + this.id; } @@ -1478,7 +1495,7 @@ export class CodeEditorWidget extends Disposable implements editorBrowser.ICodeE "EditorTelemetryData" : {} */ public getTelemetryData(): { [key: string]: any; } { - return null; + return this._telemetryData; } } diff --git a/src/vs/editor/browser/widget/diffEditorWidget.ts b/src/vs/editor/browser/widget/diffEditorWidget.ts index e766e3da62e..12212dd75c2 100644 --- a/src/vs/editor/browser/widget/diffEditorWidget.ts +++ b/src/vs/editor/browser/widget/diffEditorWidget.ts @@ -469,7 +469,7 @@ export class DiffEditorWidget extends Disposable implements editorBrowser.IDiffE } protected _createInnerEditor(instantiationService: IInstantiationService, container: HTMLElement, options: editorOptions.IEditorOptions): CodeEditorWidget { - return instantiationService.createInstance(CodeEditorWidget, container, options, false); + return instantiationService.createInstance(CodeEditorWidget, container, options, {}); } public dispose(): void { diff --git a/src/vs/editor/browser/widget/embeddedCodeEditorWidget.ts b/src/vs/editor/browser/widget/embeddedCodeEditorWidget.ts index d459bb2087e..9f5b473d29b 100644 --- a/src/vs/editor/browser/widget/embeddedCodeEditorWidget.ts +++ b/src/vs/editor/browser/widget/embeddedCodeEditorWidget.ts @@ -33,7 +33,7 @@ export class EmbeddedCodeEditorWidget extends CodeEditorWidget { @IThemeService themeService: IThemeService, @INotificationService notificationService: INotificationService ) { - super(domElement, parentEditor.getRawConfiguration(), false, instantiationService, codeEditorService, commandService, contextKeyService, themeService, notificationService); + super(domElement, parentEditor.getRawConfiguration(), {}, instantiationService, codeEditorService, commandService, contextKeyService, themeService, notificationService); this._parentEditor = parentEditor; this._overwriteOptions = options; diff --git a/src/vs/editor/standalone/browser/standaloneCodeEditor.ts b/src/vs/editor/standalone/browser/standaloneCodeEditor.ts index dd0969f9f16..22b23704de2 100644 --- a/src/vs/editor/standalone/browser/standaloneCodeEditor.ts +++ b/src/vs/editor/standalone/browser/standaloneCodeEditor.ts @@ -175,7 +175,7 @@ export class StandaloneCodeEditor extends CodeEditorWidget implements IStandalon ? nls.localize('accessibilityHelpMessageIE', "Press Ctrl+F1 for Accessibility Options.") : nls.localize('accessibilityHelpMessage', "Press Alt+F1 for Accessibility Options.") ); - super(domElement, options, false, instantiationService, codeEditorService, commandService, contextKeyService, themeService, notificationService); + super(domElement, options, {}, instantiationService, codeEditorService, commandService, contextKeyService, themeService, notificationService); if (keybindingService instanceof StandaloneKeybindingService) { this._standaloneKeybindingService = keybindingService; diff --git a/src/vs/editor/test/browser/testCodeEditor.ts b/src/vs/editor/test/browser/testCodeEditor.ts index 86dda0c7543..79ae7e5d017 100644 --- a/src/vs/editor/test/browser/testCodeEditor.ts +++ b/src/vs/editor/test/browser/testCodeEditor.ts @@ -14,12 +14,11 @@ import * as editorBrowser from 'vs/editor/browser/editorBrowser'; import { TextModel } from 'vs/editor/common/model/textModel'; import { TestConfiguration } from 'vs/editor/test/common/mocks/testConfiguration'; import * as editorOptions from 'vs/editor/common/config/editorOptions'; -import { EditorAction } from 'vs/editor/browser/editorExtensions'; import { ITextModel } from 'vs/editor/common/model'; import { TestNotificationService } from 'vs/platform/notification/test/common/testNotificationService'; import { INotificationService } from 'vs/platform/notification/common/notification'; -import { CodeEditorWidget } from 'vs/editor/browser/widget/codeEditorWidget'; -import { IConstructorSignature1 } from 'vs/platform/instantiation/common/instantiation'; +import { CodeEditorWidget, ICodeEditorWidgetOptions, } from 'vs/editor/browser/widget/codeEditorWidget'; +import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation'; import { TestCodeEditorService, TestCommandService } from 'vs/editor/test/browser/editorTestServices'; import { ICodeEditorService } from 'vs/editor/browser/services/codeEditorService'; import { ICommandService } from 'vs/platform/commands/common/commands'; @@ -28,13 +27,6 @@ import { IThemeService } from 'vs/platform/theme/common/themeService'; export class TestCodeEditor extends CodeEditorWidget implements editorBrowser.ICodeEditor { - protected _getContributions(): IConstructorSignature1[] { - return []; - } - protected _getActions(): EditorAction[] { - return []; - } - //#region testing overrides protected _createConfiguration(options: editorOptions.IEditorOptions): editorCommon.IConfiguration { return new TestConfiguration(options); @@ -95,7 +87,7 @@ export function withTestCodeEditor(text: string[], options: TestCodeEditorCreati export function createTestCodeEditor(options: TestCodeEditorCreationOptions): TestCodeEditor { const services: ServiceCollection = options.serviceCollection || new ServiceCollection(); - const instantiationService = new InstantiationService(services); + const instantiationService: IInstantiationService = new InstantiationService(services); if (!services.has(ICodeEditorService)) { services.set(ICodeEditorService, new TestCodeEditorService()); @@ -113,7 +105,15 @@ export function createTestCodeEditor(options: TestCodeEditorCreationOptions): Te services.set(IThemeService, new TestThemeService()); } - const editor = instantiationService.createInstance(TestCodeEditor, new TestEditorDomElement(), options, false); + const codeEditorWidgetOptions: ICodeEditorWidgetOptions = { + contributions: [] + }; + const editor = instantiationService.createInstance( + TestCodeEditor, + new TestEditorDomElement(), + options, + codeEditorWidgetOptions + ); editor.setModel(options.model); return editor; } diff --git a/src/vs/workbench/browser/parts/editor/textEditor.ts b/src/vs/workbench/browser/parts/editor/textEditor.ts index 0c0c2f2fa1d..5e78e047499 100644 --- a/src/vs/workbench/browser/parts/editor/textEditor.ts +++ b/src/vs/workbench/browser/parts/editor/textEditor.ts @@ -182,7 +182,7 @@ export abstract class BaseTextEditor extends BaseEditor { protected createEditorControl(parent: HTMLElement, configuration: IEditorOptions): IEditor { // Use a getter for the instantiation service since some subclasses might use scoped instantiation services - return this.instantiationService.createInstance(CodeEditorWidget, parent, configuration, false); + return this.instantiationService.createInstance(CodeEditorWidget, parent, configuration, {}); } public setInput(input: EditorInput, options?: EditorOptions): TPromise { diff --git a/src/vs/workbench/parts/debug/electron-browser/breakpointWidget.ts b/src/vs/workbench/parts/debug/electron-browser/breakpointWidget.ts index 7104aa7254f..99a710bbbd4 100644 --- a/src/vs/workbench/parts/debug/electron-browser/breakpointWidget.ts +++ b/src/vs/workbench/parts/debug/electron-browser/breakpointWidget.ts @@ -34,6 +34,7 @@ import { ICodeEditorService } from 'vs/editor/browser/services/codeEditorService import { transparent, editorForeground } from 'vs/platform/theme/common/colorRegistry'; import { ServiceCollection } from 'vs/platform/instantiation/common/serviceCollection'; import { IDecorationOptions } from 'vs/editor/common/editorCommon'; +import { CodeEditorWidget } from 'vs/editor/browser/widget/codeEditorWidget'; const $ = dom.$; const IPrivateBreakopintWidgetService = createDecorator('privateBreakopintWidgetService'); @@ -47,7 +48,7 @@ export class BreakpointWidget extends ZoneWidget implements IPrivateBreakopintWi public _serviceBrand: any; private selectContainer: HTMLElement; - private input: SimpleDebugEditor; + private input: CodeEditorWidget; private toDispose: lifecycle.IDisposable[]; private conditionInput = ''; private hitCountInput = ''; @@ -202,7 +203,8 @@ export class BreakpointWidget extends ZoneWidget implements IPrivateBreakopintWi [IContextKeyService, scopedContextKeyService], [IPrivateBreakopintWidgetService, this])); const options = SimpleDebugEditor.getEditorOptions(); - this.input = scopedInstatiationService.createInstance(SimpleDebugEditor, container, options); + const codeEditorWidgetOptions = SimpleDebugEditor.getCodeEditorWidgetOptions(); + this.input = scopedInstatiationService.createInstance(CodeEditorWidget, container, options, codeEditorWidgetOptions); CONTEXT_IN_BREAKPOINT_WIDGET.bindTo(scopedContextKeyService).set(true); const model = this.modelService.createModel('', null, uri.parse(`${DEBUG_SCHEME}:breakpointinput`), true); this.input.setModel(model); diff --git a/src/vs/workbench/parts/debug/electron-browser/repl.ts b/src/vs/workbench/parts/debug/electron-browser/repl.ts index f11e1016db6..0a30add4f14 100644 --- a/src/vs/workbench/parts/debug/electron-browser/repl.ts +++ b/src/vs/workbench/parts/debug/electron-browser/repl.ts @@ -43,6 +43,7 @@ import { memoize } from 'vs/base/common/decorators'; import { dispose } from 'vs/base/common/lifecycle'; import { OpenMode, ClickBehavior } from 'vs/base/parts/tree/browser/treeDefaults'; import { EditorContextKeys } from 'vs/editor/common/editorContextKeys'; +import { CodeEditorWidget } from 'vs/editor/browser/widget/codeEditorWidget'; const $ = dom.$; @@ -75,7 +76,7 @@ export class Repl extends Panel implements IPrivateReplService { private renderer: ReplExpressionsRenderer; private container: HTMLElement; private treeContainer: HTMLElement; - private replInput: SimpleDebugEditor; + private replInput: CodeEditorWidget; private replInputContainer: HTMLElement; private refreshTimeoutHandle: number; private actions: IAction[]; @@ -174,7 +175,7 @@ export class Repl extends Panel implements IPrivateReplService { const scopedInstantiationService = this.instantiationService.createChild(new ServiceCollection( [IContextKeyService, scopedContextKeyService], [IPrivateReplService, this])); - this.replInput = scopedInstantiationService.createInstance(SimpleDebugEditor, this.replInputContainer, SimpleDebugEditor.getEditorOptions()); + this.replInput = scopedInstantiationService.createInstance(CodeEditorWidget, this.replInputContainer, SimpleDebugEditor.getEditorOptions(), SimpleDebugEditor.getCodeEditorWidgetOptions()); modes.SuggestRegistry.register({ scheme: debug.DEBUG_SCHEME, hasAccessToAllModels: true }, { triggerCharacters: ['.'], diff --git a/src/vs/workbench/parts/debug/electron-browser/simpleDebugEditor.ts b/src/vs/workbench/parts/debug/electron-browser/simpleDebugEditor.ts index fd1e6e04bf5..720b75f1cad 100644 --- a/src/vs/workbench/parts/debug/electron-browser/simpleDebugEditor.ts +++ b/src/vs/workbench/parts/debug/electron-browser/simpleDebugEditor.ts @@ -4,12 +4,7 @@ *--------------------------------------------------------------------------------------------*/ import { IEditorOptions } from 'vs/editor/common/config/editorOptions'; -import { EditorAction, EditorExtensionsRegistry, IEditorContributionCtor } from 'vs/editor/browser/editorExtensions'; -import { ICodeEditorService } from 'vs/editor/browser/services/codeEditorService'; -import { CodeEditorWidget } from 'vs/editor/browser/widget/codeEditorWidget'; -import { IContextKeyService } from 'vs/platform/contextkey/common/contextkey'; -import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation'; -import { ICommandService } from 'vs/platform/commands/common/commands'; +import { ICodeEditorWidgetOptions } from 'vs/editor/browser/widget/codeEditorWidget'; // Allowed Editor Contributions: import { MenuPreventer } from 'vs/workbench/parts/codeEditor/electron-browser/menuPreventer'; @@ -18,36 +13,21 @@ import { ContextMenuController } from 'vs/editor/contrib/contextmenu/contextmenu import { SuggestController } from 'vs/editor/contrib/suggest/suggestController'; import { SnippetController2 } from 'vs/editor/contrib/snippet/snippetController2'; import { TabCompletionController } from 'vs/workbench/parts/snippets/electron-browser/tabCompletion'; -import { IThemeService } from 'vs/platform/theme/common/themeService'; -import { INotificationService } from 'vs/platform/notification/common/notification'; -export class SimpleDebugEditor extends CodeEditorWidget { - constructor( - domElement: HTMLElement, - options: IEditorOptions, - @IInstantiationService instantiationService: IInstantiationService, - @ICodeEditorService codeEditorService: ICodeEditorService, - @ICommandService commandService: ICommandService, - @IContextKeyService contextKeyService: IContextKeyService, - @IThemeService themeService: IThemeService, - @INotificationService notificationService: INotificationService, - ) { - super(domElement, options, true, instantiationService, codeEditorService, commandService, contextKeyService, themeService, notificationService); - } +export class SimpleDebugEditor { - protected _getContributions(): IEditorContributionCtor[] { - return [ - MenuPreventer, - SelectionClipboard, - ContextMenuController, - SuggestController, - SnippetController2, - TabCompletionController, - ]; - } - - protected _getActions(): EditorAction[] { - return EditorExtensionsRegistry.getEditorActions(); + public static getCodeEditorWidgetOptions(): ICodeEditorWidgetOptions { + return { + isSimpleWidget: true, + contributions: [ + MenuPreventer, + SelectionClipboard, + ContextMenuController, + SuggestController, + SnippetController2, + TabCompletionController, + ] + }; } public static getEditorOptions(): IEditorOptions { diff --git a/src/vs/workbench/parts/preferences/browser/preferencesEditor.ts b/src/vs/workbench/parts/preferences/browser/preferencesEditor.ts index d3247d4fdc5..70fd701d488 100644 --- a/src/vs/workbench/parts/preferences/browser/preferencesEditor.ts +++ b/src/vs/workbench/parts/preferences/browser/preferencesEditor.ts @@ -33,7 +33,7 @@ import { SettingsEditorModel, DefaultSettingsEditorModel } from 'vs/workbench/se import { ICodeEditor } from 'vs/editor/browser/editorBrowser'; import { SearchWidget, SettingsTargetsWidget, SettingsTarget } from 'vs/workbench/parts/preferences/browser/preferencesWidgets'; import { ContextKeyExpr, IContextKeyService, IContextKey } from 'vs/platform/contextkey/common/contextkey'; -import { registerEditorContribution, Command, IEditorContributionCtor } from 'vs/editor/browser/editorExtensions'; +import { registerEditorContribution, Command, IEditorContributionCtor, EditorExtensionsRegistry } from 'vs/editor/browser/editorExtensions'; import { ITelemetryService } from 'vs/platform/telemetry/common/telemetry'; import { IThemeService } from 'vs/platform/theme/common/themeService'; import { IStorageService } from 'vs/platform/storage/common/storage'; @@ -965,8 +965,15 @@ export class DefaultPreferencesEditor extends BaseTextEditor { super(DefaultPreferencesEditor.ID, telemetryService, instantiationService, storageService, configurationService, themeService, textFileService, editorGroupService); } + private static _getContributions(): IEditorContributionCtor[] { + let skipContributions = [FoldingController.prototype, SelectionHighlighter.prototype, FindController.prototype]; + let contributions = EditorExtensionsRegistry.getEditorContributions().filter(c => skipContributions.indexOf(c.prototype) === -1); + contributions.push(DefaultSettingsEditorContribution); + return contributions; + } + public createEditorControl(parent: HTMLElement, configuration: IEditorOptions): editorCommon.IEditor { - const editor = this.instantiationService.createInstance(DefaultPreferencesCodeEditor, parent, configuration, false); + const editor = this.instantiationService.createInstance(CodeEditorWidget, parent, configuration, { contributions: DefaultPreferencesEditor._getContributions() }); // Inform user about editor being readonly if user starts type this.toUnbind.push(editor.onDidType(() => this.showReadonlyHint(editor))); @@ -1030,18 +1037,6 @@ export class DefaultPreferencesEditor extends BaseTextEditor { } } -class DefaultPreferencesCodeEditor extends CodeEditorWidget { - - protected _getContributions(): IEditorContributionCtor[] { - let contributions = super._getContributions(); - let skipContributions = [FoldingController.prototype, SelectionHighlighter.prototype, FindController.prototype]; - contributions = contributions.filter(c => skipContributions.indexOf(c.prototype) === -1); - contributions.push(DefaultSettingsEditorContribution); - return contributions; - } - -} - interface ISettingsEditorContribution extends editorCommon.IEditorContribution { updatePreferencesRenderer(associatedPreferencesModelUri: URI): TPromise>; diff --git a/src/vs/workbench/parts/welcome/walkThrough/electron-browser/walkThroughPart.ts b/src/vs/workbench/parts/welcome/walkThrough/electron-browser/walkThroughPart.ts index 3f4b727db77..4e75d60bd26 100644 --- a/src/vs/workbench/parts/welcome/walkThrough/electron-browser/walkThroughPart.ts +++ b/src/vs/workbench/parts/welcome/walkThrough/electron-browser/walkThroughPart.ts @@ -29,8 +29,7 @@ import { RawContextKey, IContextKey, IContextKeyService } from 'vs/platform/cont import { IConfigurationService } from 'vs/platform/configuration/common/configuration'; import { once } from 'vs/base/common/event'; import { isObject } from 'vs/base/common/types'; -import { ICommandService, CommandsRegistry } from 'vs/platform/commands/common/commands'; -import { ICodeEditorService } from 'vs/editor/browser/services/codeEditorService'; +import { CommandsRegistry } from 'vs/platform/commands/common/commands'; import { IEditorOptions } from 'vs/editor/common/config/editorOptions'; import { IThemeService, registerThemingParticipant } from 'vs/platform/theme/common/themeService'; import { registerColor, focusBorder, textLinkForeground, textLinkActiveForeground, textPreformatForeground, contrastBorder, textBlockQuoteBackground, textBlockQuoteBorder } from 'vs/platform/theme/common/colorRegistry'; @@ -55,27 +54,6 @@ interface IWalkThroughEditorViewState { viewState: IViewState; } -class WalkThroughCodeEditor extends CodeEditorWidget { - - constructor( - domElement: HTMLElement, - options: IEditorOptions, - private telemetryData: Object, - @IInstantiationService instantiationService: IInstantiationService, - @ICodeEditorService codeEditorService: ICodeEditorService, - @ICommandService commandService: ICommandService, - @IContextKeyService contextKeyService: IContextKeyService, - @IThemeService themeService: IThemeService, - @INotificationService notificationService: INotificationService, - ) { - super(domElement, options, false, instantiationService, codeEditorService, commandService, contextKeyService, themeService, notificationService); - } - - getTelemetryData() { - return this.telemetryData; - } -} - export class WalkThroughPart extends BaseEditor { static readonly ID: string = 'workbench.editor.walkThroughPart'; @@ -330,7 +308,9 @@ export class WalkThroughPart extends BaseEditor { target: this.input instanceof WalkThroughInput ? this.input.getTelemetryFrom() : undefined, snippet: i }; - const editor = this.instantiationService.createInstance(WalkThroughCodeEditor, div, options, telemetryData); + const editor = this.instantiationService.createInstance(CodeEditorWidget, div, options, { + telemetryData: telemetryData + }); editor.setModel(model); this.contentDisposables.push(editor); From 715815380c25976141f42ac897e03660abe1ff71 Mon Sep 17 00:00:00 2001 From: Alex Dima Date: Mon, 30 Apr 2018 16:14:00 +0200 Subject: [PATCH 237/830] Fixes #38117 --- .../common/controller/cursorCollection.ts | 18 ++++++++---------- 1 file changed, 8 insertions(+), 10 deletions(-) diff --git a/src/vs/editor/common/controller/cursorCollection.ts b/src/vs/editor/common/controller/cursorCollection.ts index 515ca3fbf6d..47d6cc402dc 100644 --- a/src/vs/editor/common/controller/cursorCollection.ts +++ b/src/vs/editor/common/controller/cursorCollection.ts @@ -183,41 +183,39 @@ export class CursorCollection { interface SortedCursor { index: number; selection: Selection; - viewSelection: Selection; } let sortedCursors: SortedCursor[] = []; for (let i = 0, len = cursors.length; i < len; i++) { sortedCursors.push({ index: i, selection: cursors[i].modelState.selection, - viewSelection: cursors[i].viewState.selection }); } sortedCursors.sort((a, b) => { - if (a.viewSelection.startLineNumber === b.viewSelection.startLineNumber) { - return a.viewSelection.startColumn - b.viewSelection.startColumn; + if (a.selection.startLineNumber === b.selection.startLineNumber) { + return a.selection.startColumn - b.selection.startColumn; } - return a.viewSelection.startLineNumber - b.viewSelection.startLineNumber; + return a.selection.startLineNumber - b.selection.startLineNumber; }); for (let sortedCursorIndex = 0; sortedCursorIndex < sortedCursors.length - 1; sortedCursorIndex++) { const current = sortedCursors[sortedCursorIndex]; const next = sortedCursors[sortedCursorIndex + 1]; - const currentViewSelection = current.viewSelection; - const nextViewSelection = next.viewSelection; + const currentSelection = current.selection; + const nextSelection = next.selection; if (!this.context.config.multiCursorMergeOverlapping) { continue; } let shouldMergeCursors: boolean; - if (nextViewSelection.isEmpty() || currentViewSelection.isEmpty()) { + if (nextSelection.isEmpty() || currentSelection.isEmpty()) { // Merge touching cursors if one of them is collapsed - shouldMergeCursors = nextViewSelection.getStartPosition().isBeforeOrEqual(currentViewSelection.getEndPosition()); + shouldMergeCursors = nextSelection.getStartPosition().isBeforeOrEqual(currentSelection.getEndPosition()); } else { // Merge only overlapping cursors (i.e. allow touching ranges) - shouldMergeCursors = nextViewSelection.getStartPosition().isBefore(currentViewSelection.getEndPosition()); + shouldMergeCursors = nextSelection.getStartPosition().isBefore(currentSelection.getEndPosition()); } if (shouldMergeCursors) { From 818854350ff015d1a8a89460661e85d1224a894d Mon Sep 17 00:00:00 2001 From: Johannes Rieken Date: Mon, 30 Apr 2018 15:50:00 +0200 Subject: [PATCH 238/830] add test, #47988 --- .../contrib/suggest/test/suggestModel.test.ts | 93 +++++++++++++++---- 1 file changed, 77 insertions(+), 16 deletions(-) diff --git a/src/vs/editor/contrib/suggest/test/suggestModel.test.ts b/src/vs/editor/contrib/suggest/test/suggestModel.test.ts index 881410ed76b..ba168b837a1 100644 --- a/src/vs/editor/contrib/suggest/test/suggestModel.test.ts +++ b/src/vs/editor/contrib/suggest/test/suggestModel.test.ts @@ -6,28 +6,29 @@ import * as assert from 'assert'; import { Event } from 'vs/base/common/event'; +import { Disposable, IDisposable, dispose } from 'vs/base/common/lifecycle'; import URI from 'vs/base/common/uri'; -import { IDisposable, dispose, Disposable } from 'vs/base/common/lifecycle'; -import { TextModel } from 'vs/editor/common/model/textModel'; -import { Handler } from 'vs/editor/common/editorCommon'; -import { ISuggestSupport, ISuggestResult, SuggestRegistry, SuggestTriggerKind, LanguageIdentifier, TokenizationRegistry, IState, MetadataConsts } from 'vs/editor/common/modes'; -import { SuggestModel, LineContext } from 'vs/editor/contrib/suggest/suggestModel'; -import { TestCodeEditor, createTestCodeEditor } from 'vs/editor/test/browser/testCodeEditor'; -import { ServiceCollection } from 'vs/platform/instantiation/common/serviceCollection'; -import { ITelemetryService } from 'vs/platform/telemetry/common/telemetry'; -import { NullTelemetryService } from 'vs/platform/telemetry/common/telemetryUtils'; +import { CoreEditingCommands } from 'vs/editor/browser/controller/coreCommands'; import { EditOperation } from 'vs/editor/common/core/editOperation'; import { Range } from 'vs/editor/common/core/range'; import { Selection } from 'vs/editor/common/core/selection'; -import { CoreEditingCommands } from 'vs/editor/browser/controller/coreCommands'; -import { SuggestController } from 'vs/editor/contrib/suggest/suggestController'; -import { IStorageService, NullStorageService } from 'vs/platform/storage/common/storage'; -import { SnippetController2 } from 'vs/editor/contrib/snippet/snippetController2'; -import { ISelectedSuggestion } from 'vs/editor/contrib/suggest/suggestWidget'; -import { MockMode } from 'vs/editor/test/common/mocks/mockMode'; -import { LanguageConfigurationRegistry } from 'vs/editor/common/modes/languageConfigurationRegistry'; import { TokenizationResult2 } from 'vs/editor/common/core/token'; +import { Handler } from 'vs/editor/common/editorCommon'; +import { TextModel } from 'vs/editor/common/model/textModel'; +import { IState, ISuggestResult, ISuggestSupport, LanguageIdentifier, MetadataConsts, SuggestRegistry, SuggestTriggerKind, TokenizationRegistry } from 'vs/editor/common/modes'; +import { LanguageConfigurationRegistry } from 'vs/editor/common/modes/languageConfigurationRegistry'; import { NULL_STATE } from 'vs/editor/common/modes/nullMode'; +import { SnippetController2 } from 'vs/editor/contrib/snippet/snippetController2'; +import { ICompletionItem } from 'vs/editor/contrib/suggest/completionModel'; +import { SuggestController } from 'vs/editor/contrib/suggest/suggestController'; +import { LineContext, SuggestModel } from 'vs/editor/contrib/suggest/suggestModel'; +import { ISelectedSuggestion } from 'vs/editor/contrib/suggest/suggestWidget'; +import { TestCodeEditor, createTestCodeEditor } from 'vs/editor/test/browser/testCodeEditor'; +import { MockMode } from 'vs/editor/test/common/mocks/mockMode'; +import { ServiceCollection } from 'vs/platform/instantiation/common/serviceCollection'; +import { IStorageService, NullStorageService } from 'vs/platform/storage/common/storage'; +import { ITelemetryService } from 'vs/platform/telemetry/common/telemetry'; +import { NullTelemetryService } from 'vs/platform/telemetry/common/telemetryUtils'; function createMockEditor(model: TextModel): TestCodeEditor { return createTestCodeEditor({ @@ -692,4 +693,64 @@ suite('SuggestModel - TriggerAndCancelOracle', function () { }); }); }); + + + test('Fails to render completion details #47988', function () { + + let disposeA = 0; + let disposeB = 0; + + disposables.push(SuggestRegistry.register({ scheme: 'test' }, { + provideCompletionItems(doc, pos) { + return { + incomplete: true, + suggestions: [{ type: 'folder', label: 'CompleteNot', insertText: 'Incomplete', sortText: 'a', overwriteBefore: 1 }], + dispose() { disposeA += 1; } + }; + } + })); + disposables.push(SuggestRegistry.register({ scheme: 'test' }, { + provideCompletionItems(doc, pos) { + return { + incomplete: false, + suggestions: [{ type: 'folder', label: 'Complete', insertText: 'Complete', sortText: 'z', overwriteBefore: 1 }], + dispose() { disposeB += 1; } + }; + }, + resolveCompletionItem(doc, pos, item) { + return item; + }, + })); + + return withOracle(async (model, editor) => { + + let itemA: ICompletionItem; + let itemB: ICompletionItem; + + await assertEvent(model.onDidSuggest, () => { + model.trigger({ auto: true }); + + }, event => { + assert.equal(event.auto, true); + assert.equal(event.completionModel.items.length, 2); + assert.equal(disposeA, 0); + assert.equal(disposeB, 0); + + itemA = event.completionModel.items[0]; + itemB = event.completionModel.items[1]; + + assert.equal(itemA.suggestion.label, 'CompleteNot'); + assert.equal(itemB.suggestion.label, 'Complete'); + }); + + await assertEvent(model.onDidSuggest, () => { + model.trigger({ auto: true }, true, [itemA.support], [itemB]); + }, event => { + assert.equal(event.auto, true); + assert.equal(event.completionModel.items.length, 2); + assert.equal(disposeA, 1); + assert.equal(disposeB, 0); + }); + }); + }); }); From ab78dc7eba36a6079d7123cd891b9a92f56323c9 Mon Sep 17 00:00:00 2001 From: Johannes Rieken Date: Mon, 30 Apr 2018 17:09:45 +0200 Subject: [PATCH 239/830] fix #47988 --- .../editor/contrib/suggest/completionModel.ts | 34 +++++++------- src/vs/editor/contrib/suggest/suggestModel.ts | 44 ++++++++----------- .../suggest/test/completionModel.test.ts | 21 ++++----- .../contrib/suggest/test/suggestModel.test.ts | 26 ++++------- 4 files changed, 57 insertions(+), 68 deletions(-) diff --git a/src/vs/editor/contrib/suggest/completionModel.ts b/src/vs/editor/contrib/suggest/completionModel.ts index 3fe110083fa..f2325b12fce 100644 --- a/src/vs/editor/contrib/suggest/completionModel.ts +++ b/src/vs/editor/contrib/suggest/completionModel.ts @@ -6,9 +6,9 @@ 'use strict'; import { fuzzyScore, fuzzyScoreGracefulAggressive, skipScore } from 'vs/base/common/filters'; -import { ISuggestSupport, ISuggestResult } from 'vs/editor/common/modes'; -import { ISuggestionItem, SnippetConfig } from './suggest'; import { isDisposable } from 'vs/base/common/lifecycle'; +import { ISuggestResult, ISuggestSupport } from 'vs/editor/common/modes'; +import { ISuggestionItem, SnippetConfig } from './suggest'; export interface ICompletionItem extends ISuggestionItem { matches?: number[]; @@ -53,7 +53,7 @@ export class CompletionModel { private _lineContext: LineContext; private _refilterKind: Refilter; private _filteredItems: ICompletionItem[]; - private _isIncomplete: boolean; + private _isIncomplete: Set; private _stats: ICompletionStats; constructor(items: ISuggestionItem[], column: number, lineContext: LineContext, snippetConfig?: SnippetConfig) { @@ -99,24 +99,24 @@ export class CompletionModel { return this._filteredItems; } - get incomplete(): boolean { + get incomplete(): Set { this._ensureCachedState(); return this._isIncomplete; } - resolveIncompleteInfo(): { incomplete: ISuggestSupport[], complete: ISuggestionItem[] } { - const incomplete: ISuggestSupport[] = []; - const complete: ISuggestionItem[] = []; + adopt(except: Set): ISuggestionItem[] { + let res = new Array(); + for (let i = 0; i < this._items.length; i++) { + if (!except.has(this._items[i].support)) { + res.push(this._items[i]); - for (const item of this._items) { - if (!item.container.incomplete) { - complete.push(item); - } else if (incomplete.indexOf(item.support) < 0) { - incomplete.push(item.support); + // unordered removed + this._items[i] = this._items[this._items.length - 1]; + this._items.pop(); } } - - return { incomplete, complete }; + this._refilterKind = Refilter.All; + return res; } get stats(): ICompletionStats { @@ -132,7 +132,7 @@ export class CompletionModel { private _createCachedState(): void { - this._isIncomplete = false; + this._isIncomplete = new Set(); this._stats = { suggestionCount: 0, snippetCount: 0, textCount: 0 }; const { leadingLineContent, characterCountDelta } = this._lineContext; @@ -153,7 +153,9 @@ export class CompletionModel { // collect those supports that signaled having // an incomplete result - this._isIncomplete = this._isIncomplete || container.incomplete; + if (container.incomplete) { + this._isIncomplete.add(item.support); + } // 'word' is that remainder of the current line that we // filter and score against. In theory each suggestion uses a diff --git a/src/vs/editor/contrib/suggest/suggestModel.ts b/src/vs/editor/contrib/suggest/suggestModel.ts index c9400c07fe6..417451c9a35 100644 --- a/src/vs/editor/contrib/suggest/suggestModel.ts +++ b/src/vs/editor/contrib/suggest/suggestModel.ts @@ -4,20 +4,21 @@ *--------------------------------------------------------------------------------------------*/ 'use strict'; -import { onUnexpectedError } from 'vs/base/common/errors'; import { isFalsyOrEmpty } from 'vs/base/common/arrays'; import { TimeoutTimer } from 'vs/base/common/async'; -import { Event, Emitter } from 'vs/base/common/event'; +import { onUnexpectedError } from 'vs/base/common/errors'; +import { Emitter, Event } from 'vs/base/common/event'; import { IDisposable, dispose } from 'vs/base/common/lifecycle'; +import { values } from 'vs/base/common/map'; import { TPromise } from 'vs/base/common/winjs.base'; -import { ITextModel, IWordAtPosition } from 'vs/editor/common/model'; -import { ISuggestSupport, SuggestRegistry, StandardTokenType, SuggestTriggerKind, SuggestContext } from 'vs/editor/common/modes'; +import { ICodeEditor } from 'vs/editor/browser/editorBrowser'; +import { CursorChangeReason, ICursorSelectionChangedEvent } from 'vs/editor/common/controller/cursorEvents'; import { Position } from 'vs/editor/common/core/position'; import { Selection } from 'vs/editor/common/core/selection'; -import { provideSuggestionItems, getSuggestionComparator, ISuggestionItem } from './suggest'; +import { ITextModel, IWordAtPosition } from 'vs/editor/common/model'; +import { ISuggestSupport, StandardTokenType, SuggestContext, SuggestRegistry, SuggestTriggerKind } from 'vs/editor/common/modes'; import { CompletionModel } from './completionModel'; -import { CursorChangeReason, ICursorSelectionChangedEvent } from 'vs/editor/common/controller/cursorEvents'; -import { ICodeEditor } from 'vs/editor/browser/editorBrowser'; +import { ISuggestionItem, getSuggestionComparator, provideSuggestionItems } from './suggest'; export interface ICancelEvent { readonly retrigger: boolean; @@ -170,18 +171,17 @@ export class SuggestModel implements IDisposable { return; } - const supportsByTriggerCharacter: { [ch: string]: ISuggestSupport[] } = Object.create(null); + const supportsByTriggerCharacter: { [ch: string]: Set } = Object.create(null); for (const support of SuggestRegistry.all(this._editor.getModel())) { if (isFalsyOrEmpty(support.triggerCharacters)) { continue; } for (const ch of support.triggerCharacters) { - const array = supportsByTriggerCharacter[ch]; - if (!array) { - supportsByTriggerCharacter[ch] = [support]; - } else { - array.push(support); + let set = supportsByTriggerCharacter[ch]; + if (!set) { + set = supportsByTriggerCharacter[ch] = new Set(); } + set.add(support); } } @@ -192,15 +192,8 @@ export class SuggestModel implements IDisposable { if (supports) { // keep existing items that where not computed by the // supports/providers that want to trigger now - const items: ISuggestionItem[] = []; - if (this._completionModel) { - for (const item of this._completionModel.items) { - if (supports.indexOf(item.support) < 0) { - items.push(item); - } - } - } - this.trigger({ auto: true, triggerCharacter: lastChar }, Boolean(this._completionModel), supports, items); + const items: ISuggestionItem[] = this._completionModel ? this._completionModel.adopt(supports) : undefined; + this.trigger({ auto: true, triggerCharacter: lastChar }, Boolean(this._completionModel), values(supports), items); } }); } @@ -427,10 +420,11 @@ export class SuggestModel implements IDisposable { return; } - if (ctx.column > this._context.column && this._completionModel.incomplete && ctx.leadingWord.word.length !== 0) { + if (ctx.column > this._context.column && this._completionModel.incomplete.size > 0 && ctx.leadingWord.word.length !== 0) { // typed -> moved cursor RIGHT & incomple model & still on a word -> retrigger - const { complete, incomplete } = this._completionModel.resolveIncompleteInfo(); - this.trigger({ auto: this._state === State.Auto }, true, incomplete, complete); + const { incomplete } = this._completionModel; + const adopted = this._completionModel.adopt(incomplete); + this.trigger({ auto: this._state === State.Auto }, true, values(incomplete), adopted); } else { // typed -> moved cursor RIGHT -> update UI diff --git a/src/vs/editor/contrib/suggest/test/completionModel.test.ts b/src/vs/editor/contrib/suggest/test/completionModel.test.ts index e86f045c606..233c662364d 100644 --- a/src/vs/editor/contrib/suggest/test/completionModel.test.ts +++ b/src/vs/editor/contrib/suggest/test/completionModel.test.ts @@ -5,11 +5,11 @@ 'use strict'; import * as assert from 'assert'; -import { ISuggestion, ISuggestResult, ISuggestSupport, SuggestionType } from 'vs/editor/common/modes'; -import { ISuggestionItem, getSuggestionComparator } from 'vs/editor/contrib/suggest/suggest'; -import { CompletionModel } from 'vs/editor/contrib/suggest/completionModel'; -import { IPosition } from 'vs/editor/common/core/position'; import { TPromise } from 'vs/base/common/winjs.base'; +import { IPosition } from 'vs/editor/common/core/position'; +import { ISuggestResult, ISuggestSupport, ISuggestion, SuggestionType } from 'vs/editor/common/modes'; +import { CompletionModel } from 'vs/editor/contrib/suggest/completionModel'; +import { ISuggestionItem, getSuggestionComparator } from 'vs/editor/contrib/suggest/suggest'; export function createSuggestItem(label: string, overwriteBefore: number, type: SuggestionType = 'property', incomplete: boolean = false, position: IPosition = { lineNumber: 1, column: 1 }): ISuggestionItem { @@ -77,7 +77,7 @@ suite('CompletionModel', function () { test('complete/incomplete', function () { - assert.equal(model.incomplete, false); + assert.equal(model.incomplete.size, 0); let incompleteModel = new CompletionModel([ createSuggestItem('foo', 3, undefined, true), @@ -86,7 +86,7 @@ suite('CompletionModel', function () { leadingLineContent: 'foo', characterCountDelta: 0 }); - assert.equal(incompleteModel.incomplete, true); + assert.equal(incompleteModel.incomplete.size, 1); }); test('replaceIncomplete', function () { @@ -95,13 +95,14 @@ suite('CompletionModel', function () { const incompleteItem = createSuggestItem('foofoo', 1, undefined, true, { lineNumber: 1, column: 2 }); const model = new CompletionModel([completeItem, incompleteItem], 2, { leadingLineContent: 'f', characterCountDelta: 0 }); - assert.equal(model.incomplete, true); + assert.equal(model.incomplete.size, 1); assert.equal(model.items.length, 2); - const { complete, incomplete } = model.resolveIncompleteInfo(); + const { incomplete } = model; + const complete = model.adopt(incomplete); - assert.equal(incomplete.length, 1); - assert.ok(incomplete[0] === incompleteItem.support); + assert.equal(incomplete.size, 1); + assert.ok(incomplete.has(incompleteItem.support)); assert.equal(complete.length, 1); assert.ok(complete[0] === completeItem); }); diff --git a/src/vs/editor/contrib/suggest/test/suggestModel.test.ts b/src/vs/editor/contrib/suggest/test/suggestModel.test.ts index ba168b837a1..69a6c6870e0 100644 --- a/src/vs/editor/contrib/suggest/test/suggestModel.test.ts +++ b/src/vs/editor/contrib/suggest/test/suggestModel.test.ts @@ -19,7 +19,6 @@ import { IState, ISuggestResult, ISuggestSupport, LanguageIdentifier, MetadataCo import { LanguageConfigurationRegistry } from 'vs/editor/common/modes/languageConfigurationRegistry'; import { NULL_STATE } from 'vs/editor/common/modes/nullMode'; import { SnippetController2 } from 'vs/editor/contrib/snippet/snippetController2'; -import { ICompletionItem } from 'vs/editor/contrib/suggest/completionModel'; import { SuggestController } from 'vs/editor/contrib/suggest/suggestController'; import { LineContext, SuggestModel } from 'vs/editor/contrib/suggest/suggestModel'; import { ISelectedSuggestion } from 'vs/editor/contrib/suggest/suggestWidget'; @@ -464,7 +463,7 @@ suite('SuggestModel - TriggerAndCancelOracle', function () { model.trigger({ auto: false }); }, event => { assert.equal(event.auto, false); - assert.equal(event.completionModel.incomplete, true); + assert.equal(event.completionModel.incomplete.size, 1); assert.equal(event.completionModel.items.length, 1); return assertEvent(model.onDidCancel, () => { @@ -501,7 +500,7 @@ suite('SuggestModel - TriggerAndCancelOracle', function () { model.trigger({ auto: false }); }, event => { assert.equal(event.auto, false); - assert.equal(event.completionModel.incomplete, true); + assert.equal(event.completionModel.incomplete.size, 1); assert.equal(event.completionModel.items.length, 1); return assertEvent(model.onDidSuggest, () => { @@ -511,7 +510,7 @@ suite('SuggestModel - TriggerAndCancelOracle', function () { editor.trigger('keyboard', Handler.Type, { text: ';' }); }, event => { assert.equal(event.auto, false); - assert.equal(event.completionModel.incomplete, true); + assert.equal(event.completionModel.incomplete.size, 1); assert.equal(event.completionModel.items.length, 1); }); @@ -704,7 +703,7 @@ suite('SuggestModel - TriggerAndCancelOracle', function () { provideCompletionItems(doc, pos) { return { incomplete: true, - suggestions: [{ type: 'folder', label: 'CompleteNot', insertText: 'Incomplete', sortText: 'a', overwriteBefore: 1 }], + suggestions: [{ type: 'folder', label: 'CompleteNot', insertText: 'Incomplete', sortText: 'a', overwriteBefore: pos.column - 1 }], dispose() { disposeA += 1; } }; } @@ -713,7 +712,7 @@ suite('SuggestModel - TriggerAndCancelOracle', function () { provideCompletionItems(doc, pos) { return { incomplete: false, - suggestions: [{ type: 'folder', label: 'Complete', insertText: 'Complete', sortText: 'z', overwriteBefore: 1 }], + suggestions: [{ type: 'folder', label: 'Complete', insertText: 'Complete', sortText: 'z', overwriteBefore: pos.column - 1 }], dispose() { disposeB += 1; } }; }, @@ -724,27 +723,20 @@ suite('SuggestModel - TriggerAndCancelOracle', function () { return withOracle(async (model, editor) => { - let itemA: ICompletionItem; - let itemB: ICompletionItem; - await assertEvent(model.onDidSuggest, () => { - model.trigger({ auto: true }); + editor.setValue(''); + editor.setSelection(new Selection(1, 1, 1, 1)); + editor.trigger('keyboard', Handler.Type, { text: 'c' }); }, event => { assert.equal(event.auto, true); assert.equal(event.completionModel.items.length, 2); assert.equal(disposeA, 0); assert.equal(disposeB, 0); - - itemA = event.completionModel.items[0]; - itemB = event.completionModel.items[1]; - - assert.equal(itemA.suggestion.label, 'CompleteNot'); - assert.equal(itemB.suggestion.label, 'Complete'); }); await assertEvent(model.onDidSuggest, () => { - model.trigger({ auto: true }, true, [itemA.support], [itemB]); + editor.trigger('keyboard', Handler.Type, { text: 'o' }); }, event => { assert.equal(event.auto, true); assert.equal(event.completionModel.items.length, 2); From 8c0d644a202ef41c307adca098117cb5b9661032 Mon Sep 17 00:00:00 2001 From: isidor Date: Mon, 30 Apr 2018 17:55:45 +0200 Subject: [PATCH 240/830] Revert "fixes #43516" This reverts commit c7218a88f3c9bff6248b5212d9b7f35e6b63e332. --- .../parts/debug/electron-browser/debugService.ts | 10 ++-------- 1 file changed, 2 insertions(+), 8 deletions(-) diff --git a/src/vs/workbench/parts/debug/electron-browser/debugService.ts b/src/vs/workbench/parts/debug/electron-browser/debugService.ts index 464731341ec..fafa45301fb 100644 --- a/src/vs/workbench/parts/debug/electron-browser/debugService.ts +++ b/src/vs/workbench/parts/debug/electron-browser/debugService.ts @@ -154,17 +154,11 @@ export class DebugService implements debug.IDebugService { const session = process.session; if (broadcast.channel === EXTENSION_ATTACH_BROADCAST_CHANNEL) { - const initialAttach = process.configuration.request === 'launch'; + this.onSessionEnd(session); process.configuration.request = 'attach'; process.configuration.port = broadcast.payload.port; - // Do not end process on initial attach (since the request is still 'launch') - if (initialAttach) { - session.attach(process.configuration); - } else { - this.onSessionEnd(session); - this.doCreateProcess(process.session.root, process.configuration, process.getId()); - } + this.doCreateProcess(process.session.root, process.configuration, process.getId()); return; } From 638c9c37645f4092b6a34cc163a2f2d4c6e26b82 Mon Sep 17 00:00:00 2001 From: Alex Dima Date: Mon, 30 Apr 2018 17:55:51 +0200 Subject: [PATCH 241/830] Document nodeAcceptEdit through tests --- src/vs/editor/common/model/intervalTree.ts | 13 +- .../test/common/model/intervalTree.test.ts | 271 +++++++++++++++++- 2 files changed, 278 insertions(+), 6 deletions(-) diff --git a/src/vs/editor/common/model/intervalTree.ts b/src/vs/editor/common/model/intervalTree.ts index 55636d2eace..cad96482e42 100644 --- a/src/vs/editor/common/model/intervalTree.ts +++ b/src/vs/editor/common/model/intervalTree.ts @@ -6,7 +6,7 @@ import { ModelDecorationOptions } from 'vs/editor/common/model/textModel'; import { Range } from 'vs/editor/common/core/range'; -import { IModelDecoration } from 'vs/editor/common/model'; +import { IModelDecoration, TrackedRangeStickiness as ActualTrackedRangeStickiness } from 'vs/editor/common/model'; // // The red-black tree is based on the "Introduction to Algorithms" by Cormen, Leiserson and Rivest. @@ -114,11 +114,14 @@ function setNodeIsInOverviewRuler(node: IntervalNode, value: boolean): void { function getNodeStickiness(node: IntervalNode): TrackedRangeStickiness { return ((node.metadata & Constants.StickinessMask) >>> Constants.StickinessOffset); } -function setNodeStickiness(node: IntervalNode, stickiness: TrackedRangeStickiness): void { +function _setNodeStickiness(node: IntervalNode, stickiness: TrackedRangeStickiness): void { node.metadata = ( (node.metadata & Constants.StickinessMaskInverse) | (stickiness << Constants.StickinessOffset) ); } +export function setNodeStickiness(node: IntervalNode, stickiness: ActualTrackedRangeStickiness): void { + _setNodeStickiness(node, stickiness); +} export class IntervalNode implements IModelDecoration { @@ -163,7 +166,7 @@ export class IntervalNode implements IModelDecoration { this.ownerId = 0; this.options = null; setNodeIsForValidation(this, false); - setNodeStickiness(this, TrackedRangeStickiness.NeverGrowsWhenTypingAtEdges); + _setNodeStickiness(this, TrackedRangeStickiness.NeverGrowsWhenTypingAtEdges); setNodeIsInOverviewRuler(this, false); this.cachedVersionId = 0; @@ -192,7 +195,7 @@ export class IntervalNode implements IModelDecoration { || className === ClassName.EditorWarningDecoration || className === ClassName.EditorInfoDecoration )); - setNodeStickiness(this, this.options.stickiness); + _setNodeStickiness(this, this.options.stickiness); setNodeIsInOverviewRuler(this, this.options.overviewRuler.color ? true : false); } @@ -391,7 +394,7 @@ function adjustMarkerBeforeColumn(markerOffset: number, markerStickToPreviousCha * This is a lot more complicated than strictly necessary to maintain the same behaviour * as when decorations were implemented using two markers. */ -function nodeAcceptEdit(node: IntervalNode, start: number, end: number, textLength: number, forceMoveMarkers: boolean): void { +export function nodeAcceptEdit(node: IntervalNode, start: number, end: number, textLength: number, forceMoveMarkers: boolean): void { const nodeStickiness = getNodeStickiness(node); const startStickToPreviousCharacter = ( nodeStickiness === TrackedRangeStickiness.AlwaysGrowsWhenTypingAtEdges diff --git a/src/vs/editor/test/common/model/intervalTree.test.ts b/src/vs/editor/test/common/model/intervalTree.test.ts index 1db4a295d2a..77ccf96352e 100644 --- a/src/vs/editor/test/common/model/intervalTree.test.ts +++ b/src/vs/editor/test/common/model/intervalTree.test.ts @@ -5,7 +5,8 @@ 'use strict'; import * as assert from 'assert'; -import { IntervalTree, IntervalNode, getNodeColor, NodeColor, SENTINEL, intervalCompare } from 'vs/editor/common/model/intervalTree'; +import { IntervalTree, IntervalNode, getNodeColor, NodeColor, SENTINEL, intervalCompare, setNodeStickiness, nodeAcceptEdit } from 'vs/editor/common/model/intervalTree'; +import { TrackedRangeStickiness } from 'vs/editor/common/model'; const GENERATE_TESTS = false; let TEST_COUNT = GENERATE_TESTS ? 10000 : 0; @@ -554,6 +555,273 @@ suite('IntervalTree', () => { }); }); +suite('IntervalTree', () => { + function assertNodeAcceptEdit(msg: string, nodeStart: number, nodeEnd: number, nodeStickiness: TrackedRangeStickiness, start: number, end: number, textLength: number, forceMoveMarkers: boolean, expectedNodeStart: number, expectedNodeEnd: number): void { + let node = new IntervalNode('', nodeStart, nodeEnd); + setNodeStickiness(node, nodeStickiness); + nodeAcceptEdit(node, start, end, textLength, forceMoveMarkers); + assert.deepEqual([node.start, node.end], [expectedNodeStart, expectedNodeEnd], msg); + } + + test('nodeAcceptEdit', () => { + // A. collapsed decoration + { + // no-op + assertNodeAcceptEdit('A.000', 0, 0, TrackedRangeStickiness.AlwaysGrowsWhenTypingAtEdges, 0, 0, 0, false, 0, 0); + assertNodeAcceptEdit('A.001', 0, 0, TrackedRangeStickiness.NeverGrowsWhenTypingAtEdges, 0, 0, 0, false, 0, 0); + assertNodeAcceptEdit('A.002', 0, 0, TrackedRangeStickiness.GrowsOnlyWhenTypingBefore, 0, 0, 0, false, 0, 0); + assertNodeAcceptEdit('A.003', 0, 0, TrackedRangeStickiness.GrowsOnlyWhenTypingAfter, 0, 0, 0, false, 0, 0); + assertNodeAcceptEdit('A.004', 0, 0, TrackedRangeStickiness.AlwaysGrowsWhenTypingAtEdges, 0, 0, 0, true, 0, 0); + assertNodeAcceptEdit('A.005', 0, 0, TrackedRangeStickiness.NeverGrowsWhenTypingAtEdges, 0, 0, 0, true, 0, 0); + assertNodeAcceptEdit('A.006', 0, 0, TrackedRangeStickiness.GrowsOnlyWhenTypingBefore, 0, 0, 0, true, 0, 0); + assertNodeAcceptEdit('A.007', 0, 0, TrackedRangeStickiness.GrowsOnlyWhenTypingAfter, 0, 0, 0, true, 0, 0); + // insertion + assertNodeAcceptEdit('A.008', 0, 0, TrackedRangeStickiness.AlwaysGrowsWhenTypingAtEdges, 0, 0, 1, false, 0, 1); + assertNodeAcceptEdit('A.009', 0, 0, TrackedRangeStickiness.NeverGrowsWhenTypingAtEdges, 0, 0, 1, false, 1, 1); + assertNodeAcceptEdit('A.010', 0, 0, TrackedRangeStickiness.GrowsOnlyWhenTypingBefore, 0, 0, 1, false, 0, 0); + assertNodeAcceptEdit('A.011', 0, 0, TrackedRangeStickiness.GrowsOnlyWhenTypingAfter, 0, 0, 1, false, 1, 1); + assertNodeAcceptEdit('A.012', 0, 0, TrackedRangeStickiness.AlwaysGrowsWhenTypingAtEdges, 0, 0, 1, true, 1, 1); + assertNodeAcceptEdit('A.013', 0, 0, TrackedRangeStickiness.NeverGrowsWhenTypingAtEdges, 0, 0, 1, true, 1, 1); + assertNodeAcceptEdit('A.014', 0, 0, TrackedRangeStickiness.GrowsOnlyWhenTypingBefore, 0, 0, 1, true, 1, 1); + assertNodeAcceptEdit('A.015', 0, 0, TrackedRangeStickiness.GrowsOnlyWhenTypingAfter, 0, 0, 1, true, 1, 1); + } + + // B. non collapsed decoration + { + // no-op + assertNodeAcceptEdit('B.000', 0, 5, TrackedRangeStickiness.AlwaysGrowsWhenTypingAtEdges, 0, 0, 0, false, 0, 5); + assertNodeAcceptEdit('B.001', 0, 5, TrackedRangeStickiness.NeverGrowsWhenTypingAtEdges, 0, 0, 0, false, 0, 5); + assertNodeAcceptEdit('B.002', 0, 5, TrackedRangeStickiness.GrowsOnlyWhenTypingBefore, 0, 0, 0, false, 0, 5); + assertNodeAcceptEdit('B.003', 0, 5, TrackedRangeStickiness.GrowsOnlyWhenTypingAfter, 0, 0, 0, false, 0, 5); + assertNodeAcceptEdit('B.004', 0, 5, TrackedRangeStickiness.AlwaysGrowsWhenTypingAtEdges, 0, 0, 0, true, 0, 5); + assertNodeAcceptEdit('B.005', 0, 5, TrackedRangeStickiness.NeverGrowsWhenTypingAtEdges, 0, 0, 0, true, 0, 5); + assertNodeAcceptEdit('B.006', 0, 5, TrackedRangeStickiness.GrowsOnlyWhenTypingBefore, 0, 0, 0, true, 0, 5); + assertNodeAcceptEdit('B.007', 0, 5, TrackedRangeStickiness.GrowsOnlyWhenTypingAfter, 0, 0, 0, true, 0, 5); + // insertion at start + assertNodeAcceptEdit('B.008', 0, 5, TrackedRangeStickiness.AlwaysGrowsWhenTypingAtEdges, 0, 0, 1, false, 0, 6); + assertNodeAcceptEdit('B.009', 0, 5, TrackedRangeStickiness.NeverGrowsWhenTypingAtEdges, 0, 0, 1, false, 1, 6); + assertNodeAcceptEdit('B.010', 0, 5, TrackedRangeStickiness.GrowsOnlyWhenTypingBefore, 0, 0, 1, false, 0, 6); + assertNodeAcceptEdit('B.011', 0, 5, TrackedRangeStickiness.GrowsOnlyWhenTypingAfter, 0, 0, 1, false, 1, 6); + assertNodeAcceptEdit('B.012', 0, 5, TrackedRangeStickiness.AlwaysGrowsWhenTypingAtEdges, 0, 0, 1, true, 1, 6); + assertNodeAcceptEdit('B.013', 0, 5, TrackedRangeStickiness.NeverGrowsWhenTypingAtEdges, 0, 0, 1, true, 1, 6); + assertNodeAcceptEdit('B.014', 0, 5, TrackedRangeStickiness.GrowsOnlyWhenTypingBefore, 0, 0, 1, true, 1, 6); + assertNodeAcceptEdit('B.015', 0, 5, TrackedRangeStickiness.GrowsOnlyWhenTypingAfter, 0, 0, 1, true, 1, 6); + // insertion in middle + assertNodeAcceptEdit('B.016', 0, 5, TrackedRangeStickiness.AlwaysGrowsWhenTypingAtEdges, 2, 2, 1, false, 0, 6); + assertNodeAcceptEdit('B.017', 0, 5, TrackedRangeStickiness.NeverGrowsWhenTypingAtEdges, 2, 2, 1, false, 0, 6); + assertNodeAcceptEdit('B.018', 0, 5, TrackedRangeStickiness.GrowsOnlyWhenTypingBefore, 2, 2, 1, false, 0, 6); + assertNodeAcceptEdit('B.019', 0, 5, TrackedRangeStickiness.GrowsOnlyWhenTypingAfter, 2, 2, 1, false, 0, 6); + assertNodeAcceptEdit('B.020', 0, 5, TrackedRangeStickiness.AlwaysGrowsWhenTypingAtEdges, 2, 2, 1, true, 0, 6); + assertNodeAcceptEdit('B.021', 0, 5, TrackedRangeStickiness.NeverGrowsWhenTypingAtEdges, 2, 2, 1, true, 0, 6); + assertNodeAcceptEdit('B.022', 0, 5, TrackedRangeStickiness.GrowsOnlyWhenTypingBefore, 2, 2, 1, true, 0, 6); + assertNodeAcceptEdit('B.023', 0, 5, TrackedRangeStickiness.GrowsOnlyWhenTypingAfter, 2, 2, 1, true, 0, 6); + // insertion at end + assertNodeAcceptEdit('B.024', 0, 5, TrackedRangeStickiness.AlwaysGrowsWhenTypingAtEdges, 5, 5, 1, false, 0, 6); + assertNodeAcceptEdit('B.025', 0, 5, TrackedRangeStickiness.NeverGrowsWhenTypingAtEdges, 5, 5, 1, false, 0, 5); + assertNodeAcceptEdit('B.026', 0, 5, TrackedRangeStickiness.GrowsOnlyWhenTypingBefore, 5, 5, 1, false, 0, 5); + assertNodeAcceptEdit('B.027', 0, 5, TrackedRangeStickiness.GrowsOnlyWhenTypingAfter, 5, 5, 1, false, 0, 6); + assertNodeAcceptEdit('B.028', 0, 5, TrackedRangeStickiness.AlwaysGrowsWhenTypingAtEdges, 5, 5, 1, true, 0, 6); + assertNodeAcceptEdit('B.029', 0, 5, TrackedRangeStickiness.NeverGrowsWhenTypingAtEdges, 5, 5, 1, true, 0, 6); + assertNodeAcceptEdit('B.030', 0, 5, TrackedRangeStickiness.GrowsOnlyWhenTypingBefore, 5, 5, 1, true, 0, 6); + assertNodeAcceptEdit('B.031', 0, 5, TrackedRangeStickiness.GrowsOnlyWhenTypingAfter, 5, 5, 1, true, 0, 6); + + // replace with larger text until start + assertNodeAcceptEdit('B.032', 5, 10, TrackedRangeStickiness.AlwaysGrowsWhenTypingAtEdges, 4, 5, 2, false, 5, 11); + assertNodeAcceptEdit('B.033', 5, 10, TrackedRangeStickiness.NeverGrowsWhenTypingAtEdges, 4, 5, 2, false, 6, 11); + assertNodeAcceptEdit('B.034', 5, 10, TrackedRangeStickiness.GrowsOnlyWhenTypingBefore, 4, 5, 2, false, 5, 11); + assertNodeAcceptEdit('B.035', 5, 10, TrackedRangeStickiness.GrowsOnlyWhenTypingAfter, 4, 5, 2, false, 6, 11); + assertNodeAcceptEdit('B.036', 5, 10, TrackedRangeStickiness.AlwaysGrowsWhenTypingAtEdges, 4, 5, 2, true, 6, 11); + assertNodeAcceptEdit('B.037', 5, 10, TrackedRangeStickiness.NeverGrowsWhenTypingAtEdges, 4, 5, 2, true, 6, 11); + assertNodeAcceptEdit('B.038', 5, 10, TrackedRangeStickiness.GrowsOnlyWhenTypingBefore, 4, 5, 2, true, 6, 11); + assertNodeAcceptEdit('B.039', 5, 10, TrackedRangeStickiness.GrowsOnlyWhenTypingAfter, 4, 5, 2, true, 6, 11); + // replace with smaller text until start + assertNodeAcceptEdit('B.040', 5, 10, TrackedRangeStickiness.AlwaysGrowsWhenTypingAtEdges, 3, 5, 1, false, 4, 9); + assertNodeAcceptEdit('B.041', 5, 10, TrackedRangeStickiness.NeverGrowsWhenTypingAtEdges, 3, 5, 1, false, 4, 9); + assertNodeAcceptEdit('B.042', 5, 10, TrackedRangeStickiness.GrowsOnlyWhenTypingBefore, 3, 5, 1, false, 4, 9); + assertNodeAcceptEdit('B.043', 5, 10, TrackedRangeStickiness.GrowsOnlyWhenTypingAfter, 3, 5, 1, false, 4, 9); + assertNodeAcceptEdit('B.044', 5, 10, TrackedRangeStickiness.AlwaysGrowsWhenTypingAtEdges, 3, 5, 1, true, 4, 9); + assertNodeAcceptEdit('B.045', 5, 10, TrackedRangeStickiness.NeverGrowsWhenTypingAtEdges, 3, 5, 1, true, 4, 9); + assertNodeAcceptEdit('B.046', 5, 10, TrackedRangeStickiness.GrowsOnlyWhenTypingBefore, 3, 5, 1, true, 4, 9); + assertNodeAcceptEdit('B.047', 5, 10, TrackedRangeStickiness.GrowsOnlyWhenTypingAfter, 3, 5, 1, true, 4, 9); + + // replace with larger text select start + assertNodeAcceptEdit('B.048', 5, 10, TrackedRangeStickiness.AlwaysGrowsWhenTypingAtEdges, 4, 6, 3, false, 5, 11); + assertNodeAcceptEdit('B.049', 5, 10, TrackedRangeStickiness.NeverGrowsWhenTypingAtEdges, 4, 6, 3, false, 5, 11); + assertNodeAcceptEdit('B.050', 5, 10, TrackedRangeStickiness.GrowsOnlyWhenTypingBefore, 4, 6, 3, false, 5, 11); + assertNodeAcceptEdit('B.051', 5, 10, TrackedRangeStickiness.GrowsOnlyWhenTypingAfter, 4, 6, 3, false, 5, 11); + assertNodeAcceptEdit('B.052', 5, 10, TrackedRangeStickiness.AlwaysGrowsWhenTypingAtEdges, 4, 6, 3, true, 7, 11); + assertNodeAcceptEdit('B.053', 5, 10, TrackedRangeStickiness.NeverGrowsWhenTypingAtEdges, 4, 6, 3, true, 7, 11); + assertNodeAcceptEdit('B.054', 5, 10, TrackedRangeStickiness.GrowsOnlyWhenTypingBefore, 4, 6, 3, true, 7, 11); + assertNodeAcceptEdit('B.055', 5, 10, TrackedRangeStickiness.GrowsOnlyWhenTypingAfter, 4, 6, 3, true, 7, 11); + // replace with smaller text select start + assertNodeAcceptEdit('B.056', 5, 10, TrackedRangeStickiness.AlwaysGrowsWhenTypingAtEdges, 4, 6, 1, false, 5, 9); + assertNodeAcceptEdit('B.057', 5, 10, TrackedRangeStickiness.NeverGrowsWhenTypingAtEdges, 4, 6, 1, false, 5, 9); + assertNodeAcceptEdit('B.058', 5, 10, TrackedRangeStickiness.GrowsOnlyWhenTypingBefore, 4, 6, 1, false, 5, 9); + assertNodeAcceptEdit('B.059', 5, 10, TrackedRangeStickiness.GrowsOnlyWhenTypingAfter, 4, 6, 1, false, 5, 9); + assertNodeAcceptEdit('B.060', 5, 10, TrackedRangeStickiness.AlwaysGrowsWhenTypingAtEdges, 4, 6, 1, true, 5, 9); + assertNodeAcceptEdit('B.061', 5, 10, TrackedRangeStickiness.NeverGrowsWhenTypingAtEdges, 4, 6, 1, true, 5, 9); + assertNodeAcceptEdit('B.062', 5, 10, TrackedRangeStickiness.GrowsOnlyWhenTypingBefore, 4, 6, 1, true, 5, 9); + assertNodeAcceptEdit('B.063', 5, 10, TrackedRangeStickiness.GrowsOnlyWhenTypingAfter, 4, 6, 1, true, 5, 9); + + // replace with larger text from start + assertNodeAcceptEdit('B.064', 5, 10, TrackedRangeStickiness.AlwaysGrowsWhenTypingAtEdges, 5, 6, 2, false, 5, 11); + assertNodeAcceptEdit('B.065', 5, 10, TrackedRangeStickiness.NeverGrowsWhenTypingAtEdges, 5, 6, 2, false, 5, 11); + assertNodeAcceptEdit('B.066', 5, 10, TrackedRangeStickiness.GrowsOnlyWhenTypingBefore, 5, 6, 2, false, 5, 11); + assertNodeAcceptEdit('B.067', 5, 10, TrackedRangeStickiness.GrowsOnlyWhenTypingAfter, 5, 6, 2, false, 5, 11); + assertNodeAcceptEdit('B.068', 5, 10, TrackedRangeStickiness.AlwaysGrowsWhenTypingAtEdges, 5, 6, 2, true, 7, 11); + assertNodeAcceptEdit('B.069', 5, 10, TrackedRangeStickiness.NeverGrowsWhenTypingAtEdges, 5, 6, 2, true, 7, 11); + assertNodeAcceptEdit('B.070', 5, 10, TrackedRangeStickiness.GrowsOnlyWhenTypingBefore, 5, 6, 2, true, 7, 11); + assertNodeAcceptEdit('B.071', 5, 10, TrackedRangeStickiness.GrowsOnlyWhenTypingAfter, 5, 6, 2, true, 7, 11); + // replace with smaller text from start + assertNodeAcceptEdit('B.072', 5, 10, TrackedRangeStickiness.AlwaysGrowsWhenTypingAtEdges, 5, 7, 1, false, 5, 9); + assertNodeAcceptEdit('B.073', 5, 10, TrackedRangeStickiness.NeverGrowsWhenTypingAtEdges, 5, 7, 1, false, 5, 9); + assertNodeAcceptEdit('B.074', 5, 10, TrackedRangeStickiness.GrowsOnlyWhenTypingBefore, 5, 7, 1, false, 5, 9); + assertNodeAcceptEdit('B.075', 5, 10, TrackedRangeStickiness.GrowsOnlyWhenTypingAfter, 5, 7, 1, false, 5, 9); + assertNodeAcceptEdit('B.076', 5, 10, TrackedRangeStickiness.AlwaysGrowsWhenTypingAtEdges, 5, 7, 1, true, 6, 9); + assertNodeAcceptEdit('B.077', 5, 10, TrackedRangeStickiness.NeverGrowsWhenTypingAtEdges, 5, 7, 1, true, 6, 9); + assertNodeAcceptEdit('B.078', 5, 10, TrackedRangeStickiness.GrowsOnlyWhenTypingBefore, 5, 7, 1, true, 6, 9); + assertNodeAcceptEdit('B.079', 5, 10, TrackedRangeStickiness.GrowsOnlyWhenTypingAfter, 5, 7, 1, true, 6, 9); + + // replace with larger text to end + assertNodeAcceptEdit('B.080', 5, 10, TrackedRangeStickiness.AlwaysGrowsWhenTypingAtEdges, 9, 10, 2, false, 5, 11); + assertNodeAcceptEdit('B.081', 5, 10, TrackedRangeStickiness.NeverGrowsWhenTypingAtEdges, 9, 10, 2, false, 5, 10); + assertNodeAcceptEdit('B.082', 5, 10, TrackedRangeStickiness.GrowsOnlyWhenTypingBefore, 9, 10, 2, false, 5, 10); + assertNodeAcceptEdit('B.083', 5, 10, TrackedRangeStickiness.GrowsOnlyWhenTypingAfter, 9, 10, 2, false, 5, 11); + assertNodeAcceptEdit('B.084', 5, 10, TrackedRangeStickiness.AlwaysGrowsWhenTypingAtEdges, 9, 10, 2, true, 5, 11); + assertNodeAcceptEdit('B.085', 5, 10, TrackedRangeStickiness.NeverGrowsWhenTypingAtEdges, 9, 10, 2, true, 5, 11); + assertNodeAcceptEdit('B.086', 5, 10, TrackedRangeStickiness.GrowsOnlyWhenTypingBefore, 9, 10, 2, true, 5, 11); + assertNodeAcceptEdit('B.087', 5, 10, TrackedRangeStickiness.GrowsOnlyWhenTypingAfter, 9, 10, 2, true, 5, 11); + // replace with smaller text to end + assertNodeAcceptEdit('B.088', 5, 10, TrackedRangeStickiness.AlwaysGrowsWhenTypingAtEdges, 8, 10, 1, false, 5, 9); + assertNodeAcceptEdit('B.089', 5, 10, TrackedRangeStickiness.NeverGrowsWhenTypingAtEdges, 8, 10, 1, false, 5, 9); + assertNodeAcceptEdit('B.090', 5, 10, TrackedRangeStickiness.GrowsOnlyWhenTypingBefore, 8, 10, 1, false, 5, 9); + assertNodeAcceptEdit('B.091', 5, 10, TrackedRangeStickiness.GrowsOnlyWhenTypingAfter, 8, 10, 1, false, 5, 9); + assertNodeAcceptEdit('B.092', 5, 10, TrackedRangeStickiness.AlwaysGrowsWhenTypingAtEdges, 8, 10, 1, true, 5, 9); + assertNodeAcceptEdit('B.093', 5, 10, TrackedRangeStickiness.NeverGrowsWhenTypingAtEdges, 8, 10, 1, true, 5, 9); + assertNodeAcceptEdit('B.094', 5, 10, TrackedRangeStickiness.GrowsOnlyWhenTypingBefore, 8, 10, 1, true, 5, 9); + assertNodeAcceptEdit('B.095', 5, 10, TrackedRangeStickiness.GrowsOnlyWhenTypingAfter, 8, 10, 1, true, 5, 9); + + // replace with larger text select end + assertNodeAcceptEdit('B.096', 5, 10, TrackedRangeStickiness.AlwaysGrowsWhenTypingAtEdges, 9, 11, 3, false, 5, 10); + assertNodeAcceptEdit('B.097', 5, 10, TrackedRangeStickiness.NeverGrowsWhenTypingAtEdges, 9, 11, 3, false, 5, 10); + assertNodeAcceptEdit('B.098', 5, 10, TrackedRangeStickiness.GrowsOnlyWhenTypingBefore, 9, 11, 3, false, 5, 10); + assertNodeAcceptEdit('B.099', 5, 10, TrackedRangeStickiness.GrowsOnlyWhenTypingAfter, 9, 11, 3, false, 5, 10); + assertNodeAcceptEdit('B.100', 5, 10, TrackedRangeStickiness.AlwaysGrowsWhenTypingAtEdges, 9, 11, 3, true, 5, 12); + assertNodeAcceptEdit('B.101', 5, 10, TrackedRangeStickiness.NeverGrowsWhenTypingAtEdges, 9, 11, 3, true, 5, 12); + assertNodeAcceptEdit('B.102', 5, 10, TrackedRangeStickiness.GrowsOnlyWhenTypingBefore, 9, 11, 3, true, 5, 12); + assertNodeAcceptEdit('B.103', 5, 10, TrackedRangeStickiness.GrowsOnlyWhenTypingAfter, 9, 11, 3, true, 5, 12); + // replace with smaller text select end + assertNodeAcceptEdit('B.104', 5, 10, TrackedRangeStickiness.AlwaysGrowsWhenTypingAtEdges, 9, 11, 1, false, 5, 10); + assertNodeAcceptEdit('B.105', 5, 10, TrackedRangeStickiness.NeverGrowsWhenTypingAtEdges, 9, 11, 1, false, 5, 10); + assertNodeAcceptEdit('B.106', 5, 10, TrackedRangeStickiness.GrowsOnlyWhenTypingBefore, 9, 11, 1, false, 5, 10); + assertNodeAcceptEdit('B.107', 5, 10, TrackedRangeStickiness.GrowsOnlyWhenTypingAfter, 9, 11, 1, false, 5, 10); + assertNodeAcceptEdit('B.108', 5, 10, TrackedRangeStickiness.AlwaysGrowsWhenTypingAtEdges, 9, 11, 1, true, 5, 10); + assertNodeAcceptEdit('B.109', 5, 10, TrackedRangeStickiness.NeverGrowsWhenTypingAtEdges, 9, 11, 1, true, 5, 10); + assertNodeAcceptEdit('B.110', 5, 10, TrackedRangeStickiness.GrowsOnlyWhenTypingBefore, 9, 11, 1, true, 5, 10); + assertNodeAcceptEdit('B.111', 5, 10, TrackedRangeStickiness.GrowsOnlyWhenTypingAfter, 9, 11, 1, true, 5, 10); + + // replace with larger text from end + assertNodeAcceptEdit('B.112', 5, 10, TrackedRangeStickiness.AlwaysGrowsWhenTypingAtEdges, 10, 11, 3, false, 5, 10); + assertNodeAcceptEdit('B.113', 5, 10, TrackedRangeStickiness.NeverGrowsWhenTypingAtEdges, 10, 11, 3, false, 5, 10); + assertNodeAcceptEdit('B.114', 5, 10, TrackedRangeStickiness.GrowsOnlyWhenTypingBefore, 10, 11, 3, false, 5, 10); + assertNodeAcceptEdit('B.115', 5, 10, TrackedRangeStickiness.GrowsOnlyWhenTypingAfter, 10, 11, 3, false, 5, 10); + assertNodeAcceptEdit('B.116', 5, 10, TrackedRangeStickiness.AlwaysGrowsWhenTypingAtEdges, 10, 11, 3, true, 5, 13); + assertNodeAcceptEdit('B.117', 5, 10, TrackedRangeStickiness.NeverGrowsWhenTypingAtEdges, 10, 11, 3, true, 5, 13); + assertNodeAcceptEdit('B.118', 5, 10, TrackedRangeStickiness.GrowsOnlyWhenTypingBefore, 10, 11, 3, true, 5, 13); + assertNodeAcceptEdit('B.119', 5, 10, TrackedRangeStickiness.GrowsOnlyWhenTypingAfter, 10, 11, 3, true, 5, 13); + // replace with smaller text from end + assertNodeAcceptEdit('B.120', 5, 10, TrackedRangeStickiness.AlwaysGrowsWhenTypingAtEdges, 10, 12, 1, false, 5, 10); + assertNodeAcceptEdit('B.121', 5, 10, TrackedRangeStickiness.NeverGrowsWhenTypingAtEdges, 10, 12, 1, false, 5, 10); + assertNodeAcceptEdit('B.122', 5, 10, TrackedRangeStickiness.GrowsOnlyWhenTypingBefore, 10, 12, 1, false, 5, 10); + assertNodeAcceptEdit('B.123', 5, 10, TrackedRangeStickiness.GrowsOnlyWhenTypingAfter, 10, 12, 1, false, 5, 10); + assertNodeAcceptEdit('B.124', 5, 10, TrackedRangeStickiness.AlwaysGrowsWhenTypingAtEdges, 10, 12, 1, true, 5, 11); + assertNodeAcceptEdit('B.125', 5, 10, TrackedRangeStickiness.NeverGrowsWhenTypingAtEdges, 10, 12, 1, true, 5, 11); + assertNodeAcceptEdit('B.126', 5, 10, TrackedRangeStickiness.GrowsOnlyWhenTypingBefore, 10, 12, 1, true, 5, 11); + assertNodeAcceptEdit('B.127', 5, 10, TrackedRangeStickiness.GrowsOnlyWhenTypingAfter, 10, 12, 1, true, 5, 11); + + // delete until start + assertNodeAcceptEdit('B.128', 5, 10, TrackedRangeStickiness.AlwaysGrowsWhenTypingAtEdges, 4, 5, 0, false, 4, 9); + assertNodeAcceptEdit('B.129', 5, 10, TrackedRangeStickiness.NeverGrowsWhenTypingAtEdges, 4, 5, 0, false, 4, 9); + assertNodeAcceptEdit('B.130', 5, 10, TrackedRangeStickiness.GrowsOnlyWhenTypingBefore, 4, 5, 0, false, 4, 9); + assertNodeAcceptEdit('B.131', 5, 10, TrackedRangeStickiness.GrowsOnlyWhenTypingAfter, 4, 5, 0, false, 4, 9); + assertNodeAcceptEdit('B.132', 5, 10, TrackedRangeStickiness.AlwaysGrowsWhenTypingAtEdges, 4, 5, 0, true, 4, 9); + assertNodeAcceptEdit('B.133', 5, 10, TrackedRangeStickiness.NeverGrowsWhenTypingAtEdges, 4, 5, 0, true, 4, 9); + assertNodeAcceptEdit('B.134', 5, 10, TrackedRangeStickiness.GrowsOnlyWhenTypingBefore, 4, 5, 0, true, 4, 9); + assertNodeAcceptEdit('B.135', 5, 10, TrackedRangeStickiness.GrowsOnlyWhenTypingAfter, 4, 5, 0, true, 4, 9); + + // delete select start + assertNodeAcceptEdit('B.136', 5, 10, TrackedRangeStickiness.AlwaysGrowsWhenTypingAtEdges, 4, 6, 0, false, 4, 8); + assertNodeAcceptEdit('B.137', 5, 10, TrackedRangeStickiness.NeverGrowsWhenTypingAtEdges, 4, 6, 0, false, 4, 8); + assertNodeAcceptEdit('B.138', 5, 10, TrackedRangeStickiness.GrowsOnlyWhenTypingBefore, 4, 6, 0, false, 4, 8); + assertNodeAcceptEdit('B.139', 5, 10, TrackedRangeStickiness.GrowsOnlyWhenTypingAfter, 4, 6, 0, false, 4, 8); + assertNodeAcceptEdit('B.140', 5, 10, TrackedRangeStickiness.AlwaysGrowsWhenTypingAtEdges, 4, 6, 0, true, 4, 8); + assertNodeAcceptEdit('B.141', 5, 10, TrackedRangeStickiness.NeverGrowsWhenTypingAtEdges, 4, 6, 0, true, 4, 8); + assertNodeAcceptEdit('B.142', 5, 10, TrackedRangeStickiness.GrowsOnlyWhenTypingBefore, 4, 6, 0, true, 4, 8); + assertNodeAcceptEdit('B.143', 5, 10, TrackedRangeStickiness.GrowsOnlyWhenTypingAfter, 4, 6, 0, true, 4, 8); + + // delete from start + assertNodeAcceptEdit('B.144', 5, 10, TrackedRangeStickiness.AlwaysGrowsWhenTypingAtEdges, 5, 6, 0, false, 5, 9); + assertNodeAcceptEdit('B.145', 5, 10, TrackedRangeStickiness.NeverGrowsWhenTypingAtEdges, 5, 6, 0, false, 5, 9); + assertNodeAcceptEdit('B.146', 5, 10, TrackedRangeStickiness.GrowsOnlyWhenTypingBefore, 5, 6, 0, false, 5, 9); + assertNodeAcceptEdit('B.147', 5, 10, TrackedRangeStickiness.GrowsOnlyWhenTypingAfter, 5, 6, 0, false, 5, 9); + assertNodeAcceptEdit('B.148', 5, 10, TrackedRangeStickiness.AlwaysGrowsWhenTypingAtEdges, 5, 6, 0, true, 5, 9); + assertNodeAcceptEdit('B.149', 5, 10, TrackedRangeStickiness.NeverGrowsWhenTypingAtEdges, 5, 6, 0, true, 5, 9); + assertNodeAcceptEdit('B.150', 5, 10, TrackedRangeStickiness.GrowsOnlyWhenTypingBefore, 5, 6, 0, true, 5, 9); + assertNodeAcceptEdit('B.151', 5, 10, TrackedRangeStickiness.GrowsOnlyWhenTypingAfter, 5, 6, 0, true, 5, 9); + + // delete to end + assertNodeAcceptEdit('B.152', 5, 10, TrackedRangeStickiness.AlwaysGrowsWhenTypingAtEdges, 9, 10, 0, false, 5, 9); + assertNodeAcceptEdit('B.153', 5, 10, TrackedRangeStickiness.NeverGrowsWhenTypingAtEdges, 9, 10, 0, false, 5, 9); + assertNodeAcceptEdit('B.154', 5, 10, TrackedRangeStickiness.GrowsOnlyWhenTypingBefore, 9, 10, 0, false, 5, 9); + assertNodeAcceptEdit('B.155', 5, 10, TrackedRangeStickiness.GrowsOnlyWhenTypingAfter, 9, 10, 0, false, 5, 9); + assertNodeAcceptEdit('B.156', 5, 10, TrackedRangeStickiness.AlwaysGrowsWhenTypingAtEdges, 9, 10, 0, true, 5, 9); + assertNodeAcceptEdit('B.157', 5, 10, TrackedRangeStickiness.NeverGrowsWhenTypingAtEdges, 9, 10, 0, true, 5, 9); + assertNodeAcceptEdit('B.158', 5, 10, TrackedRangeStickiness.GrowsOnlyWhenTypingBefore, 9, 10, 0, true, 5, 9); + assertNodeAcceptEdit('B.159', 5, 10, TrackedRangeStickiness.GrowsOnlyWhenTypingAfter, 9, 10, 0, true, 5, 9); + + // delete select end + assertNodeAcceptEdit('B.160', 5, 10, TrackedRangeStickiness.AlwaysGrowsWhenTypingAtEdges, 9, 11, 0, false, 5, 9); + assertNodeAcceptEdit('B.161', 5, 10, TrackedRangeStickiness.NeverGrowsWhenTypingAtEdges, 9, 11, 0, false, 5, 9); + assertNodeAcceptEdit('B.162', 5, 10, TrackedRangeStickiness.GrowsOnlyWhenTypingBefore, 9, 11, 0, false, 5, 9); + assertNodeAcceptEdit('B.163', 5, 10, TrackedRangeStickiness.GrowsOnlyWhenTypingAfter, 9, 11, 0, false, 5, 9); + assertNodeAcceptEdit('B.164', 5, 10, TrackedRangeStickiness.AlwaysGrowsWhenTypingAtEdges, 9, 11, 0, true, 5, 9); + assertNodeAcceptEdit('B.165', 5, 10, TrackedRangeStickiness.NeverGrowsWhenTypingAtEdges, 9, 11, 0, true, 5, 9); + assertNodeAcceptEdit('B.166', 5, 10, TrackedRangeStickiness.GrowsOnlyWhenTypingBefore, 9, 11, 0, true, 5, 9); + assertNodeAcceptEdit('B.167', 5, 10, TrackedRangeStickiness.GrowsOnlyWhenTypingAfter, 9, 11, 0, true, 5, 9); + + // delete from end + assertNodeAcceptEdit('B.168', 5, 10, TrackedRangeStickiness.AlwaysGrowsWhenTypingAtEdges, 10, 11, 0, false, 5, 10); + assertNodeAcceptEdit('B.169', 5, 10, TrackedRangeStickiness.NeverGrowsWhenTypingAtEdges, 10, 11, 0, false, 5, 10); + assertNodeAcceptEdit('B.170', 5, 10, TrackedRangeStickiness.GrowsOnlyWhenTypingBefore, 10, 11, 0, false, 5, 10); + assertNodeAcceptEdit('B.171', 5, 10, TrackedRangeStickiness.GrowsOnlyWhenTypingAfter, 10, 11, 0, false, 5, 10); + assertNodeAcceptEdit('B.172', 5, 10, TrackedRangeStickiness.AlwaysGrowsWhenTypingAtEdges, 10, 11, 0, true, 5, 10); + assertNodeAcceptEdit('B.173', 5, 10, TrackedRangeStickiness.NeverGrowsWhenTypingAtEdges, 10, 11, 0, true, 5, 10); + assertNodeAcceptEdit('B.174', 5, 10, TrackedRangeStickiness.GrowsOnlyWhenTypingBefore, 10, 11, 0, true, 5, 10); + assertNodeAcceptEdit('B.175', 5, 10, TrackedRangeStickiness.GrowsOnlyWhenTypingAfter, 10, 11, 0, true, 5, 10); + + // replace with larger text entire + assertNodeAcceptEdit('B.176', 5, 10, TrackedRangeStickiness.AlwaysGrowsWhenTypingAtEdges, 5, 10, 3, false, 5, 8); + assertNodeAcceptEdit('B.177', 5, 10, TrackedRangeStickiness.NeverGrowsWhenTypingAtEdges, 5, 10, 3, false, 5, 8); + assertNodeAcceptEdit('B.178', 5, 10, TrackedRangeStickiness.GrowsOnlyWhenTypingBefore, 5, 10, 3, false, 5, 8); + assertNodeAcceptEdit('B.179', 5, 10, TrackedRangeStickiness.GrowsOnlyWhenTypingAfter, 5, 10, 3, false, 5, 8); + assertNodeAcceptEdit('B.180', 5, 10, TrackedRangeStickiness.AlwaysGrowsWhenTypingAtEdges, 5, 10, 3, true, 8, 8); + assertNodeAcceptEdit('B.181', 5, 10, TrackedRangeStickiness.NeverGrowsWhenTypingAtEdges, 5, 10, 3, true, 8, 8); + assertNodeAcceptEdit('B.182', 5, 10, TrackedRangeStickiness.GrowsOnlyWhenTypingBefore, 5, 10, 3, true, 8, 8); + assertNodeAcceptEdit('B.183', 5, 10, TrackedRangeStickiness.GrowsOnlyWhenTypingAfter, 5, 10, 3, true, 8, 8); + // replace with smaller text entire + assertNodeAcceptEdit('B.184', 5, 10, TrackedRangeStickiness.AlwaysGrowsWhenTypingAtEdges, 5, 10, 7, false, 5, 12); + assertNodeAcceptEdit('B.185', 5, 10, TrackedRangeStickiness.NeverGrowsWhenTypingAtEdges, 5, 10, 7, false, 5, 10); + assertNodeAcceptEdit('B.186', 5, 10, TrackedRangeStickiness.GrowsOnlyWhenTypingBefore, 5, 10, 7, false, 5, 10); + assertNodeAcceptEdit('B.187', 5, 10, TrackedRangeStickiness.GrowsOnlyWhenTypingAfter, 5, 10, 7, false, 5, 12); + assertNodeAcceptEdit('B.188', 5, 10, TrackedRangeStickiness.AlwaysGrowsWhenTypingAtEdges, 5, 10, 7, true, 12, 12); + assertNodeAcceptEdit('B.189', 5, 10, TrackedRangeStickiness.NeverGrowsWhenTypingAtEdges, 5, 10, 7, true, 12, 12); + assertNodeAcceptEdit('B.190', 5, 10, TrackedRangeStickiness.GrowsOnlyWhenTypingBefore, 5, 10, 7, true, 12, 12); + assertNodeAcceptEdit('B.191', 5, 10, TrackedRangeStickiness.GrowsOnlyWhenTypingAfter, 5, 10, 7, true, 12, 12); + + } + }); +}); + function printTree(T: IntervalTree): void { if (T.root === SENTINEL) { console.log(`~~ empty`); @@ -639,3 +907,4 @@ function assertValidTree(T: IntervalTree): void { } //#endregion + From f2d37611f1887c46451a93c878d426646175615d Mon Sep 17 00:00:00 2001 From: Martin Aeschlimann Date: Mon, 30 Apr 2018 18:11:20 +0200 Subject: [PATCH 242/830] Replace FoldingRangeKind type with normal enum. Fixes #48956 --- .../client/src/cssMain.ts | 23 ++++++++-------- .../client/src/htmlMain.ts | 23 ++++++++-------- .../client/src/jsonMain.ts | 23 ++++++++-------- src/vs/vscode.d.ts | 25 +++++------------- .../api/node/extHostTypeConverters.ts | 22 +++++++++++++++- src/vs/workbench/api/node/extHostTypes.ts | 26 +++---------------- 6 files changed, 68 insertions(+), 74 deletions(-) diff --git a/extensions/css-language-features/client/src/cssMain.ts b/extensions/css-language-features/client/src/cssMain.ts index 50e2e7a1b37..c587c0a5a87 100644 --- a/extensions/css-language-features/client/src/cssMain.ts +++ b/extensions/css-language-features/client/src/cssMain.ts @@ -10,7 +10,7 @@ const localize = nls.loadMessageBundle(); import { languages, window, commands, ExtensionContext, Range, Position, TextDocument, CompletionItem, CompletionItemKind, TextEdit, SnippetString, FoldingRangeKind, FoldingRange, FoldingContext, CancellationToken } from 'vscode'; import { LanguageClient, LanguageClientOptions, ServerOptions, TransportKind, Disposable } from 'vscode-languageclient'; -import { FoldingRangeRequest, FoldingRangeRequestParam, FoldingRangeClientCapabilities } from 'vscode-languageserver-protocol-foldingprovider'; +import { FoldingRangeRequest, FoldingRangeRequestParam, FoldingRangeClientCapabilities, FoldingRangeKind as LSFoldingRangeKind } from 'vscode-languageserver-protocol-foldingprovider'; // this method is called when vs code is activated export function activate(context: ExtensionContext) { @@ -124,17 +124,18 @@ export function activate(context: ExtensionContext) { } function initFoldingProvider(): Disposable { - const kinds: { [value: string]: FoldingRangeKind } = Object.create(null); - function getKind(value: string | undefined) { - if (!value) { - return void 0; + function getKind(kind: string | undefined): FoldingRangeKind | undefined { + if (kind) { + switch (kind) { + case LSFoldingRangeKind.Comment: + return FoldingRangeKind.Comment; + case LSFoldingRangeKind.Imports: + return FoldingRangeKind.Imports; + case LSFoldingRangeKind.Region: + return FoldingRangeKind.Region; + } } - let kind = kinds[value]; - if (!kind) { - kind = new FoldingRangeKind(value); - kinds[value] = kind; - } - return kind; + return void 0; } return languages.registerFoldingRangeProvider(documentSelector, { provideFoldingRanges(document: TextDocument, context: FoldingContext, token: CancellationToken) { diff --git a/extensions/html-language-features/client/src/htmlMain.ts b/extensions/html-language-features/client/src/htmlMain.ts index bf8fa07af2b..021a4aa625e 100644 --- a/extensions/html-language-features/client/src/htmlMain.ts +++ b/extensions/html-language-features/client/src/htmlMain.ts @@ -14,7 +14,7 @@ import { EMPTY_ELEMENTS } from './htmlEmptyTagsShared'; import { activateTagClosing } from './tagClosing'; import TelemetryReporter from 'vscode-extension-telemetry'; -import { FoldingRangeRequest, FoldingRangeRequestParam, FoldingRangeClientCapabilities } from 'vscode-languageserver-protocol-foldingprovider'; +import { FoldingRangeRequest, FoldingRangeRequestParam, FoldingRangeClientCapabilities, FoldingRangeKind as LSFoldingRangeKind } from 'vscode-languageserver-protocol-foldingprovider'; namespace TagCloseRequest { export const type: RequestType = new RequestType('html/tag'); @@ -181,17 +181,18 @@ export function activate(context: ExtensionContext) { }); function initFoldingProvider(): Disposable { - const kinds: { [value: string]: FoldingRangeKind } = Object.create(null); - function getKind(value: string | undefined) { - if (!value) { - return void 0; + function getKind(kind: string | undefined): FoldingRangeKind | undefined { + if (kind) { + switch (kind) { + case LSFoldingRangeKind.Comment: + return FoldingRangeKind.Comment; + case LSFoldingRangeKind.Imports: + return FoldingRangeKind.Imports; + case LSFoldingRangeKind.Region: + return FoldingRangeKind.Region; + } } - let kind = kinds[value]; - if (!kind) { - kind = new FoldingRangeKind(value); - kinds[value] = kind; - } - return kind; + return void 0; } return languages.registerFoldingRangeProvider(documentSelector, { provideFoldingRanges(document: TextDocument, context: FoldingContext, token: CancellationToken) { diff --git a/extensions/json-language-features/client/src/jsonMain.ts b/extensions/json-language-features/client/src/jsonMain.ts index 53c19c4c22f..2cd653dfa4b 100644 --- a/extensions/json-language-features/client/src/jsonMain.ts +++ b/extensions/json-language-features/client/src/jsonMain.ts @@ -12,7 +12,7 @@ import { workspace, languages, ExtensionContext, extensions, Uri, LanguageConfig import { LanguageClient, LanguageClientOptions, RequestType, ServerOptions, TransportKind, NotificationType, DidChangeConfigurationNotification, CancellationToken } from 'vscode-languageclient'; import TelemetryReporter from 'vscode-extension-telemetry'; -import { FoldingRangeRequest, FoldingRangeRequestParam, FoldingRangeClientCapabilities } from 'vscode-languageserver-protocol-foldingprovider'; +import { FoldingRangeRequest, FoldingRangeRequestParam, FoldingRangeClientCapabilities, FoldingRangeKind as LSFoldingRangeKind } from 'vscode-languageserver-protocol-foldingprovider'; import { hash } from './utils/hash'; @@ -156,17 +156,18 @@ export function activate(context: ExtensionContext) { languages.setLanguageConfiguration('jsonc', languageConfiguration); function initFoldingProvider(): Disposable { - const kinds: { [value: string]: FoldingRangeKind } = Object.create(null); - function getKind(value: string | undefined) { - if (!value) { - return void 0; + function getKind(kind: string | undefined): FoldingRangeKind | undefined { + if (kind) { + switch (kind) { + case LSFoldingRangeKind.Comment: + return FoldingRangeKind.Comment; + case LSFoldingRangeKind.Imports: + return FoldingRangeKind.Imports; + case LSFoldingRangeKind.Region: + return FoldingRangeKind.Region; + } } - let kind = kinds[value]; - if (!kind) { - kind = new FoldingRangeKind(value); - kinds[value] = kind; - } - return kind; + return void 0; } return languages.registerFoldingRangeProvider(documentSelector, { provideFoldingRanges(document: TextDocument, context: FoldingContext, token: CancellationToken) { diff --git a/src/vs/vscode.d.ts b/src/vs/vscode.d.ts index 4aea8f60dec..8647c19e7b6 100644 --- a/src/vs/vscode.d.ts +++ b/src/vs/vscode.d.ts @@ -3411,7 +3411,7 @@ declare module 'vscode' { * Describes the [Kind](#FoldingRangeKind) of the folding range such as [Comment](#FoldingRangeKind.Comment) or * [Region](#FoldingRangeKind.Region). The kind is used to categorize folding ranges and used by commands * like 'Fold all comments'. See - * [FoldingRangeKind](#FoldingRangeKind) for an enumeration of standardized kinds. + * [FoldingRangeKind](#FoldingRangeKind) for an enumeration of all kinds. */ kind?: FoldingRangeKind; @@ -3425,30 +3425,19 @@ declare module 'vscode' { constructor(start: number, end: number, kind?: FoldingRangeKind); } - export class FoldingRangeKind { + export enum FoldingRangeKind { /** - * Kind for folding range representing a comment. The value of the kind is 'comment'. + * Kind for folding range representing a comment. */ - static readonly Comment: FoldingRangeKind; + Comment = 1, /** - * Kind for folding range representing a import. The value of the kind is 'imports'. + * Kind for folding range representing a import. */ - static readonly Imports: FoldingRangeKind; + Imports = 2, /** * Kind for folding range representing regions (for example a folding range marked by `#region` and `#endregion`). - * The value of the kind is 'region'. */ - static readonly Region: FoldingRangeKind; - /** - * String value of the kind, e.g. `comment`. - */ - readonly value: string; - /** - * Creates a new [FoldingRangeKind](#FoldingRangeKind). - * - * @param value of the kind. - */ - public constructor(value: string); + Region = 3 } /** diff --git a/src/vs/workbench/api/node/extHostTypeConverters.ts b/src/vs/workbench/api/node/extHostTypeConverters.ts index 5c98f71fd82..149733b823a 100644 --- a/src/vs/workbench/api/node/extHostTypeConverters.ts +++ b/src/vs/workbench/api/node/extHostTypeConverters.ts @@ -625,7 +625,27 @@ export namespace ProgressLocation { export namespace FoldingRange { export function from(r: vscode.FoldingRange): modes.FoldingRange { - return { start: r.start + 1, end: r.end + 1, kind: r.kind }; + let range: modes.FoldingRange = { start: r.start + 1, end: r.end + 1 }; + if (r.kind) { + range.kind = FoldingRangeKind.from(r.kind); + } + return range; + } +} + +export namespace FoldingRangeKind { + export function from(kind: vscode.FoldingRangeKind | undefined): modes.FoldingRangeKind | undefined { + if (kind) { + switch (kind) { + case types.FoldingRangeKind.Comment: + return modes.FoldingRangeKind.Comment; + case types.FoldingRangeKind.Imports: + return modes.FoldingRangeKind.Imports; + case types.FoldingRangeKind.Region: + return modes.FoldingRangeKind.Region; + } + } + return void 0; } } diff --git a/src/vs/workbench/api/node/extHostTypes.ts b/src/vs/workbench/api/node/extHostTypes.ts index 1d84be94566..492ac346fb9 100644 --- a/src/vs/workbench/api/node/extHostTypes.ts +++ b/src/vs/workbench/api/node/extHostTypes.ts @@ -1912,28 +1912,10 @@ export class FoldingRange { } } -export class FoldingRangeKind { - /** - * Kind for folding range representing a comment. The value of the kind is 'comment'. - */ - static readonly Comment = new FoldingRangeKind('comment'); - /** - * Kind for folding range representing a import. The value of the kind is 'imports'. - */ - static readonly Imports = new FoldingRangeKind('imports'); - /** - * Kind for folding range representing regions (for example marked by `#region`, `#endregion`). - * The value of the kind is 'region'. - */ - static readonly Region = new FoldingRangeKind('region'); - - /** - * Creates a new [FoldingRangeKind](#FoldingRangeKind). - * - * @param value of the kind. - */ - public constructor(public value: string) { - } +export enum FoldingRangeKind { + Comment = 1, + Imports = 2, + Region = 3 } //#endregion From af7757fd673eaa677a3ddd90b7903ea16128a633 Mon Sep 17 00:00:00 2001 From: Johannes Rieken Date: Mon, 30 Apr 2018 18:14:17 +0200 Subject: [PATCH 243/830] debt - don't let strings-util depend on map-util --- src/vs/base/common/normalization.ts | 49 +++++++++++++++++++ src/vs/base/common/strings.ts | 43 ---------------- src/vs/base/node/extfs.ts | 17 ++++--- src/vs/base/test/node/extfs/extfs.test.ts | 16 +++--- src/vs/code/electron-main/windows.ts | 2 +- .../node/watcher/nsfw/nsfwWatcherService.ts | 2 +- .../watcher/unix/chokidarWatcherService.ts | 3 +- .../services/search/node/fileSearch.ts | 5 +- .../services/search/node/ripgrepFileSearch.ts | 5 +- 9 files changed, 76 insertions(+), 66 deletions(-) create mode 100644 src/vs/base/common/normalization.ts diff --git a/src/vs/base/common/normalization.ts b/src/vs/base/common/normalization.ts new file mode 100644 index 00000000000..c78aa4aba49 --- /dev/null +++ b/src/vs/base/common/normalization.ts @@ -0,0 +1,49 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +'use strict'; + +import { LRUCache } from 'vs/base/common/map'; + +/** + * The normalize() method returns the Unicode Normalization Form of a given string. The form will be + * the Normalization Form Canonical Composition. + * + * @see {@link https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/normalize} + */ +export const canNormalize = typeof (('').normalize) === 'function'; + +const nfcCache = new LRUCache(10000); // bounded to 10000 elements +export function normalizeNFC(str: string): string { + return normalize(str, 'NFC', nfcCache); +} + +const nfdCache = new LRUCache(10000); // bounded to 10000 elements +export function normalizeNFD(str: string): string { + return normalize(str, 'NFD', nfdCache); +} + +const nonAsciiCharactersPattern = /[^\u0000-\u0080]/; +function normalize(str: string, form: string, normalizedCache: LRUCache): string { + if (!canNormalize || !str) { + return str; + } + + const cached = normalizedCache.get(str); + if (cached) { + return cached; + } + + let res: string; + if (nonAsciiCharactersPattern.test(str)) { + res = (str).normalize(form); + } else { + res = str; + } + + // Use the cache for fast lookup + normalizedCache.set(str, res); + + return res; +} diff --git a/src/vs/base/common/strings.ts b/src/vs/base/common/strings.ts index deeb3ae1f99..ba293981009 100644 --- a/src/vs/base/common/strings.ts +++ b/src/vs/base/common/strings.ts @@ -4,7 +4,6 @@ *--------------------------------------------------------------------------------------------*/ 'use strict'; -import { LRUCache } from 'vs/base/common/map'; import { CharCode } from 'vs/base/common/charCode'; /** @@ -239,48 +238,6 @@ export function regExpContainsBackreference(regexpValue: string): boolean { return !!regexpValue.match(/([^\\]|^)(\\\\)*\\\d+/); } -/** - * The normalize() method returns the Unicode Normalization Form of a given string. The form will be - * the Normalization Form Canonical Composition. - * - * @see {@link https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/normalize} - */ -export const canNormalize = typeof (('').normalize) === 'function'; - -const nfcCache = new LRUCache(10000); // bounded to 10000 elements -export function normalizeNFC(str: string): string { - return normalize(str, 'NFC', nfcCache); -} - -const nfdCache = new LRUCache(10000); // bounded to 10000 elements -export function normalizeNFD(str: string): string { - return normalize(str, 'NFD', nfdCache); -} - -const nonAsciiCharactersPattern = /[^\u0000-\u0080]/; -function normalize(str: string, form: string, normalizedCache: LRUCache): string { - if (!canNormalize || !str) { - return str; - } - - const cached = normalizedCache.get(str); - if (cached) { - return cached; - } - - let res: string; - if (nonAsciiCharactersPattern.test(str)) { - res = (str).normalize(form); - } else { - res = str; - } - - // Use the cache for fast lookup - normalizedCache.set(str, res); - - return res; -} - /** * Returns first index of the string that is not whitespace. * If string is empty or contains only whitespaces, returns -1 diff --git a/src/vs/base/node/extfs.ts b/src/vs/base/node/extfs.ts index 82a1038af22..0dbc27ed24c 100644 --- a/src/vs/base/node/extfs.ts +++ b/src/vs/base/node/extfs.ts @@ -5,15 +5,16 @@ 'use strict'; -import * as uuid from 'vs/base/common/uuid'; -import * as strings from 'vs/base/common/strings'; -import * as platform from 'vs/base/common/platform'; -import * as flow from 'vs/base/node/flow'; import * as fs from 'fs'; import * as paths from 'path'; -import { TPromise } from 'vs/base/common/winjs.base'; import { nfcall } from 'vs/base/common/async'; +import { normalizeNFC } from 'vs/base/common/normalization'; +import * as platform from 'vs/base/common/platform'; +import * as strings from 'vs/base/common/strings'; +import * as uuid from 'vs/base/common/uuid'; +import { TPromise } from 'vs/base/common/winjs.base'; import { encode, encodeStream } from 'vs/base/node/encoding'; +import * as flow from 'vs/base/node/flow'; const loop = flow.loop; @@ -21,7 +22,7 @@ export function readdirSync(path: string): string[] { // Mac: uses NFD unicode form on disk, but we want NFC // See also https://github.com/nodejs/node/issues/2165 if (platform.isMacintosh) { - return fs.readdirSync(path).map(c => strings.normalizeNFC(c)); + return fs.readdirSync(path).map(c => normalizeNFC(c)); } return fs.readdirSync(path); @@ -36,7 +37,7 @@ export function readdir(path: string, callback: (error: Error, files: string[]) return callback(error, null); } - return callback(null, children.map(c => strings.normalizeNFC(c))); + return callback(null, children.map(c => normalizeNFC(c))); }); } @@ -630,7 +631,7 @@ export function watch(path: string, onChange: (type: string, path: string) => vo if (platform.isMacintosh) { // Mac: uses NFD unicode form on disk, but we want NFC // See also https://github.com/nodejs/node/issues/2165 - file = strings.normalizeNFC(file); + file = normalizeNFC(file); } } diff --git a/src/vs/base/test/node/extfs/extfs.test.ts b/src/vs/base/test/node/extfs/extfs.test.ts index 5df24aa3f3a..d5a363f2b5c 100644 --- a/src/vs/base/test/node/extfs/extfs.test.ts +++ b/src/vs/base/test/node/extfs/extfs.test.ts @@ -6,16 +6,16 @@ 'use strict'; import * as assert from 'assert'; -import * as os from 'os'; - -import * as path from 'path'; import * as fs from 'fs'; - -import * as uuid from 'vs/base/common/uuid'; -import * as strings from 'vs/base/common/strings'; -import * as extfs from 'vs/base/node/extfs'; +import * as os from 'os'; +import * as path from 'path'; import { Readable } from 'stream'; +import { canNormalize } from 'vs/base/common/normalization'; import { isLinux, isWindows } from 'vs/base/common/platform'; +import * as uuid from 'vs/base/common/uuid'; +import * as extfs from 'vs/base/node/extfs'; + + const ignore = () => { }; @@ -224,7 +224,7 @@ suite('Extfs', () => { }); test('readdir', function (done) { - if (strings.canNormalize && typeof process.versions['electron'] !== 'undefined' /* needs electron */) { + if (canNormalize && typeof process.versions['electron'] !== 'undefined' /* needs electron */) { const id = uuid.generateUuid(); const parentDir = path.join(os.tmpdir(), 'vsctests', id); const newDir = path.join(parentDir, 'extfs', id, 'öäü'); diff --git a/src/vs/code/electron-main/windows.ts b/src/vs/code/electron-main/windows.ts index 8f15684a41f..f30d8844211 100644 --- a/src/vs/code/electron-main/windows.ts +++ b/src/vs/code/electron-main/windows.ts @@ -33,7 +33,7 @@ import { IWorkspacesMainService, IWorkspaceIdentifier, ISingleFolderWorkspaceIde import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation'; import { mnemonicButtonLabel } from 'vs/base/common/labels'; import { Schemas } from 'vs/base/common/network'; -import { normalizeNFC } from 'vs/base/common/strings'; +import { normalizeNFC } from 'vs/base/common/normalization'; import URI from 'vs/base/common/uri'; import { Queue } from 'vs/base/common/async'; import { exists } from 'vs/base/node/pfs'; diff --git a/src/vs/workbench/services/files/node/watcher/nsfw/nsfwWatcherService.ts b/src/vs/workbench/services/files/node/watcher/nsfw/nsfwWatcherService.ts index 5e73b6cbaeb..b11e518b965 100644 --- a/src/vs/workbench/services/files/node/watcher/nsfw/nsfwWatcherService.ts +++ b/src/vs/workbench/services/files/node/watcher/nsfw/nsfwWatcherService.ts @@ -13,7 +13,7 @@ import { IWatcherService, IWatcherRequest } from 'vs/workbench/services/files/no import { TPromise, ProgressCallback, TValueCallback, ErrorCallback } from 'vs/base/common/winjs.base'; import { ThrottledDelayer } from 'vs/base/common/async'; import { FileChangeType } from 'vs/platform/files/common/files'; -import { normalizeNFC } from 'vs/base/common/strings'; +import { normalizeNFC } from 'vs/base/common/normalization'; const nsfwActionToRawChangeType: { [key: number]: number } = []; nsfwActionToRawChangeType[nsfw.actions.CREATED] = FileChangeType.ADDED; diff --git a/src/vs/workbench/services/files/node/watcher/unix/chokidarWatcherService.ts b/src/vs/workbench/services/files/node/watcher/unix/chokidarWatcherService.ts index 175ef1a62ec..fc92f0581cb 100644 --- a/src/vs/workbench/services/files/node/watcher/unix/chokidarWatcherService.ts +++ b/src/vs/workbench/services/files/node/watcher/unix/chokidarWatcherService.ts @@ -15,6 +15,7 @@ import { TPromise } from 'vs/base/common/winjs.base'; import { FileChangeType } from 'vs/platform/files/common/files'; import { ThrottledDelayer } from 'vs/base/common/async'; import * as strings from 'vs/base/common/strings'; +import { normalizeNFC } from 'vs/base/common/normalization'; import { realcaseSync } from 'vs/base/node/extfs'; import { isMacintosh } from 'vs/base/common/platform'; import * as watcher from 'vs/workbench/services/files/node/watcher/common'; @@ -74,7 +75,7 @@ export class ChokidarWatcherService implements IWatcherService { if (isMacintosh) { // Mac: uses NFD unicode form on disk, but we want NFC // See also https://github.com/nodejs/node/issues/2165 - path = strings.normalizeNFC(path); + path = normalizeNFC(path); } if (path.indexOf(realBasePath) < 0) { diff --git a/src/vs/workbench/services/search/node/fileSearch.ts b/src/vs/workbench/services/search/node/fileSearch.ts index b8efdf24433..6e5b4a853ce 100644 --- a/src/vs/workbench/services/search/node/fileSearch.ts +++ b/src/vs/workbench/services/search/node/fileSearch.ts @@ -18,6 +18,7 @@ import * as objects from 'vs/base/common/objects'; import * as arrays from 'vs/base/common/arrays'; import * as platform from 'vs/base/common/platform'; import * as strings from 'vs/base/common/strings'; +import * as normalization from 'vs/base/common/normalization'; import * as types from 'vs/base/common/types'; import * as glob from 'vs/base/common/glob'; import { IProgress, IUncachedSearchStats } from 'vs/platform/search/common/search'; @@ -255,7 +256,7 @@ export class FileWalker { } // Mac: uses NFD unicode form on disk, but we want NFC - const normalized = leftover + (isMac ? strings.normalizeNFC(stdout) : stdout); + const normalized = leftover + (isMac ? normalization.normalizeNFC(stdout) : stdout); const relativeFiles = normalized.split(useRipgrep ? '\n' : '\n./'); if (!useRipgrep && first && normalized.length >= 2) { first = false; @@ -820,4 +821,4 @@ class AbsoluteAndRelativeParsedExpression { return pathTerms; } -} \ No newline at end of file +} diff --git a/src/vs/workbench/services/search/node/ripgrepFileSearch.ts b/src/vs/workbench/services/search/node/ripgrepFileSearch.ts index 323ad7940ea..e3fa4591f8c 100644 --- a/src/vs/workbench/services/search/node/ripgrepFileSearch.ts +++ b/src/vs/workbench/services/search/node/ripgrepFileSearch.ts @@ -8,7 +8,8 @@ import { rgPath } from 'vscode-ripgrep'; import { isMacintosh as isMac } from 'vs/base/common/platform'; import * as glob from 'vs/base/common/glob'; -import { normalizeNFD, startsWith } from 'vs/base/common/strings'; +import { startsWith } from 'vs/base/common/strings'; +import { normalizeNFD } from 'vs/base/common/normalization'; import { IFolderSearch, IRawSearch } from './search'; import { foldersToIncludeGlobs, foldersToRgExcludeGlobs } from './ripgrepTextSearch'; @@ -83,4 +84,4 @@ function getRgArgs(config: IRawSearch, folderQuery: IFolderSearch, includePatter function anchor(glob: string) { return startsWith(glob, '**') || startsWith(glob, '/') ? glob : `/${glob}`; -} \ No newline at end of file +} From 9d8c8f4c33d1b34d40021e25ebcd5adea92cf0fb Mon Sep 17 00:00:00 2001 From: Martin Aeschlimann Date: Mon, 30 Apr 2018 18:38:53 +0200 Subject: [PATCH 244/830] Improve registerFoldingRangeProvider doc (for #48526) --- src/vs/vscode.d.ts | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/src/vs/vscode.d.ts b/src/vs/vscode.d.ts index 8647c19e7b6..637db4d6f06 100644 --- a/src/vs/vscode.d.ts +++ b/src/vs/vscode.d.ts @@ -6899,13 +6899,16 @@ declare module 'vscode' { /** * Register a folding range provider. * - * Multiple folding can be registered for a language. In that case providers are sorted - * by their [score](#languages.match) and the best-matching provider is used. Failure - * of the selected provider will cause a failure of the whole operation. + * 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. - * @param metadata Metadata about the kind of code actions the provider providers. * @return A [disposable](#Disposable) that unregisters this provider when being disposed. */ export function registerFoldingRangeProvider(selector: DocumentSelector, provider: FoldingRangeProvider): Disposable; From b42cc7f929fc594b6a08f5abc7319c07ce828eb8 Mon Sep 17 00:00:00 2001 From: Ramya Achutha Rao Date: Mon, 30 Apr 2018 10:09:37 -0700 Subject: [PATCH 245/830] Add GDPR annotation back for property that are relevenat for older versions of the product --- .../extensionManagement/node/extensionManagementService.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/src/vs/platform/extensionManagement/node/extensionManagementService.ts b/src/vs/platform/extensionManagement/node/extensionManagementService.ts index 61eb637d98c..8dacc38fcf8 100644 --- a/src/vs/platform/extensionManagement/node/extensionManagementService.ts +++ b/src/vs/platform/extensionManagement/node/extensionManagementService.ts @@ -876,6 +876,7 @@ export class ExtensionManagementService extends Disposable implements IExtension "success": { "classification": "SystemMetaData", "purpose": "PerformanceAndHealth", "isMeasurement": true }, "duration" : { "classification": "SystemMetaData", "purpose": "PerformanceAndHealth", "isMeasurement": true }, "errorcode": { "classification": "CallstackOrException", "purpose": "PerformanceAndHealth" }, + "recommendationReason": { "retiredFromVersion": "1.23.0", "classification": "SystemMetaData", "purpose": "FeatureInsight", "isMeasurement": true }, "${include}": [ "${GalleryExtensionTelemetryData}" ] From 6ed74d7736d91295f20b1717347336467047bd25 Mon Sep 17 00:00:00 2001 From: Erich Gamma Date: Mon, 30 Apr 2018 19:23:17 +0200 Subject: [PATCH 246/830] Show message when no scripts were found --- extensions/npm/src/npmView.ts | 20 ++++++++++++++++++-- extensions/npm/src/tasks.ts | 2 +- 2 files changed, 19 insertions(+), 3 deletions(-) diff --git a/extensions/npm/src/npmView.ts b/extensions/npm/src/npmView.ts index 2df1e9a8b16..3e3c3743cbd 100644 --- a/extensions/npm/src/npmView.ts +++ b/extensions/npm/src/npmView.ts @@ -90,8 +90,15 @@ class NpmScript extends TreeItem { } } +class NoScripts extends TreeItem { + constructor() { + super(localize('noScripts', 'No scripts found'), TreeItemCollapsibleState.None); + this.contextValue = 'noscripts'; + } +} + export class NpmScriptsTreeDataProvider implements TreeDataProvider { - private taskTree: Folder[] | PackageJSON[] | null = null; + private taskTree: Folder[] | PackageJSON[] | NoScripts[] | null = null; private extensionContext: ExtensionContext; private _onDidChangeTreeData: EventEmitter = new EventEmitter(); readonly onDidChangeTreeData: Event = this._onDidChangeTreeData.event; @@ -263,6 +270,9 @@ export class NpmScriptsTreeDataProvider implements TreeDataProvider { if (element instanceof NpmScript) { return element.package; } + if (element instanceof NoScripts) { + return null; + } return null; } @@ -271,6 +281,9 @@ export class NpmScriptsTreeDataProvider implements TreeDataProvider { let tasks = await workspace.fetchTasks({ type: 'npm' }); if (tasks) { this.taskTree = this.buildTaskTree(tasks); + if (this.taskTree.length === 0) { + this.taskTree = [new NoScripts()]; + } } } if (element instanceof Folder) { @@ -282,6 +295,9 @@ export class NpmScriptsTreeDataProvider implements TreeDataProvider { if (element instanceof NpmScript) { return []; } + if (element instanceof NoScripts) { + return []; + } if (!element) { if (this.taskTree) { return this.taskTree; @@ -290,7 +306,7 @@ export class NpmScriptsTreeDataProvider implements TreeDataProvider { return []; } - private buildTaskTree(tasks: Task[]): Folder[] | PackageJSON[] { + private buildTaskTree(tasks: Task[]): Folder[] | PackageJSON[] | NoScripts[] { let folders: Map = new Map(); let packages: Map = new Map(); diff --git a/extensions/npm/src/tasks.ts b/extensions/npm/src/tasks.ts index 9256d54579c..7c730addbfe 100644 --- a/extensions/npm/src/tasks.ts +++ b/extensions/npm/src/tasks.ts @@ -245,7 +245,7 @@ async function findAllScripts(buffer: string): Promise { let visitor: JSONVisitor = { onError(_error: ParseErrorCode, _offset: number, _length: number) { - // TODO inform user about the parse error + // TODO: inform user about the parse error }, onObjectEnd() { if (inScripts) { From c94f12ed3487ad1121fe96090f6fd8658917d1e2 Mon Sep 17 00:00:00 2001 From: Erich Gamma Date: Mon, 30 Apr 2018 19:43:54 +0200 Subject: [PATCH 247/830] switch to use config context key over manual context definition. --- extensions/npm/package.json | 5 ++--- extensions/npm/src/main.ts | 12 ++---------- extensions/npm/src/tasks.ts | 14 -------------- 3 files changed, 4 insertions(+), 27 deletions(-) diff --git a/extensions/npm/package.json b/extensions/npm/package.json index 0f30a0a9301..93e144a2bb8 100644 --- a/extensions/npm/package.json +++ b/extensions/npm/package.json @@ -30,8 +30,7 @@ "activationEvents": [ "onCommand:workbench.action.tasks.runTask", "onLanguage:json", - "onView:npm", - "workspaceContains:package.json" + "onView:npm" ], "contributes": { "views": { @@ -39,7 +38,7 @@ { "id": "npm", "name": "%view.name%", - "when": "showExplorer" + "when": "config.npm.enableScriptExplorer" } ] }, diff --git a/extensions/npm/src/main.ts b/extensions/npm/src/main.ts index 8eda53a9441..0e716dfb6bd 100644 --- a/extensions/npm/src/main.ts +++ b/extensions/npm/src/main.ts @@ -9,7 +9,7 @@ import * as vscode from 'vscode'; import { addJSONProviders } from './features/jsonContributions'; import { NpmScriptsTreeDataProvider } from './npmView'; -import { provideNpmScripts, explorerIsEnabled } from './tasks'; +import { provideNpmScripts } from './tasks'; let taskProvider: vscode.Disposable | undefined; @@ -17,11 +17,8 @@ export async function activate(context: vscode.ExtensionContext): Promise taskProvider = registerTaskProvider(context); registerExplorer(context); configureHttpRequest(); - vscode.workspace.onDidChangeConfiguration((e) => { + vscode.workspace.onDidChangeConfiguration(() => { configureHttpRequest(); - if (e.affectsConfiguration('npm.enableScriptExplorer')) { - updateExplorerVisibility(); - } }); context.subscriptions.push(addJSONProviders(httpRequest.xhr)); } @@ -53,15 +50,10 @@ function registerTaskProvider(context: vscode.ExtensionContext): vscode.Disposab return undefined; } -function updateExplorerVisibility() { - vscode.commands.executeCommand('setContext', 'showExplorer', explorerIsEnabled()); -} - async function registerExplorer(context: vscode.ExtensionContext) { if (vscode.workspace.workspaceFolders) { let treeDataProvider = vscode.window.registerTreeDataProvider('npm', new NpmScriptsTreeDataProvider(context)); context.subscriptions.push(treeDataProvider); - updateExplorerVisibility(); } } diff --git a/extensions/npm/src/tasks.ts b/extensions/npm/src/tasks.ts index 7c730addbfe..c88e4a2cfcc 100644 --- a/extensions/npm/src/tasks.ts +++ b/extensions/npm/src/tasks.ts @@ -52,20 +52,6 @@ export function getPackageManager(folder: WorkspaceFolder): string { return workspace.getConfiguration('npm', folder.uri).get('packageManager', 'npm'); } -export function explorerIsEnabled(): boolean { - let folders = workspace.workspaceFolders; - if (!folders) { - return false; - } - for (let i = 0; i < folders.length; i++) { - let folder = folders[i]; - if (workspace.getConfiguration('npm', folder.uri).get('enableScriptExplorer') === true) { - return true; - } - } - return false; -} - export async function hasNpmScripts(): Promise { let folders = workspace.workspaceFolders; if (!folders) { From 6dae5a3bf9bb20e356a18837690d1ddb07b7f5af Mon Sep 17 00:00:00 2001 From: Matt Bierner Date: Mon, 30 Apr 2018 12:03:53 -0700 Subject: [PATCH 248/830] Fix rendering of whitespace in markdown parameter hinds Fixes #48758 --- src/vs/editor/contrib/parameterHints/parameterHints.css | 2 +- src/vs/editor/contrib/parameterHints/parameterHintsWidget.ts | 5 +++-- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/src/vs/editor/contrib/parameterHints/parameterHints.css b/src/vs/editor/contrib/parameterHints/parameterHints.css index 2f89fb1658c..348a23bc732 100644 --- a/src/vs/editor/contrib/parameterHints/parameterHints.css +++ b/src/vs/editor/contrib/parameterHints/parameterHints.css @@ -48,7 +48,7 @@ white-space: pre-wrap; } -.monaco-editor .parameter-hints-widget .docs.markdown-docs { +.monaco-editor .parameter-hints-widget .docs .markdown-docs { white-space: initial; } diff --git a/src/vs/editor/contrib/parameterHints/parameterHintsWidget.ts b/src/vs/editor/contrib/parameterHints/parameterHintsWidget.ts index 6dc6bb6e29c..ee73f0453ac 100644 --- a/src/vs/editor/contrib/parameterHints/parameterHintsWidget.ts +++ b/src/vs/editor/contrib/parameterHints/parameterHintsWidget.ts @@ -359,15 +359,15 @@ export class ParameterHintsWidget implements IContentWidget, IDisposable { this.renderDisposeables = []; const activeParameter = signature.parameters[this.hints.activeParameter]; + dom.removeClass(this.docs, 'markdown-docs'); if (activeParameter && activeParameter.documentation) { const documentation = $('span.documentation'); if (typeof activeParameter.documentation === 'string') { - dom.removeClass(this.docs, 'markdown-docs'); documentation.textContent = activeParameter.documentation; } else { - dom.addClass(this.docs, 'markdown-docs'); const renderedContents = this.markdownRenderer.render(activeParameter.documentation); + dom.addClass(renderedContents.element, 'markdown-docs'); this.renderDisposeables.push(renderedContents); documentation.appendChild(renderedContents.element); } @@ -380,6 +380,7 @@ export class ParameterHintsWidget implements IContentWidget, IDisposable { dom.append(this.docs, $('p', null, signature.documentation)); } else { const renderedContents = this.markdownRenderer.render(signature.documentation); + dom.addClass(renderedContents.element, 'markdown-docs'); this.renderDisposeables.push(renderedContents); dom.append(this.docs, renderedContents.element); } From 9d6d1464c4e5f9e9ec15641d1e0673b3a488cc43 Mon Sep 17 00:00:00 2001 From: Matt Bierner Date: Mon, 30 Apr 2018 12:04:15 -0700 Subject: [PATCH 249/830] Make sure we treat jsdocs sig help as markdown --- .../src/features/signatureHelpProvider.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/extensions/typescript-language-features/src/features/signatureHelpProvider.ts b/extensions/typescript-language-features/src/features/signatureHelpProvider.ts index f23de59d5d6..7787b49e98c 100644 --- a/extensions/typescript-language-features/src/features/signatureHelpProvider.ts +++ b/extensions/typescript-language-features/src/features/signatureHelpProvider.ts @@ -50,7 +50,7 @@ export default class TypeScriptSignatureHelpProvider implements SignatureHelpPro item.parameters.forEach((p, i, a) => { const parameter = new ParameterInformation( Previewer.plain(p.displayParts), - Previewer.plain(p.documentation)); + Previewer.markdownDocumentation(p.documentation, [])); signature.label += parameter.label; signature.parameters.push(parameter); From ab86b9ad5d3450db47498e1b7088973fb4ab8c5e Mon Sep 17 00:00:00 2001 From: Matt Bierner Date: Mon, 30 Apr 2018 12:07:03 -0700 Subject: [PATCH 250/830] Don't need to remove class that is never set --- src/vs/editor/contrib/parameterHints/parameterHintsWidget.ts | 1 - 1 file changed, 1 deletion(-) diff --git a/src/vs/editor/contrib/parameterHints/parameterHintsWidget.ts b/src/vs/editor/contrib/parameterHints/parameterHintsWidget.ts index ee73f0453ac..5909d92af0e 100644 --- a/src/vs/editor/contrib/parameterHints/parameterHintsWidget.ts +++ b/src/vs/editor/contrib/parameterHints/parameterHintsWidget.ts @@ -359,7 +359,6 @@ export class ParameterHintsWidget implements IContentWidget, IDisposable { this.renderDisposeables = []; const activeParameter = signature.parameters[this.hints.activeParameter]; - dom.removeClass(this.docs, 'markdown-docs'); if (activeParameter && activeParameter.documentation) { const documentation = $('span.documentation'); From a32ca17c385fbe2af3bf6da44578364d8b0d833b Mon Sep 17 00:00:00 2001 From: Matt Bierner Date: Mon, 30 Apr 2018 12:52:17 -0700 Subject: [PATCH 251/830] Don't include param tags in js signature help provider Fixes #48231 --- .../src/features/signatureHelpProvider.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/extensions/typescript-language-features/src/features/signatureHelpProvider.ts b/extensions/typescript-language-features/src/features/signatureHelpProvider.ts index 7787b49e98c..8bd9cbfe4a3 100644 --- a/extensions/typescript-language-features/src/features/signatureHelpProvider.ts +++ b/extensions/typescript-language-features/src/features/signatureHelpProvider.ts @@ -59,7 +59,7 @@ export default class TypeScriptSignatureHelpProvider implements SignatureHelpPro } }); signature.label += Previewer.plain(item.suffixDisplayParts); - signature.documentation = Previewer.markdownDocumentation(item.documentation, item.tags); + signature.documentation = Previewer.markdownDocumentation(item.documentation, item.tags.filter(x => x.name !== 'param')); result.signatures.push(signature); }); From 94145d3d170f5a6d574733c9c3e8fd4311a28301 Mon Sep 17 00:00:00 2001 From: Daniel Imms Date: Mon, 30 Apr 2018 13:49:56 -0700 Subject: [PATCH 252/830] Fix terminal layout in dev mode --- .../parts/terminal/electron-browser/terminalInstance.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/vs/workbench/parts/terminal/electron-browser/terminalInstance.ts b/src/vs/workbench/parts/terminal/electron-browser/terminalInstance.ts index 039eb1e3560..e90284ad14f 100644 --- a/src/vs/workbench/parts/terminal/electron-browser/terminalInstance.ts +++ b/src/vs/workbench/parts/terminal/electron-browser/terminalInstance.ts @@ -155,7 +155,7 @@ export class TerminalInstance implements ITerminalInstance { return; } - const computedStyle = window.getComputedStyle(this._container); + const computedStyle = window.getComputedStyle(this._container.parentElement); const width = parseInt(computedStyle.getPropertyValue('width').replace('px', ''), 10); const height = parseInt(computedStyle.getPropertyValue('height').replace('px', ''), 10); this._evaluateColsAndRows(width, height); @@ -541,7 +541,7 @@ export class TerminalInstance implements ITerminalInstance { // for ensuring that terminals that are created in the background by an extension will // correctly get correct character measurements in order to render to the screen (see // #34554). - const computedStyle = window.getComputedStyle(this._container); + const computedStyle = window.getComputedStyle(this._container.parentElement); const width = parseInt(computedStyle.getPropertyValue('width').replace('px', ''), 10); const height = parseInt(computedStyle.getPropertyValue('height').replace('px', ''), 10); this.layout(new dom.Dimension(width, height)); From 0387727447ed4b0b7d8dba9a50a5bda41e4c0058 Mon Sep 17 00:00:00 2001 From: Matt Bierner Date: Mon, 30 Apr 2018 14:20:04 -0700 Subject: [PATCH 253/830] Fix a spell --- src/vs/editor/contrib/hover/modesContentHover.ts | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/vs/editor/contrib/hover/modesContentHover.ts b/src/vs/editor/contrib/hover/modesContentHover.ts index 36b6e611927..dca672abdbb 100644 --- a/src/vs/editor/contrib/hover/modesContentHover.ts +++ b/src/vs/editor/contrib/hover/modesContentHover.ts @@ -172,7 +172,7 @@ export class ModesContentHoverWidget extends ContentHoverWidget { constructor( editor: ICodeEditor, - markdownRenderner: MarkdownRenderer, + markdownRenderer: MarkdownRenderer, private readonly _themeService: IThemeService ) { super(ModesContentHoverWidget.ID, editor); @@ -181,8 +181,8 @@ export class ModesContentHoverWidget extends ContentHoverWidget { this._highlightDecorations = []; this._isChangingDecorations = false; - this._markdownRenderer = markdownRenderner; - markdownRenderner.onDidRenderCodeBlock(this.onContentsChange, this, this.toDispose); + this._markdownRenderer = markdownRenderer; + markdownRenderer.onDidRenderCodeBlock(this.onContentsChange, this, this.toDispose); this._hoverOperation = new HoverOperation( this._computer, From a287dcd89e38485c42b45186268b22791b797922 Mon Sep 17 00:00:00 2001 From: Matt Bierner Date: Mon, 30 Apr 2018 14:20:23 -0700 Subject: [PATCH 254/830] Fix suggest widget sometimes being cut off if it contains a code block Fixes #48395 --- src/vs/editor/contrib/suggest/suggestWidget.ts | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/vs/editor/contrib/suggest/suggestWidget.ts b/src/vs/editor/contrib/suggest/suggestWidget.ts index 2551ccfaee2..633b9a48899 100644 --- a/src/vs/editor/contrib/suggest/suggestWidget.ts +++ b/src/vs/editor/contrib/suggest/suggestWidget.ts @@ -234,6 +234,8 @@ class SuggestionDetails { chain(this.editor.onDidChangeConfiguration.bind(this.editor)) .filter(e => e.fontInfo) .on(this.configureFont, this, this.disposables); + + markdownRenderer.onDidRenderCodeBlock(() => this.scrollbar.scanDomNode(), this, this.disposables); } get element() { From 3f53efa597abb2c1e0045234bb282fea1f6fd6a3 Mon Sep 17 00:00:00 2001 From: Rachel Macfarlane Date: Mon, 30 Apr 2018 14:55:00 -0700 Subject: [PATCH 255/830] Show window title as part of process name in process explorer, fixes #48626 --- .../processExplorer/processExplorerMain.ts | 46 +++++++++++++------ .../issue/electron-main/issueService.ts | 6 +++ 2 files changed, 39 insertions(+), 13 deletions(-) diff --git a/src/vs/code/electron-browser/processExplorer/processExplorerMain.ts b/src/vs/code/electron-browser/processExplorer/processExplorerMain.ts index 55f2e4826ef..44a876e22a7 100644 --- a/src/vs/code/electron-browser/processExplorer/processExplorerMain.ts +++ b/src/vs/code/electron-browser/processExplorer/processExplorerMain.ts @@ -7,7 +7,7 @@ import 'vs/css!./media/processExplorer'; import { listProcesses, ProcessItem } from 'vs/base/node/ps'; -import { remote, webFrame } from 'electron'; +import { remote, webFrame, ipcRenderer } from 'electron'; import { repeat } from 'vs/base/common/strings'; import { totalmem } from 'os'; import product from 'vs/platform/node/product'; @@ -17,6 +17,7 @@ import * as browser from 'vs/base/browser/browser'; import * as platform from 'vs/base/common/platform'; let processList: any[]; +let mapPidToWindowTitle = new Map(); function getProcessList(rootProcess: ProcessItem) { const processes: any[] = []; @@ -33,8 +34,17 @@ function getProcessItem(processes: any[], item: ProcessItem, indent: number): vo const MB = 1024 * 1024; + let name = item.name; + if (isRoot) { + name = `${product.applicationName} main`; + } + + if (name === 'window') { + const windowTitle = mapPidToWindowTitle.get(item.pid); + name = windowTitle !== undefined ? `${name} (${mapPidToWindowTitle.get(item.pid)})` : name; + } + // Format name with indent - const name = isRoot ? `${product.applicationName} main` : item.name; const formattedName = isRoot ? name : `${repeat(' ', indent)} ${name}`; const memory = process.platform === 'win32' ? item.mem : (totalmem() * (item.mem / 100)); processes.push({ @@ -154,18 +164,28 @@ export function startup(data: ProcessExplorerData): void { applyStyles(data.styles); applyZoom(data.zoomLevel); - setInterval(() => listProcesses(remote.process.pid).then(processes => { - processList = getProcessList(processes); - updateProcessInfo(processList); + // Map window process pids to titles, annotate process names with this when rendering to distinguish between them + ipcRenderer.on('windowsInfoResponse', (event, windows) => { + mapPidToWindowTitle = new Map(); + windows.forEach(window => mapPidToWindowTitle.set(window.pid, window.title)); + }); - const tableRows = document.getElementsByTagName('tr'); - for (let i = 0; i < tableRows.length; i++) { - const tableRow = tableRows[i]; - tableRow.addEventListener('contextmenu', (e) => { - showContextMenu(e); - }); - } - }), 1200); + setInterval(() => { + ipcRenderer.send('windowsInfoRequest'); + + listProcesses(remote.process.pid).then(processes => { + processList = getProcessList(processes); + updateProcessInfo(processList); + + const tableRows = document.getElementsByTagName('tr'); + for (let i = 0; i < tableRows.length; i++) { + const tableRow = tableRows[i]; + tableRow.addEventListener('contextmenu', (e) => { + showContextMenu(e); + }); + } + }); + }, 1200); document.onkeydown = (e: KeyboardEvent) => { diff --git a/src/vs/platform/issue/electron-main/issueService.ts b/src/vs/platform/issue/electron-main/issueService.ts index 1d589bf8f16..d8eceb42c92 100644 --- a/src/vs/platform/issue/electron-main/issueService.ts +++ b/src/vs/platform/issue/electron-main/issueService.ts @@ -75,6 +75,12 @@ export class IssueService implements IIssueService { } openProcessExplorer(data: ProcessExplorerData): TPromise { + ipcMain.on('windowsInfoRequest', event => { + this.launchService.getMainProcessInfo().then(info => { + event.sender.send('windowsInfoResponse', info.windows); + }); + }); + // Create as singleton if (!this._processExplorerWindow) { const position = this.getWindowPosition(BrowserWindow.getFocusedWindow(), 800, 300); From 8077bd07fc71b1898b33623444aa64c34202688b Mon Sep 17 00:00:00 2001 From: Matt Bierner Date: Mon, 30 Apr 2018 15:04:31 -0700 Subject: [PATCH 256/830] Use arrow functions --- .../webview/electron-browser/webview-pre.js | 60 ++++++++++--------- 1 file changed, 31 insertions(+), 29 deletions(-) diff --git a/src/vs/workbench/parts/webview/electron-browser/webview-pre.js b/src/vs/workbench/parts/webview/electron-browser/webview-pre.js index ec3e2db0a2b..fd362c29239 100644 --- a/src/vs/workbench/parts/webview/electron-browser/webview-pre.js +++ b/src/vs/workbench/parts/webview/electron-browser/webview-pre.js @@ -9,7 +9,6 @@ // @ts-ignore const ipcRenderer = require('electron').ipcRenderer; - const registerVscodeResourceScheme = (function () { let hasRegistered = false; return () => { @@ -40,26 +39,29 @@ initialScrollProgress: undefined }; - function styleBody(body) { + /** + * @param {HTMLElement} body + */ + const styleBody = (body) => { if (!body) { return; } body.classList.remove('vscode-light', 'vscode-dark', 'vscode-high-contrast'); body.classList.add(initData.activeTheme); - } + }; - function getActiveFrame() { + const getActiveFrame = () => { return /** @type {HTMLIFrameElement} */ (document.getElementById('active-frame')); - } + }; - function getPendingFrame() { + const getPendingFrame = () => { return /** @type {HTMLIFrameElement} */ (document.getElementById('pending-frame')); - } + }; /** * @param {MouseEvent} event */ - function handleInnerClick(event) { + const handleInnerClick = (event) => { if (!event || !event.view || !event.view.document) { return; } @@ -84,9 +86,9 @@ } node = node.parentNode; } - } + }; - function onMessage(message) { + const onMessage = (message) => { if (enableWrappedPostMessage) { // Modern webview. Forward wrapped message ipcRenderer.sendToHost('onmessage', message.data); @@ -94,10 +96,10 @@ // Old school webview. Forward exact message ipcRenderer.sendToHost(message.data.command, message.data.data); } - } + }; var isHandlingScroll = false; - function handleInnerScroll(event) { + const handleInnerScroll = (event) => { if (isHandlingScroll) { return; } @@ -108,7 +110,7 @@ } isHandlingScroll = true; - window.requestAnimationFrame(function () { + window.requestAnimationFrame(() => { try { ipcRenderer.sendToHost('did-scroll', progress); } catch (e) { @@ -116,14 +118,14 @@ } isHandlingScroll = false; }); - } + }; - document.addEventListener('DOMContentLoaded', function () { - ipcRenderer.on('baseUrl', function (event, value) { + document.addEventListener('DOMContentLoaded', () => { + ipcRenderer.on('baseUrl', (event, value) => { initData.baseUrl = value; }); - ipcRenderer.on('styles', function (event, variables, activeTheme) { + ipcRenderer.on('styles', (event, variables, activeTheme) => { initData.styles = variables; initData.activeTheme = activeTheme; @@ -136,13 +138,13 @@ styleBody(body[0]); // iframe - Object.keys(variables).forEach(function (variable) { + Object.keys(variables).forEach((variable) => { target.contentDocument.documentElement.style.setProperty(`--${variable}`, variables[variable]); }); }); // propagate focus - ipcRenderer.on('focus', function () { + ipcRenderer.on('focus', () => { const target = getActiveFrame(); if (target) { target.contentWindow.focus(); @@ -150,7 +152,7 @@ }); // update iframe-contents - ipcRenderer.on('content', function (_event, data) { + ipcRenderer.on('content', (_event, data) => { const options = data.options; enableWrappedPostMessage = options && options.enableWrappedPostMessage; @@ -210,7 +212,7 @@ const defaultStyles = newDocument.createElement('style'); defaultStyles.id = '_defaultStyles'; - const vars = Object.keys(initData.styles || {}).map(function (variable) { + const vars = Object.keys(initData.styles || {}).map(variable => { return `--${variable}: ${initData.styles[variable]};`; }); defaultStyles.innerHTML = ` @@ -291,7 +293,7 @@ var setInitialScrollPosition; if (firstLoad) { firstLoad = false; - setInitialScrollPosition = function (body) { + setInitialScrollPosition = (body) => { if (!isNaN(initData.initialScrollProgress)) { if (body.scrollTop === 0) { body.scrollTop = body.clientHeight * initData.initialScrollProgress; @@ -300,7 +302,7 @@ }; } else { const scrollY = frame && frame.contentDocument && frame.contentDocument.body ? frame.contentDocument.body.scrollTop : 0; - setInitialScrollPosition = function (body) { + setInitialScrollPosition = (body) => { if (body.scrollTop === 0) { body.scrollTop = scrollY; } @@ -324,12 +326,12 @@ // write new content onto iframe newFrame.contentDocument.open('text/html', 'replace'); - newFrame.contentWindow.onbeforeunload = function () { + newFrame.contentWindow.onbeforeunload = () => { console.log('prevented webview navigation'); return false; }; - var onLoad = function (contentDocument, contentWindow) { + var onLoad = (contentDocument, contentWindow) => { if (contentDocument.body) { // Workaround for https://github.com/Microsoft/vscode/issues/12865 // check new scrollTop and reset if neccessary @@ -349,7 +351,7 @@ newFrame.style.visibility = 'visible'; contentWindow.addEventListener('scroll', handleInnerScroll); - pendingMessages.forEach(function (data) { + pendingMessages.forEach((data) => { contentWindow.postMessage(data, '*'); }); pendingMessages = []; @@ -358,7 +360,7 @@ clearTimeout(loadTimeout); loadTimeout = undefined; - loadTimeout = setTimeout(function () { + loadTimeout = setTimeout(() => { clearTimeout(loadTimeout); loadTimeout = undefined; onLoad(newFrame.contentDocument, newFrame.contentWindow); @@ -382,7 +384,7 @@ }); // Forward message to the embedded iframe - ipcRenderer.on('message', function (event, data) { + ipcRenderer.on('message', (event, data) => { const pending = getPendingFrame(); if (pending) { pendingMessages.push(data); @@ -394,7 +396,7 @@ } }); - ipcRenderer.on('initial-scroll-position', function (event, progress) { + ipcRenderer.on('initial-scroll-position', (event, progress) => { initData.initialScrollProgress = progress; }); From 730eb4e560d201fd13902a13dfd962b94b174e15 Mon Sep 17 00:00:00 2001 From: Matt Bierner Date: Mon, 30 Apr 2018 15:10:45 -0700 Subject: [PATCH 257/830] Remove onmessage wrapper --- .../parts/webview/electron-browser/webview-pre.js | 11 +++-------- 1 file changed, 3 insertions(+), 8 deletions(-) diff --git a/src/vs/workbench/parts/webview/electron-browser/webview-pre.js b/src/vs/workbench/parts/webview/electron-browser/webview-pre.js index fd362c29239..f9ea3f84a4c 100644 --- a/src/vs/workbench/parts/webview/electron-browser/webview-pre.js +++ b/src/vs/workbench/parts/webview/electron-browser/webview-pre.js @@ -89,13 +89,8 @@ }; const onMessage = (message) => { - if (enableWrappedPostMessage) { - // Modern webview. Forward wrapped message - ipcRenderer.sendToHost('onmessage', message.data); - } else { - // Old school webview. Forward exact message - ipcRenderer.sendToHost(message.data.command, message.data.data); - } + // Old school webview. Forward exact message + ipcRenderer.sendToHost(message.data.command, message.data.data); }; var isHandlingScroll = false; @@ -191,7 +186,7 @@ acquired = true; return Object.freeze({ postMessage: function(msg) { - return originalPostMessage(msg, '*'); + return originalPostMessage({ command: 'onmessage', data: msg }, '*'); } }); }; From eab96df4c031238ce00c6a7e602e4195f0f51c09 Mon Sep 17 00:00:00 2001 From: Matt Bierner Date: Mon, 30 Apr 2018 15:41:46 -0700 Subject: [PATCH 258/830] Allow cmr+r reload from webview developer tools Fixes #48975 --- .../parts/webview/electron-browser/webview-pre.js | 12 +++++++++++- .../parts/webview/electron-browser/webviewElement.ts | 9 ++++++++- 2 files changed, 19 insertions(+), 2 deletions(-) diff --git a/src/vs/workbench/parts/webview/electron-browser/webview-pre.js b/src/vs/workbench/parts/webview/electron-browser/webview-pre.js index f9ea3f84a4c..5179663f513 100644 --- a/src/vs/workbench/parts/webview/electron-browser/webview-pre.js +++ b/src/vs/workbench/parts/webview/electron-browser/webview-pre.js @@ -34,6 +34,7 @@ var loadTimeout; var pendingMessages = []; var enableWrappedPostMessage = false; + let isInDevelopmentMode = false; const initData = { initialScrollProgress: undefined @@ -89,7 +90,6 @@ }; const onMessage = (message) => { - // Old school webview. Forward exact message ipcRenderer.sendToHost(message.data.command, message.data.data); }; @@ -322,6 +322,12 @@ // write new content onto iframe newFrame.contentDocument.open('text/html', 'replace'); newFrame.contentWindow.onbeforeunload = () => { + if (isInDevelopmentMode) { // Allow reloads while developing a webview + ipcRenderer.sendToHost('do-reload'); + return false; + } + + // Block navigation when not in development mode console.log('prevented webview navigation'); return false; }; @@ -395,6 +401,10 @@ initData.initialScrollProgress = progress; }); + ipcRenderer.on('devtools-opened', () => { + isInDevelopmentMode = true; + }); + // Forward messages from the embedded iframe window.onmessage = onMessage; diff --git a/src/vs/workbench/parts/webview/electron-browser/webviewElement.ts b/src/vs/workbench/parts/webview/electron-browser/webviewElement.ts index 7a7836459dd..0b647c86f38 100644 --- a/src/vs/workbench/parts/webview/electron-browser/webviewElement.ts +++ b/src/vs/workbench/parts/webview/electron-browser/webviewElement.ts @@ -158,6 +158,10 @@ export class WebviewElement { this._onDidScroll.fire({ scrollYPercentage: event.args[0] }); } return; + + case 'do-reload': + this.reload(); + return; } }), addDisposableListener(this._webview, 'focus', () => { @@ -169,7 +173,10 @@ export class WebviewElement { if (this._contextKey) { this._contextKey.reset(); } - }) + }), + addDisposableListener(this._webview, 'devtools-opened', () => { + this._send('devtools-opened'); + }), ); this._webviewFindWidget = new WebviewFindWidget(this._contextViewService, this); From ffb8d045a6a142dc43496e24a90eb437152d1308 Mon Sep 17 00:00:00 2001 From: Matt Bierner Date: Mon, 30 Apr 2018 16:56:36 -0700 Subject: [PATCH 259/830] Add support for TS trigger characters Fixes #25034 --- .../src/features/completionItemProvider.ts | 10 +++++++--- .../src/languageProvider.ts | 5 +++-- .../typescript-language-features/src/utils/api.ts | 5 +++++ 3 files changed, 15 insertions(+), 5 deletions(-) diff --git a/extensions/typescript-language-features/src/features/completionItemProvider.ts b/extensions/typescript-language-features/src/features/completionItemProvider.ts index 803342d7ffa..c7f191c2f28 100644 --- a/extensions/typescript-language-features/src/features/completionItemProvider.ts +++ b/extensions/typescript-language-features/src/features/completionItemProvider.ts @@ -242,6 +242,9 @@ namespace CompletionConfiguration { } export default class TypeScriptCompletionItemProvider implements vscode.CompletionItemProvider { + + public static readonly triggerCharacters = ['.', '"', '\'', '/', '@']; + constructor( private readonly client: ITypeScriptServiceClient, private readonly typingsStatus: TypingsStatus, @@ -279,10 +282,11 @@ export default class TypeScriptCompletionItemProvider implements vscode.Completi return []; } - const args: Proto.CompletionsRequestArgs = { + const args: Proto.CompletionsRequestArgs & { triggerCharacter?: string } = { ...typeConverters.Position.toFileLocationRequestArgs(file, position), includeExternalModuleExports: completionConfiguration.autoImportSuggestions, - includeInsertTextCompletions: true + includeInsertTextCompletions: true, + triggerCharacter: context.triggerCharacter }; let msg: Proto.CompletionEntry[] | undefined = undefined; @@ -437,7 +441,7 @@ export default class TypeScriptCompletionItemProvider implements vscode.Completi line: vscode.TextLine, position: vscode.Position ): boolean { - if (context.triggerCharacter === '"' || context.triggerCharacter === '\'') { + if ((context.triggerCharacter === '"' || context.triggerCharacter === '\'') && !this.client.apiVersion.has290Features()) { if (!config.quickSuggestionsForPaths) { return false; } diff --git a/extensions/typescript-language-features/src/languageProvider.ts b/extensions/typescript-language-features/src/languageProvider.ts index b2cdbf56456..cb5bee33845 100644 --- a/extensions/typescript-language-features/src/languageProvider.ts +++ b/extensions/typescript-language-features/src/languageProvider.ts @@ -92,9 +92,10 @@ export default class LanguageProvider { const selector = this.documentSelector; const config = workspace.getConfiguration(this.id); + const TypeScriptCompletionItemProvider = (await import('./features/completionItemProvider')).default; this.disposables.push(languages.registerCompletionItemProvider(selector, - new (await import('./features/completionItemProvider')).default(client, typingsStatus, commandManager), - '.', '"', '\'', '/', '@')); + new TypeScriptCompletionItemProvider(client, typingsStatus, commandManager), + ...TypeScriptCompletionItemProvider.triggerCharacters)); this.disposables.push(languages.registerCompletionItemProvider(selector, new (await import('./features/directiveCommentCompletionProvider')).default(client), '@')); diff --git a/extensions/typescript-language-features/src/utils/api.ts b/extensions/typescript-language-features/src/utils/api.ts index 7dadfd840f1..344687f4f54 100644 --- a/extensions/typescript-language-features/src/utils/api.ts +++ b/extensions/typescript-language-features/src/utils/api.ts @@ -101,4 +101,9 @@ export default class API { public has280Features(): boolean { return semver.gte(this.version, '2.8.0'); } + + @memoize + public has290Features(): boolean { + return semver.gte(this.version, '2.9.0'); + } } \ No newline at end of file From 9f16378b2fe402c2bb1681c5c095f3c1da944d9d Mon Sep 17 00:00:00 2001 From: Matt Bierner Date: Mon, 30 Apr 2018 17:02:22 -0700 Subject: [PATCH 260/830] Trigger completions on < inside jsx Fixes #40539 --- .../src/features/completionItemProvider.ts | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/extensions/typescript-language-features/src/features/completionItemProvider.ts b/extensions/typescript-language-features/src/features/completionItemProvider.ts index c7f191c2f28..c8127d9e0f2 100644 --- a/extensions/typescript-language-features/src/features/completionItemProvider.ts +++ b/extensions/typescript-language-features/src/features/completionItemProvider.ts @@ -243,7 +243,7 @@ namespace CompletionConfiguration { export default class TypeScriptCompletionItemProvider implements vscode.CompletionItemProvider { - public static readonly triggerCharacters = ['.', '"', '\'', '/', '@']; + public static readonly triggerCharacters = ['.', '"', '\'', '/', '@', '<']; constructor( private readonly client: ITypeScriptServiceClient, @@ -473,6 +473,10 @@ export default class TypeScriptCompletionItemProvider implements vscode.Completi } } + if (context.triggerCharacter === '<') { + return this.client.apiVersion.has290Features(); + } + return true; } From a4c3e747482ca895fddd097978e57ec3726806d9 Mon Sep 17 00:00:00 2001 From: Matt Bierner Date: Mon, 30 Apr 2018 17:08:53 -0700 Subject: [PATCH 261/830] Auto trigger suggest on jsdoc parameter names Fixes #48976 --- extensions/javascript/package.json | 6 ++++-- extensions/typescript-basics/package.json | 6 ++++-- 2 files changed, 8 insertions(+), 4 deletions(-) diff --git a/extensions/javascript/package.json b/extensions/javascript/package.json index 066091d7c84..c60988f88fe 100644 --- a/extensions/javascript/package.json +++ b/extensions/javascript/package.json @@ -62,7 +62,8 @@ "tokenTypes": { "entity.name.type.instance.jsdoc": "other", "entity.name.function.tagged-template": "other", - "meta.import string.quoted": "other" + "meta.import string.quoted": "other", + "variable.other.jsdoc": "other" } }, { @@ -78,7 +79,8 @@ "tokenTypes": { "entity.name.type.instance.jsdoc": "other", "entity.name.function.tagged-template": "other", - "meta.import string.quoted": "other" + "meta.import string.quoted": "other", + "variable.other.jsdoc": "other" } }, { diff --git a/extensions/typescript-basics/package.json b/extensions/typescript-basics/package.json index 870b3e7fa81..94bec747159 100644 --- a/extensions/typescript-basics/package.json +++ b/extensions/typescript-basics/package.json @@ -46,7 +46,8 @@ "tokenTypes": { "entity.name.type.instance.jsdoc": "other", "entity.name.function.tagged-template": "other", - "meta.import string.quoted": "other" + "meta.import string.quoted": "other", + "variable.other.jsdoc": "other" } }, { @@ -62,7 +63,8 @@ "tokenTypes": { "entity.name.type.instance.jsdoc": "other", "entity.name.function.tagged-template": "other", - "meta.import string.quoted": "other" + "meta.import string.quoted": "other", + "variable.other.jsdoc": "other" } } ], From 0d584a908611a819db0167c26028419cd08830d6 Mon Sep 17 00:00:00 2001 From: Matt Bierner Date: Mon, 30 Apr 2018 17:30:44 -0700 Subject: [PATCH 262/830] Allow open preview from markdown file title context menu Part of #37045 --- extensions/markdown-language-features/package.json | 7 +++++++ .../markdown-language-features/src/commands/showPreview.ts | 2 +- 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/extensions/markdown-language-features/package.json b/extensions/markdown-language-features/package.json index 491dfe08393..963da6581ec 100644 --- a/extensions/markdown-language-features/package.json +++ b/extensions/markdown-language-features/package.json @@ -115,6 +115,13 @@ "group": "navigation" } ], + "editor/title/context": [ + { + "command": "markdown.showPreview", + "when": "resourceLangId == markdown", + "group": "navigation" + } + ], "commandPalette": [ { "command": "markdown.showPreview", diff --git a/extensions/markdown-language-features/src/commands/showPreview.ts b/extensions/markdown-language-features/src/commands/showPreview.ts index 69efb7fcb1a..c522c2b5ddc 100644 --- a/extensions/markdown-language-features/src/commands/showPreview.ts +++ b/extensions/markdown-language-features/src/commands/showPreview.ts @@ -80,7 +80,7 @@ export class ShowPreviewCommand implements Command { ) { } public execute(mainUri?: vscode.Uri, allUris?: vscode.Uri[], previewSettings?: PreviewSettings) { - for (const uri of (allUris || [mainUri])) { + for (const uri of Array.isArray(allUris) ? allUris : [mainUri]) { showPreview(this.webviewManager, this.telemetryReporter, uri, { sideBySide: false, locked: previewSettings && previewSettings.locked From 55a10f77e8e2fa5ba816366f6928131a02a6992a Mon Sep 17 00:00:00 2001 From: Matt Bierner Date: Mon, 30 Apr 2018 18:18:05 -0700 Subject: [PATCH 263/830] Don't try creating a new synced buffer if we already have one Possibly https://github.com/Microsoft/TypeScript/issues/23502 --- .../src/features/bufferSyncSupport.ts | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/extensions/typescript-language-features/src/features/bufferSyncSupport.ts b/extensions/typescript-language-features/src/features/bufferSyncSupport.ts index 105663f14e4..bdd33e3a7c9 100644 --- a/extensions/typescript-language-features/src/features/bufferSyncSupport.ts +++ b/extensions/typescript-language-features/src/features/bufferSyncSupport.ts @@ -206,6 +206,11 @@ export default class BufferSyncSupport { if (!filepath) { return; } + + if (this.syncedBuffers.has(resource)) { + return; + } + const syncedBuffer = new SyncedBuffer(document, filepath, this, this.client); this.syncedBuffers.set(resource, syncedBuffer); syncedBuffer.open(); From bdf1a40b44f4f5c613e4d2e1021a3bb8f4f5a9c7 Mon Sep 17 00:00:00 2001 From: Cherry Wang Date: Mon, 30 Apr 2018 21:28:36 -0700 Subject: [PATCH 264/830] Made unverified breakpoint icons thicker --- .../debug/browser/media/breakpoint-function-unverified.svg | 2 +- .../parts/debug/browser/media/breakpoint-log-unverified.svg | 2 +- .../parts/debug/browser/media/breakpoint-unverified.svg | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/vs/workbench/parts/debug/browser/media/breakpoint-function-unverified.svg b/src/vs/workbench/parts/debug/browser/media/breakpoint-function-unverified.svg index b97b5cf9d91..fcca2092ccb 100755 --- a/src/vs/workbench/parts/debug/browser/media/breakpoint-function-unverified.svg +++ b/src/vs/workbench/parts/debug/browser/media/breakpoint-function-unverified.svg @@ -1 +1 @@ -breakpoint-function-unverified \ No newline at end of file +breakpoint-function-unverified \ No newline at end of file diff --git a/src/vs/workbench/parts/debug/browser/media/breakpoint-log-unverified.svg b/src/vs/workbench/parts/debug/browser/media/breakpoint-log-unverified.svg index 534c1f762f3..31aede64f86 100644 --- a/src/vs/workbench/parts/debug/browser/media/breakpoint-log-unverified.svg +++ b/src/vs/workbench/parts/debug/browser/media/breakpoint-log-unverified.svg @@ -1 +1 @@ -breakpoint-log-unverified \ No newline at end of file +breakpoint-log-unverified \ No newline at end of file diff --git a/src/vs/workbench/parts/debug/browser/media/breakpoint-unverified.svg b/src/vs/workbench/parts/debug/browser/media/breakpoint-unverified.svg index a625db104b1..a4eadba7cd8 100644 --- a/src/vs/workbench/parts/debug/browser/media/breakpoint-unverified.svg +++ b/src/vs/workbench/parts/debug/browser/media/breakpoint-unverified.svg @@ -1 +1 @@ -breakpoint-unverified \ No newline at end of file +breakpoint-unverified \ No newline at end of file From 3e7c371e8b91fbb45b7caebee315c9d56616d9dd Mon Sep 17 00:00:00 2001 From: Shiva Prasanth Date: Tue, 1 May 2018 17:46:01 +0530 Subject: [PATCH 265/830] search results copy All with sort like tree --- .../parts/search/browser/searchActions.ts | 29 +++++++++++++++---- .../parts/search/browser/searchResultsView.ts | 23 ++------------- .../parts/search/browser/searchView.ts | 6 ++-- .../search/test/browser/searchViewlet.test.ts | 3 +- 4 files changed, 31 insertions(+), 30 deletions(-) diff --git a/src/vs/workbench/parts/search/browser/searchActions.ts b/src/vs/workbench/parts/search/browser/searchActions.ts index 68239c9a31e..7fd95ea2c72 100644 --- a/src/vs/workbench/parts/search/browser/searchActions.ts +++ b/src/vs/workbench/parts/search/browser/searchActions.ts @@ -8,10 +8,11 @@ import * as DOM from 'vs/base/browser/dom'; import { TPromise } from 'vs/base/common/winjs.base'; import { Action } from 'vs/base/common/actions'; import { IViewletService } from 'vs/workbench/services/viewlet/browser/viewlet'; -import { ITree } from 'vs/base/parts/tree/browser/tree'; +import { ITree, ISorter } from 'vs/base/parts/tree/browser/tree'; import { INavigator } from 'vs/base/common/iterator'; import { SearchView } from 'vs/workbench/parts/search/browser/searchView'; import { Match, FileMatch, FileMatchOrMatch, FolderMatch, RenderableMatch, SearchResult } from 'vs/workbench/parts/search/common/searchModel'; +import { Range } from 'vs/editor/common/core/range'; import { IReplaceService } from 'vs/workbench/parts/search/common/replace'; import * as Constants from 'vs/workbench/parts/search/common/constants'; import { IWorkbenchEditorService } from 'vs/workbench/services/editor/common/editorService'; @@ -717,7 +718,6 @@ function fileMatchToString(fileMatch: FileMatch, maxMatches: number): { text: st .slice(0, maxMatches) .map(matchToString) .map(matchText => ' ' + matchText); - return { text: `${uriToClipboardString(fileMatch.resource())}${lineDelimiter}${matchTextRows.join(lineDelimiter)}`, count: matchTextRows.length @@ -728,8 +728,11 @@ function folderMatchToString(folderMatch: FolderMatch, maxMatches: number): { te const fileResults: string[] = []; let numMatches = 0; + let sorter = new SearchSorter(); + let matches = folderMatch.matches().sort((matchA, matchB) => sorter.compare(null, matchA, matchB)); + for (let i = 0; i < folderMatch.fileCount() && numMatches < maxMatches; i++) { - const fileResult = fileMatchToString(folderMatch.matches()[i], maxMatches - numMatches); + const fileResult = fileMatchToString(matches[i], maxMatches - numMatches); numMatches += fileResult.count; fileResults.push(fileResult.text); } @@ -758,10 +761,26 @@ export const copyMatchCommand: ICommandHandler = (accessor, match: RenderableMat } }; +export class SearchSorter implements ISorter { + public compare(tree: ITree, elementA: FileMatchOrMatch, elementB: FileMatchOrMatch): number { + if (elementA instanceof FolderMatch && elementB instanceof FolderMatch) { + return elementA.index() - elementB.index(); + } + + if (elementA instanceof FileMatch && elementB instanceof FileMatch) { + return elementA.resource().fsPath.localeCompare(elementB.resource().fsPath) || elementA.name().localeCompare(elementB.name()); + } + + if (elementA instanceof Match && elementB instanceof Match) { + return Range.compareRangesUsingStarts(elementA.range(), elementB.range()); + } + return undefined; + } +} + function allFolderMatchesToString(folderMatches: FolderMatch[], maxMatches: number): string { const folderResults: string[] = []; let numMatches = 0; - for (let i = 0; i < folderMatches.length && numMatches < maxMatches; i++) { const folderResult = folderMatchToString(folderMatches[i], maxMatches - numMatches); if (folderResult.count) { @@ -791,4 +810,4 @@ export const clearHistoryCommand: ICommandHandler = accessor => { const searchView = getSearchView(viewletService, panelService); searchView.clearHistory(); -}; +}; \ No newline at end of file diff --git a/src/vs/workbench/parts/search/browser/searchResultsView.ts b/src/vs/workbench/parts/search/browser/searchResultsView.ts index c8bbca11130..dc487558e3d 100644 --- a/src/vs/workbench/parts/search/browser/searchResultsView.ts +++ b/src/vs/workbench/parts/search/browser/searchResultsView.ts @@ -12,10 +12,9 @@ import { IAction, IActionRunner } from 'vs/base/common/actions'; import { ActionBar } from 'vs/base/browser/ui/actionbar/actionbar'; import { CountBadge } from 'vs/base/browser/ui/countBadge/countBadge'; import { FileLabel } from 'vs/workbench/browser/labels'; -import { ITree, IDataSource, ISorter, IAccessibilityProvider, IFilter, IRenderer, ContextMenuEvent } from 'vs/base/parts/tree/browser/tree'; +import { ITree, IDataSource, IAccessibilityProvider, IFilter, IRenderer, ContextMenuEvent } from 'vs/base/parts/tree/browser/tree'; import { Match, SearchResult, FileMatch, FileMatchOrMatch, SearchModel, FolderMatch } from 'vs/workbench/parts/search/common/searchModel'; import { IWorkspaceContextService, WorkbenchState } from 'vs/platform/workspace/common/workspace'; -import { Range } from 'vs/editor/common/core/range'; import { SearchView } from 'vs/workbench/parts/search/browser/searchView'; import { RemoveAction, ReplaceAllAction, ReplaceAction, ReplaceAllInFolderAction } from 'vs/workbench/parts/search/browser/searchActions'; import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation'; @@ -111,24 +110,6 @@ export class SearchDataSource implements IDataSource { } } -export class SearchSorter implements ISorter { - - public compare(tree: ITree, elementA: FileMatchOrMatch, elementB: FileMatchOrMatch): number { - if (elementA instanceof FolderMatch && elementB instanceof FolderMatch) { - return elementA.index() - elementB.index(); - } - - if (elementA instanceof FileMatch && elementB instanceof FileMatch) { - return elementA.resource().fsPath.localeCompare(elementB.resource().fsPath) || elementA.name().localeCompare(elementB.name()); - } - - if (elementA instanceof Match && elementB instanceof Match) { - return Range.compareRangesUsingStarts(elementA.range(), elementB.range()); - } - - return undefined; - } -} interface IFolderMatchTemplate { label: FileLabel; @@ -395,4 +376,4 @@ export class SearchTreeController extends WorkbenchTreeController { return true; } -} +} \ No newline at end of file diff --git a/src/vs/workbench/parts/search/browser/searchView.ts b/src/vs/workbench/parts/search/browser/searchView.ts index 3b61bb35014..0dc24a0cf55 100644 --- a/src/vs/workbench/parts/search/browser/searchView.ts +++ b/src/vs/workbench/parts/search/browser/searchView.ts @@ -41,9 +41,9 @@ import { IContextKeyService, IContextKey } from 'vs/platform/contextkey/common/c import { ITelemetryService } from 'vs/platform/telemetry/common/telemetry'; import { KeyCode } from 'vs/base/common/keyCodes'; import { PatternInputWidget, ExcludePatternInputWidget } from 'vs/workbench/parts/search/browser/patternInputWidget'; -import { SearchRenderer, SearchDataSource, SearchSorter, SearchAccessibilityProvider, SearchFilter, SearchTreeController } from 'vs/workbench/parts/search/browser/searchResultsView'; +import { SearchRenderer, SearchDataSource, SearchAccessibilityProvider, SearchFilter, SearchTreeController } from 'vs/workbench/parts/search/browser/searchResultsView'; import { SearchWidget, ISearchWidgetOptions } from 'vs/workbench/parts/search/browser/searchWidget'; -import { RefreshAction, CollapseDeepestExpandedLevelAction, ClearSearchResultsAction, CancelSearchAction } from 'vs/workbench/parts/search/browser/searchActions'; +import { SearchSorter, RefreshAction, CollapseDeepestExpandedLevelAction, ClearSearchResultsAction, CancelSearchAction } from 'vs/workbench/parts/search/browser/searchActions'; import { IReplaceService } from 'vs/workbench/parts/search/common/replace'; import { IUntitledEditorService } from 'vs/workbench/services/untitled/common/untitledEditorService'; import { OpenFolderAction, OpenFileFolderAction } from 'vs/workbench/browser/actions/workspaceActions'; @@ -1585,4 +1585,4 @@ registerThemingParticipant((theme: ITheme, collector: ICssStyleCollector) => { if (findMatchHighlightBorder) { collector.addRule(`.monaco-workbench .search-view .findInFileMatch { border: 1px ${theme.type === 'hc' ? 'dashed' : 'solid'} ${findMatchHighlightBorder}; }`); } -}); +}); \ No newline at end of file diff --git a/src/vs/workbench/parts/search/test/browser/searchViewlet.test.ts b/src/vs/workbench/parts/search/test/browser/searchViewlet.test.ts index f30f81170d3..097c7c7312c 100644 --- a/src/vs/workbench/parts/search/test/browser/searchViewlet.test.ts +++ b/src/vs/workbench/parts/search/test/browser/searchViewlet.test.ts @@ -8,7 +8,8 @@ import * as assert from 'assert'; import uri from 'vs/base/common/uri'; import { Match, FileMatch, SearchResult } from 'vs/workbench/parts/search/common/searchModel'; import { TestInstantiationService } from 'vs/platform/instantiation/test/common/instantiationServiceMock'; -import { SearchSorter, SearchDataSource } from 'vs/workbench/parts/search/browser/searchResultsView'; +import { SearchSorter } from 'vs/workbench/parts/search/browser/searchActions'; +import { SearchDataSource } from 'vs/workbench/parts/search/browser/searchResultsView'; import { IFileMatch, ILineMatch } from 'vs/platform/search/common/search'; import { IConfigurationService } from 'vs/platform/configuration/common/configuration'; import { TestConfigurationService } from 'vs/platform/configuration/test/common/testConfigurationService'; From fdaf90dbff4b5a1bd567c4c2a91d6ac8e79ee654 Mon Sep 17 00:00:00 2001 From: Joao Moreno Date: Tue, 1 May 2018 17:50:36 +0200 Subject: [PATCH 266/830] continuous build: stop windows on first error --- build/tfs/continuous-build.yml | 20 +++++++++++--------- 1 file changed, 11 insertions(+), 9 deletions(-) diff --git a/build/tfs/continuous-build.yml b/build/tfs/continuous-build.yml index 107c7ff9cdd..ce75c843323 100644 --- a/build/tfs/continuous-build.yml +++ b/build/tfs/continuous-build.yml @@ -9,19 +9,21 @@ phases: inputs: versionSpec: "1.3.2" - powershell: | + function exec([scriptblock]$cmd, [string]$errorMessage = "Error executing command: " + $cmd) { & $cmd; if ($LastExitCode -ne 0) { throw $errorMessage } } $ErrorActionPreference = "Stop" - yarn - .\node_modules\.bin\gulp electron - npm run gulp -- hygiene - .\node_modules\.bin\tsc -p .\src\tsconfig.monaco.json --noEmit - npm run compile - node build/lib/builtInExtensions.js + exec { & yarn } + exec { & .\node_modules\.bin\gulp electron } + exec { & npm run gulp -- hygiene } + exec { & .\node_modules\.bin\tsc -p .\src\tsconfig.monaco.json --noEmit } + exec { & npm run compile } + exec { & node build/lib/builtInExtensions.js } name: build - powershell: | + function exec([scriptblock]$cmd, [string]$errorMessage = "Error executing command: " + $cmd) { & $cmd; if ($LastExitCode -ne 0) { throw $errorMessage } } $ErrorActionPreference = "Stop" - .\scripts\test.bat --tfs - .\scripts\test-integration.bat - yarn smoketest --screenshots "$(Build.ArtifactStagingDirectory)\artifacts" --log "$(Build.ArtifactStagingDirectory)\artifacts\smoketest.log" + exec { & .\scripts\test.bat --tfs } + exec { & .\scripts\test-integration.bat } + exec { & yarn smoketest --screenshots "$(Build.ArtifactStagingDirectory)\artifacts" --log "$(Build.ArtifactStagingDirectory)\artifacts\smoketest.log" } name: test - task: PublishBuildArtifacts@1 inputs: From 2c7cea2d37ba07d6c7fe3ce856d29007562f184d Mon Sep 17 00:00:00 2001 From: Matt Bierner Date: Tue, 1 May 2018 10:13:39 -0700 Subject: [PATCH 267/830] Use TS 2.8.3 for building vscode --- build/package.json | 2 +- build/yarn.lock | 6 +++--- package.json | 2 +- yarn.lock | 6 +++--- 4 files changed, 8 insertions(+), 8 deletions(-) diff --git a/build/package.json b/build/package.json index ade3af750cb..a224242b6e7 100644 --- a/build/package.json +++ b/build/package.json @@ -14,7 +14,7 @@ "documentdb": "1.13.0", "mime": "^1.3.4", "minimist": "^1.2.0", - "typescript": "2.8.1", + "typescript": "2.8.3", "xml2js": "^0.4.17", "github-releases": "^0.4.1", "request": "^2.85.0" diff --git a/build/yarn.lock b/build/yarn.lock index 59bb057c34d..69ed0de667d 100644 --- a/build/yarn.lock +++ b/build/yarn.lock @@ -652,9 +652,9 @@ tweetnacl@^0.14.3, tweetnacl@~0.14.0: version "0.14.5" resolved "https://registry.yarnpkg.com/tweetnacl/-/tweetnacl-0.14.5.tgz#5ae68177f192d4456269d108afa93ff8743f4f64" -typescript@2.8.1: - version "2.8.1" - resolved "https://registry.yarnpkg.com/typescript/-/typescript-2.8.1.tgz#6160e4f8f195d5ba81d4876f9c0cc1fbc0820624" +typescript@2.8.3: + version "2.8.3" + resolved "https://registry.yarnpkg.com/typescript/-/typescript-2.8.3.tgz#5d817f9b6f31bb871835f4edf0089f21abe6c170" underscore@1.8.3, underscore@~1.8.3: version "1.8.3" diff --git a/package.json b/package.json index 7f782a0c057..c88e26c0bd1 100644 --- a/package.json +++ b/package.json @@ -113,7 +113,7 @@ "sinon": "^1.17.2", "source-map": "^0.4.4", "tslint": "^5.9.1", - "typescript": "2.8.1", + "typescript": "2.8.3", "typescript-formatter": "7.1.0", "uglify-es": "^3.0.18", "underscore": "^1.8.2", diff --git a/yarn.lock b/yarn.lock index 3cddadb8ef0..1561c65a684 100644 --- a/yarn.lock +++ b/yarn.lock @@ -5643,9 +5643,9 @@ typescript-formatter@7.1.0: commandpost "^1.0.0" editorconfig "^0.15.0" -typescript@2.8.1: - version "2.8.1" - resolved "https://registry.yarnpkg.com/typescript/-/typescript-2.8.1.tgz#6160e4f8f195d5ba81d4876f9c0cc1fbc0820624" +typescript@2.8.3: + version "2.8.3" + resolved "https://registry.yarnpkg.com/typescript/-/typescript-2.8.3.tgz#5d817f9b6f31bb871835f4edf0089f21abe6c170" typescript@^2.6.2: version "2.6.2" From ba1fda8b86891766b7a08648239f8654fe912071 Mon Sep 17 00:00:00 2001 From: Matt Bierner Date: Tue, 1 May 2018 10:39:18 -0700 Subject: [PATCH 268/830] Always cancel parameter hints when document changes Fixes #48237 --- src/vs/editor/contrib/parameterHints/parameterHintsWidget.ts | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/src/vs/editor/contrib/parameterHints/parameterHintsWidget.ts b/src/vs/editor/contrib/parameterHints/parameterHintsWidget.ts index 5909d92af0e..d6dd252f9f9 100644 --- a/src/vs/editor/contrib/parameterHints/parameterHintsWidget.ts +++ b/src/vs/editor/contrib/parameterHints/parameterHintsWidget.ts @@ -125,9 +125,8 @@ export class ParameterHintsModel extends Disposable { } private onModelChanged(): void { - if (this.active) { - this.cancel(); - } + this.cancel(); + this.triggerCharactersListeners = dispose(this.triggerCharactersListeners); const model = this.editor.getModel(); From 245155d1614ce3cec37738c984369b8b03c4c32f Mon Sep 17 00:00:00 2001 From: Matt Bierner Date: Tue, 1 May 2018 10:43:36 -0700 Subject: [PATCH 269/830] Make sure we have a model Fixes #47549 --- src/vs/editor/contrib/codeAction/lightBulbWidget.ts | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/vs/editor/contrib/codeAction/lightBulbWidget.ts b/src/vs/editor/contrib/codeAction/lightBulbWidget.ts index 07578f4a121..61e18dd6bde 100644 --- a/src/vs/editor/contrib/codeAction/lightBulbWidget.ts +++ b/src/vs/editor/contrib/codeAction/lightBulbWidget.ts @@ -144,6 +144,10 @@ export class LightBulbWidget implements IDisposable, IContentWidget { } const { lineNumber } = this._model.position; const model = this._editor.getModel(); + if (!model) { + return; + } + const tabSize = model.getOptions().tabSize; const lineContent = model.getLineContent(lineNumber); const indent = TextModel.computeIndentLevel(lineContent, tabSize); From 9370ce97b2c5f1db5198cf0faf574de548bb9383 Mon Sep 17 00:00:00 2001 From: Matt Bierner Date: Tue, 1 May 2018 11:08:59 -0700 Subject: [PATCH 270/830] Use destructre --- .../src/features/bufferSyncSupport.ts | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/extensions/typescript-language-features/src/features/bufferSyncSupport.ts b/extensions/typescript-language-features/src/features/bufferSyncSupport.ts index bdd33e3a7c9..959ffa71232 100644 --- a/extensions/typescript-language-features/src/features/bufferSyncSupport.ts +++ b/extensions/typescript-language-features/src/features/bufferSyncSupport.ts @@ -81,9 +81,7 @@ class SyncedBuffer { return; } - for (const event of events) { - const range = event.range; - const text = event.text; + for (const { range, text } of events) { const args: Proto.ChangeRequestArgs = { file: filePath, line: range.start.line + 1, From 61045112d78e5b1c9d6747556093decda5e160a6 Mon Sep 17 00:00:00 2001 From: al Date: Tue, 1 May 2018 23:45:32 +0300 Subject: [PATCH 271/830] Use different problem colors for editor and tree --- src/vs/platform/theme/common/colorRegistry.ts | 2 ++ .../parts/markers/electron-browser/markersFileDecorations.ts | 4 ++-- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/src/vs/platform/theme/common/colorRegistry.ts b/src/vs/platform/theme/common/colorRegistry.ts index 6862d3f3108..250c8a04351 100644 --- a/src/vs/platform/theme/common/colorRegistry.ts +++ b/src/vs/platform/theme/common/colorRegistry.ts @@ -202,6 +202,8 @@ export const listHoverForeground = registerColor('list.hoverForeground', { dark: export const listDropBackground = registerColor('list.dropBackground', { dark: listFocusBackground, light: listFocusBackground, hc: null }, nls.localize('listDropBackground', "List/Tree drag and drop background when moving items around using the mouse.")); export const listHighlightForeground = registerColor('list.highlightForeground', { dark: '#0097fb', light: '#007acc', hc: focusBorder }, nls.localize('highlight', 'List/Tree foreground color of the match highlights when searching inside the list/tree.')); export const listInvalidItemForeground = registerColor('list.invalidItemForeground', { dark: '#B89500', light: '#B89500', hc: '#B89500' }, nls.localize('invalidItemForeground', 'List/Tree foreground color for invalid items, for example an unresolved root in explorer.')); +export const listErrorForeground = registerColor('list.errorForeground', { dark: '#ea4646', light: '#d60a0a', hc: null }, nls.localize('listErrorForeground', 'Foreground color of the file containing errors.')); +export const listWarningForeground = registerColor('list.warningForeground', { dark: '#4d9e4d', light: '#117711', hc: null }, nls.localize('listWarningForeground', 'Foreground color of the file containing warnings.')); export const pickerGroupForeground = registerColor('pickerGroup.foreground', { dark: Color.fromHex('#0097FB').transparent(0.6), light: Color.fromHex('#007ACC').transparent(0.6), hc: Color.white }, nls.localize('pickerGroupForeground', "Quick picker color for grouping labels.")); export const pickerGroupBorder = registerColor('pickerGroup.border', { dark: '#3F3F46', light: '#CCCEDB', hc: Color.white }, nls.localize('pickerGroupBorder', "Quick picker color for grouping borders.")); diff --git a/src/vs/workbench/parts/markers/electron-browser/markersFileDecorations.ts b/src/vs/workbench/parts/markers/electron-browser/markersFileDecorations.ts index 017979a9622..5f5b3ba56df 100644 --- a/src/vs/workbench/parts/markers/electron-browser/markersFileDecorations.ts +++ b/src/vs/workbench/parts/markers/electron-browser/markersFileDecorations.ts @@ -13,7 +13,7 @@ import URI from 'vs/base/common/uri'; import { Event } from 'vs/base/common/event'; import { localize } from 'vs/nls'; import { Registry } from 'vs/platform/registry/common/platform'; -import { editorErrorForeground, editorWarningForeground } from 'vs/editor/common/view/editorColorRegistry'; +import { listErrorForeground, listWarningForeground } from 'vs/platform/theme/common/colorRegistry'; import { IConfigurationService } from 'vs/platform/configuration/common/configuration'; import { IConfigurationRegistry, Extensions as ConfigurationExtensions } from 'vs/platform/configuration/common/configurationRegistry'; import { LifecyclePhase } from 'vs/platform/lifecycle/common/lifecycle'; @@ -50,7 +50,7 @@ class MarkersDecorationsProvider implements IDecorationsProvider { bubble: true, tooltip: markers.length === 1 ? localize('tooltip.1', "1 problem in this file") : localize('tooltip.N', "{0} problems in this file", markers.length), letter: markers.length < 10 ? markers.length.toString() : '+9', - color: first.severity === MarkerSeverity.Error ? editorErrorForeground : editorWarningForeground, + color: first.severity === MarkerSeverity.Error ? listErrorForeground : listWarningForeground, }; } } From 6cea1412545481d91095be4f56c85142abbcef13 Mon Sep 17 00:00:00 2001 From: Matt Bierner Date: Tue, 1 May 2018 16:14:54 -0700 Subject: [PATCH 272/830] Add API for storing state in webviews contents themselves --- .../webview/electron-browser/webview-pre.js | 8 ++++++++ .../webview/electron-browser/webviewEditor.ts | 2 ++ .../electron-browser/webviewEditorInput.ts | 9 +++++++++ .../webview/electron-browser/webviewElement.ts | 16 +++++++++++++++- 4 files changed, 34 insertions(+), 1 deletion(-) diff --git a/src/vs/workbench/parts/webview/electron-browser/webview-pre.js b/src/vs/workbench/parts/webview/electron-browser/webview-pre.js index 5179663f513..282ec3d6876 100644 --- a/src/vs/workbench/parts/webview/electron-browser/webview-pre.js +++ b/src/vs/workbench/parts/webview/electron-browser/webview-pre.js @@ -179,6 +179,8 @@ const originalPostMessage = window.parent.postMessage.bind(window.parent); let acquired = false; + let state = ${data.state ? `JSON.parse(${JSON.stringify(data.state)})` : undefined}; + return () => { if (acquired) { throw new Error('An instance of the VS Code API has already been acquired'); @@ -187,6 +189,12 @@ return Object.freeze({ postMessage: function(msg) { return originalPostMessage({ command: 'onmessage', data: msg }, '*'); + }, + setState: function(state) { + return originalPostMessage({ command: 'do-update-state', data: JSON.stringify(state) }, '*'); + }, + getState: function() { + return state; } }); }; diff --git a/src/vs/workbench/parts/webview/electron-browser/webviewEditor.ts b/src/vs/workbench/parts/webview/electron-browser/webviewEditor.ts index aada9f588dc..306bdbded7d 100644 --- a/src/vs/workbench/parts/webview/electron-browser/webviewEditor.ts +++ b/src/vs/workbench/parts/webview/electron-browser/webviewEditor.ts @@ -219,6 +219,8 @@ export class WebviewEditor extends BaseWebviewEditor { this._webview.initialScrollProgress = input.scrollYPercentage; } + this._webview.state = input.webviewState; + this.content.setAttribute('aria-flowto', this.webviewContent.id); this.doUpdateContainer(); diff --git a/src/vs/workbench/parts/webview/electron-browser/webviewEditorInput.ts b/src/vs/workbench/parts/webview/electron-browser/webviewEditorInput.ts index 516b46d3d5b..7854dae18c2 100644 --- a/src/vs/workbench/parts/webview/electron-browser/webviewEditorInput.ts +++ b/src/vs/workbench/parts/webview/electron-browser/webviewEditorInput.ts @@ -30,6 +30,7 @@ export class WebviewEditorInput extends EditorInput { private _position?: Position; private _scrollYPercentage: number = 0; private _state: any; + private _webviewState: string | undefined; private _revived: boolean = false; @@ -130,6 +131,10 @@ export class WebviewEditorInput extends EditorInput { this._state = value; } + public get webviewState() { + return this._webviewState; + } + public get options(): WebviewInputOptions { return this._options; } @@ -185,6 +190,10 @@ export class WebviewEditorInput extends EditorInput { this._webview.onDidScroll(message => { this._scrollYPercentage = message.scrollYPercentage; }, null, this._webviewDisposables); + + this._webview.onDidUpdateState(newState => { + this._webviewState = newState; + }, null, this._webviewDisposables); } public get scrollYPercentage() { diff --git a/src/vs/workbench/parts/webview/electron-browser/webviewElement.ts b/src/vs/workbench/parts/webview/electron-browser/webviewElement.ts index 0b647c86f38..6d9d95d04ed 100644 --- a/src/vs/workbench/parts/webview/electron-browser/webviewElement.ts +++ b/src/vs/workbench/parts/webview/electron-browser/webviewElement.ts @@ -33,6 +33,7 @@ export class WebviewElement { private _webviewFindWidget: WebviewFindWidget; private _findStarted: boolean = false; private _contents: string = ''; + private _state: string | undefined = undefined; constructor( private readonly _styleElement: Element, @@ -162,6 +163,11 @@ export class WebviewElement { case 'do-reload': this.reload(); return; + + case 'do-update-state': + this._state = event.args[0]; + this._onDidUpdateState.fire(this._state); + return; } }), addDisposableListener(this._webview, 'focus', () => { @@ -220,6 +226,9 @@ export class WebviewElement { private readonly _onDidScroll = new Emitter<{ scrollYPercentage: number }>(); public readonly onDidScroll: Event<{ scrollYPercentage: number }> = this._onDidScroll.event; + private readonly _onDidUpdateState = new Emitter(); + public readonly onDidUpdateState: Event = this._onDidUpdateState.event; + private readonly _onMessage = new Emitter(); public readonly onMessage: Event = this._onMessage.event; @@ -233,6 +242,10 @@ export class WebviewElement { this._send('initial-scroll-position', value); } + public set state(value: string | undefined) { + this._state = value; + } + public set options(value: WebviewOptions) { this._options = value; } @@ -241,7 +254,8 @@ export class WebviewElement { this._contents = value; this._send('content', { contents: value, - options: this._options + options: this._options, + state: this._state }); } From 4daf8d2266a2b80a6fee6be1179f346beed3be73 Mon Sep 17 00:00:00 2001 From: Matt Bierner Date: Tue, 1 May 2018 16:29:02 -0700 Subject: [PATCH 273/830] Pick up newer marked version --- src/vs/base/common/marked/marked.js | 531 +++++++++++++++++----------- 1 file changed, 316 insertions(+), 215 deletions(-) diff --git a/src/vs/base/common/marked/marked.js b/src/vs/base/common/marked/marked.js index ca72ea8d6dc..b20380f19b7 100644 --- a/src/vs/base/common/marked/marked.js +++ b/src/vs/base/common/marked/marked.js @@ -6,7 +6,7 @@ var __marked_exports; -;(function(root) { +; (function (root) { 'use strict'; /** @@ -18,20 +18,29 @@ var block = { code: /^( {4}[^\n]+\n*)+/, fences: noop, hr: /^ {0,3}((?:- *){3,}|(?:_ *){3,}|(?:\* *){3,})(?:\n+|$)/, - heading: /^ *(#{1,6}) *([^\n]+?) *#* *(?:\n+|$)/, + heading: /^ *(#{1,6}) *([^\n]+?) *(?:#+ *)?(?:\n+|$)/, nptable: noop, blockquote: /^( {0,3}> ?(paragraph|[^\n]*)(?:\n|$))+/, list: /^( *)(bull) [\s\S]+?(?:hr|def|\n{2,}(?! )(?!\1bull )\n*|\s*$)/, - html: /^ *(?:comment *(?:\n|\s*$)|closed *(?:\n{2,}|\s*$)|closing *(?:\n{2,}|\s*$))/, + html: '^ {0,3}(?:' // optional indentation + + '<(script|pre|style)[\\s>][\\s\\S]*?(?:[^\\n]*\\n+|$)' // (1) + + '|comment[^\\n]*(\\n+|$)' // (2) + + '|<\\?[\\s\\S]*?\\?>\\n*' // (3) + + '|\\n*' // (4) + + '|\\n*' // (5) + + '|)[\\s\\S]*?(?:\\n{2,}|$)' // (6) + + '|<(?!script|pre|style)([a-z][\\w-]*)(?:attribute)*? */?>(?=\\h*\\n)[\\s\\S]*?(?:\\n{2,}|$)' // (7) open tag + + '|(?=\\h*\\n)[\\s\\S]*?(?:\\n{2,}|$)' // (7) closing tag + + ')', def: /^ {0,3}\[(label)\]: *\n? *]+)>?(?:(?: +\n? *| *\n *)(title))? *(?:\n+|$)/, table: noop, lheading: /^([^\n]+)\n *(=|-){2,} *(?:\n+|$)/, - paragraph: /^([^\n]+(?:\n?(?!hr|heading|lheading| {0,3}>|tag)[^\n]+)+)/, + paragraph: /^([^\n]+(?:\n(?!hr|heading|lheading| {0,3}>|<\/?(?:tag)(?: +|\\n|\/?>)|<(?:script|pre|style|!--))[^\n]+)+)/, text: /^[^\n]+/ }; -block._label = /(?:\\[\[\]]|[^\[\]])+/; -block._title = /(?:"(?:\\"|[^"]|"[^"\n]*")*"|'\n?(?:[^'\n]+\n?)*'|\([^()]*\))/; +block._label = /(?!\s*\])(?:\\[\[\]]|[^\[\]])+/; +block._title = /(?:"(?:\\"?|[^"\\])*"|'[^'\n]*(?:\n[^'\n]+)*\n?'|\([^()]*\))/; block.def = edit(block.def) .replace('label', block._label) .replace('title', block._title) @@ -49,23 +58,24 @@ block.list = edit(block.list) .replace('def', '\\n+(?=' + block.def.source + ')') .getRegex(); -block._tag = '(?!(?:' - + 'a|em|strong|small|s|cite|q|dfn|abbr|data|time|code' - + '|var|samp|kbd|sub|sup|i|b|u|mark|ruby|rt|rp|bdi|bdo' - + '|span|br|wbr|ins|del|img)\\b)\\w+(?!:|[^\\w\\s@]*@)\\b'; - -block.html = edit(block.html) - .replace('comment', //) - .replace('closed', /<(tag)[\s\S]+?<\/\1>/) - .replace('closing', /\s]*)*?\/?>/) - .replace(/tag/g, block._tag) +block._tag = 'address|article|aside|base|basefont|blockquote|body|caption' + + '|center|col|colgroup|dd|details|dialog|dir|div|dl|dt|fieldset|figcaption' + + '|figure|footer|form|frame|frameset|h[1-6]|head|header|hr|html|iframe' + + '|legend|li|link|main|menu|menuitem|meta|nav|noframes|ol|optgroup|option' + + '|p|param|section|source|summary|table|tbody|td|tfoot|th|thead|title|tr' + + '|track|ul'; +block._comment = //; +block.html = edit(block.html, 'i') + .replace('comment', block._comment) + .replace('tag', block._tag) + .replace('attribute', / +[a-zA-Z:_][\w.:-]*(?: *= *"[^"\n]*"| *= *'[^'\n]*'| *= *[^\s"'=<>`]+)?/) .getRegex(); block.paragraph = edit(block.paragraph) .replace('hr', block.hr) .replace('heading', block.heading) .replace('lheading', block.lheading) - .replace('tag', '<' + block._tag) + .replace('tag', block._tag) // pars can be interrupted by type (6) html blocks .getRegex(); block.blockquote = edit(block.blockquote) @@ -99,8 +109,26 @@ block.gfm.paragraph = edit(block.paragraph) */ block.tables = merge({}, block.gfm, { - nptable: /^ *(\S.*\|.*)\n *([-:]+ *\|[-| :]*)\n((?:.*\|.*(?:\n|$))*)\n*/, - table: /^ *\|(.+)\n *\|( *[-:]+[-| :]*)\n((?: *\|.*(?:\n|$))*)\n*/ + nptable: /^ *([^|\n ].*\|.*)\n *([-:]+ *\|[-| :]*)(?:\n((?:.*[^>\n ].*(?:\n|$))*)\n*|$)/, + table: /^ *\|(.+)\n *\|?( *[-:]+[-| :]*)(?:\n((?: *[^>\n ].*(?:\n|$))*)\n*|$)/ +}); + +/** + * Pedantic grammar + */ + +block.pedantic = merge({}, block.normal, { + html: edit( + '^ *(?:comment *(?:\\n|\\s*$)' + + '|<(tag)[\\s\\S]+? *(?:\\n{2,}|\\s*$)' // closed tag + + '|\\s]*)*?/?> *(?:\\n{2,}|\\s*$))') + .replace('comment', block._comment) + .replace(/tag/g, '(?!(?:' + + 'a|em|strong|small|s|cite|q|dfn|abbr|data|time|code|var|samp|kbd|sub' + + '|sup|i|b|u|mark|ruby|rt|rp|bdi|bdo|span|br|wbr|ins|del|img)' + + '\\b)\\w+(?!:|[^\\w\\s@]*@)\\b') + .getRegex(), + def: /^ *\[([^\]]+)\]: *]+)>?(?: +(["(][^\n]+[")]))? *(?:\n+|$)/ }); /** @@ -113,7 +141,9 @@ function Lexer(options) { this.options = options || marked.defaults; this.rules = block.normal; - if (this.options.gfm) { + if (this.options.pedantic) { + this.rules = block.pedantic; + } else if (this.options.gfm) { if (this.options.tables) { this.rules = block.tables; } else { @@ -132,7 +162,7 @@ Lexer.rules = block; * Static Lex Method */ -Lexer.lex = function(src, options) { +Lexer.lex = function (src, options) { var lexer = new Lexer(options); return lexer.lex(src); }; @@ -141,7 +171,7 @@ Lexer.lex = function(src, options) { * Preprocessing */ -Lexer.prototype.lex = function(src) { +Lexer.prototype.lex = function (src) { src = src .replace(/\r\n|\r/g, '\n') .replace(/\t/g, ' ') @@ -155,19 +185,19 @@ Lexer.prototype.lex = function(src) { * Lexing */ -Lexer.prototype.token = function(src, top) { +Lexer.prototype.token = function (src, top) { src = src.replace(/^ +$/gm, ''); var next, - loose, - cap, - bull, - b, - item, - space, - i, - tag, - l, - isordered; + loose, + cap, + bull, + b, + item, + space, + i, + tag, + l, + isordered; while (src) { // newline @@ -217,34 +247,36 @@ Lexer.prototype.token = function(src, top) { // table no leading pipe (gfm) if (top && (cap = this.rules.nptable.exec(src))) { - src = src.substring(cap[0].length); - item = { type: 'table', - header: cap[1].replace(/^ *| *\| *$/g, '').split(/ *\| */), + header: splitCells(cap[1].replace(/^ *| *\| *$/g, '')), align: cap[2].replace(/^ *|\| *$/g, '').split(/ *\| */), - cells: cap[3].replace(/\n$/, '').split('\n') + cells: cap[3] ? cap[3].replace(/\n$/, '').split('\n') : [] }; - for (i = 0; i < item.align.length; i++) { - if (/^ *-+: *$/.test(item.align[i])) { - item.align[i] = 'right'; - } else if (/^ *:-+: *$/.test(item.align[i])) { - item.align[i] = 'center'; - } else if (/^ *:-+ *$/.test(item.align[i])) { - item.align[i] = 'left'; - } else { - item.align[i] = null; + if (item.header.length === item.align.length) { + src = src.substring(cap[0].length); + + for (i = 0; i < item.align.length; i++) { + if (/^ *-+: *$/.test(item.align[i])) { + item.align[i] = 'right'; + } else if (/^ *:-+: *$/.test(item.align[i])) { + item.align[i] = 'center'; + } else if (/^ *:-+ *$/.test(item.align[i])) { + item.align[i] = 'left'; + } else { + item.align[i] = null; + } } + + for (i = 0; i < item.cells.length; i++) { + item.cells[i] = splitCells(item.cells[i], item.header.length); + } + + this.tokens.push(item); + + continue; } - - for (i = 0; i < item.cells.length; i++) { - item.cells[i] = item.cells[i].split(/ *\| */); - } - - this.tokens.push(item); - - continue; } // hr @@ -372,7 +404,7 @@ Lexer.prototype.token = function(src, top) { if (top && (cap = this.rules.def.exec(src))) { src = src.substring(cap[0].length); if (cap[3]) cap[3] = cap[3].substring(1, cap[3].length - 1); - tag = cap[1].toLowerCase(); + tag = cap[1].toLowerCase().replace(/\s+/g, ' '); if (!this.tokens.links[tag]) { this.tokens.links[tag] = { href: cap[2], @@ -384,36 +416,38 @@ Lexer.prototype.token = function(src, top) { // table (gfm) if (top && (cap = this.rules.table.exec(src))) { - src = src.substring(cap[0].length); - item = { type: 'table', - header: cap[1].replace(/^ *| *\| *$/g, '').split(/ *\| */), + header: splitCells(cap[1].replace(/^ *| *\| *$/g, '')), align: cap[2].replace(/^ *|\| *$/g, '').split(/ *\| */), - cells: cap[3].replace(/(?: *\| *)?\n$/, '').split('\n') + cells: cap[3] ? cap[3].replace(/(?: *\| *)?\n$/, '').split('\n') : [] }; - for (i = 0; i < item.align.length; i++) { - if (/^ *-+: *$/.test(item.align[i])) { - item.align[i] = 'right'; - } else if (/^ *:-+: *$/.test(item.align[i])) { - item.align[i] = 'center'; - } else if (/^ *:-+ *$/.test(item.align[i])) { - item.align[i] = 'left'; - } else { - item.align[i] = null; + if (item.header.length === item.align.length) { + src = src.substring(cap[0].length); + + for (i = 0; i < item.align.length; i++) { + if (/^ *-+: *$/.test(item.align[i])) { + item.align[i] = 'right'; + } else if (/^ *:-+: *$/.test(item.align[i])) { + item.align[i] = 'center'; + } else if (/^ *:-+ *$/.test(item.align[i])) { + item.align[i] = 'left'; + } else { + item.align[i] = null; + } } + + for (i = 0; i < item.cells.length; i++) { + item.cells[i] = splitCells( + item.cells[i].replace(/^ *\| *| *\| *$/g, ''), + item.header.length); + } + + this.tokens.push(item); + + continue; } - - for (i = 0; i < item.cells.length; i++) { - item.cells[i] = item.cells[i] - .replace(/^ *\| *| *\| *$/g, '') - .split(/ *\| */); - } - - this.tokens.push(item); - - continue; } // lheading @@ -463,39 +497,54 @@ Lexer.prototype.token = function(src, top) { */ var inline = { - escape: /^\\([\\`*{}\[\]()#+\-.!_>])/, + escape: /^\\([!"#$%&'()*+,\-./:;<=>?@\[\]\\^_`{|}~])/, autolink: /^<(scheme:[^\s\x00-\x1f<>]*|email)>/, url: noop, - tag: /^|^<\/?[a-zA-Z0-9\-]+(?:"[^"]*"|'[^']*'|\s[^<'">\/\s]*)*?\/?>/, - link: /^!?\[(inside)\]\(href\)/, - reflink: /^!?\[(inside)\]\s*\[([^\]]*)\]/, - nolink: /^!?\[((?:\[[^\[\]]*\]|\\[\[\]]|[^\[\]])*)\]/, - strong: /^__([\s\S]+?)__(?!_)|^\*\*([\s\S]+?)\*\*(?!\*)/, - em: /^_([^\s_](?:[^_]|__)+?[^\s_])_\b|^\*((?:\*\*|[^*])+?)\*(?!\*)/, + tag: '^comment' + + '|^' // self-closing tag + + '|^<[a-zA-Z][\\w-]*(?:attribute)*?\\s*/?>' // open tag + + '|^<\\?[\\s\\S]*?\\?>' // processing instruction, e.g. + + '|^' // declaration, e.g. + + '|^', // CDATA section + link: /^!?\[(label)\]\(href(?:\s+(title))?\s*\)/, + reflink: /^!?\[(label)\]\[(?!\s*\])((?:\\[\[\]]?|[^\[\]\\])+)\]/, + nolink: /^!?\[(?!\s*\])((?:\[[^\[\]]*\]|\\[\[\]]|[^\[\]])*)\](?:\[\])?/, + strong: /^__([^\s][\s\S]*?[^\s])__(?!_)|^\*\*([^\s][\s\S]*?[^\s])\*\*(?!\*)|^__([^\s])__(?!_)|^\*\*([^\s])\*\*(?!\*)/, + em: /^_([^\s][\s\S]*?[^\s_])_(?!_)|^_([^\s_][\s\S]*?[^\s])_(?!_)|^\*([^\s][\s\S]*?[^\s*])\*(?!\*)|^\*([^\s*][\s\S]*?[^\s])\*(?!\*)|^_([^\s_])_(?!_)|^\*([^\s*])\*(?!\*)/, code: /^(`+)\s*([\s\S]*?[^`]?)\s*\1(?!`)/, br: /^ {2,}\n(?!\s*$)/, del: noop, text: /^[\s\S]+?(?=[\\?@\[\]\\^_`{|}~])/g; + inline._scheme = /[a-zA-Z][a-zA-Z0-9+.-]{1,31}/; inline._email = /[a-zA-Z0-9.!#$%&'*+/=?^_`{|}~-]+(@)[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)+(?![-_])/; - inline.autolink = edit(inline.autolink) .replace('scheme', inline._scheme) .replace('email', inline._email) - .getRegex() + .getRegex(); -inline._inside = /(?:\[[^\[\]]*\]|\\[\[\]]|[^\[\]]|\](?=[^\[]*\]))*/; -inline._href = /\s*?(?:\s+['"]([\s\S]*?)['"])?\s*/; +inline._attribute = /\s+[a-zA-Z:_][\w.:-]*(?:\s*=\s*"[^"]*"|\s*=\s*'[^']*'|\s*=\s*[^\s"'=<>`]+)?/; + +inline.tag = edit(inline.tag) + .replace('comment', block._comment) + .replace('attribute', inline._attribute) + .getRegex(); + +inline._label = /(?:\[[^\[\]]*\]|\\[\[\]]?|`[^`]*`|[^\[\]\\])*?/; +inline._href = /\s*(<(?:\\[<>]?|[^\s<>\\])*>|(?:\\[()]?|\([^\s\x00-\x1f()\\]*\)|[^\s\x00-\x1f()\\])*?)/; +inline._title = /"(?:\\"?|[^"\\])*"|'(?:\\'?|[^'\\])*'|\((?:\\\)?|[^)\\])*\)/; inline.link = edit(inline.link) - .replace('inside', inline._inside) + .replace('label', inline._label) .replace('href', inline._href) + .replace('title', inline._title) .getRegex(); inline.reflink = edit(inline.reflink) - .replace('inside', inline._inside) + .replace('label', inline._label) .getRegex(); /** @@ -510,7 +559,13 @@ inline.normal = merge({}, inline); inline.pedantic = merge({}, inline.normal, { strong: /^__(?=\S)([\s\S]*?\S)__(?!_)|^\*\*(?=\S)([\s\S]*?\S)\*\*(?!\*)/, - em: /^_(?=\S)([\s\S]*?\S)_(?!_)|^\*(?=\S)([\s\S]*?\S)\*(?!\*)/ + em: /^_(?=\S)([\s\S]*?\S)_(?!_)|^\*(?=\S)([\s\S]*?\S)\*(?!\*)/, + link: edit(/^!?\[(label)\]\((.*?)\)/) + .replace('label', inline._label) + .getRegex(), + reflink: edit(/^!?\[(label)\]\s*\[([^\]]*)\]/) + .replace('label', inline._label) + .getRegex() }); /** @@ -554,14 +609,14 @@ function InlineLexer(links, options) { throw new Error('Tokens array requires a `links` property.'); } - if (this.options.gfm) { + if (this.options.pedantic) { + this.rules = inline.pedantic; + } else if (this.options.gfm) { if (this.options.breaks) { this.rules = inline.breaks; } else { this.rules = inline.gfm; } - } else if (this.options.pedantic) { - this.rules = inline.pedantic; } } @@ -575,7 +630,7 @@ InlineLexer.rules = inline; * Static Lexing/Compiling Method */ -InlineLexer.output = function(src, links, options) { +InlineLexer.output = function (src, links, options) { var inline = new InlineLexer(links, options); return inline.output(src); }; @@ -584,12 +639,13 @@ InlineLexer.output = function(src, links, options) { * Lexing/Compiling */ -InlineLexer.prototype.output = function(src) { +InlineLexer.prototype.output = function (src) { var out = '', - link, - text, - href, - cap; + link, + text, + href, + title, + cap; while (src) { // escape @@ -652,9 +708,23 @@ InlineLexer.prototype.output = function(src) { if (cap = this.rules.link.exec(src)) { src = src.substring(cap[0].length); this.inLink = true; + href = cap[2]; + if (this.options.pedantic) { + link = /^([^'"]*[^\s])\s+(['"])(.*)\2/.exec(href); + + if (link) { + href = link[1]; + title = link[3]; + } else { + title = ''; + } + } else { + title = cap[3] ? cap[3].slice(1, -1) : ''; + } + href = href.trim().replace(/^<([\s\S]*)>$/, '$1'); out += this.outputLink(cap, { - href: cap[2], - title: cap[3] + href: InlineLexer.escapes(href), + title: InlineLexer.escapes(title) }); this.inLink = false; continue; @@ -662,7 +732,7 @@ InlineLexer.prototype.output = function(src) { // reflink, nolink if ((cap = this.rules.reflink.exec(src)) - || (cap = this.rules.nolink.exec(src))) { + || (cap = this.rules.nolink.exec(src))) { src = src.substring(cap[0].length); link = (cap[2] || cap[1]).replace(/\s+/g, ' '); link = this.links[link.toLowerCase()]; @@ -680,14 +750,14 @@ InlineLexer.prototype.output = function(src) { // strong if (cap = this.rules.strong.exec(src)) { src = src.substring(cap[0].length); - out += this.renderer.strong(this.output(cap[2] || cap[1])); + out += this.renderer.strong(this.output(cap[4] || cap[3] || cap[2] || cap[1])); continue; } // em if (cap = this.rules.em.exec(src)) { src = src.substring(cap[0].length); - out += this.renderer.em(this.output(cap[2] || cap[1])); + out += this.renderer.em(this.output(cap[6] || cap[5] || cap[4] || cap[3] || cap[2] || cap[1])); continue; } @@ -727,13 +797,17 @@ InlineLexer.prototype.output = function(src) { return out; }; +InlineLexer.escapes = function (text) { + return text ? text.replace(InlineLexer.rules._escapes, '$1') : text; +} + /** * Compile Link */ -InlineLexer.prototype.outputLink = function(cap, link) { - var href = escape(link.href), - title = link.title ? escape(link.title) : null; +InlineLexer.prototype.outputLink = function (cap, link) { + var href = link.href, + title = link.title ? escape(link.title) : null; return cap[0].charAt(0) !== '!' ? this.renderer.link(href, title, this.output(cap[1])) @@ -744,7 +818,7 @@ InlineLexer.prototype.outputLink = function(cap, link) { * Smartypants Transformations */ -InlineLexer.prototype.smartypants = function(text) { +InlineLexer.prototype.smartypants = function (text) { if (!this.options.smartypants) return text; return text // em-dashes @@ -767,12 +841,12 @@ InlineLexer.prototype.smartypants = function(text) { * Mangle Links */ -InlineLexer.prototype.mangle = function(text) { +InlineLexer.prototype.mangle = function (text) { if (!this.options.mangle) return text; var out = '', - l = text.length, - i = 0, - ch; + l = text.length, + i = 0, + ch; for (; i < l; i++) { ch = text.charCodeAt(i); @@ -790,10 +864,10 @@ InlineLexer.prototype.mangle = function(text) { */ function Renderer(options) { - this.options = options || {}; + this.options = options || marked.defaults; } -Renderer.prototype.code = function(code, lang, escaped) { +Renderer.prototype.code = function (code, lang, escaped) { if (this.options.highlight) { var out = this.options.highlight(code, lang); if (out != null && out !== code) { @@ -816,90 +890,94 @@ Renderer.prototype.code = function(code, lang, escaped) { + '\n\n'; }; -Renderer.prototype.blockquote = function(quote) { +Renderer.prototype.blockquote = function (quote) { return '
    \n' + quote + '
    \n'; }; -Renderer.prototype.html = function(html) { +Renderer.prototype.html = function (html) { return html; }; -Renderer.prototype.heading = function(text, level, raw) { - return '' - + text - + '\n'; +Renderer.prototype.heading = function (text, level, raw) { + if (this.options.headerIds) { + return '' + + text + + '\n'; + } + // ignore IDs + return '' + text + '\n'; }; -Renderer.prototype.hr = function() { +Renderer.prototype.hr = function () { return this.options.xhtml ? '
    \n' : '
    \n'; }; -Renderer.prototype.list = function(body, ordered, start) { +Renderer.prototype.list = function (body, ordered, start) { var type = ordered ? 'ol' : 'ul', - startatt = (ordered && start !== 1) ? (' start="' + start + '"') : ''; + startatt = (ordered && start !== 1) ? (' start="' + start + '"') : ''; return '<' + type + startatt + '>\n' + body + '\n'; }; -Renderer.prototype.listitem = function(text) { +Renderer.prototype.listitem = function (text) { return '
  1. ' + text + '
  2. \n'; }; -Renderer.prototype.paragraph = function(text) { +Renderer.prototype.paragraph = function (text) { return '

    ' + text + '

    \n'; }; -Renderer.prototype.table = function(header, body) { +Renderer.prototype.table = function (header, body) { + if (body) body = '' + body + ''; + return '\n' + '\n' + header + '\n' - + '\n' + body - + '\n' + '
    \n'; }; -Renderer.prototype.tablerow = function(content) { +Renderer.prototype.tablerow = function (content) { return '\n' + content + '\n'; }; -Renderer.prototype.tablecell = function(content, flags) { +Renderer.prototype.tablecell = function (content, flags) { var type = flags.header ? 'th' : 'td'; var tag = flags.align - ? '<' + type + ' style="text-align:' + flags.align + '">' + ? '<' + type + ' align="' + flags.align + '">' : '<' + type + '>'; return tag + content + '\n'; }; // span level renderer -Renderer.prototype.strong = function(text) { +Renderer.prototype.strong = function (text) { return '' + text + ''; }; -Renderer.prototype.em = function(text) { +Renderer.prototype.em = function (text) { return '' + text + ''; }; -Renderer.prototype.codespan = function(text) { +Renderer.prototype.codespan = function (text) { return '' + text + ''; }; -Renderer.prototype.br = function() { +Renderer.prototype.br = function () { return this.options.xhtml ? '
    ' : '
    '; }; -Renderer.prototype.del = function(text) { +Renderer.prototype.del = function (text) { return '' + text + ''; }; -Renderer.prototype.link = function(href, title, text) { +Renderer.prototype.link = function (href, title, text) { if (this.options.sanitize) { try { var prot = decodeURIComponent(unescape(href)) @@ -915,7 +993,12 @@ Renderer.prototype.link = function(href, title, text) { if (this.options.baseUrl && !originIndependentUrl.test(href)) { href = resolveUrl(this.options.baseUrl, href); } - var out = ' count) { + cells.splice(count); + } else { + while (cells.length < count) cells.push(''); + } + + for (; i < cells.length; i++) { + cells[i] = cells[i].replace(/\\\|/g, '|'); + } + return cells; +} + /** * Marked */ @@ -1259,9 +1356,9 @@ function marked(src, opt, callback) { opt = merge({}, marked.defaults, opt || {}); var highlight = opt.highlight, - tokens, - pending, - i = 0; + tokens, + pending, + i = 0; try { tokens = Lexer.lex(src, opt) @@ -1271,7 +1368,7 @@ function marked(src, opt, callback) { pending = tokens.length; - var done = function(err) { + var done = function (err) { if (err) { opt.highlight = highlight; return callback(err); @@ -1301,11 +1398,11 @@ function marked(src, opt, callback) { if (!pending) return done(); for (; i < tokens.length; i++) { - (function(token) { + (function (token) { if (token.type !== 'code') { return --pending || done(); } - return highlight(token.text, token.lang, function(err, code) { + return highlight(token.text, token.lang, function (err, code) { if (err) return done(err); if (code == null || code === token.text) { return --pending || done(); @@ -1338,29 +1435,34 @@ function marked(src, opt, callback) { */ marked.options = -marked.setOptions = function(opt) { - merge(marked.defaults, opt); - return marked; + marked.setOptions = function (opt) { + merge(marked.defaults, opt); + return marked; + }; + +marked.getDefaults = function () { + return { + baseUrl: null, + breaks: false, + gfm: true, + headerIds: true, + headerPrefix: '', + highlight: null, + langPrefix: 'lang-', + mangle: true, + pedantic: false, + renderer: new Renderer(), + sanitize: false, + sanitizer: null, + silent: false, + smartLists: false, + smartypants: false, + tables: true, + xhtml: false + }; }; -marked.defaults = { - gfm: true, - tables: true, - breaks: false, - pedantic: false, - sanitize: false, - sanitizer: null, - mangle: true, - smartLists: false, - silent: false, - highlight: null, - langPrefix: 'lang-', - smartypants: false, - headerPrefix: '', - renderer: new Renderer(), - xhtml: false, - baseUrl: null -}; +marked.defaults = marked.getDefaults(); /** * Expose @@ -1379,16 +1481,15 @@ marked.InlineLexer = InlineLexer; marked.inlineLexer = InlineLexer.output; marked.parse = marked; - __marked_exports = marked; }).call(this); // ESM-comment-begin define([], function() { - return { - marked: __marked_exports - }; +return { + marked: __marked_exports +}; }); // ESM-comment-end From 349f5c61d35e41087dfde810acb4f213342c8018 Mon Sep 17 00:00:00 2001 From: Rob Lourens Date: Tue, 1 May 2018 17:25:29 -0700 Subject: [PATCH 274/830] Fix wrong quickinput casing, causing tests to hang --- .../parts/terminal/electron-browser/terminalActions.ts | 2 +- src/vs/workbench/parts/url/electron-browser/url.contribution.ts | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/vs/workbench/parts/terminal/electron-browser/terminalActions.ts b/src/vs/workbench/parts/terminal/electron-browser/terminalActions.ts index 8c77df4b3d2..58a142bcb7a 100644 --- a/src/vs/workbench/parts/terminal/electron-browser/terminalActions.ts +++ b/src/vs/workbench/parts/terminal/electron-browser/terminalActions.ts @@ -17,7 +17,7 @@ import { IPanelService } from 'vs/workbench/services/panel/common/panelService'; import { attachSelectBoxStyler } from 'vs/platform/theme/common/styler'; import { IThemeService } from 'vs/platform/theme/common/themeService'; import { IQuickOpenService, IPickOptions } from 'vs/platform/quickOpen/common/quickOpen'; -import { IQuickInputService } from 'vs/platform/quickInput/common/quickInput'; +import { IQuickInputService } from 'vs/platform/quickinput/common/quickInput'; import { ActionBarContributor } from 'vs/workbench/browser/actions'; import { TerminalEntry } from 'vs/workbench/parts/terminal/browser/terminalQuickOpen'; import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation'; diff --git a/src/vs/workbench/parts/url/electron-browser/url.contribution.ts b/src/vs/workbench/parts/url/electron-browser/url.contribution.ts index 89f325aabad..bc6c1f8faa3 100644 --- a/src/vs/workbench/parts/url/electron-browser/url.contribution.ts +++ b/src/vs/workbench/parts/url/electron-browser/url.contribution.ts @@ -8,7 +8,7 @@ import { SyncActionDescriptor } from 'vs/platform/actions/common/actions'; import { Registry } from 'vs/platform/registry/common/platform'; import { Extensions as ActionExtensions, IWorkbenchActionRegistry } from 'vs/workbench/common/actions'; import { IURLService } from 'vs/platform/url/common/url'; -import { IQuickInputService } from 'vs/platform/quickInput/common/quickInput'; +import { IQuickInputService } from 'vs/platform/quickinput/common/quickInput'; import URI from 'vs/base/common/uri'; import { TPromise } from 'vs/base/common/winjs.base'; import { Action } from 'vs/base/common/actions'; From 946623f81f36157085634e25201461ee29d06602 Mon Sep 17 00:00:00 2001 From: Johannes Rieken Date: Wed, 2 May 2018 09:37:08 +0200 Subject: [PATCH 275/830] fix #49003 --- src/vs/base/common/map.ts | 38 ++++++++++++++++++++++++++------------ 1 file changed, 26 insertions(+), 12 deletions(-) diff --git a/src/vs/base/common/map.ts b/src/vs/base/common/map.ts index 7a21c9eb66b..a9f8a855bba 100644 --- a/src/vs/base/common/map.ts +++ b/src/vs/base/common/map.ts @@ -333,6 +333,32 @@ export class TernarySearchTree { return undefined; } + private _nodeIterator(node: TernarySearchTreeNode): IIterator { + let res = { + done: false, + value: undefined + }; + let idx: number; + let data: E[]; + let next = () => { + if (!data) { + // lazy till first invocation + data = []; + idx = 0; + this._forEach(node, value => data.push(value)); + } + if (idx >= data.length) { + res.done = true; + res.value = undefined; + } else { + res.done = false; + res.value = data[idx++]; + } + return res; + }; + return { next }; + } + forEach(callback: (value: E, index: string) => any) { this._forEach(this._root, callback); } @@ -354,18 +380,6 @@ export class TernarySearchTree { this._forEach(node.right, callback); } } - - private *_nodeIterator(node: TernarySearchTreeNode): any & IIterator { - if (node) { - yield* this._nodeIterator(node.left); - if (node.value) { - yield node.value; - } - yield* this._nodeIterator(node.mid); - yield* this._nodeIterator(node.right); - } - } - } export class ResourceMap { From 5dff77e49cf7035b1962c45b45e374486d8daf29 Mon Sep 17 00:00:00 2001 From: Alex Dima Date: Wed, 2 May 2018 09:45:50 +0200 Subject: [PATCH 276/830] Fixes Microsoft/monaco-editor#857: Ensure pageSize is > 0 --- src/vs/editor/common/controller/cursorCommon.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/vs/editor/common/controller/cursorCommon.ts b/src/vs/editor/common/controller/cursorCommon.ts index 8f0ff9075d2..0563b6a0771 100644 --- a/src/vs/editor/common/controller/cursorCommon.ts +++ b/src/vs/editor/common/controller/cursorCommon.ts @@ -115,7 +115,7 @@ export class CursorConfiguration { this.tabSize = modelOptions.tabSize; this.insertSpaces = modelOptions.insertSpaces; this.oneIndent = oneIndent; - this.pageSize = Math.floor(c.layoutInfo.height / c.fontInfo.lineHeight) - 2; + this.pageSize = Math.max(1, Math.floor(c.layoutInfo.height / c.fontInfo.lineHeight) - 2); this.lineHeight = c.lineHeight; this.useTabStops = c.useTabStops; this.wordSeparators = c.wordSeparators; From b703cdba7a3ea4c8394b6d00de3cbee2ef138986 Mon Sep 17 00:00:00 2001 From: isidor Date: Wed, 2 May 2018 10:03:38 +0200 Subject: [PATCH 277/830] debug brekapoints hover messages: fix copy paste mistake --- src/vs/workbench/parts/debug/browser/breakpointsView.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/vs/workbench/parts/debug/browser/breakpointsView.ts b/src/vs/workbench/parts/debug/browser/breakpointsView.ts index f4a1096b410..1e1eb738dad 100644 --- a/src/vs/workbench/parts/debug/browser/breakpointsView.ts +++ b/src/vs/workbench/parts/debug/browser/breakpointsView.ts @@ -591,7 +591,7 @@ export function getBreakpointMessageAndClassName(debugService: IDebugService, te } if (breakpoint.logMessage) { - if (process && breakpoint.condition && !process.session.capabilities.supportsLogPoints) { + if (process && !process.session.capabilities.supportsLogPoints) { return { className: 'debug-breakpoint-unsupported', message: nls.localize('logBreakpointUnsupported', "Logpoints not supported by this debug type"), From 13650824a5f9abf290f49fb08742d217d9248c80 Mon Sep 17 00:00:00 2001 From: Daniel Ye Date: Mon, 30 Apr 2018 12:06:14 -0700 Subject: [PATCH 278/830] 2018-04-30. Merged in translations from Transifex. --- i18n/chs/extensions/git/out/commands.i18n.json | 4 +--- i18n/chs/extensions/git/package.i18n.json | 2 +- i18n/chs/extensions/npm/out/npmView.i18n.json | 2 +- i18n/chs/extensions/npm/package.i18n.json | 2 +- i18n/chs/src/vs/code/electron-main/menus.i18n.json | 4 ++-- .../common/config/commonEditorConfig.i18n.json | 7 +++---- .../src/vs/platform/environment/node/argv.i18n.json | 4 ++-- .../node/extensionManagementService.i18n.json | 2 +- .../platform/theme/common/colorRegistry.i18n.json | 3 +++ .../inactiveExtensionUrlHandler.i18n.json | 3 ++- .../browser/viewsContainersExtensionPoint.i18n.json | 8 +++++--- .../api/browser/viewsExtensionPoint.i18n.json | 2 ++ .../browser/parts/quickinput/quickInput.i18n.json | 4 ++-- .../electron-browser/main.contribution.i18n.json | 2 +- .../electron-browser/accessibility.i18n.json | 2 +- .../electron-browser/toggleWordWrap.i18n.json | 4 ++-- .../electron-browser/extensionsUtils.i18n.json | 2 +- .../electron-browser/files.contribution.i18n.json | 2 +- .../electron-browser/views/explorerViewer.i18n.json | 2 +- .../localizations.contribution.i18n.json | 2 ++ .../markers/electron-browser/markersPanel.i18n.json | 2 +- .../markers/electron-browser/messages.i18n.json | 2 +- .../electron-browser/startupProfiler.i18n.json | 2 +- .../quickopen/browser/gotoLineHandler.i18n.json | 4 ++-- .../electron-browser/search.contribution.i18n.json | 1 + .../tasks/common/taskDefinitionRegistry.i18n.json | 2 +- .../electron-browser/terminalTaskSystem.i18n.json | 2 +- .../electron-browser/themes.contribution.i18n.json | 2 +- .../electron-browser/menusExtensionPoint.i18n.json | 2 +- .../common/configurationExtensionPoint.i18n.json | 4 ++-- .../extensions/common/extensionsRegistry.i18n.json | 1 + .../files/electron-browser/fileService.i18n.json | 2 +- .../electron-browser/remoteFileService.i18n.json | 3 ++- .../keybinding/common/keybindingEditing.i18n.json | 2 +- .../electron-browser/keybindingService.i18n.json | 4 ++-- .../mode/common/workbenchModeService.i18n.json | 2 +- .../textMate/electron-browser/TMGrammars.i18n.json | 2 +- .../textMate/electron-browser/TMSyntax.i18n.json | 6 +++--- i18n/cht/extensions/git/out/commands.i18n.json | 4 +--- i18n/cht/extensions/npm/out/npmView.i18n.json | 4 +++- i18n/cht/extensions/npm/package.i18n.json | 7 ++++++- .../typescript-language-features/package.i18n.json | 3 +++ i18n/cht/src/vs/base/node/processes.i18n.json | 3 ++- i18n/cht/src/vs/base/node/zip.i18n.json | 1 + .../issue/issueReporterPage.i18n.json | 1 + i18n/cht/src/vs/code/electron-main/menus.i18n.json | 1 + .../vs/editor/browser/widget/diffReview.i18n.json | 4 ++++ .../src/vs/editor/common/commonCodeEditor.i18n.json | 3 ++- .../common/config/commonEditorConfig.i18n.json | 11 +++++++++++ .../common/view/editorColorRegistry.i18n.json | 1 + .../contrib/codeAction/codeActionCommands.i18n.json | 3 ++- .../referenceSearch/referencesWidget.i18n.json | 3 ++- .../src/vs/platform/environment/node/argv.i18n.json | 3 +++ .../node/extensionManagementService.i18n.json | 2 ++ .../issue/electron-main/issueService.i18n.json | 3 ++- .../platform/theme/common/colorRegistry.i18n.json | 4 ++++ .../inactiveExtensionUrlHandler.i18n.json | 3 ++- .../browser/viewsContainersExtensionPoint.i18n.json | 9 +++++++++ .../api/browser/viewsExtensionPoint.i18n.json | 6 ++++++ .../mainThreadSaveParticipant.i18n.json | 1 + .../browser/parts/editor/resourceViewer.i18n.json | 3 +++ .../electron-browser/main.contribution.i18n.json | 1 + .../parts/debug/browser/breakpointsView.i18n.json | 5 ++++- .../parts/debug/browser/debugActions.i18n.json | 1 + .../debug/browser/debugEditorActions.i18n.json | 2 +- .../electron-browser/breakpointWidget.i18n.json | 1 + .../debugConfigurationManager.i18n.json | 1 + .../debugEditorContribution.i18n.json | 12 +++++++++++- .../electron-browser/extensionEditor.i18n.json | 2 ++ .../files/browser/editors/textFileEditor.i18n.json | 2 ++ .../files/electron-browser/fileActions.i18n.json | 8 ++++++++ .../electron-browser/files.contribution.i18n.json | 1 + .../electron-browser/views/explorerViewer.i18n.json | 3 +++ .../localizations.contribution.i18n.json | 2 ++ .../markers/electron-browser/markersPanel.i18n.json | 2 +- .../electron-browser/markersPanelActions.i18n.json | 3 ++- .../markers/electron-browser/messages.i18n.json | 2 ++ .../electron-browser/search.contribution.i18n.json | 1 + .../tasks/common/taskDefinitionRegistry.i18n.json | 2 +- .../electron-browser/terminalTaskSystem.i18n.json | 2 +- .../electron-browser/terminalInstance.i18n.json | 3 ++- .../url/electron-browser/url.contribution.i18n.json | 1 + .../electron-browser/webviewCommands.i18n.json | 3 ++- .../node/variableResolver.i18n.json | 13 ++++++++++++- .../extensions/common/extensionsRegistry.i18n.json | 1 + .../electron-browser/remoteFileService.i18n.json | 4 +++- i18n/deu/extensions/emmet/package.i18n.json | 4 +++- i18n/deu/extensions/git/out/commands.i18n.json | 4 +--- .../out/security.i18n.json | 2 ++ i18n/deu/extensions/npm/out/npmView.i18n.json | 4 +++- i18n/deu/extensions/npm/package.i18n.json | 7 ++++++- i18n/deu/extensions/php/package.i18n.json | 1 + .../out/features/completionItemProvider.i18n.json | 3 ++- .../typescript-language-features/package.i18n.json | 9 ++++++++- i18n/deu/src/vs/base/node/processes.i18n.json | 3 ++- i18n/deu/src/vs/base/node/zip.i18n.json | 1 + .../issue/issueReporterMain.i18n.json | 2 ++ .../issue/issueReporterPage.i18n.json | 3 +++ .../processExplorer/processExplorerMain.i18n.json | 7 ++++++- i18n/deu/src/vs/code/electron-main/menus.i18n.json | 2 ++ .../vs/editor/browser/widget/diffReview.i18n.json | 4 ++++ .../src/vs/editor/common/commonCodeEditor.i18n.json | 3 ++- .../common/config/commonEditorConfig.i18n.json | 10 +++++++++- .../common/view/editorColorRegistry.i18n.json | 1 + .../contrib/codeAction/codeActionCommands.i18n.json | 4 +++- .../vs/editor/contrib/find/findController.i18n.json | 1 + .../contrib/message/messageController.i18n.json | 3 ++- .../referenceSearch/referencesWidget.i18n.json | 3 ++- .../src/vs/platform/environment/node/argv.i18n.json | 3 +++ .../node/extensionManagementService.i18n.json | 2 ++ .../platform/theme/common/colorRegistry.i18n.json | 4 ++++ .../inactiveExtensionUrlHandler.i18n.json | 3 ++- .../browser/viewsContainersExtensionPoint.i18n.json | 9 +++++++++ .../api/browser/viewsExtensionPoint.i18n.json | 6 ++++++ .../mainThreadSaveParticipant.i18n.json | 1 + .../electron-browser/mainThreadWebview.i18n.json | 3 ++- .../browser/parts/editor/editorStatus.i18n.json | 1 + .../browser/parts/editor/resourceViewer.i18n.json | 4 ++++ .../browser/parts/quickinput/quickInput.i18n.json | 1 + .../parts/quickinput/quickInputBox.i18n.json | 3 ++- .../vs/workbench/electron-browser/actions.i18n.json | 1 + .../electron-browser/main.contribution.i18n.json | 1 + .../parts/debug/browser/breakpointsView.i18n.json | 5 ++++- .../parts/debug/browser/debugActions.i18n.json | 1 + .../electron-browser/breakpointWidget.i18n.json | 1 + .../debugConfigurationManager.i18n.json | 1 + .../debugEditorContribution.i18n.json | 10 ++++++++++ .../extensions/browser/extensionsActions.i18n.json | 2 +- .../electron-browser/extensionEditor.i18n.json | 2 ++ .../electron-browser/extensionsViewlet.i18n.json | 1 + .../files/browser/editors/textFileEditor.i18n.json | 2 ++ .../files/electron-browser/fileActions.i18n.json | 8 ++++++++ .../electron-browser/files.contribution.i18n.json | 1 + .../electron-browser/views/explorerViewer.i18n.json | 3 +++ .../localizations.contribution.i18n.json | 2 ++ .../electron-browser/markers.contribution.i18n.json | 3 ++- .../markers/electron-browser/markersPanel.i18n.json | 4 +++- .../electron-browser/markersPanelActions.i18n.json | 3 ++- .../markers/electron-browser/messages.i18n.json | 5 +++++ .../preferences/browser/preferencesEditor.i18n.json | 2 ++ .../parts/scm/electron-browser/scmViewlet.i18n.json | 3 ++- .../electron-browser/search.contribution.i18n.json | 5 ++++- .../tasks/common/taskDefinitionRegistry.i18n.json | 2 +- .../electron-browser/task.contribution.i18n.json | 2 ++ .../electron-browser/terminalTaskSystem.i18n.json | 2 +- .../electron-browser/terminalActions.i18n.json | 6 +++++- .../electron-browser/terminalInstance.i18n.json | 3 ++- .../parts/update/electron-browser/update.i18n.json | 2 ++ .../url/electron-browser/url.contribution.i18n.json | 1 + .../overlay/browser/welcomeOverlay.i18n.json | 1 + .../electron-browser/vs_code_welcome_page.i18n.json | 2 ++ .../common/configurationExtensionPoint.i18n.json | 1 + .../node/configurationEditingService.i18n.json | 1 + .../node/configurationService.i18n.json | 1 + .../node/variableResolver.i18n.json | 13 ++++++++++++- .../extensions/common/extensionsRegistry.i18n.json | 5 +++++ .../electron-browser/extensionService.i18n.json | 2 ++ .../files/electron-browser/fileService.i18n.json | 1 + .../electron-browser/remoteFileService.i18n.json | 4 +++- i18n/esn/extensions/git/out/commands.i18n.json | 4 +--- i18n/esn/extensions/npm/out/npmView.i18n.json | 4 +++- i18n/esn/extensions/npm/package.i18n.json | 7 ++++++- i18n/esn/src/vs/code/electron-main/menus.i18n.json | 2 +- .../common/config/commonEditorConfig.i18n.json | 10 ++++++++-- .../contrib/codeAction/codeActionCommands.i18n.json | 3 ++- .../src/vs/platform/environment/node/argv.i18n.json | 1 + .../platform/theme/common/colorRegistry.i18n.json | 4 ++++ .../inactiveExtensionUrlHandler.i18n.json | 3 ++- .../browser/viewsContainersExtensionPoint.i18n.json | 7 +++++-- .../api/browser/viewsExtensionPoint.i18n.json | 5 +++++ .../mainThreadSaveParticipant.i18n.json | 1 + .../parts/debug/browser/breakpointsView.i18n.json | 4 ++-- .../debug/browser/debugEditorActions.i18n.json | 2 +- .../debugEditorContribution.i18n.json | 5 +++-- .../electron-browser/extensionEditor.i18n.json | 1 + .../files/electron-browser/fileActions.i18n.json | 4 ++++ .../localizations.contribution.i18n.json | 2 ++ .../markers/electron-browser/markersPanel.i18n.json | 2 +- .../markers/electron-browser/messages.i18n.json | 3 +++ .../electron-browser/search.contribution.i18n.json | 5 ++++- .../tasks/common/taskDefinitionRegistry.i18n.json | 2 +- .../electron-browser/terminalTaskSystem.i18n.json | 2 +- .../electron-browser/vs_code_welcome_page.i18n.json | 1 + .../common/configurationExtensionPoint.i18n.json | 1 + .../node/variableResolver.i18n.json | 7 ++++++- .../extensions/common/extensionsRegistry.i18n.json | 1 + .../electron-browser/remoteFileService.i18n.json | 3 ++- i18n/fra/extensions/git/out/commands.i18n.json | 4 +--- i18n/fra/extensions/npm/out/npmView.i18n.json | 4 +++- i18n/fra/extensions/npm/package.i18n.json | 7 ++++++- i18n/fra/src/vs/code/electron-main/menus.i18n.json | 2 +- .../common/config/commonEditorConfig.i18n.json | 5 ++--- .../platform/theme/common/colorRegistry.i18n.json | 4 ++++ .../inactiveExtensionUrlHandler.i18n.json | 3 ++- .../browser/viewsContainersExtensionPoint.i18n.json | 7 +++++-- .../api/browser/viewsExtensionPoint.i18n.json | 2 ++ .../mainThreadSaveParticipant.i18n.json | 1 + .../parts/debug/browser/breakpointsView.i18n.json | 4 ++-- .../debug/browser/debugEditorActions.i18n.json | 2 +- .../debugEditorContribution.i18n.json | 5 +++-- .../files/electron-browser/fileActions.i18n.json | 4 ++++ .../localizations.contribution.i18n.json | 2 ++ .../markers/electron-browser/markersPanel.i18n.json | 2 +- .../electron-browser/search.contribution.i18n.json | 1 + .../tasks/common/taskDefinitionRegistry.i18n.json | 2 +- .../electron-browser/terminalTaskSystem.i18n.json | 2 +- .../node/variableResolver.i18n.json | 1 + .../extensions/common/extensionsRegistry.i18n.json | 1 + .../electron-browser/remoteFileService.i18n.json | 3 ++- i18n/hun/extensions/emmet/package.i18n.json | 4 +++- i18n/hun/extensions/git/out/commands.i18n.json | 4 +--- .../out/security.i18n.json | 1 + i18n/hun/extensions/npm/out/npmView.i18n.json | 4 +++- i18n/hun/extensions/npm/package.i18n.json | 6 +++++- i18n/hun/extensions/php/package.i18n.json | 1 + .../typescript-language-features/package.i18n.json | 9 ++++++++- .../common/config/commonEditorConfig.i18n.json | 3 +-- .../referenceSearch/referencesWidget.i18n.json | 3 ++- .../platform/theme/common/colorRegistry.i18n.json | 1 + .../inactiveExtensionUrlHandler.i18n.json | 3 ++- .../browser/viewsContainersExtensionPoint.i18n.json | 7 +++++-- .../api/browser/viewsExtensionPoint.i18n.json | 2 ++ .../debugEditorContribution.i18n.json | 1 + .../files/electron-browser/fileActions.i18n.json | 4 ++++ .../localizations.contribution.i18n.json | 1 + .../markers/electron-browser/markersPanel.i18n.json | 2 +- .../electron-browser/search.contribution.i18n.json | 1 + .../tasks/common/taskDefinitionRegistry.i18n.json | 2 +- .../electron-browser/terminalTaskSystem.i18n.json | 2 +- .../extensions/common/extensionsRegistry.i18n.json | 5 +++++ .../electron-browser/extensionService.i18n.json | 2 ++ .../files/electron-browser/fileService.i18n.json | 1 + .../electron-browser/remoteFileService.i18n.json | 4 +++- i18n/ita/extensions/emmet/package.i18n.json | 4 +++- i18n/ita/extensions/git/out/commands.i18n.json | 4 +--- .../out/security.i18n.json | 2 ++ i18n/ita/extensions/npm/out/npmView.i18n.json | 4 +++- i18n/ita/extensions/npm/package.i18n.json | 7 ++++++- i18n/ita/extensions/php/package.i18n.json | 1 + .../typescript-language-features/package.i18n.json | 10 +++++++++- i18n/ita/src/vs/base/node/processes.i18n.json | 3 ++- i18n/ita/src/vs/base/node/zip.i18n.json | 1 + .../issue/issueReporterMain.i18n.json | 2 ++ .../issue/issueReporterPage.i18n.json | 3 +++ .../processExplorer/processExplorerMain.i18n.json | 7 ++++++- i18n/ita/src/vs/code/electron-main/menus.i18n.json | 2 ++ .../vs/editor/browser/widget/diffReview.i18n.json | 4 ++++ .../src/vs/editor/common/commonCodeEditor.i18n.json | 3 ++- .../common/config/commonEditorConfig.i18n.json | 11 +++++++++++ .../common/view/editorColorRegistry.i18n.json | 1 + .../contrib/codeAction/codeActionCommands.i18n.json | 9 ++++++++- .../vs/editor/contrib/find/findController.i18n.json | 1 + .../editor/contrib/format/formatActions.i18n.json | 4 +++- .../ita/src/vs/editor/contrib/links/links.i18n.json | 2 ++ .../contrib/message/messageController.i18n.json | 3 ++- .../referenceSearch/referencesWidget.i18n.json | 3 ++- .../src/vs/platform/environment/node/argv.i18n.json | 3 +++ .../node/extensionManagementService.i18n.json | 2 ++ .../extensions/node/extensionValidator.i18n.json | 1 + .../issue/electron-main/issueService.i18n.json | 3 ++- .../platform/theme/common/colorRegistry.i18n.json | 4 ++++ .../inactiveExtensionUrlHandler.i18n.json | 3 ++- .../browser/viewsContainersExtensionPoint.i18n.json | 9 +++++++++ .../api/browser/viewsExtensionPoint.i18n.json | 6 ++++++ .../mainThreadSaveParticipant.i18n.json | 1 + .../electron-browser/mainThreadWebview.i18n.json | 3 ++- .../browser/parts/editor/editorStatus.i18n.json | 1 + .../browser/parts/editor/resourceViewer.i18n.json | 4 ++++ .../browser/parts/quickinput/quickInput.i18n.json | 1 + .../parts/quickinput/quickInputBox.i18n.json | 3 ++- .../vs/workbench/electron-browser/actions.i18n.json | 1 + .../electron-browser/main.contribution.i18n.json | 1 + .../parts/debug/browser/breakpointsView.i18n.json | 3 +++ .../parts/debug/browser/debugActions.i18n.json | 1 + .../electron-browser/breakpointWidget.i18n.json | 1 + .../debugConfigurationManager.i18n.json | 1 + .../debugEditorContribution.i18n.json | 10 ++++++++++ .../workbench/parts/debug/node/debugger.i18n.json | 1 + .../electron-browser/extensionEditor.i18n.json | 2 ++ .../electron-browser/extensionsViewlet.i18n.json | 1 + .../files/browser/editors/textFileEditor.i18n.json | 2 ++ .../files/electron-browser/fileActions.i18n.json | 8 ++++++++ .../electron-browser/files.contribution.i18n.json | 1 + .../electron-browser/views/explorerViewer.i18n.json | 3 +++ .../localizations.contribution.i18n.json | 2 ++ .../markers/electron-browser/markersPanel.i18n.json | 4 +++- .../electron-browser/markersPanelActions.i18n.json | 3 ++- .../markers/electron-browser/messages.i18n.json | 5 +++++ .../preferences/browser/preferencesEditor.i18n.json | 2 ++ .../electron-browser/search.contribution.i18n.json | 5 ++++- .../tasks/common/taskDefinitionRegistry.i18n.json | 2 +- .../electron-browser/task.contribution.i18n.json | 2 ++ .../electron-browser/terminalTaskSystem.i18n.json | 2 +- .../electron-browser/terminalActions.i18n.json | 4 ++++ .../electron-browser/terminalInstance.i18n.json | 3 ++- .../parts/update/electron-browser/update.i18n.json | 2 ++ .../url/electron-browser/url.contribution.i18n.json | 1 + .../overlay/browser/welcomeOverlay.i18n.json | 1 + .../electron-browser/vs_code_welcome_page.i18n.json | 2 ++ .../common/configurationExtensionPoint.i18n.json | 1 + .../node/configurationEditingService.i18n.json | 1 + .../node/configurationService.i18n.json | 1 + .../node/variableResolver.i18n.json | 13 ++++++++++++- .../extensions/common/extensionsRegistry.i18n.json | 5 +++++ .../electron-browser/extensionService.i18n.json | 2 ++ .../files/electron-browser/fileService.i18n.json | 1 + .../electron-browser/remoteFileService.i18n.json | 4 +++- i18n/jpn/extensions/git/out/commands.i18n.json | 4 +--- i18n/jpn/extensions/npm/out/npmView.i18n.json | 2 +- i18n/jpn/extensions/npm/package.i18n.json | 2 +- i18n/jpn/src/vs/code/electron-main/menus.i18n.json | 2 +- .../common/config/commonEditorConfig.i18n.json | 5 ++--- .../browser/viewsContainersExtensionPoint.i18n.json | 8 +++++--- .../api/browser/viewsExtensionPoint.i18n.json | 2 ++ .../parts/debug/browser/breakpointsView.i18n.json | 4 ++-- .../debug/browser/debugEditorActions.i18n.json | 2 +- .../debugEditorContribution.i18n.json | 5 +++-- .../files/electron-browser/fileActions.i18n.json | 4 ++++ .../localizations.contribution.i18n.json | 1 + .../markers/electron-browser/markersPanel.i18n.json | 2 +- .../electron-browser/search.contribution.i18n.json | 1 + .../tasks/common/taskDefinitionRegistry.i18n.json | 2 +- .../electron-browser/terminalTaskSystem.i18n.json | 2 +- .../extensions/common/extensionsRegistry.i18n.json | 1 + .../electron-browser/remoteFileService.i18n.json | 3 ++- i18n/kor/extensions/emmet/package.i18n.json | 4 +++- i18n/kor/extensions/git/out/commands.i18n.json | 4 +--- .../out/security.i18n.json | 2 ++ i18n/kor/extensions/npm/out/npmView.i18n.json | 4 +++- i18n/kor/extensions/npm/package.i18n.json | 7 ++++++- i18n/kor/extensions/php/package.i18n.json | 1 + .../out/utils/versionProvider.i18n.json | 1 + .../typescript-language-features/package.i18n.json | 9 ++++++++- i18n/kor/src/vs/base/node/processes.i18n.json | 3 ++- i18n/kor/src/vs/base/node/zip.i18n.json | 1 + .../issue/issueReporterMain.i18n.json | 2 ++ .../issue/issueReporterPage.i18n.json | 3 +++ .../processExplorer/processExplorerMain.i18n.json | 7 ++++++- i18n/kor/src/vs/code/electron-main/menus.i18n.json | 2 ++ .../vs/editor/browser/widget/diffReview.i18n.json | 4 ++++ .../src/vs/editor/common/commonCodeEditor.i18n.json | 3 ++- .../common/config/commonEditorConfig.i18n.json | 12 ++++++++++++ .../common/view/editorColorRegistry.i18n.json | 1 + .../contrib/codeAction/codeActionCommands.i18n.json | 9 ++++++++- .../vs/editor/contrib/find/findController.i18n.json | 1 + .../editor/contrib/format/formatActions.i18n.json | 4 +++- .../kor/src/vs/editor/contrib/links/links.i18n.json | 2 ++ .../contrib/message/messageController.i18n.json | 3 ++- .../referenceSearch/referencesWidget.i18n.json | 3 ++- .../src/vs/platform/environment/node/argv.i18n.json | 3 +++ .../node/extensionManagementService.i18n.json | 2 ++ .../extensions/node/extensionValidator.i18n.json | 1 + .../issue/electron-main/issueService.i18n.json | 3 ++- .../platform/theme/common/colorRegistry.i18n.json | 4 ++++ .../inactiveExtensionUrlHandler.i18n.json | 3 ++- .../browser/viewsContainersExtensionPoint.i18n.json | 9 +++++++++ .../api/browser/viewsExtensionPoint.i18n.json | 6 ++++++ .../mainThreadSaveParticipant.i18n.json | 1 + .../electron-browser/mainThreadWebview.i18n.json | 3 ++- .../browser/parts/editor/editorStatus.i18n.json | 1 + .../browser/parts/editor/resourceViewer.i18n.json | 4 ++++ .../browser/parts/quickinput/quickInput.i18n.json | 1 + .../parts/quickinput/quickInputBox.i18n.json | 3 ++- .../vs/workbench/electron-browser/actions.i18n.json | 1 + .../electron-browser/main.contribution.i18n.json | 1 + .../parts/debug/browser/breakpointsView.i18n.json | 5 ++++- .../parts/debug/browser/debugActions.i18n.json | 1 + .../debug/browser/debugEditorActions.i18n.json | 2 +- .../electron-browser/breakpointWidget.i18n.json | 1 + .../debugConfigurationManager.i18n.json | 1 + .../debugEditorContribution.i18n.json | 12 +++++++++++- .../electron-browser/extensionEditor.i18n.json | 2 ++ .../electron-browser/extensionsViewlet.i18n.json | 1 + .../files/browser/editors/textFileEditor.i18n.json | 2 ++ .../files/electron-browser/fileActions.i18n.json | 8 ++++++++ .../electron-browser/files.contribution.i18n.json | 1 + .../electron-browser/views/explorerViewer.i18n.json | 3 +++ .../localizations.contribution.i18n.json | 2 ++ .../electron-browser/markers.contribution.i18n.json | 3 ++- .../markers/electron-browser/markersPanel.i18n.json | 4 +++- .../electron-browser/markersPanelActions.i18n.json | 3 ++- .../markers/electron-browser/messages.i18n.json | 5 +++++ .../preferences/browser/preferencesEditor.i18n.json | 2 ++ .../parts/scm/electron-browser/scmViewlet.i18n.json | 3 ++- .../parts/search/browser/searchActions.i18n.json | 2 ++ .../electron-browser/search.contribution.i18n.json | 5 ++++- .../tasks/common/taskDefinitionRegistry.i18n.json | 2 +- .../electron-browser/task.contribution.i18n.json | 2 ++ .../electron-browser/terminalTaskSystem.i18n.json | 2 +- .../terminal/common/terminalColorRegistry.i18n.json | 1 + .../electron-browser/terminalActions.i18n.json | 4 ++++ .../electron-browser/terminalInstance.i18n.json | 3 ++- .../parts/update/electron-browser/update.i18n.json | 2 ++ .../url/electron-browser/url.contribution.i18n.json | 1 + .../overlay/browser/welcomeOverlay.i18n.json | 1 + .../electron-browser/vs_code_welcome_page.i18n.json | 2 ++ .../common/configurationExtensionPoint.i18n.json | 1 + .../node/configurationEditingService.i18n.json | 1 + .../node/configurationService.i18n.json | 1 + .../node/variableResolver.i18n.json | 13 ++++++++++++- .../extensions/common/extensionsRegistry.i18n.json | 5 +++++ .../electron-browser/extensionService.i18n.json | 2 ++ .../files/electron-browser/fileService.i18n.json | 1 + .../electron-browser/remoteFileService.i18n.json | 4 +++- i18n/ptb/extensions/git/out/commands.i18n.json | 3 --- i18n/ptb/src/vs/code/electron-main/menus.i18n.json | 1 - .../common/config/commonEditorConfig.i18n.json | 2 -- .../browser/viewsContainersExtensionPoint.i18n.json | 4 ++-- .../parts/debug/browser/breakpointsView.i18n.json | 2 -- .../debug/browser/debugEditorActions.i18n.json | 1 - .../debugEditorContribution.i18n.json | 2 -- .../tasks/common/taskDefinitionRegistry.i18n.json | 1 - .../electron-browser/terminalTaskSystem.i18n.json | 1 - .../electron-browser/remoteFileService.i18n.json | 3 ++- i18n/rus/extensions/emmet/package.i18n.json | 1 + i18n/rus/extensions/git/out/commands.i18n.json | 4 +--- i18n/rus/extensions/npm/out/npmView.i18n.json | 4 +++- i18n/rus/extensions/npm/package.i18n.json | 7 ++++++- i18n/rus/extensions/php/package.i18n.json | 1 + .../out/utils/api.i18n.json | 3 ++- .../typescript-language-features/package.i18n.json | 9 ++++++++- i18n/rus/src/vs/base/node/processes.i18n.json | 3 ++- i18n/rus/src/vs/base/node/zip.i18n.json | 1 + .../issue/issueReporterMain.i18n.json | 1 + .../issue/issueReporterPage.i18n.json | 2 ++ .../processExplorer/processExplorerMain.i18n.json | 6 +++++- .../vs/editor/browser/widget/diffReview.i18n.json | 4 ++++ .../src/vs/editor/common/commonCodeEditor.i18n.json | 3 ++- .../common/config/commonEditorConfig.i18n.json | 12 ++++++++++++ .../common/view/editorColorRegistry.i18n.json | 2 ++ .../contrib/codeAction/codeActionCommands.i18n.json | 9 ++++++++- .../vs/editor/contrib/find/findController.i18n.json | 1 + .../editor/contrib/format/formatActions.i18n.json | 4 +++- .../rus/src/vs/editor/contrib/links/links.i18n.json | 2 ++ .../contrib/message/messageController.i18n.json | 3 ++- .../referenceSearch/referencesWidget.i18n.json | 3 ++- .../src/vs/platform/environment/node/argv.i18n.json | 3 +++ .../node/extensionManagementService.i18n.json | 2 ++ .../extensions/node/extensionValidator.i18n.json | 1 + .../issue/electron-main/issueService.i18n.json | 3 ++- .../platform/theme/common/colorRegistry.i18n.json | 4 ++++ .../inactiveExtensionUrlHandler.i18n.json | 3 ++- .../browser/viewsContainersExtensionPoint.i18n.json | 5 +++++ .../parts/debug/browser/breakpointsView.i18n.json | 1 - .../debug/browser/debugEditorActions.i18n.json | 1 - .../debugEditorContribution.i18n.json | 1 - .../markers/electron-browser/markersPanel.i18n.json | 3 ++- .../electron-browser/search.contribution.i18n.json | 1 + .../tasks/common/taskDefinitionRegistry.i18n.json | 1 - .../electron-browser/terminalTaskSystem.i18n.json | 1 - .../url/electron-browser/url.contribution.i18n.json | 1 + .../electron-browser/remoteFileService.i18n.json | 4 +++- i18n/trk/extensions/emmet/package.i18n.json | 4 +++- i18n/trk/extensions/git/out/commands.i18n.json | 4 +--- .../out/security.i18n.json | 2 ++ i18n/trk/extensions/npm/out/npmView.i18n.json | 4 +++- i18n/trk/extensions/npm/package.i18n.json | 6 +++++- i18n/trk/extensions/php/package.i18n.json | 1 + .../typescript-language-features/package.i18n.json | 9 ++++++++- i18n/trk/src/vs/base/node/processes.i18n.json | 3 ++- i18n/trk/src/vs/base/node/zip.i18n.json | 1 + .../processExplorer/processExplorerMain.i18n.json | 7 ++++++- i18n/trk/src/vs/code/electron-main/menus.i18n.json | 1 + .../vs/editor/browser/widget/diffReview.i18n.json | 4 ++++ .../src/vs/editor/common/commonCodeEditor.i18n.json | 3 ++- .../common/config/commonEditorConfig.i18n.json | 12 ++++++++++++ .../common/view/editorColorRegistry.i18n.json | 2 ++ .../contrib/codeAction/codeActionCommands.i18n.json | 9 ++++++++- .../vs/editor/contrib/find/findController.i18n.json | 1 + .../editor/contrib/format/formatActions.i18n.json | 4 +++- .../trk/src/vs/editor/contrib/links/links.i18n.json | 8 +++++--- .../contrib/message/messageController.i18n.json | 3 ++- .../referenceSearch/referencesWidget.i18n.json | 3 ++- .../src/vs/platform/environment/node/argv.i18n.json | 3 +++ .../node/extensionManagementService.i18n.json | 2 ++ .../extensions/node/extensionValidator.i18n.json | 1 + .../issue/electron-main/issueService.i18n.json | 3 ++- .../platform/theme/common/colorRegistry.i18n.json | 4 ++++ .../inactiveExtensionUrlHandler.i18n.json | 3 ++- .../browser/viewsContainersExtensionPoint.i18n.json | 2 ++ .../parts/debug/browser/breakpointsView.i18n.json | 3 ++- .../parts/debug/browser/debugActions.i18n.json | 1 + .../debugConfigurationManager.i18n.json | 1 + .../debugEditorContribution.i18n.json | 4 ++++ .../electron-browser/extensionEditor.i18n.json | 2 ++ .../electron-browser/extensionsViewlet.i18n.json | 1 + .../files/electron-browser/fileActions.i18n.json | 1 + .../localizations.contribution.i18n.json | 1 + .../markers/electron-browser/markersPanel.i18n.json | 3 ++- .../markers/electron-browser/messages.i18n.json | 1 + .../preferences/browser/preferencesEditor.i18n.json | 2 ++ .../electron-browser/search.contribution.i18n.json | 2 ++ .../tasks/common/taskDefinitionRegistry.i18n.json | 1 - .../electron-browser/terminalTaskSystem.i18n.json | 1 - .../electron-browser/terminalActions.i18n.json | 3 +++ .../parts/update/electron-browser/update.i18n.json | 1 + .../url/electron-browser/url.contribution.i18n.json | 1 + .../overlay/browser/welcomeOverlay.i18n.json | 1 + .../electron-browser/vs_code_welcome_page.i18n.json | 1 + .../node/variableResolver.i18n.json | 5 ++++- .../extensions/common/extensionsRegistry.i18n.json | 2 ++ .../electron-browser/extensionService.i18n.json | 2 ++ .../electron-browser/remoteFileService.i18n.json | 4 +++- 503 files changed, 1275 insertions(+), 305 deletions(-) diff --git a/i18n/chs/extensions/git/out/commands.i18n.json b/i18n/chs/extensions/git/out/commands.i18n.json index d4f3c5641f1..6b84808b73f 100644 --- a/i18n/chs/extensions/git/out/commands.i18n.json +++ b/i18n/chs/extensions/git/out/commands.i18n.json @@ -11,9 +11,7 @@ "create branch": "$(plus) 创建新分支", "repourl": "存储库 URL", "parent": "父目录", - "cancel": "$(sync~spin) 正在克隆存储库... 点击取消", - "cancel tooltip": "取消克隆", - "cloning": "正在克隆 Git 存储库...", + "cloning": "正在克隆 Git 存储库“{0}”...", "openrepo": "打开存储库", "proposeopen": "是否要打开已克隆存储库?", "init": "选择用于初始化 Git 储存库的工作区文件夹", diff --git a/i18n/chs/extensions/git/package.i18n.json b/i18n/chs/extensions/git/package.i18n.json index 1ffec732d41..7c2a3b49c9f 100644 --- a/i18n/chs/extensions/git/package.i18n.json +++ b/i18n/chs/extensions/git/package.i18n.json @@ -26,7 +26,7 @@ "command.unstageSelectedRanges": "取消暂存所选范围", "command.clean": "放弃更改", "command.cleanAll": "放弃所有更改", - "command.commit": "Commit", + "command.commit": "提交", "command.commitStaged": "提交已暂存文件", "command.commitStagedSigned": "提交已暂存文件(已签名)", "command.commitStagedAmend": "已暂存提交(修改)", diff --git a/i18n/chs/extensions/npm/out/npmView.i18n.json b/i18n/chs/extensions/npm/out/npmView.i18n.json index 5978906c3fb..d5495533349 100644 --- a/i18n/chs/extensions/npm/out/npmView.i18n.json +++ b/i18n/chs/extensions/npm/out/npmView.i18n.json @@ -6,6 +6,6 @@ "--------------------------------------------------------------------------------------------", "Do not edit this file. It is machine generated." ], - "npm.noDebugOptions": "无法启动“{0}”并进行调试。此脚本需要包含 node 调试选项: \"--nolazy --inspect-brk=端口号\",[了解更多](https://code.visualstudio.com/docs/nodejs/nodejs-debugging#_launch-configuration-support-for-npm-and-other-tools)。", + "npm.noDebugOptions": "无法启动“{0}”并进行调试。脚本缺少 Node 调试选项,如 \"--inspect-brk\"。", "npm.scriptInvalid": "找不到脚本“{0}”。请尝试刷新视图。" } \ No newline at end of file diff --git a/i18n/chs/extensions/npm/package.i18n.json b/i18n/chs/extensions/npm/package.i18n.json index b0c78e7ec44..26fe779a0bd 100644 --- a/i18n/chs/extensions/npm/package.i18n.json +++ b/i18n/chs/extensions/npm/package.i18n.json @@ -22,5 +22,5 @@ "command.debug": "调试", "command.openScript": "开放", "npm.scriptInvalid": "找不到脚本“{0}”。请尝试刷新视图。", - "npm.noDebugOptions": "无法启动“{0}”并进行调试。此脚本需要包含 node 调试选项: \"--nolazy --inspect-brk=端口号\",[了解更多](https://code.visualstudio.com/docs/nodejs/nodejs-debugging#_launch-configuration-support-for-npm-and-other-tools)。" + "npm.noDebugOptions": "无法启动“{0}”并进行调试。脚本缺少 Node 调试选项,如 \"--inspect-brk\"。" } \ No newline at end of file diff --git a/i18n/chs/src/vs/code/electron-main/menus.i18n.json b/i18n/chs/src/vs/code/electron-main/menus.i18n.json index 1a8ea044c9f..14fa6fe6467 100644 --- a/i18n/chs/src/vs/code/electron-main/menus.i18n.json +++ b/i18n/chs/src/vs/code/electron-main/menus.i18n.json @@ -122,8 +122,8 @@ "miFocusFirstGroup": "第一组(&&F)", "miFocusSecondGroup": "第二组(&&S)", "miFocusThirdGroup": "第三组(&&T)", - "miNextGroup": "下一个组(&&N)", - "miPreviousGroup": "上一个组(&&P)", + "miNextGroup": "下一组(&&N)", + "miPreviousGroup": "上一组(&&P)", "miSwitchGroup": "切换组(&&G)", "miGotoFile": "转到文件(&&F)...", "miGotoSymbolInFile": "转到文件中的符号(&&S)...", diff --git a/i18n/chs/src/vs/editor/common/config/commonEditorConfig.i18n.json b/i18n/chs/src/vs/editor/common/config/commonEditorConfig.i18n.json index 446507bbe40..585db34a8cd 100644 --- a/i18n/chs/src/vs/editor/common/config/commonEditorConfig.i18n.json +++ b/i18n/chs/src/vs/editor/common/config/commonEditorConfig.i18n.json @@ -29,7 +29,7 @@ "smoothScrolling": "控制编辑器是否在滚动时使用动画", "minimap.enabled": "控制是否显示 minimap", "minimap.side": "控制在哪一侧显示小地图。", - "minimap.showSlider": "控制是否自动隐藏迷你地图滑块。 ", + "minimap.showSlider": "控制是否自动隐藏小地图滑块。", "minimap.renderCharacters": "呈现某行上的实际字符(与颜色块相反)", "minimap.maxColumn": "限制最小映射的宽度,尽量多地呈现特定数量的列", "find.seedSearchStringFromSelection": "控制是否将编辑器的选中内容作为搜索词填入到查找组件", @@ -78,7 +78,7 @@ "overviewRulerLanes": "控制可在概述标尺同一位置显示的效果数量", "overviewRulerBorder": "控制概述标尺周围是否要绘制边框。", "cursorBlinking": "控制光标的动画样式。", - "mouseWheelZoom": "通过使用鼠标滚轮同时按住 Ctrl 可缩放编辑器的字体", + "mouseWheelZoom": "按住 Ctrl 键并滚动鼠标滚轮可缩放编辑器字体大小", "cursorStyle": "控制光标样式,接受的值为 \"block\"、\"block-outline\"、\"line\"、\"line-thin\" 、\"underline\" 和 \"underline-thin\"", "cursorWidth": "当 editor.cursorStyle 设置为 \"line\" 时控制光标的宽度。", "fontLigatures": "启用字体连字", @@ -112,7 +112,6 @@ "selectionClipboard": "控制是否支持 Linux 主剪贴板。", "sideBySide": "控制 Diff 编辑器以并排或内联形式显示差异", "ignoreTrimWhitespace": "控制差异编辑器是否将对前导空格或尾随空格的更改显示为差异", - "largeFileSize": "控制以字节为单位的文件大小阈值,大于此值时将应用特殊的优化规则", - "largeFileLineCount": "控制文件行数的阈值,大于此值时将应用特殊的优化规则", + "largeFileOptimizations": "对大型文件进行特殊处理,禁用某些内存密集型功能。", "renderIndicators": "控制差异编辑器是否为已添加/删除的更改显示 +/- 指示符号" } \ No newline at end of file diff --git a/i18n/chs/src/vs/platform/environment/node/argv.i18n.json b/i18n/chs/src/vs/platform/environment/node/argv.i18n.json index 1571b950704..ccf8bf4ef50 100644 --- a/i18n/chs/src/vs/platform/environment/node/argv.i18n.json +++ b/i18n/chs/src/vs/platform/environment/node/argv.i18n.json @@ -29,8 +29,8 @@ "performance": "通过启用 \"Developer: Startup Performance\" 命令开始。", "prof-startup": "启动期间运行 CPU 探查器", "disableExtensions": "禁用所有已安装的扩展。", - "inspect-extensions": "允许调试和分析扩展。您可以在开发人员工具中找到连接 URI 。", - "inspect-brk-extensions": "允许扩展宿主在启动后暂停时进行扩展的调试和分析。您可以在开发人员工具中找到连接 URI 。", + "inspect-extensions": "允许调试和分析扩展。您可以在开发人员工具中找到连接 URI。", + "inspect-brk-extensions": "允许扩展宿主在启动后暂停时进行扩展的调试和分析。您可以在开发人员工具中找到连接 URI。", "disableGPU": "禁用 GPU 硬件加速。", "uploadLogs": "将当前会话的日志上传到安全端点。", "maxMemory": "单个窗口最大内存大小 (单位为 MB)。", diff --git a/i18n/chs/src/vs/platform/extensionManagement/node/extensionManagementService.i18n.json b/i18n/chs/src/vs/platform/extensionManagement/node/extensionManagementService.i18n.json index 9a006505317..4fcb94ae060 100644 --- a/i18n/chs/src/vs/platform/extensionManagement/node/extensionManagementService.i18n.json +++ b/i18n/chs/src/vs/platform/extensionManagement/node/extensionManagementService.i18n.json @@ -22,7 +22,7 @@ "quitCode": "无法安装扩展。请在重启 VS Code 后重新安装。", "exitCode": "无法安装扩展。请在重启 VS Code 后重新安装。", "renameError": "将 {0} 重命名为 {1} 时发生未知错误", - "uninstallDependeciesConfirmation": "要仅卸载“{0}”或者其依赖项也一起卸载?", + "uninstallDependeciesConfirmation": "仅卸载“{0}”还是与其依赖项一起卸载?", "uninstallOnly": "仅此扩展", "uninstallAll": "全部卸载", "uninstallConfirmation": "是否确定要卸载“{0}”?", diff --git a/i18n/chs/src/vs/platform/theme/common/colorRegistry.i18n.json b/i18n/chs/src/vs/platform/theme/common/colorRegistry.i18n.json index 66eb4736c07..3e2117c223e 100644 --- a/i18n/chs/src/vs/platform/theme/common/colorRegistry.i18n.json +++ b/i18n/chs/src/vs/platform/theme/common/colorRegistry.i18n.json @@ -71,8 +71,10 @@ "editorSelectionHighlightBorder": "与所选项内容相同的区域的边框颜色。", "editorFindMatch": "当前搜索匹配项的颜色。", "findMatchHighlight": "其他搜索匹配项的颜色。颜色必须透明,使其不会挡住下方的其他元素。", + "findRangeHighlight": "搜索限制范围的颜色。颜色必须透明,使其不会挡住下方的其他元素。", "editorFindMatchBorder": "当前搜索匹配项的边框颜色。", "findMatchHighlightBorder": "其他搜索匹配项的边框颜色。", + "findRangeHighlightBorder": "搜索限制范围的边框颜色。颜色必须透明,使其不会挡住下方的其他元素。", "hoverHighlight": "文本在悬停提示显示时的高亮颜色。颜色必须透明,使其不会挡住下方的其他元素。", "hoverBackground": "编辑器悬停提示的背景颜色。", "hoverBorder": "光标悬停时编辑器的边框颜色。", @@ -86,6 +88,7 @@ "mergeIncomingHeaderBackground": "内嵌的合并冲突处理器中传入版本区域头部的背景色。颜色必须透明,使其不会挡住下方的其他元素。", "mergeIncomingContentBackground": "内嵌的合并冲突处理器中传入版本区域内容的背景色。颜色必须透明,使其不会挡住下方的其他元素。", "mergeCommonHeaderBackground": "内嵌的合并冲突处理器中共同上级区域头部的背景色。颜色必须透明,使其不会挡住下方的其他元素。", + "mergeCommonContentBackground": "内嵌的合并冲突处理器中共同上级区域内容的背景色。颜色必须透明,使其不会挡住下方的其他元素。", "mergeBorder": "内联合并冲突中标头和分割线的边框颜色。", "overviewRulerCurrentContentForeground": "内联合并冲突中当前版本区域的概览标尺前景色。", "overviewRulerIncomingContentForeground": "内联合并冲突中传入的版本区域的概览标尺前景色。", diff --git a/i18n/chs/src/vs/platform/url/electron-browser/inactiveExtensionUrlHandler.i18n.json b/i18n/chs/src/vs/platform/url/electron-browser/inactiveExtensionUrlHandler.i18n.json index 35229bd6699..9c7056bc296 100644 --- a/i18n/chs/src/vs/platform/url/electron-browser/inactiveExtensionUrlHandler.i18n.json +++ b/i18n/chs/src/vs/platform/url/electron-browser/inactiveExtensionUrlHandler.i18n.json @@ -5,5 +5,6 @@ "Licensed under the MIT License. See License.txt in the project root for license information.", "--------------------------------------------------------------------------------------------", "Do not edit this file. It is machine generated." - ] + ], + "confirmUrl": "是否让 {0} 扩展打开以下 URL?" } \ No newline at end of file diff --git a/i18n/chs/src/vs/workbench/api/browser/viewsContainersExtensionPoint.i18n.json b/i18n/chs/src/vs/workbench/api/browser/viewsContainersExtensionPoint.i18n.json index 7d9f143a9ac..5f7e4407bb6 100644 --- a/i18n/chs/src/vs/workbench/api/browser/viewsContainersExtensionPoint.i18n.json +++ b/i18n/chs/src/vs/workbench/api/browser/viewsContainersExtensionPoint.i18n.json @@ -8,11 +8,13 @@ ], "vscode.extension.contributes.views.containers.id": "用于标识容器的唯一 ID,视图能在容器内通过 \"view\" 参与点提供。", "vscode.extension.contributes.views.containers.title": "人类可读的用于表示此容器的字符串", - "vscode.extension.contributes.views.containers.icon": "容器图标的路径", - "vscode.extension.contributes.viewsContainer": "向编辑器提供视图容器", + "vscode.extension.contributes.views.containers.icon": "容器图标的路径。图标大小为 24x24,居中放置在 50x40 的方格内,其填充颜色为 \"rgb(215, 218, 224)\" 或 \"#d7dae0\"。所有图片格式均可用,推荐使用 SVG 格式。", + "vscode.extension.contributes.viewsContainers": "向编辑器提供视图容器", "views.container.activitybar": "向活动栏提供视图容器", - "proposed": "\"viewsContainer\" 参与点仅在以开发模式运行时或附加命令行开关: --enable-proposed-api {1} 时可用", + "test": "测试", + "proposed": "\"viewsContainers\" 参与点仅在以开发模式运行时或附加命令行开关: --enable-proposed-api {1} 时可用", "requirearray": "视图容器必须为数组", + "requireidstring": "属性“{0}”是必要属性,其类型必须是 \"string\"。仅支持字母、数字、\"_\" 和 \"-\"。", "requirestring": "属性“{0}”是必要属性,其类型必须是 \"string\"", "showViewlet": "显示 {0}", "view": "查看" diff --git a/i18n/chs/src/vs/workbench/api/browser/viewsExtensionPoint.i18n.json b/i18n/chs/src/vs/workbench/api/browser/viewsExtensionPoint.i18n.json index 4af73da086f..25d7a8f6bec 100644 --- a/i18n/chs/src/vs/workbench/api/browser/viewsExtensionPoint.i18n.json +++ b/i18n/chs/src/vs/workbench/api/browser/viewsExtensionPoint.i18n.json @@ -16,7 +16,9 @@ "views.explorer": "向活动栏中的“资源管理器”容器提供视图", "views.debug": "向活动栏中的“调试”容器提供视图", "views.scm": "向活动栏中的“源代码管理”容器提供视图", + "views.test": "向活动栏中的“测试”容器提供视图", "views.contributed": "在扩展提供的视图容器中提供视图。", + "ViewContainerDoesnotExist": "视图容器“{0}”不存在。所有注册到其中的视图将被添加到“资源管理器”中。", "duplicateView1": "无法在位置“{1}”注册多个 ID 同为“{0}”的视图。", "duplicateView2": "ID 为“{0}”的视图在位置“{1}”已被注册" } \ No newline at end of file diff --git a/i18n/chs/src/vs/workbench/browser/parts/quickinput/quickInput.i18n.json b/i18n/chs/src/vs/workbench/browser/parts/quickinput/quickInput.i18n.json index 856821d9b96..23748047f41 100644 --- a/i18n/chs/src/vs/workbench/browser/parts/quickinput/quickInput.i18n.json +++ b/i18n/chs/src/vs/workbench/browser/parts/quickinput/quickInput.i18n.json @@ -6,8 +6,8 @@ "--------------------------------------------------------------------------------------------", "Do not edit this file. It is machine generated." ], - "inputModeEntryDescription": "{0} (按 \"Enter\" 以确认或按 \"Esc\" 以取消)", - "inputModeEntry": "按 \"Enter\" 以确认或按 \"Esc\" 以取消", + "inputModeEntryDescription": "{0} (按 \"Enter\" 键确认或按 \"Esc\" 键取消)", + "inputModeEntry": "按 \"Enter\" 键确认或按 \"Esc\" 键取消", "quickInput.countSelected": "已选 {0} 项", "ok": "确定" } \ No newline at end of file diff --git a/i18n/chs/src/vs/workbench/electron-browser/main.contribution.i18n.json b/i18n/chs/src/vs/workbench/electron-browser/main.contribution.i18n.json index 9a315eae3a8..eb24c55b636 100644 --- a/i18n/chs/src/vs/workbench/electron-browser/main.contribution.i18n.json +++ b/i18n/chs/src/vs/workbench/electron-browser/main.contribution.i18n.json @@ -75,7 +75,7 @@ "window.menuBarVisibility.toggle": "菜单隐藏,但可以通过 Alt 键显示。", "window.menuBarVisibility.hidden": "菜单始终隐藏。", "menuBarVisibility": "控制菜单栏的可见性。“切换”设置表示隐藏菜单栏,按一次 Alt 键则将显示此菜单栏。默认情况下,除非窗口为全屏,否则菜单栏可见。", - "enableMenuBarMnemonics": "如果启用,则可使用 Alt 快捷键打开主菜单。禁用助记键允许将这些 Alt 快捷键绑定到编辑器命令。", + "enableMenuBarMnemonics": "启用后,即可使用 Alt 快捷键打开主菜单。若禁用助记键,这些 Alt 快捷键将能绑定到编辑器命令。", "autoDetectHighContrast": "如果已启用,将自动更改为高对比度主题;如果 Windows 正在使用高对比度主题,则当离开 Windows 高对比度主题时会更改为深色主题。", "titleBarStyle": "调整窗口标题栏的外观。更改需要在完全重启后才能应用。", "window.nativeTabs": "\n启用macOS Sierra窗口选项卡。请注意,更改需要完全重新启动程序才能生效。如果配置此选项,本机选项卡将禁用自定义标题栏样式。", diff --git a/i18n/chs/src/vs/workbench/parts/codeEditor/electron-browser/accessibility.i18n.json b/i18n/chs/src/vs/workbench/parts/codeEditor/electron-browser/accessibility.i18n.json index e5e6d7d0f1c..1bf1494b6f5 100644 --- a/i18n/chs/src/vs/workbench/parts/codeEditor/electron-browser/accessibility.i18n.json +++ b/i18n/chs/src/vs/workbench/parts/codeEditor/electron-browser/accessibility.i18n.json @@ -15,7 +15,7 @@ "auto_unknown": "编辑器被配置为使用平台 API 以检测是否附加了屏幕阅读器,但当前运行时不支持此功能。", "auto_on": "编辑器自动检测到已附加屏幕阅读器。", "auto_off": "编辑器被配置为自动检测是否附加了屏幕阅读器,当前未检测到。", - "configuredOn": "编辑器被配置为对屏幕阅读器的使用进行永久优化 — 你可以编辑设置中的“editor.accessibilitySupport”以改变此行为。", + "configuredOn": "已配置编辑器对屏幕阅读器进行永久优化 — 你更改 \"editor.accessibilitySupport\" 设置进行调整。", "configuredOff": "编辑器被配置为不对屏幕阅读器的使用进行优化。", "tabFocusModeOnMsg": "在当前编辑器中按 Tab 会将焦点移动到下一个可聚焦的元素。按 {0} 来切换此行为。", "tabFocusModeOnMsgNoKb": "若在当前编辑器中按 Tab 键,将移动焦点到下一个可聚焦的元素。当前无法通过按键绑定触发命令 {0}。", diff --git a/i18n/chs/src/vs/workbench/parts/codeEditor/electron-browser/toggleWordWrap.i18n.json b/i18n/chs/src/vs/workbench/parts/codeEditor/electron-browser/toggleWordWrap.i18n.json index c210e47a350..29326f2be7b 100644 --- a/i18n/chs/src/vs/workbench/parts/codeEditor/electron-browser/toggleWordWrap.i18n.json +++ b/i18n/chs/src/vs/workbench/parts/codeEditor/electron-browser/toggleWordWrap.i18n.json @@ -8,6 +8,6 @@ ], "toggle.wordwrap": "查看: 切换自动换行", "wordWrap.notInDiffEditor": "不能在差异编辑器中切换自动换行。", - "unwrapMinified": "为此文件禁用折行", - "wrapMinified": "为此文件启用换行" + "unwrapMinified": "在此文件禁用折行", + "wrapMinified": "在此文件启用折行" } \ No newline at end of file diff --git a/i18n/chs/src/vs/workbench/parts/extensions/electron-browser/extensionsUtils.i18n.json b/i18n/chs/src/vs/workbench/parts/extensions/electron-browser/extensionsUtils.i18n.json index 7b7f8b2905f..29a3ffd6c16 100644 --- a/i18n/chs/src/vs/workbench/parts/extensions/electron-browser/extensionsUtils.i18n.json +++ b/i18n/chs/src/vs/workbench/parts/extensions/electron-browser/extensionsUtils.i18n.json @@ -6,7 +6,7 @@ "--------------------------------------------------------------------------------------------", "Do not edit this file. It is machine generated." ], - "disableOtherKeymapsConfirmation": "是否禁用其他按键映射扩展 ({0}),从而避免按键绑定之间的冲突?", + "disableOtherKeymapsConfirmation": "是否禁用其他按键映射扩展 ({0}),从而避免按键绑定之间的冲突?", "yes": "是", "no": "否" } \ No newline at end of file diff --git a/i18n/chs/src/vs/workbench/parts/files/electron-browser/files.contribution.i18n.json b/i18n/chs/src/vs/workbench/parts/files/electron-browser/files.contribution.i18n.json index b5dc3e0f2f8..4067aaffcec 100644 --- a/i18n/chs/src/vs/workbench/parts/files/electron-browser/files.contribution.i18n.json +++ b/i18n/chs/src/vs/workbench/parts/files/electron-browser/files.contribution.i18n.json @@ -31,7 +31,7 @@ "watcherExclude": "配置文件路径的 glob 模式以从文件监视排除。模式必须在绝对路径上匹配(例如 ** 前缀或完整路径需正确匹配)。更改此设置需要重启。如果在启动时遇到 Code 消耗大量 CPU 时间,则可以排除大型文件夹以减少初始加载。", "hotExit.off": "禁用热退出。", "hotExit.onExit": "应用程序关闭时将自动保留未保存内容 (热退出)。关闭的定义为,在 Windows/Linux 上关闭最后一个窗口或者在全平台触发 workbench.action.quit 命令 (命令托盘、键绑定、菜单)。下次启动时将还原所有已备份的窗口。", - "hotExit.onExitAndWindowClose": "应用程序关闭时将自动保留未保存内容 (热退出)。关闭的定义为,在 Windows/Linux 上关闭最后一个窗口,在全平台触发 workbench.action.quit 命令 (命令托盘、键绑定、菜单),对于任何打开有文件夹的窗口,则不论该窗口是否是最后一个窗口。下次启动时将还原所有未打开文件夹的窗口。若要还原打开有文件夹的窗口,请将“window.restoreWindows”设置为“all”。", + "hotExit.onExitAndWindowClose": "应用程序关闭时将自动保留未保存内容 (热退出)。关闭的定义为,在 Windows/Linux 上关闭最后一个窗口,在全平台触发 workbench.action.quit 命令 (命令托盘、按键绑定、菜单),对于任何打开有文件夹的窗口,则不论该窗口是否是最后一个窗口。下次启动时将还原所有未打开文件夹的窗口。若要还原打开有文件夹的窗口,请将 \"window.restoreWindows\" 设置为 \"all\"。", "hotExit": "控制是否在会话间记住未保存的文件,以允许在退出编辑器时跳过保存提示。", "useExperimentalFileWatcher": "使用新的试验文件观察程序。", "defaultLanguage": "分配给新文件的默认语言模式。", diff --git a/i18n/chs/src/vs/workbench/parts/files/electron-browser/views/explorerViewer.i18n.json b/i18n/chs/src/vs/workbench/parts/files/electron-browser/views/explorerViewer.i18n.json index ab62245ce28..feb8a37af6b 100644 --- a/i18n/chs/src/vs/workbench/parts/files/electron-browser/views/explorerViewer.i18n.json +++ b/i18n/chs/src/vs/workbench/parts/files/electron-browser/views/explorerViewer.i18n.json @@ -6,7 +6,7 @@ "--------------------------------------------------------------------------------------------", "Do not edit this file. It is machine generated." ], - "fileInputAriaLabel": "键入文件名。按 Enter 以确认或按 Esc 以取消。", + "fileInputAriaLabel": "输入文件名。按 \"Enter\" 键确认或按 \"Esc\" 键取消。", "createFileFromExplorerInfoMessage": "在 **{1}** 中创建文件 **{0}**", "renameFileFromExplorerInfoMessage": "移动并重命名为 **{0}**", "createFolderFromExplorerInfoMessage": "在 **{1}** 中创建文件夹 **{0}**", diff --git a/i18n/chs/src/vs/workbench/parts/localizations/electron-browser/localizations.contribution.i18n.json b/i18n/chs/src/vs/workbench/parts/localizations/electron-browser/localizations.contribution.i18n.json index 1803ba349c0..c767d568805 100644 --- a/i18n/chs/src/vs/workbench/parts/localizations/electron-browser/localizations.contribution.i18n.json +++ b/i18n/chs/src/vs/workbench/parts/localizations/electron-browser/localizations.contribution.i18n.json @@ -10,7 +10,9 @@ "yes": "是", "no": "否", "neverAgain": "不再显示", + "install language pack": "不久后,VS Code 将仅支持商店扩展形式的界面语言包。请安装“{0}”扩展以继续使用当前的界面语言。", "install": "安装", + "more information": "更多信息...", "JsonSchema.locale": "使用的界面语言。", "vscode.extension.contributes.localizations": "向编辑器提供本地化内容", "vscode.extension.contributes.localizations.languageId": "显示字符串翻译的目标语言 ID。", diff --git a/i18n/chs/src/vs/workbench/parts/markers/electron-browser/markersPanel.i18n.json b/i18n/chs/src/vs/workbench/parts/markers/electron-browser/markersPanel.i18n.json index 1a1f6eea1b6..a23959a4c1d 100644 --- a/i18n/chs/src/vs/workbench/parts/markers/electron-browser/markersPanel.i18n.json +++ b/i18n/chs/src/vs/workbench/parts/markers/electron-browser/markersPanel.i18n.json @@ -6,6 +6,6 @@ "--------------------------------------------------------------------------------------------", "Do not edit this file. It is machine generated." ], - "disableFilesExclude": "禁用文件排除。", + "disableFilesExclude": "禁用文件排除筛选器。", "clearFilter": "清除筛选。" } \ No newline at end of file diff --git a/i18n/chs/src/vs/workbench/parts/markers/electron-browser/messages.i18n.json b/i18n/chs/src/vs/workbench/parts/markers/electron-browser/messages.i18n.json index 5e32356a724..90e2b4ea2c2 100644 --- a/i18n/chs/src/vs/workbench/parts/markers/electron-browser/messages.i18n.json +++ b/i18n/chs/src/vs/workbench/parts/markers/electron-browser/messages.i18n.json @@ -10,7 +10,7 @@ "problems.view.toggle.label": "切换问题 (错误、警告、信息) 视图", "problems.view.focus.label": "聚焦于问题 (错误、警告、信息) 视图", "problems.panel.configuration.title": "问题预览", - "problems.panel.configuration.autoreveal": "控制问题预览是否应在打开文件时自动显示它们。", + "problems.panel.configuration.autoreveal": "控制在打开文件时是否在问题视图中对其进行定位。", "markers.panel.title.problems": "问题", "markers.panel.aria.label.problems.tree": "按文件分组的问题", "markers.panel.no.problems.build": "目前尚未在工作区检测到问题。", diff --git a/i18n/chs/src/vs/workbench/parts/performance/electron-browser/startupProfiler.i18n.json b/i18n/chs/src/vs/workbench/parts/performance/electron-browser/startupProfiler.i18n.json index ee67620ec98..aa1e51d6b36 100644 --- a/i18n/chs/src/vs/workbench/parts/performance/electron-browser/startupProfiler.i18n.json +++ b/i18n/chs/src/vs/workbench/parts/performance/electron-browser/startupProfiler.i18n.json @@ -6,7 +6,7 @@ "--------------------------------------------------------------------------------------------", "Do not edit this file. It is machine generated." ], - "prof.message": "已成功创建描述文件。", + "prof.message": "已成功创建分析文件。", "prof.detail": "请创建问题并手动附加以下文件:\n{0}", "prof.restartAndFileIssue": "创建问题并重启", "prof.restart": "重启", diff --git a/i18n/chs/src/vs/workbench/parts/quickopen/browser/gotoLineHandler.i18n.json b/i18n/chs/src/vs/workbench/parts/quickopen/browser/gotoLineHandler.i18n.json index 295e4c52d56..1a434b363a3 100644 --- a/i18n/chs/src/vs/workbench/parts/quickopen/browser/gotoLineHandler.i18n.json +++ b/i18n/chs/src/vs/workbench/parts/quickopen/browser/gotoLineHandler.i18n.json @@ -9,8 +9,8 @@ "gotoLine": "转到行...", "gotoLineLabelEmptyWithLimit": "键入要导航到的介于 1 和 {0} 之间的行号", "gotoLineLabelEmpty": "键入要导航到的行号", - "gotoLineColumnLabel": "转到行 {0} 和字符 {1}", - "gotoLineLabel": "转至第 {0} 行", + "gotoLineColumnLabel": "转到第 {0} 行,第 {1} 列", + "gotoLineLabel": "转到第 {0} 行", "gotoLineHandlerAriaLabel": "键入要导航到的行号。", "cannotRunGotoLine": "首先打开文本文件以转到行" } \ No newline at end of file diff --git a/i18n/chs/src/vs/workbench/parts/search/electron-browser/search.contribution.i18n.json b/i18n/chs/src/vs/workbench/parts/search/electron-browser/search.contribution.i18n.json index a48247a7489..e7e921aa682 100644 --- a/i18n/chs/src/vs/workbench/parts/search/electron-browser/search.contribution.i18n.json +++ b/i18n/chs/src/vs/workbench/parts/search/electron-browser/search.contribution.i18n.json @@ -10,6 +10,7 @@ "copyMatchLabel": "复制", "copyPathLabel": "复制路径", "copyAllLabel": "全部复制", + "clearSearchHistoryLabel": "清除搜索历史记录", "toggleSearchViewPositionLabel": "切换搜索视图位置", "findInFolder": "在文件夹中查找...", "findInWorkspace": "在工作区中查找...", diff --git a/i18n/chs/src/vs/workbench/parts/tasks/common/taskDefinitionRegistry.i18n.json b/i18n/chs/src/vs/workbench/parts/tasks/common/taskDefinitionRegistry.i18n.json index d9178f60037..89d846363f2 100644 --- a/i18n/chs/src/vs/workbench/parts/tasks/common/taskDefinitionRegistry.i18n.json +++ b/i18n/chs/src/vs/workbench/parts/tasks/common/taskDefinitionRegistry.i18n.json @@ -6,7 +6,7 @@ "--------------------------------------------------------------------------------------------", "Do not edit this file. It is machine generated." ], - "TaskDefinition.description": "实际任务类型", + "TaskDefinition.description": "实际任务类型。请注意,以 \"$\" 开头的类型保留为仅内部使用。", "TaskDefinition.properties": "任务类型的其他属性", "TaskTypeConfiguration.noType": "任务类型配置缺少必需的 \"taskType\" 属性", "TaskDefinitionExtPoint": "配置任务种类" diff --git a/i18n/chs/src/vs/workbench/parts/tasks/electron-browser/terminalTaskSystem.i18n.json b/i18n/chs/src/vs/workbench/parts/tasks/electron-browser/terminalTaskSystem.i18n.json index 72e6d6cb873..677579a7a5d 100644 --- a/i18n/chs/src/vs/workbench/parts/tasks/electron-browser/terminalTaskSystem.i18n.json +++ b/i18n/chs/src/vs/workbench/parts/tasks/electron-browser/terminalTaskSystem.i18n.json @@ -11,6 +11,6 @@ "TerminalTaskSystem.terminalName": "任务 - {0}", "closeTerminal": "按任意键关闭终端。", "reuseTerminal": "终端将被任务重用,按任意键关闭。", - "TerminalTaskSystem": "无法对 UNC 驱动器执行 shell 命令。", + "TerminalTaskSystem": "无法使用 cmd.exe 在 UNC 驱动器上执行 Shell 命令。", "unkownProblemMatcher": "无法解析问题匹配程序 {0}。此匹配程序将被忽略" } \ No newline at end of file diff --git a/i18n/chs/src/vs/workbench/parts/themes/electron-browser/themes.contribution.i18n.json b/i18n/chs/src/vs/workbench/parts/themes/electron-browser/themes.contribution.i18n.json index f9a428ba221..21caf37372f 100644 --- a/i18n/chs/src/vs/workbench/parts/themes/electron-browser/themes.contribution.i18n.json +++ b/i18n/chs/src/vs/workbench/parts/themes/electron-browser/themes.contribution.i18n.json @@ -11,7 +11,7 @@ "themes.category.dark": "深色主题", "themes.category.hc": "高对比度主题", "installColorThemes": "安装其他颜色主题...", - "themes.selectTheme": "选择颜色主题(按上下箭头键预览)", + "themes.selectTheme": "选择颜色主题 (按上下箭头键预览)", "selectIconTheme.label": "文件图标主题", "noIconThemeLabel": "无", "noIconThemeDesc": "禁用文件图标", diff --git a/i18n/chs/src/vs/workbench/services/actions/electron-browser/menusExtensionPoint.i18n.json b/i18n/chs/src/vs/workbench/services/actions/electron-browser/menusExtensionPoint.i18n.json index 4f7c3efb7aa..6e0887932a2 100644 --- a/i18n/chs/src/vs/workbench/services/actions/electron-browser/menusExtensionPoint.i18n.json +++ b/i18n/chs/src/vs/workbench/services/actions/electron-browser/menusExtensionPoint.i18n.json @@ -7,7 +7,7 @@ "Do not edit this file. It is machine generated." ], "requirearray": "菜单项必须为一个数组", - "requirestring": "属性“{0}”是必要属性,其类型必须是 \"string\"", + "requirestring": "“{0}”是必要属性,其类型必须是 \"string\"", "optstring": "属性“{0}”可以省略,否则其类型必须是 \"string\"", "vscode.extension.contributes.menuItem.command": "要执行的命令的标识符。该命令必须在 \"commands\" 部分中声明", "vscode.extension.contributes.menuItem.alt": "要执行的替代命令的标识符。该命令必须在 ”commands\" 部分中声明", diff --git a/i18n/chs/src/vs/workbench/services/configuration/common/configurationExtensionPoint.i18n.json b/i18n/chs/src/vs/workbench/services/configuration/common/configurationExtensionPoint.i18n.json index 43e4308fb70..3c4d65cfab7 100644 --- a/i18n/chs/src/vs/workbench/services/configuration/common/configurationExtensionPoint.i18n.json +++ b/i18n/chs/src/vs/workbench/services/configuration/common/configurationExtensionPoint.i18n.json @@ -6,12 +6,12 @@ "--------------------------------------------------------------------------------------------", "Do not edit this file. It is machine generated." ], - "vscode.extension.contributes.configuration.title": "设置摘要。此标签将在设置文件中用作分隔注释。", + "vscode.extension.contributes.configuration.title": "设置项的介绍。这段文本将在设置文件中作为另外的注释。", "vscode.extension.contributes.configuration.properties": "配置属性的描述。", "scope.application.description": "特定于应用的配置,仅可在“用户”设置中配置。", "scope.window.description": "特定于窗口的配置,可在“用户”或“工作区”设置中配置。", "scope.resource.description": "特定于资源的配置,可在“用户”、“工作区”或“文件夹”设置中配置。", - "scope.description": "配置适用的范围。可用范围有“窗口”和“资源”。", + "scope.description": "配置适用的范围。可用范围有 \"window\" (窗口) 和 \"resource\" (资源)。", "vscode.extension.contributes.defaultConfiguration": "按语言提供默认编辑器配置设置。", "vscode.extension.contributes.configuration": "用于配置字符串。", "invalid.title": "configuration.title 必须是字符串", diff --git a/i18n/chs/src/vs/workbench/services/extensions/common/extensionsRegistry.i18n.json b/i18n/chs/src/vs/workbench/services/extensions/common/extensionsRegistry.i18n.json index ff684f7426b..cc00a7772b1 100644 --- a/i18n/chs/src/vs/workbench/services/extensions/common/extensionsRegistry.i18n.json +++ b/i18n/chs/src/vs/workbench/services/extensions/common/extensionsRegistry.i18n.json @@ -25,6 +25,7 @@ "vscode.extension.activationEvents.onDebugResolve": "在将要启动具有特定类型的调试会话 (且需要调用相应的 resolveDebugConfiguration 方法) 时发出的激活事件。", "vscode.extension.activationEvents.workspaceContains": "在打开至少包含一个匹配指定 glob 模式的文件的文件夹时发出的激活事件。", "vscode.extension.activationEvents.onView": "在指定视图被展开时发出的激活事件。", + "vscode.extension.activationEvents.onUri": "在打开系统范围内并指向此扩展的 URI 时发出的激活事件。", "vscode.extension.activationEvents.star": "在 VS Code 启动时发出的激活事件。为确保良好的最终用户体验,请仅在其他激活事件组合不适用于你的情况时,才在扩展中使用此事件。", "vscode.extension.badges": "显示在商店扩展页面侧边栏的徽章的数组", "vscode.extension.badges.url": "徽章图像 URL。", diff --git a/i18n/chs/src/vs/workbench/services/files/electron-browser/fileService.i18n.json b/i18n/chs/src/vs/workbench/services/files/electron-browser/fileService.i18n.json index 2c68f58f2bb..a3ff524058d 100644 --- a/i18n/chs/src/vs/workbench/services/files/electron-browser/fileService.i18n.json +++ b/i18n/chs/src/vs/workbench/services/files/electron-browser/fileService.i18n.json @@ -6,7 +6,7 @@ "--------------------------------------------------------------------------------------------", "Do not edit this file. It is machine generated." ], - "netVersionError": "需要 Microsoft .NET Framework 4.5。请访问链接安装它。", + "netVersionError": "缺少 Microsoft .NET Framework 4.5。请访问链接进行安装。", "installNet": "下载 .NET Framework 4.5", "neverShowAgain": "不再显示", "enospcError": "{0} 无法监视这个大型工作区的文件变化。请访问说明链接解决此问题。", diff --git a/i18n/chs/src/vs/workbench/services/files/electron-browser/remoteFileService.i18n.json b/i18n/chs/src/vs/workbench/services/files/electron-browser/remoteFileService.i18n.json index c87de21c8fa..b99594ec617 100644 --- a/i18n/chs/src/vs/workbench/services/files/electron-browser/remoteFileService.i18n.json +++ b/i18n/chs/src/vs/workbench/services/files/electron-browser/remoteFileService.i18n.json @@ -10,5 +10,6 @@ "fileIsDirectoryError": "文件是目录", "fileNotModifiedError": "自以下时间未修改的文件:", "fileBinaryError": "文件似乎是二进制文件,无法作为文档打开", - "err.create": "未能创建文件 {0}" + "err.create": "未能创建文件 {0}", + "fileMoveConflict": "无法移动/复制。文件已存在于目标位置。" } \ No newline at end of file diff --git a/i18n/chs/src/vs/workbench/services/keybinding/common/keybindingEditing.i18n.json b/i18n/chs/src/vs/workbench/services/keybinding/common/keybindingEditing.i18n.json index d566302d24d..e0ea3ff7ed1 100644 --- a/i18n/chs/src/vs/workbench/services/keybinding/common/keybindingEditing.i18n.json +++ b/i18n/chs/src/vs/workbench/services/keybinding/common/keybindingEditing.i18n.json @@ -9,5 +9,5 @@ "errorKeybindingsFileDirty": "按键绑定配置文件已变更,现在无法写入。请先保存此文件,然后重试。", "parseErrors": "无法写入按键绑定配置文件。请打开文件并更正错误或警告,然后重试。", "errorInvalidConfiguration": "无法写入按键绑定配置文件。文件内含有非数组类型对象。请打开文件进行清理,然后重试。", - "emptyKeybindingsHeader": "将键绑定放入此文件中以覆盖默认值" + "emptyKeybindingsHeader": "将按键绑定配置放入此文件中即可覆盖默认值" } \ No newline at end of file diff --git a/i18n/chs/src/vs/workbench/services/keybinding/electron-browser/keybindingService.i18n.json b/i18n/chs/src/vs/workbench/services/keybinding/electron-browser/keybindingService.i18n.json index 79efaf75e8d..b3755673dac 100644 --- a/i18n/chs/src/vs/workbench/services/keybinding/electron-browser/keybindingService.i18n.json +++ b/i18n/chs/src/vs/workbench/services/keybinding/electron-browser/keybindingService.i18n.json @@ -7,8 +7,8 @@ "Do not edit this file. It is machine generated." ], "nonempty": "应为非空值。", - "requirestring": "属性“{0}”是必需的,其类型必须是“字符串”", - "optstring": "属性“{0}”可以省略,或者其类型必须是“字符串”", + "requirestring": "“{0}”是必要属性,其类型必须是 \"string\" ", + "optstring": "属性“{0}”可以省略,否则其类型必须是 \"string\"", "vscode.extension.contributes.keybindings.command": "触发按键绑定时运行的命令的标识符。", "vscode.extension.contributes.keybindings.key": "按键或按键序列。用加号分隔按键,用空格分隔序列。例如,Ctrl+O 和 Ctrl+L L(连续按键)。", "vscode.extension.contributes.keybindings.mac": "Mac 特定的键或键序列。", diff --git a/i18n/chs/src/vs/workbench/services/mode/common/workbenchModeService.i18n.json b/i18n/chs/src/vs/workbench/services/mode/common/workbenchModeService.i18n.json index fcff8ff7e67..d7fe4a68804 100644 --- a/i18n/chs/src/vs/workbench/services/mode/common/workbenchModeService.i18n.json +++ b/i18n/chs/src/vs/workbench/services/mode/common/workbenchModeService.i18n.json @@ -6,7 +6,7 @@ "--------------------------------------------------------------------------------------------", "Do not edit this file. It is machine generated." ], - "vscode.extension.contributes.languages": "有助于语言声明。", + "vscode.extension.contributes.languages": "提供语言声明。", "vscode.extension.contributes.languages.id": "语言 ID。", "vscode.extension.contributes.languages.aliases": "语言的别名。", "vscode.extension.contributes.languages.extensions": "与语言关联的文件扩展名。", diff --git a/i18n/chs/src/vs/workbench/services/textMate/electron-browser/TMGrammars.i18n.json b/i18n/chs/src/vs/workbench/services/textMate/electron-browser/TMGrammars.i18n.json index b3351c5e331..87b767e9654 100644 --- a/i18n/chs/src/vs/workbench/services/textMate/electron-browser/TMGrammars.i18n.json +++ b/i18n/chs/src/vs/workbench/services/textMate/electron-browser/TMGrammars.i18n.json @@ -7,7 +7,7 @@ "Do not edit this file. It is machine generated." ], "vscode.extension.contributes.grammars": "贡献 textmate tokenizer。", - "vscode.extension.contributes.grammars.language": "此语法为其贡献了内容的语言标识符。", + "vscode.extension.contributes.grammars.language": "此语法对应语言的标识符。", "vscode.extension.contributes.grammars.scopeName": "tmLanguage 文件所用的 textmate 范围名称。", "vscode.extension.contributes.grammars.path": "tmLanguage 文件的路径。该路径是相对于扩展文件夹,通常以 \"./syntaxes/\" 开头。", "vscode.extension.contributes.grammars.embeddedLanguages": "如果此语法包含嵌入式语言,则为作用域名称到语言 ID 的映射。", diff --git a/i18n/chs/src/vs/workbench/services/textMate/electron-browser/TMSyntax.i18n.json b/i18n/chs/src/vs/workbench/services/textMate/electron-browser/TMSyntax.i18n.json index 47ffc41e0ba..1d5c795a440 100644 --- a/i18n/chs/src/vs/workbench/services/textMate/electron-browser/TMSyntax.i18n.json +++ b/i18n/chs/src/vs/workbench/services/textMate/electron-browser/TMSyntax.i18n.json @@ -6,12 +6,12 @@ "--------------------------------------------------------------------------------------------", "Do not edit this file. It is machine generated." ], - "invalid.language": "“contributes.{0}.language”中存在未知的语言。提供的值: {1}", - "invalid.scopeName": "“contributes.{0}.scopeName”中应为字符串。提供的值: {1}", + "invalid.language": "\"contributes.{0}.language\" 中包含未知语言。提供的值: {1}", + "invalid.scopeName": "\"contributes.{0}.scopeName\" 应为字符串。提供的值: {1}", "invalid.path.0": "“contributes.{0}.path”中应为字符串。提供的值: {1}", "invalid.injectTo": "\"contributes.{0}.injectTo\" 中的值无效。必须为语言范围名称数组。提供的值: {1}", "invalid.embeddedLanguages": "\"contributes.{0}.embeddedLanguages\" 中的值无效。必须为从作用域名称到语言的对象映射。提供的值: {1}", - "invalid.tokenTypes": "“contributes.{0}.tokenTypes”的值无效。其必须为从作用域名到标记类型的对象映射。当前值: {1}", + "invalid.tokenTypes": "\"contributes.{0}.tokenTypes\" 的值无效。必须为从作用域名称到标记类型的对象映射。当前值: {1}", "invalid.path.1": "“contributes.{0}.path”({1})应包含在扩展的文件夹({2})内。这可能会使扩展不可移植。", "no-tm-grammar": "没有注册这种语言的 TM 语法。" } \ No newline at end of file diff --git a/i18n/cht/extensions/git/out/commands.i18n.json b/i18n/cht/extensions/git/out/commands.i18n.json index b7d543af3f2..0d7f1946cf2 100644 --- a/i18n/cht/extensions/git/out/commands.i18n.json +++ b/i18n/cht/extensions/git/out/commands.i18n.json @@ -11,9 +11,7 @@ "create branch": "$(plus) 建立新的分支", "repourl": "儲存庫 URL", "parent": "父目錄", - "cancel": "$ (同步 ~ 旋轉) 複製儲存庫.. 按一下以取消", - "cancel tooltip": "取消複製", - "cloning": "正在複製 Git 儲存庫...", + "cloning": "正在複製 git 存放庫 '{0}'...", "openrepo": "開啟儲存庫", "proposeopen": "要開啟複製的儲存庫嗎?", "init": "選擇工作區資料夾以初始化 git 儲存庫", diff --git a/i18n/cht/extensions/npm/out/npmView.i18n.json b/i18n/cht/extensions/npm/out/npmView.i18n.json index 35229bd6699..0fcedab1eb3 100644 --- a/i18n/cht/extensions/npm/out/npmView.i18n.json +++ b/i18n/cht/extensions/npm/out/npmView.i18n.json @@ -5,5 +5,7 @@ "Licensed under the MIT License. See License.txt in the project root for license information.", "--------------------------------------------------------------------------------------------", "Do not edit this file. It is machine generated." - ] + ], + "npm.noDebugOptions": "因為指令碼缺少節點偵錯選項 (例如 '--inspect-brk'),所以無法啟動 \"{0}\" 以進行偵錯。", + "npm.scriptInvalid": "找不到指令碼 \"{0}\"。請嘗試重新整理檢視。" } \ No newline at end of file diff --git a/i18n/cht/extensions/npm/package.i18n.json b/i18n/cht/extensions/npm/package.i18n.json index 4ffedea8e58..6a4c4425415 100644 --- a/i18n/cht/extensions/npm/package.i18n.json +++ b/i18n/cht/extensions/npm/package.i18n.json @@ -12,10 +12,15 @@ "config.npm.runSilent": "以 `--silent` 選項執行 npm 命令。 ", "config.npm.packageManager": "用來執行指令碼的套件管理員。", "config.npm.exclude": "為應從自動指令碼偵測排除的資料夾設定 Glob 模式。", + "config.npm.enableScriptExplorer": "當工作區包含 'package.json' 檔案時,啟用 npm 指令碼的總管檢視。", "npm.parseError": "Npm 工作刪除: 解析檔案 {0} 失敗", "taskdef.script": "要自訂的 npm 指令碼。", "taskdef.path": "提供指令碼之 package.json 檔案的資料夾路徑。可以省略。", + "view.name": "Npm 指令碼", "command.refresh": "重新整理", + "command.run": "執行", "command.debug": "偵錯", - "command.openScript": "開啟" + "command.openScript": "開啟", + "npm.scriptInvalid": "找不到指令碼 '{0}'。請嘗試重新整理檢視。", + "npm.noDebugOptions": "因為指令碼缺少節點偵錯選項 (例如 '--inspect-brk'),所以無法啟動 '{0}' 以進行偵錯。" } \ No newline at end of file diff --git a/i18n/cht/extensions/typescript-language-features/package.i18n.json b/i18n/cht/extensions/typescript-language-features/package.i18n.json index f48586c4f1d..c7a5d0d5e9c 100644 --- a/i18n/cht/extensions/typescript-language-features/package.i18n.json +++ b/i18n/cht/extensions/typescript-language-features/package.i18n.json @@ -28,6 +28,9 @@ "format.insertSpaceAfterKeywordsInControlFlowStatements": "定義控制流程陳述式內關鍵字後的空格處理方式。", "format.insertSpaceAfterFunctionKeywordForAnonymousFunctions": "定義匿名函式之函式關鍵字後的空格處理。", "format.insertSpaceBeforeFunctionParenthesis": "定義如何處理函式引數括號之前的空格。TypeScript 必須 >= 2.1.5。", + "format.insertSpaceAfterOpeningAndBeforeClosingNonemptyParenthesis": "定義左右非空白括弧間的空格處理。", + "format.insertSpaceAfterOpeningAndBeforeClosingNonemptyBrackets": "定義左右非空白括弧間的空格處理。", + "format.insertSpaceAfterOpeningAndBeforeClosingNonemptyBraces": "定義左右非空白括弧間的空格處理。需要 TypeScript >= 2.3.0。", "format.insertSpaceAfterOpeningAndBeforeClosingTemplateStringBraces": "定義範本字串左右大括弧間的空格處理。需要 TypeScript >= 2.0.6。", "format.insertSpaceAfterOpeningAndBeforeClosingJsxExpressionBraces": "定義 JSX 運算式左右大括弧間的空格處理。需要 TypeScript >= 2.0.6。", "format.insertSpaceAfterTypeAssertion": "定義在 TypeScript 內類型宣告後空格處理。需要 TypeScript >= 2.4。", diff --git a/i18n/cht/src/vs/base/node/processes.i18n.json b/i18n/cht/src/vs/base/node/processes.i18n.json index 35229bd6699..9512e309432 100644 --- a/i18n/cht/src/vs/base/node/processes.i18n.json +++ b/i18n/cht/src/vs/base/node/processes.i18n.json @@ -5,5 +5,6 @@ "Licensed under the MIT License. See License.txt in the project root for license information.", "--------------------------------------------------------------------------------------------", "Do not edit this file. It is machine generated." - ] + ], + "TaskRunner.UNC": "無法在 UNC 磁碟機上執行 shell 命令。" } \ No newline at end of file diff --git a/i18n/cht/src/vs/base/node/zip.i18n.json b/i18n/cht/src/vs/base/node/zip.i18n.json index 45db3240b71..a1a15cb5ec2 100644 --- a/i18n/cht/src/vs/base/node/zip.i18n.json +++ b/i18n/cht/src/vs/base/node/zip.i18n.json @@ -6,5 +6,6 @@ "--------------------------------------------------------------------------------------------", "Do not edit this file. It is machine generated." ], + "incompleteExtract": "未完成。已擷取 {0} 個項目 (共 {1} 個)", "notFound": "在 ZIP 中找不到 {0}。" } \ No newline at end of file diff --git a/i18n/cht/src/vs/code/electron-browser/issue/issueReporterPage.i18n.json b/i18n/cht/src/vs/code/electron-browser/issue/issueReporterPage.i18n.json index 17f3a9f8d2c..7983416d3db 100644 --- a/i18n/cht/src/vs/code/electron-browser/issue/issueReporterPage.i18n.json +++ b/i18n/cht/src/vs/code/electron-browser/issue/issueReporterPage.i18n.json @@ -8,6 +8,7 @@ ], "completeInEnglish": "請用英語填寫這張表格。", "issueTypeLabel": "這是一個", + "issueSourceLabel": "檔案,位於", "vscode": "Visual Studio Code", "extension": "擴充功能", "disableExtensionsLabelText": "嘗試在 {0} 之後重現問題。如果問題僅在使用中的擴充功能時重現,則可能是擴充功能的問題。", diff --git a/i18n/cht/src/vs/code/electron-main/menus.i18n.json b/i18n/cht/src/vs/code/electron-main/menus.i18n.json index f8df21acfda..ebbacbeaf7e 100644 --- a/i18n/cht/src/vs/code/electron-main/menus.i18n.json +++ b/i18n/cht/src/vs/code/electron-main/menus.i18n.json @@ -146,6 +146,7 @@ "miConditionalBreakpoint": "條件式中斷點(&&C)...", "miColumnBreakpoint": "資料行中斷點(&&O)", "miFunctionBreakpoint": "函式中斷點(&&F}...", + "miLogPoint": "&&記錄點...", "miNewBreakpoint": "新增中斷點(&&N)", "miEnableAllBreakpoints": "啟用所有中斷點", "miDisableAllBreakpoints": "停用所有中斷點(&&L)", diff --git a/i18n/cht/src/vs/editor/browser/widget/diffReview.i18n.json b/i18n/cht/src/vs/editor/browser/widget/diffReview.i18n.json index 36323e840be..53633b55880 100644 --- a/i18n/cht/src/vs/editor/browser/widget/diffReview.i18n.json +++ b/i18n/cht/src/vs/editor/browser/widget/diffReview.i18n.json @@ -7,6 +7,10 @@ "Do not edit this file. It is machine generated." ], "label.close": "關閉", + "no_lines": "沒有任何行", + "one_line": "1 個行", + "more_lines": "{0} 個行", + "header": "{1} 的 {0} 不同: 原始為 {2},{3},修改後為 {4},{5}", "blankLine": "空白", "equalLine": "原始 {0},修改後{1}: {2", "insertLine": "+ 修改後 {0}: {1}", diff --git a/i18n/cht/src/vs/editor/common/commonCodeEditor.i18n.json b/i18n/cht/src/vs/editor/common/commonCodeEditor.i18n.json index 35229bd6699..9ba9d8d6b87 100644 --- a/i18n/cht/src/vs/editor/common/commonCodeEditor.i18n.json +++ b/i18n/cht/src/vs/editor/common/commonCodeEditor.i18n.json @@ -5,5 +5,6 @@ "Licensed under the MIT License. See License.txt in the project root for license information.", "--------------------------------------------------------------------------------------------", "Do not edit this file. It is machine generated." - ] + ], + "cursors.maximum": "游標數已限制為 {0} 個。" } \ No newline at end of file diff --git a/i18n/cht/src/vs/editor/common/config/commonEditorConfig.i18n.json b/i18n/cht/src/vs/editor/common/config/commonEditorConfig.i18n.json index 24534faf582..b5afcd8e75a 100644 --- a/i18n/cht/src/vs/editor/common/config/commonEditorConfig.i18n.json +++ b/i18n/cht/src/vs/editor/common/config/commonEditorConfig.i18n.json @@ -16,6 +16,7 @@ "lineNumbers.on": "行號以絕對值顯示。", "lineNumbers.relative": "行號以目前游標的相對值顯示。", "lineNumbers.interval": "每 10 行顯示行號。", + "lineNumbers": "控制行號的顯示。", "rulers": "在特定的等寬字元數之後轉譯垂直尺規。有多個尺規就使用多個值。若陣列為空,則不繪製任何尺規。", "wordSeparators": "執行文字相關導覽或作業時將作為文字分隔符號的字元", "tabSize": "與 Tab 相等的空格數量。當 `editor.detectIndentation` 已開啟時,會根據檔案內容覆寫此設定。", @@ -27,6 +28,7 @@ "scrollBeyondLastLine": "控制編輯器是否會捲動到最後一行之後", "smoothScrolling": "控制編輯器是否會使用動畫捲動", "minimap.enabled": "控制是否會顯示迷你地圖", + "minimap.side": "控制要在哪端呈現迷你地圖。", "minimap.showSlider": "自動隱藏迷你地圖滑桿", "minimap.renderCharacters": "呈現行內的實際字元 (而不是彩色區塊)", "minimap.maxColumn": "限制迷你地圖的寬度,以呈現最多的資料行", @@ -75,6 +77,7 @@ "occurrencesHighlight": "控制編輯器是否應反白顯示出現的語意符號", "overviewRulerLanes": "控制可在概觀尺規中相同位置顯示的裝飾項目數", "overviewRulerBorder": "控制是否應在概觀尺規周圍繪製邊框。", + "cursorBlinking": "控制游標動畫樣式。", "mouseWheelZoom": "使用滑鼠滾輪並按住 Ctrl 時,縮放編輯器的字型", "cursorStyle": "控制游標樣式。接受的值為 'block'、'block-outline'、'line'、'line-thin'、'underline' 及 'underline-thin'", "cursorWidth": "控制游標寬度,當 editor.cursorStyle 設定為 'line' 時。", @@ -84,7 +87,11 @@ "renderControlCharacters": "控制編輯器是否應顯示控制字元", "renderIndentGuides": "控制編輯器是否應顯示縮排輔助線", "renderLineHighlight": "控制編輯器應如何轉譯目前反白的行,可能的值有 'none'、'gutter'、'line' 和 'all'。", + "codeLens": "控制編輯器是否顯示 CodeLens", "folding": "控制編輯器是否已啟用程式碼摺疊功能", + "foldingStrategyAuto": "如果可行,請使用語言特定摺疊策略,否則請退回至縮排式策略。", + "foldingStrategyIndentation": "一律使用縮排式摺疊策略", + "foldingStrategy": "控制折疊範圍的計算方式。'auto' 會在可行的情況下挑選使用語言特定摺疊策略。'indentation' 則會強制使用縮排式摺疊策略。", "showFoldingControls": "自動隱藏摺疊控制向", "matchBrackets": "當選取某側的括號時,強調顯示另一側的配對括號。", "glyphMargin": "控制編輯器是否應轉譯垂直字符邊界。字符邊界最常用來進行偵錯。", @@ -99,8 +106,12 @@ "links": "控制編輯器是否應偵測連結且讓它可點擊", "colorDecorators": "控制編輯器是否應轉譯內嵌色彩裝飾項目與色彩選擇器。", "codeActions": "啟用程式動作燈泡提示", + "codeActionsOnSave.organizeImports": "要在儲存時執行組織匯入嗎?", + "codeActionsOnSave": "要在儲存時執行的程式碼動作種類。", + "codeActionsOnSaveTimeout": "儲存時執行的程式碼動作逾時。", "selectionClipboard": "控制是否應支援 Linux 主要剪貼簿。", "sideBySide": "控制 Diff 編輯器要並排或內嵌顯示差異", "ignoreTrimWhitespace": "控制 Diff 編輯器是否將開頭或尾端空白字元的變更顯示為差異", + "largeFileOptimizations": "針對大型檔案停用部分高記憶體需求功能的特殊處理方式。", "renderIndicators": "控制 Diff 編輯器是否要為新增的/移除的變更顯示 +/- 標記" } \ No newline at end of file diff --git a/i18n/cht/src/vs/editor/common/view/editorColorRegistry.i18n.json b/i18n/cht/src/vs/editor/common/view/editorColorRegistry.i18n.json index 6690219f7e0..be0985019e7 100644 --- a/i18n/cht/src/vs/editor/common/view/editorColorRegistry.i18n.json +++ b/i18n/cht/src/vs/editor/common/view/editorColorRegistry.i18n.json @@ -14,6 +14,7 @@ "editorCursorBackground": "編輯器游標的背景色彩。允許自訂區塊游標重疊的字元色彩。", "editorWhitespaces": "編輯器中空白字元的色彩。", "editorIndentGuides": "編輯器縮排輔助線的色彩。", + "editorActiveIndentGuide": "使用中編輯器縮排輔助線的色彩。", "editorLineNumbers": "編輯器行號的色彩。", "editorActiveLineNumber": "編輯器使用中行號的色彩 ", "deprecatedEditorActiveLineNumber": "Id 已取代。請改用 'editorLineNumber.activeForeground' 。", diff --git a/i18n/cht/src/vs/editor/contrib/codeAction/codeActionCommands.i18n.json b/i18n/cht/src/vs/editor/contrib/codeAction/codeActionCommands.i18n.json index 0852f2e6e0b..aa47b7bc824 100644 --- a/i18n/cht/src/vs/editor/contrib/codeAction/codeActionCommands.i18n.json +++ b/i18n/cht/src/vs/editor/contrib/codeAction/codeActionCommands.i18n.json @@ -14,5 +14,6 @@ "editor.action.refactor.noneMessage": "沒有可用的重構", "source.label": "來源動作...", "editor.action.source.noneMessage": "沒有可用的來源動作", - "organizeImports.label": "組織匯入" + "organizeImports.label": "組織匯入", + "editor.action.organize.noneMessage": "沒有任何可用的組織匯入動作" } \ No newline at end of file diff --git a/i18n/cht/src/vs/editor/contrib/referenceSearch/referencesWidget.i18n.json b/i18n/cht/src/vs/editor/contrib/referenceSearch/referencesWidget.i18n.json index f454d2afef8..e9731705f94 100644 --- a/i18n/cht/src/vs/editor/contrib/referenceSearch/referencesWidget.i18n.json +++ b/i18n/cht/src/vs/editor/contrib/referenceSearch/referencesWidget.i18n.json @@ -25,5 +25,6 @@ "peekViewEditorBackground": "預覽檢視編輯器的背景色彩。", "peekViewEditorGutterBackground": "預覽檢視編輯器邊框(含行號或字形圖示)的背景色彩。", "peekViewResultsMatchHighlight": "在預覽檢視編輯器中比對時的反白顯示色彩。", - "peekViewEditorMatchHighlight": "預覽檢視編輯器中比對時的反白顯示色彩。" + "peekViewEditorMatchHighlight": "預覽檢視編輯器中比對時的反白顯示色彩。", + "peekViewEditorMatchHighlightBorder": "在預覽檢視編輯器中比對時的反白顯示邊界。" } \ No newline at end of file diff --git a/i18n/cht/src/vs/platform/environment/node/argv.i18n.json b/i18n/cht/src/vs/platform/environment/node/argv.i18n.json index cba85befb07..d8400672648 100644 --- a/i18n/cht/src/vs/platform/environment/node/argv.i18n.json +++ b/i18n/cht/src/vs/platform/environment/node/argv.i18n.json @@ -22,12 +22,15 @@ "showVersions": "使用 --list-extension 時,顯示安裝的擴充功能版本。", "installExtension": "安裝擴充功能。", "uninstallExtension": "解除安裝擴充功能。", + "experimentalApis": "啟用延伸模組的建議 API 功能。", "verbose": "列印詳細資訊輸出 (表示 --wait)。", "log": "使用的日誌級別。預設為\"訊息\"。允許的值是 \"關鍵\"、\"錯誤\"、\"警告\"、\"訊息\"、\"偵錯\"、\"追蹤\"、\"關閉\"。", "status": "列印進程使用方式和診斷資訊。", "performance": "在已啟用 'Developer: Startup Performance' 命令的情況下開始。", "prof-startup": "啟動時執行 CPU 分析工具", "disableExtensions": "停用所有已安裝的擴充功能。", + "inspect-extensions": "允許延伸模組的偵錯與分析。如需連線 URI,請查看開發人員工具。", + "inspect-brk-extensions": "允許對延伸主機在啟動後暫停擴充功能進行偵錯和分析。如需連線 URI,請查看開發人員工具。", "disableGPU": "停用 GPU 硬體加速。", "uploadLogs": "上傳目前的工作階段紀錄至安全的端點。", "maxMemory": "視窗的最大記憶體大小 (以 MB 為單位)。", diff --git a/i18n/cht/src/vs/platform/extensionManagement/node/extensionManagementService.i18n.json b/i18n/cht/src/vs/platform/extensionManagement/node/extensionManagementService.i18n.json index 066b714df00..e135a1089b1 100644 --- a/i18n/cht/src/vs/platform/extensionManagement/node/extensionManagementService.i18n.json +++ b/i18n/cht/src/vs/platform/extensionManagement/node/extensionManagementService.i18n.json @@ -7,6 +7,7 @@ "Do not edit this file. It is machine generated." ], "invalidManifest": "擴充功能無效: package.json 不是 JSON 檔案。", + "incompatible": "因為延伸模組 '{0}' 與程式碼 '{1}' 不相容,所以無法安裝。", "restartCode": "請先重新啟動 Code,再重新安裝 {0}。", "installingOutdatedExtension": "已安裝此擴充功能的較新版本。是否要使用舊版本覆蓋此項?", "override": "覆寫", @@ -20,6 +21,7 @@ "notFoundCompatibleDependency": "無法安裝,因為找不到相容於 VS Code 目前版本 '{1}' 的相依擴充功能 '{0}'。", "quitCode": "無法安裝擴充功能。重新安裝以前請重啟 VS Code。", "exitCode": "無法安裝擴充功能。重新安裝以前請離開並再次啟動 VS Code。", + "renameError": "將 {0} 重新命名為 {1} 時發生未知錯誤", "uninstallDependeciesConfirmation": "只要將 '{0}' 解除安裝,或要包含其相依性?", "uninstallOnly": "僅擴充功能", "uninstallAll": "全部解除安裝", diff --git a/i18n/cht/src/vs/platform/issue/electron-main/issueService.i18n.json b/i18n/cht/src/vs/platform/issue/electron-main/issueService.i18n.json index 01a61fb8c5e..855fc34813b 100644 --- a/i18n/cht/src/vs/platform/issue/electron-main/issueService.i18n.json +++ b/i18n/cht/src/vs/platform/issue/electron-main/issueService.i18n.json @@ -6,5 +6,6 @@ "--------------------------------------------------------------------------------------------", "Do not edit this file. It is machine generated." ], - "issueReporter": "問題回報程式" + "issueReporter": "問題回報程式", + "processExplorer": "處理序總管" } \ No newline at end of file diff --git a/i18n/cht/src/vs/platform/theme/common/colorRegistry.i18n.json b/i18n/cht/src/vs/platform/theme/common/colorRegistry.i18n.json index 6e1858c0029..45499691c69 100644 --- a/i18n/cht/src/vs/platform/theme/common/colorRegistry.i18n.json +++ b/i18n/cht/src/vs/platform/theme/common/colorRegistry.i18n.json @@ -29,6 +29,7 @@ "inputPlaceholderForeground": "文字輸入替代字符的前景顏色。", "inputValidationInfoBackground": "資訊嚴重性的輸入驗證背景色彩。", "inputValidationInfoBorder": "資訊嚴重性的輸入驗證邊界色彩。", + "inputValidationWarningBackground": "警告嚴重性的輸入驗證背景色彩。", "inputValidationWarningBorder": "警告嚴重性的輸入驗證邊界色彩。", "inputValidationErrorBackground": "錯誤嚴重性的輸入驗證背景色彩。", "inputValidationErrorBorder": "錯誤嚴重性的輸入驗證邊界色彩。", @@ -70,8 +71,10 @@ "editorSelectionHighlightBorder": "選取時,內容相同之區域的框線色彩。", "editorFindMatch": "符合目前搜尋的色彩。", "findMatchHighlight": "符合搜尋條件的其他項目的顏色。不能使用非透明的顏色來隱藏底層的樣式。", + "findRangeHighlight": "限制搜索的範圍色彩。不能使用非透明的色彩來隱藏基礎樣式。", "editorFindMatchBorder": "符合目前搜尋的框線色彩。", "findMatchHighlightBorder": "符合其他搜尋的框線色彩。", + "findRangeHighlightBorder": "限制搜尋範圍的邊框色彩。不能使用非透明的色彩來隱藏基礎樣式。", "hoverHighlight": "突顯懸停顯示的文字。不能使用非透明的顏色來隱藏底層的樣式。", "hoverBackground": "編輯器動態顯示的背景色彩。", "hoverBorder": "編輯器動態顯示的框線色彩。", @@ -85,6 +88,7 @@ "mergeIncomingHeaderBackground": "傳入內嵌合併衝突中的深色標題背景。不能使用非透明的顏色來隱藏底層的樣式。", "mergeIncomingContentBackground": "傳入內嵌合併衝突中的內容背景。不能使用非透明的顏色來隱藏底層的樣式。", "mergeCommonHeaderBackground": "內嵌合併衝突中的共同始祖標題背景。不能使用非透明的顏色來隱藏底層的樣式。", + "mergeCommonContentBackground": "內嵌合併衝突中的共同始祖內容背景。不能使用非透明的顏色來隱藏基礎樣式。", "mergeBorder": "內嵌合併衝突中標頭及分隔器的邊界色彩。", "overviewRulerCurrentContentForeground": "目前內嵌合併衝突的概觀尺規前景。", "overviewRulerIncomingContentForeground": "傳入內嵌合併衝突的概觀尺規前景。", diff --git a/i18n/cht/src/vs/platform/url/electron-browser/inactiveExtensionUrlHandler.i18n.json b/i18n/cht/src/vs/platform/url/electron-browser/inactiveExtensionUrlHandler.i18n.json index 35229bd6699..71406e91166 100644 --- a/i18n/cht/src/vs/platform/url/electron-browser/inactiveExtensionUrlHandler.i18n.json +++ b/i18n/cht/src/vs/platform/url/electron-browser/inactiveExtensionUrlHandler.i18n.json @@ -5,5 +5,6 @@ "Licensed under the MIT License. See License.txt in the project root for license information.", "--------------------------------------------------------------------------------------------", "Do not edit this file. It is machine generated." - ] + ], + "confirmUrl": "要允許 {0} 延伸模組開啟下列 URL 嗎?" } \ No newline at end of file diff --git a/i18n/cht/src/vs/workbench/api/browser/viewsContainersExtensionPoint.i18n.json b/i18n/cht/src/vs/workbench/api/browser/viewsContainersExtensionPoint.i18n.json index efc4571aceb..768c89868b0 100644 --- a/i18n/cht/src/vs/workbench/api/browser/viewsContainersExtensionPoint.i18n.json +++ b/i18n/cht/src/vs/workbench/api/browser/viewsContainersExtensionPoint.i18n.json @@ -6,6 +6,15 @@ "--------------------------------------------------------------------------------------------", "Do not edit this file. It is machine generated." ], + "vscode.extension.contributes.views.containers.id": "用於識別可透過使用 'views' 參與點參與檢視之容器的唯一識別碼", + "vscode.extension.contributes.views.containers.title": "用於轉譯容器的易讀字串", + "vscode.extension.contributes.views.containers.icon": "容器圖示的路徑。圖示為置於 50x40 正方形中央,且以 'rgb(215, 218, 224)' 或 '#d7dae0' 填滿顏色的 24x24 影像。雖然接受所有影像檔案類型,但建議使用 SVG 作為圖示格式。", + "vscode.extension.contributes.viewsContainers": "提供檢視容器給編輯者", + "views.container.activitybar": "提供檢視容器給活動列", + "test": "測試", + "proposed": "只有在 dev 不足,或使用下列命令列參數時才能使用 'viewsContainers' 參與: --enable-proposed-api {0}。", + "requirearray": "檢視容器必須為陣列", + "requireidstring": "屬性 ‵{0}` 為必要項且必須為類型 `string`。僅允許英數字元字母、'_'、'-'。", "requirestring": "屬性 '{0}' 為強制項目且必須屬於 `string` 類型", "showViewlet": "顯示 {0}", "view": "檢視" diff --git a/i18n/cht/src/vs/workbench/api/browser/viewsExtensionPoint.i18n.json b/i18n/cht/src/vs/workbench/api/browser/viewsExtensionPoint.i18n.json index 7113fc08c8b..982167897cd 100644 --- a/i18n/cht/src/vs/workbench/api/browser/viewsExtensionPoint.i18n.json +++ b/i18n/cht/src/vs/workbench/api/browser/viewsExtensionPoint.i18n.json @@ -13,6 +13,12 @@ "vscode.extension.contributes.view.name": "使用人性化顯示名稱.", "vscode.extension.contributes.view.when": "必須為 true 以顯示此檢視的條件", "vscode.extension.contributes.views": "提供意見給編輯者", + "views.explorer": "提供檢視給活動列中的總管容器", + "views.debug": "提供檢視給活動列中的偵錯容器", + "views.scm": "提供檢視給活動列中的 SCM 容器", + "views.test": "提供檢視給活動列中的測試容器", + "views.contributed": "提供檢視給參與檢視容器", + "ViewContainerDoesnotExist": "檢視容器 '{0}' 不存在,且所有向其註冊的檢視都會新增至 'Explorer'。", "duplicateView1": "無法在位置 '{1}' 使用相同的識別碼 '{0}' 註冊多個檢視", "duplicateView2": "識別碼為 '{0}' 的檢視已在位置 '{1}' 註冊" } \ No newline at end of file diff --git a/i18n/cht/src/vs/workbench/api/electron-browser/mainThreadSaveParticipant.i18n.json b/i18n/cht/src/vs/workbench/api/electron-browser/mainThreadSaveParticipant.i18n.json index ca923fa42ab..074f6b2402f 100644 --- a/i18n/cht/src/vs/workbench/api/electron-browser/mainThreadSaveParticipant.i18n.json +++ b/i18n/cht/src/vs/workbench/api/electron-browser/mainThreadSaveParticipant.i18n.json @@ -7,6 +7,7 @@ "Do not edit this file. It is machine generated." ], "timeout.formatOnSave": "在 {0} 毫秒後儲存時中止格式", + "codeActionsOnSave.didTimeout": "在 {0} 毫秒後中止了 codeActionsOnSave", "timeout.onWillSave": "在 1750 亳秒後中止 onWillSaveTextDocument 事件", "saveParticipants": "執行儲存參與者..." } \ No newline at end of file diff --git a/i18n/cht/src/vs/workbench/browser/parts/editor/resourceViewer.i18n.json b/i18n/cht/src/vs/workbench/browser/parts/editor/resourceViewer.i18n.json index bf4efe8a202..e9f8dbb8b3e 100644 --- a/i18n/cht/src/vs/workbench/browser/parts/editor/resourceViewer.i18n.json +++ b/i18n/cht/src/vs/workbench/browser/parts/editor/resourceViewer.i18n.json @@ -11,7 +11,10 @@ "sizeMB": "{0}MB", "sizeGB": "{0}GB", "sizeTB": "{0}TB", + "largeImageError": "因為影像太大,所以未在編輯器中顯示 ({0})。", "resourceOpenExternalButton": "要使用外部程式打開影像嗎?", + "nativeFileTooLargeError": "因為檔案太大,所以未在編輯器中顯示 ({0})。", + "nativeBinaryError": "因為檔案為二進位檔或使用了不支援的文字編碼,所以未在編輯器中顯示。", "openAsText": "是否確定要開啟?", "zoom.action.fit.label": "整個影像", "imgMeta": "{0}x{1} {2}" diff --git a/i18n/cht/src/vs/workbench/electron-browser/main.contribution.i18n.json b/i18n/cht/src/vs/workbench/electron-browser/main.contribution.i18n.json index b8069009fb7..bf339c91e85 100644 --- a/i18n/cht/src/vs/workbench/electron-browser/main.contribution.i18n.json +++ b/i18n/cht/src/vs/workbench/electron-browser/main.contribution.i18n.json @@ -80,6 +80,7 @@ "titleBarStyle": "調整視窗標題列的外觀。變更需要完整重新啟動才會套用。", "window.nativeTabs": "啟用 macOS Sierra 視窗索引標籤。請注意需要完全重新啟動才能套用變更,並且完成設定後原始索引標籤將會停用自訂標題列樣式。", "window.smoothScrollingWorkaround": "在還原最小化的 VS Code 視窗後,若捲動功能不再流暢,請啟用此因應措施。此因應措施適用於 Microsoft Surface 等具備精確軌跡板發生的捲動延遲問題 (https://github.com/Microsoft/vscode/issues/13612)。啟用此因應措施可能會在將視窗從最小化狀態還原後,導致版面稍微閃爍,但並不會造成任何傷害。", + "window.clickThroughInactive": "若已啟用,按一下非使用中的視窗將會啟動該視窗並觸發其下的元素 (如果可以案的話)。若已停用,按一下非使用中視窗的任一處則只會啟動該視窗,必須再按一下才會觸發元素。", "zenModeConfigurationTitle": "Zen Mode", "zenMode.fullScreen": "控制開啟 Zen Mode 是否也會將 Workbench 轉換為全螢幕模式。", "zenMode.centerLayout": "控制開啟 Zen Mode 是否也會置中配置。", diff --git a/i18n/cht/src/vs/workbench/parts/debug/browser/breakpointsView.i18n.json b/i18n/cht/src/vs/workbench/parts/debug/browser/breakpointsView.i18n.json index cd5762d9e8b..5b3899db4ff 100644 --- a/i18n/cht/src/vs/workbench/parts/debug/browser/breakpointsView.i18n.json +++ b/i18n/cht/src/vs/workbench/parts/debug/browser/breakpointsView.i18n.json @@ -6,7 +6,10 @@ "--------------------------------------------------------------------------------------------", "Do not edit this file. It is machine generated." ], + "logPoint": "記錄點", "breakpoint": "中斷點", + "editBreakpoint": "編輯 {0}...", + "removeBreakpoint": "移除 {0}", "functionBreakpointsNotSupported": "此偵錯類型不支援函式中斷點", "functionBreakpointPlaceholder": "要中斷的函式", "functionBreakPointInputAriaLabel": "輸入函式中斷點", @@ -14,7 +17,7 @@ "breakpointUnverifieddHover": "未驗證的中斷點", "functionBreakpointUnsupported": "此偵錯類型不支援函式中斷點", "breakpointDirtydHover": "未驗證的中斷點。檔案已修改,請重新啟動偵錯工作階段。", - "logBreakpointUnsupported": "此偵錯類型不支援紀錄點", + "logBreakpointUnsupported": "此偵錯類型不支援記錄點", "conditionalBreakpointUnsupported": "此偵錯類型不支援的條件式中斷點", "hitBreakpointUnsupported": "此偵錯類型不支援點擊條件式中斷點" } \ No newline at end of file diff --git a/i18n/cht/src/vs/workbench/parts/debug/browser/debugActions.i18n.json b/i18n/cht/src/vs/workbench/parts/debug/browser/debugActions.i18n.json index 0f2f7956622..905bfa283bd 100644 --- a/i18n/cht/src/vs/workbench/parts/debug/browser/debugActions.i18n.json +++ b/i18n/cht/src/vs/workbench/parts/debug/browser/debugActions.i18n.json @@ -21,6 +21,7 @@ "disconnectDebug": "中斷連接", "continueDebug": "繼續", "pauseDebug": "暫停", + "terminateThread": "終止執行緒", "restartFrame": "重新啟動框架", "removeBreakpoint": "移除中斷點", "removeAllBreakpoints": "移除所有中斷點", diff --git a/i18n/cht/src/vs/workbench/parts/debug/browser/debugEditorActions.i18n.json b/i18n/cht/src/vs/workbench/parts/debug/browser/debugEditorActions.i18n.json index 2c747d5afe2..4afe23d64a7 100644 --- a/i18n/cht/src/vs/workbench/parts/debug/browser/debugEditorActions.i18n.json +++ b/i18n/cht/src/vs/workbench/parts/debug/browser/debugEditorActions.i18n.json @@ -8,7 +8,7 @@ ], "toggleBreakpointAction": "偵錯: 切換中斷點", "conditionalBreakpointEditorAction": "偵錯: 新增條件中斷點...", - "logPointEditorAction": "偵錯: 新增紀錄點...", + "logPointEditorAction": "偵錯: 新增記錄點...", "runToCursor": "執行至游標處", "debugEvaluate": "偵錯: 評估", "debugAddToWatch": "偵錯: 加入監看", diff --git a/i18n/cht/src/vs/workbench/parts/debug/electron-browser/breakpointWidget.i18n.json b/i18n/cht/src/vs/workbench/parts/debug/electron-browser/breakpointWidget.i18n.json index 357f07f4254..9c6da9e6ef9 100644 --- a/i18n/cht/src/vs/workbench/parts/debug/electron-browser/breakpointWidget.i18n.json +++ b/i18n/cht/src/vs/workbench/parts/debug/electron-browser/breakpointWidget.i18n.json @@ -6,6 +6,7 @@ "--------------------------------------------------------------------------------------------", "Do not edit this file. It is machine generated." ], + "breakpointWidgetLogMessagePlaceholder": "當命中中斷點時向記錄傳送訊息。會以內插值取代 {} 中的運算式。按一下 'Enter' 接受,或是按 'esc' 取消。", "breakpointWidgetHitCountPlaceholder": "符合叫用次數條件時中斷。按 'Enter' 鍵接受,按 'esc' 鍵取消。", "breakpointWidgetExpressionPlaceholder": "在運算式評估為 true 時中斷。按 'Enter' 鍵接受,按 'esc' 鍵取消。", "expression": "運算式", diff --git a/i18n/cht/src/vs/workbench/parts/debug/electron-browser/debugConfigurationManager.i18n.json b/i18n/cht/src/vs/workbench/parts/debug/electron-browser/debugConfigurationManager.i18n.json index 94fb09e76eb..93abfd36106 100644 --- a/i18n/cht/src/vs/workbench/parts/debug/electron-browser/debugConfigurationManager.i18n.json +++ b/i18n/cht/src/vs/workbench/parts/debug/electron-browser/debugConfigurationManager.i18n.json @@ -35,6 +35,7 @@ "useUniqueNames": "請使用唯一的組態名稱。", "app.launch.json.compound.folder": "複合所在的資料夾名稱。", "app.launch.json.compounds.configurations": "將會作為此複合一部份而啟動之組態的名稱。", + "debugNoType": "偵錯器 'type' 無法省略,且必須為類型 'string'。", "selectDebug": "選取環境", "DebugConfig.failed": "無法在 '.vscode' 資料夾 ({0}) 中建立 'launch.json' 檔案。", "workspace": "工作區", diff --git a/i18n/cht/src/vs/workbench/parts/debug/electron-browser/debugEditorContribution.i18n.json b/i18n/cht/src/vs/workbench/parts/debug/electron-browser/debugEditorContribution.i18n.json index e48c78a24f2..14b63d02d62 100644 --- a/i18n/cht/src/vs/workbench/parts/debug/electron-browser/debugEditorContribution.i18n.json +++ b/i18n/cht/src/vs/workbench/parts/debug/electron-browser/debugEditorContribution.i18n.json @@ -6,7 +6,12 @@ "--------------------------------------------------------------------------------------------", "Do not edit this file. It is machine generated." ], + "logPoint": "記錄點", "breakpoint": "中斷點", + "removeBreakpoint": "移除 {0}", + "editBreakpoint": "編輯 {0}...", + "disableBreakpoint": "停用 {0}", + "enableBreakpoint": "啟用 {0}", "removeBreakpoints": "移除中斷點", "removeBreakpointOnColumn": "移除資料行 {0} 的中斷點", "removeLineBreakpoint": "移除行中斷點", @@ -20,7 +25,12 @@ "enableBreakpointOnLine": "啟用行中斷點", "addBreakpoint": "加入中斷點", "addConditionalBreakpoint": "新增條件中斷點...", - "addLogPoint": "新增紀錄點...", + "addLogPoint": "新增記錄點...", + "breakpointHasCondition": "此 {0} 具有會在移除時消失的 {1}。請考慮改為停用 {0}。", + "message": "訊息", + "condition": "條件", + "removeLogPoint": "移除 {0}", + "disableLogPoint": "停用 {0}", "cancel": "取消", "addConfiguration": "新增組態..." } \ No newline at end of file diff --git a/i18n/cht/src/vs/workbench/parts/extensions/electron-browser/extensionEditor.i18n.json b/i18n/cht/src/vs/workbench/parts/extensions/electron-browser/extensionEditor.i18n.json index 49e59b56429..1a8774452e5 100644 --- a/i18n/cht/src/vs/workbench/parts/extensions/electron-browser/extensionEditor.i18n.json +++ b/i18n/cht/src/vs/workbench/parts/extensions/electron-browser/extensionEditor.i18n.json @@ -36,6 +36,8 @@ "view location": "位置", "localizations": "當地語系化 ({0})", "localizations language id": "語言識別碼", + "localizations language name": "語言名稱", + "localizations localized language name": "語言名稱 (已當地語系化)", "colorThemes": "色彩佈景主題 ({0})", "iconThemes": "圖示佈景主題 ({0}) ", "colors": "色彩 ({0})", diff --git a/i18n/cht/src/vs/workbench/parts/files/browser/editors/textFileEditor.i18n.json b/i18n/cht/src/vs/workbench/parts/files/browser/editors/textFileEditor.i18n.json index cc6a6ac83fa..e1655af8772 100644 --- a/i18n/cht/src/vs/workbench/parts/files/browser/editors/textFileEditor.i18n.json +++ b/i18n/cht/src/vs/workbench/parts/files/browser/editors/textFileEditor.i18n.json @@ -8,6 +8,8 @@ ], "textFileEditor": "文字檔編輯器", "createFile": "建立檔案", + "relaunchWithIncreasedMemoryLimit": "以 {0} MB 重新啟動", + "configureMemoryLimit": "設定記憶體限制", "fileEditorWithInputAriaLabel": "{0}。文字檔編輯器。", "fileEditorAriaLabel": "文字檔編輯器。" } \ No newline at end of file diff --git a/i18n/cht/src/vs/workbench/parts/files/electron-browser/fileActions.i18n.json b/i18n/cht/src/vs/workbench/parts/files/electron-browser/fileActions.i18n.json index d431d7870ce..dc0c8bfc2cb 100644 --- a/i18n/cht/src/vs/workbench/parts/files/electron-browser/fileActions.i18n.json +++ b/i18n/cht/src/vs/workbench/parts/files/electron-browser/fileActions.i18n.json @@ -13,6 +13,7 @@ "copyFile": "複製", "pasteFile": "貼上", "retry": "重試", + "renameWhenSourcePathIsParentOfTargetError": "請使用 'New Folder' 或 'New File' 命令將子系新增至現有的資料夾", "newUntitledFile": "新增未命名檔案", "createNewFile": "新增檔案", "createNewFolder": "新增資料夾", @@ -32,12 +33,17 @@ "trashFailed": "無法使用垃圾筒刪除。您要改為永久刪除嗎?", "deletePermanentlyButtonLabel": "永久刪除(&&D)", "retryButtonLabel": "重試(&&R)", + "confirmMoveTrashMessageFilesAndDirectories": "確定要刪除下列 {0} 個檔案/目錄及其內容嗎?", + "confirmMoveTrashMessageMultipleDirectories": "確定要刪除下列 {0} 個目錄及其內容嗎?", "confirmMoveTrashMessageMultiple": "確定要刪除以下 {0} 個檔案嗎?", "confirmMoveTrashMessageFolder": "您確定要刪除 '{0}' 及其內容嗎?", "confirmMoveTrashMessageFile": "您確定要刪除 '{0}' 嗎?", + "confirmDeleteMessageFilesAndDirectories": "確定要永久刪除下列 {0} 個檔案/目錄及其內容嗎?", + "confirmDeleteMessageMultipleDirectories": "確定要永久刪除下列 {0} 個目錄及其內容嗎?", "confirmDeleteMessageMultiple": "確定要永久地刪除以下 {0} 個檔案嗎?", "confirmDeleteMessageFolder": "您確定要永久刪除 '{0}' 和其中的內容嗎?", "confirmDeleteMessageFile": "您確定要永久刪除 '{0}' 嗎?", + "addFiles": "新增檔案", "confirmOverwrite": "目的資料夾中已有同名的檔案或資料夾。要取代它嗎?", "replaceButtonLabel": "取代(&&R)", "fileIsAncestor": "要貼上的檔案是在目地資料夾的上層 ", @@ -57,7 +63,9 @@ "openFileToShowInNewWindow": "先開啟檔案以在新視窗中開啟", "copyPath": "複製路徑", "emptyFileNameError": "必須提供檔案或資料夾名稱。", + "fileNameStartsWithSlashError": "檔案或資料夾名稱不得以斜線開頭。", "fileNameExistsError": "這個位置已存在檔案或資料夾 **{0}**。請選擇不同的名稱。", + "fileUsedAsFolderError": "**{0}** 是檔案且不得擁有任何子系。", "invalidFileNameError": "名稱 **{0}** 不能作為檔案或資料夾名稱。請選擇不同的名稱。", "filePathTooLongError": "名稱 **{0}** 導致路徑太長。請選擇較短的名稱。", "compareWithClipboard": "比較使用中的檔案和剪貼簿的檔案", diff --git a/i18n/cht/src/vs/workbench/parts/files/electron-browser/files.contribution.i18n.json b/i18n/cht/src/vs/workbench/parts/files/electron-browser/files.contribution.i18n.json index ef1a56ddaa3..be3fbea1a57 100644 --- a/i18n/cht/src/vs/workbench/parts/files/electron-browser/files.contribution.i18n.json +++ b/i18n/cht/src/vs/workbench/parts/files/electron-browser/files.contribution.i18n.json @@ -35,6 +35,7 @@ "hotExit": "控制是否讓不同工作階段記住未儲存的檔案,並允許在結束編輯器時跳過儲存提示。", "useExperimentalFileWatcher": "使用新的實驗性檔案監看員。", "defaultLanguage": "指派給新檔案的預設語言模式。", + "maxMemoryForLargeFilesMB": "控制 VS Code 在重新啟動後常是開啟大型檔案時,可使用多少記憶體。在命令列上指定 --max-memory=NEWSIZE 也能達到相同效果。", "editorConfigurationTitle": "編輯器", "formatOnSave": "在儲存時設定檔案格式。格式器必須處於可用狀態、檔案不得自動儲存,且編輯器不得關機。", "formatOnSaveTimeout": "儲存時格式化超時。指定 formatOnSave 命令的時間限制 (以毫秒為單位)。超過指定超時時間的命令將被取消。", diff --git a/i18n/cht/src/vs/workbench/parts/files/electron-browser/views/explorerViewer.i18n.json b/i18n/cht/src/vs/workbench/parts/files/electron-browser/views/explorerViewer.i18n.json index b183fbaeaf8..7e6437084b5 100644 --- a/i18n/cht/src/vs/workbench/parts/files/electron-browser/views/explorerViewer.i18n.json +++ b/i18n/cht/src/vs/workbench/parts/files/electron-browser/views/explorerViewer.i18n.json @@ -7,6 +7,9 @@ "Do not edit this file. It is machine generated." ], "fileInputAriaLabel": "輸入檔案名稱。請按 Enter 鍵確認或按 Esc 鍵取消。", + "createFileFromExplorerInfoMessage": "在 **{1}** 中建立檔案 **{0}**", + "renameFileFromExplorerInfoMessage": "移至 **{0}** 並重新命名", + "createFolderFromExplorerInfoMessage": "在 **{1}** 中建立資料夾 **{0}**", "filesExplorerViewerAriaLabel": "{0},檔案總管", "dropFolders": "要在工作區新增資料夾嗎?", "dropFolder": "要在工作區新增資料夾嗎?", diff --git a/i18n/cht/src/vs/workbench/parts/localizations/electron-browser/localizations.contribution.i18n.json b/i18n/cht/src/vs/workbench/parts/localizations/electron-browser/localizations.contribution.i18n.json index f2ac4c2136b..080a6cc9f31 100644 --- a/i18n/cht/src/vs/workbench/parts/localizations/electron-browser/localizations.contribution.i18n.json +++ b/i18n/cht/src/vs/workbench/parts/localizations/electron-browser/localizations.contribution.i18n.json @@ -10,7 +10,9 @@ "yes": "是", "no": "否", "neverAgain": "不要再顯示", + "install language pack": "在不久之後,VS Code 將只支援格式為 Marketplace 延伸模組的語言套件。請安裝 '{0}' 延伸模組已繼續使用目前設定的語言。", "install": "安裝", + "more information": "詳細資訊...", "JsonSchema.locale": "要使用的 UI 語言。", "vscode.extension.contributes.localizations": "提供在地化服務給編輯者", "vscode.extension.contributes.localizations.languageId": "顯示已翻譯字串的語言 Id", diff --git a/i18n/cht/src/vs/workbench/parts/markers/electron-browser/markersPanel.i18n.json b/i18n/cht/src/vs/workbench/parts/markers/electron-browser/markersPanel.i18n.json index a8abc1bfbac..cbdc55dae55 100644 --- a/i18n/cht/src/vs/workbench/parts/markers/electron-browser/markersPanel.i18n.json +++ b/i18n/cht/src/vs/workbench/parts/markers/electron-browser/markersPanel.i18n.json @@ -6,6 +6,6 @@ "--------------------------------------------------------------------------------------------", "Do not edit this file. It is machine generated." ], - "disableFilesExclude": "停用檔案排除。", + "disableFilesExclude": "停用檔案排除篩選。", "clearFilter": "清除篩選。" } \ No newline at end of file diff --git a/i18n/cht/src/vs/workbench/parts/markers/electron-browser/markersPanelActions.i18n.json b/i18n/cht/src/vs/workbench/parts/markers/electron-browser/markersPanelActions.i18n.json index 35229bd6699..44d1178263c 100644 --- a/i18n/cht/src/vs/workbench/parts/markers/electron-browser/markersPanelActions.i18n.json +++ b/i18n/cht/src/vs/workbench/parts/markers/electron-browser/markersPanelActions.i18n.json @@ -5,5 +5,6 @@ "Licensed under the MIT License. See License.txt in the project root for license information.", "--------------------------------------------------------------------------------------------", "Do not edit this file. It is machine generated." - ] + ], + "showing filtered problems": "顯示 {0} 個 (共 {1} 個)" } \ No newline at end of file diff --git a/i18n/cht/src/vs/workbench/parts/markers/electron-browser/messages.i18n.json b/i18n/cht/src/vs/workbench/parts/markers/electron-browser/messages.i18n.json index 5e31f17aa84..45f0712eab0 100644 --- a/i18n/cht/src/vs/workbench/parts/markers/electron-browser/messages.i18n.json +++ b/i18n/cht/src/vs/workbench/parts/markers/electron-browser/messages.i18n.json @@ -15,10 +15,12 @@ "markers.panel.aria.label.problems.tree": "依檔案分組的問題", "markers.panel.no.problems.build": "目前在工作區中未偵測到任何問題。", "markers.panel.no.problems.filters": "使用提供的篩選準則找不到任何結果。", + "markers.panel.no.problems.file.exclusions": "因為已啟用檔案排除篩選,所以所有問題皆已隱藏。", "markers.panel.action.useFilesExclude": "使用檔案排除設定進行篩選", "markers.panel.action.donotUseFilesExclude": "不使用檔案排除設定", "markers.panel.action.filter": "篩選問題", "markers.panel.filter.ariaLabel": "篩選問題", + "markers.panel.filter.placeholder": "篩選。例如: 文字、**/*.ts、!**/node_modules/**", "markers.panel.filter.errors": "錯誤", "markers.panel.filter.warnings": "警告", "markers.panel.filter.infos": "資訊", diff --git a/i18n/cht/src/vs/workbench/parts/search/electron-browser/search.contribution.i18n.json b/i18n/cht/src/vs/workbench/parts/search/electron-browser/search.contribution.i18n.json index d9a4412446c..55f7e2bb494 100644 --- a/i18n/cht/src/vs/workbench/parts/search/electron-browser/search.contribution.i18n.json +++ b/i18n/cht/src/vs/workbench/parts/search/electron-browser/search.contribution.i18n.json @@ -10,6 +10,7 @@ "copyMatchLabel": "複製", "copyPathLabel": "複製路徑", "copyAllLabel": "全部複製", + "clearSearchHistoryLabel": "清除搜尋歷程記錄", "toggleSearchViewPositionLabel": "切換搜尋檢視位置", "findInFolder": "在資料夾中尋找...", "findInWorkspace": "在工作區中尋找...", diff --git a/i18n/cht/src/vs/workbench/parts/tasks/common/taskDefinitionRegistry.i18n.json b/i18n/cht/src/vs/workbench/parts/tasks/common/taskDefinitionRegistry.i18n.json index a53aa84f408..d2490129cbf 100644 --- a/i18n/cht/src/vs/workbench/parts/tasks/common/taskDefinitionRegistry.i18n.json +++ b/i18n/cht/src/vs/workbench/parts/tasks/common/taskDefinitionRegistry.i18n.json @@ -6,7 +6,7 @@ "--------------------------------------------------------------------------------------------", "Do not edit this file. It is machine generated." ], - "TaskDefinition.description": "實際的工作類型", + "TaskDefinition.description": "實際工作類型。請注意以 '$' 作為開頭的類型皆為內部使用保留。", "TaskDefinition.properties": "工作類型的其他屬性", "TaskTypeConfiguration.noType": "工作類型組態遺失需要的 'taskType' 屬性", "TaskDefinitionExtPoint": "提供工作種類" diff --git a/i18n/cht/src/vs/workbench/parts/tasks/electron-browser/terminalTaskSystem.i18n.json b/i18n/cht/src/vs/workbench/parts/tasks/electron-browser/terminalTaskSystem.i18n.json index 0e7ca5feabc..d74a43297d8 100644 --- a/i18n/cht/src/vs/workbench/parts/tasks/electron-browser/terminalTaskSystem.i18n.json +++ b/i18n/cht/src/vs/workbench/parts/tasks/electron-browser/terminalTaskSystem.i18n.json @@ -11,6 +11,6 @@ "TerminalTaskSystem.terminalName": "工作 - {0}", "closeTerminal": "按任意鍵關閉終端機。", "reuseTerminal": "工作將被重新啟用.按任意鍵關閉.", - "TerminalTaskSystem": "無法在 UNC 磁碟機上執行殼層命令。", + "TerminalTaskSystem": "無法使用 cmd.exe 在 UNC 磁碟機上執行 shell 命令。", "unkownProblemMatcher": "問題比對器 {0} 無法解析,比對器將予忽略。" } \ No newline at end of file diff --git a/i18n/cht/src/vs/workbench/parts/terminal/electron-browser/terminalInstance.i18n.json b/i18n/cht/src/vs/workbench/parts/terminal/electron-browser/terminalInstance.i18n.json index 70c7d161cc1..451b2ec737a 100644 --- a/i18n/cht/src/vs/workbench/parts/terminal/electron-browser/terminalInstance.i18n.json +++ b/i18n/cht/src/vs/workbench/parts/terminal/electron-browser/terminalInstance.i18n.json @@ -12,5 +12,6 @@ "terminal.integrated.copySelection.noSelection": "終端機沒有任何選取項目可以複製", "terminal.integrated.exitedWithCode": "終端機處理序已終止,結束代碼為: {0}", "terminal.integrated.waitOnExit": "按任意鍵關閉終端機", - "terminal.integrated.launchFailed": "無法啟動終端機處理序命令 '{0}{1}' (結束代碼: {2})" + "terminal.integrated.launchFailed": "無法啟動終端機處理序命令 '{0}{1}' (結束代碼: {2})", + "terminal.integrated.launchFailedExtHost": "終端機處理序無法啟動 (結束代碼: {0})" } \ No newline at end of file diff --git a/i18n/cht/src/vs/workbench/parts/url/electron-browser/url.contribution.i18n.json b/i18n/cht/src/vs/workbench/parts/url/electron-browser/url.contribution.i18n.json index 8e9c4235dcd..7eacd141c36 100644 --- a/i18n/cht/src/vs/workbench/parts/url/electron-browser/url.contribution.i18n.json +++ b/i18n/cht/src/vs/workbench/parts/url/electron-browser/url.contribution.i18n.json @@ -6,5 +6,6 @@ "--------------------------------------------------------------------------------------------", "Do not edit this file. It is machine generated." ], + "openUrl": "開啟 URL", "developer": "開發人員" } \ No newline at end of file diff --git a/i18n/cht/src/vs/workbench/parts/webview/electron-browser/webviewCommands.i18n.json b/i18n/cht/src/vs/workbench/parts/webview/electron-browser/webviewCommands.i18n.json index b418d6bed42..da7857bbdcf 100644 --- a/i18n/cht/src/vs/workbench/parts/webview/electron-browser/webviewCommands.i18n.json +++ b/i18n/cht/src/vs/workbench/parts/webview/electron-browser/webviewCommands.i18n.json @@ -6,5 +6,6 @@ "--------------------------------------------------------------------------------------------", "Do not edit this file. It is machine generated." ], - "openToolsLabel": "開啟 Webview Developer 工具" + "openToolsLabel": "開啟 Webview Developer 工具", + "refreshWebviewLabel": "重新載入 Webviews" } \ No newline at end of file diff --git a/i18n/cht/src/vs/workbench/services/configurationResolver/node/variableResolver.i18n.json b/i18n/cht/src/vs/workbench/services/configurationResolver/node/variableResolver.i18n.json index 35229bd6699..a50b47db620 100644 --- a/i18n/cht/src/vs/workbench/services/configurationResolver/node/variableResolver.i18n.json +++ b/i18n/cht/src/vs/workbench/services/configurationResolver/node/variableResolver.i18n.json @@ -5,5 +5,16 @@ "Licensed under the MIT License. See License.txt in the project root for license information.", "--------------------------------------------------------------------------------------------", "Do not edit this file. It is machine generated." - ] + ], + "missingEnvVarName": "因為未指定任何環境變數名稱,所以無法解析 '{0}'。", + "configNotFound": "因為找不到設定 '{1}',所以無法解析 '{0}'。", + "configNoString": "因為 '{1}' 為結構化值,所以無法解析 '{0}'。", + "missingConfigName": "因為未指定任何設定名稱,所以無法解析 '{0}'。", + "noValueForCommand": "因為命令沒有任何值,所以無法解析 '{0}'。", + "canNotFindFolder": "無法解析 '{0}'。沒有該等資料夾 '{1}'。", + "canNotResolveWorkspaceFolderMultiRoot": "無法在多個資料夾工作區內解析 '{0}'。請使用 ':' 和工作區資料夾名稱定義此變數的範圍。", + "canNotResolveWorkspaceFolder": "無法解析 '{0}'。請開啟資料夾。", + "canNotResolveFile": "無法解析 '{0}'。請開啟編輯器。", + "canNotResolveLineNumber": "無法解析 '{0}'。請確認已在使用中編輯器中選取了行。", + "canNotResolveSelectedText": "無法解析 '{0}'。請確認在使用中編輯器內選取了部分文字。" } \ No newline at end of file diff --git a/i18n/cht/src/vs/workbench/services/extensions/common/extensionsRegistry.i18n.json b/i18n/cht/src/vs/workbench/services/extensions/common/extensionsRegistry.i18n.json index 573550a7a6f..0046c67d6ff 100644 --- a/i18n/cht/src/vs/workbench/services/extensions/common/extensionsRegistry.i18n.json +++ b/i18n/cht/src/vs/workbench/services/extensions/common/extensionsRegistry.i18n.json @@ -25,6 +25,7 @@ "vscode.extension.activationEvents.onDebugResolve": "需要特定類型偵錯工作階段啟動來觸發啟動事件 (並且呼叫相對應 resolveDebugConfiguration 方法)", "vscode.extension.activationEvents.workspaceContains": "當開啟指定的文件夾包含glob模式匹配的文件時激發該事件", "vscode.extension.activationEvents.onView": "當指定的檢視被擴展時激發該事件", + "vscode.extension.activationEvents.onUri": "每當指向此延伸模組的全系統 URI 開啟時,都會發出啟動事件。", "vscode.extension.activationEvents.star": "當VS Code啟動時激發該事件,為了確保最好的使用者體驗,當您的擴充功能沒有其他組合作業時,請激活此事件.", "vscode.extension.badges": "要顯示於 Marketplace 擴充頁面資訊看板的徽章陣列。", "vscode.extension.badges.url": "徽章映像 URL。", diff --git a/i18n/cht/src/vs/workbench/services/files/electron-browser/remoteFileService.i18n.json b/i18n/cht/src/vs/workbench/services/files/electron-browser/remoteFileService.i18n.json index 5b44b85bd11..f19c7db0f10 100644 --- a/i18n/cht/src/vs/workbench/services/files/electron-browser/remoteFileService.i18n.json +++ b/i18n/cht/src/vs/workbench/services/files/electron-browser/remoteFileService.i18n.json @@ -9,5 +9,7 @@ "fileNotFoundError": "找不到檔案 ({0})", "fileIsDirectoryError": "檔案是目錄", "fileNotModifiedError": "未修改檔案的時間", - "fileBinaryError": "檔案似乎是二進位檔,因此無法當做文字開啟" + "fileBinaryError": "檔案似乎是二進位檔,因此無法當做文字開啟", + "err.create": "無法建立檔案 {0}", + "fileMoveConflict": "無法移動/複製。目的地已存在檔案。" } \ No newline at end of file diff --git a/i18n/deu/extensions/emmet/package.i18n.json b/i18n/deu/extensions/emmet/package.i18n.json index 280cca4ed3d..76a0f1cf2f4 100644 --- a/i18n/deu/extensions/emmet/package.i18n.json +++ b/i18n/deu/extensions/emmet/package.i18n.json @@ -35,6 +35,7 @@ "emmetExtensionsPath": "Pfad zu einem Ordner mit Emmet-Profilen und Ausschnitten.", "emmetShowExpandedAbbreviation": "Zeigt erweiterte Emmet-Abkürzungen als Vorschläge an.\nDie Option inMarkupAndStylesheetFilesOnly gilt für HTML, HAML, Jade, Slim, XML, XSL, CSS, SCSS, Sass, Less und Stylus.\nDie Option \"always\" gilt unabhängig vom Markup/CSS für alle Teile der Datei.", "emmetShowAbbreviationSuggestions": "Zeigt mögliche Emmet-Abkürzungen als Vorschläge an. Diese Option gilt nicht in Stylesheets oder wenn emmet.showExpandedAbbreviation auf \"never\" festgelegt ist.", + "emmetIncludeLanguages": "Aktivieren Sie Emmet-Abkürzungen in Sprachen, die nicht standardmäßig unterstützt werden. Fügen Sie hier eine Zuordnung zwischen der Sprache und der von Emmet unterstützten Sprache hinzu.\nBeispiel: {\"vue-html\": \"html\", \"javascript\": \"javascriptreact\"}", "emmetVariables": "In Emmet-Ausschnitten zu verwendende Codeausschnitte", "emmetTriggerExpansionOnTab": "Wenn aktiviert, werden Emmet-Abkürzungen beim Drücken der TAB-Taste erweitert.", "emmetPreferences": "Einstellungen, die zum Ändern des Verhaltens einiger Aktionen und Konfliktlöser von Emmet verwendet werden.", @@ -59,5 +60,6 @@ "emmetPreferencesCssMozProperties": "Durch Trennzeichen getrennte CSS-Eigenschaften, die das \"moz\"-Herstellerpräfix erhalten, wenn sie in einer Emmet-Abkürzung verwendet werden, die mit \"-\" beginnt. Legen Sie eine leere Zeichenfolge fest, um das \"moz\"-Präfix immer zu vermeiden.", "emmetPreferencesCssOProperties": "Durch Trennzeichen getrennte CSS-Eigenschaften, die das \"o\"-Herstellerpräfix erhalten, wenn sie in einer Emmet-Abkürzung verwendet werden, die mit \"-\" beginnt. Legen Sie eine leere Zeichenfolge fest, um das \"o\"-Präfix immer zu vermeiden.", "emmetPreferencesCssMsProperties": "Durch Trennzeichen getrennte CSS-Eigenschaften, die das \"ms\"-Herstellerpräfix erhalten, wenn sie in einer Emmet-Abkürzung verwendet werden, die mit \"-\" beginnt. Legen Sie eine leere Zeichenfolge fest, um das \"ms\"-Präfix immer zu vermeiden.", - "emmetPreferencesCssFuzzySearchMinScore": "Das Mindestergebnis (zwischen 0 und 1), das die Abkürzung mit Fuzzyübereinstimmung erreichen muss. Niedrigere Werte führen zu vielen falsch positiven Übereinstimmungen, höhere Werte verringern unter Umständen die möglichen Übereinstimmungen." + "emmetPreferencesCssFuzzySearchMinScore": "Das Mindestergebnis (zwischen 0 und 1), das die Abkürzung mit Fuzzyübereinstimmung erreichen muss. Niedrigere Werte führen zu vielen falsch positiven Übereinstimmungen, höhere Werte verringern unter Umständen die möglichen Übereinstimmungen.", + "emmetOptimizeStylesheetParsing": "Bei der Einstellung FALSE wird die gesamte Datei analysiert, um zu bestimmten, ob die aktuelle Position zum Erweitern von Emmet-Abkürzungen gültig ist. Bei der Einstellung TRUE wird nur der Inhalt um die die aktuelle Position in CSS-/SCSS-/LESS-Dateien analysiert." } \ No newline at end of file diff --git a/i18n/deu/extensions/git/out/commands.i18n.json b/i18n/deu/extensions/git/out/commands.i18n.json index 7efb13a1a10..cdcaf78706c 100644 --- a/i18n/deu/extensions/git/out/commands.i18n.json +++ b/i18n/deu/extensions/git/out/commands.i18n.json @@ -11,9 +11,7 @@ "create branch": "$(plus) Neuen Branch erstellen", "repourl": "Repository-URL", "parent": "Übergeordnetes Verzeichnis", - "cancel": "$(sync~spin) Repository wird geklont... Klicken Sie zum Abbrechen", - "cancel tooltip": "Klonen abbrechen", - "cloning": "Git-Repository wird geklont...", + "cloning": "Das Git-Repository \"{0}\" wird geklont …", "openrepo": "Repository öffnen", "proposeopen": "Möchten Sie das geklonte Repository öffnen?", "init": "Arbeitsbereichsordner auswählen, in dem das Git-Repository initialisiert wird", diff --git a/i18n/deu/extensions/markdown-language-features/out/security.i18n.json b/i18n/deu/extensions/markdown-language-features/out/security.i18n.json index 828b182b8ed..c59e06479c0 100644 --- a/i18n/deu/extensions/markdown-language-features/out/security.i18n.json +++ b/i18n/deu/extensions/markdown-language-features/out/security.i18n.json @@ -8,6 +8,8 @@ ], "strict.title": "Strict", "strict.description": "Nur sicheren Inhalt laden", + "insecureLocalContent.title": "Unsichere lokale Inhalte zulassen", + "insecureLocalContent.description": "Laden von Inhalten über HTTP von localhost aktivieren", "insecureContent.title": "Unsicheren Inhalt zulassen", "insecureContent.description": "Laden von Inhalten über HTTP aktivieren", "disable.title": "Deaktivieren", diff --git a/i18n/deu/extensions/npm/out/npmView.i18n.json b/i18n/deu/extensions/npm/out/npmView.i18n.json index 35229bd6699..e56a09ae55c 100644 --- a/i18n/deu/extensions/npm/out/npmView.i18n.json +++ b/i18n/deu/extensions/npm/out/npmView.i18n.json @@ -5,5 +5,7 @@ "Licensed under the MIT License. See License.txt in the project root for license information.", "--------------------------------------------------------------------------------------------", "Do not edit this file. It is machine generated." - ] + ], + "npm.noDebugOptions": "\"{0}\" konnte nicht zum Debuggen gestartet werden, da die Skripte keine Node-Debugging-Option enthalten wie z. B. \"--inspect-brk\".", + "npm.scriptInvalid": "Das Skript \"{0}\" wurde nicht gefunden. Versuchen Sie, die Ansicht zu aktualisieren." } \ No newline at end of file diff --git a/i18n/deu/extensions/npm/package.i18n.json b/i18n/deu/extensions/npm/package.i18n.json index 91063ce0648..ba906568b83 100644 --- a/i18n/deu/extensions/npm/package.i18n.json +++ b/i18n/deu/extensions/npm/package.i18n.json @@ -12,10 +12,15 @@ "config.npm.runSilent": "npm-Befehle mit der Option \"--silent\" ausführen.", "config.npm.packageManager": "Der zu verwendende Paket-Manager, um Skripte auszuführen.", "config.npm.exclude": "Konfigurieren Sie Globmuster für Ordner, die von der automatischen Skripterkennung ausgeschlossen werden sollen.", + "config.npm.enableScriptExplorer": "Explorer-Ansicht für NPM-Skripte aktivieren, wenn der Arbeitsbereich die Datei \"package.json\" enthält.", "npm.parseError": "NPM-Aufgabenerkennung: Fehler beim Analysieren der Datei {0}", "taskdef.script": "Das anzupassende NPM-Skript.", "taskdef.path": "Der Pfad zu dem Ordner der Datei vom Typ \"package.json\", die das Skript bereitstellt. Kann ausgelassen werden.", + "view.name": "NPM-Skripte", "command.refresh": "Aktualisieren", + "command.run": "Ausführen", "command.debug": "Debuggen", - "command.openScript": "Öffnen" + "command.openScript": "Öffnen", + "npm.scriptInvalid": "Das Skript \"{0}\" wurde nicht gefunden. Versuchen Sie, die Ansicht zu aktualisieren.", + "npm.noDebugOptions": "\"{0}\" konnte nicht zum Debuggen gestartet werden, da die Skripte keine Node-Debugging-Option enthalten wie z. B. \"--inspect-brk\"." } \ No newline at end of file diff --git a/i18n/deu/extensions/php/package.i18n.json b/i18n/deu/extensions/php/package.i18n.json index 25f008aacf8..5c068410d3d 100644 --- a/i18n/deu/extensions/php/package.i18n.json +++ b/i18n/deu/extensions/php/package.i18n.json @@ -6,5 +6,6 @@ "--------------------------------------------------------------------------------------------", "Do not edit this file. It is machine generated." ], + "displayName": "PHP-Sprachgrundlagen", "description": "Bietet Syntaxhervorhebung und Klammernpaare für PHP-Dateien." } \ No newline at end of file diff --git a/i18n/deu/extensions/typescript-language-features/out/features/completionItemProvider.i18n.json b/i18n/deu/extensions/typescript-language-features/out/features/completionItemProvider.i18n.json index 3d20846a443..c1be716a2f8 100644 --- a/i18n/deu/extensions/typescript-language-features/out/features/completionItemProvider.i18n.json +++ b/i18n/deu/extensions/typescript-language-features/out/features/completionItemProvider.i18n.json @@ -8,5 +8,6 @@ ], "selectCodeAction": "Anzuwendende Codeaktion auswählen", "acquiringTypingsLabel": "Eingaben werden abgerufen...", - "acquiringTypingsDetail": "Eingabedefinitionen für IntelliSense werden abgerufen." + "acquiringTypingsDetail": "Eingabedefinitionen für IntelliSense werden abgerufen.", + "autoImportLabel": "Automatischer Import von {0}" } \ No newline at end of file diff --git a/i18n/deu/extensions/typescript-language-features/package.i18n.json b/i18n/deu/extensions/typescript-language-features/package.i18n.json index 8aa361d46a1..8fa1df1b169 100644 --- a/i18n/deu/extensions/typescript-language-features/package.i18n.json +++ b/i18n/deu/extensions/typescript-language-features/package.i18n.json @@ -15,6 +15,8 @@ "typescript.tsdk.desc": "Gibt den Ordnerpfad mit den zu verwendenden tsserver- und lib*.d.ts-Dateien an.", "typescript.disableAutomaticTypeAcquisition": "Deaktiviert die automatische Typerfassung. Erfordert TypeScript >= 2.0.6.", "typescript.tsserver.log": "Aktiviert die Protokollierung des TS-Servers in eine Datei. Mithilfe der Protokolldatei lassen sich Probleme beim TS-Server diagnostizieren. Die Protokolldatei kann Dateipfade, Quellcode und weitere potenziell sensible Informationen aus Ihrem Projekt enthalten.", + "typescript.tsserver.pluginPaths": "Zusätzliche Pfade zum Suchen von Typescript Language Service-Plug-Ins. Erfordert TypeScript 2.3.0 oder höher. ", + "typescript.tsserver.pluginPaths.item": "Ein absoluter oder relativer Pfad. Ein relativer Pfad wird in Bezug auf die Arbeitsbereichsordner aufgelöst.", "typescript.tsserver.trace": "Aktiviert die Ablaufverfolgung von an den TS-Server gesendeten Nachrichten. Mithilfe der Ablaufverfolgung lassen sich Probleme beim TS-Server diagnostizieren. Die Ablaufverfolgung kann Dateipfade, Quellcode und weitere potenziell sensible Informationen aus Ihrem Projekt enthalten.", "typescript.validate.enable": "TypeScript-Überprüfung aktivieren/deaktivieren.", "typescript.format.enable": "Standardmäßigen TypeScript-Formatierer aktivieren/deaktivieren.", @@ -26,6 +28,9 @@ "format.insertSpaceAfterKeywordsInControlFlowStatements": "Definiert die Verarbeitung von Leerzeichen nach Schlüsselwörtern in einer Flusssteuerungsanweisung.", "format.insertSpaceAfterFunctionKeywordForAnonymousFunctions": "Definiert die Verarbeitung von Leerzeichen nach einem Funktionsschlüsselwort für anonyme Funktionen.", "format.insertSpaceBeforeFunctionParenthesis": "Definiert die Verarbeitung von Leerzeichen vor Funktionsargumentklammern. Erfordert TypeScript >= 2.1.5.", + "format.insertSpaceAfterOpeningAndBeforeClosingNonemptyParenthesis": "Definiert die Verarbeitung von Leerzeichen nach öffnenden und vor schließenden nicht leeren runden Klammern.", + "format.insertSpaceAfterOpeningAndBeforeClosingNonemptyBrackets": "Definiert die Verarbeitung von Leerzeichen nach öffnenden und vor schließenden nicht leeren eckigen Klammern.", + "format.insertSpaceAfterOpeningAndBeforeClosingNonemptyBraces": "Definiert die Verarbeitung von Leerzeichen nach öffnenden und vor schließenden nicht leeren geschweiften Klammern. Erfordert TypeScript 2.3.0 oder höher.", "format.insertSpaceAfterOpeningAndBeforeClosingTemplateStringBraces": "Definiert die Verarbeitung von Leerzeichen nach öffnenden und vor schließenden geschweiften Klammern für Vorlagenzeichenfolgen. Erfordert TypeScript >= 2.0.6.", "format.insertSpaceAfterOpeningAndBeforeClosingJsxExpressionBraces": "Definiert die Verarbeitung von Leerzeichen nach öffnenden und vor schließenden geschweiften Klammern für JSX-Ausdrücke. Erfordert TypeScript >= 2.0.6.", "format.insertSpaceAfterTypeAssertion": "Definiert die Verarbeitung von Leerzeichen nach Typassertionen in TypeScript. Erfordert TypeScript >= 2.4.", @@ -54,5 +59,7 @@ "javascript.implicitProjectConfig.experimentalDecorators": "Aktiviert oder deaktiviert \"experimentalDecorators\" für JavaScript-Dateien, die nicht Teil eines Projekts sind. Vorhandene jsconfig.json- oder tsconfig.json-Dateien setzen diese Einstellung außer Kraft. Erfordert TypeScript 2.3.1 oder höher.", "typescript.autoImportSuggestions.enabled": "Aktiviert oder deaktiviert Vorschläge für den automatischen Import. Erfordert TypeScript 2.6.1 oder höher.", "typescript.experimental.syntaxFolding": "Aktiviert bzw. deaktiviert die syntaxabhängigen Faltungsmarkierungen.", - "taskDefinition.tsconfig.description": "Die \"tsconfig\"-Datei, die den TS-Build definiert." + "taskDefinition.tsconfig.description": "Die \"tsconfig\"-Datei, die den TS-Build definiert.", + "javascript.suggestionActions.enabled": "Aktiviert/deaktiviert Vorschlagsdiagnosen für JavaScript-Dateien im Editor. Erfordert TypeScript 2.8 oder höher.", + "typescript.suggestionActions.enabled": "Aktiviert/deaktiviert Vorschlagsdiagnosen für TypeScript-Dateien im Editor. Erfordert TypeScript 2.8 oder höher." } \ No newline at end of file diff --git a/i18n/deu/src/vs/base/node/processes.i18n.json b/i18n/deu/src/vs/base/node/processes.i18n.json index 35229bd6699..04fbcbe033d 100644 --- a/i18n/deu/src/vs/base/node/processes.i18n.json +++ b/i18n/deu/src/vs/base/node/processes.i18n.json @@ -5,5 +5,6 @@ "Licensed under the MIT License. See License.txt in the project root for license information.", "--------------------------------------------------------------------------------------------", "Do not edit this file. It is machine generated." - ] + ], + "TaskRunner.UNC": "Ein Shell-Befehl kann nicht auf einem UNC-Laufwerk ausgeführt werden." } \ No newline at end of file diff --git a/i18n/deu/src/vs/base/node/zip.i18n.json b/i18n/deu/src/vs/base/node/zip.i18n.json index 35d78b937d4..58f771626ba 100644 --- a/i18n/deu/src/vs/base/node/zip.i18n.json +++ b/i18n/deu/src/vs/base/node/zip.i18n.json @@ -6,5 +6,6 @@ "--------------------------------------------------------------------------------------------", "Do not edit this file. It is machine generated." ], + "incompleteExtract": "Unvollständig. {0} von {1} Einträgen wurden extrahiert", "notFound": "{0} wurde im ZIP nicht gefunden." } \ No newline at end of file diff --git a/i18n/deu/src/vs/code/electron-browser/issue/issueReporterMain.i18n.json b/i18n/deu/src/vs/code/electron-browser/issue/issueReporterMain.i18n.json index 3d0b8a3e84d..ee5978abf0a 100644 --- a/i18n/deu/src/vs/code/electron-browser/issue/issueReporterMain.i18n.json +++ b/i18n/deu/src/vs/code/electron-browser/issue/issueReporterMain.i18n.json @@ -8,9 +8,11 @@ ], "previewOnGitHub": "Vorschau in GitHub", "loadingData": "Daten werden geladen …", + "rateLimited": "GitHub-Abfragebeschränkung überschritten. Bitte warten.", "similarIssues": "Ähnliche Probleme", "open": "Öffnen", "closed": "Geschlossen", + "noSimilarIssues": "Keine ähnlichen Probleme gefunden", "settingsSearchIssue": "Fehler in Einstellungssuche ", "bugReporter": "Fehlerbericht", "featureRequest": "Featureanforderung", diff --git a/i18n/deu/src/vs/code/electron-browser/issue/issueReporterPage.i18n.json b/i18n/deu/src/vs/code/electron-browser/issue/issueReporterPage.i18n.json index 5318cd985e4..50c036699db 100644 --- a/i18n/deu/src/vs/code/electron-browser/issue/issueReporterPage.i18n.json +++ b/i18n/deu/src/vs/code/electron-browser/issue/issueReporterPage.i18n.json @@ -8,7 +8,10 @@ ], "completeInEnglish": "Füllen Sie das Formular auf Englisch aus.", "issueTypeLabel": "Dies ist", + "issueSourceLabel": "Datei auf", "vscode": "Visual Studio Code", + "extension": "Eine Erweiterung", + "disableExtensionsLabelText": "Versuchen Sie, das Problem nach {0} zu reproduzieren. Wenn das Problem nur bei aktiven Erweiterungen reproduziert werden kann, besteht wahrscheinlich ein Problem bei einer Erweiterung.", "disableExtensions": "Alle Erweiterungen werden deaktiviert, und das Fenster wird neu geladen", "chooseExtension": "Erweiterung", "issueTitleLabel": "Titel", diff --git a/i18n/deu/src/vs/code/electron-browser/processExplorer/processExplorerMain.i18n.json b/i18n/deu/src/vs/code/electron-browser/processExplorer/processExplorerMain.i18n.json index aa725d508b2..a692133c830 100644 --- a/i18n/deu/src/vs/code/electron-browser/processExplorer/processExplorerMain.i18n.json +++ b/i18n/deu/src/vs/code/electron-browser/processExplorer/processExplorerMain.i18n.json @@ -6,5 +6,10 @@ "--------------------------------------------------------------------------------------------", "Do not edit this file. It is machine generated." ], - "name": "Name" + "cpu": "CPU (%)", + "memory": "Arbeitsspeicher (MB)", + "pid": "PID", + "name": "Name", + "killProcess": "Prozess beenden", + "forceKillProcess": "Beenden des Prozesses erzwingen" } \ No newline at end of file diff --git a/i18n/deu/src/vs/code/electron-main/menus.i18n.json b/i18n/deu/src/vs/code/electron-main/menus.i18n.json index cc2c26f1108..36a62487016 100644 --- a/i18n/deu/src/vs/code/electron-main/menus.i18n.json +++ b/i18n/deu/src/vs/code/electron-main/menus.i18n.json @@ -146,6 +146,7 @@ "miConditionalBreakpoint": "&&Bedingter Haltepunkt...", "miColumnBreakpoint": "S&&paltenhaltepunkt", "miFunctionBreakpoint": "&&Funktionshaltepunkt...", + "miLogPoint": "&&Protokollpunkt …", "miNewBreakpoint": "&&Neuer Haltepunkt", "miEnableAllBreakpoints": "Alle Haltepunkte aktivieren", "miDisableAllBreakpoints": "A&&lle Haltepunkte deaktivieren", @@ -161,6 +162,7 @@ "mMergeAllWindows": "Alle Fenster zusammenführen", "miToggleDevTools": "&&Entwicklertools umschalten", "miAccessibilityOptions": "&&Optionen für erleichterte Bedienung", + "miOpenProcessExplorerer": "&&Prozess-Explorer öffnen", "miReportIssue": "&&Problem melden", "miWelcome": "&&Willkommen", "miInteractivePlayground": "&&Interactive Spielwiese", diff --git a/i18n/deu/src/vs/editor/browser/widget/diffReview.i18n.json b/i18n/deu/src/vs/editor/browser/widget/diffReview.i18n.json index 78765c76363..c4864c872da 100644 --- a/i18n/deu/src/vs/editor/browser/widget/diffReview.i18n.json +++ b/i18n/deu/src/vs/editor/browser/widget/diffReview.i18n.json @@ -7,6 +7,10 @@ "Do not edit this file. It is machine generated." ], "label.close": "Schließen", + "no_lines": "keine Zeilen", + "one_line": "1 Zeile", + "more_lines": "{0} Zeilen", + "header": "Unterschied von {0} zu {1}: Original: {2}, {3}, geändert: {4}, {5}", "blankLine": "leer", "equalLine": "Original {0}, geändert {1}: {2}", "insertLine": "+ geändert {0}: {1}", diff --git a/i18n/deu/src/vs/editor/common/commonCodeEditor.i18n.json b/i18n/deu/src/vs/editor/common/commonCodeEditor.i18n.json index 35229bd6699..ebc919fd7a6 100644 --- a/i18n/deu/src/vs/editor/common/commonCodeEditor.i18n.json +++ b/i18n/deu/src/vs/editor/common/commonCodeEditor.i18n.json @@ -5,5 +5,6 @@ "Licensed under the MIT License. See License.txt in the project root for license information.", "--------------------------------------------------------------------------------------------", "Do not edit this file. It is machine generated." - ] + ], + "cursors.maximum": "Die Anzahl der Cursors wurde auf {0} beschränkt." } \ No newline at end of file diff --git a/i18n/deu/src/vs/editor/common/config/commonEditorConfig.i18n.json b/i18n/deu/src/vs/editor/common/config/commonEditorConfig.i18n.json index 37cc27767cd..f772df3ec92 100644 --- a/i18n/deu/src/vs/editor/common/config/commonEditorConfig.i18n.json +++ b/i18n/deu/src/vs/editor/common/config/commonEditorConfig.i18n.json @@ -16,6 +16,7 @@ "lineNumbers.on": "Zeilennummern werden als absolute Zahl dargestellt.", "lineNumbers.relative": "Zeilennummern werden als Abstand in Zeilen an Cursorposition dargestellt.", "lineNumbers.interval": "Zeilennummern werden alle 10 Zeilen dargestellt.", + "lineNumbers": "Steuert die Anzeige von Zeilennummern.", "rulers": "Vertikale Linien nach einer bestimmten Anzahl von Monospace Zeichen zeichnen. Verwenden Sie mehrere Werte für mehrere Linien. Keine Linie wird gezeichnet, wenn das Array leer ist.", "wordSeparators": "Zeichen, die als Worttrennzeichen verwendet werden, wenn wortbezogene Navigationen oder Vorgänge ausgeführt werden.", "tabSize": "Die Anzahl der Leerzeichen, denen ein Tabstopp entspricht. Diese Einstellung wird basierend auf dem Inhalt der Datei überschrieben, wenn \"editor.detectIndentation\" aktiviert ist.", @@ -27,6 +28,7 @@ "scrollBeyondLastLine": "Legt fest, ob der Editor Bildläufe über die letzte Zeile hinaus ausführt.", "smoothScrolling": "Legt fest, ob der Editor Bildläufe animiert ausführt.", "minimap.enabled": "Steuert, ob die Minikarte angezeigt wird", + "minimap.side": "Steuert die Seite, wo die Minikarte gerendert wird.", "minimap.showSlider": "Steuert, ob der Minimap-Schieberegler automatisch ausgeblendet wird.", "minimap.renderCharacters": "Die tatsächlichen Zeichen in einer Zeile rendern (im Gegensatz zu Farbblöcken)", "minimap.maxColumn": "Breite der Minikarte beschränken, um höchstens eine bestimmte Anzahl von Spalten zu rendern", @@ -75,6 +77,7 @@ "occurrencesHighlight": "Steuert, ob der Editor das Vorkommen semantischer Symbole markieren soll.", "overviewRulerLanes": "Steuert die Anzahl von Dekorationen, die an derselben Position im Übersichtslineal angezeigt werden.", "overviewRulerBorder": "Steuert, ob um das Übersichtslineal ein Rahmen gezeichnet werden soll.", + "cursorBlinking": "Steuert den Cursoranimationsstil.", "mouseWheelZoom": "Schriftart des Editors vergrößern, wenn das Mausrad verwendet und die STRG-TASTE gedrückt wird", "cursorStyle": "Steuert den Cursorstil. Gültige Werte sind \"block\", \"block-outline\", \"line\", \"line-thin\", \"underline\" und \"underline-thin\".", "cursorWidth": "Steuert die Breite des Cursors, falls editor.cursorStyle auf \"line\" gestellt ist.", @@ -84,9 +87,11 @@ "renderControlCharacters": "Steuert, ob der Editor Steuerzeichen rendern soll.", "renderIndentGuides": "Steuert, ob der Editor Einzugsführungslinien rendern soll.", "renderLineHighlight": "Steuert, wie der Editor die aktuelle Zeilenhervorhebung rendern soll. Mögliche Werte sind \"none\", \"gutter\", \"line\" und \"all\".", + "codeLens": "Steuert, ob der Editor CodeLens anzeigt.", "folding": "Steuert, ob für den Editor Codefaltung aktiviert ist.", "foldingStrategyAuto": "Falls vorhanden, eine sprachspezifische Strategie für das Codefaltung verwenden, ansonsten wird die einrückungsbasierte Strategie genutzt.", "foldingStrategyIndentation": "Immer die einrückungsbasierte Strategie zur Codefaltung nutzen", + "foldingStrategy": "Steuert die Art und Weise, wie Faltungsbereiche berechnet werden. \"auto\" verwendet eine sprachspezifische Strategie für die Codefaltung, sofern verfügbar. \"indentation\" erzwingt eine einrückungsbasierte Strategie zur Codefaltung.", "showFoldingControls": "Steuert, ob die Falt-Steuerelemente an der Leiste automatisch ausgeblendet werden.", "matchBrackets": "Übereinstimmende Klammern hervorheben, wenn eine davon ausgewählt wird.", "glyphMargin": "Steuert, ob der Editor den vertikalen Glyphenrand rendert. Der Glyphenrand wird hauptsächlich zum Debuggen verwendet.", @@ -101,9 +106,12 @@ "links": "Steuert, ob der Editor Links erkennen und anklickbar machen soll", "colorDecorators": "Steuert, ob der Editor die Inline-Farbdecorators und die Farbauswahl rendern soll.", "codeActions": "Ermöglicht die Code-Aktion \"lightbulb\"", + "codeActionsOnSave.organizeImports": "Ein Organisieren der Importe beim Speichern ausführen?", + "codeActionsOnSave": "Arten von Codeaktionen, die beim Speichern ausgeführt werden sollen.", + "codeActionsOnSaveTimeout": "Timeout für Codeaktionen, die beim Speichern ausgeführt werden.", "selectionClipboard": "Steuert, ob die primäre Linux-Zwischenablage unterstützt werden soll.", "sideBySide": "Steuert, ob der Diff-Editor das Diff nebeneinander oder inline anzeigt.", "ignoreTrimWhitespace": "Steuert, ob der Diff-Editor Änderungen in führenden oder nachgestellten Leerzeichen als Diffs anzeigt.", - "largeFileLineCount": "Steuert den Schwellenwert für Dateigröße in Bezug auf die Zeilenanzahl, ab dem spezielle Optimierungsregeln angewendet werden", + "largeFileOptimizations": "Spezielle Behandlung für große Dateien zum Deaktivieren bestimmter speicherintensiver Funktionen.", "renderIndicators": "Steuert, ob der Diff-Editor die Indikatoren \"+\" und \"-\" für hinzugefügte/entfernte Änderungen anzeigt." } \ No newline at end of file diff --git a/i18n/deu/src/vs/editor/common/view/editorColorRegistry.i18n.json b/i18n/deu/src/vs/editor/common/view/editorColorRegistry.i18n.json index ae336794beb..1a2890a4246 100644 --- a/i18n/deu/src/vs/editor/common/view/editorColorRegistry.i18n.json +++ b/i18n/deu/src/vs/editor/common/view/editorColorRegistry.i18n.json @@ -14,6 +14,7 @@ "editorCursorBackground": "Hintergrundfarbe vom Editor-Cursor. Erlaubt die Anpassung der Farbe von einem Zeichen, welches von einem Block-Cursor überdeckt wird.", "editorWhitespaces": "Farbe der Leerzeichen im Editor.", "editorIndentGuides": "Farbe der Führungslinien für Einzüge im Editor.", + "editorActiveIndentGuide": "Farbe der Führungslinien für Einzüge im aktiven Editor.", "editorLineNumbers": "Zeilennummernfarbe im Editor.", "editorActiveLineNumber": "Zeilennummernfarbe der aktiven Editorzeile.", "deprecatedEditorActiveLineNumber": "ID ist veraltet. Verwenden Sie stattdessen \"editorLineNumber.activeForeground\".", diff --git a/i18n/deu/src/vs/editor/contrib/codeAction/codeActionCommands.i18n.json b/i18n/deu/src/vs/editor/contrib/codeAction/codeActionCommands.i18n.json index 707ff28811b..d3a255e1128 100644 --- a/i18n/deu/src/vs/editor/contrib/codeAction/codeActionCommands.i18n.json +++ b/i18n/deu/src/vs/editor/contrib/codeAction/codeActionCommands.i18n.json @@ -8,10 +8,12 @@ ], "quickFixWithKb": "Korrekturen anzeigen ({0})", "quickFix": "Korrekturen anzeigen", + "quickfix.trigger.label": "Schnelle Problembehebung …", "editor.action.quickFix.noneMessage": "Keine Code-Aktionen verfügbar", "refactor.label": "Umgestalten...", "editor.action.refactor.noneMessage": "Keine Refactorings verfügbar", "source.label": "Quellaktion…", "editor.action.source.noneMessage": "Keine Quellaktionen verfügbar", - "organizeImports.label": "Importe organisieren" + "organizeImports.label": "Importe organisieren", + "editor.action.organize.noneMessage": "Keine Aktion zum Organisieren von Importen verfügbar" } \ No newline at end of file diff --git a/i18n/deu/src/vs/editor/contrib/find/findController.i18n.json b/i18n/deu/src/vs/editor/contrib/find/findController.i18n.json index c5b31311379..a7f9cc22ac0 100644 --- a/i18n/deu/src/vs/editor/contrib/find/findController.i18n.json +++ b/i18n/deu/src/vs/editor/contrib/find/findController.i18n.json @@ -7,6 +7,7 @@ "Do not edit this file. It is machine generated." ], "startFindAction": "Suchen", + "startFindWithSelectionAction": "Mit Auswahl suchen", "findNextMatchAction": "Nächstes Element suchen", "findPreviousMatchAction": "Vorheriges Element suchen", "nextSelectionMatchFindAction": "Nächste Auswahl suchen", diff --git a/i18n/deu/src/vs/editor/contrib/message/messageController.i18n.json b/i18n/deu/src/vs/editor/contrib/message/messageController.i18n.json index 35229bd6699..bd19b6b417d 100644 --- a/i18n/deu/src/vs/editor/contrib/message/messageController.i18n.json +++ b/i18n/deu/src/vs/editor/contrib/message/messageController.i18n.json @@ -5,5 +5,6 @@ "Licensed under the MIT License. See License.txt in the project root for license information.", "--------------------------------------------------------------------------------------------", "Do not edit this file. It is machine generated." - ] + ], + "editor.readonly": "Ein Bearbeiten ist im schreibgeschützten Editor nicht möglich" } \ No newline at end of file diff --git a/i18n/deu/src/vs/editor/contrib/referenceSearch/referencesWidget.i18n.json b/i18n/deu/src/vs/editor/contrib/referenceSearch/referencesWidget.i18n.json index 18b4354e5bd..423b26f70a7 100644 --- a/i18n/deu/src/vs/editor/contrib/referenceSearch/referencesWidget.i18n.json +++ b/i18n/deu/src/vs/editor/contrib/referenceSearch/referencesWidget.i18n.json @@ -25,5 +25,6 @@ "peekViewEditorBackground": "Hintergrundfarbe des Peek-Editors.", "peekViewEditorGutterBackground": "Hintergrundfarbe der Leiste im Peek-Editor.", "peekViewResultsMatchHighlight": "Farbe für Übereinstimmungsmarkierungen in der Ergebnisliste der Peek-Ansicht.", - "peekViewEditorMatchHighlight": "Farbe für Übereinstimmungsmarkierungen im Peek-Editor." + "peekViewEditorMatchHighlight": "Farbe für Übereinstimmungsmarkierungen im Peek-Editor.", + "peekViewEditorMatchHighlightBorder": "Rahmen für Übereinstimmungsmarkierungen im Peek-Editor." } \ No newline at end of file diff --git a/i18n/deu/src/vs/platform/environment/node/argv.i18n.json b/i18n/deu/src/vs/platform/environment/node/argv.i18n.json index 34795e135e8..f6bdb031026 100644 --- a/i18n/deu/src/vs/platform/environment/node/argv.i18n.json +++ b/i18n/deu/src/vs/platform/environment/node/argv.i18n.json @@ -22,12 +22,15 @@ "showVersions": "Zeigt Versionen der installierten Erweiterungen an, wenn \"--list-extension\" verwendet wird.", "installExtension": "Installiert eine Extension.", "uninstallExtension": "Deinstalliert eine Extension.", + "experimentalApis": "Aktiviert vorgeschlagene API-Features für eine Erweiterung.", "verbose": "Ausführliche Ausgabe (impliziert \"-wait\").", "log": "Log-Level zu verwenden. Standardwert ist \"Info\". Zulässige Werte sind \"kritisch\", \"Fehler\", \"warnen\", \"Info\", \"debug\", \"verfolgen\", \"aus\".", "status": "Prozessnutzungs- und Diagnose-Informationen ausgeben.", "performance": "Startet mit aktiviertem Befehl \"Developer: Startup Performance\".", "prof-startup": "CPU-Profiler beim Start ausführen", "disableExtensions": "Deaktiviert alle installierten Extensions.", + "inspect-extensions": "Erlaubt Debuggen und Profilerstellung für Erweiterungen. Überprüfen Sie die Entwicklertools für die Verbindungs-URI.", + "inspect-brk-extensions": "Erlaubt Debuggen und Profilerstellung für Erweiterungen, wobei der Erweiterungs-Host nach dem Start angehalten wird. Überprüfen Sie die Entwicklertools für die Verbindungs-URI.", "disableGPU": "Deaktiviert die GPU-Hardwarebeschleunigung.", "uploadLogs": "Lädt die Logs der aktuellen Sitzung an einem sicheren Endpunkt hoch.", "maxMemory": "Maximale Speichergröße für ein Fenster (in Mbyte).", diff --git a/i18n/deu/src/vs/platform/extensionManagement/node/extensionManagementService.i18n.json b/i18n/deu/src/vs/platform/extensionManagement/node/extensionManagementService.i18n.json index fe6e6c0c316..f708991d81c 100644 --- a/i18n/deu/src/vs/platform/extensionManagement/node/extensionManagementService.i18n.json +++ b/i18n/deu/src/vs/platform/extensionManagement/node/extensionManagementService.i18n.json @@ -7,6 +7,7 @@ "Do not edit this file. It is machine generated." ], "invalidManifest": "Die Erweiterung ist ungültig: \"package.json\" ist keine JSON-Datei.", + "incompatible": "Die Erweiterung \"{0}\" kann nicht installiert werden, die sie nicht mit dem Code \"{1}\" kompatibel ist.", "restartCode": "Bitte starten Sie Code vor der Neuinstallation von {0} neu.", "installingOutdatedExtension": "Eine neuere Version dieser Erweiterung ist bereits installiert. Möchten Sie diese mit der älteren Version überschreiben?", "override": "Überschreiben", @@ -20,6 +21,7 @@ "notFoundCompatibleDependency": "Kann nicht installiert werden, da die abhängige Erweiterung '{0}', die mit der aktuellen VS Code Version '{1}' kompatibel ist, nicht gefunden werden kann. ", "quitCode": "Fehler bei der Installation der Erweiterung. Beenden und starten Sie VS Code vor der erneuten Installation neu.", "exitCode": "Fehler bei der Installation der Erweiterung. Beenden und starten Sie VS Code vor der erneuten Installation neu.", + "renameError": "Unbekannter Fehler beim Umbenennen von {0} in {1}", "uninstallDependeciesConfirmation": "Möchten Sie nur \"{0}\" oder auch die zugehörigen Abhängigkeiten deinstallieren?", "uninstallOnly": "Nur Erweiterung", "uninstallAll": "Alle deinstallieren", diff --git a/i18n/deu/src/vs/platform/theme/common/colorRegistry.i18n.json b/i18n/deu/src/vs/platform/theme/common/colorRegistry.i18n.json index f5a116e6036..7f1307cdec5 100644 --- a/i18n/deu/src/vs/platform/theme/common/colorRegistry.i18n.json +++ b/i18n/deu/src/vs/platform/theme/common/colorRegistry.i18n.json @@ -29,6 +29,7 @@ "inputPlaceholderForeground": "Input box - Vordergrundfarbe für Platzhalter-Text.", "inputValidationInfoBackground": "Hintergrundfarbe bei der Eingabevalidierung für den Schweregrad der Information.", "inputValidationInfoBorder": "Rahmenfarbe bei der Eingabevalidierung für den Schweregrad der Information.", + "inputValidationWarningBackground": "Hintergrundfarbe bei der Eingabevalidierung für den Schweregrad der Warnung.", "inputValidationWarningBorder": "Rahmenfarbe bei der Eingabevalidierung für den Schweregrad der Warnung.", "inputValidationErrorBackground": "Hintergrundfarbe bei der Eingabevalidierung für den Schweregrad des Fehlers.", "inputValidationErrorBorder": "Rahmenfarbe bei der Eingabevalidierung für den Schweregrad des Fehlers.", @@ -70,8 +71,10 @@ "editorSelectionHighlightBorder": "Randfarbe für Bereiche, deren Inhalt der Auswahl entspricht.", "editorFindMatch": "Farbe des aktuellen Suchergebnisses.", "findMatchHighlight": "Farbe der anderen Suchergebnisse. Die Farbe muss durchsichtig sein, um dahinterliegende Dekorationen nicht zu verbergen. ", + "findRangeHighlight": "Farbe des Bereichs zur Einschränkung der Suche. Die Farbe muss durchsichtig sein, um dahinterliegende Dekorationen nicht zu verbergen.", "editorFindMatchBorder": "Randfarbe des aktuellen Suchergebnisses.", "findMatchHighlightBorder": "Randfarbe der anderen Suchtreffer.", + "findRangeHighlightBorder": "Rahmenfarbe des Bereichs zur Einschränkung der Suche. Die Farbe muss durchsichtig sein, um dahinterliegende Dekorationen nicht zu verbergen.", "hoverHighlight": "Hervorhebung eines Worts, unter dem ein Mauszeiger angezeigt wird. Die Farbe muss durchsichtig sein, um dahinterliegende Dekorationen nicht zu verbergen. ", "hoverBackground": "Background color of the editor hover.", "hoverBorder": "Rahmenfarbe des Editor-Mauszeigers.", @@ -85,6 +88,7 @@ "mergeIncomingHeaderBackground": "Hintergrund für eingehende Kopfzeile in Inline-Mergingkonflikten. Die Farbe muss durchsichtig sein, um dahinterliegende Dekorationen nicht zu verbergen. ", "mergeIncomingContentBackground": "Hintergrund für eingehenden Inhalt in Inline-Mergingkonflikten. Die Farbe muss durchsichtig sein, um dahinterliegende Dekorationen nicht zu verbergen. ", "mergeCommonHeaderBackground": "Inhaltshintergrund des gemeinsamen übergeordneten Elements bei Inline-Mergingkonflikten. Die Farbe muss durchsichtig sein, um dahinterliegende Dekorationen nicht zu verbergen.", + "mergeCommonContentBackground": "Inhaltshintergrund des gemeinsamen übergeordneten Elements bei Inline-Mergingkonflikten. Die Farbe muss durchsichtig sein, um dahinterliegende Dekorationen nicht zu verbergen.", "mergeBorder": "Rahmenfarbe für Kopfzeilen und die Aufteilung in Inline-Mergingkonflikten.", "overviewRulerCurrentContentForeground": "Aktueller Übersichtslineal-Vordergrund für Inline-Mergingkonflikte.", "overviewRulerIncomingContentForeground": "Eingehender Übersichtslineal-Vordergrund für Inline-Mergingkonflikte. ", diff --git a/i18n/deu/src/vs/platform/url/electron-browser/inactiveExtensionUrlHandler.i18n.json b/i18n/deu/src/vs/platform/url/electron-browser/inactiveExtensionUrlHandler.i18n.json index 35229bd6699..3077316f159 100644 --- a/i18n/deu/src/vs/platform/url/electron-browser/inactiveExtensionUrlHandler.i18n.json +++ b/i18n/deu/src/vs/platform/url/electron-browser/inactiveExtensionUrlHandler.i18n.json @@ -5,5 +5,6 @@ "Licensed under the MIT License. See License.txt in the project root for license information.", "--------------------------------------------------------------------------------------------", "Do not edit this file. It is machine generated." - ] + ], + "confirmUrl": "Soll die Erweiterung {0} die folgende URL öffnen?" } \ No newline at end of file diff --git a/i18n/deu/src/vs/workbench/api/browser/viewsContainersExtensionPoint.i18n.json b/i18n/deu/src/vs/workbench/api/browser/viewsContainersExtensionPoint.i18n.json index 729878b1595..d4fffac7aa8 100644 --- a/i18n/deu/src/vs/workbench/api/browser/viewsContainersExtensionPoint.i18n.json +++ b/i18n/deu/src/vs/workbench/api/browser/viewsContainersExtensionPoint.i18n.json @@ -6,6 +6,15 @@ "--------------------------------------------------------------------------------------------", "Do not edit this file. It is machine generated." ], + "vscode.extension.contributes.views.containers.id": "Eindeutige ID, die zum Bestimmen des Containers verwendet wird, in dem Ansichten mithilfe des Beitragspunkts \"views\" beigetragen werden können.", + "vscode.extension.contributes.views.containers.title": "Visuell lesbare Zeichenfolge zum Rendern des Containers", + "vscode.extension.contributes.views.containers.icon": "Pfad zum Containersymbol. Symbole sind 24x24 groß und zentriert in einem Rechteck (50x40), und ihre Füllfarbe ist \"rgb(215, 218, 224)\" oder \"#d7dae0\". SVG-Symbole werden empfohlen, es wird allerdings jeder Bilddateityp akzeptiert.", + "vscode.extension.contributes.viewsContainers": "Trägt Ansichtencontainer zum Editor bei", + "views.container.activitybar": "Trägt Ansichtencontainer zur Aktivitätsleiste bei", + "test": "Test", + "proposed": "Der Beitrag \"viewsContainers\" ist nur verfügbar, wenn er außerhalb der Entwicklung ausgeführt wird oder mithilfe des folgenden Befehlszeilenschalters: --enable-proposed-api {0}", + "requirearray": "Ansichtencontainer müssen ein Array sein", + "requireidstring": "Die Eigenschaft \"{0}\" ist erforderlich. Sie muss vom Typ \"string\" sein. Nur alphanumerische Buchstaben, \"_\", \"-\" sind zulässig.", "requirestring": "Die Eigenschaft \"{0}\" ist erforderlich. Sie muss vom Typ \"string\" sein.", "showViewlet": "{0} anzeigen", "view": "Anzeigen" diff --git a/i18n/deu/src/vs/workbench/api/browser/viewsExtensionPoint.i18n.json b/i18n/deu/src/vs/workbench/api/browser/viewsExtensionPoint.i18n.json index 501b08d9c6f..03df43c789f 100644 --- a/i18n/deu/src/vs/workbench/api/browser/viewsExtensionPoint.i18n.json +++ b/i18n/deu/src/vs/workbench/api/browser/viewsExtensionPoint.i18n.json @@ -13,6 +13,12 @@ "vscode.extension.contributes.view.name": "Der visuell lesbare Name der Ansicht. Wird angezeigt", "vscode.extension.contributes.view.when": "Bedingung, die zum Anzeigen dieser Ansicht erfüllt sein muss", "vscode.extension.contributes.views": "Trägt Ansichten zum Editor bei.", + "views.explorer": "Trägt Ansichten zum Explorer-Container in der Aktivitätsleiste bei", + "views.debug": "Trägt Ansichten zum Debugging-Container in der Aktivitätsleiste bei", + "views.scm": "Trägt Ansichten zum SCM-Container in der Aktivitätsleiste bei", + "views.test": "Trägt Ansichten zum Testcontainer in der Aktivitätsleiste bei", + "views.contributed": "Trägt Ansichten zum Container mit beigetragenen Ansichten bei", + "ViewContainerDoesnotExist": "Der Ansichtencontainer \"{0}\" ist nicht vorhanden, und alle für ihn registrierten Ansichten werden zu \"Explorer\" hinzugefügt.", "duplicateView1": "Mehrere Ansichten können nicht mit derselben ID \"{0}\" am Speicherort \"{1}\" registriert werden.", "duplicateView2": "Eine Ansicht mit der ID \"{0}\" ist am Speicherort \"{1}\" bereits registriert." } \ No newline at end of file diff --git a/i18n/deu/src/vs/workbench/api/electron-browser/mainThreadSaveParticipant.i18n.json b/i18n/deu/src/vs/workbench/api/electron-browser/mainThreadSaveParticipant.i18n.json index 1f1499c09e6..75b29940522 100644 --- a/i18n/deu/src/vs/workbench/api/electron-browser/mainThreadSaveParticipant.i18n.json +++ b/i18n/deu/src/vs/workbench/api/electron-browser/mainThreadSaveParticipant.i18n.json @@ -7,6 +7,7 @@ "Do not edit this file. It is machine generated." ], "timeout.formatOnSave": "Formatieren beim Speichern nach {0} ms abgebrochen", + "codeActionsOnSave.didTimeout": "codeActionsOnSave nach {0} ms abgebrochen", "timeout.onWillSave": "Bei onWillSaveTextDocument-Ereignis nach 1750 ms abgebrochen", "saveParticipants": "Speichern von Teilnehmern wird ausgeführt …" } \ No newline at end of file diff --git a/i18n/deu/src/vs/workbench/api/electron-browser/mainThreadWebview.i18n.json b/i18n/deu/src/vs/workbench/api/electron-browser/mainThreadWebview.i18n.json index 35229bd6699..522ad6a6e3b 100644 --- a/i18n/deu/src/vs/workbench/api/electron-browser/mainThreadWebview.i18n.json +++ b/i18n/deu/src/vs/workbench/api/electron-browser/mainThreadWebview.i18n.json @@ -5,5 +5,6 @@ "Licensed under the MIT License. See License.txt in the project root for license information.", "--------------------------------------------------------------------------------------------", "Do not edit this file. It is machine generated." - ] + ], + "errorMessage": "Ein Fehler ist aufgetreten beim Wiederherstellen der Ansicht: {0}" } \ No newline at end of file diff --git a/i18n/deu/src/vs/workbench/browser/parts/editor/editorStatus.i18n.json b/i18n/deu/src/vs/workbench/browser/parts/editor/editorStatus.i18n.json index 8355c93e305..66f3a1eebbd 100644 --- a/i18n/deu/src/vs/workbench/browser/parts/editor/editorStatus.i18n.json +++ b/i18n/deu/src/vs/workbench/browser/parts/editor/editorStatus.i18n.json @@ -17,6 +17,7 @@ "screenReaderDetectedExtra": "Wenn Sie keine Sprachausgabe verwenden, ändern Sie die Einstellung \"editor.accessibilitySupport\" in \"Aus\".", "disableTabMode": "Barrierefreiheitsmodus deaktivieren", "gotoLine": "Gehe zu Zeile", + "selectIndentation": "Einzug auswählen", "selectEncoding": "Codierung auswählen", "selectEOL": "Zeilenendesequenz auswählen", "selectLanguageMode": "Sprachmodus auswählen", diff --git a/i18n/deu/src/vs/workbench/browser/parts/editor/resourceViewer.i18n.json b/i18n/deu/src/vs/workbench/browser/parts/editor/resourceViewer.i18n.json index 72f24a7c13e..85e1ded2f40 100644 --- a/i18n/deu/src/vs/workbench/browser/parts/editor/resourceViewer.i18n.json +++ b/i18n/deu/src/vs/workbench/browser/parts/editor/resourceViewer.i18n.json @@ -11,7 +11,11 @@ "sizeMB": "{0} MB", "sizeGB": "{0} GB", "sizeTB": "{0} TB", + "largeImageError": "Das Bild wird im Editor nicht angezeigt, weil es zu groß ist ({0}).", "resourceOpenExternalButton": "Bild mit externem Programm öffnen?", + "nativeFileTooLargeError": "Die Datei wird im Editor nicht angezeigt, weil sie zu groß ist ({0}).", + "nativeBinaryError": "Die Datei wird im Editor nicht angezeigt, weil sie entweder binär ist oder eine nicht unterstützte Textcodierung verwendet.", + "openAsText": "Dennoch öffnen?", "zoom.action.fit.label": "Ganzes Bild", "imgMeta": "{0}x{1} {2}" } \ No newline at end of file diff --git a/i18n/deu/src/vs/workbench/browser/parts/quickinput/quickInput.i18n.json b/i18n/deu/src/vs/workbench/browser/parts/quickinput/quickInput.i18n.json index 5144aeab151..c40d49b3c7b 100644 --- a/i18n/deu/src/vs/workbench/browser/parts/quickinput/quickInput.i18n.json +++ b/i18n/deu/src/vs/workbench/browser/parts/quickinput/quickInput.i18n.json @@ -8,5 +8,6 @@ ], "inputModeEntryDescription": "{0} (Drücken Sie die EINGABETASTE zur Bestätigung oder ESC, um den Vorgang abzubrechen.)", "inputModeEntry": "Drücken Sie die EINGABETASTE, um Ihre Eingabe zu bestätigen, oder ESC, um den Vorgang abzubrechen.", + "quickInput.countSelected": "{0} ausgewählt", "ok": "OK" } \ No newline at end of file diff --git a/i18n/deu/src/vs/workbench/browser/parts/quickinput/quickInputBox.i18n.json b/i18n/deu/src/vs/workbench/browser/parts/quickinput/quickInputBox.i18n.json index 35229bd6699..7eb6fe22c93 100644 --- a/i18n/deu/src/vs/workbench/browser/parts/quickinput/quickInputBox.i18n.json +++ b/i18n/deu/src/vs/workbench/browser/parts/quickinput/quickInputBox.i18n.json @@ -5,5 +5,6 @@ "Licensed under the MIT License. See License.txt in the project root for license information.", "--------------------------------------------------------------------------------------------", "Do not edit this file. It is machine generated." - ] + ], + "quickInputBox.ariaLabel": "Nehmen Sie eine Eingabe vor, um die Ergebnisse einzugrenzen." } \ No newline at end of file diff --git a/i18n/deu/src/vs/workbench/electron-browser/actions.i18n.json b/i18n/deu/src/vs/workbench/electron-browser/actions.i18n.json index 443028d2ccb..1609e7c9271 100644 --- a/i18n/deu/src/vs/workbench/electron-browser/actions.i18n.json +++ b/i18n/deu/src/vs/workbench/electron-browser/actions.i18n.json @@ -32,6 +32,7 @@ "openRecent": "Zuletzt benutzt...", "quickOpenRecent": "Zuletzt benutzte schnell öffnen...", "reportIssueInEnglish": "Problem melden", + "openProcessExplorer": "Prozess-Explorer öffnen", "reportPerformanceIssue": "Leistungsproblem melden", "keybindingsReference": "Referenz für Tastenkombinationen", "openDocumentationUrl": "Dokumentation", diff --git a/i18n/deu/src/vs/workbench/electron-browser/main.contribution.i18n.json b/i18n/deu/src/vs/workbench/electron-browser/main.contribution.i18n.json index 52379955308..fc92fd39225 100644 --- a/i18n/deu/src/vs/workbench/electron-browser/main.contribution.i18n.json +++ b/i18n/deu/src/vs/workbench/electron-browser/main.contribution.i18n.json @@ -80,6 +80,7 @@ "titleBarStyle": "Passt das Aussehen der Titelleiste des Fensters an. Zum Anwenden der Änderungen ist ein vollständiger Neustart erforderlich.", "window.nativeTabs": "Aktiviert MacOS Sierra-Fensterregisterkarten. Beachten Sie, dass zum Übernehmen von Änderungen ein vollständiger Neustart erforderlich ist und durch ggf. konfigurierte native Registerkarten ein benutzerdefinierter Titelleistenstil deaktiviert wird.", "window.smoothScrollingWorkaround": "Aktivieren Sie diese Problemumgehung, wenn der Bildlauf nach der Wiederherstellung eines minimierten VS Code-Fensters nicht mehr reibungslos funktioniert. Dies ist eine Problemumgehung für ein Problem (https://github.com/Microsoft/vscode/issues/13612), bei dem der Bildlauf auf Geräten mit präzisen Trackpads wie etwa den Surface-Geräten von Microsoft verzögert ist. Wenn Sie diese Problemumgehung aktivieren, flackert die Anzeige nach dem Wiederherstellen eines Fensters aus dem minimierten Zustand unter Umständen ein wenig, ansonsten treten jedoch keine Probleme auf.", + "window.clickThroughInactive": "Ist dies aktiviert, wird beim Klicken auf ein inaktives Fenster das Fenster aktiviert, und das Element unter der Maus wird ausgelöst, wenn es angeklickt werden kann. Wenn es deaktiviert ist, wird durch Klicken auf eine beliebige Stelle in einem inaktiven Fenster nur das Fenster aktiviert, und Sie müssen das Element zusätzlich anklicken.", "zenModeConfigurationTitle": "Zen-Modus", "zenMode.fullScreen": "Steuert, ob die Workbench durch das Aktivieren des Zen-Modus in den Vollbildmodus wechselt.", "zenMode.centerLayout": "Steuert, ob das Layout durch Aktivieren des Zen-Modus ebenfalls zentriert wird.", diff --git a/i18n/deu/src/vs/workbench/parts/debug/browser/breakpointsView.i18n.json b/i18n/deu/src/vs/workbench/parts/debug/browser/breakpointsView.i18n.json index ddd2d3abd5a..b4980d90513 100644 --- a/i18n/deu/src/vs/workbench/parts/debug/browser/breakpointsView.i18n.json +++ b/i18n/deu/src/vs/workbench/parts/debug/browser/breakpointsView.i18n.json @@ -6,7 +6,10 @@ "--------------------------------------------------------------------------------------------", "Do not edit this file. It is machine generated." ], + "logPoint": "Protokollpunkt", "breakpoint": "Haltepunkt", + "editBreakpoint": "{0} bearbeiten …", + "removeBreakpoint": "{0} entfernen", "functionBreakpointsNotSupported": "Funktionshaltepunkte werden von diesem Debugtyp nicht unterstützt.", "functionBreakpointPlaceholder": "Funktion mit Haltepunkt", "functionBreakPointInputAriaLabel": "Geben Sie den Funktionshaltepunkt ein.", @@ -14,7 +17,7 @@ "breakpointUnverifieddHover": "Nicht überprüfter Haltepunkt", "functionBreakpointUnsupported": "Funktionshaltepunkte werden von diesem Debugtyp nicht unterstützt.", "breakpointDirtydHover": "Nicht überprüfter Haltepunkt. Die Datei wurde geändert. Bitte starten Sie die Debugsitzung neu.", - "logBreakpointUnsupported": "Protokollpunkte werden für diesen Debugtyp nicht unterstützt.", + "logBreakpointUnsupported": "Protokollpunkte werden für diesen Debugtyp nicht unterstützt", "conditionalBreakpointUnsupported": "Bedingte Haltepunkte werden für diesen Debugtyp nicht unterstützt.", "hitBreakpointUnsupported": "Bedingte Trefferhaltepunkte werden für diesen Debugtyp nicht unterstützt." } \ No newline at end of file diff --git a/i18n/deu/src/vs/workbench/parts/debug/browser/debugActions.i18n.json b/i18n/deu/src/vs/workbench/parts/debug/browser/debugActions.i18n.json index 659f9528874..8c99549ea96 100644 --- a/i18n/deu/src/vs/workbench/parts/debug/browser/debugActions.i18n.json +++ b/i18n/deu/src/vs/workbench/parts/debug/browser/debugActions.i18n.json @@ -21,6 +21,7 @@ "disconnectDebug": "Trennen", "continueDebug": "Weiter", "pauseDebug": "Anhalten", + "terminateThread": "Thread beenden", "restartFrame": "Frame neu starten", "removeBreakpoint": "Haltepunkt entfernen", "removeAllBreakpoints": "Alle Haltepunkte entfernen", diff --git a/i18n/deu/src/vs/workbench/parts/debug/electron-browser/breakpointWidget.i18n.json b/i18n/deu/src/vs/workbench/parts/debug/electron-browser/breakpointWidget.i18n.json index d82e734ead9..7cc2728b73c 100644 --- a/i18n/deu/src/vs/workbench/parts/debug/electron-browser/breakpointWidget.i18n.json +++ b/i18n/deu/src/vs/workbench/parts/debug/electron-browser/breakpointWidget.i18n.json @@ -6,6 +6,7 @@ "--------------------------------------------------------------------------------------------", "Do not edit this file. It is machine generated." ], + "breakpointWidgetLogMessagePlaceholder": "Zu protokollierende Nachricht, wenn der Haltepunkt erreicht wird. Ausdrücke innerhalb von {} werden interpoliert. Betätigen Sie die EINGABETASTE, um dies zu akzeptieren, oder ECS, um den Vorgang abzubrechen.", "breakpointWidgetHitCountPlaceholder": "Unterbrechen, wenn die Bedingung für die Trefferanzahl erfüllt ist. EINGABETASTE zum Akzeptieren, ESC-TASTE zum Abbrechen.", "breakpointWidgetExpressionPlaceholder": "Unterbrechen, wenn der Ausdruck als TRUE ausgewertet wird. EINGABETASTE zum Akzeptieren, ESC-TASTE zum Abbrechen.", "expression": "Ausdruck", diff --git a/i18n/deu/src/vs/workbench/parts/debug/electron-browser/debugConfigurationManager.i18n.json b/i18n/deu/src/vs/workbench/parts/debug/electron-browser/debugConfigurationManager.i18n.json index 0ab881816f8..429759ca475 100644 --- a/i18n/deu/src/vs/workbench/parts/debug/electron-browser/debugConfigurationManager.i18n.json +++ b/i18n/deu/src/vs/workbench/parts/debug/electron-browser/debugConfigurationManager.i18n.json @@ -35,6 +35,7 @@ "useUniqueNames": "Verwenden Sie eindeutige Konfigurationsnamen.", "app.launch.json.compound.folder": "Name des Ordners, in dem sich der Verbund befindet.", "app.launch.json.compounds.configurations": "Namen von Konfigurationen, die als Bestandteil dieses Verbunds gestartet werden.", + "debugNoType": "Der Debugger \"type\" darf nicht ausgelassen werden und muss den Typ \"string\" aufweisen.", "selectDebug": "Umgebung auswählen", "DebugConfig.failed": "Die Datei \"launch.json\" kann nicht im Ordner \".vscode\" erstellt werden ({0}).", "workspace": "Arbeitsbereich", diff --git a/i18n/deu/src/vs/workbench/parts/debug/electron-browser/debugEditorContribution.i18n.json b/i18n/deu/src/vs/workbench/parts/debug/electron-browser/debugEditorContribution.i18n.json index fa33a362fd9..d71dffbf816 100644 --- a/i18n/deu/src/vs/workbench/parts/debug/electron-browser/debugEditorContribution.i18n.json +++ b/i18n/deu/src/vs/workbench/parts/debug/electron-browser/debugEditorContribution.i18n.json @@ -6,7 +6,12 @@ "--------------------------------------------------------------------------------------------", "Do not edit this file. It is machine generated." ], + "logPoint": "Protokollpunkt", "breakpoint": "Haltepunkt", + "removeBreakpoint": "{0} entfernen", + "editBreakpoint": "{0} bearbeiten …", + "disableBreakpoint": "{0} deaktivieren", + "enableBreakpoint": "{0} aktivieren", "removeBreakpoints": "Haltepunkte entfernen", "removeBreakpointOnColumn": "Haltepunkt in Spalte {0} entfernen", "removeLineBreakpoint": "Zeilenhaltepunkt entfernen", @@ -21,6 +26,11 @@ "addBreakpoint": "Haltepunkt hinzufügen", "addConditionalBreakpoint": "Bedingten Haltepunkt hinzufügen...", "addLogPoint": "Protokollpunkt hinzufügen …", + "breakpointHasCondition": "Dieser {0} hat eine {1}, die beim Entfernen verloren geht. Deaktivieren Sie stattdessen ggf. den {0}.", + "message": "Nachricht", + "condition": "Bedingung", + "removeLogPoint": "{0} entfernen", + "disableLogPoint": "{0} deaktivieren", "cancel": "Abbrechen", "addConfiguration": "Konfiguration hinzufügen..." } \ No newline at end of file diff --git a/i18n/deu/src/vs/workbench/parts/extensions/browser/extensionsActions.i18n.json b/i18n/deu/src/vs/workbench/parts/extensions/browser/extensionsActions.i18n.json index a2f215a756f..cf7a07fdcb5 100644 --- a/i18n/deu/src/vs/workbench/parts/extensions/browser/extensionsActions.i18n.json +++ b/i18n/deu/src/vs/workbench/parts/extensions/browser/extensionsActions.i18n.json @@ -61,7 +61,7 @@ "disabled": "Deaktiviert", "disabled globally": "Deaktiviert", "disabled workspace": "Für diesen Arbeitsbereich deaktiviert", - "disableAll": "Alle installierten Erweiterungen löschen", + "disableAll": "Alle installierten Erweiterungen deaktivieren", "disableAllWorkspace": "Alle installierten Erweiterungen für diesen Arbeitsbereich deaktivieren", "enableAll": "Alle Erweiterungen aktivieren", "enableAllWorkspace": "Alle Erweiterungen für diesen Arbeitsbereich aktivieren", diff --git a/i18n/deu/src/vs/workbench/parts/extensions/electron-browser/extensionEditor.i18n.json b/i18n/deu/src/vs/workbench/parts/extensions/electron-browser/extensionEditor.i18n.json index 6789227ba76..605ae435a77 100644 --- a/i18n/deu/src/vs/workbench/parts/extensions/electron-browser/extensionEditor.i18n.json +++ b/i18n/deu/src/vs/workbench/parts/extensions/electron-browser/extensionEditor.i18n.json @@ -36,6 +36,8 @@ "view location": "Wo", "localizations": "Lokalisierungen ({0})", "localizations language id": "Sprach-ID", + "localizations language name": "Name der Sprache", + "localizations localized language name": "Name der Sprache (lokalisiert)", "colorThemes": "Farbdesigns ({0})", "iconThemes": "Symboldesigns ({0})", "colors": "Farben ({0})", diff --git a/i18n/deu/src/vs/workbench/parts/extensions/electron-browser/extensionsViewlet.i18n.json b/i18n/deu/src/vs/workbench/parts/extensions/electron-browser/extensionsViewlet.i18n.json index 7cca8764763..7344b01b4a3 100644 --- a/i18n/deu/src/vs/workbench/parts/extensions/electron-browser/extensionsViewlet.i18n.json +++ b/i18n/deu/src/vs/workbench/parts/extensions/electron-browser/extensionsViewlet.i18n.json @@ -14,6 +14,7 @@ "workspaceRecommendedExtensions": "Arbeitsbereich-Empfehlungen", "builtInExtensions": "Features", "builtInThemesExtensions": "Designs", + "builtInBasicsExtensions": "Programmiersprachen", "searchExtensions": "Nach Erweiterungen im Marketplace suchen", "sort by installs": "Sortieren nach: Installationsanzahl", "sort by rating": "Sortieren nach: Bewertung", diff --git a/i18n/deu/src/vs/workbench/parts/files/browser/editors/textFileEditor.i18n.json b/i18n/deu/src/vs/workbench/parts/files/browser/editors/textFileEditor.i18n.json index eeec7c2ad9d..58ca31c36dc 100644 --- a/i18n/deu/src/vs/workbench/parts/files/browser/editors/textFileEditor.i18n.json +++ b/i18n/deu/src/vs/workbench/parts/files/browser/editors/textFileEditor.i18n.json @@ -8,6 +8,8 @@ ], "textFileEditor": "Textdatei-Editor", "createFile": "Datei erstellen", + "relaunchWithIncreasedMemoryLimit": "Mit {0} MB neu starten", + "configureMemoryLimit": "Arbeitsspeicherbeschränkung konfigurieren", "fileEditorWithInputAriaLabel": "{0}. Textdatei-Editor.", "fileEditorAriaLabel": "Textdatei-Editor" } \ No newline at end of file diff --git a/i18n/deu/src/vs/workbench/parts/files/electron-browser/fileActions.i18n.json b/i18n/deu/src/vs/workbench/parts/files/electron-browser/fileActions.i18n.json index 9f68b999300..6eb02028f64 100644 --- a/i18n/deu/src/vs/workbench/parts/files/electron-browser/fileActions.i18n.json +++ b/i18n/deu/src/vs/workbench/parts/files/electron-browser/fileActions.i18n.json @@ -13,6 +13,7 @@ "copyFile": "Kopieren", "pasteFile": "Einfügen", "retry": "Wiederholen", + "renameWhenSourcePathIsParentOfTargetError": "Verwenden Sie den Befehl \"Neuer Ordner\" oder \"Neue Datei\", um untergeordnete Elemente zu einem vorhandenen Ordner hinzuzufügen", "newUntitledFile": "Neue unbenannte Datei", "createNewFile": "Neue Datei", "createNewFolder": "Neuer Ordner", @@ -32,12 +33,17 @@ "trashFailed": "Fehler beim Löschen über den Papierkorb. Möchten Sie den Löschvorgang stattdessen dauerhaft ausführen?", "deletePermanentlyButtonLabel": "En&&dgültig löschen", "retryButtonLabel": "Wiede&&rholen", + "confirmMoveTrashMessageFilesAndDirectories": "Möchten Sie die folgenden {0} Dateien/Verzeichnisse und ihren Inhalt löschen?", + "confirmMoveTrashMessageMultipleDirectories": "Möchten Sie die folgenden {0} Verzeichnisse und ihren Inhalt löschen?", "confirmMoveTrashMessageMultiple": "Möchten Sie die folgenden {0} Dateien löschen?", "confirmMoveTrashMessageFolder": "Möchten Sie \"{0}\" samt Inhalt wirklich löschen?", "confirmMoveTrashMessageFile": "Möchten Sie \"{0}\" wirklich löschen?", + "confirmDeleteMessageFilesAndDirectories": "Möchten Sie die folgenden {0} Dateien/Verzeichnisse und ihren Inhalt dauerhaft löschen?", + "confirmDeleteMessageMultipleDirectories": "Möchten Sie die folgenden {0} Verzeichnisse und ihren Inhalt dauerhaft löschen?", "confirmDeleteMessageMultiple": "Möchten Sie die folgenden {0} Dateien endgültig löschen?", "confirmDeleteMessageFolder": "Möchten Sie \"{0}\" samt Inhalt wirklich endgültig löschen?", "confirmDeleteMessageFile": "Möchten Sie \"{0}\" wirklich endgültig löschen?", + "addFiles": "Dateien hinzufügen", "confirmOverwrite": "Im Zielordner ist bereits eine Datei oder ein Ordner mit dem gleichen Namen vorhanden. Möchten Sie sie bzw. ihn ersetzen?", "replaceButtonLabel": "&&Ersetzen", "fileIsAncestor": "Die einzufügende Datei ist ein Vorgänger des Zielordners", @@ -57,7 +63,9 @@ "openFileToShowInNewWindow": "Datei zuerst öffnen, um sie in einem neuen Fenster zu öffnen", "copyPath": "Pfad kopieren", "emptyFileNameError": "Es muss ein Datei- oder Ordnername angegeben werden.", + "fileNameStartsWithSlashError": "Ein Datei- oder Ordnername darf nicht mit einem Schrägstrich beginnen.", "fileNameExistsError": "Eine Datei oder ein Ordner **{0}** ist an diesem Ort bereits vorhanden. Wählen Sie einen anderen Namen.", + "fileUsedAsFolderError": "**{0}** ist eine Datei und darf keine Nachfolger haben.", "invalidFileNameError": "Der Name **{0}** ist als Datei- oder Ordnername ungültig. Bitte wählen Sie einen anderen Namen aus.", "filePathTooLongError": "Der Name **{0}** führt zu einem Pfad, der zu lang ist. Wählen Sie einen kürzeren Namen.", "compareWithClipboard": "Aktive Datei mit Zwischenablage vergleichen", diff --git a/i18n/deu/src/vs/workbench/parts/files/electron-browser/files.contribution.i18n.json b/i18n/deu/src/vs/workbench/parts/files/electron-browser/files.contribution.i18n.json index 8a4578792a4..99f2be77fbb 100644 --- a/i18n/deu/src/vs/workbench/parts/files/electron-browser/files.contribution.i18n.json +++ b/i18n/deu/src/vs/workbench/parts/files/electron-browser/files.contribution.i18n.json @@ -35,6 +35,7 @@ "hotExit": "Steuert, ob nicht gespeicherten Dateien zwischen den Sitzungen beibehlten werden, die Aufforderung zum Speichern wird beim Beenden des Editors übersprungen.", "useExperimentalFileWatcher": "Verwenden Sie die neue experimentelle Dateiüberwachung.", "defaultLanguage": "Der Standardsprachmodus, der neuen Dateien zugewiesen wird.", + "maxMemoryForLargeFilesMB": "Steuert den für VS Code verfügbaren Arbeitsspeicher nach einem Neustart beim Versuch, große Dateien zu öffnen. Gleiche Auswirkung wie beim Festlegen von --max-memory=NEWSIZE in der Befehlszeile.", "editorConfigurationTitle": "Editor", "formatOnSave": "Hiermit wird eine Datei beim Speichern formatiert. Es muss ein Formatierer vorhanden sein, die Datei darf nicht automatisch gespeichert werden, und der Editor darf nicht geschlossen werden.", "formatOnSaveTimeout": "Zeitüberschreitung beim Formatieren während des Speicherns. Legt eine Zeitbegrenzung in Millisekunden für formatOnSave-Befehle fest. Befehle, die länger dauern als die festgelegte Zeitüberschreitung, werden abgebrochen. ", diff --git a/i18n/deu/src/vs/workbench/parts/files/electron-browser/views/explorerViewer.i18n.json b/i18n/deu/src/vs/workbench/parts/files/electron-browser/views/explorerViewer.i18n.json index 93c8167356a..89c8d9fa907 100644 --- a/i18n/deu/src/vs/workbench/parts/files/electron-browser/views/explorerViewer.i18n.json +++ b/i18n/deu/src/vs/workbench/parts/files/electron-browser/views/explorerViewer.i18n.json @@ -7,6 +7,9 @@ "Do not edit this file. It is machine generated." ], "fileInputAriaLabel": "Geben Sie den Dateinamen ein. Drücken Sie zur Bestätigung die EINGABETASTE oder ESC, um den Vorgang abzubrechen.", + "createFileFromExplorerInfoMessage": "Datei **{0}** in **{1}** erstellen", + "renameFileFromExplorerInfoMessage": "Verschieben und in **{0}** umbenennen", + "createFolderFromExplorerInfoMessage": "Ordner **{0}** in **{1}** erstellen", "filesExplorerViewerAriaLabel": "{0}, Datei-Explorer", "dropFolders": "Möchten Sie die Ordner zum Arbeitsbereich hinzufügen?", "dropFolder": "Möchten Sie den Ordner zum Arbeitsbereich hinzufügen?", diff --git a/i18n/deu/src/vs/workbench/parts/localizations/electron-browser/localizations.contribution.i18n.json b/i18n/deu/src/vs/workbench/parts/localizations/electron-browser/localizations.contribution.i18n.json index d69e7a77b17..d3b6302160a 100644 --- a/i18n/deu/src/vs/workbench/parts/localizations/electron-browser/localizations.contribution.i18n.json +++ b/i18n/deu/src/vs/workbench/parts/localizations/electron-browser/localizations.contribution.i18n.json @@ -10,7 +10,9 @@ "yes": "Ja", "no": "Nein", "neverAgain": "Nicht mehr anzeigen", + "install language pack": "In naher Zukunft wird VS Code nur Sprachpakete in Form von Marketplace-Erweiterungen unterstützen. Installieren Sie die Erweiterung \"{0}\", damit Sie die derzeit konfigurierte Sprache weiter verwenden können.", "install": "Installieren", + "more information": "Weitere Informationen …", "JsonSchema.locale": "Die zu verwendende Sprache der Benutzeroberfläche.", "vscode.extension.contributes.localizations": "Trägt Lokalisierungen zum Editor bei", "vscode.extension.contributes.localizations.languageId": "ID der Sprache, in die Anzeigezeichenfolgen übersetzt werden.", diff --git a/i18n/deu/src/vs/workbench/parts/markers/electron-browser/markers.contribution.i18n.json b/i18n/deu/src/vs/workbench/parts/markers/electron-browser/markers.contribution.i18n.json index 778741d8c94..ed217d3a918 100644 --- a/i18n/deu/src/vs/workbench/parts/markers/electron-browser/markers.contribution.i18n.json +++ b/i18n/deu/src/vs/workbench/parts/markers/electron-browser/markers.contribution.i18n.json @@ -6,5 +6,6 @@ "--------------------------------------------------------------------------------------------", "Do not edit this file. It is machine generated." ], - "copyMarker": "Kopieren" + "copyMarker": "Kopieren", + "copyMessage": "Nachricht kopieren" } \ No newline at end of file diff --git a/i18n/deu/src/vs/workbench/parts/markers/electron-browser/markersPanel.i18n.json b/i18n/deu/src/vs/workbench/parts/markers/electron-browser/markersPanel.i18n.json index 35229bd6699..44bcb5c161d 100644 --- a/i18n/deu/src/vs/workbench/parts/markers/electron-browser/markersPanel.i18n.json +++ b/i18n/deu/src/vs/workbench/parts/markers/electron-browser/markersPanel.i18n.json @@ -5,5 +5,7 @@ "Licensed under the MIT License. See License.txt in the project root for license information.", "--------------------------------------------------------------------------------------------", "Do not edit this file. It is machine generated." - ] + ], + "disableFilesExclude": "Dateiausschlussfilter deaktivieren.", + "clearFilter": "Filter löschen." } \ No newline at end of file diff --git a/i18n/deu/src/vs/workbench/parts/markers/electron-browser/markersPanelActions.i18n.json b/i18n/deu/src/vs/workbench/parts/markers/electron-browser/markersPanelActions.i18n.json index 35229bd6699..74b775239c0 100644 --- a/i18n/deu/src/vs/workbench/parts/markers/electron-browser/markersPanelActions.i18n.json +++ b/i18n/deu/src/vs/workbench/parts/markers/electron-browser/markersPanelActions.i18n.json @@ -5,5 +5,6 @@ "Licensed under the MIT License. See License.txt in the project root for license information.", "--------------------------------------------------------------------------------------------", "Do not edit this file. It is machine generated." - ] + ], + "showing filtered problems": "Zeigt {0} von {1} an" } \ No newline at end of file diff --git a/i18n/deu/src/vs/workbench/parts/markers/electron-browser/messages.i18n.json b/i18n/deu/src/vs/workbench/parts/markers/electron-browser/messages.i18n.json index 1dd4edae3e5..68082d2d7bd 100644 --- a/i18n/deu/src/vs/workbench/parts/markers/electron-browser/messages.i18n.json +++ b/i18n/deu/src/vs/workbench/parts/markers/electron-browser/messages.i18n.json @@ -14,8 +14,13 @@ "markers.panel.title.problems": "Probleme", "markers.panel.aria.label.problems.tree": "Probleme nach Dateien gruppiert", "markers.panel.no.problems.build": "Es wurden bisher keine Probleme im Arbeitsbereich erkannt.", + "markers.panel.no.problems.filters": "Es wurden keine Ergebnisse mit den angegebenen Filterkriterien gefunden.", + "markers.panel.no.problems.file.exclusions": "Alle Probleme sind ausgeblendet, weil der Filter zum Ausschließen von Dateien aktiviert ist.", + "markers.panel.action.useFilesExclude": "Filtern mithilfe der Dateiausschlusseinstellungen", + "markers.panel.action.donotUseFilesExclude": "Dateiausschlusseinstellung nicht verwenden", "markers.panel.action.filter": "Probleme filtern", "markers.panel.filter.ariaLabel": "Probleme filtern", + "markers.panel.filter.placeholder": "Filter. Z. B.: text, **/*.ts, !**/node_modules/**", "markers.panel.filter.errors": "Fehler", "markers.panel.filter.warnings": "Warnungen", "markers.panel.filter.infos": "Informationen", diff --git a/i18n/deu/src/vs/workbench/parts/preferences/browser/preferencesEditor.i18n.json b/i18n/deu/src/vs/workbench/parts/preferences/browser/preferencesEditor.i18n.json index 1fe4a79f5f0..3d77216b1a1 100644 --- a/i18n/deu/src/vs/workbench/parts/preferences/browser/preferencesEditor.i18n.json +++ b/i18n/deu/src/vs/workbench/parts/preferences/browser/preferencesEditor.i18n.json @@ -15,6 +15,8 @@ "nlpResult": "Ergebnisse in natürlicher Sprache", "filterResult": "Gefilterte Ergebnisse", "defaultSettings": "Standardeinstellungen", + "defaultUserSettings": "Standardbenutzereinstellungen", + "defaultWorkspaceSettings": "Standard-Arbeitsbereichseinstellungen", "defaultFolderSettings": "Standardordnereinstellungen", "defaultEditorReadonly": "Nehmen Sie im Editor auf der rechten Seite Änderungen vor, um Standardwerte zu überschreiben.", "preferencesAriaLabel": "Standardeinstellungen. Schreibgeschützter Text-Editor." diff --git a/i18n/deu/src/vs/workbench/parts/scm/electron-browser/scmViewlet.i18n.json b/i18n/deu/src/vs/workbench/parts/scm/electron-browser/scmViewlet.i18n.json index 3754e386c33..c287ce1399d 100644 --- a/i18n/deu/src/vs/workbench/parts/scm/electron-browser/scmViewlet.i18n.json +++ b/i18n/deu/src/vs/workbench/parts/scm/electron-browser/scmViewlet.i18n.json @@ -11,5 +11,6 @@ "installAdditionalSCMProviders": "Installiere weiter SCM Provider...", "no open repo": "Es gibt keine aktiven Quellcodeanbieter.", "source control": "Quellcodeverwaltung", - "viewletTitle": "{0}: {1}" + "viewletTitle": "{0}: {1}", + "hideView": "Ausblenden" } \ No newline at end of file diff --git a/i18n/deu/src/vs/workbench/parts/search/electron-browser/search.contribution.i18n.json b/i18n/deu/src/vs/workbench/parts/search/electron-browser/search.contribution.i18n.json index 23fd972a5ff..5ce5bde4006 100644 --- a/i18n/deu/src/vs/workbench/parts/search/electron-browser/search.contribution.i18n.json +++ b/i18n/deu/src/vs/workbench/parts/search/electron-browser/search.contribution.i18n.json @@ -10,6 +10,8 @@ "copyMatchLabel": "Kopieren", "copyPathLabel": "Pfad kopieren", "copyAllLabel": "Alles kopieren", + "clearSearchHistoryLabel": "Suchverlauf löschen", + "toggleSearchViewPositionLabel": "Position der Suchansicht umschalten", "findInFolder": "In Ordner suchen...", "findInWorkspace": "In Arbeitsbereich suchen...", "showTriggerActions": "Zu Symbol im Arbeitsbereich wechseln...", @@ -28,5 +30,6 @@ "search.quickOpen.includeSymbols": "Konfigurieren Sie diese Option, um Ergebnisse aus einer globalen Symbolsuche in die Dateiergebnisse für Quick Open einzuschließen.", "search.followSymlinks": "Steuert, ob Symlinks während der Suche gefolgt werden.", "search.smartCase": "Sucht ohne Berücksichtigung von Groß-/Kleinschreibung, wenn das Muster kleingeschrieben ist, andernfalls wird mit Berücksichtigung von Groß-/Kleinschreibung gesucht.", - "search.globalFindClipboard": "Steuert, ob die Suchansicht die freigegebene Suchzwischenablage auf macOS lesen oder verändern soll" + "search.globalFindClipboard": "Steuert, ob die Suchansicht die freigegebene Suchzwischenablage auf macOS lesen oder verändern soll", + "search.location": "Steuert, ob die Suche als Ansicht in der Seitenleiste oder als Bedienfeld im Bedienfeldbereich angezeigt wird, damit horizontal mehr Platz zur Verfügung steht. In der nächsten Version wird das horizontale Layout im Bedienfeld verbessert, und dies wird keine Vorschau mehr sein." } \ No newline at end of file diff --git a/i18n/deu/src/vs/workbench/parts/tasks/common/taskDefinitionRegistry.i18n.json b/i18n/deu/src/vs/workbench/parts/tasks/common/taskDefinitionRegistry.i18n.json index 7da77c06a94..9800162f868 100644 --- a/i18n/deu/src/vs/workbench/parts/tasks/common/taskDefinitionRegistry.i18n.json +++ b/i18n/deu/src/vs/workbench/parts/tasks/common/taskDefinitionRegistry.i18n.json @@ -6,7 +6,7 @@ "--------------------------------------------------------------------------------------------", "Do not edit this file. It is machine generated." ], - "TaskDefinition.description": "Der tatsächliche Aufgabentyp", + "TaskDefinition.description": "Der tatsächliche Aufgabentyp. Typen, die mit \"$\" beginnen, sind für den internen Gebrauch reserviert.", "TaskDefinition.properties": "Zusätzliche Eigenschaften des Aufgabentyps", "TaskTypeConfiguration.noType": "In der Konfiguration des Aufgabentyps fehlt die erforderliche taskType-Eigenschaft.", "TaskDefinitionExtPoint": "Trägt Aufgabenarten bei" diff --git a/i18n/deu/src/vs/workbench/parts/tasks/electron-browser/task.contribution.i18n.json b/i18n/deu/src/vs/workbench/parts/tasks/electron-browser/task.contribution.i18n.json index a7490d669b4..5e860baf0d8 100644 --- a/i18n/deu/src/vs/workbench/parts/tasks/electron-browser/task.contribution.i18n.json +++ b/i18n/deu/src/vs/workbench/parts/tasks/electron-browser/task.contribution.i18n.json @@ -31,6 +31,8 @@ "selectProblemMatcher": "Fehler- und Warnungsarten auswählen, auf die die Aufgabenausgabe überprüft werden soll", "customizeParseErrors": "Die aktuelle Aufgabenkonfiguration weist Fehler auf. Beheben Sie die Fehler, bevor Sie eine Aufgabe anpassen.", "moreThanOneBuildTask": "In \"tasks.json\" sind mehrere Buildaufgaben definiert. Die erste wird ausgeführt.\n", + "TaskSystem.activeSame.background": "Die Aufgabe \"{0}\" ist bereits aktiv und befindet sich im Hintergrundmodus.", + "TaskSystem.activeSame.noBackground": "Die Aufgabe \"{0}\" ist bereits aktiv.", "terminateTask": "Aufgabe beenden", "restartTask": "Aufgabe neu starten", "TaskSystem.active": "Eine aktive Aufgabe wird bereits ausgeführt. Beenden Sie diese, bevor Sie eine andere Aufgabe ausführen.", diff --git a/i18n/deu/src/vs/workbench/parts/tasks/electron-browser/terminalTaskSystem.i18n.json b/i18n/deu/src/vs/workbench/parts/tasks/electron-browser/terminalTaskSystem.i18n.json index 7973f8cd42e..dd6cd0fe365 100644 --- a/i18n/deu/src/vs/workbench/parts/tasks/electron-browser/terminalTaskSystem.i18n.json +++ b/i18n/deu/src/vs/workbench/parts/tasks/electron-browser/terminalTaskSystem.i18n.json @@ -11,6 +11,6 @@ "TerminalTaskSystem.terminalName": "Aufgabe - {0}", "closeTerminal": "Betätigen Sie eine beliebige Taste, um das Terminal zu schließen.", "reuseTerminal": "Das Terminal wird von Aufgaben wiederverwendet, drücken Sie zum Schließen eine beliebige Taste.", - "TerminalTaskSystem": "Ein Shell-Befehl kann nicht auf einem UNC-Laufwerk ausgeführt werden.", + "TerminalTaskSystem": "Ein Shell-Befehl kann nicht mithilfe von cmd.exe auf einem UNC-Laufwerk ausgeführt werden.", "unkownProblemMatcher": "Der Problemabgleicher {0} kann nicht aufgelöst werden. Der Abgleicher wird ignoriert." } \ No newline at end of file diff --git a/i18n/deu/src/vs/workbench/parts/terminal/electron-browser/terminalActions.i18n.json b/i18n/deu/src/vs/workbench/parts/terminal/electron-browser/terminalActions.i18n.json index c66ad2bebf8..dc99fa23837 100644 --- a/i18n/deu/src/vs/workbench/parts/terminal/electron-browser/terminalActions.i18n.json +++ b/i18n/deu/src/vs/workbench/parts/terminal/electron-browser/terminalActions.i18n.json @@ -20,7 +20,8 @@ "workbench.action.terminal.new.short": "Neues Terminal", "workbench.action.terminal.newWorkspacePlaceholder": "Aktuelles Arbeitsverzeichnis für neues Terminal auswählen", "workbench.action.terminal.newInActiveWorkspace": "Neues integriertes Terminal erstellen (in aktivem Arbeitsbereich)", - "workbench.action.terminal.split": "Details zu Sucheinstellungen", + "workbench.action.terminal.split": "Terminal verdoppeln", + "workbench.action.terminal.splitInActiveWorkspace": "Terminal teilen (in aktivem Arbeitsbereich)", "workbench.action.terminal.focusPreviousPane": "Fokus in vorherigem Bereich", "workbench.action.terminal.focusNextPane": "Fokus in nächstem Bereich", "workbench.action.terminal.resizePaneLeft": "Größe des linken Bereichs ändern", @@ -43,6 +44,7 @@ "workbench.action.terminal.scrollUpPage": "Nach oben scrollen (Seite)", "workbench.action.terminal.scrollToTop": "Bildlauf nach oben", "workbench.action.terminal.clear": "Löschen", + "workbench.action.terminal.clearSelection": "Auswahl löschen", "workbench.action.terminal.allowWorkspaceShell": "Shell-Konfiguration des Arbeitsbereichs zulassen", "workbench.action.terminal.disallowWorkspaceShell": "Verbiete Workspace Shell Konfiguration", "workbench.action.terminal.rename": "Umbenennen", @@ -52,6 +54,8 @@ "nextTerminalFindTerm": "Nächsten Suchbegriff anzeigen", "previousTerminalFindTerm": "Vorherigen Suchbegriff anzeigen", "quickOpenTerm": "Aktives Terminal wechseln", + "workbench.action.terminal.scrollToPreviousCommand": "Zu vorherigem Befehl scrollen", + "workbench.action.terminal.scrollToNextCommand": "Zu nächstem Befehl scrollen", "workbench.action.terminal.selectToPreviousCommand": "Auswählen bis zu vorherigem Befehl", "workbench.action.terminal.selectToNextCommand": "Auswählen bis zu nächstem Befehl" } \ No newline at end of file diff --git a/i18n/deu/src/vs/workbench/parts/terminal/electron-browser/terminalInstance.i18n.json b/i18n/deu/src/vs/workbench/parts/terminal/electron-browser/terminalInstance.i18n.json index d16dc80c2da..c4511678dd9 100644 --- a/i18n/deu/src/vs/workbench/parts/terminal/electron-browser/terminalInstance.i18n.json +++ b/i18n/deu/src/vs/workbench/parts/terminal/electron-browser/terminalInstance.i18n.json @@ -12,5 +12,6 @@ "terminal.integrated.copySelection.noSelection": "Das Terminal enthält keine Auswahl zum Kopieren.", "terminal.integrated.exitedWithCode": "Der Terminalprozess wurde mit folgendem Exitcode beendet: {0}", "terminal.integrated.waitOnExit": "Betätigen Sie eine beliebige Taste, um das Terminal zu schließen.", - "terminal.integrated.launchFailed": "Fehler beim Starten des Terminalprozessbefehls \"{0}{1}\" (Exitcode: {2})." + "terminal.integrated.launchFailed": "Fehler beim Starten des Terminalprozessbefehls \"{0}{1}\" (Exitcode: {2}).", + "terminal.integrated.launchFailedExtHost": "Der Terminalprozess konnte nicht gestartet werden (Exitcode: {0})" } \ No newline at end of file diff --git a/i18n/deu/src/vs/workbench/parts/update/electron-browser/update.i18n.json b/i18n/deu/src/vs/workbench/parts/update/electron-browser/update.i18n.json index dbd9faf3c7e..7ad30b14c43 100644 --- a/i18n/deu/src/vs/workbench/parts/update/electron-browser/update.i18n.json +++ b/i18n/deu/src/vs/workbench/parts/update/electron-browser/update.i18n.json @@ -18,8 +18,10 @@ "thereIsUpdateAvailable": "Ein Update ist verfügbar.", "download now": "Jetzt herunterladen", "later": "Später", + "updateAvailable": "Ein Update ist verfügbar: {0} {1}", "installUpdate": "Update installieren", "updateInstalling": "{0} {1} wird im Hintergrund installiert. Wir informieren Sie, wenn dies abgeschlossen ist.", + "updateAvailableAfterRestart": "Starten Sie {0} neu, um das neueste Update zu installieren.", "updateNow": "Jetzt aktualisieren", "commandPalette": "Befehlspalette...", "settings": "Einstellungen", diff --git a/i18n/deu/src/vs/workbench/parts/url/electron-browser/url.contribution.i18n.json b/i18n/deu/src/vs/workbench/parts/url/electron-browser/url.contribution.i18n.json index 0c1f5497f13..d59e6ff3eb2 100644 --- a/i18n/deu/src/vs/workbench/parts/url/electron-browser/url.contribution.i18n.json +++ b/i18n/deu/src/vs/workbench/parts/url/electron-browser/url.contribution.i18n.json @@ -6,5 +6,6 @@ "--------------------------------------------------------------------------------------------", "Do not edit this file. It is machine generated." ], + "openUrl": "URL öffnen", "developer": "Entwickler" } \ No newline at end of file diff --git a/i18n/deu/src/vs/workbench/parts/welcome/overlay/browser/welcomeOverlay.i18n.json b/i18n/deu/src/vs/workbench/parts/welcome/overlay/browser/welcomeOverlay.i18n.json index 0b403d88115..9032ed4ba00 100644 --- a/i18n/deu/src/vs/workbench/parts/welcome/overlay/browser/welcomeOverlay.i18n.json +++ b/i18n/deu/src/vs/workbench/parts/welcome/overlay/browser/welcomeOverlay.i18n.json @@ -13,6 +13,7 @@ "welcomeOverlay.extensions": "Erweiterungen verwalten", "welcomeOverlay.problems": "Fehler und Warnungen anzeigen", "welcomeOverlay.commandPalette": "Alle Befehle suchen und ausführen", + "welcomeOverlay.notifications": "Benachrichtigungen anzeigen", "welcomeOverlay": "Benutzeroberflächenüberblick", "hideWelcomeOverlay": "Schnittstellenüberblick ausblenden", "help": "Hilfe" diff --git a/i18n/deu/src/vs/workbench/parts/welcome/page/electron-browser/vs_code_welcome_page.i18n.json b/i18n/deu/src/vs/workbench/parts/welcome/page/electron-browser/vs_code_welcome_page.i18n.json index de0f13bcb07..a61c1d6c459 100644 --- a/i18n/deu/src/vs/workbench/parts/welcome/page/electron-browser/vs_code_welcome_page.i18n.json +++ b/i18n/deu/src/vs/workbench/parts/welcome/page/electron-browser/vs_code_welcome_page.i18n.json @@ -27,6 +27,8 @@ "welcomePage.installExtensionPacks": "Tools und Sprachen", "welcomePage.installExtensionPacksDescription": "Unterstützung für {0} und {1} installieren", "welcomePage.moreExtensions": "mehr", + "welcomePage.installKeymapDescription": "Einstellungen und Tastenzuordnungen", + "welcomePage.installKeymapExtension": "Installieren Sie die Einstellungen und Tastenkombinationen von {0} und {1}", "welcomePage.others": "Andere", "welcomePage.colorTheme": "Farbdesign", "welcomePage.colorThemeDescription": "Passen Sie das Aussehen des Editors und Ihres Codes an Ihre Wünsche an.", diff --git a/i18n/deu/src/vs/workbench/services/configuration/common/configurationExtensionPoint.i18n.json b/i18n/deu/src/vs/workbench/services/configuration/common/configurationExtensionPoint.i18n.json index 8b206a77c77..00fa493a449 100644 --- a/i18n/deu/src/vs/workbench/services/configuration/common/configurationExtensionPoint.i18n.json +++ b/i18n/deu/src/vs/workbench/services/configuration/common/configurationExtensionPoint.i18n.json @@ -8,6 +8,7 @@ ], "vscode.extension.contributes.configuration.title": "Eine Zusammenfassung der Einstellungen. Diese Bezeichnung wird in der Einstellungsdatei als trennender Kommentar verwendet.", "vscode.extension.contributes.configuration.properties": "Die Beschreibung der Konfigurationseigenschaften.", + "scope.application.description": "Anwendungsspezifische Konfiguration, die nur in den Benutzereinstellungen konfiguriert werden kann.", "scope.window.description": "Fensterspezifische Konfiguration, die in den Benutzer- oder Arbeitsbereichseinstellungen konfiguriert werden kann.", "scope.resource.description": "Ressourcenspezifische Konfiguration, die in den Benutzer-, Arbeitsbereichs- oder Ordnereinstellungen konfiguriert werden kann.", "scope.description": "Bereich, in dem die Konfiguration gültig ist. Verfügbare Gültigkeitsbereiche sind \"window\" und \"resource\".", diff --git a/i18n/deu/src/vs/workbench/services/configuration/node/configurationEditingService.i18n.json b/i18n/deu/src/vs/workbench/services/configuration/node/configurationEditingService.i18n.json index ee5f56d7e44..6e51d0a62d6 100644 --- a/i18n/deu/src/vs/workbench/services/configuration/node/configurationEditingService.i18n.json +++ b/i18n/deu/src/vs/workbench/services/configuration/node/configurationEditingService.i18n.json @@ -11,6 +11,7 @@ "open": "Einstellungen öffnen", "saveAndRetry": "Speichern und wiederholen", "errorUnknownKey": "In {0} kann nicht geschrieben werden, weil {1} keine registrierte Konfiguration ist.", + "errorInvalidWorkspaceConfigurationApplication": "{0} kann nicht in die Arbeitsbereichseinstellungen geschrieben werden. Diese Einstellung kann nur in den Benutzereinstellungen geschrieben werden.", "errorInvalidFolderConfiguration": "In die Ordnereinstellungen kann nicht geschrieben werden, weil {0} den Gültigkeitsbereich für Ordnerressourcen nicht unterstützt.", "errorInvalidUserTarget": "In die Benutzereinstellungen kann nicht geschrieben werden, weil {0} den globalen Gültigkeitsbereich nicht unterstützt.", "errorInvalidWorkspaceTarget": "In die Arbeitsbereichseinstellungen kann nicht geschrieben werden, da {0} den Arbeitsbereichsumfang in einem Arbeitsbereich mit mehreren Ordnern nicht unterstützt.", diff --git a/i18n/deu/src/vs/workbench/services/configuration/node/configurationService.i18n.json b/i18n/deu/src/vs/workbench/services/configuration/node/configurationService.i18n.json index 0905d3e2f24..0508efb20d2 100644 --- a/i18n/deu/src/vs/workbench/services/configuration/node/configurationService.i18n.json +++ b/i18n/deu/src/vs/workbench/services/configuration/node/configurationService.i18n.json @@ -6,5 +6,6 @@ "--------------------------------------------------------------------------------------------", "Do not edit this file. It is machine generated." ], + "unsupportedApplicationSetting": "Diese Einstellung kann nur in den Benutzereinstellungen angewendet werden", "unsupportedWindowSetting": "Diese Einstellung kann jetzt nicht angewendet werden. Sie wird angewendet, wenn Sie den Ordner direkt öffnen." } \ No newline at end of file diff --git a/i18n/deu/src/vs/workbench/services/configurationResolver/node/variableResolver.i18n.json b/i18n/deu/src/vs/workbench/services/configurationResolver/node/variableResolver.i18n.json index 35229bd6699..d691ed2871d 100644 --- a/i18n/deu/src/vs/workbench/services/configurationResolver/node/variableResolver.i18n.json +++ b/i18n/deu/src/vs/workbench/services/configurationResolver/node/variableResolver.i18n.json @@ -5,5 +5,16 @@ "Licensed under the MIT License. See License.txt in the project root for license information.", "--------------------------------------------------------------------------------------------", "Do not edit this file. It is machine generated." - ] + ], + "missingEnvVarName": "\"{0}\" kann nicht aufgelöst werden, da kein Umgebungsvariablenname angegeben ist.", + "configNotFound": "\"{0}\" kann nicht aufgelöst werden, da die Einstellung \"{1}\" nicht gefunden wurde.", + "configNoString": "\"{0}\" kann nicht aufgelöst werden, da \"{1}\" ein strukturierter Wert ist.", + "missingConfigName": "\"{0}\" kann nicht aufgelöst werden, da kein Einstellungsname angegeben ist.", + "noValueForCommand": "\"{0}\" kann nicht aufgelöst werden, da der Befehl keinen Wert hat.", + "canNotFindFolder": "\"{0}\" kann nicht aufgelöst werden. Es ist kein Ordner \"{1}\" vorhanden.", + "canNotResolveWorkspaceFolderMultiRoot": "\"{0}\" kann nicht in einem Arbeitsbereich mit mehreren Ordnern aufgelöst werden. Legen Sie mithilfe von \":\" und einem Arbeitsbereichs-Ordnernamen einen Bereich für diese Variable fest.", + "canNotResolveWorkspaceFolder": "\"{0}\" kann nicht aufgelöst werden. Öffnen Sie einen Ordner.", + "canNotResolveFile": "\"{0}\" kann nicht aufgelöst werden. Öffnen Sie einen Editor.", + "canNotResolveLineNumber": "\"{0}\" kann nicht aufgelöst werden. Im aktiven Editor muss eine Zeile ausgewählt sein.", + "canNotResolveSelectedText": "\"{0}\" kann nicht aufgelöst werden. Im aktiven Editor muss Text ausgewählt sein." } \ No newline at end of file diff --git a/i18n/deu/src/vs/workbench/services/extensions/common/extensionsRegistry.i18n.json b/i18n/deu/src/vs/workbench/services/extensions/common/extensionsRegistry.i18n.json index c2750cd84cc..f9c60fd53e4 100644 --- a/i18n/deu/src/vs/workbench/services/extensions/common/extensionsRegistry.i18n.json +++ b/i18n/deu/src/vs/workbench/services/extensions/common/extensionsRegistry.i18n.json @@ -6,10 +6,12 @@ "--------------------------------------------------------------------------------------------", "Do not edit this file. It is machine generated." ], + "vscode.extension.engines": "Modulkompatibilität.", "vscode.extension.engines.vscode": "Gibt für VS Code-Erweiterungen die VS Code-Version an, mit der die Erweiterung kompatibel ist. Darf nicht \"*\" sein. Beispiel: ^0.10.5 gibt die Kompatibilität mit mindestens VS Code-Version 0.10.5 an.", "vscode.extension.publisher": "Der Herausgeber der VS Code-Extension.", "vscode.extension.displayName": "Der Anzeigename für die Extension, der im VS Code-Katalog verwendet wird.", "vscode.extension.categories": "Die vom VS Code-Katalog zum Kategorisieren der Extension verwendeten Kategorien.", + "vscode.extension.category.languages.deprecated": "Stattdessen \"Programmiersprachen\" verwenden", "vscode.extension.galleryBanner": "Das in VS Code Marketplace verwendete Banner.", "vscode.extension.galleryBanner.color": "Die Bannerfarbe für die Kopfzeile der VS Code Marketplace-Seite.", "vscode.extension.galleryBanner.theme": "Das Farbdesign für die Schriftart, die im Banner verwendet wird.", @@ -23,11 +25,14 @@ "vscode.extension.activationEvents.onDebugResolve": "Ein Aktivierungsereignis ausgegeben, wenn eine Debug-Sitzung mit dem spezifischen Typ gestartet wird (und eine entsprechende resolveDebugConfiguration-Methode aufgerufen werden muss).", "vscode.extension.activationEvents.workspaceContains": "Ein Aktivierungsereignis wird beim Öffnen eines Ordners ausgegeben, der mindestens eine Datei enthält, die mit dem angegebenen Globmuster übereinstimmt.", "vscode.extension.activationEvents.onView": "Ein Aktivierungsereignis wird beim Erweitern der angegebenen Ansicht ausgegeben.", + "vscode.extension.activationEvents.onUri": "Ein Aktivierungsereignis wird ausgegeben, wenn ein systemweiter URI, der auf diese Erweiterung ausgerichtet ist, geöffnet ist.", "vscode.extension.activationEvents.star": "Ein Aktivierungsereignis wird beim Start von VS Code ausgegeben. Damit für die Endbenutzer eine bestmögliche Benutzerfreundlichkeit sichergestellt ist, verwenden Sie dieses Aktivierungsereignis in Ihrer Erweiterung nur dann, wenn in Ihrem Anwendungsfall keine andere Kombination an Aktivierungsereignissen funktioniert.", "vscode.extension.badges": "Array aus Badges, die im Marketplace in der Seitenleiste auf der Seite mit den Erweiterungen angezeigt werden.", "vscode.extension.badges.url": "Die Bild-URL für den Badge.", "vscode.extension.badges.href": "Der Link für den Badge.", "vscode.extension.badges.description": "Eine Beschreibung für den Badge.", + "vscode.extension.markdown": "Steuert das im Marketplace verwendete Markdown-Renderingmodul. Entweder GitHub (Standardeinstellung) oder Standard", + "vscode.extension.qna": "Steuert den Q&A-Link im Marketplace. Auf Marketplace festlegen, um die standardmäßige Q&A-Marketplace-Site zu aktivieren. Auf eine Zeichenfolge festlegen, um die URL einer benutzerdefinierten Q&A-Site anzugeben. Auf FALSE festlegen, um Q&A komplett zu deaktivieren.", "vscode.extension.extensionDependencies": "Abhängigkeiten von anderen Erweiterungen. Der Bezeichner einer Erweiterung ist immer ${publisher}.${name}, beispielsweise \"vscode.csharp\".", "vscode.extension.scripts.prepublish": "Ein Skript, das ausgeführt wird, bevor das Paket als VS Code-Extension veröffentlicht wird.", "vscode.extension.scripts.uninstall": "Uninstall-Hook für VS Code-Erweiterung: Skript, das ausgeführt wird, wenn die Erweiterung vollständig aus VS Code deinstalliert wurde. Dies ist der Fall, wenn VS Code nach der Deinstallation der Erweiterung neu gestartet wurde (Herunterfahren und Starten). Nur Node-Skripts werden unterstützt. ", diff --git a/i18n/deu/src/vs/workbench/services/extensions/electron-browser/extensionService.i18n.json b/i18n/deu/src/vs/workbench/services/extensions/electron-browser/extensionService.i18n.json index 5887d7611b4..9e2433b45a9 100644 --- a/i18n/deu/src/vs/workbench/services/extensions/electron-browser/extensionService.i18n.json +++ b/i18n/deu/src/vs/workbench/services/extensions/electron-browser/extensionService.i18n.json @@ -6,8 +6,10 @@ "--------------------------------------------------------------------------------------------", "Do not edit this file. It is machine generated." ], + "extensionsDisabled": "Alle Erweiterungen sind deaktiviert.", "extensionHostProcess.crash": "Der Erweiterungshost wurde unerwartet beendet.", "extensionHostProcess.unresponsiveCrash": "Der Erweiterungshost wurde beendet, weil er nicht reagiert hat.", + "devTools": "Entwicklertools öffnen", "restart": "Erweiterungshost neu starten", "overwritingExtension": "Die Erweiterung \"{0}\" wird mit \"{1}\" überschrieben.", "extensionUnderDevelopment": "Die Entwicklungserweiterung unter \"{0}\" wird geladen.", diff --git a/i18n/deu/src/vs/workbench/services/files/electron-browser/fileService.i18n.json b/i18n/deu/src/vs/workbench/services/files/electron-browser/fileService.i18n.json index 25ed118e0c1..846beeace7a 100644 --- a/i18n/deu/src/vs/workbench/services/files/electron-browser/fileService.i18n.json +++ b/i18n/deu/src/vs/workbench/services/files/electron-browser/fileService.i18n.json @@ -14,6 +14,7 @@ "fileInvalidPath": "Ungültige Dateiressource ({0})", "fileIsDirectoryError": "Die Datei ist ein Verzeichnis", "fileNotModifiedError": "Datei nicht geändert seit", + "fileTooLargeForHeapError": "Zum Öffnen einer Datei dieser Größe müssen Sie VS Code neu starten und die Verwendung von mehr Arbeitsspeicher zulassen", "fileTooLargeError": "Die Datei ist zu groß, um sie zu öffnen.", "fileNotFoundError": "Die Datei wurde nicht gefunden ({0}).", "fileBinaryError": "Die Datei scheint eine Binärdatei zu sein und kann nicht als Text geöffnet werden.", diff --git a/i18n/deu/src/vs/workbench/services/files/electron-browser/remoteFileService.i18n.json b/i18n/deu/src/vs/workbench/services/files/electron-browser/remoteFileService.i18n.json index c75ef9a2b35..7555e98e02b 100644 --- a/i18n/deu/src/vs/workbench/services/files/electron-browser/remoteFileService.i18n.json +++ b/i18n/deu/src/vs/workbench/services/files/electron-browser/remoteFileService.i18n.json @@ -9,5 +9,7 @@ "fileNotFoundError": "Die Datei wurde nicht gefunden ({0}).", "fileIsDirectoryError": "Die Datei ist ein Verzeichnis", "fileNotModifiedError": "Datei nicht geändert seit", - "fileBinaryError": "Die Datei scheint eine Binärdatei zu sein und kann nicht als Text geöffnet werden." + "fileBinaryError": "Die Datei scheint eine Binärdatei zu sein und kann nicht als Text geöffnet werden.", + "err.create": "Fehler beim Erstellen der Datei {0}", + "fileMoveConflict": "Verschieben/Kopieren kann nicht ausgeführt werden. Die Datei ist am Ziel bereits vorhanden." } \ No newline at end of file diff --git a/i18n/esn/extensions/git/out/commands.i18n.json b/i18n/esn/extensions/git/out/commands.i18n.json index 6f668444142..628bcce73f8 100644 --- a/i18n/esn/extensions/git/out/commands.i18n.json +++ b/i18n/esn/extensions/git/out/commands.i18n.json @@ -11,9 +11,7 @@ "create branch": "$(plus) crear nueva rama", "repourl": "URL del repositorio", "parent": "Directorio principal", - "cancel": "$(sync~spin) Clonando repositorio... Haga clic para cancelar", - "cancel tooltip": "Cancelar clonación", - "cloning": "Clonando el repositorio GIT...", + "cloning": "Clonación del repositorio git ' {0} '...", "openrepo": "Abrir repositorio", "proposeopen": "¿Desea abrir el repositorio clonado?", "init": "Seleccione una carpeta de área de trabajo en la que inicializar el repositorio de git", diff --git a/i18n/esn/extensions/npm/out/npmView.i18n.json b/i18n/esn/extensions/npm/out/npmView.i18n.json index 35229bd6699..5d96d5850aa 100644 --- a/i18n/esn/extensions/npm/out/npmView.i18n.json +++ b/i18n/esn/extensions/npm/out/npmView.i18n.json @@ -5,5 +5,7 @@ "Licensed under the MIT License. See License.txt in the project root for license information.", "--------------------------------------------------------------------------------------------", "Do not edit this file. It is machine generated." - ] + ], + "npm.noDebugOptions": "No se pudo iniciar \"{0} \" para la depuración porque las secuencias de comandos carecen de una opción de depuración de nodo, por ejemplo \"--inspect-brk\".", + "npm.scriptInvalid": "No se pudo encontrar la secuencia de comandos \"{0}\". Trate de actualizar la vista." } \ No newline at end of file diff --git a/i18n/esn/extensions/npm/package.i18n.json b/i18n/esn/extensions/npm/package.i18n.json index 57d6dcb65e8..4649fdc6be8 100644 --- a/i18n/esn/extensions/npm/package.i18n.json +++ b/i18n/esn/extensions/npm/package.i18n.json @@ -12,10 +12,15 @@ "config.npm.runSilent": "Ejecutar comandos de npm con la opción '--silent'", "config.npm.packageManager": "El administrador de paquetes utilizado para ejecutar secuencias de comandos. ", "config.npm.exclude": "Configura patrones globales para carpetas que deben excluirse de la detección automática de scripts. ", + "config.npm.enableScriptExplorer": "Habilitar la vista del Explorador para los scripts de la NMP, cuando el espacio de trabajo contiene un archivo 'package.json'.", "npm.parseError": "Detección de tareas de nueva gestión pública: no se pudo analizar el archivo {0}", "taskdef.script": "Script npm que debe personalizarse.", "taskdef.path": "Ruta de acceso a la carpeta del archivo package.json que proporciona el script. Se puede omitir.", + "view.name": "Scripts Npm ", "command.refresh": "Actualizar", + "command.run": "Ejecutar", "command.debug": "Depurar", - "command.openScript": "Abrir" + "command.openScript": "Abrir", + "npm.scriptInvalid": "No se pudo encontrar el script '{0}'. Trate de actualizar la vista.", + "npm.noDebugOptions": "No se pudo iniciar ' {0} ' para la depuración porque las secuencias de comandos carecen de una opción de depuración de nodo, por ejemplo '--inspect-brk'." } \ No newline at end of file diff --git a/i18n/esn/src/vs/code/electron-main/menus.i18n.json b/i18n/esn/src/vs/code/electron-main/menus.i18n.json index 4fa8264443e..40f67563e55 100644 --- a/i18n/esn/src/vs/code/electron-main/menus.i18n.json +++ b/i18n/esn/src/vs/code/electron-main/menus.i18n.json @@ -146,7 +146,7 @@ "miConditionalBreakpoint": "Punto de interrupción &&condicional...", "miColumnBreakpoint": "Punto de interrupción de c&&olumna", "miFunctionBreakpoint": "Punto de interrupción de &&función...", - "miLogPoint": "&& Punto de registro de...", + "miLogPoint": "&& Logpoint...", "miNewBreakpoint": "&&Nuevo punto de interrupción", "miEnableAllBreakpoints": "Habilitar todos los puntos de interrupción", "miDisableAllBreakpoints": "&&Deshabilitar todos los puntos de interrupción", diff --git a/i18n/esn/src/vs/editor/common/config/commonEditorConfig.i18n.json b/i18n/esn/src/vs/editor/common/config/commonEditorConfig.i18n.json index d841bf48f91..97f58b07d4b 100644 --- a/i18n/esn/src/vs/editor/common/config/commonEditorConfig.i18n.json +++ b/i18n/esn/src/vs/editor/common/config/commonEditorConfig.i18n.json @@ -16,6 +16,7 @@ "lineNumbers.on": "Los números de línea se muestran como un número absoluto.", "lineNumbers.relative": "Los números de línea se muestran como distancia en líneas a la posición del cursor.", "lineNumbers.interval": "Los números de línea se muestran cada 10 líneas.", + "lineNumbers": "Controla la visualización de números de línea.", "rulers": "Representar reglas verticales después de un cierto número de caracteres monoespacio. Usar multiples valores para multiples reglas. No se dibuja ninguna regla si la matriz esta vacía.", "wordSeparators": "Caracteres que se usarán como separadores de palabras al realizar operaciones o navegaciones relacionadas con palabras.", "tabSize": "El número de espacios a los que equivale una tabulación. Este valor se invalida según el contenido del archivo cuando `editor.detectIndentation` está activado.", @@ -27,6 +28,7 @@ "scrollBeyondLastLine": "Controla si el editor se seguirá desplazando después de la última línea", "smoothScrolling": "Controla si el editor se desplaza con una animación", "minimap.enabled": "Controla si se muestra el minimapa", + "minimap.side": "Controla el lado dónde rendir el minimapa.", "minimap.showSlider": "Controla si el control deslizante del minimapa es ocultado automáticamente.", "minimap.renderCharacters": "Presentar los caracteres reales en una línea (por oposición a bloques de color)", "minimap.maxColumn": "Limitar el ancho del minimapa para presentar como mucho un número de columnas determinado", @@ -75,6 +77,7 @@ "occurrencesHighlight": "Controla si el editor debe resaltar los símbolos semánticos.", "overviewRulerLanes": "Controla el número de decoraciones que pueden aparecer en la misma posición en la regla de visión general", "overviewRulerBorder": "Controla si debe dibujarse un borde alrededor de la regla de información general.", + "cursorBlinking": "Controlar el estilo de animación del cursor.", "mouseWheelZoom": "Ampliar la fuente del editor cuando se use la rueda del mouse mientras se presiona Ctrl", "cursorStyle": "Controla el estilo del cursor. Los valores aceptados son \"block\", \"block-outline\", \"line\", \"line-thin\", \"underline\" y \"underline-thin\"", "cursorWidth": "Controla el ancho del cursor cuando editor.cursorStyle se establece a 'line'", @@ -84,6 +87,7 @@ "renderControlCharacters": "Controla si el editor debe representar caracteres de control", "renderIndentGuides": "Controla si el editor debe representar guías de sangría.", "renderLineHighlight": "Controla cómo el editor debe presentar el resaltado de línea. Las posibilidades son \"ninguno\", \"margen\", \"línea\" y \"todo\".", + "codeLens": "Controla si el editor muestra CodeLens", "folding": "Controla si el editor tiene habilitado el plegado de código.", "foldingStrategyAuto": "Si está disponible, utilice una estrategia de plegado específica del idioma, de lo contrario volverá a la estrategia basada en sangría.", "foldingStrategyIndentation": "Utilice siempre la estrategia de plegado basado en sangría.", @@ -102,10 +106,12 @@ "links": "Controla si el editor debe detectar enlaces y hacerlos cliqueables", "colorDecorators": "Controla si el editor debe representar el Selector de colores y los elementos Decorator de color en línea.", "codeActions": "Permite que el foco de acción del código", + "codeActionsOnSave.organizeImports": "¿organizar importaciones en guardar?", + "codeActionsOnSave": "Tipos de acción de código que se ejecutarán en guardar.", + "codeActionsOnSaveTimeout": "Tiempo de espera para ejecutar acciones de código en guardar.", "selectionClipboard": "Controla si el portapapeles principal de Linux debe admitirse.", "sideBySide": "Controla si el editor de diferencias muestra las diferencias en paralelo o alineadas.", "ignoreTrimWhitespace": "Controla si el editor de diferencias muestra los cambios de espacio inicial o espacio final como diferencias.", - "largeFileSize": "Controla el umbral de tamaño de archivo en bytes más allá de los cuales se aplican reglas de optimización especiales", - "largeFileLineCount": "Controla el umbral de tamaño de archivo en términos de cuenta de línea más allá de las cuales se aplican reglas de optimización especiales", + "largeFileOptimizations": "Manejo especial para archivos grandes para desactivar ciertas funciones de memoria intensiva.", "renderIndicators": "Controla si el editor de diff muestra indicadores +/- para cambios agregados/quitados" } \ No newline at end of file diff --git a/i18n/esn/src/vs/editor/contrib/codeAction/codeActionCommands.i18n.json b/i18n/esn/src/vs/editor/contrib/codeAction/codeActionCommands.i18n.json index 961af167c9a..121ba9263cb 100644 --- a/i18n/esn/src/vs/editor/contrib/codeAction/codeActionCommands.i18n.json +++ b/i18n/esn/src/vs/editor/contrib/codeAction/codeActionCommands.i18n.json @@ -14,5 +14,6 @@ "editor.action.refactor.noneMessage": "No hay refactorizaciones disponibles", "source.label": "Acción de la fuente...", "editor.action.source.noneMessage": "No hay acciones de fuente disponibles", - "organizeImports.label": "Organizar Importaciones" + "organizeImports.label": "Organizar Importaciones", + "editor.action.organize.noneMessage": "No hay acciones de importación disponibles" } \ No newline at end of file diff --git a/i18n/esn/src/vs/platform/environment/node/argv.i18n.json b/i18n/esn/src/vs/platform/environment/node/argv.i18n.json index 4ebff806833..b4899e15c5b 100644 --- a/i18n/esn/src/vs/platform/environment/node/argv.i18n.json +++ b/i18n/esn/src/vs/platform/environment/node/argv.i18n.json @@ -22,6 +22,7 @@ "showVersions": "Muestra las versiones de las extensiones instaladas cuando se usa --list-extension.", "installExtension": "Instala una extensión.", "uninstallExtension": "Desinstala una extensión.", + "experimentalApis": "Permite las funciones de API propuestas para una extensión.", "verbose": "Imprima salidas detalladas (implica --wait).", "log": "Nivel de registro a utilizar. Por defecto es 'info'. Los valores permitidos son 'critical', 'error', 'warn', 'info', 'debug', 'trace', 'off'.", "status": "Imprimir el uso del proceso y la información de diagnóstico.", diff --git a/i18n/esn/src/vs/platform/theme/common/colorRegistry.i18n.json b/i18n/esn/src/vs/platform/theme/common/colorRegistry.i18n.json index ecbee1e78da..ca267f04ff6 100644 --- a/i18n/esn/src/vs/platform/theme/common/colorRegistry.i18n.json +++ b/i18n/esn/src/vs/platform/theme/common/colorRegistry.i18n.json @@ -29,6 +29,7 @@ "inputPlaceholderForeground": "Color de primer plano para el marcador de posición de texto", "inputValidationInfoBackground": "Color de fondo de validación de entrada para gravedad de información.", "inputValidationInfoBorder": "Color de borde de validación de entrada para gravedad de información.", + "inputValidationWarningBackground": "Color de fondo de validación de entrada para gravedad de advertencia.", "inputValidationWarningBorder": "Color de borde de validación de entrada para gravedad de advertencia.", "inputValidationErrorBackground": "Color de fondo de validación de entrada para gravedad de error.", "inputValidationErrorBorder": "Color de borde de valdación de entrada para gravedad de error.", @@ -70,8 +71,10 @@ "editorSelectionHighlightBorder": "Color de borde de las regiones con el mismo contenido que la selección.", "editorFindMatch": "Color de la coincidencia de búsqueda actual.", "findMatchHighlight": "Color de las otras coincidencias de búsqueda. El color no debe ser opaco para no ocultar las decoraciones subyacentes.", + "findRangeHighlight": "Color de la gama que limita la búsqueda. El color no debe ser opaco para no ocultar las decoraciones subyacentes.", "editorFindMatchBorder": "Color de borde de la coincidencia de búsqueda actual.", "findMatchHighlightBorder": "Color de borde de otra búsqueda que coincide.", + "findRangeHighlightBorder": "Color de borde de la gama que limita la búsqueda. El color no debe ser opaco para no ocultar las decoraciones subyacentes.", "hoverHighlight": "Resalte debajo de la palabra para la cual se muestra un Hover. El color no debe ser opaco para no ocultar las decoraciones subyacentes.", "hoverBackground": "Color de fondo al mantener el puntero en el editor.", "hoverBorder": "Color del borde al mantener el puntero en el editor.", @@ -85,6 +88,7 @@ "mergeIncomingHeaderBackground": "Fondo de encabezado entrante en conflictos de fusión en línea. El color no debe ser opaco para no ocultar las decoraciones subyacentes.", "mergeIncomingContentBackground": "Fondo de contenido entrante en conflictos de fusión en línea. El color no debe ser opaco para no ocultar las decoraciones subyacentes.", "mergeCommonHeaderBackground": "Fondo de encabezado de ancestro común en conflictos de fusión en línea. El color no debe ser opaco para no ocultar las decoraciones subyacentes.", + "mergeCommonContentBackground": "Fondo de contenido común de ancestro en conflictos de fusión en línea. El color no debe ser opaco para no ocultar las decoraciones subyacentes.", "mergeBorder": "Color del borde en los encabezados y el divisor en conflictos de combinación alineados.", "overviewRulerCurrentContentForeground": "Primer plano de la regla de visión general actual para conflictos de combinación alineados.", "overviewRulerIncomingContentForeground": "Primer plano de regla de visión general de entrada para conflictos de combinación alineados.", diff --git a/i18n/esn/src/vs/platform/url/electron-browser/inactiveExtensionUrlHandler.i18n.json b/i18n/esn/src/vs/platform/url/electron-browser/inactiveExtensionUrlHandler.i18n.json index 35229bd6699..635a825e0a1 100644 --- a/i18n/esn/src/vs/platform/url/electron-browser/inactiveExtensionUrlHandler.i18n.json +++ b/i18n/esn/src/vs/platform/url/electron-browser/inactiveExtensionUrlHandler.i18n.json @@ -5,5 +5,6 @@ "Licensed under the MIT License. See License.txt in the project root for license information.", "--------------------------------------------------------------------------------------------", "Do not edit this file. It is machine generated." - ] + ], + "confirmUrl": "¿desea que la extensión {0} abra la siguiente URL?" } \ No newline at end of file diff --git a/i18n/esn/src/vs/workbench/api/browser/viewsContainersExtensionPoint.i18n.json b/i18n/esn/src/vs/workbench/api/browser/viewsContainersExtensionPoint.i18n.json index 9a768d6ca82..90efea7a4ba 100644 --- a/i18n/esn/src/vs/workbench/api/browser/viewsContainersExtensionPoint.i18n.json +++ b/i18n/esn/src/vs/workbench/api/browser/viewsContainersExtensionPoint.i18n.json @@ -8,10 +8,13 @@ ], "vscode.extension.contributes.views.containers.id": "Identificador único utilizado para identificar el contenedor en el que se pueden aportar vistas mediante el punto de contribución \"vistas\"", "vscode.extension.contributes.views.containers.title": "Cadena de texto en lenguaje natural usada para mostrar el contenedor. ", - "vscode.extension.contributes.views.containers.icon": "Ruta para el icono de contenedor", - "vscode.extension.contributes.viewsContainer": "Contribuye con vistas de contenedores al editor ", + "vscode.extension.contributes.views.containers.icon": "Ruta para el icono del contenedor. Los iconos son de 24x24 centrados en un cuadrado 50x40 y tienen un color de relleno de ' RGB (215, 218, 224) ' o ' #d7dae0 '. Se recomienda que los iconos estén en SVG, aunque se acepte cualquier tipo de archivo de imagen.", + "vscode.extension.contributes.viewsContainers": "Contribuye con vistas de contenedores al editor ", "views.container.activitybar": "Contribuir vistas de contenedores a la barra de actividades", + "test": "Prueba", + "proposed": "la contribución ' viewsContainers ' sólo está disponible cuando se está ejecutando fuera de desarrollo con el siguiente modificador de línea de comandos: --enable-proposed-API {0}", "requirearray": "contenedores de vistas deben ser una matriz", + "requireidstring": "la propiedad ' {0} ' es obligatoria y debe ser de tipo 'String'. Sólo se permiten letras alfanuméricas, ' _ ', '-'.", "requirestring": "la propiedad `{0}` es obligatoria y debe ser de tipo \"string\"", "showViewlet": "Mostrar {0}", "view": "Ver" diff --git a/i18n/esn/src/vs/workbench/api/browser/viewsExtensionPoint.i18n.json b/i18n/esn/src/vs/workbench/api/browser/viewsExtensionPoint.i18n.json index f643547c401..6ab80fb8ae1 100644 --- a/i18n/esn/src/vs/workbench/api/browser/viewsExtensionPoint.i18n.json +++ b/i18n/esn/src/vs/workbench/api/browser/viewsExtensionPoint.i18n.json @@ -14,6 +14,11 @@ "vscode.extension.contributes.view.when": "Condición que se debe cumplir para mostrar esta vista", "vscode.extension.contributes.views": "Aporta vistas al editor", "views.explorer": "Aporta vistas al contenedor del explorador en la barra de actividades", + "views.debug": "Contribuye vistas al contenedor de depuración en la barra de actividades", + "views.scm": "Contribuye vistas al contenedor SCM en la barra de actividades", + "views.test": "Contribuye vistas al contenedor de pruebas en la barra de actividades", + "views.contributed": "Contribuye vistas al contenedor de vistas aportadas", + "ViewContainerDoesnotExist": "Contenedor de vistas ' {0} ' no existe y todas las vistas registradas se agregarán al 'Explorer'.", "duplicateView1": "No se pueden registrar múltiples vistas con el mismo identificador '{0}' en la ubicación '{1}'", "duplicateView2": "Una vista con el identificador '{0}' ya está registrada en la ubicación '{1}'" } \ No newline at end of file diff --git a/i18n/esn/src/vs/workbench/api/electron-browser/mainThreadSaveParticipant.i18n.json b/i18n/esn/src/vs/workbench/api/electron-browser/mainThreadSaveParticipant.i18n.json index 754cfd39b02..40e2044209f 100644 --- a/i18n/esn/src/vs/workbench/api/electron-browser/mainThreadSaveParticipant.i18n.json +++ b/i18n/esn/src/vs/workbench/api/electron-browser/mainThreadSaveParticipant.i18n.json @@ -7,6 +7,7 @@ "Do not edit this file. It is machine generated." ], "timeout.formatOnSave": "Anular la aplicación de formato al guardar después de {0} ms", + "codeActionsOnSave.didTimeout": "codeActionsOnSave anulado después de {0} ms", "timeout.onWillSave": "Se anuló onWillSaveTextDocument-event después de 1750 ms", "saveParticipants": "Ejecutando Guardar Participantes..." } \ No newline at end of file diff --git a/i18n/esn/src/vs/workbench/parts/debug/browser/breakpointsView.i18n.json b/i18n/esn/src/vs/workbench/parts/debug/browser/breakpointsView.i18n.json index 37e9aafcaca..e9308047b46 100644 --- a/i18n/esn/src/vs/workbench/parts/debug/browser/breakpointsView.i18n.json +++ b/i18n/esn/src/vs/workbench/parts/debug/browser/breakpointsView.i18n.json @@ -6,7 +6,7 @@ "--------------------------------------------------------------------------------------------", "Do not edit this file. It is machine generated." ], - "logPoint": "Punto de registro", + "logPoint": "Logpoint", "breakpoint": "Punto de interrupción", "editBreakpoint": "Editar {0}...", "removeBreakpoint": "Quitar {0}", @@ -17,7 +17,7 @@ "breakpointUnverifieddHover": "Punto de interrupción no comprobado", "functionBreakpointUnsupported": "Este tipo de depuración no admite puntos de interrupción en funciones", "breakpointDirtydHover": "Punto de interrupción no comprobado. El archivo se ha modificado, reinicie la sesión de depuración.", - "logBreakpointUnsupported": "Este tipo de depuración no admite puntos de registro", + "logBreakpointUnsupported": "Logpoints no son compatible con este tipo de depuración", "conditionalBreakpointUnsupported": "Este tipo de depuración no es compatible con los puntos de interrupción condicionales.", "hitBreakpointUnsupported": "Este tipo de depuración no admite el uso de puntos de interrupción condicionales" } \ No newline at end of file diff --git a/i18n/esn/src/vs/workbench/parts/debug/browser/debugEditorActions.i18n.json b/i18n/esn/src/vs/workbench/parts/debug/browser/debugEditorActions.i18n.json index 83395706f58..4ba559b6283 100644 --- a/i18n/esn/src/vs/workbench/parts/debug/browser/debugEditorActions.i18n.json +++ b/i18n/esn/src/vs/workbench/parts/debug/browser/debugEditorActions.i18n.json @@ -8,7 +8,7 @@ ], "toggleBreakpointAction": "Depuración: Alternar punto de interrupción", "conditionalBreakpointEditorAction": "Depuración: agregar punto de interrupción condicional...", - "logPointEditorAction": "Depurar: agregar punto de registro...", + "logPointEditorAction": "Depuración: Añadir Logpoint...", "runToCursor": "Ejecutar hasta el cursor", "debugEvaluate": "Depuración: Evaluar", "debugAddToWatch": "Depuración: Agregar a inspección", diff --git a/i18n/esn/src/vs/workbench/parts/debug/electron-browser/debugEditorContribution.i18n.json b/i18n/esn/src/vs/workbench/parts/debug/electron-browser/debugEditorContribution.i18n.json index 42d36b69237..4620386089f 100644 --- a/i18n/esn/src/vs/workbench/parts/debug/electron-browser/debugEditorContribution.i18n.json +++ b/i18n/esn/src/vs/workbench/parts/debug/electron-browser/debugEditorContribution.i18n.json @@ -6,7 +6,7 @@ "--------------------------------------------------------------------------------------------", "Do not edit this file. It is machine generated." ], - "logPoint": "Punto de registro", + "logPoint": "Logpoint", "breakpoint": "Punto de interrupción", "removeBreakpoint": "Quitar {0}", "editBreakpoint": "Editar {0}...", @@ -25,7 +25,8 @@ "enableBreakpointOnLine": "Habilitar punto de interrupción de línea", "addBreakpoint": "Agregar punto de interrupción", "addConditionalBreakpoint": "Agregar punto de interrupción condicional...", - "addLogPoint": "Agregar punto de registro...", + "addLogPoint": "Añadir Logpoint...", + "breakpointHasCondition": "Este {0} tiene una {1} que se perderá al quitarla. Considere la posibilidad de desactivar el {0} en su lugar.", "message": "mensaje", "condition": "condición", "removeLogPoint": "Quitar {0}", diff --git a/i18n/esn/src/vs/workbench/parts/extensions/electron-browser/extensionEditor.i18n.json b/i18n/esn/src/vs/workbench/parts/extensions/electron-browser/extensionEditor.i18n.json index cfe207de40c..b632b359f0d 100644 --- a/i18n/esn/src/vs/workbench/parts/extensions/electron-browser/extensionEditor.i18n.json +++ b/i18n/esn/src/vs/workbench/parts/extensions/electron-browser/extensionEditor.i18n.json @@ -36,6 +36,7 @@ "view location": "Donde", "localizations": "Localizaciones ({0}) ", "localizations language id": "ID. de idioma", + "localizations language name": "Nombre de idioma", "localizations localized language name": "Nombre de idioma (localizado)", "colorThemes": "Temas de color ({0})", "iconThemes": "Temas de icono ({0})", diff --git a/i18n/esn/src/vs/workbench/parts/files/electron-browser/fileActions.i18n.json b/i18n/esn/src/vs/workbench/parts/files/electron-browser/fileActions.i18n.json index 6b6e51838a6..42695684614 100644 --- a/i18n/esn/src/vs/workbench/parts/files/electron-browser/fileActions.i18n.json +++ b/i18n/esn/src/vs/workbench/parts/files/electron-browser/fileActions.i18n.json @@ -33,9 +33,13 @@ "trashFailed": "No se pudo eliminar usando la papelera. ¿Desea eliminar de forma permanente?", "deletePermanentlyButtonLabel": "&&Eliminar de forma permanente", "retryButtonLabel": "&&Reintentar", + "confirmMoveTrashMessageFilesAndDirectories": "¿Está seguro que desea eliminar los siguientes archivos/directorios de {0} y su contenido?", + "confirmMoveTrashMessageMultipleDirectories": "¿Está seguro que desea eliminar los siguientes directorios de {0} y su contenido?", "confirmMoveTrashMessageMultiple": "¿Está seguro de que desea eliminar los siguientes archivos {0}?", "confirmMoveTrashMessageFolder": "¿Está seguro de que desea eliminar '{0}' y su contenido?", "confirmMoveTrashMessageFile": "¿Está seguro de que desea eliminar '{0}'?", + "confirmDeleteMessageFilesAndDirectories": "¿Está seguro que desea eliminar permanentemente los archivos/directorios siguientes {0} y su contenido?", + "confirmDeleteMessageMultipleDirectories": "¿Está seguro que desea eliminar permanentemente los siguientes directorios de {0} y su contenido?", "confirmDeleteMessageMultiple": "¿Está seguro de que desea eliminar de forma permanente los siguientes archivos {0}?", "confirmDeleteMessageFolder": "¿Está seguro de que desea eliminar '{0}' y su contenido de forma permanente?", "confirmDeleteMessageFile": "¿Está seguro de que desea eliminar '{0}' de forma permanente?", diff --git a/i18n/esn/src/vs/workbench/parts/localizations/electron-browser/localizations.contribution.i18n.json b/i18n/esn/src/vs/workbench/parts/localizations/electron-browser/localizations.contribution.i18n.json index d591b463a2e..2acd632d22e 100644 --- a/i18n/esn/src/vs/workbench/parts/localizations/electron-browser/localizations.contribution.i18n.json +++ b/i18n/esn/src/vs/workbench/parts/localizations/electron-browser/localizations.contribution.i18n.json @@ -10,7 +10,9 @@ "yes": "Sí", "no": "No", "neverAgain": "No volver a mostrar", + "install language pack": "En un futuro próximo, VS Code sólo soportará paquetes de idiomas en forma de extensiones de Marketplace. Instale la extensión ' {0} ' para continuar utilizando el idioma configurado actualmente. ", "install": "Instalar", + "more information": "Más información...", "JsonSchema.locale": "Idioma de la interfaz de usuario que debe usarse.", "vscode.extension.contributes.localizations": "Contribuye a la localización del editor", "vscode.extension.contributes.localizations.languageId": "Identificador del idioma en el que se traducen las cadenas de visualización.", diff --git a/i18n/esn/src/vs/workbench/parts/markers/electron-browser/markersPanel.i18n.json b/i18n/esn/src/vs/workbench/parts/markers/electron-browser/markersPanel.i18n.json index a3e789a9af7..04f7dd0d774 100644 --- a/i18n/esn/src/vs/workbench/parts/markers/electron-browser/markersPanel.i18n.json +++ b/i18n/esn/src/vs/workbench/parts/markers/electron-browser/markersPanel.i18n.json @@ -6,6 +6,6 @@ "--------------------------------------------------------------------------------------------", "Do not edit this file. It is machine generated." ], - "disableFilesExclude": "Desactivar la exclusión de archivos.", + "disableFilesExclude": "Desactivar filtro de exclusión de archivos.", "clearFilter": "Borrar el filtro." } \ No newline at end of file diff --git a/i18n/esn/src/vs/workbench/parts/markers/electron-browser/messages.i18n.json b/i18n/esn/src/vs/workbench/parts/markers/electron-browser/messages.i18n.json index 6a0bda8b6c1..90352e08b0c 100644 --- a/i18n/esn/src/vs/workbench/parts/markers/electron-browser/messages.i18n.json +++ b/i18n/esn/src/vs/workbench/parts/markers/electron-browser/messages.i18n.json @@ -15,6 +15,9 @@ "markers.panel.aria.label.problems.tree": "Problemas agrupados por archivos", "markers.panel.no.problems.build": "Hasta el momento, no se encontraron problemas en el área de trabajo.", "markers.panel.no.problems.filters": "No se encontraron resultados con los criterios de filtro proporcionados.", + "markers.panel.no.problems.file.exclusions": "Todos los problemas se ocultan porque el filtro de exclusión de archivos está habilitado.", + "markers.panel.action.useFilesExclude": "Filtrar usando la configuración para excluir archivos", + "markers.panel.action.donotUseFilesExclude": "No utilice opción para excluir archivos", "markers.panel.action.filter": "Filtrar problemas", "markers.panel.filter.ariaLabel": "Filtrar problemas", "markers.panel.filter.placeholder": "Filtro. Por ejemplo: text, **/*.ts, !**/node_modules/**", diff --git a/i18n/esn/src/vs/workbench/parts/search/electron-browser/search.contribution.i18n.json b/i18n/esn/src/vs/workbench/parts/search/electron-browser/search.contribution.i18n.json index fc682127315..99fee11481c 100644 --- a/i18n/esn/src/vs/workbench/parts/search/electron-browser/search.contribution.i18n.json +++ b/i18n/esn/src/vs/workbench/parts/search/electron-browser/search.contribution.i18n.json @@ -10,6 +10,8 @@ "copyMatchLabel": "Copiar", "copyPathLabel": "Copiar ruta de acceso", "copyAllLabel": "Copiar todo", + "clearSearchHistoryLabel": "Borrar historial de búsqueda", + "toggleSearchViewPositionLabel": "Alternar la posición de vista de búsqueda", "findInFolder": "Buscar en carpeta...", "findInWorkspace": "Buscar en área de trabajo...", "showTriggerActions": "Ir al símbolo en el área de trabajo...", @@ -28,5 +30,6 @@ "search.quickOpen.includeSymbols": "Configurar para incluir los resultados de una búsqueda global de símbolos en los resultados de archivos de Quick Open.", "search.followSymlinks": "Controla si debe seguir enlaces simbólicos durante la búsqueda.", "search.smartCase": "Proporciona busquedas de mayúsculas y minúsculas si el patrón es todo en minúsculas, de lo contrario, busca en mayúsculas y minúsculas", - "search.globalFindClipboard": "Controla si la vista de búsqueda debe leer o modificar el portapapeles de búsqueda compartido en macOS" + "search.globalFindClipboard": "Controla si la vista de búsqueda debe leer o modificar el portapapeles de búsqueda compartido en macOS", + "search.location": "Controla si la búsqueda se mostrará como una vista en la barra lateral o como un panel en el área del panel para un espacio más horizontal. La siguiente versión de la búsqueda en el panel tendrá un mejor diseño horizontal y esto ya no será una vista previa." } \ No newline at end of file diff --git a/i18n/esn/src/vs/workbench/parts/tasks/common/taskDefinitionRegistry.i18n.json b/i18n/esn/src/vs/workbench/parts/tasks/common/taskDefinitionRegistry.i18n.json index e7d2110a6b9..9da03cb11e7 100644 --- a/i18n/esn/src/vs/workbench/parts/tasks/common/taskDefinitionRegistry.i18n.json +++ b/i18n/esn/src/vs/workbench/parts/tasks/common/taskDefinitionRegistry.i18n.json @@ -6,7 +6,7 @@ "--------------------------------------------------------------------------------------------", "Do not edit this file. It is machine generated." ], - "TaskDefinition.description": "Tipo de tarea real", + "TaskDefinition.description": "Tenga en cuenta que los tipos que empiezan con ' $ ' están reservados para uso interno.", "TaskDefinition.properties": "Propiedades adicionales del tipo de tarea", "TaskTypeConfiguration.noType": "La configuración del tipo de tarea no tiene la propiedad \"taskType\" requerida.", "TaskDefinitionExtPoint": "Aporta tipos de tarea" diff --git a/i18n/esn/src/vs/workbench/parts/tasks/electron-browser/terminalTaskSystem.i18n.json b/i18n/esn/src/vs/workbench/parts/tasks/electron-browser/terminalTaskSystem.i18n.json index 9dd0a325399..85eb01f4a35 100644 --- a/i18n/esn/src/vs/workbench/parts/tasks/electron-browser/terminalTaskSystem.i18n.json +++ b/i18n/esn/src/vs/workbench/parts/tasks/electron-browser/terminalTaskSystem.i18n.json @@ -11,6 +11,6 @@ "TerminalTaskSystem.terminalName": "Tarea - {0}", "closeTerminal": "Pulse cualquier tecla para cerrar el terminal", "reuseTerminal": "Las tareas reutilizarán el terminal, presione cualquier tecla para cerrarlo.", - "TerminalTaskSystem": "No se puede ejecutar un comando shell en una unidad UNC.", + "TerminalTaskSystem": "No se puede ejecutar un comando Shell en una unidad UNC mediante cmd.exe.", "unkownProblemMatcher": "No puede resolver el comprobador de problemas {0}. Será omitido." } \ No newline at end of file diff --git a/i18n/esn/src/vs/workbench/parts/welcome/page/electron-browser/vs_code_welcome_page.i18n.json b/i18n/esn/src/vs/workbench/parts/welcome/page/electron-browser/vs_code_welcome_page.i18n.json index c28887631f1..1aeddaa7cdc 100644 --- a/i18n/esn/src/vs/workbench/parts/welcome/page/electron-browser/vs_code_welcome_page.i18n.json +++ b/i18n/esn/src/vs/workbench/parts/welcome/page/electron-browser/vs_code_welcome_page.i18n.json @@ -27,6 +27,7 @@ "welcomePage.installExtensionPacks": "Herramientas y lenguajes", "welcomePage.installExtensionPacksDescription": "Instalar soporte para {0} y {1}", "welcomePage.moreExtensions": "más", + "welcomePage.installKeymapDescription": "Configuraciones y combinaciones de teclas", "welcomePage.installKeymapExtension": "Instalar la configuración y los métodos abreviados de teclado de {0} y {1}", "welcomePage.others": "otros", "welcomePage.colorTheme": "Tema de color", diff --git a/i18n/esn/src/vs/workbench/services/configuration/common/configurationExtensionPoint.i18n.json b/i18n/esn/src/vs/workbench/services/configuration/common/configurationExtensionPoint.i18n.json index dbb7b5b3009..18188069ebf 100644 --- a/i18n/esn/src/vs/workbench/services/configuration/common/configurationExtensionPoint.i18n.json +++ b/i18n/esn/src/vs/workbench/services/configuration/common/configurationExtensionPoint.i18n.json @@ -8,6 +8,7 @@ ], "vscode.extension.contributes.configuration.title": "Resumen de la configuración. Esta etiqueta se usará en el archivo de configuración como comentario divisor.", "vscode.extension.contributes.configuration.properties": "Descripción de las propiedades de configuración.", + "scope.application.description": "Configuración específica de aplicación, que puede ser configurado en configuración de usuario.", "scope.window.description": "Configuración específica para ventanas, que se puede definir en la configuración de usuario o de área de trabajo.", "scope.resource.description": "Configuración específica para recursos, que se puede definir en la configuración de usuario, de área de trabajo o de carpeta.", "scope.description": "Ámbito donde es aplicable la configuración. Los ámbitos disponibles son \"window\" y \"resource\".", diff --git a/i18n/esn/src/vs/workbench/services/configurationResolver/node/variableResolver.i18n.json b/i18n/esn/src/vs/workbench/services/configurationResolver/node/variableResolver.i18n.json index 1f9de833c22..36f359788cf 100644 --- a/i18n/esn/src/vs/workbench/services/configurationResolver/node/variableResolver.i18n.json +++ b/i18n/esn/src/vs/workbench/services/configurationResolver/node/variableResolver.i18n.json @@ -10,6 +10,11 @@ "configNotFound": "'{0}' puede no resolverse porque la configuración '{1}' no fué encontrada. ", "configNoString": "'{0}' puede no resolverse porque '{1}' es un valor estructurado.", "missingConfigName": "'{0}' no puede resolverse porque no tiene asignado un nombre de configuración . ", + "noValueForCommand": "{0} ' no se puede resolver porque el comando no tiene ningún valor.", + "canNotFindFolder": "' {0} ' no se puede resolver. No existe la carpeta ' {1} '.", "canNotResolveWorkspaceFolderMultiRoot": "'{0}' no puede ser resuelto en un espacio de trabajo multicarpeta. Defina el alcance de esta variable utilizando ':' y un nombre de carpeta del espacio de trabajo. ", - "canNotResolveWorkspaceFolder": "'{0}' no puede ser resuelto. Por favor, abra una carpeta." + "canNotResolveWorkspaceFolder": "'{0}' no puede ser resuelto. Por favor, abra una carpeta.", + "canNotResolveFile": "'{0}' no puede resolver. Por favor, abra un editor.", + "canNotResolveLineNumber": "' {0} ' no se puede resolver. Asegúrese de tener una línea seleccionada en el editor activo.", + "canNotResolveSelectedText": "' {0} ' no se puede resolver. Asegúrese de tener un texto seleccionado en el editor activo." } \ No newline at end of file diff --git a/i18n/esn/src/vs/workbench/services/extensions/common/extensionsRegistry.i18n.json b/i18n/esn/src/vs/workbench/services/extensions/common/extensionsRegistry.i18n.json index dd5c8e077c6..314e93bb520 100644 --- a/i18n/esn/src/vs/workbench/services/extensions/common/extensionsRegistry.i18n.json +++ b/i18n/esn/src/vs/workbench/services/extensions/common/extensionsRegistry.i18n.json @@ -25,6 +25,7 @@ "vscode.extension.activationEvents.onDebugResolve": "Un evento de activación emitido cada vez que esté a punto de ser iniciada una sesión de depuración con el tipo específico (y se necesite llamar al método resolveDebugConfiguration correspondiente).", "vscode.extension.activationEvents.workspaceContains": "Un evento de activación emitido cada vez que se abre una carpeta que contiene al menos un archivo que coincide con el patrón global especificado.", "vscode.extension.activationEvents.onView": "Un evento de activación emitido cada vez que se expande la vista especificada.", + "vscode.extension.activationEvents.onUri": "Se emite un evento de activación siempre cuando se abre un identificador URI de todo el sistema dirigido hacia esta extensión.", "vscode.extension.activationEvents.star": "Un evento de activación emitido al inicio de VS Code. Para garantizar una buena experiencia para el usuario final, use este evento de activación en su extensión solo cuando no le sirva ninguna otra combinación de eventos de activación en su caso.", "vscode.extension.badges": "Matriz de distintivos que se muestran en la barra lateral de la página de extensiones de Marketplace.", "vscode.extension.badges.url": "URL de la imagen del distintivo.", diff --git a/i18n/esn/src/vs/workbench/services/files/electron-browser/remoteFileService.i18n.json b/i18n/esn/src/vs/workbench/services/files/electron-browser/remoteFileService.i18n.json index 656532917aa..e304760f37c 100644 --- a/i18n/esn/src/vs/workbench/services/files/electron-browser/remoteFileService.i18n.json +++ b/i18n/esn/src/vs/workbench/services/files/electron-browser/remoteFileService.i18n.json @@ -10,5 +10,6 @@ "fileIsDirectoryError": "El archivo es un directorio", "fileNotModifiedError": "Archivo no modificado desde", "fileBinaryError": "El archivo parece ser binario y no se puede abrir como texto", - "err.create": "No se pudo crear el archivo {0}" + "err.create": "No se pudo crear el archivo {0}", + "fileMoveConflict": "No se puede mover o copiar. El archivo ya existe en la ubicación de destino. " } \ No newline at end of file diff --git a/i18n/fra/extensions/git/out/commands.i18n.json b/i18n/fra/extensions/git/out/commands.i18n.json index 1fe6735dc5d..d3829c0982f 100644 --- a/i18n/fra/extensions/git/out/commands.i18n.json +++ b/i18n/fra/extensions/git/out/commands.i18n.json @@ -11,9 +11,7 @@ "create branch": "$(plus) Créer nouvelle branche", "repourl": "URL du dépôt", "parent": "Répertoire parent", - "cancel": "$(sync~spin) Clonage du dépôt... Cliquer pour annuler", - "cancel tooltip": "Annuler le clonage", - "cloning": "Clonage du dépôt git...", + "cloning": "Clonage du dépôt Git '{0}'...", "openrepo": "Ouvrir le dépôt", "proposeopen": "Voulez-vous ouvrir le dépôt cloné ?", "init": "Choisir le dossier d’espace de travail dans lequel initialiser le dépôt git", diff --git a/i18n/fra/extensions/npm/out/npmView.i18n.json b/i18n/fra/extensions/npm/out/npmView.i18n.json index 35229bd6699..164e1b51e39 100644 --- a/i18n/fra/extensions/npm/out/npmView.i18n.json +++ b/i18n/fra/extensions/npm/out/npmView.i18n.json @@ -5,5 +5,7 @@ "Licensed under the MIT License. See License.txt in the project root for license information.", "--------------------------------------------------------------------------------------------", "Do not edit this file. It is machine generated." - ] + ], + "npm.noDebugOptions": "Impossible de lancer \"{0}\" pour le débogage, car les scripts n'ont pas d'option de débogage de nœud, par exemple, \"--inspect-brk\".", + "npm.scriptInvalid": "Script \"{0}\" introuvable. Essayez d'actualiser la vue." } \ No newline at end of file diff --git a/i18n/fra/extensions/npm/package.i18n.json b/i18n/fra/extensions/npm/package.i18n.json index 372b90c5172..b85f2981ff3 100644 --- a/i18n/fra/extensions/npm/package.i18n.json +++ b/i18n/fra/extensions/npm/package.i18n.json @@ -12,10 +12,15 @@ "config.npm.runSilent": "Exécutez les commandes npm avec l'option `--silent`.", "config.npm.packageManager": "Le gestionnaire de paquets utilisé pour exécuter des scripts.", "config.npm.exclude": "Configurer les profils glob pour les dossiers qui doivent être exclus de la détection de script automatique.", + "config.npm.enableScriptExplorer": "Activez une vue Explorateur pour les scripts npm quand l'espace de travail contient un fichier 'package.json'.", "npm.parseError": "Détection de tâche Npm : impossible d’analyser le fichier {0}", "taskdef.script": "Le script npm à personnaliser.", "taskdef.path": "Le chemin d’accès au dossier du fichier package.json qui fournit le script. Peut être oublié.", + "view.name": "Scripts npm", "command.refresh": "Actualiser", + "command.run": "Exécuter", "command.debug": "Déboguer", - "command.openScript": "Ouvrir" + "command.openScript": "Ouvrir", + "npm.scriptInvalid": "Script '{0}' introuvable. Essayez d'actualiser la vue.", + "npm.noDebugOptions": "Impossible de lancer '{0}' pour le débogage, car les scripts n'ont pas d'option de débogage de nœud, par exemple, '--inspect-brk'." } \ No newline at end of file diff --git a/i18n/fra/src/vs/code/electron-main/menus.i18n.json b/i18n/fra/src/vs/code/electron-main/menus.i18n.json index 96efb700a07..f96cf1ace9e 100644 --- a/i18n/fra/src/vs/code/electron-main/menus.i18n.json +++ b/i18n/fra/src/vs/code/electron-main/menus.i18n.json @@ -146,7 +146,7 @@ "miConditionalBreakpoint": "Point d'arrêt &&conditionnel...", "miColumnBreakpoint": "P&&oint d'arrêt de la colonne", "miFunctionBreakpoint": "Point d'arrêt sur &&fonction...", - "miLogPoint": "&&Log Point...", + "miLogPoint": "&&Point de journalisation...", "miNewBreakpoint": "&&Nouveau point d'arrêt", "miEnableAllBreakpoints": "Activer tous les points d'arrêt", "miDisableAllBreakpoints": "Désacti&&ver tous les points d'arrêt", diff --git a/i18n/fra/src/vs/editor/common/config/commonEditorConfig.i18n.json b/i18n/fra/src/vs/editor/common/config/commonEditorConfig.i18n.json index 5be70689027..7e39a89e939 100644 --- a/i18n/fra/src/vs/editor/common/config/commonEditorConfig.i18n.json +++ b/i18n/fra/src/vs/editor/common/config/commonEditorConfig.i18n.json @@ -107,12 +107,11 @@ "colorDecorators": "Contrôle si l'éditeur doit afficher les éléments décoratifs de couleurs inline et le sélecteur de couleurs.", "codeActions": "Active l'ampoule d'action de code", "codeActionsOnSave.organizeImports": "Exécuter organiser les importations lors de l'enregistrement ?", - "codeActionsOnSave": "Types d'actions de code à exécuter lors de l'enregistrement.", + "codeActionsOnSave": "Types d'action de code à exécuter à l'enregistrement.", "codeActionsOnSaveTimeout": "Délai d'attente pour les actions de code exécutées lors de l'enregistrement.", "selectionClipboard": "Contrôle si le presse-papiers primaire Linux doit être pris en charge.", "sideBySide": "Contrôle si l'éditeur de différences affiche les différences en mode côte à côte ou inline", "ignoreTrimWhitespace": "Contrôle si l'éditeur de différences affiche les changements liés aux espaces blancs de début ou de fin comme des différences", - "largeFileSize": "Contrôles le seuil de la taille de fichier en octets au-delà de laquelle les règles d’optimisation spéciale sont appliquées", - "largeFileLineCount": "Contrôle le seuil de taille de fichier en terme de nombre de lignes au-delà de laquelle les règles d’optimisation spéciale sont appliquées", + "largeFileOptimizations": "Traitement spécial des fichiers volumineux pour désactiver certaines fonctionnalités utilisant beaucoup de mémoire.", "renderIndicators": "Contrôle si l'éditeur de différences affiche les indicateurs +/- pour les modifications ajoutées/supprimées" } \ No newline at end of file diff --git a/i18n/fra/src/vs/platform/theme/common/colorRegistry.i18n.json b/i18n/fra/src/vs/platform/theme/common/colorRegistry.i18n.json index 7d6e9ec8360..8ae0bac8c1d 100644 --- a/i18n/fra/src/vs/platform/theme/common/colorRegistry.i18n.json +++ b/i18n/fra/src/vs/platform/theme/common/colorRegistry.i18n.json @@ -29,6 +29,7 @@ "inputPlaceholderForeground": "Couleur de premier plan de la zone d'entrée pour le texte d'espace réservé.", "inputValidationInfoBackground": "Couleur d'arrière-plan de la validation d'entrée pour la gravité des informations.", "inputValidationInfoBorder": "Couleur de bordure de la validation d'entrée pour la gravité des informations.", + "inputValidationWarningBackground": "Couleur d'arrière-plan de la validation d'entrée pour la gravité de l'avertissement.", "inputValidationWarningBorder": "Couleur de bordure de la validation d'entrée pour la gravité de l'avertissement.", "inputValidationErrorBackground": "Couleur d'arrière-plan de la validation d'entrée pour la gravité de l'erreur.", "inputValidationErrorBorder": "Couleur de bordure de la validation d'entrée pour la gravité de l'erreur. ", @@ -70,8 +71,10 @@ "editorSelectionHighlightBorder": "Couleur de bordure des régions dont le contenu est identique à la sélection.", "editorFindMatch": "Couleur du résultat de recherche actif.", "findMatchHighlight": "Couleur des autres résultats de recherche correspondants. La couleur doit ne pas être opaque afin de ne pas masquer les décorations sous-jacentes.", + "findRangeHighlight": "Couleur de la plage limitant la recherche. La couleur ne doit pas être opaque pour ne pas masquer les décorations sous-jacentes.", "editorFindMatchBorder": "Couleur de bordure du résultat de recherche actif.", "findMatchHighlightBorder": "Couleur de bordure des autres résultats de recherche.", + "findRangeHighlightBorder": "Couleur de la bordure limitant la recherche. La couleur ne doit pas être opaque pour ne pas masquer les décorations sous-jacentes. ", "hoverHighlight": "Mettre en surbrillance ci-dessous le mot pour lequel un survol est affiché. La couleur doit ne pas être opaque afin de ne pas masquer les décorations sous-jacentes.", "hoverBackground": "Couleur d'arrière-plan du pointage de l'éditeur.", "hoverBorder": "Couleur de bordure du pointage de l'éditeur.", @@ -85,6 +88,7 @@ "mergeIncomingHeaderBackground": "Arrière-plan de l'en-tête qui arrive dans les conflits de fusion inline. La couleur doit ne pas être opaque afin de ne pas masquer les décorations sous-jacentes.", "mergeIncomingContentBackground": "Arrière-plan du contenu qui arrive dans les conflits de fusion inline. La couleur doit ne pas être opaque afin de ne pas masquer les décorations sous-jacentes.", "mergeCommonHeaderBackground": "Arrière-plan de l'en-tête de l'ancêtre commun dans les conflits de fusion inline. La couleur doit ne pas être opaque afin de ne pas masquer les décorations sous-jacentes.", + "mergeCommonContentBackground": "Arrière-plan du contenu de l'ancêtre commun dans les conflits de fusion inline. La couleur ne doit pas être opaque pour ne pas masquer les décorations sous-jacentes.", "mergeBorder": "Couleur de bordure des en-têtes et du séparateur dans les conflits de fusion inline.", "overviewRulerCurrentContentForeground": "Premier plan de la règle d'aperçu actuelle pour les conflits de fusion inline.", "overviewRulerIncomingContentForeground": "Premier plan de la règle d'aperçu entrante pour les conflits de fusion inline.", diff --git a/i18n/fra/src/vs/platform/url/electron-browser/inactiveExtensionUrlHandler.i18n.json b/i18n/fra/src/vs/platform/url/electron-browser/inactiveExtensionUrlHandler.i18n.json index 35229bd6699..b610699043e 100644 --- a/i18n/fra/src/vs/platform/url/electron-browser/inactiveExtensionUrlHandler.i18n.json +++ b/i18n/fra/src/vs/platform/url/electron-browser/inactiveExtensionUrlHandler.i18n.json @@ -5,5 +5,6 @@ "Licensed under the MIT License. See License.txt in the project root for license information.", "--------------------------------------------------------------------------------------------", "Do not edit this file. It is machine generated." - ] + ], + "confirmUrl": "Vous voulez laisser l'extension {0} ouvrir l'URL suivante ?" } \ No newline at end of file diff --git a/i18n/fra/src/vs/workbench/api/browser/viewsContainersExtensionPoint.i18n.json b/i18n/fra/src/vs/workbench/api/browser/viewsContainersExtensionPoint.i18n.json index 2f2efe76489..698e3a6abb9 100644 --- a/i18n/fra/src/vs/workbench/api/browser/viewsContainersExtensionPoint.i18n.json +++ b/i18n/fra/src/vs/workbench/api/browser/viewsContainersExtensionPoint.i18n.json @@ -8,10 +8,13 @@ ], "vscode.extension.contributes.views.containers.id": "Identificateur unique utilisé pour identifier le conteneur dans lequel les vues peuvent être contribuées en utilisant le point de contribution 'views'.", "vscode.extension.contributes.views.containers.title": "Chaîne lisible par un humain permettant d'afficher le conteneur", - "vscode.extension.contributes.views.containers.icon": "Chemin d’accès à l’icône de conteneur", - "vscode.extension.contributes.viewsContainer": "Contribue aux conteneurs de vues vers l’éditeur", + "vscode.extension.contributes.views.containers.icon": "Chemin de l'icône du conteneur. Les icônes ont une taille de 24x24 centrée dans un rectangle de 50x40, et leur couleur de remplissage est 'rgb(215, 218, 224)' ou '#d7dae0'. Les icônes doivent être de préférence au format SVG, mais tous les types de fichier image sont acceptés.", + "vscode.extension.contributes.viewsContainers": "Contribue aux conteneurs de vues vers l’éditeur", "views.container.activitybar": "Les conteneurs visuels contribuent à la barre d'activité", + "test": "Test", + "proposed": "La contribution 'viewsContainers' est disponible uniquement pour l'exécution en dehors de dev ou avec le commutateur de ligne de commande suivant : --enable-proposed-api {0}", "requirearray": "les conteneurs de vues doivent être un tableau", + "requireidstring": "La propriété '{0}' est obligatoire et doit être de type 'string'. Sont autorisés uniquement les caractères alphanumériques, '_', '-'.", "requirestring": "la propriété '{0}' est obligatoire et doit être de type 'string'", "showViewlet": "Afficher {0}", "view": "Affichage" diff --git a/i18n/fra/src/vs/workbench/api/browser/viewsExtensionPoint.i18n.json b/i18n/fra/src/vs/workbench/api/browser/viewsExtensionPoint.i18n.json index 89809f57278..fc507ea6db4 100644 --- a/i18n/fra/src/vs/workbench/api/browser/viewsExtensionPoint.i18n.json +++ b/i18n/fra/src/vs/workbench/api/browser/viewsExtensionPoint.i18n.json @@ -16,7 +16,9 @@ "views.explorer": "Les vues dans le conteneur \"Explorer\" contribuent à la barre d'activité", "views.debug": "Les vues dans le conteneur de débogage contribuent à la barre d'activité", "views.scm": "Les vues dans le conteneur \"SCM\" contribuent à la barre d'activité", + "views.test": "Fournit des vues du conteneur de test dans la barre d'activités", "views.contributed": "Les vues contribuent au conteneur de vues contributives", + "ViewContainerDoesnotExist": "Le conteneur de vues '{0}' n'existe pas et toutes les vues inscrites dans ce conteneur sont ajoutées à l''Explorateur'.", "duplicateView1": "Impossible d’enregistrer des vues multiples avec le même id '{0}'» dans l’emplacement '{1}'", "duplicateView2": "Une vue avec l’id `{0}` est déjà enregistrée à l’emplacement `{1}`" } \ No newline at end of file diff --git a/i18n/fra/src/vs/workbench/api/electron-browser/mainThreadSaveParticipant.i18n.json b/i18n/fra/src/vs/workbench/api/electron-browser/mainThreadSaveParticipant.i18n.json index 6ad0b22d7ed..8e1c626a771 100644 --- a/i18n/fra/src/vs/workbench/api/electron-browser/mainThreadSaveParticipant.i18n.json +++ b/i18n/fra/src/vs/workbench/api/electron-browser/mainThreadSaveParticipant.i18n.json @@ -7,6 +7,7 @@ "Do not edit this file. It is machine generated." ], "timeout.formatOnSave": "Format avorté lors de l'enregistrement après {0} ms", + "codeActionsOnSave.didTimeout": "codeActionsOnSave abandonné au bout de {0} ms", "timeout.onWillSave": "OnWillSaveTextDocument-event avorté après 1750 ms", "saveParticipants": "Exécution de la sauvegarde des participants..." } \ No newline at end of file diff --git a/i18n/fra/src/vs/workbench/parts/debug/browser/breakpointsView.i18n.json b/i18n/fra/src/vs/workbench/parts/debug/browser/breakpointsView.i18n.json index fb0dbefa590..ea17513fd0b 100644 --- a/i18n/fra/src/vs/workbench/parts/debug/browser/breakpointsView.i18n.json +++ b/i18n/fra/src/vs/workbench/parts/debug/browser/breakpointsView.i18n.json @@ -6,7 +6,7 @@ "--------------------------------------------------------------------------------------------", "Do not edit this file. It is machine generated." ], - "logPoint": "Log Point", + "logPoint": "Point de journalisation", "breakpoint": "Point d'arrêt", "editBreakpoint": "Modifier {0}...", "removeBreakpoint": "Supprimer {0}", @@ -17,7 +17,7 @@ "breakpointUnverifieddHover": "Point d'arrêt non vérifié", "functionBreakpointUnsupported": "Les points d'arrêt de fonction ne sont pas pris en charge par ce type de débogage", "breakpointDirtydHover": "Point d'arrêt non vérifié. Fichier modifié. Redémarrez la session de débogage.", - "logBreakpointUnsupported": "Log points non pris en charge par ce type de débogage", + "logBreakpointUnsupported": "Les points de journalisation ne sont pas pris en charge par ce type de débogage", "conditionalBreakpointUnsupported": "Les points d'arrêt conditionnels ne sont pas pris en charge par ce type de débogage", "hitBreakpointUnsupported": "Les points d'arrêt conditionnels ne sont pas pris en charge par ce type de débogage" } \ No newline at end of file diff --git a/i18n/fra/src/vs/workbench/parts/debug/browser/debugEditorActions.i18n.json b/i18n/fra/src/vs/workbench/parts/debug/browser/debugEditorActions.i18n.json index b9f58b85393..afdaf30af08 100644 --- a/i18n/fra/src/vs/workbench/parts/debug/browser/debugEditorActions.i18n.json +++ b/i18n/fra/src/vs/workbench/parts/debug/browser/debugEditorActions.i18n.json @@ -8,7 +8,7 @@ ], "toggleBreakpointAction": "Déboguer : activer/désactiver un point d'arrêt", "conditionalBreakpointEditorAction": "Déboguer : ajouter un point d'arrêt conditionnel...", - "logPointEditorAction": "Déboguer : ajouter un Log point...", + "logPointEditorAction": "Débogage : Ajouter un point de journalisation...", "runToCursor": "Exécuter jusqu'au curseur", "debugEvaluate": "Déboguer : évaluer", "debugAddToWatch": "Déboguer : ajouter à la fenêtre Espion", diff --git a/i18n/fra/src/vs/workbench/parts/debug/electron-browser/debugEditorContribution.i18n.json b/i18n/fra/src/vs/workbench/parts/debug/electron-browser/debugEditorContribution.i18n.json index b483f4e8224..59ed71c6758 100644 --- a/i18n/fra/src/vs/workbench/parts/debug/electron-browser/debugEditorContribution.i18n.json +++ b/i18n/fra/src/vs/workbench/parts/debug/electron-browser/debugEditorContribution.i18n.json @@ -6,7 +6,7 @@ "--------------------------------------------------------------------------------------------", "Do not edit this file. It is machine generated." ], - "logPoint": "Log Point", + "logPoint": "Point de journalisation", "breakpoint": "Point d'arrêt", "removeBreakpoint": "Supprimer {0}", "editBreakpoint": "Modifier {0}...", @@ -25,7 +25,8 @@ "enableBreakpointOnLine": "Activer le point d'arrêt de la ligne", "addBreakpoint": "Ajouter un point d'arrêt", "addConditionalBreakpoint": "Ajouter un point d'arrêt conditionnel...", - "addLogPoint": "Ajouter un Log Point", + "addLogPoint": "Ajouter un point de journalisation...", + "breakpointHasCondition": "Ce {0} a un {1} qui sera perdu en cas de suppression. Désactivez le {0} à la place.", "message": "message", "condition": "condition", "removeLogPoint": "Supprimer {0}", diff --git a/i18n/fra/src/vs/workbench/parts/files/electron-browser/fileActions.i18n.json b/i18n/fra/src/vs/workbench/parts/files/electron-browser/fileActions.i18n.json index 5c5c91482ed..490bcb83a63 100644 --- a/i18n/fra/src/vs/workbench/parts/files/electron-browser/fileActions.i18n.json +++ b/i18n/fra/src/vs/workbench/parts/files/electron-browser/fileActions.i18n.json @@ -33,9 +33,13 @@ "trashFailed": "Impossible de supprimer en utilisant la corbeille. Voulez-vous supprimer définitivement à la place?", "deletePermanentlyButtonLabel": "Supprimer &&définitivement", "retryButtonLabel": "&&Réessayer", + "confirmMoveTrashMessageFilesAndDirectories": "Voulez-vous vraiment supprimer les {0} fichiers/répertoires suivants et leur contenu ?", + "confirmMoveTrashMessageMultipleDirectories": "Voulez-vous vraiment supprimer les {0} répertoires suivants et leur contenu ?", "confirmMoveTrashMessageMultiple": "Êtes-vous sûr de vouloir supprimer les fichiers {0} suivants ?", "confirmMoveTrashMessageFolder": "Voulez-vous vraiment supprimer '{0}' et son contenu ?", "confirmMoveTrashMessageFile": "Voulez-vous vraiment supprimer '{0}' ?", + "confirmDeleteMessageFilesAndDirectories": "Voulez-vous vraiment supprimer définitivement les {0} fichiers/répertoires suivants et leur contenu ?", + "confirmDeleteMessageMultipleDirectories": "Voulez-vous vraiment supprimer définitivement les {0} répertoires suivants et leur contenu ?", "confirmDeleteMessageMultiple": "Êtes-vous sûr de vouloir supprimer définitivement les fichiers {0} suivants ?", "confirmDeleteMessageFolder": "Voulez-vous vraiment supprimer définitivement '{0}' et son contenu ?", "confirmDeleteMessageFile": "Voulez-vous vraiment supprimer définitivement '{0}' ?", diff --git a/i18n/fra/src/vs/workbench/parts/localizations/electron-browser/localizations.contribution.i18n.json b/i18n/fra/src/vs/workbench/parts/localizations/electron-browser/localizations.contribution.i18n.json index 708807fba13..7a8e6c2de06 100644 --- a/i18n/fra/src/vs/workbench/parts/localizations/electron-browser/localizations.contribution.i18n.json +++ b/i18n/fra/src/vs/workbench/parts/localizations/electron-browser/localizations.contribution.i18n.json @@ -10,7 +10,9 @@ "yes": "Oui", "no": "Non", "neverAgain": "Ne plus afficher", + "install language pack": "Prochainement, VS Code prendra en charge uniquement les modules linguistiques sous forme d'extensions Marketplace. Installez l'extension '{0}' pour continuer à utiliser la langue actuellement configurée.", "install": "Installer", + "more information": "Plus d'informations...", "JsonSchema.locale": "Langue d'interface utilisateur (IU) à utiliser.", "vscode.extension.contributes.localizations": "Contribuer aux localisations de l’éditeur", "vscode.extension.contributes.localizations.languageId": "Id de la langue dans laquelle les chaînes d’affichage sont traduites.", diff --git a/i18n/fra/src/vs/workbench/parts/markers/electron-browser/markersPanel.i18n.json b/i18n/fra/src/vs/workbench/parts/markers/electron-browser/markersPanel.i18n.json index ab82f7468d7..cd138c0c0a8 100644 --- a/i18n/fra/src/vs/workbench/parts/markers/electron-browser/markersPanel.i18n.json +++ b/i18n/fra/src/vs/workbench/parts/markers/electron-browser/markersPanel.i18n.json @@ -6,6 +6,6 @@ "--------------------------------------------------------------------------------------------", "Do not edit this file. It is machine generated." ], - "disableFilesExclude": "Désactiver l'exclusion de fichiers.", + "disableFilesExclude": "Désactivez le filtre d'exclusion de fichiers.", "clearFilter": "Effacer le filtre." } \ No newline at end of file diff --git a/i18n/fra/src/vs/workbench/parts/search/electron-browser/search.contribution.i18n.json b/i18n/fra/src/vs/workbench/parts/search/electron-browser/search.contribution.i18n.json index d563780176c..7cb5620c5e7 100644 --- a/i18n/fra/src/vs/workbench/parts/search/electron-browser/search.contribution.i18n.json +++ b/i18n/fra/src/vs/workbench/parts/search/electron-browser/search.contribution.i18n.json @@ -10,6 +10,7 @@ "copyMatchLabel": "Copier", "copyPathLabel": "Copier le chemin", "copyAllLabel": "Copier tout", + "clearSearchHistoryLabel": "Effacer l'historique de recherche", "toggleSearchViewPositionLabel": "Basculer la position de la vue de Recherche", "findInFolder": "Rechercher dans le dossier...", "findInWorkspace": "Trouver dans l’espace de travail...", diff --git a/i18n/fra/src/vs/workbench/parts/tasks/common/taskDefinitionRegistry.i18n.json b/i18n/fra/src/vs/workbench/parts/tasks/common/taskDefinitionRegistry.i18n.json index 94f71f27855..8c60addc11a 100644 --- a/i18n/fra/src/vs/workbench/parts/tasks/common/taskDefinitionRegistry.i18n.json +++ b/i18n/fra/src/vs/workbench/parts/tasks/common/taskDefinitionRegistry.i18n.json @@ -6,7 +6,7 @@ "--------------------------------------------------------------------------------------------", "Do not edit this file. It is machine generated." ], - "TaskDefinition.description": "Type de tâche réel", + "TaskDefinition.description": "Type de tâche réel. Notez que les types commençant par '$' sont réservés à un usage interne.", "TaskDefinition.properties": "Propriétés supplémentaires du type de tâche", "TaskTypeConfiguration.noType": "La propriété 'taskType' obligatoire est manquante dans la configuration du type de tâche", "TaskDefinitionExtPoint": "Ajoute des types de tâche" diff --git a/i18n/fra/src/vs/workbench/parts/tasks/electron-browser/terminalTaskSystem.i18n.json b/i18n/fra/src/vs/workbench/parts/tasks/electron-browser/terminalTaskSystem.i18n.json index 32c88755962..bc05b3a98d5 100644 --- a/i18n/fra/src/vs/workbench/parts/tasks/electron-browser/terminalTaskSystem.i18n.json +++ b/i18n/fra/src/vs/workbench/parts/tasks/electron-browser/terminalTaskSystem.i18n.json @@ -11,6 +11,6 @@ "TerminalTaskSystem.terminalName": "Tâche - {0}", "closeTerminal": "Appuyez sur n’importe quelle touche pour fermer le terminal.", "reuseTerminal": "Le terminal sera réutilisé par les tâches, appuyez sur une touche pour le fermer.", - "TerminalTaskSystem": "Impossible d'exécuter une commande d'interpréteur de commandes sur un lecteur UNC.", + "TerminalTaskSystem": "Impossible d'exécuter une commande d'interpréteur de commandes sur un lecteur UNC à l'aide de cmd.exe.", "unkownProblemMatcher": "Impossible de résoudre le détecteur de problèmes {0}. Le détecteur est ignoré" } \ No newline at end of file diff --git a/i18n/fra/src/vs/workbench/services/configurationResolver/node/variableResolver.i18n.json b/i18n/fra/src/vs/workbench/services/configurationResolver/node/variableResolver.i18n.json index 287dfd1851a..26aac198556 100644 --- a/i18n/fra/src/vs/workbench/services/configurationResolver/node/variableResolver.i18n.json +++ b/i18n/fra/src/vs/workbench/services/configurationResolver/node/variableResolver.i18n.json @@ -10,6 +10,7 @@ "configNotFound": "'{0}' ne peut pas être résolu car le paramètre '{1}' est introuvable.", "configNoString": "'{0}' ne peut pas être résolu car '{1}' est une valeur structurée.", "missingConfigName": "'{0}' ne peut pas être résolu car aucun nom de paramètre n'est donné.", + "noValueForCommand": "Impossible de résoudre '{0}', car la commande n'a pas de valeur.", "canNotFindFolder": "'{0}' ne peut pas être résolu. Aucun dossier '{1}'.", "canNotResolveWorkspaceFolderMultiRoot": "'{0}' ne peut pas être résolu dans un espace de travail de dossiers multiples. Gérer la portée cette variable en utilisant ':' et un nom de dossier d’espace de travail.", "canNotResolveWorkspaceFolder": "'{0}' ne peut pas être résolu. Veuillez ouvrir un dossier.", diff --git a/i18n/fra/src/vs/workbench/services/extensions/common/extensionsRegistry.i18n.json b/i18n/fra/src/vs/workbench/services/extensions/common/extensionsRegistry.i18n.json index f79185e93b2..89f92a7c3bc 100644 --- a/i18n/fra/src/vs/workbench/services/extensions/common/extensionsRegistry.i18n.json +++ b/i18n/fra/src/vs/workbench/services/extensions/common/extensionsRegistry.i18n.json @@ -25,6 +25,7 @@ "vscode.extension.activationEvents.onDebugResolve": "Événement d'activation envoyé quand une session de débogage du type spécifié est sur le point d’être lancée (et une méthode resolveDebugConfiguration correspondante doit être appelée).", "vscode.extension.activationEvents.workspaceContains": "Événement d'activation envoyé quand un dossier ouvert contient au moins un fichier correspondant au modèle glob spécifié.", "vscode.extension.activationEvents.onView": "Événement d'activation envoyé quand la vue spécifiée est développée.", + "vscode.extension.activationEvents.onUri": "Événement d'activation envoyé quand un URI système dirigé vers cette extension est ouvert.", "vscode.extension.activationEvents.star": "Événement d'activation envoyé au démarrage de VS Code. Pour garantir la qualité de l'expérience utilisateur, utilisez cet événement d'activation dans votre extension uniquement quand aucune autre combinaison d'événements d'activation ne fonctionne dans votre cas d'utilisation.", "vscode.extension.badges": "Ensemble de badges à afficher dans la barre latérale de la page d'extensions de Marketplace.", "vscode.extension.badges.url": "URL de l'image du badge.", diff --git a/i18n/fra/src/vs/workbench/services/files/electron-browser/remoteFileService.i18n.json b/i18n/fra/src/vs/workbench/services/files/electron-browser/remoteFileService.i18n.json index d4eb257e24d..652537726d6 100644 --- a/i18n/fra/src/vs/workbench/services/files/electron-browser/remoteFileService.i18n.json +++ b/i18n/fra/src/vs/workbench/services/files/electron-browser/remoteFileService.i18n.json @@ -10,5 +10,6 @@ "fileIsDirectoryError": "Le fichier est un répertoire", "fileNotModifiedError": "Fichier non modifié depuis", "fileBinaryError": "Il semble que le fichier soit binaire. Impossible de l'ouvrir en tant que texte", - "err.create": "Impossible de créer le fichier {0}" + "err.create": "Impossible de créer le fichier {0}", + "fileMoveConflict": "Déplacement/copie impossible. Le fichier existe déjà dans la destination." } \ No newline at end of file diff --git a/i18n/hun/extensions/emmet/package.i18n.json b/i18n/hun/extensions/emmet/package.i18n.json index 0445f7ccce3..4e87769482a 100644 --- a/i18n/hun/extensions/emmet/package.i18n.json +++ b/i18n/hun/extensions/emmet/package.i18n.json @@ -35,6 +35,7 @@ "emmetExtensionsPath": "Emmet-profilokat és -kódtöredékeket tartalmazó mappa elérési útja.", "emmetShowExpandedAbbreviation": "Kibontott Emmet-rövidítések megjelenítése javaslatként. Az \"inMarkupAndStylesheetFilesOnly\" beállítás csak a html, haml, jade, slim, xml, xsl, css, scss, sass, less és stylus típusú tartalmat jelenti. Az \"always\" beállítás a fájl összes részére vonatkozik a jelölőnyelvtől/css-től függetlenül.", "emmetShowAbbreviationSuggestions": "Lehetséges Emmet-rövidítések megjelenítése javaslatként. Nem használható a stíluslapokon vagy ha az emmet.showExpandedAbbreviation értéke \"never\".", + "emmetIncludeLanguages": "Emmet-rövidítések engedélyezése olyan nyelvek esetében, amelyek alapértelmezés szerint nem támogatottak. Egy megfeleltetést kell felvenni a nyelv és egy emmet által támogatott nyelv között.\nPl.: {\"vue-html\": \"html\", \"javascript\": \"javascriptreact\"}", "emmetVariables": "Az Emmet-kódrészletekben használt változók", "emmetTriggerExpansionOnTab": "Ha engedélyezve van, akkor az Emmet-rövidítések a Tab billentyű lenyomásával bonthatók ki.", "emmetPreferences": "Beállítások, melyek módosítják az Emmet műveleteinek és feloldó algoritmusainak viselkedését.", @@ -59,5 +60,6 @@ "emmetPreferencesCssMozProperties": "CSS-tulajdonságok vesszővel ellátott listája, melyek 'moz' gyártói előtagot kapnak azoknál az Emmet-rövidtéseknél, melyek `-` karakterrel kezdődnek. Állítsa üres szövegre, ha soha nem szeretne 'moz' előtagot használni.", "emmetPreferencesCssOProperties": "CSS-tulajdonságok vesszővel ellátott listája, melyek 'o' gyártói előtagot kapnak azoknál az Emmet-rövidtéseknél, melyek `-` karakterrel kezdődnek. Állítsa üres szövegre, ha soha nem szeretne 'o' előtagot használni.", "emmetPreferencesCssMsProperties": "CSS-tulajdonságok vesszővel ellátott listája, melyek 'ms' gyártói előtagot kapnak azoknál az Emmet-rövidtéseknél, melyek `-` karakterrel kezdődnek. Állítsa üres szövegre, ha soha nem szeretne 'ms' előtagot használni.", - "emmetPreferencesCssFuzzySearchMinScore": "A minimális pontszám (0-tól 1-ig), amit egy fuzzy keresési találatnak el kell érnie. Az alacsonyabb értékek álpozitív találatokat eredményezhetnek, míg a magasabb értékek szűkítik a lehetséges találatok számát." + "emmetPreferencesCssFuzzySearchMinScore": "A minimális pontszám (0-tól 1-ig), amit egy fuzzy keresési találatnak el kell érnie. Az alacsonyabb értékek álpozitív találatokat eredményezhetnek, míg a magasabb értékek szűkítik a lehetséges találatok számát.", + "emmetOptimizeStylesheetParsing": "Ha az értéke false, az egész fájl fel lesz dolgozva annak meghatározásához, hogy az aktuális pozíció ércényes-e Emmet-rövidítések kibontásához. Ha az értéke true, csak az aktuális pozíció körüli tartalom lesz feldolgozva a CSS/SCSS/LESS-fájlokban." } \ No newline at end of file diff --git a/i18n/hun/extensions/git/out/commands.i18n.json b/i18n/hun/extensions/git/out/commands.i18n.json index 9c1a3de3b6c..b19625ac0d4 100644 --- a/i18n/hun/extensions/git/out/commands.i18n.json +++ b/i18n/hun/extensions/git/out/commands.i18n.json @@ -11,9 +11,7 @@ "create branch": "$(plus) Új ág létrehozása", "repourl": "Forráskódtár URL-címe", "parent": "Szülőkönyvtár", - "cancel": "$(sync~spin) Forráskódtár klónozása... Kattintson ide a megszakításhoz", - "cancel tooltip": "Klónozás megszakítása", - "cloning": "Git-forráskódtár klónozása...", + "cloning": "'{0}' git forráskódtár klónozása...", "openrepo": "Forráskódtár megnyitása", "proposeopen": "Szeretné megnyitni a klónozott forráskódtárat?", "init": "Válasszon munkaterületi mappát a Git-forráskódtár inicializálásához!", diff --git a/i18n/hun/extensions/markdown-language-features/out/security.i18n.json b/i18n/hun/extensions/markdown-language-features/out/security.i18n.json index 19ebd5b969e..926e1ff93f9 100644 --- a/i18n/hun/extensions/markdown-language-features/out/security.i18n.json +++ b/i18n/hun/extensions/markdown-language-features/out/security.i18n.json @@ -9,6 +9,7 @@ "strict.title": "Szigorú", "strict.description": "Csak biztonságos tartalmak betöltése", "insecureLocalContent.title": "Nem biztonságos helyi tartalom engedélyezése", + "insecureLocalContent.description": "Tartalom betöltésének engedélyezése HTTP-n keresztül localhostról.", "insecureContent.title": "Nem biztonságos tartalom engedélyezése", "insecureContent.description": "Tartalom betöltésének engedélyezése HTTP-n keresztül.", "disable.title": "Letiltás", diff --git a/i18n/hun/extensions/npm/out/npmView.i18n.json b/i18n/hun/extensions/npm/out/npmView.i18n.json index 35229bd6699..90269483e9f 100644 --- a/i18n/hun/extensions/npm/out/npmView.i18n.json +++ b/i18n/hun/extensions/npm/out/npmView.i18n.json @@ -5,5 +5,7 @@ "Licensed under the MIT License. See License.txt in the project root for license information.", "--------------------------------------------------------------------------------------------", "Do not edit this file. It is machine generated." - ] + ], + "npm.noDebugOptions": "A(z) „{0}” nem indítható el hibakereséshez, mert a parancsból hiányzik a node hibakeresési kapcsoló, pl. az „--inspect-brk”.", + "npm.scriptInvalid": "A(z) „{0}” parancs nem található. Frissítse a nézetet!" } \ No newline at end of file diff --git a/i18n/hun/extensions/npm/package.i18n.json b/i18n/hun/extensions/npm/package.i18n.json index e4c268ef1d7..79cbd9c9f80 100644 --- a/i18n/hun/extensions/npm/package.i18n.json +++ b/i18n/hun/extensions/npm/package.i18n.json @@ -12,11 +12,15 @@ "config.npm.runSilent": "Az npm-parancsok a '--silent' kapcsolóval fussanak.", "config.npm.packageManager": "A parancsfájlok futtatásához használt csomagkezelő.", "config.npm.exclude": "Azokat a mappákat leíró globális minta, amelyek ne legyenek vizsgálva az automatikus parancsfájlkeresés közben.", + "config.npm.enableScriptExplorer": "Npm-parancsnézet hozzáadása a Fájlkezelőhöz, ha van „package.json”-fál a munkaterületen.", "npm.parseError": "Npm-feladatok felderítése: nem sikerült beolvasni a következő fájlt: {0}", "taskdef.script": "A testreszabott npm parancsfájl.", "taskdef.path": "Azon mappa elérési útja, amely a parancsfájlt szolgáltató package.json fájlt tartalmazza. Elhagyható.", + "view.name": "Npm-parancsok", "command.refresh": "Frissítés", "command.run": "Futtatás", "command.debug": "Hibakeresés", - "command.openScript": "Megnyitás" + "command.openScript": "Megnyitás", + "npm.scriptInvalid": "A(z) „{0}” parancs nem található. Frissítse a nézetet!", + "npm.noDebugOptions": "A(z) „{0}” nem indítható el hibakereséshez, mert a parancsból hiányzik a node hibakeresési kapcsoló, pl. az „--inspect-brk”." } \ No newline at end of file diff --git a/i18n/hun/extensions/php/package.i18n.json b/i18n/hun/extensions/php/package.i18n.json index 30301605646..7a75a0d1d20 100644 --- a/i18n/hun/extensions/php/package.i18n.json +++ b/i18n/hun/extensions/php/package.i18n.json @@ -6,5 +6,6 @@ "--------------------------------------------------------------------------------------------", "Do not edit this file. It is machine generated." ], + "displayName": "PHP nyelvi alapok", "description": "Szintaktikai kiemelést szolgáltat, valamint kezeli az összetartozó zárójeleket a PHP-fájlokban." } \ No newline at end of file diff --git a/i18n/hun/extensions/typescript-language-features/package.i18n.json b/i18n/hun/extensions/typescript-language-features/package.i18n.json index 59e6eed00dc..5ffa7df24e8 100644 --- a/i18n/hun/extensions/typescript-language-features/package.i18n.json +++ b/i18n/hun/extensions/typescript-language-features/package.i18n.json @@ -15,6 +15,8 @@ "typescript.tsdk.desc": "A tsservert és a lib*.d.ts fájlokat tartalmazó mappa elérési útja.", "typescript.disableAutomaticTypeAcquisition": "Automatikus típusdefiníció-letöltés letiltása. Legalább 2.0.6-os TypeScriptet igényel.", "typescript.tsserver.log": "Engedélyezi a TS-szerver naplózását egy fájlba. Ez a napló a TS-szerverrel kapcsolatos problémák diagnosztizálására használható. A napló tartalmazhat elérési utakat, forráskódot és más potenciálisan érzékeny, projekttel kapcsolatos adatot.", + "typescript.tsserver.pluginPaths": "További felderített elérési utak, amelyek TypeScript nyelvi szerver beépülőket tartalmaznak. TypeScript >=2.3.0-t igényel.", + "typescript.tsserver.pluginPaths.item": "Abszolút vagy relatív elérési út. A relatív elérési utak a munkaterületi mappákhoz relatívan lesznek feloldva.", "typescript.tsserver.trace": "Engedélyezi a TS-szervernek küldött üzenetek naplózását. Ez a napló a TS-szerverrel kapcsolatos problémák diagnosztizálására használható. A napló tartalmazhat elérési utakat, forráskódot és más potenciálisan érzékeny, projekttel kapcsolatos adatot. ", "typescript.validate.enable": "TypeScript-validálás engedélyezése vagy letiltása.", "typescript.format.enable": "Alapértelmezett TypeScript-formázó engedélyezése vagy letiltása.", @@ -26,6 +28,9 @@ "format.insertSpaceAfterKeywordsInControlFlowStatements": "Meghatározza a szóközök kezelését vezérlési szerkezetek kulcsszavai után.", "format.insertSpaceAfterFunctionKeywordForAnonymousFunctions": "Meghatározza a szóközök kezelését a névtelen függvényekben található function kulcsszó után.", "format.insertSpaceBeforeFunctionParenthesis": "Meghatározza a szóközök kezelését a függvényargumentumokat tartalmazó zárójel előtt. TypeScript >= 2.1.5-öt igényel.", + "format.insertSpaceAfterOpeningAndBeforeClosingNonemptyParenthesis": "Meghatározza a szóközök kezelését nem üres zárójelek nyitása után és zárása előtt.", + "format.insertSpaceAfterOpeningAndBeforeClosingNonemptyBrackets": "Meghatározza a szóközök kezelését nem üres szögletes zárójelek nyitása után és zárása előtt.", + "format.insertSpaceAfterOpeningAndBeforeClosingNonemptyBraces": "Meghatározza a szóközök kezelését nem üres kapcsos zárójelek nyitása után és zárása előtt. TypeScript >= 2.3.0-t igényel.", "format.insertSpaceAfterOpeningAndBeforeClosingTemplateStringBraces": "Meghatározza a szóközök kezelését a sablonkarakterláncok (template stringek) kapcsos zárójeleinek nyitása után és zárása előtt. TypeScript >= 2.0.6-ot igényel.", "format.insertSpaceAfterOpeningAndBeforeClosingJsxExpressionBraces": "Meghatározza a szóközök kezelését JSX-kifejezések kapcsos zárójeleinek nyitása után és zárása előtt. TypeScript >= 2.0.6-ot igényel.", "format.insertSpaceAfterTypeAssertion": "Meghatározza a szóközök kezelését a típuskényszerítések utn. TypeScript >= 2.4-t igényel.", @@ -54,5 +59,7 @@ "javascript.implicitProjectConfig.experimentalDecorators": " 'experimentalDecorators' beállítás engedélyezése azon JavaScript-fájlok esetében, amelyek nem részei a projektnek. A meglévő jsconfig.json vagy tsconfig.json fájlok felülírják ezt a beállítást. TypeScript >= 2.3.1-et igényel.", "typescript.autoImportSuggestions.enabled": "Automatikus importálási ajánlatok engedélyezése vagy letiltása. TypeScript >= 2.6.1-t igényel.", "typescript.experimental.syntaxFolding": "Szintaxisalapú becsukható kódrészletek engedélyezése vagy letiltása.", - "taskDefinition.tsconfig.description": "A tsconfig-fájl, ami meghatározza a TS-buildet." + "taskDefinition.tsconfig.description": "A tsconfig-fájl, ami meghatározza a TS-buildet.", + "javascript.suggestionActions.enabled": "Ajánlásokat tartalmazó diagnosztikák engedélyezése vagy letiltása a JavaScript-fájlokban. TypeScript >= 2.8-at igényel.", + "typescript.suggestionActions.enabled": "Ajánlásokat tartalmazó diagnosztikák engedélyezése vagy letiltása a TypeScript-fájlokban. TypeScript >= 2.8-at igényel." } \ No newline at end of file diff --git a/i18n/hun/src/vs/editor/common/config/commonEditorConfig.i18n.json b/i18n/hun/src/vs/editor/common/config/commonEditorConfig.i18n.json index 6121ff296fe..19de8e05102 100644 --- a/i18n/hun/src/vs/editor/common/config/commonEditorConfig.i18n.json +++ b/i18n/hun/src/vs/editor/common/config/commonEditorConfig.i18n.json @@ -112,7 +112,6 @@ "selectionClipboard": "Meghatározza-e, hogy támogatva van-e az elsődleges vágólap Linux alatt", "sideBySide": "Meghatározza, hogy a differenciaszerkesztő ablakban egymás mellett vagy a sorban jelenjenek meg az eltérések", "ignoreTrimWhitespace": "Meghatározza, hogy a differenciaszerkesztő ablakban megjelenjenek-e a sor elején vagy végén a szóközökben talált különbségek", - "largeFileSize": "Meghatározza azt a fájlméretet, ami fölött speciális optimalizálási szabályok lépnek érvénybe.", - "largeFileLineCount": "Meghatározza azt a sorszámot, ami fölött speciális optimalizálási szabályok lépnek érvénybe. ", + "largeFileOptimizations": "Nagy fájlok megnyitása esetén néhány, sok memóriát használó funkció letiltása.", "renderIndicators": "Meghatározza, hogy a differenciaszerkesztő ablakban megjelenjenek-e a +/- jelzők az hozzáadott/eltávolított változásoknál" } \ No newline at end of file diff --git a/i18n/hun/src/vs/editor/contrib/referenceSearch/referencesWidget.i18n.json b/i18n/hun/src/vs/editor/contrib/referenceSearch/referencesWidget.i18n.json index 82fdc46133a..9c1a30c3bec 100644 --- a/i18n/hun/src/vs/editor/contrib/referenceSearch/referencesWidget.i18n.json +++ b/i18n/hun/src/vs/editor/contrib/referenceSearch/referencesWidget.i18n.json @@ -25,5 +25,6 @@ "peekViewEditorBackground": "A betekintőablak szerkesztőablakának háttérszíne.", "peekViewEditorGutterBackground": "A betekintőablak szerkesztőablakában található margó háttérszíne.", "peekViewResultsMatchHighlight": "Kiemelt keresési eredmények színe a betekintőablak eredménylistájában.", - "peekViewEditorMatchHighlight": "Kiemelt keresési eredmények színe a betekintőablak szerkesztőablakában." + "peekViewEditorMatchHighlight": "Kiemelt keresési eredmények színe a betekintőablak szerkesztőablakában.", + "peekViewEditorMatchHighlightBorder": "Kiemelt keresési eredmények keretszíne a betekintőablak szerkesztőablakában." } \ No newline at end of file diff --git a/i18n/hun/src/vs/platform/theme/common/colorRegistry.i18n.json b/i18n/hun/src/vs/platform/theme/common/colorRegistry.i18n.json index 37b143d1111..a470002b64a 100644 --- a/i18n/hun/src/vs/platform/theme/common/colorRegistry.i18n.json +++ b/i18n/hun/src/vs/platform/theme/common/colorRegistry.i18n.json @@ -29,6 +29,7 @@ "inputPlaceholderForeground": "A beviteli mezőkben használt helykitöltő szövegek előtérszíne.", "inputValidationInfoBackground": "Beviteli mezők háttérszíne információs szintű validációs állapot esetén.", "inputValidationInfoBorder": "Beviteli mezők keretszíne információs szintű validációs állapot esetén.", + "inputValidationWarningBackground": "Beviteli mezők háttérszíne figyelmeztetés szintű validációs állapot esetén.", "inputValidationWarningBorder": "Beviteli mezők keretszíne figyelmeztetés szintű validációs állapot esetén.", "inputValidationErrorBackground": "Beviteli mezők háttérszíne hiba szintű validációs állapot esetén.", "inputValidationErrorBorder": "Beviteli mezők keretszíne hiba szintű validációs állapot esetén.", diff --git a/i18n/hun/src/vs/platform/url/electron-browser/inactiveExtensionUrlHandler.i18n.json b/i18n/hun/src/vs/platform/url/electron-browser/inactiveExtensionUrlHandler.i18n.json index 35229bd6699..f6bafd32865 100644 --- a/i18n/hun/src/vs/platform/url/electron-browser/inactiveExtensionUrlHandler.i18n.json +++ b/i18n/hun/src/vs/platform/url/electron-browser/inactiveExtensionUrlHandler.i18n.json @@ -5,5 +5,6 @@ "Licensed under the MIT License. See License.txt in the project root for license information.", "--------------------------------------------------------------------------------------------", "Do not edit this file. It is machine generated." - ] + ], + "confirmUrl": "Szeretné engedélyezni a(z) {0} kiegészítő számára a következő URL-cím megnyitását?" } \ No newline at end of file diff --git a/i18n/hun/src/vs/workbench/api/browser/viewsContainersExtensionPoint.i18n.json b/i18n/hun/src/vs/workbench/api/browser/viewsContainersExtensionPoint.i18n.json index 01cbe639634..215c70faf94 100644 --- a/i18n/hun/src/vs/workbench/api/browser/viewsContainersExtensionPoint.i18n.json +++ b/i18n/hun/src/vs/workbench/api/browser/viewsContainersExtensionPoint.i18n.json @@ -8,10 +8,13 @@ ], "vscode.extension.contributes.views.containers.id": "A gyűjtemény egyedi azonosítója, mellyel nézetek rendelhetők hozzá a 'views' értékeivel.", "vscode.extension.contributes.views.containers.title": "A gyűjtemény megjelenítésénél használt, emberek számára szánt neve", - "vscode.extension.contributes.views.containers.icon": "A gyűjtemény ikonjának elérési útja", - "vscode.extension.contributes.viewsContainer": "Nézetgyűjteményeket szolgáltat a szerkesztőhöz", + "vscode.extension.contributes.views.containers.icon": "A gyűjtemény ikonjának elérési útja. Az ikonok 24x24 pixel méretűek, és középre vannak igazítva egy 50x40-es téglalapban. A kitöltési színük 'rgb(215, 218, 224)' vagy '#d7dae0'. Ajánlott az SVG-formátum használata, de bármely képfájltípus elfogadott.", + "vscode.extension.contributes.viewsContainers": "Nézetgyűjteményeket szolgáltat a szerkesztőhöz", "views.container.activitybar": "Nézetgyűjteményeket szolgáltat a tevékenységsávra", + "test": "Teszt", + "proposed": "A 'viewsContainers' csak a fejlesztői változatban vagy az --enable-proposed-api {1} kapcsoló használata esetén érhető el.", "requirearray": "a nézetgyűjteményeket tömbként kell megadni", + "requireidstring": "a(z) `{0}` tulajdonság kötelező és `string` típusúnak kell lennie. Csak alfanumerikus karaktereket, alulvonást és kötőjelet tartalmazhat.", "requirestring": "a(z) `{0}` tulajdonság kötelező és `string` típusúnak kell lennie", "showViewlet": "{0} megjelenítése", "view": "Nézet" diff --git a/i18n/hun/src/vs/workbench/api/browser/viewsExtensionPoint.i18n.json b/i18n/hun/src/vs/workbench/api/browser/viewsExtensionPoint.i18n.json index b04ad867931..562dc2d0d3a 100644 --- a/i18n/hun/src/vs/workbench/api/browser/viewsExtensionPoint.i18n.json +++ b/i18n/hun/src/vs/workbench/api/browser/viewsExtensionPoint.i18n.json @@ -16,7 +16,9 @@ "views.explorer": "Nézeteket szolgáltat a tevékenységsávon található Fájlkezelő gyűjteményhez.", "views.debug": "Nézeteket szolgáltat a tevékenységsávon található Hibakeresés gyűjteményhez.", "views.scm": "Nézeteket szolgáltat a tevékenységsávon található Verziókezelő rendszer gyűjteményhez.", + "views.test": "Nézeteket szolgáltat a tevékenységsávon található Teszt gyűjteményhez.", "views.contributed": "Nézeteket szolgáltat a szolgáltatott nézetek gyűjteményhez.", + "ViewContainerDoesnotExist": "Nem létezik '{0}' azonosítójú nézetgyűjtemény, és az összes oda regisztrált nézet a Fájlkezelőhöz lesz hozzáadva.", "duplicateView1": "Nem regisztrálható több nézet `{0}` azonosítóval a következő helyen: `{1}`", "duplicateView2": "Már van `{0}` azonosítójú nézet regisztrálva a következő helyen: `{1}`" } \ No newline at end of file diff --git a/i18n/hun/src/vs/workbench/parts/debug/electron-browser/debugEditorContribution.i18n.json b/i18n/hun/src/vs/workbench/parts/debug/electron-browser/debugEditorContribution.i18n.json index 7c65da736d7..ca80e96105e 100644 --- a/i18n/hun/src/vs/workbench/parts/debug/electron-browser/debugEditorContribution.i18n.json +++ b/i18n/hun/src/vs/workbench/parts/debug/electron-browser/debugEditorContribution.i18n.json @@ -26,6 +26,7 @@ "addBreakpoint": "Töréspont hozzáadása", "addConditionalBreakpoint": "Feltételes töréspont hozzáadása...", "addLogPoint": "Naplózási pont hozzáadása...", + "breakpointHasCondition": "Ez a(z) {0} {1} rendelkezik, ami elvész az eltávolítás során. Fontolja meg a(z) {0} letiltását!", "message": "üzenettel", "condition": "feltétellel", "removeLogPoint": "{0} eltávolítása", diff --git a/i18n/hun/src/vs/workbench/parts/files/electron-browser/fileActions.i18n.json b/i18n/hun/src/vs/workbench/parts/files/electron-browser/fileActions.i18n.json index c9fcc7b9a6b..abeb33a1bb8 100644 --- a/i18n/hun/src/vs/workbench/parts/files/electron-browser/fileActions.i18n.json +++ b/i18n/hun/src/vs/workbench/parts/files/electron-browser/fileActions.i18n.json @@ -33,9 +33,13 @@ "trashFailed": "Nem sikerült törölni a kuka használatával. Szeretné helyette véglegesen törölni?", "deletePermanentlyButtonLabel": "&&Törlés véglegesen", "retryButtonLabel": "Új&&rapróbálkozás", + "confirmMoveTrashMessageFilesAndDirectories": "Törli a következő {0} fájlt vagy könyvtárat a teljes tartalmával együtt?", + "confirmMoveTrashMessageMultipleDirectories": "Törli a következő {0} könyvtárat a teljes tartalmával együtt?", "confirmMoveTrashMessageMultiple": "Törli a következő {0} fájlt?", "confirmMoveTrashMessageFolder": "Törli a(z) '{0}' nevű mappát és a teljes tartalmát?", "confirmMoveTrashMessageFile": "Törli a(z) '{0}' nevű fájlt?", + "confirmDeleteMessageFilesAndDirectories": "Véglegesen törli a következő {0} fájlt vagy könyvtárat a teljes tartalmával együtt?", + "confirmDeleteMessageMultipleDirectories": "Véglegesen törli a következő {0} könyvtárat a teljes tartalmával együtt?", "confirmDeleteMessageMultiple": "Véglegesen törli a következő {0} fájlt?", "confirmDeleteMessageFolder": "Törli a(z) '{0}' nevű mappát és annak teljes tartalmát? ", "confirmDeleteMessageFile": "Véglegesen törli a(z) '{0}' nevű fájlt?", diff --git a/i18n/hun/src/vs/workbench/parts/localizations/electron-browser/localizations.contribution.i18n.json b/i18n/hun/src/vs/workbench/parts/localizations/electron-browser/localizations.contribution.i18n.json index 6bd71c5eb71..fbc4f5faee9 100644 --- a/i18n/hun/src/vs/workbench/parts/localizations/electron-browser/localizations.contribution.i18n.json +++ b/i18n/hun/src/vs/workbench/parts/localizations/electron-browser/localizations.contribution.i18n.json @@ -11,6 +11,7 @@ "no": "Nem", "neverAgain": "Ne jelenítse meg újra", "install": "Telepítés", + "more information": "További információ...", "JsonSchema.locale": "A felhasználói felületen használt nyelv.", "vscode.extension.contributes.localizations": "Lokalizációkat szolgáltat a szerkesztőhöz", "vscode.extension.contributes.localizations.languageId": "Annak a nyelvnek az azonosítója, amelyre a megjelenített szövegek fordítva vannak.", diff --git a/i18n/hun/src/vs/workbench/parts/markers/electron-browser/markersPanel.i18n.json b/i18n/hun/src/vs/workbench/parts/markers/electron-browser/markersPanel.i18n.json index 6230ddd7379..b058dcf4078 100644 --- a/i18n/hun/src/vs/workbench/parts/markers/electron-browser/markersPanel.i18n.json +++ b/i18n/hun/src/vs/workbench/parts/markers/electron-browser/markersPanel.i18n.json @@ -6,6 +6,6 @@ "--------------------------------------------------------------------------------------------", "Do not edit this file. It is machine generated." ], - "disableFilesExclude": "Fájlkizárási beállítások használatának kikapcsolása", + "disableFilesExclude": "Fájlkizárási beállítások kikapcsolása", "clearFilter": "Szűrő törlése" } \ No newline at end of file diff --git a/i18n/hun/src/vs/workbench/parts/search/electron-browser/search.contribution.i18n.json b/i18n/hun/src/vs/workbench/parts/search/electron-browser/search.contribution.i18n.json index 84dfc238f59..d9c23b4c9eb 100644 --- a/i18n/hun/src/vs/workbench/parts/search/electron-browser/search.contribution.i18n.json +++ b/i18n/hun/src/vs/workbench/parts/search/electron-browser/search.contribution.i18n.json @@ -10,6 +10,7 @@ "copyMatchLabel": "Másolás", "copyPathLabel": "Elérési út másolása", "copyAllLabel": "Összes másolása", + "clearSearchHistoryLabel": "Keresési előzmények törlése", "toggleSearchViewPositionLabel": "Keresőnézet helyzetének váltása", "findInFolder": "Keresés mappában...", "findInWorkspace": "Keresés a munkaterületen...", diff --git a/i18n/hun/src/vs/workbench/parts/tasks/common/taskDefinitionRegistry.i18n.json b/i18n/hun/src/vs/workbench/parts/tasks/common/taskDefinitionRegistry.i18n.json index a0abbd989f7..c61ab35d02f 100644 --- a/i18n/hun/src/vs/workbench/parts/tasks/common/taskDefinitionRegistry.i18n.json +++ b/i18n/hun/src/vs/workbench/parts/tasks/common/taskDefinitionRegistry.i18n.json @@ -6,7 +6,7 @@ "--------------------------------------------------------------------------------------------", "Do not edit this file. It is machine generated." ], - "TaskDefinition.description": "A feladat konkrét típusa", + "TaskDefinition.description": "A feladat tényleges típusa. Megjegyzés: a „$” karakterrel kezdődő feladattípusok belső használatra vannak fenntartva.", "TaskDefinition.properties": "A feladattípus további tulajdonságai", "TaskTypeConfiguration.noType": "A feladattípus-konfigurációból hiányzik a kötelező 'taskType' tulajdonság", "TaskDefinitionExtPoint": "Feladattípusokat szolgáltat" diff --git a/i18n/hun/src/vs/workbench/parts/tasks/electron-browser/terminalTaskSystem.i18n.json b/i18n/hun/src/vs/workbench/parts/tasks/electron-browser/terminalTaskSystem.i18n.json index ec12a3852ec..70a754da466 100644 --- a/i18n/hun/src/vs/workbench/parts/tasks/electron-browser/terminalTaskSystem.i18n.json +++ b/i18n/hun/src/vs/workbench/parts/tasks/electron-browser/terminalTaskSystem.i18n.json @@ -11,6 +11,6 @@ "TerminalTaskSystem.terminalName": "Feladat – {0}", "closeTerminal": "A folytatáshoz nyomjon meg egy billentyűt.", "reuseTerminal": "A terminál újra lesz hasznosítva a feladatok által. Nyomjon meg egy billentyűt a bezáráshoz.", - "TerminalTaskSystem": "Rendszerparancsok nem hajthatók végre UNC-meghajtókon.", + "TerminalTaskSystem": "Rendszerparancsok nem hajthatók végre UNC-meghajtókon a cmd.exe használata esetén.", "unkownProblemMatcher": "A(z) {0} problémaillesztő nem található. Az illesztő figyelmen kívül lesz hagyva." } \ No newline at end of file diff --git a/i18n/hun/src/vs/workbench/services/extensions/common/extensionsRegistry.i18n.json b/i18n/hun/src/vs/workbench/services/extensions/common/extensionsRegistry.i18n.json index c71dafc3472..89f126918e8 100644 --- a/i18n/hun/src/vs/workbench/services/extensions/common/extensionsRegistry.i18n.json +++ b/i18n/hun/src/vs/workbench/services/extensions/common/extensionsRegistry.i18n.json @@ -6,10 +6,12 @@ "--------------------------------------------------------------------------------------------", "Do not edit this file. It is machine generated." ], + "vscode.extension.engines": "Motorkompatibilitás.", "vscode.extension.engines.vscode": "VS Code kiegészítőkhöz. Meghatározza azt a VS Code-verziót, amivel a kiegészítő kompatibilis. Nem lehet *. Például a ^0.10.5 a VS Code minimum 0.10.5-ös verziójával való kompatibilitást jelzi.", "vscode.extension.publisher": "A VS Code-kiegészítő kiadója.", "vscode.extension.displayName": "A kiegészítő VS Code galériában megjelenített neve.", "vscode.extension.categories": "A VS Code-galériában való kategorizálásra használt kategóriák.", + "vscode.extension.category.languages.deprecated": "Használja helyette a „programozási nyelveket”!", "vscode.extension.galleryBanner": "A VS Code piactéren használt szalagcím.", "vscode.extension.galleryBanner.color": "A VS Code piactéren használt szalagcím színe.", "vscode.extension.galleryBanner.theme": "A szalagcímben használt betűtípus színsémája.", @@ -23,11 +25,14 @@ "vscode.extension.activationEvents.onDebugResolve": "Aktiváló esemény, ami akkor fut, ha a megadott típusú hibakeresési munkamenetnek el kell indulnia (és a megfelelő resolveDebugConfiguration metódusokat meg kell hívni).", "vscode.extension.activationEvents.workspaceContains": "Aktiváló esemény, ami akkor fut le, ha egy olyan mappa kerül megnyitásra, amiben legalább egy olyan fájl van, amely illeszkedik a megadott globális mintára.", "vscode.extension.activationEvents.onView": "Aktiváló esemény, ami akkor fut le, amikor a megadott nézetet kiterjesztik.", + "vscode.extension.activationEvents.onUri": "Aktiváló esemény, ami akkor fut le, amikor megnyílik egy URI, ami ehhez a kiegészítőhöz van irányítva.", "vscode.extension.activationEvents.star": "Aktiváló esemény, ami a VS Code indításakor fut le. A jó felhasználói élmény érdekében csak akkor használja ezt az eseményt, ha más aktiváló események nem alkalmasak az adott kiegészítő esetében.", "vscode.extension.badges": "A kiegészítő piactéren található oldalának oldalsávjában megjelenő jelvények listája.", "vscode.extension.badges.url": "A jelvény kép URL-je.", "vscode.extension.badges.href": "A jelvény hivatkozása.", "vscode.extension.badges.description": "A jelvény leírása.", + "vscode.extension.markdown": "Meghatározza a piactéren a markdown-tartalom megjelenítéséhez használt motort.", + "vscode.extension.qna": "Meghatározza a piactéren található „Kérdések és válaszok” (Q&A) hivatkozást. „marketplace” érték esetén a piactér alapértelmezett kérdések és válaszok oldala van engedélyezve. Egyéb szöveges tartalom esetén egy saját URL-lel rendelkező „kérdések és válaszok”-oldal adható meg! False érték esetén a „kérdések és válaszok”-oldal ki van kapcsolva.", "vscode.extension.extensionDependencies": "Más kiegészítők, melyek függőségei ennek a kiegészítőnek. A kiegészítők azonosítója mindig ${publisher}.${name} formájú. Például: vscode.csharp.", "vscode.extension.scripts.prepublish": "A VS Code kiegészítő publikálása előtt végrehajtott parancsfájl.", "vscode.extension.scripts.uninstall": "Eltávolítási illesztőpont VS Code kiegészítők számára. Parancsfájl, ami a VS Code újraindítása (leállása és elindítása) esetén fut le a kiegészítő teljes eltávolítása után. Csak Node-parancsfájlok használhatók.", diff --git a/i18n/hun/src/vs/workbench/services/extensions/electron-browser/extensionService.i18n.json b/i18n/hun/src/vs/workbench/services/extensions/electron-browser/extensionService.i18n.json index 87c6a22e435..a6ca11e97bf 100644 --- a/i18n/hun/src/vs/workbench/services/extensions/electron-browser/extensionService.i18n.json +++ b/i18n/hun/src/vs/workbench/services/extensions/electron-browser/extensionService.i18n.json @@ -6,8 +6,10 @@ "--------------------------------------------------------------------------------------------", "Do not edit this file. It is machine generated." ], + "extensionsDisabled": "Az összes kiegészítő le van tiltva.", "extensionHostProcess.crash": "A kiegészítő gazdafolyamata váratlanul leállt.", "extensionHostProcess.unresponsiveCrash": "A kiegészítő gazdafolyamata le lett állítva, mert nem válaszolt.", + "devTools": "Fejlesztői eszközök megnyitása", "restart": "Kiegészítő gazdafolyamatának újraindítása", "overwritingExtension": "A(z) {0} kiegészítő felülírása a következővel: {1}.", "extensionUnderDevelopment": "A(z) {0} elérési úton található fejlesztői kiegészítő betöltése", diff --git a/i18n/hun/src/vs/workbench/services/files/electron-browser/fileService.i18n.json b/i18n/hun/src/vs/workbench/services/files/electron-browser/fileService.i18n.json index 6db59384b1a..d5082fc09cf 100644 --- a/i18n/hun/src/vs/workbench/services/files/electron-browser/fileService.i18n.json +++ b/i18n/hun/src/vs/workbench/services/files/electron-browser/fileService.i18n.json @@ -14,6 +14,7 @@ "fileInvalidPath": "Érvénytelen fájlerőforrás ({0})", "fileIsDirectoryError": "A fájl egy könyvtár", "fileNotModifiedError": "A fájl azóta nem módosult", + "fileTooLargeForHeapError": "Egy ekkora fájl megnyitásához újra kell indítania a VS Code-ot, és engedélyeznie kell, hogy több memóriát használhasson.", "fileTooLargeError": "A fájl túl nagy a megnyitáshoz", "fileNotFoundError": "Fájl nem található ({0})", "fileBinaryError": "A fájl binárisnak tűnik és nem nyitható meg szövegként", diff --git a/i18n/hun/src/vs/workbench/services/files/electron-browser/remoteFileService.i18n.json b/i18n/hun/src/vs/workbench/services/files/electron-browser/remoteFileService.i18n.json index 91e90e2f957..8b5898129b6 100644 --- a/i18n/hun/src/vs/workbench/services/files/electron-browser/remoteFileService.i18n.json +++ b/i18n/hun/src/vs/workbench/services/files/electron-browser/remoteFileService.i18n.json @@ -9,5 +9,7 @@ "fileNotFoundError": "Fájl nem található ({0})", "fileIsDirectoryError": "A fájl egy könyvtár", "fileNotModifiedError": "A fájl azóta nem módosult", - "fileBinaryError": "A fájl binárisnak tűnik és nem nyitható meg szövegként" + "fileBinaryError": "A fájl binárisnak tűnik és nem nyitható meg szövegként", + "err.create": "Nem sikerült létrehozni a(z) {0} nevű fájlt", + "fileMoveConflict": "Nem lehet áthelyezni vagy másolni. A fájl már létezik a célhelyen." } \ No newline at end of file diff --git a/i18n/ita/extensions/emmet/package.i18n.json b/i18n/ita/extensions/emmet/package.i18n.json index ed7d2e37205..325af035e69 100644 --- a/i18n/ita/extensions/emmet/package.i18n.json +++ b/i18n/ita/extensions/emmet/package.i18n.json @@ -35,6 +35,7 @@ "emmetExtensionsPath": "Percorso di una cartella contenente profili e snippet Emmet.'", "emmetShowExpandedAbbreviation": "Mostra le abbreviazioni Emmet espanse come suggerimenti.\nL'opzione \"inMarkupAndStylesheetFilesOnly\" si applica a html, haml, jade, slim, xml, xsl, css, scss, sass, less e stylus.\nL'opzione \"sempre\" (always) si applica a tutte le parti del file indipendentemente dal markup/css.", "emmetShowAbbreviationSuggestions": "Mostra possibili abbreviazioni Emmet come suggerimenti. Non si applica a fogli di stile o quando emmet.showExpandedAbbreviation è impostata a \"mai\" (never).", + "emmetIncludeLanguages": "Abilita le abbreviazioni Emmet in linguaggi che non sono normalmente supportati. Qui si può aggiungere un mapping tra il linguaggio ed il linguaggio supportato da Emmet.\n Ad esempio: {\"vue-html\": \"html\", \"javascript\": \"javascriptreact\"}", "emmetVariables": "Variabili da utilizzare negli snippet Emmet", "emmetTriggerExpansionOnTab": "Se abilitate, le abbreviazioni Emmet vengono espanse quando si preme TAB.", "emmetPreferences": "Preferenze usate per modificare il comportamento di alcune azioni e i resolver di Emmet.", @@ -59,5 +60,6 @@ "emmetPreferencesCssMozProperties": "Proprietà CSS delimitate da virgola che assumono il prefisso 'moz' del vendor quando utilizzate nelle abbreviazioni di Emmet che iniziano per '-'. Per evitare sempre il prefisso 'moz' impostare stringa vuota.", "emmetPreferencesCssOProperties": "Proprietà CSS delimitate da virgola che assumono il prefisso 'o' del vendor quando utilizzate nelle abbreviazioni di Emmet che iniziano per '-'. Per evitare sempre il prefisso 'o' impostare stringa vuota.", "emmetPreferencesCssMsProperties": "Proprietà CSS delimitate da virgola che assumono il prefisso 'ms' del vendor quando utilizzate nelle abbreviazioni di Emmet che iniziano per '-'. Per evitare sempre il prefisso 'ms' impostare stringa vuota.", - "emmetPreferencesCssFuzzySearchMinScore": "Il valore minimo (da 0 a 1) che dovrebbe raggiungere un'abbreviazione di fuzzy-match. I valori più bassi possono produrre molti falsi positivi, i valori più alti possono ridurre le possibili corrispondenze." + "emmetPreferencesCssFuzzySearchMinScore": "Il valore minimo (da 0 a 1) che dovrebbe raggiungere un'abbreviazione di fuzzy-match. I valori più bassi possono produrre molti falsi positivi, i valori più alti possono ridurre le possibili corrispondenze.", + "emmetOptimizeStylesheetParsing": "Se è impostato su false, l'intero file viene analizzato per determinare se la posizione corrente è valida per l'espansione delle abbreviazioni di Emmet. Se è impostato su true, viene analizzato solo il contenuto circostante alla posizione corrente nei file css/scss/less." } \ No newline at end of file diff --git a/i18n/ita/extensions/git/out/commands.i18n.json b/i18n/ita/extensions/git/out/commands.i18n.json index 792f4a2d3dd..31523837c4a 100644 --- a/i18n/ita/extensions/git/out/commands.i18n.json +++ b/i18n/ita/extensions/git/out/commands.i18n.json @@ -11,9 +11,7 @@ "create branch": "$(plus) Crea nuovo branch", "repourl": "URL del repository", "parent": "Directory padre", - "cancel": "$(sync~spin) Clonazione di repository in corso... Clicca per annullare", - "cancel tooltip": "Annulla l'operazione di clonazione", - "cloning": "Clonazione del repository GIT...", + "cloning": "Clonazione del repository GIT '{0}'...", "openrepo": "Apri repository", "proposeopen": "Aprire il repository clonato?", "init": "Selezionare la cartella dell'area di lavoro in cui inizializzare il Git repo", diff --git a/i18n/ita/extensions/markdown-language-features/out/security.i18n.json b/i18n/ita/extensions/markdown-language-features/out/security.i18n.json index 17900416bd6..257cf27b76e 100644 --- a/i18n/ita/extensions/markdown-language-features/out/security.i18n.json +++ b/i18n/ita/extensions/markdown-language-features/out/security.i18n.json @@ -8,6 +8,8 @@ ], "strict.title": "Strict", "strict.description": "Carica solo contenuto protetto", + "insecureLocalContent.title": "Consenti contenuto locale non protetto", + "insecureLocalContent.description": "Consente il caricamento di contenuti tramite HTTP servito da localhost", "insecureContent.title": "Consenti contenuto non protetto", "insecureContent.description": "Consente il caricamento di contenuti tramite HTTP", "disable.title": "Disabilita", diff --git a/i18n/ita/extensions/npm/out/npmView.i18n.json b/i18n/ita/extensions/npm/out/npmView.i18n.json index 35229bd6699..565aeceec1a 100644 --- a/i18n/ita/extensions/npm/out/npmView.i18n.json +++ b/i18n/ita/extensions/npm/out/npmView.i18n.json @@ -5,5 +5,7 @@ "Licensed under the MIT License. See License.txt in the project root for license information.", "--------------------------------------------------------------------------------------------", "Do not edit this file. It is machine generated." - ] + ], + "npm.noDebugOptions": "Non è possibile avviare \"{0}\" per eseguire il debug perché negli script manca un'opzione di debug dei nodi, ad esempio \"--inspect-brk\".", + "npm.scriptInvalid": "Non è stato possibile trovare lo script \"{0}\". Provare ad aggiornare la visualizzazione." } \ No newline at end of file diff --git a/i18n/ita/extensions/npm/package.i18n.json b/i18n/ita/extensions/npm/package.i18n.json index 8b390aaf942..fc81506bb85 100644 --- a/i18n/ita/extensions/npm/package.i18n.json +++ b/i18n/ita/extensions/npm/package.i18n.json @@ -12,10 +12,15 @@ "config.npm.runSilent": "Eseguire comandi npm con l'opzione `--silent`.", "config.npm.packageManager": "Il gestore dei pacchetti utilizzato per eseguire script.", "config.npm.exclude": "Configura i modelli glob per le cartelle che dovrebbero essere escluse dalla rilevazione automatica di script.", + "config.npm.enableScriptExplorer": "Abilita una visualizzazione di esplorazione per gli script di npm quando l'area di lavoro contiene un file 'package.json'.", "npm.parseError": "Rilevamento attività NPM: Impossibile analizzare il file {0}", "taskdef.script": "Lo script di npm da personalizzare.", "taskdef.path": "Il percorso della cartella del file package.json che fornisce lo script. Può essere omesso.", + "view.name": "Script di npm", "command.refresh": "Aggiorna", + "command.run": "Esegui", "command.debug": "Debug", - "command.openScript": "Apri" + "command.openScript": "Apri", + "npm.scriptInvalid": "Non è stato possibile trovare lo script '{0}'. Provare ad aggiornare la visualizzazione.", + "npm.noDebugOptions": "Non è stato possibile avviare '{0}' per eseguire il debug perché negli script manca un'opzione di debug dei nodi, ad esempio '--inspect-brk'." } \ No newline at end of file diff --git a/i18n/ita/extensions/php/package.i18n.json b/i18n/ita/extensions/php/package.i18n.json index 6e9f75db20f..d8344412ea0 100644 --- a/i18n/ita/extensions/php/package.i18n.json +++ b/i18n/ita/extensions/php/package.i18n.json @@ -6,5 +6,6 @@ "--------------------------------------------------------------------------------------------", "Do not edit this file. It is machine generated." ], + "displayName": "Nozioni di base del linguaggio PHP", "description": "Offre l'evidenziazione della sintassi e la corrispondenza delle parentesi nei file PHP." } \ No newline at end of file diff --git a/i18n/ita/extensions/typescript-language-features/package.i18n.json b/i18n/ita/extensions/typescript-language-features/package.i18n.json index 9329475d6ab..415fd9fe791 100644 --- a/i18n/ita/extensions/typescript-language-features/package.i18n.json +++ b/i18n/ita/extensions/typescript-language-features/package.i18n.json @@ -15,6 +15,8 @@ "typescript.tsdk.desc": "Specifica il percorso della cartella che contiene i file tsserver e lib*.d.ts da usare.", "typescript.disableAutomaticTypeAcquisition": "Disabilita l'acquisizione automatica del tipo. Richiede TypeScript >= 2.0.6.", "typescript.tsserver.log": "Abilita la registrazione del server TypeScript in un file. Questo registro può essere utilizzato per diagnosticare problemi del server TypeScript. Il registro può contenere percorsi di file, codice sorgente e altre informazioni del progetto potenzialmente riservate. ", + "typescript.tsserver.pluginPaths": "Percorsi aggiuntivi per rilevare la presenza di plug-in del servizio di linguaggio Typescript. Richiede TypeScript >= 2.3.0.", + "typescript.tsserver.pluginPaths.item": "Percorso assoluto o relativo. Il percorso relativo verrà risolto in base alle cartelle dell'area di lavoro.", "typescript.tsserver.trace": "Abilita la traccia dei messaggi inviati al server TypeScript. Questa traccia può essere utilizzata per diagnosticare problemi del server TypeScript. La traccia può contenere percorsi di file, codice sorgente e altre informazioni del progetto potenzialmente riservate.", "typescript.validate.enable": "Abilita/Disabilita la convalida TypeScript.", "typescript.format.enable": "Abilita/Disabilita il formattatore TypeScript predefinito.", @@ -26,6 +28,9 @@ "format.insertSpaceAfterKeywordsInControlFlowStatements": "Consente di definire la gestione dello spazio dopo le parole chiave in un'istruzione del flusso di controllo.", "format.insertSpaceAfterFunctionKeywordForAnonymousFunctions": "Consente di definire la gestione dello spazio dopo la parola chiave function per funzioni anonime.", "format.insertSpaceBeforeFunctionParenthesis": "Consente di definire la gestione dello spazio prima delle parentesi dell'argomento della funzione. Richiede TypeScript >= 2.1.5.", + "format.insertSpaceAfterOpeningAndBeforeClosingNonemptyParenthesis": "Consente di definire la gestione dello spazio dopo le parentesi tonde di apertura e di chiusura non vuote.", + "format.insertSpaceAfterOpeningAndBeforeClosingNonemptyBrackets": "Consente di definire la gestione dello spazio dopo le parentesi quadre di apertura e di chiusura non vuote.", + "format.insertSpaceAfterOpeningAndBeforeClosingNonemptyBraces": "Consente di definire la gestione dello spazio dopo l'apertura e prima della chiusura di parentesi graffe non vuote. Richiede TypeScript >= 2.3.0.", "format.insertSpaceAfterOpeningAndBeforeClosingTemplateStringBraces": "Consente di definire la gestione dello spazio dopo la parentesi graffa iniziale e prima della parentesi graffa finale della stringa del modello. Richiede TypeScript >= 2.0.6", "format.insertSpaceAfterOpeningAndBeforeClosingJsxExpressionBraces": "Consente di definire la gestione dello spazio dopo la parentesi graffa iniziale e prima della parentesi graffa finale dell'espressione JSX. Richiede TypeScript >= 2.0.6", "format.insertSpaceAfterTypeAssertion": "Definisce la gestione dello spazio dopo le asserzioni di tipo in TypeScript. Richiede TypeScript >= 2.4.", @@ -49,9 +54,12 @@ "typescript.tsc.autoDetect": "Controlla l'auto-rilevazione di attività di tsc. 'off' disabilita questa funzionalità. 'build' crea solo attività di singola compilazione esecuzione. 'watch' crea solo attività di compilazione e controllo. 'on' crea attività sia di tipo 'build' che 'watch'. Il valore predefinito è 'on'.", "typescript.problemMatchers.tsc.label": "Problemi TypeScript", "typescript.problemMatchers.tscWatch.label": "Problemi TypeScript (modalità espressione di controllo)", + "typescript.quickSuggestionsForPaths": "Abilita/disabilita i suggerimenti rapidi quando si digita un percorso di importazione.", "typescript.locale": "Assegna le impostazioni internazionali utilizzate per riportare errori TypeScript. Richiede TypeScript > = 2.6.0. Il valore predefinito 'null' utilizza le impostazioni internazionali di VS Code.", "javascript.implicitProjectConfig.experimentalDecorators": "Abilita/disabilita 'experimentalDecorators' per i file JavaScript che non fanno parte di un progetto. File jsconfig.json o tsconfig.json esistenti ignorano questa impostazione. Richiede TypeScript >= 2.3.1.", "typescript.autoImportSuggestions.enabled": "Abilita/Disabilita suggerimenti importazione automatica. Richiede una versione di TypeScript >= 2.6.1", "typescript.experimental.syntaxFolding": "Abilita/disabilita i marcatori di folding con riconoscimento della sintassi.", - "taskDefinition.tsconfig.description": "File tsconfig che definisce la compilazione TS." + "taskDefinition.tsconfig.description": "File tsconfig che definisce la compilazione TS.", + "javascript.suggestionActions.enabled": "Abilita/disabilita la diagnostica dei suggerimenti per i file JavaScript nell'editor. Richiede TypeScript >= 2.8.", + "typescript.suggestionActions.enabled": "Abilita/disabilita la diagnostica dei suggerimenti per i file TypeScript nell'editor. Richiede TypeScript >= 2.8." } \ No newline at end of file diff --git a/i18n/ita/src/vs/base/node/processes.i18n.json b/i18n/ita/src/vs/base/node/processes.i18n.json index 35229bd6699..15d77305511 100644 --- a/i18n/ita/src/vs/base/node/processes.i18n.json +++ b/i18n/ita/src/vs/base/node/processes.i18n.json @@ -5,5 +5,6 @@ "Licensed under the MIT License. See License.txt in the project root for license information.", "--------------------------------------------------------------------------------------------", "Do not edit this file. It is machine generated." - ] + ], + "TaskRunner.UNC": "Non è possibile eseguire un comando della shell su un'unità UNC." } \ No newline at end of file diff --git a/i18n/ita/src/vs/base/node/zip.i18n.json b/i18n/ita/src/vs/base/node/zip.i18n.json index aeca957cc7c..942c2322e54 100644 --- a/i18n/ita/src/vs/base/node/zip.i18n.json +++ b/i18n/ita/src/vs/base/node/zip.i18n.json @@ -6,5 +6,6 @@ "--------------------------------------------------------------------------------------------", "Do not edit this file. It is machine generated." ], + "incompleteExtract": "Operazione incompleta. Sono state estratte {0} di {1} voci", "notFound": "{0} non è stato trovato all'interno del file ZIP." } \ No newline at end of file diff --git a/i18n/ita/src/vs/code/electron-browser/issue/issueReporterMain.i18n.json b/i18n/ita/src/vs/code/electron-browser/issue/issueReporterMain.i18n.json index 0cbefebbb8f..6bec92cf6a4 100644 --- a/i18n/ita/src/vs/code/electron-browser/issue/issueReporterMain.i18n.json +++ b/i18n/ita/src/vs/code/electron-browser/issue/issueReporterMain.i18n.json @@ -8,9 +8,11 @@ ], "previewOnGitHub": "Anteprima in GitHub", "loadingData": "Caricamento dei dati...", + "rateLimited": "Superato il limite di query GitHub. Attendere prego.", "similarIssues": "Problemi simili", "open": "Apri", "closed": "Chiuso", + "noSimilarIssues": "Nessun problema simile trovato", "settingsSearchIssue": "Problema di ricerca impostazioni", "bugReporter": "Segnalazione bug", "featureRequest": "Richiesta di funzionalità", diff --git a/i18n/ita/src/vs/code/electron-browser/issue/issueReporterPage.i18n.json b/i18n/ita/src/vs/code/electron-browser/issue/issueReporterPage.i18n.json index d087b3cb7c7..1ab03145d1f 100644 --- a/i18n/ita/src/vs/code/electron-browser/issue/issueReporterPage.i18n.json +++ b/i18n/ita/src/vs/code/electron-browser/issue/issueReporterPage.i18n.json @@ -8,7 +8,10 @@ ], "completeInEnglish": "Completare il modulo in lingua inglese.", "issueTypeLabel": "Questo è un", + "issueSourceLabel": "File in", "vscode": "Visual Studio Code", + "extension": "Un'estensione", + "disableExtensionsLabelText": "Provare a riprodurre il problema dopo {0}. Se il problema si verifica solo quando le estensioni sono attive, è probabilmente un problema legato ad un'estensione.", "disableExtensions": "disabilitando tutte le estensioni e ricaricando la finestra", "chooseExtension": "Estensione", "issueTitleLabel": "Titolo", diff --git a/i18n/ita/src/vs/code/electron-browser/processExplorer/processExplorerMain.i18n.json b/i18n/ita/src/vs/code/electron-browser/processExplorer/processExplorerMain.i18n.json index d72487d0df2..312cd92898f 100644 --- a/i18n/ita/src/vs/code/electron-browser/processExplorer/processExplorerMain.i18n.json +++ b/i18n/ita/src/vs/code/electron-browser/processExplorer/processExplorerMain.i18n.json @@ -6,5 +6,10 @@ "--------------------------------------------------------------------------------------------", "Do not edit this file. It is machine generated." ], - "name": "Nome" + "cpu": "% CPU", + "memory": "Memoria (MB)", + "pid": "PID", + "name": "Nome", + "killProcess": "Arresta il processo", + "forceKillProcess": "Arresto forzato del processo" } \ No newline at end of file diff --git a/i18n/ita/src/vs/code/electron-main/menus.i18n.json b/i18n/ita/src/vs/code/electron-main/menus.i18n.json index 4b19663530a..5f21b73e420 100644 --- a/i18n/ita/src/vs/code/electron-main/menus.i18n.json +++ b/i18n/ita/src/vs/code/electron-main/menus.i18n.json @@ -146,6 +146,7 @@ "miConditionalBreakpoint": "Punto di interruzione &&condizionale...", "miColumnBreakpoint": "Punto di interruzione &&colonna", "miFunctionBreakpoint": "Punto di interruzione &&funzione...", + "miLogPoint": "&&Punto di registrazione...", "miNewBreakpoint": "&&Nuovo punto di interruzione", "miEnableAllBreakpoints": "Abilita tutti i punti di interruzione", "miDisableAllBreakpoints": "Disabilita tutti i &&punti di interruzione", @@ -161,6 +162,7 @@ "mMergeAllWindows": "Unisci tutte le finestre", "miToggleDevTools": "&&Attiva/Disattiva strumenti di sviluppo", "miAccessibilityOptions": "&&Opzioni accessibilità", + "miOpenProcessExplorerer": "Apri &&Process Explorer", "miReportIssue": "&&Segnala problema", "miWelcome": "&&Benvenuti", "miInteractivePlayground": "Playground &&interattivo", diff --git a/i18n/ita/src/vs/editor/browser/widget/diffReview.i18n.json b/i18n/ita/src/vs/editor/browser/widget/diffReview.i18n.json index f77cf818806..61fa5061b58 100644 --- a/i18n/ita/src/vs/editor/browser/widget/diffReview.i18n.json +++ b/i18n/ita/src/vs/editor/browser/widget/diffReview.i18n.json @@ -7,6 +7,10 @@ "Do not edit this file. It is machine generated." ], "label.close": "Chiudi", + "no_lines": "nessuna linea", + "one_line": "1 linea", + "more_lines": "{0} linee", + "header": "Differenza {0} di {1}: originale {2}, {3}, modificate {4}, {5}", "blankLine": "vuota", "equalLine": "originali {0}, modificate {1}: {2}", "insertLine": "+ modificate {0}: {1}", diff --git a/i18n/ita/src/vs/editor/common/commonCodeEditor.i18n.json b/i18n/ita/src/vs/editor/common/commonCodeEditor.i18n.json index 35229bd6699..9f68decbccd 100644 --- a/i18n/ita/src/vs/editor/common/commonCodeEditor.i18n.json +++ b/i18n/ita/src/vs/editor/common/commonCodeEditor.i18n.json @@ -5,5 +5,6 @@ "Licensed under the MIT License. See License.txt in the project root for license information.", "--------------------------------------------------------------------------------------------", "Do not edit this file. It is machine generated." - ] + ], + "cursors.maximum": "Il numero di cursori è stato limitato a {0}." } \ No newline at end of file diff --git a/i18n/ita/src/vs/editor/common/config/commonEditorConfig.i18n.json b/i18n/ita/src/vs/editor/common/config/commonEditorConfig.i18n.json index c3b6c0b2a85..53ba37e5824 100644 --- a/i18n/ita/src/vs/editor/common/config/commonEditorConfig.i18n.json +++ b/i18n/ita/src/vs/editor/common/config/commonEditorConfig.i18n.json @@ -16,6 +16,7 @@ "lineNumbers.on": "I numeri di riga vengono visualizzati come numeri assoluti.", "lineNumbers.relative": "I numeri di riga vengono visualizzati come distanza in linee alla posizione del cursore.", "lineNumbers.interval": "I numeri di riga vengono visualizzati ogni 10 righe.", + "lineNumbers": "Controlla la visualizzazione dei numeri di riga.", "rulers": "Mostra righelli verticali dopo un certo numero di caratteri a spaziatura fissa. Utilizza più valori per più righelli. Nessun righello viene disegnati se la matrice è vuota", "wordSeparators": "Caratteri che verranno usati come separatori di parola quando si eseguono operazioni o spostamenti correlati a parole", "tabSize": "Il numero di spazi corrispondenti ad un carattere Tab. Questa impostazione viene sottoposta a override in base al contenuto dei file quando 'editor.detectIndentation' è 'on'.", @@ -27,6 +28,7 @@ "scrollBeyondLastLine": "Controlla se l'editor scorrerà oltre l'ultima riga", "smoothScrolling": "Controlla se per lo scorrimento dell'editor verrà usata un'animazione.", "minimap.enabled": "Controlla se la mini mappa è visualizzata", + "minimap.side": "Definisce il lato in cui eseguire il rendering della mini mappa.", "minimap.showSlider": "Controlla se lo slider della mini mappa viene nascosto automaticamente.", "minimap.renderCharacters": "Esegue il rendering dei caratteri effettivi di una riga (in contrapposizione ai blocchi colore)", "minimap.maxColumn": "Limita la larghezza della mini mappa in modo da eseguire il rendering al massimo di un certo numero di colonne", @@ -75,6 +77,7 @@ "occurrencesHighlight": "Controlla se l'editor deve evidenziare le occorrenze di simboli semantici", "overviewRulerLanes": "Controlla il numero di effetti che possono essere visualizzati nella stessa posizione nel righello delle annotazioni", "overviewRulerBorder": "Controlla se deve essere disegnato un bordo intorno al righello delle annotazioni.", + "cursorBlinking": "Controllo dello stile di animazione del cursore.", "mouseWheelZoom": "Ingrandisce il carattere dell'editor quando si usa la rotellina del mouse e si tiene premuto CTRL", "cursorStyle": "Controlla lo stile del cursore. I valori accettati sono 'block', 'block-outline', 'line', 'line-thin', 'underline' e 'underline-thin'", "cursorWidth": "Controlla la larghezza del cursore quando editor.cursorSyle è impostato a 'line'", @@ -84,7 +87,11 @@ "renderControlCharacters": "Controlla se l'editor deve eseguire il rendering dei caratteri di controllo", "renderIndentGuides": "Controlla se l'editor deve eseguire il rendering delle guide con rientro", "renderLineHighlight": "Consente di controllare in che modo l'editor deve eseguire il rendering dell'evidenziazione di riga corrente. Le opzioni possibili sono 'none', 'gutter', 'line' e 'all'.", + "codeLens": "Controlla se nell'editor è visualizzato CodeLens", "folding": "Controlla se per l'editor è abilitata la riduzione del codice", + "foldingStrategyAuto": "Se disponibile, usa una strategia di riduzione specifica del linguaggio, altrimenti esegue il fallback alla strategia di base per i rientri.", + "foldingStrategyIndentation": "Usa sempre la strategia di riduzione basata sui rientri", + "foldingStrategy": "Controlla in che modo vengono calcolati gli intervalli di riduzione. Con 'auto' viene usata l'eventuale strategia di riduzione specifica disponibile. Con 'indentation' viene usata forzatamente la strategia di riduzione basata sui rientri.", "showFoldingControls": "Controlla se i controlli di riduzione sul margine della barra di scorrimento sono automaticamente nascosti.", "matchBrackets": "Evidenzia le parentesi corrispondenti quando se ne seleziona una.", "glyphMargin": "Controlla se l'editor deve eseguire il rendering del margine verticale del glifo. Il margine del glifo viene usato principalmente per il debug.", @@ -99,8 +106,12 @@ "links": "Controlla se l'editor deve individuare i collegamenti e renderli cliccabili", "colorDecorators": "Controlla se l'editor deve eseguire il rendering del selettore di colore e degli elementi Decorator di tipo colore inline.", "codeActions": "Abilita il codice azione lightbulb", + "codeActionsOnSave.organizeImports": "Eseguire l'organizzazione degli Imports durante il salvataggio?", + "codeActionsOnSave": "Tipi di azione codice da eseguire durante il salvataggio.", + "codeActionsOnSaveTimeout": "Timeout per le azioni codice eseguite durante il salvataggio.", "selectionClipboard": "Controlla se gli appunti primari di Linux devono essere supportati.", "sideBySide": "Controlla se l'editor diff mostra le differenze affiancate o incorporate", "ignoreTrimWhitespace": "Controlla se l'editor diff mostra come differenze le modifiche relative a spazi vuoti iniziali e finali", + "largeFileOptimizations": "Gestione speciale dei file di grandi dimensioni per disabilitare alcune funzionalità che fanno un uso intensivo della memoria.", "renderIndicators": "Consente di controllare se l'editor diff mostra gli indicatori +/- per le modifiche aggiunte/rimosse" } \ No newline at end of file diff --git a/i18n/ita/src/vs/editor/common/view/editorColorRegistry.i18n.json b/i18n/ita/src/vs/editor/common/view/editorColorRegistry.i18n.json index 8456c0eb96c..3ca3c86bce2 100644 --- a/i18n/ita/src/vs/editor/common/view/editorColorRegistry.i18n.json +++ b/i18n/ita/src/vs/editor/common/view/editorColorRegistry.i18n.json @@ -14,6 +14,7 @@ "editorCursorBackground": "Colore di sfondo del cursore editor. Permette di personalizzare il colore di un carattere quando sovrapposto da un blocco cursore.", "editorWhitespaces": "Colore dei caratteri di spazio vuoto nell'editor.", "editorIndentGuides": "Colore delle guide per i rientri dell'editor.", + "editorActiveIndentGuide": "Colore delle guide di indentazione dell'editor attivo", "editorLineNumbers": "Colore dei numeri di riga dell'editor.", "editorActiveLineNumber": "Colore dei numeri per la riga attiva dell'editor", "deprecatedEditorActiveLineNumber": "Id è deprecato. In alternativa utilizzare 'editorLineNumber.activeForeground'.", diff --git a/i18n/ita/src/vs/editor/contrib/codeAction/codeActionCommands.i18n.json b/i18n/ita/src/vs/editor/contrib/codeAction/codeActionCommands.i18n.json index d3f4c9834ab..b1dfa12d604 100644 --- a/i18n/ita/src/vs/editor/contrib/codeAction/codeActionCommands.i18n.json +++ b/i18n/ita/src/vs/editor/contrib/codeAction/codeActionCommands.i18n.json @@ -8,5 +8,12 @@ ], "quickFixWithKb": "Mostra correzioni ({0})", "quickFix": "Mostra correzioni", - "organizeImports.label": "Organizza gli Imports" + "quickfix.trigger.label": "Correzione rapida...", + "editor.action.quickFix.noneMessage": "Azioni codice non disponibili", + "refactor.label": "Effettua refactoring...", + "editor.action.refactor.noneMessage": "Refactoring non disponibili", + "source.label": "Azione origine...", + "editor.action.source.noneMessage": "Azioni origine non disponibili", + "organizeImports.label": "Organizza gli Imports", + "editor.action.organize.noneMessage": "Azioni di organizzazione Imports non disponibili" } \ No newline at end of file diff --git a/i18n/ita/src/vs/editor/contrib/find/findController.i18n.json b/i18n/ita/src/vs/editor/contrib/find/findController.i18n.json index e451940b112..185c7ac6cf1 100644 --- a/i18n/ita/src/vs/editor/contrib/find/findController.i18n.json +++ b/i18n/ita/src/vs/editor/contrib/find/findController.i18n.json @@ -7,6 +7,7 @@ "Do not edit this file. It is machine generated." ], "startFindAction": "Trova", + "startFindWithSelectionAction": "Trova con selezione", "findNextMatchAction": "Trova successivo", "findPreviousMatchAction": "Trova precedente", "nextSelectionMatchFindAction": "Trova selezione successiva", diff --git a/i18n/ita/src/vs/editor/contrib/format/formatActions.i18n.json b/i18n/ita/src/vs/editor/contrib/format/formatActions.i18n.json index 6a24fce8757..85c09bb79a4 100644 --- a/i18n/ita/src/vs/editor/contrib/format/formatActions.i18n.json +++ b/i18n/ita/src/vs/editor/contrib/format/formatActions.i18n.json @@ -12,5 +12,7 @@ "hintnn": "Sono state apportate {0} modifiche di formattazione tra le righe {1} e {2}", "no.provider": "Non c'è alcun formattatore installato per i file '{0}'.", "formatDocument.label": "Formatta documento", - "formatSelection.label": "Formatta selezione" + "no.documentprovider": "Non è installato alcun formattatore di documenti per i file '{0}'.", + "formatSelection.label": "Formatta selezione", + "no.selectionprovider": "Non è installato alcun formattatore di selezione per i file '{0}'." } \ No newline at end of file diff --git a/i18n/ita/src/vs/editor/contrib/links/links.i18n.json b/i18n/ita/src/vs/editor/contrib/links/links.i18n.json index 3c877aef4f6..b8d39472123 100644 --- a/i18n/ita/src/vs/editor/contrib/links/links.i18n.json +++ b/i18n/ita/src/vs/editor/contrib/links/links.i18n.json @@ -10,7 +10,9 @@ "links.navigate": "CTRL + clic per seguire il collegamento", "links.command.mac": "Cmd + click per eseguire il comando", "links.command": "Ctrl + clic per eseguire il comando", + "links.navigate.al.mac": "Opzione + clic per seguire il collegamento", "links.navigate.al": "Alt + clic per seguire il collegamento", + "links.command.al.mac": "Opzione + clic per eseguire il comando", "links.command.al": "Alt + clic per eseguire il comando", "invalid.url": "Non è stato possibile aprire questo collegamento perché il formato non è valido: {0}", "missing.url": "Non è stato possibile aprire questo collegamento perché manca la destinazione.", diff --git a/i18n/ita/src/vs/editor/contrib/message/messageController.i18n.json b/i18n/ita/src/vs/editor/contrib/message/messageController.i18n.json index 35229bd6699..c77490ad4d6 100644 --- a/i18n/ita/src/vs/editor/contrib/message/messageController.i18n.json +++ b/i18n/ita/src/vs/editor/contrib/message/messageController.i18n.json @@ -5,5 +5,6 @@ "Licensed under the MIT License. See License.txt in the project root for license information.", "--------------------------------------------------------------------------------------------", "Do not edit this file. It is machine generated." - ] + ], + "editor.readonly": "Non è possibile modificare nell'editor di sola lettura" } \ No newline at end of file diff --git a/i18n/ita/src/vs/editor/contrib/referenceSearch/referencesWidget.i18n.json b/i18n/ita/src/vs/editor/contrib/referenceSearch/referencesWidget.i18n.json index 58ec8017b25..cbce43a708c 100644 --- a/i18n/ita/src/vs/editor/contrib/referenceSearch/referencesWidget.i18n.json +++ b/i18n/ita/src/vs/editor/contrib/referenceSearch/referencesWidget.i18n.json @@ -25,5 +25,6 @@ "peekViewEditorBackground": "Colore di sfondo dell'editor di visualizzazioni rapide.", "peekViewEditorGutterBackground": "Colore di sfondo della barra di navigazione nell'editor visualizzazione rapida.", "peekViewResultsMatchHighlight": "Colore dell'evidenziazione delle corrispondenze nell'elenco risultati della visualizzazione rapida.", - "peekViewEditorMatchHighlight": "Colore dell'evidenziazione delle corrispondenze nell'editor di visualizzazioni rapide." + "peekViewEditorMatchHighlight": "Colore dell'evidenziazione delle corrispondenze nell'editor di visualizzazioni rapide.", + "peekViewEditorMatchHighlightBorder": "Bordo dell'evidenziazione delle corrispondenze nell'editor di visualizzazioni rapide." } \ No newline at end of file diff --git a/i18n/ita/src/vs/platform/environment/node/argv.i18n.json b/i18n/ita/src/vs/platform/environment/node/argv.i18n.json index 0b775b31aee..9db983246ea 100644 --- a/i18n/ita/src/vs/platform/environment/node/argv.i18n.json +++ b/i18n/ita/src/vs/platform/environment/node/argv.i18n.json @@ -22,12 +22,15 @@ "showVersions": "Mostra le versioni delle estensioni installate, quando si usa --list-extension.", "installExtension": "Installa un'estensione.", "uninstallExtension": "Disinstalla un'estensione.", + "experimentalApis": "Abilita funzionalità di API proposte per un'estensione.", "verbose": "Visualizza l'output dettagliato (implica --wait).", "log": "Livello di logging da utilizzare. Il valore predefinito è 'info'. I valori consentiti sono 'critical, 'error', 'warn', 'info', 'debug', 'trace', 'off'.", "status": "Stampare le informazioni di utilizzo e diagnostica di processo.", "performance": "Eseguire l'avvio con il comando 'Developer: Startup Performance' abilitato.", "prof-startup": "Esegui il profiler della CPU durante l'avvio", "disableExtensions": "Disabilita tutte le estensioni installate.", + "inspect-extensions": "Consente il debug e profiling delle estensioni. Controllare gli strumenti di sviluppo per la URI di connessione.", + "inspect-brk-extensions": "Consente di eseguire debug e profilatura delle estensioni con l'host dell'estensione messo in pausa dopo l'avvio. Controllare gli strumenti di sviluppo per l'URI di connessione.", "disableGPU": "Disabilita l'accelerazione hardware della GPU.", "uploadLogs": "Caricamento dei log della sessione corrente verso un punto di comunicazione sicuro.", "maxMemory": "Dimensione massima della memoria per una finestra (in Mbytes).", diff --git a/i18n/ita/src/vs/platform/extensionManagement/node/extensionManagementService.i18n.json b/i18n/ita/src/vs/platform/extensionManagement/node/extensionManagementService.i18n.json index 87d656a3dd0..fd9808f2dde 100644 --- a/i18n/ita/src/vs/platform/extensionManagement/node/extensionManagementService.i18n.json +++ b/i18n/ita/src/vs/platform/extensionManagement/node/extensionManagementService.i18n.json @@ -7,6 +7,7 @@ "Do not edit this file. It is machine generated." ], "invalidManifest": "Estensione non valida: package.json non è un file JSON.", + "incompatible": "Impossibile installare l'estensione '{0}' in quanto non è compatibile con VS Code '{1}'.", "restartCode": "Riavviare Code prima di reinstallare {0}.", "installingOutdatedExtension": "Una versione più recente di questa estensione è già installata. Vuoi eseguire l'override di questa con la versione precedente?", "override": "Eseguire l'override", @@ -20,6 +21,7 @@ "notFoundCompatibleDependency": "Impossibile installare perché non è stata trovata l'estensione dipendente '{0}' compatibile con la versione corrente '{1}' di VS Code.", "quitCode": "Impossibile installare l'estensione. Riavviare VS Code prima di procedere ad un nuovo setup.", "exitCode": "Impossibile installare l'estensione. Riavviare VS Code prima di procedere ad un nuovo setup.", + "renameError": "Errore sconosciuto durante la ridenominazione di {0} in {1}", "uninstallDependeciesConfirmation": "Disinstallare solo '{0}' o anche le relative dipendenze?", "uninstallOnly": "Solo Estensioni", "uninstallAll": "Disinstalla tutti", diff --git a/i18n/ita/src/vs/platform/extensions/node/extensionValidator.i18n.json b/i18n/ita/src/vs/platform/extensions/node/extensionValidator.i18n.json index 1a38b9222de..d391b80504f 100644 --- a/i18n/ita/src/vs/platform/extensions/node/extensionValidator.i18n.json +++ b/i18n/ita/src/vs/platform/extensions/node/extensionValidator.i18n.json @@ -6,6 +6,7 @@ "--------------------------------------------------------------------------------------------", "Do not edit this file. It is machine generated." ], + "versionSyntax": "Non è stato possibile analizzare il valore {0} di `engines.vscode`. Usare ad esempio: ^1.22.0, ^1.22.x e così via.", "versionSpecificity1": "La versione specificata in `engines.vscode` ({0}) non è abbastanza specifica. Per le versioni di vscode precedenti alla 1.0.0, definire almeno le versioni principale e secondaria desiderate, ad esempio ^0.10.0, 0.10.x, 0.11.0 e così via.", "versionSpecificity2": "La versione specificata in `engines.vscode` ({0}) non è abbastanza specifica. Per le versioni di vscode successive alla 1.0.0, definire almeno la versione principale desiderata, ad esempio ^1.10.0, 1.10.x, 1.x.x, 2.x.x e così via.", "versionMismatch": "L'estensione non è compatibile con Visual Studio Code {0}. Per l'estensione è richiesto: {1}." diff --git a/i18n/ita/src/vs/platform/issue/electron-main/issueService.i18n.json b/i18n/ita/src/vs/platform/issue/electron-main/issueService.i18n.json index bff3003fd32..a87b943cffc 100644 --- a/i18n/ita/src/vs/platform/issue/electron-main/issueService.i18n.json +++ b/i18n/ita/src/vs/platform/issue/electron-main/issueService.i18n.json @@ -6,5 +6,6 @@ "--------------------------------------------------------------------------------------------", "Do not edit this file. It is machine generated." ], - "issueReporter": "Rapporti di issue" + "issueReporter": "Rapporti di issue", + "processExplorer": "Esplora processi" } \ No newline at end of file diff --git a/i18n/ita/src/vs/platform/theme/common/colorRegistry.i18n.json b/i18n/ita/src/vs/platform/theme/common/colorRegistry.i18n.json index 13f14b0041a..f7f5fc15522 100644 --- a/i18n/ita/src/vs/platform/theme/common/colorRegistry.i18n.json +++ b/i18n/ita/src/vs/platform/theme/common/colorRegistry.i18n.json @@ -29,6 +29,7 @@ "inputPlaceholderForeground": "Colore primo piano di casella di input per il testo segnaposto.", "inputValidationInfoBackground": "Colore di sfondo di convalida dell'input di tipo Informazione.", "inputValidationInfoBorder": "Colore bordo di convalida dell'input di tipo Informazione.", + "inputValidationWarningBackground": "Colore di sfondo di convalida dell'input di tipo Avviso.", "inputValidationWarningBorder": "Colore bordo di convalida dell'input di tipo Avviso.", "inputValidationErrorBackground": "Colore di sfondo di convalida dell'input di tipo Errore.", "inputValidationErrorBorder": "Colore bordo di convalida dell'input di tipo Errore.", @@ -70,8 +71,10 @@ "editorSelectionHighlightBorder": "Colore del bordo delle regioni con lo stesso contenuto della selezione.", "editorFindMatch": "Colore della corrispondenza di ricerca corrente.", "findMatchHighlight": "Colore degli altri risultati della ricerca. Il colore non deve essere opaco per evitare di nascondere le decorazioni sottostanti.", + "findRangeHighlight": "Colore dell'intervallo di limite della ricerca. Il colore non deve essere opaco per non nascondere decorazioni sottostanti.", "editorFindMatchBorder": "Colore del bordo della corrispondenza della ricerca corrente.", "findMatchHighlightBorder": "Colore del bordo delle altre corrispondenze della ricerca.", + "findRangeHighlightBorder": "Colore del bordo dell'intervallo di limite della ricerca. Il colore non deve essere opaco per non nascondere decorazioni sottostanti.", "hoverHighlight": "Evidenziazione sotto la parola per cui è visualizzata un'area sensibile al passaggio del mouse. Il colore non deve essere opaco per evitare di nascondere le decorazioni sottostanti.", "hoverBackground": "Colore di sfondo dell'area sensibile al passaggio del mouse dell'editor.", "hoverBorder": "Colore del bordo dell'area sensibile al passaggio del mouse dell'editor.", @@ -85,6 +88,7 @@ "mergeIncomingHeaderBackground": "Sfondo intestazione modifica in ingresso in conflitti di merge in linea. Il colore non deve essere opaco per evitare di nascondere le decorazioni sottostanti.", "mergeIncomingContentBackground": "Sfondo contenuto modifica in ingresso in conflitti di merge in linea. Il colore non deve essere opaco per evitare di nascondere le decorazioni sottostanti.", "mergeCommonHeaderBackground": "Sfondo dell'intestazione dell'antenato comune nei conflitti di merge in linea. Il colore non deve essere opaco per evitare di nascondere le decorazioni sottostanti.", + "mergeCommonContentBackground": "Sfondo del contenuto del predecessore comune in conflitti di merge in line. Il colore non deve essere opaco per non nascondere decorazioni sottostanti.", "mergeBorder": "Colore bordo su intestazioni e sulla barra di divisione di conflitti di merge in linea.", "overviewRulerCurrentContentForeground": "Colore primo piano righello panoramica attuale per i conflitti di merge in linea.", "overviewRulerIncomingContentForeground": "Colore primo piano del righello panoramica modifiche in arrivo per i conflitti di merge in linea.", diff --git a/i18n/ita/src/vs/platform/url/electron-browser/inactiveExtensionUrlHandler.i18n.json b/i18n/ita/src/vs/platform/url/electron-browser/inactiveExtensionUrlHandler.i18n.json index 35229bd6699..46a4d388680 100644 --- a/i18n/ita/src/vs/platform/url/electron-browser/inactiveExtensionUrlHandler.i18n.json +++ b/i18n/ita/src/vs/platform/url/electron-browser/inactiveExtensionUrlHandler.i18n.json @@ -5,5 +5,6 @@ "Licensed under the MIT License. See License.txt in the project root for license information.", "--------------------------------------------------------------------------------------------", "Do not edit this file. It is machine generated." - ] + ], + "confirmUrl": "Consentire all'estensione {0} di aprire l'URL seguente?" } \ No newline at end of file diff --git a/i18n/ita/src/vs/workbench/api/browser/viewsContainersExtensionPoint.i18n.json b/i18n/ita/src/vs/workbench/api/browser/viewsContainersExtensionPoint.i18n.json index 490942db41e..ef90c889f17 100644 --- a/i18n/ita/src/vs/workbench/api/browser/viewsContainersExtensionPoint.i18n.json +++ b/i18n/ita/src/vs/workbench/api/browser/viewsContainersExtensionPoint.i18n.json @@ -6,6 +6,15 @@ "--------------------------------------------------------------------------------------------", "Do not edit this file. It is machine generated." ], + "vscode.extension.contributes.views.containers.id": "ID univoco usato per identificare il contenitore in cui è possibile aggiungere visualizzazioni come contributo usando il punto di aggiunta contributo 'views'", + "vscode.extension.contributes.views.containers.title": "Stringa leggibile usata per il rendering del contenitore", + "vscode.extension.contributes.views.containers.icon": "Percorso dell'icona del contenitore. Le icone, le cui dimensioni sono 24x24, sono centrate in un riquadro le cui dimensioni sono 50x40 e sono caratterizzate dal colore di riempimento 'rgb(215, 218, 224)' o '#d7dae0'. Anche se è accettato qualsiasi tipo di file immagine, per le icone è consigliabile usare il formato SVG.", + "vscode.extension.contributes.viewsContainers": "Aggiunge come contributo contenitori di visualizzazioni all'editor", + "views.container.activitybar": "Aggiunge come contributo contenitori di visualizzazioni alla barra attività", + "test": "Test", + "proposed": "Il contributo 'viewsContainers' è disponibile solo durante l'esecuzione all'esterno dell'ambiente di sviluppo o con l'opzione seguente della riga di comando: --enable-proposed-api {0}", + "requirearray": "i contenitori di visualizzazioni devono essere una matrice", + "requireidstring": "la proprietà `{0}` è obbligatoria e deve essere di tipo `string`. Sono consentiti solo caratteri alfanumerici, '_' e '-'.", "requirestring": "la proprietà `{0}` è obbligatoria e deve essere di tipo `string`", "showViewlet": "Mostra {0}", "view": "Visualizza" diff --git a/i18n/ita/src/vs/workbench/api/browser/viewsExtensionPoint.i18n.json b/i18n/ita/src/vs/workbench/api/browser/viewsExtensionPoint.i18n.json index 076c2427869..1135b733ef3 100644 --- a/i18n/ita/src/vs/workbench/api/browser/viewsExtensionPoint.i18n.json +++ b/i18n/ita/src/vs/workbench/api/browser/viewsExtensionPoint.i18n.json @@ -13,6 +13,12 @@ "vscode.extension.contributes.view.name": "Il nome della visualizzazione. Verrà mostrato", "vscode.extension.contributes.view.when": "Condizione che deve essere vera per mostrare questa visualizzazione", "vscode.extension.contributes.views": "Contribuisce visualizzazioni all'editor", + "views.explorer": "Aggiunge come contributo visualizzazioni al contenitore Esplora risorse nella barra attività", + "views.debug": "Aggiunge come contributo visualizzazioni al contenitore Debug nella barra attività", + "views.scm": "Aggiunge come contributo visualizzazioni al contenitore Gestione controllo servizi nella barra attività", + "views.test": "Aggiunge come contributo visualizzazioni al contenitore Test nella barra attività", + "views.contributed": "Aggiunge come contributo visualizzazioni al contenitore delle visualizzazioni aggiunto come contributo", + "ViewContainerDoesnotExist": "Il contenitore di visualizzazioni '{0}' non esiste e tutte le visualizzazioni registrate verranno aggiunte a 'Esplora risorse'.", "duplicateView1": "Non è possibile registrare più visualizzazioni con stesso ID `{0}` nel percorso `{1}`", "duplicateView2": "Nel percorso `{1}` è già registrata una visualizzazione con ID `{0}` " } \ No newline at end of file diff --git a/i18n/ita/src/vs/workbench/api/electron-browser/mainThreadSaveParticipant.i18n.json b/i18n/ita/src/vs/workbench/api/electron-browser/mainThreadSaveParticipant.i18n.json index ac0f699ab1e..475ba817066 100644 --- a/i18n/ita/src/vs/workbench/api/electron-browser/mainThreadSaveParticipant.i18n.json +++ b/i18n/ita/src/vs/workbench/api/electron-browser/mainThreadSaveParticipant.i18n.json @@ -7,6 +7,7 @@ "Do not edit this file. It is machine generated." ], "timeout.formatOnSave": "Comando Formatta dopo salvataggio interrotto dopo {0} ms", + "codeActionsOnSave.didTimeout": "codeActionsOnSave interrotto dopo {0} ms", "timeout.onWillSave": "Evento onWillSaveTextDocument interrotto dopo 1750 ms", "saveParticipants": "Esecuzione del salvataggio partecipanti..." } \ No newline at end of file diff --git a/i18n/ita/src/vs/workbench/api/electron-browser/mainThreadWebview.i18n.json b/i18n/ita/src/vs/workbench/api/electron-browser/mainThreadWebview.i18n.json index 35229bd6699..8b6ff1d8567 100644 --- a/i18n/ita/src/vs/workbench/api/electron-browser/mainThreadWebview.i18n.json +++ b/i18n/ita/src/vs/workbench/api/electron-browser/mainThreadWebview.i18n.json @@ -5,5 +5,6 @@ "Licensed under the MIT License. See License.txt in the project root for license information.", "--------------------------------------------------------------------------------------------", "Do not edit this file. It is machine generated." - ] + ], + "errorMessage": "Si è verificato un errore durante il tentativo di ripristinare la visualizzazione: {0}" } \ No newline at end of file diff --git a/i18n/ita/src/vs/workbench/browser/parts/editor/editorStatus.i18n.json b/i18n/ita/src/vs/workbench/browser/parts/editor/editorStatus.i18n.json index 00854b582f8..f7d0ba95e12 100644 --- a/i18n/ita/src/vs/workbench/browser/parts/editor/editorStatus.i18n.json +++ b/i18n/ita/src/vs/workbench/browser/parts/editor/editorStatus.i18n.json @@ -17,6 +17,7 @@ "screenReaderDetectedExtra": "Se non si utilizza un'utilità per la lettura dello schermo, si prega di impostare 'editor.accessibilitySupport' a \"off\".", "disableTabMode": "Disabilita modalità accessibilità", "gotoLine": "Vai alla riga", + "selectIndentation": "Seleziona rientro", "selectEncoding": "Seleziona codifica", "selectEOL": "Seleziona sequenza di fine riga", "selectLanguageMode": "Seleziona modalità linguaggio", diff --git a/i18n/ita/src/vs/workbench/browser/parts/editor/resourceViewer.i18n.json b/i18n/ita/src/vs/workbench/browser/parts/editor/resourceViewer.i18n.json index 7d190d76980..7e1b27bff8c 100644 --- a/i18n/ita/src/vs/workbench/browser/parts/editor/resourceViewer.i18n.json +++ b/i18n/ita/src/vs/workbench/browser/parts/editor/resourceViewer.i18n.json @@ -11,7 +11,11 @@ "sizeMB": "{0} MB", "sizeGB": "{0} GB", "sizeTB": "{0} TB", + "largeImageError": "L'immagine non viene visualizzata nell'editor perché è troppo grande ({0}).", "resourceOpenExternalButton": "Aprire l'immagine utilizzando un programma esterno?", + "nativeFileTooLargeError": "Il file non viene visualizzato nell'editor perché è troppo grande ({0}).", + "nativeBinaryError": "Il file non viene visualizzato nell'editor perché è binario o usa una codifica di testo non supportata.", + "openAsText": "Aprirlo comunque?", "zoom.action.fit.label": "Immagine intera", "imgMeta": "{0}x{1} {2}" } \ No newline at end of file diff --git a/i18n/ita/src/vs/workbench/browser/parts/quickinput/quickInput.i18n.json b/i18n/ita/src/vs/workbench/browser/parts/quickinput/quickInput.i18n.json index ba5d6919fd1..d77f9743219 100644 --- a/i18n/ita/src/vs/workbench/browser/parts/quickinput/quickInput.i18n.json +++ b/i18n/ita/src/vs/workbench/browser/parts/quickinput/quickInput.i18n.json @@ -8,5 +8,6 @@ ], "inputModeEntryDescription": "{0} (premere 'INVIO' per confermare oppure 'ESC' per annullare)", "inputModeEntry": "Premere 'INVIO' per confermare l'input oppure 'ESC' per annullare", + "quickInput.countSelected": "{0} selezionati", "ok": "OK" } \ No newline at end of file diff --git a/i18n/ita/src/vs/workbench/browser/parts/quickinput/quickInputBox.i18n.json b/i18n/ita/src/vs/workbench/browser/parts/quickinput/quickInputBox.i18n.json index 35229bd6699..055b435ed78 100644 --- a/i18n/ita/src/vs/workbench/browser/parts/quickinput/quickInputBox.i18n.json +++ b/i18n/ita/src/vs/workbench/browser/parts/quickinput/quickInputBox.i18n.json @@ -5,5 +5,6 @@ "Licensed under the MIT License. See License.txt in the project root for license information.", "--------------------------------------------------------------------------------------------", "Do not edit this file. It is machine generated." - ] + ], + "quickInputBox.ariaLabel": "Digitare per ridurre il numero di risultati." } \ No newline at end of file diff --git a/i18n/ita/src/vs/workbench/electron-browser/actions.i18n.json b/i18n/ita/src/vs/workbench/electron-browser/actions.i18n.json index 4cb81a85d37..9737d645d67 100644 --- a/i18n/ita/src/vs/workbench/electron-browser/actions.i18n.json +++ b/i18n/ita/src/vs/workbench/electron-browser/actions.i18n.json @@ -32,6 +32,7 @@ "openRecent": "Apri recenti...", "quickOpenRecent": "Apertura rapida recenti...", "reportIssueInEnglish": "Segnala problema", + "openProcessExplorer": "Apri Esplora processi", "reportPerformanceIssue": "Segnala problema di prestazioni", "keybindingsReference": "Riferimento per tasti di scelta rapida", "openDocumentationUrl": "Documentazione", diff --git a/i18n/ita/src/vs/workbench/electron-browser/main.contribution.i18n.json b/i18n/ita/src/vs/workbench/electron-browser/main.contribution.i18n.json index b0716c351ce..16fec1a5d98 100644 --- a/i18n/ita/src/vs/workbench/electron-browser/main.contribution.i18n.json +++ b/i18n/ita/src/vs/workbench/electron-browser/main.contribution.i18n.json @@ -80,6 +80,7 @@ "titleBarStyle": "Consente di modificare l'aspetto della barra del titolo della finestra. Per applicare le modifiche, è necessario un riavvio completo.", "window.nativeTabs": "Abilita le finestre di tab per macOS Sierra. La modifica richiede un riavvio. Eventuali personalizzazioni della barra del titolo verranno disabilitate", "window.smoothScrollingWorkaround": "Abilitare questa soluzione alternativa se lo scorrimento non è più fluido dopo il ripristino di una finestra di VS Code ridotta a icona. Si tratta di una soluzione alternativa per un problema (https://github.com/Microsoft/vscode/issues/13612) in cui si verificano ritardi nello scorrimento in dispositivi con trackpad di precisione, come quelli Surface di Microsoft. Se si abilita questa soluzione alternativa, si potrebbe riscontrare un certo sfarfallio del layout dopo aver ripristinato la finestra ridotta a icona alle dimensioni normali, ma in altre situazioni non produce alcun effetto negativo.", + "window.clickThroughInactive": "Se è abilitata, facendo clic su una finestra inattiva si attiverà non solo la finestra, ma anche l'elemento su cui è posizionato il puntatore del mouse se è selezionabile. Se è disabilitata, facendo clic in un punto qualsiasi in una finestra inattiva verrà attivata solo la finestra e sarà necessario fare di nuovo clic sull'elemento.", "zenModeConfigurationTitle": "Modalità Zen", "zenMode.fullScreen": "Consente di controllare se attivando la modalità Zen anche l'area di lavoro passa alla modalità schermo intero.", "zenMode.centerLayout": "Controlla se attivando la modalità Zen viene centrato anche il layout.", diff --git a/i18n/ita/src/vs/workbench/parts/debug/browser/breakpointsView.i18n.json b/i18n/ita/src/vs/workbench/parts/debug/browser/breakpointsView.i18n.json index e07e9f6101f..656b814006f 100644 --- a/i18n/ita/src/vs/workbench/parts/debug/browser/breakpointsView.i18n.json +++ b/i18n/ita/src/vs/workbench/parts/debug/browser/breakpointsView.i18n.json @@ -6,7 +6,10 @@ "--------------------------------------------------------------------------------------------", "Do not edit this file. It is machine generated." ], + "logPoint": "Punto di registrazione", "breakpoint": "Punto di interruzione", + "editBreakpoint": "Modifica {0}...", + "removeBreakpoint": "Rimuovi {0}", "functionBreakpointsNotSupported": "Punti di interruzione delle funzioni non sono supportati da questo tipo di debug", "functionBreakpointPlaceholder": "Funzione per cui inserire il punto di interruzione", "functionBreakPointInputAriaLabel": "Digitare il punto di interruzione della funzione", diff --git a/i18n/ita/src/vs/workbench/parts/debug/browser/debugActions.i18n.json b/i18n/ita/src/vs/workbench/parts/debug/browser/debugActions.i18n.json index 7459163ddb4..68aafa4d9fa 100644 --- a/i18n/ita/src/vs/workbench/parts/debug/browser/debugActions.i18n.json +++ b/i18n/ita/src/vs/workbench/parts/debug/browser/debugActions.i18n.json @@ -21,6 +21,7 @@ "disconnectDebug": "Disconnetti", "continueDebug": "Continua", "pauseDebug": "Sospendi", + "terminateThread": "Termina thread", "restartFrame": "Riavvia frame", "removeBreakpoint": "Rimuovi punto di interruzione", "removeAllBreakpoints": "Rimuovi tutti i punti di interruzione", diff --git a/i18n/ita/src/vs/workbench/parts/debug/electron-browser/breakpointWidget.i18n.json b/i18n/ita/src/vs/workbench/parts/debug/electron-browser/breakpointWidget.i18n.json index 330aaf0d3a7..10c6796d647 100644 --- a/i18n/ita/src/vs/workbench/parts/debug/electron-browser/breakpointWidget.i18n.json +++ b/i18n/ita/src/vs/workbench/parts/debug/electron-browser/breakpointWidget.i18n.json @@ -6,6 +6,7 @@ "--------------------------------------------------------------------------------------------", "Do not edit this file. It is machine generated." ], + "breakpointWidgetLogMessagePlaceholder": "Messaggio da registrare quando viene raggiunto il punto di interruzione. Le espressioni tra parentesi graffe ({}) vengono interpolate. Premere 'INVIO' per accettare, \"ESC\" per annullare.", "breakpointWidgetHitCountPlaceholder": "Interrompe quando viene soddisfatta la condizione del numero di passaggi. Premere 'INVIO' per accettare oppure 'ESC' per annullare.", "breakpointWidgetExpressionPlaceholder": "Interrompe quando l'espressione restituisce true. Premere 'INVIO' per accettare oppure 'ESC' per annullare.", "expression": "Espressione", diff --git a/i18n/ita/src/vs/workbench/parts/debug/electron-browser/debugConfigurationManager.i18n.json b/i18n/ita/src/vs/workbench/parts/debug/electron-browser/debugConfigurationManager.i18n.json index 1655f90169c..eb7562f604d 100644 --- a/i18n/ita/src/vs/workbench/parts/debug/electron-browser/debugConfigurationManager.i18n.json +++ b/i18n/ita/src/vs/workbench/parts/debug/electron-browser/debugConfigurationManager.i18n.json @@ -35,6 +35,7 @@ "useUniqueNames": "Usare nomi di configurazione univoci.", "app.launch.json.compound.folder": "Nome della cartella in cui si trova l'elemento compounds.", "app.launch.json.compounds.configurations": "Nomi delle configurazioni che verranno avviate per questo elemento compounds.", + "debugNoType": "Il \"tipo\" del debugger non può essere omesso e deve essere di tipo \"string\"", "selectDebug": "Seleziona ambiente", "DebugConfig.failed": "Non è possibile creare il file 'launch.json' all'interno della cartella '.vscode' ({0}).", "workspace": "area di lavoro", diff --git a/i18n/ita/src/vs/workbench/parts/debug/electron-browser/debugEditorContribution.i18n.json b/i18n/ita/src/vs/workbench/parts/debug/electron-browser/debugEditorContribution.i18n.json index 423e65922d9..ffb134eab43 100644 --- a/i18n/ita/src/vs/workbench/parts/debug/electron-browser/debugEditorContribution.i18n.json +++ b/i18n/ita/src/vs/workbench/parts/debug/electron-browser/debugEditorContribution.i18n.json @@ -6,7 +6,12 @@ "--------------------------------------------------------------------------------------------", "Do not edit this file. It is machine generated." ], + "logPoint": "Punto di registrazione", "breakpoint": "Punto di interruzione", + "removeBreakpoint": "Rimuovi {0}", + "editBreakpoint": "Modifica {0}...", + "disableBreakpoint": "Disabilita {0}", + "enableBreakpoint": "Abilita {0}", "removeBreakpoints": "Rimuovi punti di interruzione", "removeBreakpointOnColumn": "Rimuovi punto di interruzione a colonna {0}", "removeLineBreakpoint": "Rimuovi punto di interruzione riga", @@ -21,6 +26,11 @@ "addBreakpoint": "Aggiungi punto di interruzione", "addConditionalBreakpoint": "Aggiungi punto di interruzione condizionale...", "addLogPoint": "Aggiungi punto di registrazione...", + "breakpointHasCondition": "Per questo {0} è presente un {1} che verrà perso in seguito alla rimozione. Provare invece a disabilitare il {0}.", + "message": "messaggio", + "condition": "condizione", + "removeLogPoint": "Rimuovi {0}", + "disableLogPoint": "Disabilita {0}", "cancel": "Annulla", "addConfiguration": "Aggiungi configurazione..." } \ No newline at end of file diff --git a/i18n/ita/src/vs/workbench/parts/debug/node/debugger.i18n.json b/i18n/ita/src/vs/workbench/parts/debug/node/debugger.i18n.json index c5d731b3ec8..d7bf531b57e 100644 --- a/i18n/ita/src/vs/workbench/parts/debug/node/debugger.i18n.json +++ b/i18n/ita/src/vs/workbench/parts/debug/node/debugger.i18n.json @@ -16,6 +16,7 @@ "debugRequest": "Tipo della richiesta di configurazione. Può essere \"launch\" o \"attach\".", "debugServer": "Solo per lo sviluppo dell'estensione di debug: se si specifica una porta, Visual Studio Code prova a connettersi a un adattatore di debug in esecuzione in modalità server", "debugPrelaunchTask": "Attività da eseguire prima dell'avvio della sessione di debug.", + "debugPostDebugTask": "Attività da eseguire dopo il completamento della sessione di debug.", "debugWindowsConfiguration": "Attributi della configurazione di avvio specifici di Windows.", "debugOSXConfiguration": "Attributi della configurazione di avvio specifici di OS X.", "debugLinuxConfiguration": "Attributi della configurazione di avvio specifici di Linux.", diff --git a/i18n/ita/src/vs/workbench/parts/extensions/electron-browser/extensionEditor.i18n.json b/i18n/ita/src/vs/workbench/parts/extensions/electron-browser/extensionEditor.i18n.json index b89388c1e2b..89f32dfa7a7 100644 --- a/i18n/ita/src/vs/workbench/parts/extensions/electron-browser/extensionEditor.i18n.json +++ b/i18n/ita/src/vs/workbench/parts/extensions/electron-browser/extensionEditor.i18n.json @@ -36,6 +36,8 @@ "view location": "Dove", "localizations": "Localizzazioni ({0})", "localizations language id": "ID lingua", + "localizations language name": "Nome della lingua", + "localizations localized language name": "Nome della lingua (localizzato)", "colorThemes": "Temi colore ({0})", "iconThemes": "Temi icona ({0})", "colors": "Colori ({0})", diff --git a/i18n/ita/src/vs/workbench/parts/extensions/electron-browser/extensionsViewlet.i18n.json b/i18n/ita/src/vs/workbench/parts/extensions/electron-browser/extensionsViewlet.i18n.json index bb58789eedb..17b06f638b8 100644 --- a/i18n/ita/src/vs/workbench/parts/extensions/electron-browser/extensionsViewlet.i18n.json +++ b/i18n/ita/src/vs/workbench/parts/extensions/electron-browser/extensionsViewlet.i18n.json @@ -14,6 +14,7 @@ "workspaceRecommendedExtensions": "Consigli per l'area di lavoro", "builtInExtensions": "Funzionalità", "builtInThemesExtensions": "Temi", + "builtInBasicsExtensions": "Linguaggi di programmazione", "searchExtensions": "Cerca le estensioni nel Marketplace", "sort by installs": "Ordina per: conteggio installazioni", "sort by rating": "Ordina per: classificazione", diff --git a/i18n/ita/src/vs/workbench/parts/files/browser/editors/textFileEditor.i18n.json b/i18n/ita/src/vs/workbench/parts/files/browser/editors/textFileEditor.i18n.json index 4009655e54b..45337827eb3 100644 --- a/i18n/ita/src/vs/workbench/parts/files/browser/editors/textFileEditor.i18n.json +++ b/i18n/ita/src/vs/workbench/parts/files/browser/editors/textFileEditor.i18n.json @@ -8,6 +8,8 @@ ], "textFileEditor": "Editor file di testo", "createFile": "Crea file", + "relaunchWithIncreasedMemoryLimit": "Riavvia con {0} MB", + "configureMemoryLimit": "Configura limite di memoria", "fileEditorWithInputAriaLabel": "{0}. Editor file di testo.", "fileEditorAriaLabel": "Editor file di testo." } \ No newline at end of file diff --git a/i18n/ita/src/vs/workbench/parts/files/electron-browser/fileActions.i18n.json b/i18n/ita/src/vs/workbench/parts/files/electron-browser/fileActions.i18n.json index 1e7be78fff2..dfd904338b2 100644 --- a/i18n/ita/src/vs/workbench/parts/files/electron-browser/fileActions.i18n.json +++ b/i18n/ita/src/vs/workbench/parts/files/electron-browser/fileActions.i18n.json @@ -13,6 +13,7 @@ "copyFile": "Copia", "pasteFile": "Incolla", "retry": "Riprova", + "renameWhenSourcePathIsParentOfTargetError": "Usare il comando 'Nuova cartella' o 'Nuovo file' per aggiungere elementi figlio a una cartella esistente", "newUntitledFile": "Nuovo file senza nome", "createNewFile": "Nuovo file", "createNewFolder": "Nuova cartella", @@ -32,12 +33,17 @@ "trashFailed": "Impossibile eliminare utilizzando il Cestino. Si desidera eliminare definitivamente invece?", "deletePermanentlyButtonLabel": "&& Eliminare in modo permanente", "retryButtonLabel": "&& Riprova", + "confirmMoveTrashMessageFilesAndDirectories": "Eliminare i {0} file/directory seguenti e il relativo contenuto?", + "confirmMoveTrashMessageMultipleDirectories": "Eliminare le {0} directory seguenti e il relativo contenuto?", "confirmMoveTrashMessageMultiple": "Sei sicuro di voler eliminarei seguenti {0} file?", "confirmMoveTrashMessageFolder": "Eliminare '{0}' e il relativo contenuto?", "confirmMoveTrashMessageFile": "Eliminare '{0}'?", + "confirmDeleteMessageFilesAndDirectories": "Eliminare definitivamente i {0} file/directory seguenti e il relativo contenuto?", + "confirmDeleteMessageMultipleDirectories": "Eliminare definitivamente le {0} directory seguenti e il relativo contenuto?", "confirmDeleteMessageMultiple": "Sei sicuro di voler eliminare permanentemente i seguenti {0} file?", "confirmDeleteMessageFolder": "Eliminare definitivamente '{0}' e il relativo contenuto?", "confirmDeleteMessageFile": "Eliminare definitivamente '{0}'?", + "addFiles": "Aggiungi file", "confirmOverwrite": "Nella cartella di destinazione esiste già un file o una cartella con lo stesso nome. Sovrascrivere?", "replaceButtonLabel": "&&Sostituisci", "fileIsAncestor": "Il file da incollare è un predecessore della cartella di destinazione", @@ -57,7 +63,9 @@ "openFileToShowInNewWindow": "Aprire prima un file per visualizzarlo in un'altra finestra", "copyPath": "Copia percorso", "emptyFileNameError": "È necessario specificare un nome file o un nome di cartella.", + "fileNameStartsWithSlashError": "Un nome di file o cartella non può iniziare con una barra.", "fileNameExistsError": "In questo percorso esiste già un file o una cartella **{0}**. Scegliere un nome diverso.", + "fileUsedAsFolderError": "**{0}** è un file e non può avere discendenti.", "invalidFileNameError": "Il nome **{0}** non è valido per un nome file o un nome di cartella. Scegliere un nome diverso.", "filePathTooLongError": "Con il nome **{0}** il percorso diventa troppo lungo. Scegliere un nome più breve.", "compareWithClipboard": "Confronta il file attivo con gli appunti", diff --git a/i18n/ita/src/vs/workbench/parts/files/electron-browser/files.contribution.i18n.json b/i18n/ita/src/vs/workbench/parts/files/electron-browser/files.contribution.i18n.json index 27f682715d4..a29bf6c8fdd 100644 --- a/i18n/ita/src/vs/workbench/parts/files/electron-browser/files.contribution.i18n.json +++ b/i18n/ita/src/vs/workbench/parts/files/electron-browser/files.contribution.i18n.json @@ -35,6 +35,7 @@ "hotExit": "Controlla se i file non salvati verranno memorizzati tra una sessione e l'altra, consentendo di ignorare il prompt di salvataggio alla chiusura dell'editor.", "useExperimentalFileWatcher": "Usa il nuovo watcher di file sperimentale.", "defaultLanguage": "Modalità linguaggio predefinita assegnata ai nuovi file.", + "maxMemoryForLargeFilesMB": "Controlla la memoria disponibile per VS Code dopo il riavvio durante il tentativo di aprire file di grandi dimensioni. Il risultato è uguale a quanto si specifica --max-memory=NEWSIZE sulla riga di comando.", "editorConfigurationTitle": "Editor", "formatOnSave": "Formatta un file durante il salvataggio. Deve essere disponibile un formattatore, il file non deve essere salvato automaticamente e l'editor non deve essere in fase di chiusura.", "formatOnSaveTimeout": "Timeout per Formatta dopo il salvataggio. Specifica un limite di tempo in millisecondi per i comandi formatOnSave. I comandi che richiedono più tempo del timeout specificato verranno annullati.", diff --git a/i18n/ita/src/vs/workbench/parts/files/electron-browser/views/explorerViewer.i18n.json b/i18n/ita/src/vs/workbench/parts/files/electron-browser/views/explorerViewer.i18n.json index 43b7d826b9f..a54b8fa48ad 100644 --- a/i18n/ita/src/vs/workbench/parts/files/electron-browser/views/explorerViewer.i18n.json +++ b/i18n/ita/src/vs/workbench/parts/files/electron-browser/views/explorerViewer.i18n.json @@ -7,6 +7,9 @@ "Do not edit this file. It is machine generated." ], "fileInputAriaLabel": "Digitare il nome file. Premere INVIO per confermare oppure ESC per annullare.", + "createFileFromExplorerInfoMessage": "Crea il file **{0}** in **{1}**", + "renameFileFromExplorerInfoMessage": "Sposta e rinomina in **{0}**", + "createFolderFromExplorerInfoMessage": "Crea la cartella **{0}** in **{1}**", "filesExplorerViewerAriaLabel": "{0}, Esplora file", "dropFolders": "Aggiungere le cartelle all'area di lavoro?", "dropFolder": "Aggiungere la cartella all'area di lavoro?", diff --git a/i18n/ita/src/vs/workbench/parts/localizations/electron-browser/localizations.contribution.i18n.json b/i18n/ita/src/vs/workbench/parts/localizations/electron-browser/localizations.contribution.i18n.json index f0565a5e515..595160a7a9d 100644 --- a/i18n/ita/src/vs/workbench/parts/localizations/electron-browser/localizations.contribution.i18n.json +++ b/i18n/ita/src/vs/workbench/parts/localizations/electron-browser/localizations.contribution.i18n.json @@ -10,7 +10,9 @@ "yes": "Sì", "no": "No", "neverAgain": "Non visualizzare più questo messaggio", + "install language pack": "Nel prossimo futuro VS Code supporterà solo Language Pack sotto forma di estensioni del Marketplace. Installare l'estensione '{0}' per poter continuare a usare la lingua attualmente configurata. ", "install": "Installa", + "more information": "Altre informazioni...", "JsonSchema.locale": "Linguaggio dell'interfaccia utente da usare.", "vscode.extension.contributes.localizations": "Contribuisce traduzioni all'editor", "vscode.extension.contributes.localizations.languageId": "Id della lingua in cui sono tradotte le stringhe visualizzate.", diff --git a/i18n/ita/src/vs/workbench/parts/markers/electron-browser/markersPanel.i18n.json b/i18n/ita/src/vs/workbench/parts/markers/electron-browser/markersPanel.i18n.json index 35229bd6699..4ec323652b4 100644 --- a/i18n/ita/src/vs/workbench/parts/markers/electron-browser/markersPanel.i18n.json +++ b/i18n/ita/src/vs/workbench/parts/markers/electron-browser/markersPanel.i18n.json @@ -5,5 +5,7 @@ "Licensed under the MIT License. See License.txt in the project root for license information.", "--------------------------------------------------------------------------------------------", "Do not edit this file. It is machine generated." - ] + ], + "disableFilesExclude": "Disabilita filtro di esclusione file.", + "clearFilter": "Cancella filtro." } \ No newline at end of file diff --git a/i18n/ita/src/vs/workbench/parts/markers/electron-browser/markersPanelActions.i18n.json b/i18n/ita/src/vs/workbench/parts/markers/electron-browser/markersPanelActions.i18n.json index 35229bd6699..9cf8a094768 100644 --- a/i18n/ita/src/vs/workbench/parts/markers/electron-browser/markersPanelActions.i18n.json +++ b/i18n/ita/src/vs/workbench/parts/markers/electron-browser/markersPanelActions.i18n.json @@ -5,5 +5,6 @@ "Licensed under the MIT License. See License.txt in the project root for license information.", "--------------------------------------------------------------------------------------------", "Do not edit this file. It is machine generated." - ] + ], + "showing filtered problems": "Visualizzazione di {0} di {1}" } \ No newline at end of file diff --git a/i18n/ita/src/vs/workbench/parts/markers/electron-browser/messages.i18n.json b/i18n/ita/src/vs/workbench/parts/markers/electron-browser/messages.i18n.json index 5a6174bd99e..f06a4d05635 100644 --- a/i18n/ita/src/vs/workbench/parts/markers/electron-browser/messages.i18n.json +++ b/i18n/ita/src/vs/workbench/parts/markers/electron-browser/messages.i18n.json @@ -14,8 +14,13 @@ "markers.panel.title.problems": "Problemi", "markers.panel.aria.label.problems.tree": "Problemi raggruppati per file", "markers.panel.no.problems.build": "Finora non sono stati rilevati problemi nell'area di lavoro.", + "markers.panel.no.problems.filters": "Non sono stati trovati risultati corrispondenti ai criteri di filtro specificati.", + "markers.panel.no.problems.file.exclusions": "Tutti i problemi sono nascosti perché è abilitato il filtro di esclusione file.", + "markers.panel.action.useFilesExclude": "Filtra usando l'impostazione di esclusione file", + "markers.panel.action.donotUseFilesExclude": "Non usare l'impostazione di esclusione file", "markers.panel.action.filter": "Filtra problemi", "markers.panel.filter.ariaLabel": "Filtra problemi", + "markers.panel.filter.placeholder": "Filtro. Ad esempio: text, **/*.ts,!**/node_modules/**", "markers.panel.filter.errors": "errori", "markers.panel.filter.warnings": "avvisi", "markers.panel.filter.infos": "messaggi informativi", diff --git a/i18n/ita/src/vs/workbench/parts/preferences/browser/preferencesEditor.i18n.json b/i18n/ita/src/vs/workbench/parts/preferences/browser/preferencesEditor.i18n.json index 05ccccf41ee..10bf388adfb 100644 --- a/i18n/ita/src/vs/workbench/parts/preferences/browser/preferencesEditor.i18n.json +++ b/i18n/ita/src/vs/workbench/parts/preferences/browser/preferencesEditor.i18n.json @@ -15,6 +15,8 @@ "nlpResult": "Risultati linguaggio naturale", "filterResult": "Risultati filtrati", "defaultSettings": "Impostazioni predefinite", + "defaultUserSettings": "Impostazioni predefinite utente", + "defaultWorkspaceSettings": "Impostazioni area di lavoro predefinite", "defaultFolderSettings": "Impostazioni cartella predefinite", "defaultEditorReadonly": "Modificare nell'editor a destra per ignorare le impostazioni predefinite.", "preferencesAriaLabel": "Preferenze predefinite. Editor di testo di sola lettura." diff --git a/i18n/ita/src/vs/workbench/parts/search/electron-browser/search.contribution.i18n.json b/i18n/ita/src/vs/workbench/parts/search/electron-browser/search.contribution.i18n.json index 3f0b88cd28f..dab16abc980 100644 --- a/i18n/ita/src/vs/workbench/parts/search/electron-browser/search.contribution.i18n.json +++ b/i18n/ita/src/vs/workbench/parts/search/electron-browser/search.contribution.i18n.json @@ -10,6 +10,8 @@ "copyMatchLabel": "Copia", "copyPathLabel": "Copia percorso", "copyAllLabel": "Copia tutti", + "clearSearchHistoryLabel": "Cancella cronologia di ricerca", + "toggleSearchViewPositionLabel": "Attiva/Disattiva ricerca posizione della visualizzazione", "findInFolder": "Trova nella cartella...", "findInWorkspace": "Trova nell'area di lavoro...", "showTriggerActions": "Vai al simbolo nell'area di lavoro...", @@ -28,5 +30,6 @@ "search.quickOpen.includeSymbols": "Configurare questa opzione per includere i risultati di una ricerca di simboli globale nei risultati dei file per Quick Open.", "search.followSymlinks": "Controlla se seguire i collegamenti simbolici durante la ricerca.", "search.smartCase": "Cerca in modo insensibile alle maiuscole/minuscole se il criterio è tutto minuscolo, altrimenti cerca in modalità sensibile a maiuscole/minuscole", - "search.globalFindClipboard": "Controlla se il viewlet di ricerca deve leggere o modificare gli appunti di ricerca condivisi in macOS" + "search.globalFindClipboard": "Controlla se il viewlet di ricerca deve leggere o modificare gli appunti di ricerca condivisi in macOS", + "search.location": "Controlla se la ricerca verrà mostrata come visualizzazione nella barra laterale o come pannello nell'area pannelli per ottenere più spazio orizzontale. Nella prossima versione la ricerca nel pannello avrà un layout orizzontale migliorato e non sarà più disponibile in anteprima." } \ No newline at end of file diff --git a/i18n/ita/src/vs/workbench/parts/tasks/common/taskDefinitionRegistry.i18n.json b/i18n/ita/src/vs/workbench/parts/tasks/common/taskDefinitionRegistry.i18n.json index fa943113b25..273092d0744 100644 --- a/i18n/ita/src/vs/workbench/parts/tasks/common/taskDefinitionRegistry.i18n.json +++ b/i18n/ita/src/vs/workbench/parts/tasks/common/taskDefinitionRegistry.i18n.json @@ -6,7 +6,7 @@ "--------------------------------------------------------------------------------------------", "Do not edit this file. It is machine generated." ], - "TaskDefinition.description": "Tipo di attività effettivo", + "TaskDefinition.description": "Tipo di attività effettivo. Notare che i tipi che iniziano con il carattere '$' sono riservati per l'utilizzo interno.", "TaskDefinition.properties": "Proprietà aggiuntive del tipo di attività", "TaskTypeConfiguration.noType": "Nella configurazione del tipo di attività manca la proprietà obbligatoria 'taskType'", "TaskDefinitionExtPoint": "Tipi di attività per contributes" diff --git a/i18n/ita/src/vs/workbench/parts/tasks/electron-browser/task.contribution.i18n.json b/i18n/ita/src/vs/workbench/parts/tasks/electron-browser/task.contribution.i18n.json index f4b25f34a5c..83baac91404 100644 --- a/i18n/ita/src/vs/workbench/parts/tasks/electron-browser/task.contribution.i18n.json +++ b/i18n/ita/src/vs/workbench/parts/tasks/electron-browser/task.contribution.i18n.json @@ -31,6 +31,8 @@ "selectProblemMatcher": "Selezionare il tipo di errori e di avvisi per cui analizzare l'output dell'attività", "customizeParseErrors": "La configurazione dell'attività corrente presenta errori. Per favore correggere gli errori prima di personalizzazione un'attività.", "moreThanOneBuildTask": "tasks.json contiene molte attività di compilazione. È in corso l'esecuzione della prima.\n", + "TaskSystem.activeSame.background": "L'attività '{0}' è già attiva e in modalità background.", + "TaskSystem.activeSame.noBackground": "L'attività '{0}' è già attiva.", "terminateTask": "Termina attività", "restartTask": "Riavvia attività", "TaskSystem.active": "Al momento c'è già un'attività in esecuzione. Terminarla prima di eseguirne un'altra.", diff --git a/i18n/ita/src/vs/workbench/parts/tasks/electron-browser/terminalTaskSystem.i18n.json b/i18n/ita/src/vs/workbench/parts/tasks/electron-browser/terminalTaskSystem.i18n.json index cb38000a670..aed34db2d6d 100644 --- a/i18n/ita/src/vs/workbench/parts/tasks/electron-browser/terminalTaskSystem.i18n.json +++ b/i18n/ita/src/vs/workbench/parts/tasks/electron-browser/terminalTaskSystem.i18n.json @@ -11,6 +11,6 @@ "TerminalTaskSystem.terminalName": "Attività - {0}", "closeTerminal": "Premere un tasto qualsiasi per chiudere il terminale.", "reuseTerminal": "Terminale verrà riutilizzato dalle attività, premere un tasto qualsiasi per chiuderlo.", - "TerminalTaskSystem": "Non è possibile eseguire un comando della shell su un'unità UNC.", + "TerminalTaskSystem": "Non è possibile eseguire un comando della shell su un'unità UNC con cmd.exe.", "unkownProblemMatcher": "Il matcher problemi {0} non può essere risolto. il matcher verrà ignorato" } \ No newline at end of file diff --git a/i18n/ita/src/vs/workbench/parts/terminal/electron-browser/terminalActions.i18n.json b/i18n/ita/src/vs/workbench/parts/terminal/electron-browser/terminalActions.i18n.json index d18ee9b5c9c..42d1b0441a4 100644 --- a/i18n/ita/src/vs/workbench/parts/terminal/electron-browser/terminalActions.i18n.json +++ b/i18n/ita/src/vs/workbench/parts/terminal/electron-browser/terminalActions.i18n.json @@ -21,6 +21,7 @@ "workbench.action.terminal.newWorkspacePlaceholder": "Selezionare la cartella di lavoro corrente per un nuovo terminale.", "workbench.action.terminal.newInActiveWorkspace": "Crea un nuovo terminale integrato (nel workspace attivo)", "workbench.action.terminal.split": "Terminale diviso", + "workbench.action.terminal.splitInActiveWorkspace": "Terminale diviso (nell'area di lavoro attiva)", "workbench.action.terminal.focusPreviousPane": "Sposta stato attivo sul riquadro precedente", "workbench.action.terminal.focusNextPane": "Sposta stato attivo sul riquadro successivo", "workbench.action.terminal.resizePaneLeft": "Ridimensiona il riquadro a sinistra", @@ -43,6 +44,7 @@ "workbench.action.terminal.scrollUpPage": "Scorri su (pagina)", "workbench.action.terminal.scrollToTop": "Scorri all'inizio", "workbench.action.terminal.clear": "Cancella", + "workbench.action.terminal.clearSelection": "Cancella selezione", "workbench.action.terminal.allowWorkspaceShell": "Consente la configurazione della Shell dell'area di lavoro", "workbench.action.terminal.disallowWorkspaceShell": "Non consente la configurazione della Shell dell'area di lavoro", "workbench.action.terminal.rename": "Rinomina", @@ -52,6 +54,8 @@ "nextTerminalFindTerm": "Mostra il termine di ricerca successivo", "previousTerminalFindTerm": "Mostra il termine di ricerca precedente", "quickOpenTerm": "Cambia terminale attivo", + "workbench.action.terminal.scrollToPreviousCommand": "Scorri al comando precedente", + "workbench.action.terminal.scrollToNextCommand": "Scorri al comando successivo", "workbench.action.terminal.selectToPreviousCommand": "Aggiungi selezione a comando precedente", "workbench.action.terminal.selectToNextCommand": "Aggiungi selezione a comando successivo" } \ No newline at end of file diff --git a/i18n/ita/src/vs/workbench/parts/terminal/electron-browser/terminalInstance.i18n.json b/i18n/ita/src/vs/workbench/parts/terminal/electron-browser/terminalInstance.i18n.json index 26ff40d49d3..e7c8e507835 100644 --- a/i18n/ita/src/vs/workbench/parts/terminal/electron-browser/terminalInstance.i18n.json +++ b/i18n/ita/src/vs/workbench/parts/terminal/electron-browser/terminalInstance.i18n.json @@ -12,5 +12,6 @@ "terminal.integrated.copySelection.noSelection": "Il terminale non contiene alcuna selezione da copiare", "terminal.integrated.exitedWithCode": "Il processo del terminale è stato terminato. Codice di uscita: {0}", "terminal.integrated.waitOnExit": "Premere un tasto qualsiasi per chiudere il terminale", - "terminal.integrated.launchFailed": "Non è stato possibile avviare il comando '{0}{1}' del processo del terminale (codice di uscita: {2})" + "terminal.integrated.launchFailed": "Non è stato possibile avviare il comando '{0}{1}' del processo del terminale (codice di uscita: {2})", + "terminal.integrated.launchFailedExtHost": "Non è stato possibile avviare il processo del terminale (codice di uscita: {0})" } \ No newline at end of file diff --git a/i18n/ita/src/vs/workbench/parts/update/electron-browser/update.i18n.json b/i18n/ita/src/vs/workbench/parts/update/electron-browser/update.i18n.json index c1d4fe9a7f2..aed35ee0f73 100644 --- a/i18n/ita/src/vs/workbench/parts/update/electron-browser/update.i18n.json +++ b/i18n/ita/src/vs/workbench/parts/update/electron-browser/update.i18n.json @@ -18,8 +18,10 @@ "thereIsUpdateAvailable": "È disponibile un aggiornamento.", "download now": "Scarica ora", "later": "In seguito", + "updateAvailable": "È disponibile un aggiornamento: {0} {1}", "installUpdate": "Installa aggiornamento", "updateInstalling": "{0} {1} verrà installato in background. Al termine, verrà visualizzato un messaggio.", + "updateAvailableAfterRestart": "Riavviare {0} per applicare l'aggiornamento più recente.", "updateNow": "Aggiorna adesso", "commandPalette": "Riquadro comandi...", "settings": "Impostazioni", diff --git a/i18n/ita/src/vs/workbench/parts/url/electron-browser/url.contribution.i18n.json b/i18n/ita/src/vs/workbench/parts/url/electron-browser/url.contribution.i18n.json index 2011975d153..b57afe97dea 100644 --- a/i18n/ita/src/vs/workbench/parts/url/electron-browser/url.contribution.i18n.json +++ b/i18n/ita/src/vs/workbench/parts/url/electron-browser/url.contribution.i18n.json @@ -6,5 +6,6 @@ "--------------------------------------------------------------------------------------------", "Do not edit this file. It is machine generated." ], + "openUrl": "Apri URL", "developer": "Sviluppatore" } \ No newline at end of file diff --git a/i18n/ita/src/vs/workbench/parts/welcome/overlay/browser/welcomeOverlay.i18n.json b/i18n/ita/src/vs/workbench/parts/welcome/overlay/browser/welcomeOverlay.i18n.json index 73f3dde4e71..3251e4b60b4 100644 --- a/i18n/ita/src/vs/workbench/parts/welcome/overlay/browser/welcomeOverlay.i18n.json +++ b/i18n/ita/src/vs/workbench/parts/welcome/overlay/browser/welcomeOverlay.i18n.json @@ -13,6 +13,7 @@ "welcomeOverlay.extensions": "Gestisci le estensioni", "welcomeOverlay.problems": "Visualizza errori e avvisi", "welcomeOverlay.commandPalette": "Trova ed esegui tutti i comandi", + "welcomeOverlay.notifications": "Mostra notifiche", "welcomeOverlay": "Panoramica interfaccia utente", "hideWelcomeOverlay": "Nascondi panoramica interfaccia", "help": "Guida" diff --git a/i18n/ita/src/vs/workbench/parts/welcome/page/electron-browser/vs_code_welcome_page.i18n.json b/i18n/ita/src/vs/workbench/parts/welcome/page/electron-browser/vs_code_welcome_page.i18n.json index 7d4936d889c..4042bb544ec 100644 --- a/i18n/ita/src/vs/workbench/parts/welcome/page/electron-browser/vs_code_welcome_page.i18n.json +++ b/i18n/ita/src/vs/workbench/parts/welcome/page/electron-browser/vs_code_welcome_page.i18n.json @@ -27,6 +27,8 @@ "welcomePage.installExtensionPacks": "Strumenti e linguaggi", "welcomePage.installExtensionPacksDescription": "Installare il supporto per {0} e {1}", "welcomePage.moreExtensions": "altro", + "welcomePage.installKeymapDescription": "Impostazioni e tasti di scelta rapida", + "welcomePage.installKeymapExtension": "Installa le impostazioni e i tasti di scelta rapida di {0} e {1}", "welcomePage.others": "altri", "welcomePage.colorTheme": "Tema colori", "welcomePage.colorThemeDescription": "Tutto quel che serve per configurare editor e codice nel modo desiderato", diff --git a/i18n/ita/src/vs/workbench/services/configuration/common/configurationExtensionPoint.i18n.json b/i18n/ita/src/vs/workbench/services/configuration/common/configurationExtensionPoint.i18n.json index 34686a60cf9..4c232882e6c 100644 --- a/i18n/ita/src/vs/workbench/services/configuration/common/configurationExtensionPoint.i18n.json +++ b/i18n/ita/src/vs/workbench/services/configuration/common/configurationExtensionPoint.i18n.json @@ -8,6 +8,7 @@ ], "vscode.extension.contributes.configuration.title": "Riepilogo delle impostazioni. Questa etichetta verrà usata nel file di impostazioni come commento di separazione.", "vscode.extension.contributes.configuration.properties": "Descrizione delle proprietà di configurazione.", + "scope.application.description": "Configurazione specifica dell'applicazione, che può essere configurata solo in Impostazioni utente.", "scope.window.description": "Configurazione specifica della finestra, che può essere configurata nelle impostazioni dell'utente o dell'area di lavoro.", "scope.resource.description": "Configurazione specifica di risorse, che possono essere configurate nelle impostazioni utente, in quelle dell'area di lavoro o di una cartella.", "scope.description": "Ambito in cui la configurazione è applicabile. Gli ambiti disponibili sono 'finestra' e 'risorsa'.", diff --git a/i18n/ita/src/vs/workbench/services/configuration/node/configurationEditingService.i18n.json b/i18n/ita/src/vs/workbench/services/configuration/node/configurationEditingService.i18n.json index 25de7b826b6..73635731361 100644 --- a/i18n/ita/src/vs/workbench/services/configuration/node/configurationEditingService.i18n.json +++ b/i18n/ita/src/vs/workbench/services/configuration/node/configurationEditingService.i18n.json @@ -11,6 +11,7 @@ "open": "Apri impostazioni", "saveAndRetry": "Salva e riprova", "errorUnknownKey": "Impossibile scrivere {0} perché {1} non è una configurazione registrata.", + "errorInvalidWorkspaceConfigurationApplication": "Non è possibile scrivere {0} in Impostazioni area di lavoro. Questa impostazione può essere scritta solo in Impostazioni utente.", "errorInvalidFolderConfiguration": "Impossibile scrivere nella cartella impostazioni perché {0} non supporta l'ambito di risorsa della cartella.", "errorInvalidUserTarget": "Impossibile scrivere le impostazioni utente perché {0} non supporta l'ambito globale.", "errorInvalidWorkspaceTarget": "Impossibile scrivere nell'area di lavoro perché {0} non supporta l'ambito globale in un'area di lavoro a cartelle multiple.", diff --git a/i18n/ita/src/vs/workbench/services/configuration/node/configurationService.i18n.json b/i18n/ita/src/vs/workbench/services/configuration/node/configurationService.i18n.json index 96561150bb5..35c50e0a9d8 100644 --- a/i18n/ita/src/vs/workbench/services/configuration/node/configurationService.i18n.json +++ b/i18n/ita/src/vs/workbench/services/configuration/node/configurationService.i18n.json @@ -6,5 +6,6 @@ "--------------------------------------------------------------------------------------------", "Do not edit this file. It is machine generated." ], + "unsupportedApplicationSetting": "Questa impostazione può essere applicata solo in Impostazioni utente", "unsupportedWindowSetting": "Non è possibile applicare ora questa impostazione. Verrà applicata direttamente all'apertura della cartella." } \ No newline at end of file diff --git a/i18n/ita/src/vs/workbench/services/configurationResolver/node/variableResolver.i18n.json b/i18n/ita/src/vs/workbench/services/configurationResolver/node/variableResolver.i18n.json index 35229bd6699..a7e1f925508 100644 --- a/i18n/ita/src/vs/workbench/services/configurationResolver/node/variableResolver.i18n.json +++ b/i18n/ita/src/vs/workbench/services/configurationResolver/node/variableResolver.i18n.json @@ -5,5 +5,16 @@ "Licensed under the MIT License. See License.txt in the project root for license information.", "--------------------------------------------------------------------------------------------", "Do not edit this file. It is machine generated." - ] + ], + "missingEnvVarName": "Non è possibile risolvere '{0}' perché non è assegnato alcun nome di variabile di ambiente.", + "configNotFound": "Non è possibile risolvere '{0}' perché l'impostazione '{1}' non è stata trovata.", + "configNoString": "Non è possibile risolvere '{0}' perché '{1}' è un valore strutturato.", + "missingConfigName": "Non è possibile risolvere '{0}' perché non è assegnato alcun nome di impostazioni.", + "noValueForCommand": "Non è possibile risolvere '{0}' perché al comando non è assegnato alcun valore.", + "canNotFindFolder": "Non è possibile risolvere '{0}'. La cartella '{1}' non esiste.", + "canNotResolveWorkspaceFolderMultiRoot": "Non è possibile risolvere '{0}' in un'area di lavoro a cartelle multiple. Assegnare un ambito a questa variabile usando ':' e un nome di cartella dell'area di lavoro.", + "canNotResolveWorkspaceFolder": "Non è possibile risolvere '{0}'. Aprire una cartella.", + "canNotResolveFile": "Non è possibile risolvere '{0}'. Aprire un editor.", + "canNotResolveLineNumber": "Non è possibile risolvere '{0}'. Assicurarsi che sia selezionata una riga nell'editor attivo.", + "canNotResolveSelectedText": "Non è possibile risolvere '{0}'. Assicurarsi che sia selezionato del testo nell'editor attivo." } \ No newline at end of file diff --git a/i18n/ita/src/vs/workbench/services/extensions/common/extensionsRegistry.i18n.json b/i18n/ita/src/vs/workbench/services/extensions/common/extensionsRegistry.i18n.json index c432e186411..c8cae817c45 100644 --- a/i18n/ita/src/vs/workbench/services/extensions/common/extensionsRegistry.i18n.json +++ b/i18n/ita/src/vs/workbench/services/extensions/common/extensionsRegistry.i18n.json @@ -6,10 +6,12 @@ "--------------------------------------------------------------------------------------------", "Do not edit this file. It is machine generated." ], + "vscode.extension.engines": "Compatibilità del motore.", "vscode.extension.engines.vscode": "Per le estensioni di Visual Studio Code consente di specificare la versione di Visual Studio Code con cui è compatibile l'estensione. Non può essere *. Ad esempio: ^0.10.5 indica la compatibilità con la versione minima 0.10.5 di Visual Studio Code.", "vscode.extension.publisher": "Editore dell'estensione Visual Studio Code.", "vscode.extension.displayName": "Nome visualizzato per l'estensione usato nella raccolta di Visual Studio Code.", "vscode.extension.categories": "Categorie usate dalla raccolta di Visual Studio Code per definire la categoria dell'estensione.", + "vscode.extension.category.languages.deprecated": "Usa in alternativa 'Linguaggi di programmazione'", "vscode.extension.galleryBanner": "Banner usato nel marketplace di Visual Studio Code.", "vscode.extension.galleryBanner.color": "Colore del banner nell'intestazione pagina del marketplace di Visual Studio Code.", "vscode.extension.galleryBanner.theme": "Tema colori per il tipo di carattere usato nel banner.", @@ -23,11 +25,14 @@ "vscode.extension.activationEvents.onDebugResolve": "Un evento di attivazione emesso ogni volta che una sessione di debug di tipo specifico sta per essere lanciata (e un corrispondente metodo resolveDebugConfiguration deve essere chiamato).", "vscode.extension.activationEvents.workspaceContains": "Un evento di attivazione emesso ogni volta che si apre una cartella che contiene almeno un file corrispondente al criterio GLOB specificato.", "vscode.extension.activationEvents.onView": "Un evento di attivazione emesso ogni volta che la visualizzazione specificata viene espansa.", + "vscode.extension.activationEvents.onUri": "Un evento di attivazione emesso ogni volta che viene aperto un URI a livello di sistema indirizzato a questa estensione.", "vscode.extension.activationEvents.star": "Un evento di attivazione emesso all'avvio di VS Code. Per garantire la migliore esperienza per l'utente finale, sei pregato di utilizzare questo evento di attivazione nella tua estensione solo quando nessun'altra combinazione di eventi di attivazione funziona nel tuo caso.", "vscode.extension.badges": "Matrice di notifiche da visualizzare nella barra laterale della pagina delle estensioni del Marketplace.", "vscode.extension.badges.url": "URL di immagine della notifica.", "vscode.extension.badges.href": "Collegamento della notifica.", "vscode.extension.badges.description": "Descrizione della notifica.", + "vscode.extension.markdown": "Controlla il motore di rendering di Markdown usato nel Marketplace. Può essere github (impostazione predefinita) o standard.", + "vscode.extension.qna": "Controlla il collegamento alle domande frequenti nel Marketplace. Impostare su marketplace per abilitare il sito predefinito delle domande frequenti nel Marketplace. Impostare su una stringa per specificare l'URL di un sito personalizzato di domande frequenti. Impostare su false per disabilitare la sezione delle domande frequenti.", "vscode.extension.extensionDependencies": "Dipendenze ad altre estensioni. L'identificatore di un'estensione è sempre ${publisher}.${name}. Ad esempio: vscode.csharp.", "vscode.extension.scripts.prepublish": "Script eseguito prima che il pacchetto venga pubblicato come estensione Visual Studio Code.", "vscode.extension.scripts.uninstall": "Hook di disinstallazione per l'estensione VS Code. Script che viene eseguito quando l'estensione viene disinstallata completamente da VS Code, ovvero quando VS Code viene riavviato (arresto e avvio) dopo la disinstallazione dell'estensione. Sono supportati solo gli script Node.", diff --git a/i18n/ita/src/vs/workbench/services/extensions/electron-browser/extensionService.i18n.json b/i18n/ita/src/vs/workbench/services/extensions/electron-browser/extensionService.i18n.json index 05e96e21215..c2d273b94b1 100644 --- a/i18n/ita/src/vs/workbench/services/extensions/electron-browser/extensionService.i18n.json +++ b/i18n/ita/src/vs/workbench/services/extensions/electron-browser/extensionService.i18n.json @@ -6,8 +6,10 @@ "--------------------------------------------------------------------------------------------", "Do not edit this file. It is machine generated." ], + "extensionsDisabled": "Tutte le estensioni sono disabilitate.", "extensionHostProcess.crash": "L'host dell'estensione è stato terminato in modo imprevisto.", "extensionHostProcess.unresponsiveCrash": "L'host dell'estensione è stato terminato perché non rispondeva.", + "devTools": "Apri strumenti di sviluppo", "restart": "Riavvia host dell'estensione", "overwritingExtension": "Sovrascrittura dell'estensione {0} con {1}.", "extensionUnderDevelopment": "Caricamento dell'estensione di sviluppo in {0}", diff --git a/i18n/ita/src/vs/workbench/services/files/electron-browser/fileService.i18n.json b/i18n/ita/src/vs/workbench/services/files/electron-browser/fileService.i18n.json index 5b7706bdc38..9d7b1a95836 100644 --- a/i18n/ita/src/vs/workbench/services/files/electron-browser/fileService.i18n.json +++ b/i18n/ita/src/vs/workbench/services/files/electron-browser/fileService.i18n.json @@ -14,6 +14,7 @@ "fileInvalidPath": "Risorsa del file non valida ({0})", "fileIsDirectoryError": "Il File è una Directory", "fileNotModifiedError": "File non modificato dal giorno", + "fileTooLargeForHeapError": "Per aprire un file di queste dimensioni, è necessario riavviare VS Code e consentirgli di usare più memoria", "fileTooLargeError": "File troppo grande per essere aperto", "fileNotFoundError": "Il file non è stato trovato ({0})", "fileBinaryError": "Il file sembra essere binario e non può essere aperto come file di testo", diff --git a/i18n/ita/src/vs/workbench/services/files/electron-browser/remoteFileService.i18n.json b/i18n/ita/src/vs/workbench/services/files/electron-browser/remoteFileService.i18n.json index 0679938a47a..053d9ee5638 100644 --- a/i18n/ita/src/vs/workbench/services/files/electron-browser/remoteFileService.i18n.json +++ b/i18n/ita/src/vs/workbench/services/files/electron-browser/remoteFileService.i18n.json @@ -9,5 +9,7 @@ "fileNotFoundError": "Il file non è stato trovato ({0})", "fileIsDirectoryError": "Il File è una Directory", "fileNotModifiedError": "File non modificato dal giorno", - "fileBinaryError": "Il file sembra essere binario e non può essere aperto come file di testo" + "fileBinaryError": "Il file sembra essere binario e non può essere aperto come file di testo", + "err.create": "Non è stato possibile creare il file {0}", + "fileMoveConflict": "Non è possibile eseguire operazioni di spostamento/copia. Il file esiste già nella destinazione." } \ No newline at end of file diff --git a/i18n/jpn/extensions/git/out/commands.i18n.json b/i18n/jpn/extensions/git/out/commands.i18n.json index 9b386d3755b..790d0e373f9 100644 --- a/i18n/jpn/extensions/git/out/commands.i18n.json +++ b/i18n/jpn/extensions/git/out/commands.i18n.json @@ -11,9 +11,7 @@ "create branch": "$(plus) 新しいブランチを作成", "repourl": "リポジトリ URL", "parent": "親ディレクトリ", - "cancel": "$(sync~spin) リポジトリのクローン中... キャンセルをクリックしてください", - "cancel tooltip": "クローンのキャンセル", - "cloning": "Git リポジトリを複製しています...", + "cloning": "Git リポジトリ '{0}' を複製しています...", "openrepo": "リポジトリを開く", "proposeopen": "クローンしたリポジトリを開きますか?", "init": "Git リポジトリを初期化するワークスペース フォルダーを選択してください", diff --git a/i18n/jpn/extensions/npm/out/npmView.i18n.json b/i18n/jpn/extensions/npm/out/npmView.i18n.json index 66b27154854..65a4786ba26 100644 --- a/i18n/jpn/extensions/npm/out/npmView.i18n.json +++ b/i18n/jpn/extensions/npm/out/npmView.i18n.json @@ -6,6 +6,6 @@ "--------------------------------------------------------------------------------------------", "Do not edit this file. It is machine generated." ], - "npm.noDebugOptions": "\"{0}\"のデバッグを起動できませんでした。スクリプトに node debug オプションを含める必要があります: \"--nolazy --inspect-brk=port\"、[詳細](https://code.visualstudio.com/docs/nodejs/nodejs-debugging#_launch-configuration-support-for-npm-and-other-tools)。", + "npm.noDebugOptions": "スクリプトの Node デバッグ オプションが不足しているため、\"{0}\" をデバッグ起動できません。例: --inspect-brk\"。", "npm.scriptInvalid": "スクリプト '{0}' が見つかりませんでした。ビューを更新してください。" } \ No newline at end of file diff --git a/i18n/jpn/extensions/npm/package.i18n.json b/i18n/jpn/extensions/npm/package.i18n.json index 30a98e70711..dc9753211e4 100644 --- a/i18n/jpn/extensions/npm/package.i18n.json +++ b/i18n/jpn/extensions/npm/package.i18n.json @@ -22,5 +22,5 @@ "command.debug": "デバッグ", "command.openScript": "Open", "npm.scriptInvalid": "スクリプト '{0}' が見つかりませんでした。ビューを更新してください。", - "npm.noDebugOptions": "'{0}' のデバッグを起動できませんでした。スクリプトに node debug オプションを含める必要があります: '--nolazy --inspect-brk=port'、[詳細](https://code.visualstudio.com/docs/nodejs/nodejs-debugging#_launch-configuration-support-for-npm-and-other-tools)`" + "npm.noDebugOptions": "スクリプトの Node デバッグ オプションが不足しているため、\"{0}\" をデバッグ起動できません。例: --inspect-brk\"。" } \ No newline at end of file diff --git a/i18n/jpn/src/vs/code/electron-main/menus.i18n.json b/i18n/jpn/src/vs/code/electron-main/menus.i18n.json index 67126552f23..712508a7ad6 100644 --- a/i18n/jpn/src/vs/code/electron-main/menus.i18n.json +++ b/i18n/jpn/src/vs/code/electron-main/menus.i18n.json @@ -146,7 +146,7 @@ "miConditionalBreakpoint": "条件付きブレークポイント(&&C)...", "miColumnBreakpoint": "列のブレークポイント(&&O)", "miFunctionBreakpoint": "関数のブレークポイント(&&F)...", - "miLogPoint": "ログ ポイント(&&L)...", + "miLogPoint": "ログポイント(&&L)", "miNewBreakpoint": "新しいブレークポイント(&&N)", "miEnableAllBreakpoints": "すべてのブレークポイントを有効にする", "miDisableAllBreakpoints": "すべてのブレークポイントを無効にする(&&L)", diff --git a/i18n/jpn/src/vs/editor/common/config/commonEditorConfig.i18n.json b/i18n/jpn/src/vs/editor/common/config/commonEditorConfig.i18n.json index 61fb3badc1a..13726b08713 100644 --- a/i18n/jpn/src/vs/editor/common/config/commonEditorConfig.i18n.json +++ b/i18n/jpn/src/vs/editor/common/config/commonEditorConfig.i18n.json @@ -107,12 +107,11 @@ "colorDecorators": "エディターでインライン カラー デコレーターと色の選択を表示する必要があるかどうかを制御します。", "codeActions": "コード アクション (lightbulb) を有効にする", "codeActionsOnSave.organizeImports": "保存時にインポートの整理を実行しますか?", - "codeActionsOnSave": "保存時に実行されるコード アクションの種類。", + "codeActionsOnSave": "保存時に実行されるコードアクションの種類。", "codeActionsOnSaveTimeout": "保存時に実行されるコード アクションのタイムアウト値。", "selectionClipboard": "Linux の PRIMARY クリップボードをサポートするかどうかを制御します。", "sideBySide": "差分エディターが差分を横に並べて表示するか、行内に表示するかを制御します", "ignoreTrimWhitespace": "差分エディターが、先頭または末尾の空白の変更を差分として表示するかどうかを制御します。", - "largeFileSize": "特別な最適化ルールが適用されるバイト単位でファイルサイズのしきい値を制御します", - "largeFileLineCount": "特別な最適化ルールが適用される行数の観点からファイルサイズのしきい値を制御します", + "largeFileOptimizations": "大きなファイルでメモリが集中する特定の機能を無効にするための特別な処理。", "renderIndicators": "差分エディターが追加/削除された変更に +/- インジケーターを示すかどうかを制御します" } \ No newline at end of file diff --git a/i18n/jpn/src/vs/workbench/api/browser/viewsContainersExtensionPoint.i18n.json b/i18n/jpn/src/vs/workbench/api/browser/viewsContainersExtensionPoint.i18n.json index 258ab3ea248..a21d3093051 100644 --- a/i18n/jpn/src/vs/workbench/api/browser/viewsContainersExtensionPoint.i18n.json +++ b/i18n/jpn/src/vs/workbench/api/browser/viewsContainersExtensionPoint.i18n.json @@ -8,11 +8,13 @@ ], "vscode.extension.contributes.views.containers.id": "'views' コントリビューション ポイントを使用して提供できるコンテナを識別するための一意の ID", "vscode.extension.contributes.views.containers.title": "コンテナーの表示に使用する、人が判別できる文字列", - "vscode.extension.contributes.views.containers.icon": "コンテナー アイコンへのパス", - "vscode.extension.contributes.viewsContainer": "ビュー コンテナをエディターに提供します", + "vscode.extension.contributes.views.containers.icon": "コンテナ アイコンのパス。アイコンは、50x40 の四角形の中心に配置された 24x24 のサイズで、'rgb(215, 218, 224)' または '#d7dae0' の色で塗りつぶされます。アイコンでは、任意の種類の画像を使用できますが、SVG にすることをお勧めします。", + "vscode.extension.contributes.viewsContainers": "ビュー コンテナをエディターに提供します", "views.container.activitybar": "アクティビティ バーにビュー コンテナを提供します", - "proposed": "'viewsContainer' コントリビューションは dev または次のコマンド ライン スイッチを使用しているときのみ使用できます: --enable-proposed-api {1}", + "test": "テスト", + "proposed": "'viewsContainers' コントリビューションは、dev または次のコマンド ライン スイッチを使用しているときにのみ用いることができます: --enable-proposed-api {0}", "requirearray": "ビュー コンテナは配列である必要があります", + "requireidstring": "プロパティ '{0}' は必須で、'string' 型でなければなりません。使用できるのは、半角英数字、'_'、'-' のみです。", "requirestring": " `{0}` プロパティは必須で、`string` 型でなければなりません", "showViewlet": "{0} を表示", "view": "表示" diff --git a/i18n/jpn/src/vs/workbench/api/browser/viewsExtensionPoint.i18n.json b/i18n/jpn/src/vs/workbench/api/browser/viewsExtensionPoint.i18n.json index eedb0cdb4ef..140381eb48f 100644 --- a/i18n/jpn/src/vs/workbench/api/browser/viewsExtensionPoint.i18n.json +++ b/i18n/jpn/src/vs/workbench/api/browser/viewsExtensionPoint.i18n.json @@ -16,7 +16,9 @@ "views.explorer": "アクション バーのエクスプローラー コンテナにビューを提供します", "views.debug": "アクション バーのデバッグ コンテナにビューを提供します", "views.scm": "アクション バーのSCM コンテナにビューを提供します", + "views.test": "アクション バーのテスト コンテナにビューを提供します", "views.contributed": "コントリビューション ビュー コンテナにビューを提供します", + "ViewContainerDoesnotExist": "ビュー コンテナ '{0}' が存在しません。このコンテナに登録されているすべてのビューは 'エクスプローラー' に追加されます。", "duplicateView1": "location `{1}` で同じ id `{0}` を使用する複数のビューを登録できません", "duplicateView2": "location `{1}` で id `{0}` のビューが既に登録されています" } \ No newline at end of file diff --git a/i18n/jpn/src/vs/workbench/parts/debug/browser/breakpointsView.i18n.json b/i18n/jpn/src/vs/workbench/parts/debug/browser/breakpointsView.i18n.json index 08d132073bb..8268450015e 100644 --- a/i18n/jpn/src/vs/workbench/parts/debug/browser/breakpointsView.i18n.json +++ b/i18n/jpn/src/vs/workbench/parts/debug/browser/breakpointsView.i18n.json @@ -6,7 +6,7 @@ "--------------------------------------------------------------------------------------------", "Do not edit this file. It is machine generated." ], - "logPoint": "ログ ポイント", + "logPoint": "ログポイント", "breakpoint": "ブレークポイント", "editBreakpoint": "{0} を編集", "removeBreakpoint": "{0} を削除", @@ -17,7 +17,7 @@ "breakpointUnverifieddHover": "未確認のブレークポイント", "functionBreakpointUnsupported": "このデバッグの種類では関数ブレークポイントはサポートされていません", "breakpointDirtydHover": "未確認のブレークポイント。ファイルは変更されているので、デバッグ セッションを再起動してください。", - "logBreakpointUnsupported": "このデバッグの種類では、ログ ポイントはサポートされていません。", + "logBreakpointUnsupported": "ログポイントは、このデバッグの種類ではサポートされていません", "conditionalBreakpointUnsupported": "このデバッグの種類では、条件付きブレークポイントはサポートされていません。", "hitBreakpointUnsupported": "このデバッグの種類では、ヒットした条件付きブレークポイントはサポートされていません。" } \ No newline at end of file diff --git a/i18n/jpn/src/vs/workbench/parts/debug/browser/debugEditorActions.i18n.json b/i18n/jpn/src/vs/workbench/parts/debug/browser/debugEditorActions.i18n.json index f610bb7f3a1..77727518962 100644 --- a/i18n/jpn/src/vs/workbench/parts/debug/browser/debugEditorActions.i18n.json +++ b/i18n/jpn/src/vs/workbench/parts/debug/browser/debugEditorActions.i18n.json @@ -8,7 +8,7 @@ ], "toggleBreakpointAction": "デバッグ: ブレークポイントの切り替え", "conditionalBreakpointEditorAction": "デバッグ: 条件付きブレークポイントの追加...", - "logPointEditorAction": "デバッグ: ログ ポイントの追加...", + "logPointEditorAction": "デバッグ: ログポイントの追加...", "runToCursor": "カーソル行の前まで実行", "debugEvaluate": "デバッグ: 評価", "debugAddToWatch": "デバッグ: ウォッチに追加", diff --git a/i18n/jpn/src/vs/workbench/parts/debug/electron-browser/debugEditorContribution.i18n.json b/i18n/jpn/src/vs/workbench/parts/debug/electron-browser/debugEditorContribution.i18n.json index f370c5a7367..48162c6968a 100644 --- a/i18n/jpn/src/vs/workbench/parts/debug/electron-browser/debugEditorContribution.i18n.json +++ b/i18n/jpn/src/vs/workbench/parts/debug/electron-browser/debugEditorContribution.i18n.json @@ -6,7 +6,7 @@ "--------------------------------------------------------------------------------------------", "Do not edit this file. It is machine generated." ], - "logPoint": "ログ ポイント", + "logPoint": "ログポイント", "breakpoint": "ブレークポイント", "removeBreakpoint": "{0} を削除", "editBreakpoint": "{0} を編集...", @@ -25,7 +25,8 @@ "enableBreakpointOnLine": "行のブレークポイントの有効化", "addBreakpoint": "ブレークポイントの追加", "addConditionalBreakpoint": "条件付きブレークポイントの追加...", - "addLogPoint": "ログ ポイントを追加...", + "addLogPoint": "ログポイントを追加...", + "breakpointHasCondition": "この {0} には削除時に失われる {1} があります。代わりに {0} を無効にすることを検討してください。", "message": "メッセージ", "condition": "条件", "removeLogPoint": "{0} を削除", diff --git a/i18n/jpn/src/vs/workbench/parts/files/electron-browser/fileActions.i18n.json b/i18n/jpn/src/vs/workbench/parts/files/electron-browser/fileActions.i18n.json index 952d29529a3..3f5373d85cb 100644 --- a/i18n/jpn/src/vs/workbench/parts/files/electron-browser/fileActions.i18n.json +++ b/i18n/jpn/src/vs/workbench/parts/files/electron-browser/fileActions.i18n.json @@ -33,9 +33,13 @@ "trashFailed": "ごみ箱を使用した削除に失敗しました。代わりに完全に削除しますか?", "deletePermanentlyButtonLabel": "完全に削除(&&D)", "retryButtonLabel": "再試行(&&R)", + "confirmMoveTrashMessageFilesAndDirectories": "次の {0} ファイル/ディレクトリとその内容を削除しますか?", + "confirmMoveTrashMessageMultipleDirectories": "次の {0} ディレクトリとその内容を削除しますか?", "confirmMoveTrashMessageMultiple": "次の {0} 個のファイルを削除してもよろしいですか?", "confirmMoveTrashMessageFolder": "'{0}' とその内容を削除しますか?", "confirmMoveTrashMessageFile": "'{0}' を削除しますか?", + "confirmDeleteMessageFilesAndDirectories": "次の {0} ファイル/ディレクトリとその内容を完全に削除しますか?", + "confirmDeleteMessageMultipleDirectories": "次の {0} ディレクトリとその内容を完全に削除しますか?", "confirmDeleteMessageMultiple": "次の {0} 個のファイルを完全に削除してもよろしいですか?", "confirmDeleteMessageFolder": "'{0}' とその内容を完全に削除してもよろしいですか?", "confirmDeleteMessageFile": "'{0}' を完全に削除してもよろしいですか?", diff --git a/i18n/jpn/src/vs/workbench/parts/localizations/electron-browser/localizations.contribution.i18n.json b/i18n/jpn/src/vs/workbench/parts/localizations/electron-browser/localizations.contribution.i18n.json index 1b654ebed35..a821e834d0b 100644 --- a/i18n/jpn/src/vs/workbench/parts/localizations/electron-browser/localizations.contribution.i18n.json +++ b/i18n/jpn/src/vs/workbench/parts/localizations/electron-browser/localizations.contribution.i18n.json @@ -10,6 +10,7 @@ "yes": "はい", "no": "いいえ", "neverAgain": "今後は表示しない", + "install language pack": "近い将来、VS Codeはマーケットプレイスの拡張機能のみをサポートします。現在構成されている言語を使い続けるためには、拡張機能 '{0}' をインストールしてください。", "install": "インストール", "more information": "詳細情報...", "JsonSchema.locale": "使用する UI 言語。", diff --git a/i18n/jpn/src/vs/workbench/parts/markers/electron-browser/markersPanel.i18n.json b/i18n/jpn/src/vs/workbench/parts/markers/electron-browser/markersPanel.i18n.json index d91b356dc32..9e750f7bf88 100644 --- a/i18n/jpn/src/vs/workbench/parts/markers/electron-browser/markersPanel.i18n.json +++ b/i18n/jpn/src/vs/workbench/parts/markers/electron-browser/markersPanel.i18n.json @@ -6,6 +6,6 @@ "--------------------------------------------------------------------------------------------", "Do not edit this file. It is machine generated." ], - "disableFilesExclude": "ファイルの除外を無効。", + "disableFilesExclude": "ファイルの除外フィルターを無効にします。", "clearFilter": "フィルターの解除。" } \ No newline at end of file diff --git a/i18n/jpn/src/vs/workbench/parts/search/electron-browser/search.contribution.i18n.json b/i18n/jpn/src/vs/workbench/parts/search/electron-browser/search.contribution.i18n.json index f6fb99713ec..11a7af1bc62 100644 --- a/i18n/jpn/src/vs/workbench/parts/search/electron-browser/search.contribution.i18n.json +++ b/i18n/jpn/src/vs/workbench/parts/search/electron-browser/search.contribution.i18n.json @@ -10,6 +10,7 @@ "copyMatchLabel": "コピー", "copyPathLabel": "パスのコピー", "copyAllLabel": "すべてコピー", + "clearSearchHistoryLabel": "検索履歴のクリア", "toggleSearchViewPositionLabel": "検索ビュー位置の切り替え", "findInFolder": "フォルダー内を検索...", "findInWorkspace": "ワークスペース内を検索...", diff --git a/i18n/jpn/src/vs/workbench/parts/tasks/common/taskDefinitionRegistry.i18n.json b/i18n/jpn/src/vs/workbench/parts/tasks/common/taskDefinitionRegistry.i18n.json index 3c42ee6e9d8..d09863fe3b1 100644 --- a/i18n/jpn/src/vs/workbench/parts/tasks/common/taskDefinitionRegistry.i18n.json +++ b/i18n/jpn/src/vs/workbench/parts/tasks/common/taskDefinitionRegistry.i18n.json @@ -6,7 +6,7 @@ "--------------------------------------------------------------------------------------------", "Do not edit this file. It is machine generated." ], - "TaskDefinition.description": "実際のタスクの種類", + "TaskDefinition.description": "実際のタスクの種類。先頭が '$' で始まる種類は内部使用のために予約されています。", "TaskDefinition.properties": "タスクの種類の追加プロパティ", "TaskTypeConfiguration.noType": "タスクの種類を構成するのに必要な 'taskType' プロパティがありません", "TaskDefinitionExtPoint": "タスクの種類を提供" diff --git a/i18n/jpn/src/vs/workbench/parts/tasks/electron-browser/terminalTaskSystem.i18n.json b/i18n/jpn/src/vs/workbench/parts/tasks/electron-browser/terminalTaskSystem.i18n.json index ee7eefdb33d..cdd450e9166 100644 --- a/i18n/jpn/src/vs/workbench/parts/tasks/electron-browser/terminalTaskSystem.i18n.json +++ b/i18n/jpn/src/vs/workbench/parts/tasks/electron-browser/terminalTaskSystem.i18n.json @@ -11,6 +11,6 @@ "TerminalTaskSystem.terminalName": "タスク - {0}", "closeTerminal": "任意のキーを押してターミナルを終了します。", "reuseTerminal": "ターミナルはタスクで再利用されます、閉じるには任意のキーを押してください。", - "TerminalTaskSystem": "UNC ドライブでシェル コマンドを実行できません。", + "TerminalTaskSystem": "cmd.exe を使用して UNC ドライブ上でシェル コマンドを実行できません。", "unkownProblemMatcher": "問題マッチャー {0} は解決できませんでした。マッチャーは無視されます" } \ No newline at end of file diff --git a/i18n/jpn/src/vs/workbench/services/extensions/common/extensionsRegistry.i18n.json b/i18n/jpn/src/vs/workbench/services/extensions/common/extensionsRegistry.i18n.json index 5fe7c380aea..f04ca84fa1e 100644 --- a/i18n/jpn/src/vs/workbench/services/extensions/common/extensionsRegistry.i18n.json +++ b/i18n/jpn/src/vs/workbench/services/extensions/common/extensionsRegistry.i18n.json @@ -25,6 +25,7 @@ "vscode.extension.activationEvents.onDebugResolve": "特定のタイプのデバッグ セッションが起動されるたびに(または、対応する resolveDebugConfiguration メソッドを呼び出す必要があるたびに)、アクティブ化イベントを発行します。", "vscode.extension.activationEvents.workspaceContains": "指定した glob パターンに一致するファイルを少なくとも 1 つ以上含むフォルダーを開くたびにアクティブ化イベントが発行されます。", "vscode.extension.activationEvents.onView": "指定したビューを展開するたびにアクティブ化イベントが発行されます。", + "vscode.extension.activationEvents.onUri": "この拡張機能用のシステム全体の URI が開かれるたびにアクティブ化イベントが発行されます。", "vscode.extension.activationEvents.star": "VS Code 起動時にアクティブ化イベントを発行します。優れたエンドユーザー エクスペリエンスを確保するために、他のアクティブ化イベントの組み合わせでは望む動作にならないときのみ使用してください。", "vscode.extension.badges": "Marketplace の拡張機能ページのサイドバーに表示されるバッジの配列。", "vscode.extension.badges.url": "バッジのイメージ URL。", diff --git a/i18n/jpn/src/vs/workbench/services/files/electron-browser/remoteFileService.i18n.json b/i18n/jpn/src/vs/workbench/services/files/electron-browser/remoteFileService.i18n.json index aa930ebf26b..e0d53ae58d7 100644 --- a/i18n/jpn/src/vs/workbench/services/files/electron-browser/remoteFileService.i18n.json +++ b/i18n/jpn/src/vs/workbench/services/files/electron-browser/remoteFileService.i18n.json @@ -10,5 +10,6 @@ "fileIsDirectoryError": "ファイルはディレクトリです", "fileNotModifiedError": "ファイルは次の時点以後に変更されていません:", "fileBinaryError": "ファイルはバイナリのようなので、テキストとして開くことができません", - "err.create": "ファイル {0} を作成できませんでした" + "err.create": "ファイル {0} を作成できませんでした", + "fileMoveConflict": "移動/コピーできません。移動/コピー先にファイルが既に存在します。" } \ No newline at end of file diff --git a/i18n/kor/extensions/emmet/package.i18n.json b/i18n/kor/extensions/emmet/package.i18n.json index 11c3bae8db4..517fee7baf0 100644 --- a/i18n/kor/extensions/emmet/package.i18n.json +++ b/i18n/kor/extensions/emmet/package.i18n.json @@ -35,6 +35,7 @@ "emmetExtensionsPath": "Emmet 프로필 및 코드 조각이 포함된 폴더의 경로입니다.'", "emmetShowExpandedAbbreviation": "확장된 emmet 약어를 제안으로 표시합니다.\n\"inMarkupAndStylesheetFilesOnly\" 옵션이 html, haml, jade, slim, xml, xsl, css, scss, sass, less 및 stylus에 적용됩니다.\n\"always\" 옵션이 마크업/css에 관계없이 파일의 모든 부분에 적용됩니다.", "emmetShowAbbreviationSuggestions": "가능한 emmet 약어를 제안으로 표시합니다. 스타일시트에는 적용되지 않고 emmet.showExpandedAbbreviation이 \"never\"로 설정되어 있을 때도 적용되지 않습니다.", + "emmetIncludeLanguages": "기본 지원되지 않는 언어에서 Emmet 약어를 사용하도록 설정합니다. 언어와 emmet 지원 언어 사이에 매핑을 추가합니다.\n예: {\"vue-html\": \"html\", \"javascript\": \"javascriptreact\"}", "emmetVariables": "emmet 조각에 사용되는 변수", "emmetTriggerExpansionOnTab": "사용하도록 설정하면 emmet 약어는 Tab 키를 눌렀을 때 확장됩니다.", "emmetPreferences": "Emmet의 일부 작업 및 해결 프로그램의 동작을 수정하는 데 사용되는 기본 설정입니다.", @@ -59,5 +60,6 @@ "emmetPreferencesCssMozProperties": "`-`로 시작하는 Emmet 약어에서 사용될 때 'moz' 공급업체 접두사를 가져오는 쉼표로 구분된 CSS 속성입니다. 항상 'moz' 접두사를 사용하지 않으려면 빈 문자열로 설정합니다.", "emmetPreferencesCssOProperties": "`-`로 시작하는 emmet 약어에서 사용할 때 'o' 공급업체 접두사를 가져오는 쉼표로 구분된 CSS 속성입니다. 항상 'o' 접두사를 사용하지 않으려면 빈 문자열로 설정합니다.", "emmetPreferencesCssMsProperties": "`-`로 시작하는 emmet 약어에서 사용할 때 'ms' 공급업체 접두사를 가져오는 쉼표로 구분된 CSS 속성입니다. 항상 'ms' 접두사를 사용하지 않으려면 빈 문자열로 설정합니다.", - "emmetPreferencesCssFuzzySearchMinScore": "유사 일치 약어가 획득해야 하는 최소 점수(0에서 1 사이)입니다. 값이 낮을수록 가양성 일치 항목이 늘 수 있고, 값이 높을수록 가능한 일치 항목이 줄 수 있습니다." + "emmetPreferencesCssFuzzySearchMinScore": "유사 일치 약어가 획득해야 하는 최소 점수(0에서 1 사이)입니다. 값이 낮을수록 가양성 일치 항목이 늘 수 있고, 값이 높을수록 가능한 일치 항목이 줄 수 있습니다.", + "emmetOptimizeStylesheetParsing": "False로 설정할 경우 전체 파일이 구문 분석되어 현재 위치가 Emmet 약어 확장에 유효한지 확인합니다. True로 설정할 경우 css/scss/less 파일에서 현재 위치 주변의 콘텐츠만 구문 분석합니다." } \ No newline at end of file diff --git a/i18n/kor/extensions/git/out/commands.i18n.json b/i18n/kor/extensions/git/out/commands.i18n.json index e1ccbbf253f..7f332b50cf8 100644 --- a/i18n/kor/extensions/git/out/commands.i18n.json +++ b/i18n/kor/extensions/git/out/commands.i18n.json @@ -11,9 +11,7 @@ "create branch": "$(plus) 새 분기 생성", "repourl": "리포지토리 URL", "parent": "부모 디렉터리", - "cancel": "$(sync~spin) 리포지토리를 복제하는 중... 취소하려면 클릭하세요.", - "cancel tooltip": "복제 취소", - "cloning": "Git 리포지토리를 복제하는 중...", + "cloning": "Git 리포지토리 '{0}'을(를) 복제하는 중...", "openrepo": "리포지토리 열기", "proposeopen": "복제된 리포지토리를 여시겠습니까?", "init": "Git 리포지토리를 초기화할 작업 영역 폴더 선택", diff --git a/i18n/kor/extensions/markdown-language-features/out/security.i18n.json b/i18n/kor/extensions/markdown-language-features/out/security.i18n.json index b7fd641e493..aa640026595 100644 --- a/i18n/kor/extensions/markdown-language-features/out/security.i18n.json +++ b/i18n/kor/extensions/markdown-language-features/out/security.i18n.json @@ -8,6 +8,8 @@ ], "strict.title": "Strict", "strict.description": "보안 콘텐츠만 로드", + "insecureLocalContent.title": "안전하지 않은 로컬 콘텐츠 허용", + "insecureLocalContent.description": "localhost에서 제공되는 http를 통한 콘텐츠 로드 사용", "insecureContent.title": "안전하지 않은 콘텐츠 허용", "insecureContent.description": "http를 통한 콘텐츠 로드 사용", "disable.title": "사용 안 함", diff --git a/i18n/kor/extensions/npm/out/npmView.i18n.json b/i18n/kor/extensions/npm/out/npmView.i18n.json index 35229bd6699..94edf3b4b0c 100644 --- a/i18n/kor/extensions/npm/out/npmView.i18n.json +++ b/i18n/kor/extensions/npm/out/npmView.i18n.json @@ -5,5 +5,7 @@ "Licensed under the MIT License. See License.txt in the project root for license information.", "--------------------------------------------------------------------------------------------", "Do not edit this file. It is machine generated." - ] + ], + "npm.noDebugOptions": "스크립트에 노드 디버그 옵션(예: '--inspect-brk')이 없으므로 디버깅에 사용할 \"{0}\"을(를) 시작할 수 없습니다.", + "npm.scriptInvalid": "\"{0}\" 스크립트를 찾을 수 없습니다. 뷰로 새로 고쳐 보세요." } \ No newline at end of file diff --git a/i18n/kor/extensions/npm/package.i18n.json b/i18n/kor/extensions/npm/package.i18n.json index 9d5b756e7da..ca92d6afeec 100644 --- a/i18n/kor/extensions/npm/package.i18n.json +++ b/i18n/kor/extensions/npm/package.i18n.json @@ -12,10 +12,15 @@ "config.npm.runSilent": " `--silent` 옵션으로 npm 명령 실행.", "config.npm.packageManager": "스크립트를 실행하는 데 사용하는 패키지 관리자.", "config.npm.exclude": "자동 스크립트 검색에서 제외할 폴더에 대한 Glob 패턴을 구성합니다.", + "config.npm.enableScriptExplorer": "작업 영역에 'package.json' 파일이 포함되어 있는 경우 npm 스크립트에 대한 탐색기 뷰를 사용하도록 설정합니다.", "npm.parseError": "Npm 작업 검색: {0} 파일을 구문 분석하지 못했습니다.", "taskdef.script": "사용자 지정할 npm 스크립트입니다.", "taskdef.path": "스크립트를 제공하는 package.json 파일의 폴더에 대한 경로이며 생략할 수 있습니다.", + "view.name": "Npm 스크립트", "command.refresh": "새로 고침", + "command.run": "실행", "command.debug": "디버그", - "command.openScript": "열기" + "command.openScript": "열기", + "npm.scriptInvalid": "'{0}' 스크립트를 찾을 수 없습니다. 뷰를 새로 고쳐 보세요.", + "npm.noDebugOptions": "스크립트에 노드 디버그 옵션(예: '--inspect-brk')이 없으므로 디버깅에 사용할 '{0}'을(를) 시작할 수 없습니다." } \ No newline at end of file diff --git a/i18n/kor/extensions/php/package.i18n.json b/i18n/kor/extensions/php/package.i18n.json index 7ffd59966bb..ad3f734a9df 100644 --- a/i18n/kor/extensions/php/package.i18n.json +++ b/i18n/kor/extensions/php/package.i18n.json @@ -6,5 +6,6 @@ "--------------------------------------------------------------------------------------------", "Do not edit this file. It is machine generated." ], + "displayName": "PHP 언어 기본", "description": "PHP 파일에서 구문 강조 표시 및 괄호 일치를 제공합니다. " } \ No newline at end of file diff --git a/i18n/kor/extensions/typescript-language-features/out/utils/versionProvider.i18n.json b/i18n/kor/extensions/typescript-language-features/out/utils/versionProvider.i18n.json index 979038a5298..9a563329739 100644 --- a/i18n/kor/extensions/typescript-language-features/out/utils/versionProvider.i18n.json +++ b/i18n/kor/extensions/typescript-language-features/out/utils/versionProvider.i18n.json @@ -6,5 +6,6 @@ "--------------------------------------------------------------------------------------------", "Do not edit this file. It is machine generated." ], + "couldNotLoadTsVersion": "이 경로에서 TypeScript 버전을 로드할 수 없습니다.", "noBundledServerFound": "잘못 동작하는 바이러스 감지 도구와 같은 다른 응용 프로그램에서 VS Code의 tsserver가 삭제되었습니다. VS Code를 다시 설치하세요." } \ No newline at end of file diff --git a/i18n/kor/extensions/typescript-language-features/package.i18n.json b/i18n/kor/extensions/typescript-language-features/package.i18n.json index 3f2230bf284..8aa324a0170 100644 --- a/i18n/kor/extensions/typescript-language-features/package.i18n.json +++ b/i18n/kor/extensions/typescript-language-features/package.i18n.json @@ -15,6 +15,8 @@ "typescript.tsdk.desc": "사용할 tsserver 및 lib*.d.ts 파일이 들어 있는 폴더 경로를 지정합니다.", "typescript.disableAutomaticTypeAcquisition": "자동 형식 인식을 사용하지 않습니다. TypeScript >= 2.0.6이 필요합니다.", "typescript.tsserver.log": "파일에 대해 TS 서버 로깅을 사용하도록 설정합니다. 이 로그는 TS 서버 문제를 진단하는 데 사용될 수 있습니다. 로그에는 파일 경로, 소스 코드 및 프로젝트에서 잠재적으로 중요한 기타 정보가 포함될 수 있습니다.", + "typescript.tsserver.pluginPaths": "Typescript 언어 서비스 플러그 인을 검색할 추가 경로입니다. TypeScript 2.3.0 이상이 필요합니다.", + "typescript.tsserver.pluginPaths.item": "절대 또는 상대 경로입니다. 상대 경로는 작업 영역 폴더를 기준으로 확인됩니다.", "typescript.tsserver.trace": "TS 서버로 전송한 메시지 추적을 사용하도록 설정합니다. 이\n 추적은 TS 서버 문제를 진단하는 데 사용될 수 있습니다. 추적에는 파일 경로, 소스 코드 및 프로젝트에서 잠재적으로 중요한\n 기타 정보가 포함될 수 있습니다.", "typescript.validate.enable": "TypeScript 유효성 검사를 사용하거나 사용하지 않습니다.", "typescript.format.enable": "기본 TypeScript 포맷터를 사용하거나 사용하지 않습니다.", @@ -26,6 +28,9 @@ "format.insertSpaceAfterKeywordsInControlFlowStatements": "제어 흐름 문의 키워드 뒤에 오는 공백 처리를 정의합니다.", "format.insertSpaceAfterFunctionKeywordForAnonymousFunctions": "익명 함수의 function 키워드 뒤에 오는 공백 처리를 정의합니다.", "format.insertSpaceBeforeFunctionParenthesis": "함수 인수 괄호 앞에 오는 공백 처리를 정의합니다. TypeScript 2.1.5 이상이 필요합니다.", + "format.insertSpaceAfterOpeningAndBeforeClosingNonemptyParenthesis": "비어 있지 않은 여는 괄호 뒤와 닫는 괄호 앞에 오는 공백 처리를 정의합니다.", + "format.insertSpaceAfterOpeningAndBeforeClosingNonemptyBrackets": "비어 있지 않은 여는 대괄호 뒤와 닫는 대괄호 앞에 오는 공백 처리를 정의합니다.", + "format.insertSpaceAfterOpeningAndBeforeClosingNonemptyBraces": "비어 있지 않은 여는 중괄호 뒤와 닫는 중괄호 앞의 공백 처리를 정의합니다. TypeScript 2.3.0 이상이 필요합니다.", "format.insertSpaceAfterOpeningAndBeforeClosingTemplateStringBraces": "템플릿 문자열의 여는 중괄호 뒤와 닫는 중괄호 앞의 공백 처리를 정의합니다. TypeScript >= 2.0.6이 필요합니다.", "format.insertSpaceAfterOpeningAndBeforeClosingJsxExpressionBraces": "JSX 식의 여는 중괄호 뒤와 닫는 중괄호 앞의 공백 처리를 정의합니다. TypeScript >= 2.0.6이 필요합니다.", "format.insertSpaceAfterTypeAssertion": "TypeScript에서 유형 어설션 이후 공백 처리를 정의합니다. TypeScript >= 2.4가 필요합니다.", @@ -54,5 +59,7 @@ "javascript.implicitProjectConfig.experimentalDecorators": "프로젝트의 일부가 아닌 JavaScript 파일에 대해 'experimentalDecorators'를 사용하거나 사용하지 않도록 설정합니다. 기존 jsconfig.json 또는 tsconfig.json 파일은 이 설정을 재정의합니다. TypeScript >=2.3.1이 필요합니다.", "typescript.autoImportSuggestions.enabled": "자동 가져오기 제안을 사용하거나 사용하지 않도록 설정합니다. TypeScript >=2.6.1이 필요합니다.", "typescript.experimental.syntaxFolding": "구문 인식 접기 마커를 설정하거나 해제합니다.", - "taskDefinition.tsconfig.description": "TS 빌드를 정의하는 tsconfig 파일입니다." + "taskDefinition.tsconfig.description": "TS 빌드를 정의하는 tsconfig 파일입니다.", + "javascript.suggestionActions.enabled": "편집기에서 JavaScript 파일에 대한 제안 진단을 사용하거나 사용하지 않도록 설정합니다. TypeScript 2.8 이상이 필요합니다.", + "typescript.suggestionActions.enabled": "편집기에서 TypeScript 파일에 대한 제안 진단을 사용하거나 사용하지 않도록 설정합니다. TypeScript 2.8 이상이 필요합니다." } \ No newline at end of file diff --git a/i18n/kor/src/vs/base/node/processes.i18n.json b/i18n/kor/src/vs/base/node/processes.i18n.json index 35229bd6699..05a4cd5f14f 100644 --- a/i18n/kor/src/vs/base/node/processes.i18n.json +++ b/i18n/kor/src/vs/base/node/processes.i18n.json @@ -5,5 +5,6 @@ "Licensed under the MIT License. See License.txt in the project root for license information.", "--------------------------------------------------------------------------------------------", "Do not edit this file. It is machine generated." - ] + ], + "TaskRunner.UNC": "UNC 드라이브에서 셸 명령을 실행할 수 없습니다." } \ No newline at end of file diff --git a/i18n/kor/src/vs/base/node/zip.i18n.json b/i18n/kor/src/vs/base/node/zip.i18n.json index f5bbe51e02b..962e062f13a 100644 --- a/i18n/kor/src/vs/base/node/zip.i18n.json +++ b/i18n/kor/src/vs/base/node/zip.i18n.json @@ -6,5 +6,6 @@ "--------------------------------------------------------------------------------------------", "Do not edit this file. It is machine generated." ], + "incompleteExtract": "완료되지 않았습니다. {1}개 항목 중 {0}개가 추출되었습니다.", "notFound": "zip 파일 내에 {0}이(가) 없습니다." } \ No newline at end of file diff --git a/i18n/kor/src/vs/code/electron-browser/issue/issueReporterMain.i18n.json b/i18n/kor/src/vs/code/electron-browser/issue/issueReporterMain.i18n.json index 0d6f74e08a2..e629243de3e 100644 --- a/i18n/kor/src/vs/code/electron-browser/issue/issueReporterMain.i18n.json +++ b/i18n/kor/src/vs/code/electron-browser/issue/issueReporterMain.i18n.json @@ -8,9 +8,11 @@ ], "previewOnGitHub": "GitHub에서 미리 보기", "loadingData": "데이터 로드 중...", + "rateLimited": "GitHub 쿼리 제한이 초과되었습니다. 기다려 주세요.", "similarIssues": "유사한 문제", "open": "열기", "closed": "닫힘", + "noSimilarIssues": "검색된 유사한 문제 없음", "settingsSearchIssue": "설정 검색 문제", "bugReporter": "버그 보고서", "featureRequest": "기능 요청", diff --git a/i18n/kor/src/vs/code/electron-browser/issue/issueReporterPage.i18n.json b/i18n/kor/src/vs/code/electron-browser/issue/issueReporterPage.i18n.json index 00754823fe4..ea3d4e905b8 100644 --- a/i18n/kor/src/vs/code/electron-browser/issue/issueReporterPage.i18n.json +++ b/i18n/kor/src/vs/code/electron-browser/issue/issueReporterPage.i18n.json @@ -8,7 +8,10 @@ ], "completeInEnglish": "양식을 영어로 작성해 주세요.", "issueTypeLabel": "이것은", + "issueSourceLabel": "제출 대상", "vscode": "Visual Studio Code", + "extension": "확장", + "disableExtensionsLabelText": "{0} 후 문제를 재현해 보세요. 확장이 활성 상태인 경우에만 문제가 재현되면 확장과 관련된 문제일 수 있습니다.", "disableExtensions": "모든 확장을 사용하지 않도록 설정하고 창 다시 로드", "chooseExtension": "확장", "issueTitleLabel": "제목", diff --git a/i18n/kor/src/vs/code/electron-browser/processExplorer/processExplorerMain.i18n.json b/i18n/kor/src/vs/code/electron-browser/processExplorer/processExplorerMain.i18n.json index d2f76643375..7fdbd9cc5d4 100644 --- a/i18n/kor/src/vs/code/electron-browser/processExplorer/processExplorerMain.i18n.json +++ b/i18n/kor/src/vs/code/electron-browser/processExplorer/processExplorerMain.i18n.json @@ -6,5 +6,10 @@ "--------------------------------------------------------------------------------------------", "Do not edit this file. It is machine generated." ], - "name": "이름" + "cpu": "CPU %", + "memory": "메모리(MB)", + "pid": "pid", + "name": "이름", + "killProcess": "프로세스 종료", + "forceKillProcess": "프로세스 강제 종료" } \ No newline at end of file diff --git a/i18n/kor/src/vs/code/electron-main/menus.i18n.json b/i18n/kor/src/vs/code/electron-main/menus.i18n.json index 128f36b1108..2a218b9a67a 100644 --- a/i18n/kor/src/vs/code/electron-main/menus.i18n.json +++ b/i18n/kor/src/vs/code/electron-main/menus.i18n.json @@ -146,6 +146,7 @@ "miConditionalBreakpoint": "조건부 중단점(&&C)...", "miColumnBreakpoint": "열 중단점(&&O)", "miFunctionBreakpoint": "함수 중단점(&&F)...", + "miLogPoint": "Logpoint(&&L)...", "miNewBreakpoint": "새 중단점(&&N)", "miEnableAllBreakpoints": "모든 중단점 설정", "miDisableAllBreakpoints": "모든 중단점 사용 안 함(&&L)", @@ -161,6 +162,7 @@ "mMergeAllWindows": "모든 창 병합", "miToggleDevTools": "개발자 도구 설정/해제(&&T)", "miAccessibilityOptions": "접근성 옵션(&&O)", + "miOpenProcessExplorerer": "프로세스 탐색기 열기(&&P)", "miReportIssue": "문제 보고(&&I)", "miWelcome": "시작(&&W)", "miInteractivePlayground": "대화형 실습(&&I)", diff --git a/i18n/kor/src/vs/editor/browser/widget/diffReview.i18n.json b/i18n/kor/src/vs/editor/browser/widget/diffReview.i18n.json index 1839bc77e72..f9c1eb60275 100644 --- a/i18n/kor/src/vs/editor/browser/widget/diffReview.i18n.json +++ b/i18n/kor/src/vs/editor/browser/widget/diffReview.i18n.json @@ -7,6 +7,10 @@ "Do not edit this file. It is machine generated." ], "label.close": "닫기", + "no_lines": "줄 없음", + "one_line": "1줄", + "more_lines": "{0}줄", + "header": "차이 {0}/{1}개: 원본 {2}, {3}, 수정 {4}, {5}", "blankLine": "비어 있음", "equalLine": "원본 {0}, 수정 {1}: {2}", "insertLine": "+ 수정됨 {0}: {1}", diff --git a/i18n/kor/src/vs/editor/common/commonCodeEditor.i18n.json b/i18n/kor/src/vs/editor/common/commonCodeEditor.i18n.json index 35229bd6699..abc2f81a46c 100644 --- a/i18n/kor/src/vs/editor/common/commonCodeEditor.i18n.json +++ b/i18n/kor/src/vs/editor/common/commonCodeEditor.i18n.json @@ -5,5 +5,6 @@ "Licensed under the MIT License. See License.txt in the project root for license information.", "--------------------------------------------------------------------------------------------", "Do not edit this file. It is machine generated." - ] + ], + "cursors.maximum": "커서 수는 {0}(으)로 제한되었습니다." } \ No newline at end of file diff --git a/i18n/kor/src/vs/editor/common/config/commonEditorConfig.i18n.json b/i18n/kor/src/vs/editor/common/config/commonEditorConfig.i18n.json index 79e5d8e03e7..05717185791 100644 --- a/i18n/kor/src/vs/editor/common/config/commonEditorConfig.i18n.json +++ b/i18n/kor/src/vs/editor/common/config/commonEditorConfig.i18n.json @@ -16,6 +16,7 @@ "lineNumbers.on": "줄 번호는 절대값으로 렌더링 됩니다.", "lineNumbers.relative": "줄 번호는 커서 위치에서 줄 간격 거리로 렌더링 됩니다.", "lineNumbers.interval": "줄 번호는 매 10 줄마다 렌더링이 이루어집니다.", + "lineNumbers": "줄 번호 표시를 제어합니다.", "rulers": "특정 수의 고정 폭 문자 뒤에 세로 눈금자를 렌더링합니다. 여러 눈금자의 경우 여러 값을 사용합니다. 배열이 비어 있는 경우 눈금자가 그려져 있지 않습니다.", "wordSeparators": "단어 관련 탐색 또는 작업을 수행할 때 단어 구분 기호로 사용되는 문자입니다.", "tabSize": "탭 한 개에 해당하는 공백 수입니다. `editor.detectIndentation`이 켜져 있는 경우 이 설정은 파일 콘텐츠에 따라 재정의됩니다.", @@ -27,6 +28,7 @@ "scrollBeyondLastLine": "편집기에서 마지막 줄 이후로 스크롤할지 여부를 제어합니다.", "smoothScrolling": "편집기에서 애니메이션을 사용하여 스크롤할지 여부를 제어합니다.", "minimap.enabled": "미니맵 표시 여부를 제어합니다.", + "minimap.side": "미니맵을 렌더링할 측면을 제어합니다.", "minimap.showSlider": "미니맵 슬라이더를 자동으로 숨길지 결정합니다.", "minimap.renderCharacters": "줄의 실제 문자(색 블록 아님) 렌더링", "minimap.maxColumn": "최대 특정 수의 열을 렌더링하도록 미니맵의 너비를 제한합니다.", @@ -44,6 +46,7 @@ "multiCursorModifier.ctrlCmd": "Windows와 Linux의 'Control'을 macOS의 'Command'로 매핑합니다.", "multiCursorModifier.alt": "Windows와 Linux의 'Alt'를 macOS의 'Option'으로 매핑합니다.", "multiCursorModifier": "마우스로 여러 커서를 추가할 때 사용할 수정자입니다. `ctrlCmd`는 Windows와 Linux에서 `Control`로 매핑되고 macOS에서 `Command`로 매핑됩니다. Go To Definition 및 Open Link 마우스 제스처가 멀티커서 수정자와 충돌하지 않도록 조정됩니다.", + "multiCursorMergeOverlapping": "여러 커서가 겹치는 경우 커서를 병합합니다.", "quickSuggestions.strings": "문자열 내에서 빠른 제안을 사용합니다.", "quickSuggestions.comments": "주석 내에서 빠른 제안을 사용합니다.", "quickSuggestions.other": "문자열 및 주석 외부에서 빠른 제안을 사용합니다.", @@ -74,6 +77,7 @@ "occurrencesHighlight": "편집기에서 의미 체계 기호 항목을 강조 표시할지 여부를 제어합니다.", "overviewRulerLanes": "개요 눈금자에서 동일한 위치에 표시될 수 있는 장식 수를 제어합니다.", "overviewRulerBorder": "개요 눈금자 주위에 테두리를 그릴지 여부를 제어합니다.", + "cursorBlinking": "커서 애니메이션 스타일을 제어합니다.", "mouseWheelZoom": "마우스 휠을 사용할 때 Ctrl 키를 누르고 있으면 편집기의 글꼴 확대/축소", "cursorStyle": "커서 스타일을 제어합니다. 허용되는 값은 '블록', '블록-윤곽', '줄', '줄-가늘게', '밑줄' 및 '밑줄-가늘게'입니다.", "cursorWidth": "editor.cursorStyle 설정이 'line'으로 설정되어 있을 때 커서의 넓이를 조절합니다.", @@ -83,7 +87,11 @@ "renderControlCharacters": "편집기에서 제어 문자를 렌더링할지를 제어합니다.", "renderIndentGuides": "편집기에서 들여쓰기 가이드를 렌더링할지를 제어합니다.", "renderLineHighlight": "편집기가 현재 줄 강조 표시를 렌더링하는 방식을 제어합니다. 가능한 값은 'none', 'gutter', 'line' 및 'all'입니다.", + "codeLens": "편집기에서 CodeLens를 표시하는지 여부를 제어합니다.", "folding": "편집기에서 코드 접기를 사용할지 여부를 제어합니다.", + "foldingStrategyAuto": "사용 가능한 경우 언어 관련 접기 전략을 사용하고, 그렇지 않은 경우 들여쓰기 기반 전략으로 대체합니다.", + "foldingStrategyIndentation": "항상 들여쓰기 기반 접기 전략 사용", + "foldingStrategy": "접기 범위를 계산하는 방식을 제어합니다. '자동' 선택이면 사용 가능한 경우 언어 관련 접기 전략을 사용합니다. '들여쓰기'이면 들여쓰기 기반 접기 전략이 사용됩니다.", "showFoldingControls": "거터의 폴드 컨트롤을 자동으로 숨길지 결정합니다.", "matchBrackets": "대괄호 중 하나를 선택할 때 일치하는 대괄호를 강조 표시합니다.", "glyphMargin": "편집기에서 세로 문자 모양 여백을 렌더링할지 여부를 제어합니다. 문자 모양 여백은 주로 디버깅에 사용됩니다.", @@ -98,8 +106,12 @@ "links": "편집기에서 링크를 감지하고 클릭할 수 있게 만들지 결정합니다.", "colorDecorators": "편집기에서 인라인 색 데코레이터 및 색 선택을 렌더링할지를 제어합니다.", "codeActions": "코드 동작 전구를 사용합니다.", + "codeActionsOnSave.organizeImports": "저장할 때 가져오기 구성을 실행하시겠습니까?", + "codeActionsOnSave": "저장할 때 실행되는 코드 동작 종류입니다.", + "codeActionsOnSaveTimeout": "저장할 때 실행되는 코드 동작에 대한 시간 제한입니다.", "selectionClipboard": "Linux 주 클립보드의 지원 여부를 제어합니다.", "sideBySide": "diff 편집기에서 diff를 나란히 표시할지 인라인으로 표시할지 여부를 제어합니다.", "ignoreTrimWhitespace": "diff 편집기에서 선행 공백 또는 후행 공백 변경을 diffs로 표시할지 여부를 제어합니다.", + "largeFileOptimizations": "큰 파일에 대한 특수 처리로, 메모리를 많이 사용하는 특정 기능을 사용하지 않도록 설정합니다.", "renderIndicators": "diff 편집기에서 추가/제거된 변경 내용에 대해 +/- 표시기를 표시하는지 여부를 제어합니다." } \ No newline at end of file diff --git a/i18n/kor/src/vs/editor/common/view/editorColorRegistry.i18n.json b/i18n/kor/src/vs/editor/common/view/editorColorRegistry.i18n.json index f226af7ac85..6dd11aae956 100644 --- a/i18n/kor/src/vs/editor/common/view/editorColorRegistry.i18n.json +++ b/i18n/kor/src/vs/editor/common/view/editorColorRegistry.i18n.json @@ -14,6 +14,7 @@ "editorCursorBackground": "편집기 커서의 배경색입니다. 블록 커서와 겹치는 글자의 색상을 사용자 정의할 수 있습니다.", "editorWhitespaces": "편집기의 공백 문자 색입니다.", "editorIndentGuides": "편집기 들여쓰기 안내선 색입니다.", + "editorActiveIndentGuide": "활성 편집기 들여쓰기 안내선 색입니다.", "editorLineNumbers": "편집기 줄 번호 색입니다.", "editorActiveLineNumber": "편집기 활성 영역 줄번호 색상", "deprecatedEditorActiveLineNumber": "Id는 사용 되지 않습니다. 대신 'editorLineNumber.activeForeground'를 사용 합니다.", diff --git a/i18n/kor/src/vs/editor/contrib/codeAction/codeActionCommands.i18n.json b/i18n/kor/src/vs/editor/contrib/codeAction/codeActionCommands.i18n.json index cc5bf67d866..8c25ff6cd43 100644 --- a/i18n/kor/src/vs/editor/contrib/codeAction/codeActionCommands.i18n.json +++ b/i18n/kor/src/vs/editor/contrib/codeAction/codeActionCommands.i18n.json @@ -8,5 +8,12 @@ ], "quickFixWithKb": "수정 사항 표시({0})", "quickFix": "수정 사항 표시", - "organizeImports.label": "가져오기 구성" + "quickfix.trigger.label": "빠른 수정...", + "editor.action.quickFix.noneMessage": "사용 가능한 코드 동작이 없습니다.", + "refactor.label": "리팩터링...", + "editor.action.refactor.noneMessage": "사용 가능한 리펙터링이 없습니다.", + "source.label": "소스 작업...", + "editor.action.source.noneMessage": "사용 가능한 소스 작업이 없습니다.", + "organizeImports.label": "가져오기 구성", + "editor.action.organize.noneMessage": "사용 가능한 가져오기 구성 작업이 없습니다." } \ No newline at end of file diff --git a/i18n/kor/src/vs/editor/contrib/find/findController.i18n.json b/i18n/kor/src/vs/editor/contrib/find/findController.i18n.json index f3bd62288e6..775d0958140 100644 --- a/i18n/kor/src/vs/editor/contrib/find/findController.i18n.json +++ b/i18n/kor/src/vs/editor/contrib/find/findController.i18n.json @@ -7,6 +7,7 @@ "Do not edit this file. It is machine generated." ], "startFindAction": "찾기", + "startFindWithSelectionAction": "선택 영역에서 찾기", "findNextMatchAction": "다음 찾기", "findPreviousMatchAction": "이전 찾기", "nextSelectionMatchFindAction": "다음 선택 찾기", diff --git a/i18n/kor/src/vs/editor/contrib/format/formatActions.i18n.json b/i18n/kor/src/vs/editor/contrib/format/formatActions.i18n.json index 88ba92833af..2f2110917d0 100644 --- a/i18n/kor/src/vs/editor/contrib/format/formatActions.i18n.json +++ b/i18n/kor/src/vs/editor/contrib/format/formatActions.i18n.json @@ -12,5 +12,7 @@ "hintnn": "줄 {1}과(와) {2} 사이에서 {0}개 서식 편집을 수행했습니다.", "no.provider": " '{0}'-파일에 대한 설치된 형식기가 없습니다.", "formatDocument.label": "문서 서식", - "formatSelection.label": "선택 영역 서식" + "no.documentprovider": " '{0}'-파일에 대한 문서 포맷터가 설치되어 있지 않습니다.", + "formatSelection.label": "선택 영역 서식", + "no.selectionprovider": "'{0}'-파일에 대한 선택 영역 포맷터가 설치되어 있지 않습니다." } \ No newline at end of file diff --git a/i18n/kor/src/vs/editor/contrib/links/links.i18n.json b/i18n/kor/src/vs/editor/contrib/links/links.i18n.json index 6fb7a67159e..c11e5ac62db 100644 --- a/i18n/kor/src/vs/editor/contrib/links/links.i18n.json +++ b/i18n/kor/src/vs/editor/contrib/links/links.i18n.json @@ -10,7 +10,9 @@ "links.navigate": "Ctrl 키를 누르고 클릭하여 링크로 이동", "links.command.mac": "명령을 실행하려면 Cmd+클릭", "links.command": "명령을 실행하려면 Ctrl+클릭", + "links.navigate.al.mac": "
    + +
    + + + +
    +
    + + + +
    +
    + + + +
    +
    + + + +
    +
    + + + +
    +