提交 1a02125a 编写于 作者: D David Munoz
......@@ -3,7 +3,7 @@
"version": "0.0.1",
"description": "Dependencies shared by all extensions",
"dependencies": {
"typescript": "3.5.0-dev.20190515"
"typescript": "3.5.0-dev.20190517"
},
"scripts": {
"postinstall": "node ./postinstall"
......
......@@ -17,13 +17,15 @@
],
"dependencies": {
"jsonc-parser": "^2.0.1",
"rimraf": "^2.6.3",
"semver": "5.5.1",
"vscode-extension-telemetry": "0.1.1",
"vscode-nls": "^4.0.0"
},
"devDependencies": {
"@types/node": "8.0.33",
"@types/node": "^12.0.2",
"@types/semver": "^5.5.0",
"@types/rimraf": "2.0.2",
"vscode": "^1.1.10"
},
"scripts": {
......@@ -750,4 +752,4 @@
}
]
}
}
\ No newline at end of file
}
......@@ -10,6 +10,8 @@ import { LanguageConfigurationManager } from './features/languageConfiguration';
import TypeScriptTaskProviderManager from './features/task';
import TypeScriptServiceClientHost from './typeScriptServiceClientHost';
import { flatten } from './utils/arrays';
import * as electron from './utils/electron';
import * as rimraf from 'rimraf';
import { CommandManager } from './utils/commandManager';
import * as fileSchemes from './utils/fileSchemes';
import { standardLanguageDescriptions } from './utils/languageDescription';
......@@ -128,4 +130,8 @@ function isSupportedDocument(
return false;
}
return fileSchemes.isSupportedScheme(document.uri.scheme);
}
export function deactivate() {
rimraf.sync(electron.getInstanceDir());
}
\ No newline at end of file
......@@ -27,7 +27,7 @@ class SmartSelection implements vscode.SelectionRangeProvider {
return undefined;
}
const args: Proto.FileRequestArgs & { locations: Proto.Location[] } = {
const args: Proto.SelectionRangeRequestArgs = {
file,
locations: positions.map(typeConverters.Position.toLocation)
};
......
......@@ -254,7 +254,7 @@ export class TypeScriptServer extends Disposable {
private readonly _tracer: Tracer,
) {
super();
this._reader = this._register(new Reader<Proto.Response>(this._childProcess.stdout));
this._reader = this._register(new Reader<Proto.Response>(this._childProcess.stdout!));
this._reader.onData(msg => this.dispatchMessage(msg));
this._childProcess.on('exit', code => this.handleExit(code));
this._childProcess.on('error', error => this.handleError(error));
......@@ -274,7 +274,7 @@ export class TypeScriptServer extends Disposable {
public get tsServerLogFile() { return this._tsServerLogFile; }
public write(serverRequest: Proto.Request) {
this._childProcess.stdin.write(JSON.stringify(serverRequest) + '\r\n', 'utf8');
this._childProcess.stdin!.write(JSON.stringify(serverRequest) + '\r\n', 'utf8');
}
public dispose() {
......
......@@ -11,17 +11,6 @@ import { TypeScriptServiceConfiguration } from './utils/configuration';
import Logger from './utils/logger';
import { PluginManager } from './utils/plugins';
declare module './protocol' {
interface SelectionRange {
textSpan: Proto.TextSpan;
parent?: SelectionRange;
}
interface SelectionRangeResponse extends Proto.Response {
body?: ReadonlyArray<SelectionRange>;
}
}
export namespace ServerResponse {
export class Cancelled {
......@@ -65,7 +54,7 @@ export interface TypeScriptRequestTypes {
'quickinfo': [Proto.FileLocationRequestArgs, Proto.QuickInfoResponse];
'references': [Proto.FileLocationRequestArgs, Proto.ReferencesResponse];
'rename': [Proto.RenameRequestArgs, Proto.RenameResponse];
'selectionRange': [Proto.FileRequestArgs & { locations: Proto.Location[] }, Proto.SelectionRangeResponse];
'selectionRange': [Proto.SelectionRangeRequestArgs, Proto.SelectionRangeResponse];
'signatureHelp': [Proto.SignatureHelpRequestArgs, Proto.SignatureHelpResponse];
'typeDefinition': [Proto.FileLocationRequestArgs, Proto.TypeDefinitionResponse];
}
......
......@@ -5,4 +5,3 @@
/// <reference path='../../../../src/vs/vscode.d.ts'/>
/// <reference path='../../../../src/vs/vscode.proposed.d.ts'/>
/// <reference types='@types/node'/>
......@@ -22,8 +22,21 @@ const getRootTempDir = (() => {
};
})();
export const getInstanceDir = (() => {
let dir: string | undefined;
return () => {
if (!dir) {
dir = path.join(getRootTempDir(), temp.makeRandomHexString(20));
}
if (!fs.existsSync(dir)) {
fs.mkdirSync(dir);
}
return dir;
};
})();
export function getTempFile(prefix: string): string {
return path.join(getRootTempDir(), `${prefix}-${temp.makeRandomHexString(20)}.tmp`);
return path.join(getInstanceDir(), `${prefix}-${temp.makeRandomHexString(20)}.tmp`);
}
function generatePatchedEnv(env: any, modulePath: string): any {
......
......@@ -2,10 +2,37 @@
# yarn lockfile v1
"@types/node@8.0.33":
version "8.0.33"
resolved "https://registry.yarnpkg.com/@types/node/-/node-8.0.33.tgz#1126e94374014e54478092830704f6ea89df04cd"
integrity sha512-vmCdO8Bm1ExT+FWfC9sd9r4jwqM7o97gGy2WBshkkXbf/2nLAJQUrZfIhw27yVOtLUev6kSZc4cav/46KbDd8A==
"@types/events@*":
version "3.0.0"
resolved "https://registry.yarnpkg.com/@types/events/-/events-3.0.0.tgz#2862f3f58a9a7f7c3e78d79f130dd4d71c25c2a7"
integrity sha512-EaObqwIvayI5a8dCzhFrjKzVwKLxjoG9T6Ppd5CEo07LRKfQ8Yokw54r5+Wq7FaBQ+yXRvQAYPrHwya1/UFt9g==
"@types/glob@*":
version "7.1.1"
resolved "https://registry.yarnpkg.com/@types/glob/-/glob-7.1.1.tgz#aa59a1c6e3fbc421e07ccd31a944c30eba521575"
integrity sha512-1Bh06cbWJUHMC97acuD6UMG29nMt0Aqz1vF3guLfG+kHHJhy3AyohZFFxYk2f7Q1SQIrNwvncxAE0N/9s70F2w==
dependencies:
"@types/events" "*"
"@types/minimatch" "*"
"@types/node" "*"
"@types/minimatch@*":
version "3.0.3"
resolved "https://registry.yarnpkg.com/@types/minimatch/-/minimatch-3.0.3.tgz#3dca0e3f33b200fc7d1139c0cd96c1268cadfd9d"
integrity sha512-tHq6qdbT9U1IRSGf14CL0pUlULksvY9OZ+5eEgl1N7t+OA3tGvNpxJCzuKQlsNgCVwbAs670L1vcVQi8j9HjnA==
"@types/node@*", "@types/node@^12.0.2":
version "12.0.2"
resolved "https://registry.yarnpkg.com/@types/node/-/node-12.0.2.tgz#3452a24edf9fea138b48fad4a0a028a683da1e40"
integrity sha512-5tabW/i+9mhrfEOUcLDu2xBPsHJ+X5Orqy9FKpale3SjDA17j5AEpYq5vfy3oAeAHGcvANRCO3NV3d2D6q3NiA==
"@types/rimraf@2.0.2":
version "2.0.2"
resolved "https://registry.yarnpkg.com/@types/rimraf/-/rimraf-2.0.2.tgz#7f0fc3cf0ff0ad2a99bb723ae1764f30acaf8b6e"
integrity sha512-Hm/bnWq0TCy7jmjeN5bKYij9vw5GrDFWME4IuxV08278NtU/VdGbzsBohcCUJ7+QMqmUq5hpRKB39HeQWJjztQ==
dependencies:
"@types/glob" "*"
"@types/node" "*"
"@types/semver@^5.5.0":
version "5.5.0"
......@@ -630,6 +657,18 @@ glob@^5.0.3:
once "^1.3.0"
path-is-absolute "^1.0.0"
glob@^7.1.3:
version "7.1.4"
resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.4.tgz#aa608a2f6c577ad357e1ae5a5c26d9a8d1969255"
integrity sha512-hkLPepehmnKk41pUGm3sYxoFs/umurYfYJCerbXEyFIWcAzvpipAgVkBqqT9RBKMGjnq6kMuyYwha6csxbiM1A==
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"
glogg@^1.0.0:
version "1.0.1"
resolved "https://registry.yarnpkg.com/glogg/-/glogg-1.0.1.tgz#dcf758e44789cc3f3d32c1f3562a3676e6a34810"
......@@ -1490,6 +1529,13 @@ rimraf@2:
dependencies:
glob "^7.0.5"
rimraf@^2.6.3:
version "2.6.3"
resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.6.3.tgz#b2d104fe0d8fb27cf9e0a1cda8262dd3833c6cab"
integrity sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA==
dependencies:
glob "^7.1.3"
safe-buffer@^5.0.1, safe-buffer@^5.1.1, safe-buffer@~5.1.0, safe-buffer@~5.1.1:
version "5.1.2"
resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d"
......
......@@ -2,7 +2,7 @@
# yarn lockfile v1
typescript@3.5.0-dev.20190515:
version "3.5.0-dev.20190515"
resolved "https://registry.yarnpkg.com/typescript/-/typescript-3.5.0-dev.20190515.tgz#e34d9f4ae5352ecbb7bbc2f67db6cef3d5f7d58e"
integrity sha512-pE5yxFLdt5gT8PEX1Ra7vWU6HCdo4039be182oeWk8PTBWCWqr/XxlTjRxWfYgycNrI1vMjOux+n2y0aFJ9eUg==
typescript@3.5.0-dev.20190517:
version "3.5.0-dev.20190517"
resolved "https://registry.yarnpkg.com/typescript/-/typescript-3.5.0-dev.20190517.tgz#5a85f1091cf33fde39b04f898c5730e30edd3e39"
integrity sha512-KoBHq6ytEApXKTDtmTu4Sp/tC5SPe4FpvwutLEANhwdMPblqZdh7APuH7I/ceMlgfHSa7B00JgF7NokUJQi0/g==
......@@ -127,7 +127,7 @@
"sinon": "^1.17.2",
"source-map": "^0.4.4",
"ts-loader": "^4.4.2",
"tslint": "^5.11.0",
"tslint": "^5.16.0",
"typescript": "3.4.5",
"typescript-formatter": "7.1.0",
"typescript-tslint-plugin": "^0.0.7",
......@@ -155,4 +155,4 @@
"windows-mutex": "0.2.1",
"windows-process-tree": "0.2.3"
}
}
\ No newline at end of file
}
......@@ -112,6 +112,10 @@ export class Main {
private async installExtensions(extensions: string[], force: boolean): Promise<void> {
const failed: string[] = [];
const installedExtensionsManifests: IExtensionManifest[] = [];
if (extensions.length) {
console.log(localize('installingExtensions', "Installing extensions..."));
}
for (const extension of extensions) {
try {
const manifest = await this.installExtension(extension, force);
......@@ -142,11 +146,11 @@ export class Main {
if (valid) {
return this.extensionManagementService.install(URI.file(extension)).then(id => {
console.log(localize('successVsixInstall', "Extension '{0}' was successfully installed!", getBaseLabel(extension)));
console.log(localize('successVsixInstall', "Extension '{0}' was successfully installed.", getBaseLabel(extension)));
return manifest;
}, error => {
if (isPromiseCanceledError(error)) {
console.log(localize('cancelVsixInstall', "Cancelled installing Extension '{0}'.", getBaseLabel(extension)));
console.log(localize('cancelVsixInstall', "Cancelled installing extension '{0}'.", getBaseLabel(extension)));
return null;
} else {
return Promise.reject(error);
......@@ -191,9 +195,7 @@ export class Main {
console.log(localize('forceUpdate', "Extension '{0}' v{1} is already installed, but a newer version {2} is available in the marketplace. Use '--force' option to update to newer version.", id, installedExtension.manifest.version, extension.version));
return Promise.resolve(null);
}
console.log(localize('updateMessage', "Updating the Extension '{0}' to the version {1}", id, extension.version));
} else {
console.log(localize('foundExtension', "Found '{0}' in the marketplace.", id));
console.log(localize('updateMessage', "Updating the extension '{0}' to the version {1}", id, extension.version));
}
await this.installFromGallery(id, extension);
return manifest;
......@@ -210,7 +212,7 @@ export class Main {
const newer = installedExtensions.filter(local => areSameExtensions(extensionIdentifier, local.identifier) && semver.gt(local.manifest.version, manifest.version))[0];
if (newer && !force) {
console.log(localize('forceDowngrade', "A newer version of this extension '{0}' v{1} is already installed. Use '--force' option to downgrade to older version.", newer.identifier.id, newer.manifest.version, manifest.version));
console.log(localize('forceDowngrade', "A newer version of extension '{0}' v{1} is already installed. Use '--force' option to downgrade to older version.", newer.identifier.id, newer.manifest.version, manifest.version));
return false;
}
......@@ -218,14 +220,14 @@ export class Main {
}
private async installFromGallery(id: string, extension: IGalleryExtension): Promise<void> {
console.log(localize('installing', "Installing..."));
console.log(localize('installing', "Installing extension '{0}' v{1}...", id, extension.version));
try {
await this.extensionManagementService.installFromGallery(extension);
console.log(localize('successInstall', "Extension '{0}' v{1} was successfully installed!", id, extension.version));
console.log(localize('successInstall', "Extension '{0}' v{1} was successfully installed.", id, extension.version));
} catch (error) {
if (isPromiseCanceledError(error)) {
console.log(localize('cancelVsixInstall', "Cancelled installing Extension '{0}'.", id));
console.log(localize('cancelVsixInstall', "Cancelled installing extension '{0}'.", id));
} else {
throw error;
}
......
......@@ -34,8 +34,8 @@ export class CodeActionSet {
public readonly actions: readonly CodeAction[];
public constructor(actions: CodeAction[]) {
this.actions = mergeSort(actions, CodeActionSet.codeActionsComparator);
public constructor(actions: readonly CodeAction[]) {
this.actions = mergeSort([...actions], CodeActionSet.codeActionsComparator);
}
public get hasAutoFix() {
......
......@@ -176,6 +176,7 @@ function showCodeActionsForEditorSelection(
return;
}
MessageController.get(editor).closeMessage();
const pos = editor.getPosition();
controller.triggerFromEditorSelection(filter, autoApply).then(codeActions => {
if (!codeActions || !codeActions.actions.length) {
......
......@@ -35,7 +35,7 @@ export class MessageController extends Disposable implements editorCommon.IEdito
private readonly _editor: ICodeEditor;
private readonly _visible: IContextKey<boolean>;
private _messageWidget: MessageWidget;
private _messageWidget?: MessageWidget;
private _messageListeners: IDisposable[] = [];
constructor(
......@@ -96,7 +96,9 @@ export class MessageController extends Disposable implements editorCommon.IEdito
closeMessage(): void {
this._visible.reset();
this._messageListeners = dispose(this._messageListeners);
this._messageListeners.push(MessageWidget.fadeOut(this._messageWidget));
if (this._messageWidget) {
this._messageListeners.push(MessageWidget.fadeOut(this._messageWidget));
}
}
private _onDidAttemptReadOnlyEdit(): void {
......
......@@ -27,7 +27,8 @@ export class RemoteAuthorityResolverError extends Error {
return true;
}
}
return false;
return this.isTemporarilyNotAvailable(err);
}
public static isTemporarilyNotAvailable(err: any): boolean {
......
......@@ -40,8 +40,10 @@ export class RemoteAuthorityResolverService implements IRemoteAuthorityResolverS
}
clearResolvedAuthority(authority: string): void {
this._resolveAuthorityRequests[authority].reject(errors.canceled());
delete this._resolveAuthorityRequests[authority];
if (this._resolveAuthorityRequests[authority]) {
this._resolveAuthorityRequests[authority].reject(errors.canceled());
delete this._resolveAuthorityRequests[authority];
}
}
setResolvedAuthority(resolvedAuthority: ResolvedAuthority) {
......
......@@ -16,6 +16,24 @@
declare module 'vscode' {
//#region Joh - ExecutionContext
export enum ExtensionExecutionContext {
Local = 1,
Remote = 2
}
export interface ExtensionContext {
/**
* Describes the context in which this extension is executed, e.g.
* a Node.js-context on the same machine or on a remote machine
*/
executionContext: ExtensionExecutionContext;
}
//#endregion
//#region Joh - call hierarchy
export enum CallHierarchyDirection {
......
......@@ -25,6 +25,7 @@ export interface IExtensionContext {
globalStoragePath: string;
asAbsolutePath(relativePath: string): string;
readonly logPath: string;
executionContext: number;
}
/**
......
......@@ -2306,3 +2306,8 @@ export class QuickInputButtons {
private constructor() { }
}
export enum ExtensionExecutionContext {
Local = 1,
Remote = 2
}
......@@ -790,6 +790,7 @@ export function createApiFactory(
DocumentSymbol: extHostTypes.DocumentSymbol,
EndOfLine: extHostTypes.EndOfLine,
EventEmitter: Emitter,
ExtensionExecutionContext: extHostTypes.ExtensionExecutionContext,
CustomExecution: extHostTypes.CustomExecution,
FileChangeType: extHostTypes.FileChangeType,
FileSystemError: extHostTypes.FileSystemError,
......
......@@ -33,7 +33,7 @@ import { VSBuffer } from 'vs/base/common/buffer';
import { ISchemeTransformer } from 'vs/workbench/api/common/extHostLanguageFeatures';
import { ExtensionMemento } from 'vs/workbench/api/common/extHostMemento';
import { ExtensionStoragePaths } from 'vs/workbench/api/node/extHostStoragePaths';
import { RemoteAuthorityResolverError } from 'vs/workbench/api/common/extHostTypes';
import { RemoteAuthorityResolverError, ExtensionExecutionContext } from 'vs/workbench/api/common/extHostTypes';
interface ITestRunner {
run(testsRoot: string, clb: (error: Error, failures?: number) => void): void;
......@@ -362,7 +362,8 @@ export class ExtHostExtensionService implements ExtHostExtensionServiceShape {
storagePath: this._storagePath.workspaceValue(extensionDescription),
globalStoragePath: this._storagePath.globalValue(extensionDescription),
asAbsolutePath: (relativePath: string) => { return path.join(extensionDescription.extensionLocation.fsPath, relativePath); },
logPath: that._extHostLogService.getLogDirectory(extensionDescription.identifier)
logPath: that._extHostLogService.getLogDirectory(extensionDescription.identifier),
executionContext: this._initData.remoteAuthority ? ExtensionExecutionContext.Remote : ExtensionExecutionContext.Local
});
});
}
......@@ -610,7 +611,7 @@ export class ExtHostExtensionService implements ExtHostExtensionServiceShape {
const resolver = this._resolvers[authorityPrefix];
if (!resolver) {
throw new Error(`No resolver available for ${authorityPrefix}`);
throw new Error(`No remote extension installed to resolve ${authorityPrefix}.`);
}
try {
......
......@@ -513,12 +513,8 @@ class InlineImageView {
firstZoom();
}
let delta = e.deltaY < 0 ? 1 : -1;
let delta = e.deltaY > 0 ? 1 : -1;
// Pinching should increase the scale
if (e.ctrlKey && !isScrollWheelKeyPressed) {
delta *= -1;
}
updateScale(scale as number * (1 - delta * InlineImageView.SCALE_PINCH_FACTOR));
}));
......
......@@ -683,10 +683,6 @@ export class SearchView extends ViewletPanel {
}
private onContextMenu(e: ITreeContextMenuEvent<RenderableMatch | null>): void {
if (!e.element) {
return;
}
if (!this.contextMenu) {
this.contextMenu = this._register(this.menuService.createMenu(MenuId.SearchContext, this.contextKeyService));
}
......@@ -1327,8 +1323,6 @@ export class SearchView extends ViewletPanel {
// Indicate as status to ARIA
aria.status(message);
dom.hide(this.resultsElement);
const messageEl = this.clearMessage();
const p = dom.append(messageEl, $('p', undefined, message));
......@@ -1363,6 +1357,7 @@ export class SearchView extends ViewletPanel {
if (this.contextService.getWorkbenchState() === WorkbenchState.EMPTY) {
this.showSearchWithoutFolderMessage();
}
this.reLayout();
} else {
this.viewModel.searchResult.toggleHighlights(this.isVisible()); // show highlights
......
......@@ -828,7 +828,7 @@ azure-storage@^2.10.2:
xml2js "0.2.8"
xmlbuilder "^9.0.7"
babel-code-frame@^6.16.0, babel-code-frame@^6.22.0:
babel-code-frame@^6.16.0:
version "6.26.0"
resolved "https://registry.yarnpkg.com/babel-code-frame/-/babel-code-frame-6.26.0.tgz#63fd43f7dc1e3bb7ce35947db8fe369a3f58c74b"
integrity sha1-Y/1D99weO7fONZR9uP42mj9Yx0s=
......@@ -5062,7 +5062,7 @@ js-yaml@3.6.1:
argparse "^1.0.7"
esprima "^2.6.0"
js-yaml@3.x, js-yaml@^3.5.1, js-yaml@^3.7.0:
js-yaml@3.x, js-yaml@^3.5.1:
version "3.10.0"
resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.10.0.tgz#2e78441646bd4682e963f22b6e92823c309c62dc"
integrity sha512-O2v52ffjLa9VeM43J4XocZE//WT9N0IiwDa3KSHH7Tu8CtH+1qM8SIZvnsTh6v+4yFy5KUY3BHUVwjpfAWsjIA==
......@@ -5078,6 +5078,14 @@ js-yaml@^3.12.0:
argparse "^1.0.7"
esprima "^4.0.0"
js-yaml@^3.13.0:
version "3.13.1"
resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.13.1.tgz#aff151b30bfdfa8e49e05da22e7415e9dfa37847"
integrity sha512-YfbcO7jXDdyj0DGxYVSlSeQNHbD7XPWvrVWeVUujrQEoZzWJIRrCPoyk6kL6IAjAG2IolMK4T0hNUe0HOUs5Jw==
dependencies:
argparse "^1.0.7"
esprima "^4.0.0"
js-yaml@~3.7.0:
version "3.7.0"
resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.7.0.tgz#5c967ddd837a9bfdca5f2de84253abe8a1c03b80"
......@@ -8954,25 +8962,26 @@ tslib@^1.8.1, tslib@^1.9.0:
resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.9.3.tgz#d7e4dd79245d85428c4d7e4822a79917954ca286"
integrity sha512-4krF8scpejhaOgqzBEcGM7yDIEfi0/8+8zDRZhNZZ2kjmHJ4hv3zCbQWxoJGz1iw5U0Jl0nma13xzHXcncMavQ==
tslint@^5.11.0:
version "5.11.0"
resolved "https://registry.yarnpkg.com/tslint/-/tslint-5.11.0.tgz#98f30c02eae3cde7006201e4c33cb08b48581eed"
integrity sha1-mPMMAurjzecAYgHkwzywi0hYHu0=
tslint@^5.16.0:
version "5.16.0"
resolved "https://registry.yarnpkg.com/tslint/-/tslint-5.16.0.tgz#ae61f9c5a98d295b9a4f4553b1b1e831c1984d67"
integrity sha512-UxG2yNxJ5pgGwmMzPMYh/CCnCnh0HfPgtlVRDs1ykZklufFBL1ZoTlWFRz2NQjcoEiDoRp+JyT0lhBbbH/obyA==
dependencies:
babel-code-frame "^6.22.0"
"@babel/code-frame" "^7.0.0"
builtin-modules "^1.1.1"
chalk "^2.3.0"
commander "^2.12.1"
diff "^3.2.0"
glob "^7.1.1"
js-yaml "^3.7.0"
js-yaml "^3.13.0"
minimatch "^3.0.4"
mkdirp "^0.5.1"
resolve "^1.3.2"
semver "^5.3.0"
tslib "^1.8.0"
tsutils "^2.27.2"
tsutils "^2.29.0"
tsutils@^2.27.2:
tsutils@^2.29.0:
version "2.29.0"
resolved "https://registry.yarnpkg.com/tsutils/-/tsutils-2.29.0.tgz#32b488501467acbedd4b85498673a0812aca0b99"
integrity sha512-g5JVHCIJwzfISaXpXE1qvNalca5Jwob6FjI4AoPlqMusJ6ftFE7IkkFoMhVLRgK+4Kx3gkzb8UZK5t5yTTvEmA==
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册