Merge commit 'be3e8236086165e5e45a5a10783823874b3f3ebd' as 'lib/vscode'
This commit is contained in:
@ -0,0 +1,56 @@
|
||||
/*---------------------------------------------------------------------------------------------
|
||||
* Copyright (c) Microsoft Corporation. All rights reserved.
|
||||
* Licensed under the MIT License. See License.txt in the project root for license information.
|
||||
*--------------------------------------------------------------------------------------------*/
|
||||
// @ts-check
|
||||
(function () {
|
||||
// @ts-ignore
|
||||
const vscode = acquireVsCodeApi();
|
||||
|
||||
const textArea = document.querySelector('textarea');
|
||||
|
||||
const initialState = vscode.getState();
|
||||
if (initialState) {
|
||||
textArea.value = initialState.value;
|
||||
}
|
||||
|
||||
window.addEventListener('message', e => {
|
||||
switch (e.data.type) {
|
||||
case 'fakeInput':
|
||||
{
|
||||
const value = e.data.value;
|
||||
textArea.value = value;
|
||||
onInput();
|
||||
break;
|
||||
}
|
||||
|
||||
case 'setValue':
|
||||
{
|
||||
const value = e.data.value;
|
||||
textArea.value = value;
|
||||
vscode.setState({ value });
|
||||
|
||||
vscode.postMessage({
|
||||
type: 'didChangeContent',
|
||||
value: value
|
||||
});
|
||||
break;
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
const onInput = () => {
|
||||
const value = textArea.value;
|
||||
vscode.setState({ value });
|
||||
vscode.postMessage({
|
||||
type: 'edit',
|
||||
value: value
|
||||
});
|
||||
vscode.postMessage({
|
||||
type: 'didChangeContent',
|
||||
value: value
|
||||
});
|
||||
};
|
||||
|
||||
textArea.addEventListener('input', onInput);
|
||||
}());
|
@ -0,0 +1,44 @@
|
||||
{
|
||||
"name": "vscode-custom-editor-tests",
|
||||
"description": "Custom editor tests for VS Code",
|
||||
"version": "0.0.1",
|
||||
"publisher": "vscode",
|
||||
"license": "MIT",
|
||||
"private": true,
|
||||
"activationEvents": [
|
||||
"onCustomEditor:testWebviewEditor.abc"
|
||||
],
|
||||
"main": "./out/extension",
|
||||
"enableProposedApi": true,
|
||||
"engines": {
|
||||
"vscode": "^1.48.0"
|
||||
},
|
||||
"scripts": {
|
||||
"compile": "node ./node_modules/vscode/bin/compile -watch -p ./",
|
||||
"vscode:prepublish": "node ../../node_modules/gulp/bin/gulp.js --gulpfile ../../build/gulpfile.extensions.js compile-extension:vscode-notebook-tests ./tsconfig.json"
|
||||
},
|
||||
"dependencies": {
|
||||
"p-limit": "^3.0.2"
|
||||
},
|
||||
"devDependencies": {
|
||||
"@types/node": "^12.11.7",
|
||||
"@types/p-limit": "^2.2.0",
|
||||
"mocha": "^2.3.3",
|
||||
"mocha-junit-reporter": "^1.17.0",
|
||||
"mocha-multi-reporters": "^1.1.7",
|
||||
"vscode": "^1.1.36"
|
||||
},
|
||||
"contributes": {
|
||||
"customEditors": [
|
||||
{
|
||||
"viewType": "testWebviewEditor.abc",
|
||||
"displayName": "Test ABC editor",
|
||||
"selector": [
|
||||
{
|
||||
"filenamePattern": "*.abc"
|
||||
}
|
||||
]
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
@ -0,0 +1,165 @@
|
||||
/*---------------------------------------------------------------------------------------------
|
||||
* Copyright (c) Microsoft Corporation. All rights reserved.
|
||||
* Licensed under the MIT License. See License.txt in the project root for license information.
|
||||
*--------------------------------------------------------------------------------------------*/
|
||||
|
||||
import * as pLimit from 'p-limit';
|
||||
import * as path from 'path';
|
||||
import * as vscode from 'vscode';
|
||||
import { Disposable } from './dispose';
|
||||
|
||||
export namespace Testing {
|
||||
export const abcEditorContentChangeCommand = '_abcEditor.contentChange';
|
||||
export const abcEditorTypeCommand = '_abcEditor.type';
|
||||
|
||||
export interface CustomEditorContentChangeEvent {
|
||||
readonly content: string;
|
||||
readonly source: vscode.Uri;
|
||||
}
|
||||
}
|
||||
|
||||
export class AbcTextEditorProvider implements vscode.CustomTextEditorProvider {
|
||||
|
||||
public static readonly viewType = 'testWebviewEditor.abc';
|
||||
|
||||
private activeEditor?: AbcEditor;
|
||||
|
||||
public constructor(
|
||||
private readonly context: vscode.ExtensionContext,
|
||||
) { }
|
||||
|
||||
public register(): vscode.Disposable {
|
||||
const provider = vscode.window.registerCustomEditorProvider(AbcTextEditorProvider.viewType, this);
|
||||
|
||||
const commands: vscode.Disposable[] = [];
|
||||
commands.push(vscode.commands.registerCommand(Testing.abcEditorTypeCommand, (content: string) => {
|
||||
this.activeEditor?.testing_fakeInput(content);
|
||||
}));
|
||||
|
||||
return vscode.Disposable.from(provider, ...commands);
|
||||
}
|
||||
|
||||
public async resolveCustomTextEditor(document: vscode.TextDocument, panel: vscode.WebviewPanel) {
|
||||
const editor = new AbcEditor(document, this.context.extensionPath, panel);
|
||||
|
||||
this.activeEditor = editor;
|
||||
|
||||
panel.onDidChangeViewState(({ webviewPanel }) => {
|
||||
if (this.activeEditor === editor && !webviewPanel.active) {
|
||||
this.activeEditor = undefined;
|
||||
}
|
||||
if (webviewPanel.active) {
|
||||
this.activeEditor = editor;
|
||||
}
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
class AbcEditor extends Disposable {
|
||||
|
||||
public readonly _onDispose = this._register(new vscode.EventEmitter<void>());
|
||||
public readonly onDispose = this._onDispose.event;
|
||||
|
||||
private readonly limit = pLimit(1);
|
||||
private syncedVersion: number = -1;
|
||||
private currentWorkspaceEdit?: Thenable<void>;
|
||||
|
||||
constructor(
|
||||
private readonly document: vscode.TextDocument,
|
||||
private readonly _extensionPath: string,
|
||||
private readonly panel: vscode.WebviewPanel,
|
||||
) {
|
||||
super();
|
||||
|
||||
panel.webview.options = {
|
||||
enableScripts: true,
|
||||
};
|
||||
panel.webview.html = this.html;
|
||||
|
||||
this._register(vscode.workspace.onDidChangeTextDocument(e => {
|
||||
if (e.document === this.document) {
|
||||
this.update();
|
||||
}
|
||||
}));
|
||||
|
||||
this._register(panel.webview.onDidReceiveMessage(message => {
|
||||
switch (message.type) {
|
||||
case 'edit':
|
||||
this.doEdit(message.value);
|
||||
break;
|
||||
|
||||
case 'didChangeContent':
|
||||
vscode.commands.executeCommand(Testing.abcEditorContentChangeCommand, {
|
||||
content: message.value,
|
||||
source: document.uri,
|
||||
} as Testing.CustomEditorContentChangeEvent);
|
||||
break;
|
||||
}
|
||||
}));
|
||||
|
||||
this._register(panel.onDidDispose(() => { this.dispose(); }));
|
||||
|
||||
this.update();
|
||||
}
|
||||
|
||||
public testing_fakeInput(value: string) {
|
||||
this.panel.webview.postMessage({
|
||||
type: 'fakeInput',
|
||||
value: value,
|
||||
});
|
||||
}
|
||||
|
||||
private async doEdit(value: string) {
|
||||
const edit = new vscode.WorkspaceEdit();
|
||||
edit.replace(this.document.uri, this.document.validateRange(new vscode.Range(new vscode.Position(0, 0), new vscode.Position(999999, 999999))), value);
|
||||
this.limit(() => {
|
||||
this.currentWorkspaceEdit = vscode.workspace.applyEdit(edit).then(() => {
|
||||
this.syncedVersion = this.document.version;
|
||||
this.currentWorkspaceEdit = undefined;
|
||||
});
|
||||
return this.currentWorkspaceEdit;
|
||||
});
|
||||
}
|
||||
|
||||
public dispose() {
|
||||
if (this.isDisposed) {
|
||||
return;
|
||||
}
|
||||
|
||||
this._onDispose.fire();
|
||||
super.dispose();
|
||||
}
|
||||
|
||||
private get html() {
|
||||
const contentRoot = path.join(this._extensionPath, 'customEditorMedia');
|
||||
const scriptUri = vscode.Uri.file(path.join(contentRoot, 'textEditor.js'));
|
||||
const nonce = Date.now() + '';
|
||||
return /* html */`<!DOCTYPE html>
|
||||
<html lang="en">
|
||||
<head>
|
||||
<meta charset="UTF-8">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||
<meta http-equiv="Content-Security-Policy" content="default-src 'none'; script-src 'nonce-${nonce}'; style-src 'unsafe-inline';">
|
||||
<title>Document</title>
|
||||
</head>
|
||||
<body>
|
||||
<textarea style="width: 300px; height: 300px;"></textarea>
|
||||
<script nonce=${nonce} src="${this.panel.webview.asWebviewUri(scriptUri)}"></script>
|
||||
</body>
|
||||
</html>`;
|
||||
}
|
||||
|
||||
public async update() {
|
||||
await this.currentWorkspaceEdit;
|
||||
|
||||
if (this.isDisposed || this.syncedVersion >= this.document.version) {
|
||||
return;
|
||||
}
|
||||
|
||||
this.panel.webview.postMessage({
|
||||
type: 'setValue',
|
||||
value: this.document.getText(),
|
||||
});
|
||||
this.syncedVersion = this.document.version;
|
||||
}
|
||||
}
|
@ -0,0 +1,42 @@
|
||||
/*---------------------------------------------------------------------------------------------
|
||||
* Copyright (c) Microsoft Corporation. All rights reserved.
|
||||
* Licensed under the MIT License. See License.txt in the project root for license information.
|
||||
*--------------------------------------------------------------------------------------------*/
|
||||
|
||||
import * as vscode from 'vscode';
|
||||
|
||||
export function disposeAll(disposables: vscode.Disposable[]) {
|
||||
while (disposables.length) {
|
||||
const item = disposables.pop();
|
||||
if (item) {
|
||||
item.dispose();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
export abstract class Disposable {
|
||||
private _isDisposed = false;
|
||||
|
||||
protected _disposables: vscode.Disposable[] = [];
|
||||
|
||||
public dispose(): any {
|
||||
if (this._isDisposed) {
|
||||
return;
|
||||
}
|
||||
this._isDisposed = true;
|
||||
disposeAll(this._disposables);
|
||||
}
|
||||
|
||||
protected _register<T extends vscode.Disposable>(value: T): T {
|
||||
if (this._isDisposed) {
|
||||
value.dispose();
|
||||
} else {
|
||||
this._disposables.push(value);
|
||||
}
|
||||
return value;
|
||||
}
|
||||
|
||||
protected get isDisposed() {
|
||||
return this._isDisposed;
|
||||
}
|
||||
}
|
@ -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.
|
||||
*--------------------------------------------------------------------------------------------*/
|
||||
|
||||
import * as vscode from 'vscode';
|
||||
import { AbcTextEditorProvider } from './customTextEditor';
|
||||
|
||||
export function activate(context: vscode.ExtensionContext) {
|
||||
context.subscriptions.push(new AbcTextEditorProvider(context).register());
|
||||
}
|
@ -0,0 +1,314 @@
|
||||
/*---------------------------------------------------------------------------------------------
|
||||
* Copyright (c) Microsoft Corporation. All rights reserved.
|
||||
* Licensed under the MIT License. See License.txt in the project root for license information.
|
||||
*--------------------------------------------------------------------------------------------*/
|
||||
|
||||
import * as assert from 'assert';
|
||||
import * as fs from 'fs';
|
||||
import * as path from 'path';
|
||||
import * as vscode from 'vscode';
|
||||
import { Testing } from '../customTextEditor';
|
||||
import { closeAllEditors, delay, disposeAll, randomFilePath } from './utils';
|
||||
|
||||
assert.ok(vscode.workspace.rootPath);
|
||||
const testWorkspaceRoot = vscode.Uri.file(path.join(vscode.workspace.rootPath!, 'customEditors'));
|
||||
|
||||
const commands = Object.freeze({
|
||||
open: 'vscode.open',
|
||||
openWith: 'vscode.openWith',
|
||||
save: 'workbench.action.files.save',
|
||||
undo: 'undo',
|
||||
});
|
||||
|
||||
async function writeRandomFile(options: { ext: string; contents: string; }): Promise<vscode.Uri> {
|
||||
const fakeFile = randomFilePath({ root: testWorkspaceRoot, ext: options.ext });
|
||||
await fs.promises.writeFile(fakeFile.fsPath, Buffer.from(options.contents));
|
||||
return fakeFile;
|
||||
}
|
||||
|
||||
const disposables: vscode.Disposable[] = [];
|
||||
function _register<T extends vscode.Disposable>(disposable: T) {
|
||||
disposables.push(disposable);
|
||||
return disposable;
|
||||
}
|
||||
|
||||
class CustomEditorUpdateListener {
|
||||
|
||||
public static create() {
|
||||
return _register(new CustomEditorUpdateListener());
|
||||
}
|
||||
|
||||
private readonly commandSubscription: vscode.Disposable;
|
||||
|
||||
private readonly unconsumedResponses: Array<Testing.CustomEditorContentChangeEvent> = [];
|
||||
private readonly callbackQueue: Array<(data: Testing.CustomEditorContentChangeEvent) => void> = [];
|
||||
|
||||
private constructor() {
|
||||
this.commandSubscription = vscode.commands.registerCommand(Testing.abcEditorContentChangeCommand, (data: Testing.CustomEditorContentChangeEvent) => {
|
||||
if (this.callbackQueue.length) {
|
||||
const callback = this.callbackQueue.shift();
|
||||
assert.ok(callback);
|
||||
callback!(data);
|
||||
} else {
|
||||
this.unconsumedResponses.push(data);
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
dispose() {
|
||||
this.commandSubscription.dispose();
|
||||
}
|
||||
|
||||
async nextResponse(): Promise<Testing.CustomEditorContentChangeEvent> {
|
||||
if (this.unconsumedResponses.length) {
|
||||
return this.unconsumedResponses.shift()!;
|
||||
}
|
||||
|
||||
return new Promise(resolve => {
|
||||
this.callbackQueue.push(resolve);
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
suite('CustomEditor tests', () => {
|
||||
setup(async () => {
|
||||
await closeAllEditors();
|
||||
await resetTestWorkspace();
|
||||
});
|
||||
|
||||
teardown(async () => {
|
||||
await closeAllEditors();
|
||||
disposeAll(disposables);
|
||||
await resetTestWorkspace();
|
||||
});
|
||||
|
||||
test('Should load basic content from disk', async () => {
|
||||
const startingContent = `load, init`;
|
||||
const testDocument = await writeRandomFile({ ext: '.abc', contents: startingContent });
|
||||
|
||||
const listener = CustomEditorUpdateListener.create();
|
||||
|
||||
await vscode.commands.executeCommand(commands.open, testDocument);
|
||||
|
||||
const { content } = await listener.nextResponse();
|
||||
assert.equal(content, startingContent);
|
||||
});
|
||||
|
||||
test('Should support basic edits', async () => {
|
||||
const startingContent = `basic edit, init`;
|
||||
const testDocument = await writeRandomFile({ ext: '.abc', contents: startingContent });
|
||||
|
||||
const listener = CustomEditorUpdateListener.create();
|
||||
|
||||
await vscode.commands.executeCommand(commands.open, testDocument);
|
||||
await listener.nextResponse();
|
||||
|
||||
const newContent = `basic edit test`;
|
||||
await vscode.commands.executeCommand(Testing.abcEditorTypeCommand, newContent);
|
||||
const { content } = await listener.nextResponse();
|
||||
assert.equal(content, newContent);
|
||||
});
|
||||
|
||||
test('Should support single undo', async () => {
|
||||
const startingContent = `single undo, init`;
|
||||
const testDocument = await writeRandomFile({ ext: '.abc', contents: startingContent });
|
||||
|
||||
const listener = CustomEditorUpdateListener.create();
|
||||
|
||||
await vscode.commands.executeCommand(commands.open, testDocument);
|
||||
await listener.nextResponse();
|
||||
|
||||
const newContent = `undo test`;
|
||||
{
|
||||
await vscode.commands.executeCommand(Testing.abcEditorTypeCommand, newContent);
|
||||
const { content } = await listener.nextResponse();
|
||||
assert.equal(content, newContent);
|
||||
}
|
||||
await delay(100);
|
||||
{
|
||||
await vscode.commands.executeCommand(commands.undo);
|
||||
const { content } = await listener.nextResponse();
|
||||
assert.equal(content, startingContent);
|
||||
}
|
||||
});
|
||||
|
||||
test('Should support multiple undo', async () => {
|
||||
const startingContent = `multiple undo, init`;
|
||||
const testDocument = await writeRandomFile({ ext: '.abc', contents: startingContent });
|
||||
|
||||
const listener = CustomEditorUpdateListener.create();
|
||||
|
||||
await vscode.commands.executeCommand(commands.open, testDocument);
|
||||
await listener.nextResponse();
|
||||
|
||||
const count = 10;
|
||||
|
||||
// Make edits
|
||||
for (let i = 0; i < count; ++i) {
|
||||
await vscode.commands.executeCommand(Testing.abcEditorTypeCommand, `${i}`);
|
||||
const { content } = await listener.nextResponse();
|
||||
assert.equal(`${i}`, content);
|
||||
}
|
||||
|
||||
// Then undo them in order
|
||||
for (let i = count - 1; i; --i) {
|
||||
await delay(100);
|
||||
await vscode.commands.executeCommand(commands.undo);
|
||||
const { content } = await listener.nextResponse();
|
||||
assert.equal(`${i - 1}`, content);
|
||||
}
|
||||
|
||||
{
|
||||
await delay(100);
|
||||
await vscode.commands.executeCommand(commands.undo);
|
||||
const { content } = await listener.nextResponse();
|
||||
assert.equal(content, startingContent);
|
||||
}
|
||||
});
|
||||
|
||||
test('Should update custom editor on file move', async () => {
|
||||
const startingContent = `file move, init`;
|
||||
const testDocument = await writeRandomFile({ ext: '.abc', contents: startingContent });
|
||||
|
||||
const listener = CustomEditorUpdateListener.create();
|
||||
|
||||
await vscode.commands.executeCommand(commands.open, testDocument);
|
||||
await listener.nextResponse();
|
||||
|
||||
const newFileName = vscode.Uri.file(path.join(testWorkspaceRoot.fsPath, 'y.abc'));
|
||||
|
||||
const edit = new vscode.WorkspaceEdit();
|
||||
edit.renameFile(testDocument, newFileName);
|
||||
|
||||
await vscode.workspace.applyEdit(edit);
|
||||
|
||||
const response = (await listener.nextResponse());
|
||||
assert.equal(response.content, startingContent);
|
||||
assert.equal(response.source.toString(), newFileName.toString());
|
||||
});
|
||||
|
||||
test('Should support saving custom editors', async () => {
|
||||
const startingContent = `save, init`;
|
||||
const testDocument = await writeRandomFile({ ext: '.abc', contents: startingContent });
|
||||
|
||||
const listener = CustomEditorUpdateListener.create();
|
||||
|
||||
await vscode.commands.executeCommand(commands.open, testDocument);
|
||||
await listener.nextResponse();
|
||||
|
||||
const newContent = `save, new`;
|
||||
{
|
||||
await vscode.commands.executeCommand(Testing.abcEditorTypeCommand, newContent);
|
||||
const { content } = await listener.nextResponse();
|
||||
assert.equal(content, newContent);
|
||||
}
|
||||
{
|
||||
await vscode.commands.executeCommand(commands.save);
|
||||
const fileContent = (await fs.promises.readFile(testDocument.fsPath)).toString();
|
||||
assert.equal(fileContent, newContent);
|
||||
}
|
||||
});
|
||||
|
||||
test('Should undo after saving custom editor', async () => {
|
||||
const startingContent = `undo after save, init`;
|
||||
const testDocument = await writeRandomFile({ ext: '.abc', contents: startingContent });
|
||||
|
||||
const listener = CustomEditorUpdateListener.create();
|
||||
|
||||
await vscode.commands.executeCommand(commands.open, testDocument);
|
||||
await listener.nextResponse();
|
||||
|
||||
const newContent = `undo after save, new`;
|
||||
{
|
||||
await vscode.commands.executeCommand(Testing.abcEditorTypeCommand, newContent);
|
||||
const { content } = await listener.nextResponse();
|
||||
assert.equal(content, newContent);
|
||||
}
|
||||
{
|
||||
await vscode.commands.executeCommand(commands.save);
|
||||
const fileContent = (await fs.promises.readFile(testDocument.fsPath)).toString();
|
||||
assert.equal(fileContent, newContent);
|
||||
}
|
||||
await delay(100);
|
||||
{
|
||||
await vscode.commands.executeCommand(commands.undo);
|
||||
const { content } = await listener.nextResponse();
|
||||
assert.equal(content, startingContent);
|
||||
}
|
||||
});
|
||||
|
||||
test.skip('Should support untitled custom editors', async () => {
|
||||
const listener = CustomEditorUpdateListener.create();
|
||||
|
||||
const untitledFile = randomFilePath({ root: testWorkspaceRoot, ext: '.abc' }).with({ scheme: 'untitled' });
|
||||
|
||||
await vscode.commands.executeCommand(commands.open, untitledFile);
|
||||
assert.equal((await listener.nextResponse()).content, '');
|
||||
|
||||
await vscode.commands.executeCommand(Testing.abcEditorTypeCommand, `123`);
|
||||
assert.equal((await listener.nextResponse()).content, '123');
|
||||
|
||||
await vscode.commands.executeCommand(commands.save);
|
||||
const content = await fs.promises.readFile(untitledFile.fsPath);
|
||||
assert.equal(content.toString(), '123');
|
||||
});
|
||||
|
||||
test.skip('When switching away from a non-default custom editors and then back, we should continue using the non-default editor', async () => {
|
||||
const startingContent = `switch, init`;
|
||||
const testDocument = await writeRandomFile({ ext: '.abc', contents: startingContent });
|
||||
|
||||
const listener = CustomEditorUpdateListener.create();
|
||||
|
||||
{
|
||||
await vscode.commands.executeCommand(commands.open, testDocument, { preview: false });
|
||||
const { content } = await listener.nextResponse();
|
||||
assert.strictEqual(content, startingContent.toString());
|
||||
assert.ok(!vscode.window.activeTextEditor);
|
||||
}
|
||||
|
||||
// Switch to non-default editor
|
||||
await vscode.commands.executeCommand(commands.openWith, testDocument, 'default', { preview: false });
|
||||
assert.strictEqual(vscode.window.activeTextEditor!?.document.uri.toString(), testDocument.toString());
|
||||
|
||||
// Then open a new document (hiding existing one)
|
||||
const otherFile = vscode.Uri.file(path.join(testWorkspaceRoot.fsPath, 'other.json'));
|
||||
await vscode.commands.executeCommand(commands.open, otherFile);
|
||||
assert.strictEqual(vscode.window.activeTextEditor!?.document.uri.toString(), otherFile.toString());
|
||||
|
||||
// And then back
|
||||
await vscode.commands.executeCommand('workbench.action.navigateBack');
|
||||
await vscode.commands.executeCommand('workbench.action.navigateBack');
|
||||
|
||||
// Make sure we have the file on as text
|
||||
assert.ok(vscode.window.activeTextEditor);
|
||||
assert.strictEqual(vscode.window.activeTextEditor!?.document.uri.toString(), testDocument.toString());
|
||||
});
|
||||
|
||||
test('Should release the text document when the editor is closed', async () => {
|
||||
const startingContent = `release document init,`;
|
||||
const testDocument = await writeRandomFile({ ext: '.abc', contents: startingContent });
|
||||
|
||||
const listener = CustomEditorUpdateListener.create();
|
||||
|
||||
await vscode.commands.executeCommand(commands.open, testDocument);
|
||||
await listener.nextResponse();
|
||||
|
||||
const doc = vscode.workspace.textDocuments.find(x => x.uri.toString() === testDocument.toString());
|
||||
assert.ok(doc);
|
||||
assert.ok(!doc!.isClosed);
|
||||
|
||||
await closeAllEditors();
|
||||
await delay(100);
|
||||
assert.ok(doc!.isClosed);
|
||||
});
|
||||
});
|
||||
|
||||
async function resetTestWorkspace() {
|
||||
try {
|
||||
await vscode.workspace.fs.delete(testWorkspaceRoot, { recursive: true });
|
||||
} catch {
|
||||
// ok if file doesn't exist
|
||||
}
|
||||
await vscode.workspace.fs.createDirectory(testWorkspaceRoot);
|
||||
}
|
@ -0,0 +1,30 @@
|
||||
/*---------------------------------------------------------------------------------------------
|
||||
* Copyright (c) Microsoft Corporation. All rights reserved.
|
||||
* Licensed under the MIT License. See License.txt in the project root for license information.
|
||||
*--------------------------------------------------------------------------------------------*/
|
||||
|
||||
const path = require('path');
|
||||
const testRunner = require('vscode/lib/testrunner');
|
||||
|
||||
const suite = 'Custom Editor Tests';
|
||||
|
||||
const options: any = {
|
||||
ui: 'tdd',
|
||||
useColors: (!process.env.BUILD_ARTIFACTSTAGINGDIRECTORY && process.platform !== 'win32'),
|
||||
timeout: 6000000
|
||||
};
|
||||
|
||||
if (process.env.BUILD_ARTIFACTSTAGINGDIRECTORY) {
|
||||
options.reporter = 'mocha-multi-reporters';
|
||||
options.reporterOptions = {
|
||||
reporterEnabled: 'spec, mocha-junit-reporter',
|
||||
mochaJunitReporterReporterOptions: {
|
||||
testsuitesTitle: `${suite} ${process.platform}`,
|
||||
mochaFile: path.join(process.env.BUILD_ARTIFACTSTAGINGDIRECTORY, `test-results/${process.platform}-${process.arch}-${suite.toLowerCase().replace(/[^\w]/g, '-')}-results.xml`)
|
||||
}
|
||||
};
|
||||
}
|
||||
|
||||
testRunner.configure(options);
|
||||
|
||||
export = testRunner;
|
@ -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.
|
||||
*--------------------------------------------------------------------------------------------*/
|
||||
|
||||
import * as vscode from 'vscode';
|
||||
|
||||
export function randomFilePath(args: { root: vscode.Uri, ext: string }): vscode.Uri {
|
||||
const fileName = Math.random().toString(36).replace(/[^a-z]+/g, '').substr(0, 10);
|
||||
return (vscode.Uri as any).joinPath(args.root, fileName + args.ext);
|
||||
}
|
||||
|
||||
export function closeAllEditors(): Thenable<any> {
|
||||
return vscode.commands.executeCommand('workbench.action.closeAllEditors');
|
||||
}
|
||||
|
||||
export function disposeAll(disposables: vscode.Disposable[]) {
|
||||
vscode.Disposable.from(...disposables).dispose();
|
||||
}
|
||||
|
||||
export function delay(ms: number) {
|
||||
return new Promise(resolve => setTimeout(resolve, ms));
|
||||
}
|
8
lib/vscode/extensions/vscode-custom-editor-tests/src/typings/ref.d.ts
vendored
Normal file
8
lib/vscode/extensions/vscode-custom-editor-tests/src/typings/ref.d.ts
vendored
Normal file
@ -0,0 +1,8 @@
|
||||
/*---------------------------------------------------------------------------------------------
|
||||
* Copyright (c) Microsoft Corporation. All rights reserved.
|
||||
* Licensed under the MIT License. See License.txt in the project root for license information.
|
||||
*--------------------------------------------------------------------------------------------*/
|
||||
|
||||
/// <reference path="../../../../src/vs/vscode.d.ts" />
|
||||
/// <reference types='@types/node'/>
|
||||
|
@ -0,0 +1,9 @@
|
||||
{
|
||||
"extends": "../shared.tsconfig.json",
|
||||
"compilerOptions": {
|
||||
"outDir": "./out"
|
||||
},
|
||||
"include": [
|
||||
"src/**/*"
|
||||
]
|
||||
}
|
507
lib/vscode/extensions/vscode-custom-editor-tests/yarn.lock
Normal file
507
lib/vscode/extensions/vscode-custom-editor-tests/yarn.lock
Normal file
@ -0,0 +1,507 @@
|
||||
# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY.
|
||||
# yarn lockfile v1
|
||||
|
||||
|
||||
"@tootallnate/once@1":
|
||||
version "1.1.2"
|
||||
resolved "https://registry.yarnpkg.com/@tootallnate/once/-/once-1.1.2.tgz#ccb91445360179a04e7fe6aff78c00ffc1eeaf82"
|
||||
integrity sha512-RbzJvlNzmRq5c3O09UipeuXno4tA1FE6ikOjxZK0tuxVv3412l64l5t1W5pj4+rJq9vpkm/kwiR07aZXnsKPxw==
|
||||
|
||||
"@types/node@^12.11.7":
|
||||
version "12.12.53"
|
||||
resolved "https://registry.yarnpkg.com/@types/node/-/node-12.12.53.tgz#be0d375933c3d15ef2380dafb3b0350ea7021129"
|
||||
integrity sha512-51MYTDTyCziHb70wtGNFRwB4l+5JNvdqzFSkbDvpbftEgVUBEE+T5f7pROhWMp/fxp07oNIEQZd5bbfAH22ohQ==
|
||||
|
||||
"@types/p-limit@^2.2.0":
|
||||
version "2.2.0"
|
||||
resolved "https://registry.yarnpkg.com/@types/p-limit/-/p-limit-2.2.0.tgz#94a608e9b258a6c6156a13d1a14fd720dba70b97"
|
||||
integrity sha512-fGFbybl1r0oE9mqgfc2EHHUin9ZL5rbQIexWI6jYRU1ADVn4I3LHzT+g/kpPpZsfp8PB94CQ655pfAjNF8LP6A==
|
||||
dependencies:
|
||||
p-limit "*"
|
||||
|
||||
agent-base@4, agent-base@^4.3.0:
|
||||
version "4.3.0"
|
||||
resolved "https://registry.yarnpkg.com/agent-base/-/agent-base-4.3.0.tgz#8165f01c436009bccad0b1d122f05ed770efc6ee"
|
||||
integrity sha512-salcGninV0nPrwpGNn4VTXBb1SOuXQBiqbrNXoeizJsHrsL6ERFM2Ne3JUSBWRE6aeNJI2ROP/WEEIDUiDe3cg==
|
||||
dependencies:
|
||||
es6-promisify "^5.0.0"
|
||||
|
||||
agent-base@6:
|
||||
version "6.0.1"
|
||||
resolved "https://registry.yarnpkg.com/agent-base/-/agent-base-6.0.1.tgz#808007e4e5867decb0ab6ab2f928fbdb5a596db4"
|
||||
integrity sha512-01q25QQDwLSsyfhrKbn8yuur+JNw0H+0Y4JiGIKd3z9aYk/w/2kxD/Upc+t2ZBBSUNff50VjPsSW2YxM8QYKVg==
|
||||
dependencies:
|
||||
debug "4"
|
||||
|
||||
ansi-regex@^3.0.0:
|
||||
version "3.0.0"
|
||||
resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-3.0.0.tgz#ed0317c322064f79466c02966bddb605ab37d998"
|
||||
integrity sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=
|
||||
|
||||
balanced-match@^1.0.0:
|
||||
version "1.0.0"
|
||||
resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.0.tgz#89b4d199ab2bee49de164ea02b89ce462d71b767"
|
||||
integrity sha1-ibTRmasr7kneFk6gK4nORi1xt2c=
|
||||
|
||||
brace-expansion@^1.1.7:
|
||||
version "1.1.11"
|
||||
resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd"
|
||||
integrity sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==
|
||||
dependencies:
|
||||
balanced-match "^1.0.0"
|
||||
concat-map "0.0.1"
|
||||
|
||||
browser-stdout@1.3.1:
|
||||
version "1.3.1"
|
||||
resolved "https://registry.yarnpkg.com/browser-stdout/-/browser-stdout-1.3.1.tgz#baa559ee14ced73452229bad7326467c61fabd60"
|
||||
integrity sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==
|
||||
|
||||
buffer-from@^1.0.0:
|
||||
version "1.1.1"
|
||||
resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.1.1.tgz#32713bc028f75c02fdb710d7c7bcec1f2c6070ef"
|
||||
integrity sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A==
|
||||
|
||||
charenc@~0.0.1:
|
||||
version "0.0.2"
|
||||
resolved "https://registry.yarnpkg.com/charenc/-/charenc-0.0.2.tgz#c0a1d2f3a7092e03774bfa83f14c0fc5790a8667"
|
||||
integrity sha1-wKHS86cJLgN3S/qD8UwPxXkKhmc=
|
||||
|
||||
commander@0.6.1:
|
||||
version "0.6.1"
|
||||
resolved "https://registry.yarnpkg.com/commander/-/commander-0.6.1.tgz#fa68a14f6a945d54dbbe50d8cdb3320e9e3b1a06"
|
||||
integrity sha1-+mihT2qUXVTbvlDYzbMyDp47GgY=
|
||||
|
||||
commander@2.15.1:
|
||||
version "2.15.1"
|
||||
resolved "https://registry.yarnpkg.com/commander/-/commander-2.15.1.tgz#df46e867d0fc2aec66a34662b406a9ccafff5b0f"
|
||||
integrity sha512-VlfT9F3V0v+jr4yxPc5gg9s62/fIVWsd2Bk2iD435um1NlGMYdVCq+MjcXnhYq2icNOizHr1kK+5TI6H0Hy0ag==
|
||||
|
||||
commander@2.3.0:
|
||||
version "2.3.0"
|
||||
resolved "https://registry.yarnpkg.com/commander/-/commander-2.3.0.tgz#fd430e889832ec353b9acd1de217c11cb3eef873"
|
||||
integrity sha1-/UMOiJgy7DU7ms0d4hfBHLPu+HM=
|
||||
|
||||
concat-map@0.0.1:
|
||||
version "0.0.1"
|
||||
resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b"
|
||||
integrity sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=
|
||||
|
||||
crypt@~0.0.1:
|
||||
version "0.0.2"
|
||||
resolved "https://registry.yarnpkg.com/crypt/-/crypt-0.0.2.tgz#88d7ff7ec0dfb86f713dc87bbb42d044d3e6c41b"
|
||||
integrity sha1-iNf/fsDfuG9xPch7u0LQRNPmxBs=
|
||||
|
||||
debug@2.2.0:
|
||||
version "2.2.0"
|
||||
resolved "https://registry.yarnpkg.com/debug/-/debug-2.2.0.tgz#f87057e995b1a1f6ae6a4960664137bc56f039da"
|
||||
integrity sha1-+HBX6ZWxofauaklgZkE3vFbwOdo=
|
||||
dependencies:
|
||||
ms "0.7.1"
|
||||
|
||||
debug@3.1.0:
|
||||
version "3.1.0"
|
||||
resolved "https://registry.yarnpkg.com/debug/-/debug-3.1.0.tgz#5bb5a0672628b64149566ba16819e61518c67261"
|
||||
integrity sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==
|
||||
dependencies:
|
||||
ms "2.0.0"
|
||||
|
||||
debug@4:
|
||||
version "4.1.1"
|
||||
resolved "https://registry.yarnpkg.com/debug/-/debug-4.1.1.tgz#3b72260255109c6b589cee050f1d516139664791"
|
||||
integrity sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==
|
||||
dependencies:
|
||||
ms "^2.1.1"
|
||||
|
||||
debug@^2.2.0:
|
||||
version "2.6.9"
|
||||
resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f"
|
||||
integrity sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==
|
||||
dependencies:
|
||||
ms "2.0.0"
|
||||
|
||||
debug@^3.1.0:
|
||||
version "3.2.6"
|
||||
resolved "https://registry.yarnpkg.com/debug/-/debug-3.2.6.tgz#e83d17de16d8a7efb7717edbe5fb10135eee629b"
|
||||
integrity sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==
|
||||
dependencies:
|
||||
ms "^2.1.1"
|
||||
|
||||
diff@1.4.0:
|
||||
version "1.4.0"
|
||||
resolved "https://registry.yarnpkg.com/diff/-/diff-1.4.0.tgz#7f28d2eb9ee7b15a97efd89ce63dcfdaa3ccbabf"
|
||||
integrity sha1-fyjS657nsVqX79ic5j3P2qPMur8=
|
||||
|
||||
diff@3.5.0:
|
||||
version "3.5.0"
|
||||
resolved "https://registry.yarnpkg.com/diff/-/diff-3.5.0.tgz#800c0dd1e0a8bfbc95835c202ad220fe317e5a12"
|
||||
integrity sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA==
|
||||
|
||||
es6-promise@^4.0.3:
|
||||
version "4.2.8"
|
||||
resolved "https://registry.yarnpkg.com/es6-promise/-/es6-promise-4.2.8.tgz#4eb21594c972bc40553d276e510539143db53e0a"
|
||||
integrity sha512-HJDGx5daxeIvxdBxvG2cb9g4tEvwIk3i8+nhX0yGrYmZUzbkdg8QbDevheDB8gd0//uPj4c1EQua8Q+MViT0/w==
|
||||
|
||||
es6-promisify@^5.0.0:
|
||||
version "5.0.0"
|
||||
resolved "https://registry.yarnpkg.com/es6-promisify/-/es6-promisify-5.0.0.tgz#5109d62f3e56ea967c4b63505aef08291c8a5203"
|
||||
integrity sha1-UQnWLz5W6pZ8S2NQWu8IKRyKUgM=
|
||||
dependencies:
|
||||
es6-promise "^4.0.3"
|
||||
|
||||
escape-string-regexp@1.0.2:
|
||||
version "1.0.2"
|
||||
resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.2.tgz#4dbc2fe674e71949caf3fb2695ce7f2dc1d9a8d1"
|
||||
integrity sha1-Tbwv5nTnGUnK8/smlc5/LcHZqNE=
|
||||
|
||||
escape-string-regexp@1.0.5:
|
||||
version "1.0.5"
|
||||
resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4"
|
||||
integrity sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=
|
||||
|
||||
fs.realpath@^1.0.0:
|
||||
version "1.0.0"
|
||||
resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f"
|
||||
integrity sha1-FQStJSMVjKpA20onh8sBQRmU6k8=
|
||||
|
||||
glob@3.2.11:
|
||||
version "3.2.11"
|
||||
resolved "https://registry.yarnpkg.com/glob/-/glob-3.2.11.tgz#4a973f635b9190f715d10987d5c00fd2815ebe3d"
|
||||
integrity sha1-Spc/Y1uRkPcV0QmH1cAP0oFevj0=
|
||||
dependencies:
|
||||
inherits "2"
|
||||
minimatch "0.3"
|
||||
|
||||
glob@7.1.2:
|
||||
version "7.1.2"
|
||||
resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.2.tgz#c19c9df9a028702d678612384a6552404c636d15"
|
||||
integrity sha512-MJTUg1kjuLeQCJ+ccE4Vpa6kKVXkPYJ2mOCQyUuKLcLQsdrMCpBPUi8qVE6+YuaJkozeA9NusTAw3hLr8Xe5EQ==
|
||||
dependencies:
|
||||
fs.realpath "^1.0.0"
|
||||
inflight "^1.0.4"
|
||||
inherits "2"
|
||||
minimatch "^3.0.4"
|
||||
once "^1.3.0"
|
||||
path-is-absolute "^1.0.0"
|
||||
|
||||
glob@^7.1.2:
|
||||
version "7.1.6"
|
||||
resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.6.tgz#141f33b81a7c2492e125594307480c46679278a6"
|
||||
integrity sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==
|
||||
dependencies:
|
||||
fs.realpath "^1.0.0"
|
||||
inflight "^1.0.4"
|
||||
inherits "2"
|
||||
minimatch "^3.0.4"
|
||||
once "^1.3.0"
|
||||
path-is-absolute "^1.0.0"
|
||||
|
||||
growl@1.10.5:
|
||||
version "1.10.5"
|
||||
resolved "https://registry.yarnpkg.com/growl/-/growl-1.10.5.tgz#f2735dc2283674fa67478b10181059355c369e5e"
|
||||
integrity sha512-qBr4OuELkhPenW6goKVXiv47US3clb3/IbuWF9KNKEijAy9oeHxU9IgzjvJhHkUzhaj7rOUD7+YGWqUjLp5oSA==
|
||||
|
||||
growl@1.9.2:
|
||||
version "1.9.2"
|
||||
resolved "https://registry.yarnpkg.com/growl/-/growl-1.9.2.tgz#0ea7743715db8d8de2c5ede1775e1b45ac85c02f"
|
||||
integrity sha1-Dqd0NxXbjY3ixe3hd14bRayFwC8=
|
||||
|
||||
has-flag@^3.0.0:
|
||||
version "3.0.0"
|
||||
resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd"
|
||||
integrity sha1-tdRU3CGZriJWmfNGfloH87lVuv0=
|
||||
|
||||
he@1.1.1:
|
||||
version "1.1.1"
|
||||
resolved "https://registry.yarnpkg.com/he/-/he-1.1.1.tgz#93410fd21b009735151f8868c2f271f3427e23fd"
|
||||
integrity sha1-k0EP0hsAlzUVH4howvJx80J+I/0=
|
||||
|
||||
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"
|
||||
integrity sha512-qwHbBLV7WviBl0rQsOzH6o5lwyOIvwp/BdFnvVxXORldu5TmjFfjzBcWUWS5kWAZhmv+JtiDhSuQCp4sBfbIgg==
|
||||
dependencies:
|
||||
agent-base "4"
|
||||
debug "3.1.0"
|
||||
|
||||
http-proxy-agent@^4.0.1:
|
||||
version "4.0.1"
|
||||
resolved "https://registry.yarnpkg.com/http-proxy-agent/-/http-proxy-agent-4.0.1.tgz#8a8c8ef7f5932ccf953c296ca8291b95aa74aa3a"
|
||||
integrity sha512-k0zdNgqWTGA6aeIRVpvfVob4fL52dTfaehylg0Y4UvSySvOq/Y+BOyPrgpUrA7HylqvU8vIZGsRuXmspskV0Tg==
|
||||
dependencies:
|
||||
"@tootallnate/once" "1"
|
||||
agent-base "6"
|
||||
debug "4"
|
||||
|
||||
https-proxy-agent@^2.2.1:
|
||||
version "2.2.4"
|
||||
resolved "https://registry.yarnpkg.com/https-proxy-agent/-/https-proxy-agent-2.2.4.tgz#4ee7a737abd92678a293d9b34a1af4d0d08c787b"
|
||||
integrity sha512-OmvfoQ53WLjtA9HeYP9RNrWMJzzAz1JGaSFr1nijg0PVR1JaD/xbJq1mdEIIlxGpXp9eSe/O2LgU9DJmTPd0Eg==
|
||||
dependencies:
|
||||
agent-base "^4.3.0"
|
||||
debug "^3.1.0"
|
||||
|
||||
https-proxy-agent@^5.0.0:
|
||||
version "5.0.0"
|
||||
resolved "https://registry.yarnpkg.com/https-proxy-agent/-/https-proxy-agent-5.0.0.tgz#e2a90542abb68a762e0a0850f6c9edadfd8506b2"
|
||||
integrity sha512-EkYm5BcKUGiduxzSt3Eppko+PiNWNEpa4ySk9vTC6wDsQJW9rHSa+UhGNJoRYp7bz6Ht1eaRIa6QaJqO5rCFbA==
|
||||
dependencies:
|
||||
agent-base "6"
|
||||
debug "4"
|
||||
|
||||
inflight@^1.0.4:
|
||||
version "1.0.6"
|
||||
resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9"
|
||||
integrity sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=
|
||||
dependencies:
|
||||
once "^1.3.0"
|
||||
wrappy "1"
|
||||
|
||||
inherits@2:
|
||||
version "2.0.4"
|
||||
resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c"
|
||||
integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==
|
||||
|
||||
is-buffer@~1.1.1:
|
||||
version "1.1.6"
|
||||
resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-1.1.6.tgz#efaa2ea9daa0d7ab2ea13a97b2b8ad51fefbe8be"
|
||||
integrity sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==
|
||||
|
||||
jade@0.26.3:
|
||||
version "0.26.3"
|
||||
resolved "https://registry.yarnpkg.com/jade/-/jade-0.26.3.tgz#8f10d7977d8d79f2f6ff862a81b0513ccb25686c"
|
||||
integrity sha1-jxDXl32NefL2/4YqgbBRPMslaGw=
|
||||
dependencies:
|
||||
commander "0.6.1"
|
||||
mkdirp "0.3.0"
|
||||
|
||||
lodash@^4.16.4:
|
||||
version "4.17.19"
|
||||
resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.19.tgz#e48ddedbe30b3321783c5b4301fbd353bc1e4a4b"
|
||||
integrity sha512-JNvd8XER9GQX0v2qJgsaN/mzFCNA5BRe/j8JN9d+tWyGLSodKQHKFicdwNYzWwI3wjRnaKPsGj1XkBjx/F96DQ==
|
||||
|
||||
lru-cache@2:
|
||||
version "2.7.3"
|
||||
resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-2.7.3.tgz#6d4524e8b955f95d4f5b58851ce21dd72fb4e952"
|
||||
integrity sha1-bUUk6LlV+V1PW1iFHOId1y+06VI=
|
||||
|
||||
md5@^2.1.0:
|
||||
version "2.2.1"
|
||||
resolved "https://registry.yarnpkg.com/md5/-/md5-2.2.1.tgz#53ab38d5fe3c8891ba465329ea23fac0540126f9"
|
||||
integrity sha1-U6s41f48iJG6RlMp6iP6wFQBJvk=
|
||||
dependencies:
|
||||
charenc "~0.0.1"
|
||||
crypt "~0.0.1"
|
||||
is-buffer "~1.1.1"
|
||||
|
||||
minimatch@0.3:
|
||||
version "0.3.0"
|
||||
resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-0.3.0.tgz#275d8edaac4f1bb3326472089e7949c8394699dd"
|
||||
integrity sha1-J12O2qxPG7MyZHIInnlJyDlGmd0=
|
||||
dependencies:
|
||||
lru-cache "2"
|
||||
sigmund "~1.0.0"
|
||||
|
||||
minimatch@3.0.4, minimatch@^3.0.4:
|
||||
version "3.0.4"
|
||||
resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.4.tgz#5166e286457f03306064be5497e8dbb0c3d32083"
|
||||
integrity sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==
|
||||
dependencies:
|
||||
brace-expansion "^1.1.7"
|
||||
|
||||
minimist@0.0.8:
|
||||
version "0.0.8"
|
||||
resolved "https://registry.yarnpkg.com/minimist/-/minimist-0.0.8.tgz#857fcabfc3397d2625b8228262e86aa7a011b05d"
|
||||
integrity sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=
|
||||
|
||||
minimist@^1.2.5:
|
||||
version "1.2.5"
|
||||
resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.5.tgz#67d66014b66a6a8aaa0c083c5fd58df4e4e97602"
|
||||
integrity sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==
|
||||
|
||||
mkdirp@0.3.0:
|
||||
version "0.3.0"
|
||||
resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.3.0.tgz#1bbf5ab1ba827af23575143490426455f481fe1e"
|
||||
integrity sha1-G79asbqCevI1dRQ0kEJkVfSB/h4=
|
||||
|
||||
mkdirp@0.5.1:
|
||||
version "0.5.1"
|
||||
resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.1.tgz#30057438eac6cf7f8c4767f38648d6697d75c903"
|
||||
integrity sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=
|
||||
dependencies:
|
||||
minimist "0.0.8"
|
||||
|
||||
mkdirp@~0.5.1:
|
||||
version "0.5.5"
|
||||
resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.5.tgz#d91cefd62d1436ca0f41620e251288d420099def"
|
||||
integrity sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==
|
||||
dependencies:
|
||||
minimist "^1.2.5"
|
||||
|
||||
mocha-junit-reporter@^1.17.0:
|
||||
version "1.23.3"
|
||||
resolved "https://registry.yarnpkg.com/mocha-junit-reporter/-/mocha-junit-reporter-1.23.3.tgz#941e219dd759ed732f8641e165918aa8b167c981"
|
||||
integrity sha512-ed8LqbRj1RxZfjt/oC9t12sfrWsjZ3gNnbhV1nuj9R/Jb5/P3Xb4duv2eCfCDMYH+fEu0mqca7m4wsiVjsxsvA==
|
||||
dependencies:
|
||||
debug "^2.2.0"
|
||||
md5 "^2.1.0"
|
||||
mkdirp "~0.5.1"
|
||||
strip-ansi "^4.0.0"
|
||||
xml "^1.0.0"
|
||||
|
||||
mocha-multi-reporters@^1.1.7:
|
||||
version "1.1.7"
|
||||
resolved "https://registry.yarnpkg.com/mocha-multi-reporters/-/mocha-multi-reporters-1.1.7.tgz#cc7f3f4d32f478520941d852abb64d9988587d82"
|
||||
integrity sha1-zH8/TTL0eFIJQdhSq7ZNmYhYfYI=
|
||||
dependencies:
|
||||
debug "^3.1.0"
|
||||
lodash "^4.16.4"
|
||||
|
||||
mocha@^2.3.3:
|
||||
version "2.5.3"
|
||||
resolved "https://registry.yarnpkg.com/mocha/-/mocha-2.5.3.tgz#161be5bdeb496771eb9b35745050b622b5aefc58"
|
||||
integrity sha1-FhvlvetJZ3HrmzV0UFC2IrWu/Fg=
|
||||
dependencies:
|
||||
commander "2.3.0"
|
||||
debug "2.2.0"
|
||||
diff "1.4.0"
|
||||
escape-string-regexp "1.0.2"
|
||||
glob "3.2.11"
|
||||
growl "1.9.2"
|
||||
jade "0.26.3"
|
||||
mkdirp "0.5.1"
|
||||
supports-color "1.2.0"
|
||||
to-iso-string "0.0.2"
|
||||
|
||||
mocha@^5.2.0:
|
||||
version "5.2.0"
|
||||
resolved "https://registry.yarnpkg.com/mocha/-/mocha-5.2.0.tgz#6d8ae508f59167f940f2b5b3c4a612ae50c90ae6"
|
||||
integrity sha512-2IUgKDhc3J7Uug+FxMXuqIyYzH7gJjXECKe/w43IGgQHTSj3InJi+yAA7T24L9bQMRKiUEHxEX37G5JpVUGLcQ==
|
||||
dependencies:
|
||||
browser-stdout "1.3.1"
|
||||
commander "2.15.1"
|
||||
debug "3.1.0"
|
||||
diff "3.5.0"
|
||||
escape-string-regexp "1.0.5"
|
||||
glob "7.1.2"
|
||||
growl "1.10.5"
|
||||
he "1.1.1"
|
||||
minimatch "3.0.4"
|
||||
mkdirp "0.5.1"
|
||||
supports-color "5.4.0"
|
||||
|
||||
ms@0.7.1:
|
||||
version "0.7.1"
|
||||
resolved "https://registry.yarnpkg.com/ms/-/ms-0.7.1.tgz#9cd13c03adbff25b65effde7ce864ee952017098"
|
||||
integrity sha1-nNE8A62/8ltl7/3nzoZO6VIBcJg=
|
||||
|
||||
ms@2.0.0:
|
||||
version "2.0.0"
|
||||
resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8"
|
||||
integrity sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=
|
||||
|
||||
ms@^2.1.1:
|
||||
version "2.1.2"
|
||||
resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009"
|
||||
integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==
|
||||
|
||||
once@^1.3.0:
|
||||
version "1.4.0"
|
||||
resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1"
|
||||
integrity sha1-WDsap3WWHUsROsF9nFC6753Xa9E=
|
||||
dependencies:
|
||||
wrappy "1"
|
||||
|
||||
p-limit@*, p-limit@^3.0.2:
|
||||
version "3.0.2"
|
||||
resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-3.0.2.tgz#1664e010af3cadc681baafd3e2a437be7b0fb5fe"
|
||||
integrity sha512-iwqZSOoWIW+Ew4kAGUlN16J4M7OB3ysMLSZtnhmqx7njIHFPlxWBX8xo3lVTyFVq6mI/lL9qt2IsN1sHwaxJkg==
|
||||
dependencies:
|
||||
p-try "^2.0.0"
|
||||
|
||||
p-try@^2.0.0:
|
||||
version "2.2.0"
|
||||
resolved "https://registry.yarnpkg.com/p-try/-/p-try-2.2.0.tgz#cb2868540e313d61de58fafbe35ce9004d5540e6"
|
||||
integrity sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==
|
||||
|
||||
path-is-absolute@^1.0.0:
|
||||
version "1.0.1"
|
||||
resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f"
|
||||
integrity sha1-F0uSaHNVNP+8es5r9TpanhtcX18=
|
||||
|
||||
semver@^5.4.1:
|
||||
version "5.7.1"
|
||||
resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.1.tgz#a954f931aeba508d307bbf069eff0c01c96116f7"
|
||||
integrity sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==
|
||||
|
||||
sigmund@~1.0.0:
|
||||
version "1.0.1"
|
||||
resolved "https://registry.yarnpkg.com/sigmund/-/sigmund-1.0.1.tgz#3ff21f198cad2175f9f3b781853fd94d0d19b590"
|
||||
integrity sha1-P/IfGYytIXX587eBhT/ZTQ0ZtZA=
|
||||
|
||||
source-map-support@^0.5.0:
|
||||
version "0.5.19"
|
||||
resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.19.tgz#a98b62f86dcaf4f67399648c085291ab9e8fed61"
|
||||
integrity sha512-Wonm7zOCIJzBGQdB+thsPar0kYuCIzYvxZwlBa87yi/Mdjv7Tip2cyVbLj5o0cFPN4EVkuTwb3GDDyUx2DGnGw==
|
||||
dependencies:
|
||||
buffer-from "^1.0.0"
|
||||
source-map "^0.6.0"
|
||||
|
||||
source-map@^0.6.0:
|
||||
version "0.6.1"
|
||||
resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263"
|
||||
integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==
|
||||
|
||||
strip-ansi@^4.0.0:
|
||||
version "4.0.0"
|
||||
resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-4.0.0.tgz#a8479022eb1ac368a871389b635262c505ee368f"
|
||||
integrity sha1-qEeQIusaw2iocTibY1JixQXuNo8=
|
||||
dependencies:
|
||||
ansi-regex "^3.0.0"
|
||||
|
||||
supports-color@1.2.0:
|
||||
version "1.2.0"
|
||||
resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-1.2.0.tgz#ff1ed1e61169d06b3cf2d588e188b18d8847e17e"
|
||||
integrity sha1-/x7R5hFp0Gs88tWI4YixjYhH4X4=
|
||||
|
||||
supports-color@5.4.0:
|
||||
version "5.4.0"
|
||||
resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.4.0.tgz#1c6b337402c2137605efe19f10fec390f6faab54"
|
||||
integrity sha512-zjaXglF5nnWpsq470jSv6P9DwPvgLkuapYmfDm3JWOm0vkNTVF2tI4UrN2r6jH1qM/uc/WtxYY1hYoA2dOKj5w==
|
||||
dependencies:
|
||||
has-flag "^3.0.0"
|
||||
|
||||
to-iso-string@0.0.2:
|
||||
version "0.0.2"
|
||||
resolved "https://registry.yarnpkg.com/to-iso-string/-/to-iso-string-0.0.2.tgz#4dc19e664dfccbe25bd8db508b00c6da158255d1"
|
||||
integrity sha1-TcGeZk38y+Jb2NtQiwDG2hWCVdE=
|
||||
|
||||
vscode-test@^0.4.1:
|
||||
version "0.4.3"
|
||||
resolved "https://registry.yarnpkg.com/vscode-test/-/vscode-test-0.4.3.tgz#461ebf25fc4bc93d77d982aed556658a2e2b90b8"
|
||||
integrity sha512-EkMGqBSefZH2MgW65nY05rdRSko15uvzq4VAPM5jVmwYuFQKE7eikKXNJDRxL+OITXHB6pI+a3XqqD32Y3KC5w==
|
||||
dependencies:
|
||||
http-proxy-agent "^2.1.0"
|
||||
https-proxy-agent "^2.2.1"
|
||||
|
||||
vscode@^1.1.36:
|
||||
version "1.1.37"
|
||||
resolved "https://registry.yarnpkg.com/vscode/-/vscode-1.1.37.tgz#c2a770bee4bb3fff765e2b72c7bcc813b8a6bb0a"
|
||||
integrity sha512-vJNj6IlN7IJPdMavlQa1KoFB3Ihn06q1AiN3ZFI/HfzPNzbKZWPPuiU+XkpNOfGU5k15m4r80nxNPlM7wcc0wg==
|
||||
dependencies:
|
||||
glob "^7.1.2"
|
||||
http-proxy-agent "^4.0.1"
|
||||
https-proxy-agent "^5.0.0"
|
||||
mocha "^5.2.0"
|
||||
semver "^5.4.1"
|
||||
source-map-support "^0.5.0"
|
||||
vscode-test "^0.4.1"
|
||||
|
||||
wrappy@1:
|
||||
version "1.0.2"
|
||||
resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f"
|
||||
integrity sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=
|
||||
|
||||
xml@^1.0.0:
|
||||
version "1.0.1"
|
||||
resolved "https://registry.yarnpkg.com/xml/-/xml-1.0.1.tgz#78ba72020029c5bc87b8a81a3cfcd74b4a2fc1e5"
|
||||
integrity sha1-eLpyAgApxbyHuKgaPPzXS0ovweU=
|
Reference in New Issue
Block a user