未验证 提交 56d1a02b 编写于 作者: M Martin Aeschlimann 提交者: GitHub

Merge pull request #72763 from jk21/package-json-info

Package json info
......@@ -9,6 +9,7 @@ import { XHRRequest } from 'request-light';
import { Location } from 'jsonc-parser';
import { textToMarkedString } from './markedTextUtil';
import * as cp from 'child_process';
import * as nls from 'vscode-nls';
const localize = nls.loadMessageBundle();
......@@ -229,38 +230,29 @@ export class PackageJSONContribution implements IJSONContribution {
if ((location.matches(['dependencies', '*']) || location.matches(['devDependencies', '*']) || location.matches(['optionalDependencies', '*']) || location.matches(['peerDependencies', '*']))) {
const currentKey = location.path[location.path.length - 1];
if (typeof currentKey === 'string') {
const queryUrl = 'https://registry.npmjs.org/' + encodeURIComponent(currentKey).replace(/%40/g, '@');
return this.xhr({
url: queryUrl,
agent: USER_AGENT
}).then((success) => {
try {
const obj = JSON.parse(success.responseText);
const latest = obj && obj['dist-tags'] && obj['dist-tags']['latest'];
if (latest) {
let name = JSON.stringify(latest);
let proposal = new CompletionItem(name);
proposal.kind = CompletionItemKind.Property;
proposal.insertText = name;
proposal.documentation = localize('json.npm.latestversion', 'The currently latest version of the package');
result.add(proposal);
return this.npmView(currentKey).then(info => {
const latest = info.distTagsLatest;
if (latest) {
let name = JSON.stringify(latest);
let proposal = new CompletionItem(name);
proposal.kind = CompletionItemKind.Property;
proposal.insertText = name;
proposal.documentation = localize('json.npm.latestversion', 'The currently latest version of the package');
result.add(proposal);
name = JSON.stringify('^' + latest);
proposal = new CompletionItem(name);
proposal.kind = CompletionItemKind.Property;
proposal.insertText = name;
proposal.documentation = localize('json.npm.majorversion', 'Matches the most recent major version (1.x.x)');
result.add(proposal);
name = JSON.stringify('^' + latest);
proposal = new CompletionItem(name);
proposal.kind = CompletionItemKind.Property;
proposal.insertText = name;
proposal.documentation = localize('json.npm.majorversion', 'Matches the most recent major version (1.x.x)');
result.add(proposal);
name = JSON.stringify('~' + latest);
proposal = new CompletionItem(name);
proposal.kind = CompletionItemKind.Property;
proposal.insertText = name;
proposal.documentation = localize('json.npm.minorversion', 'Matches the most recent minor version (1.2.x)');
result.add(proposal);
}
} catch (e) {
// ignore
name = JSON.stringify('~' + latest);
proposal = new CompletionItem(name);
proposal.kind = CompletionItemKind.Property;
proposal.insertText = name;
proposal.documentation = localize('json.npm.minorversion', 'Matches the most recent minor version (1.2.x)');
result.add(proposal);
}
return 0;
}, () => {
......@@ -288,37 +280,34 @@ export class PackageJSONContribution implements IJSONContribution {
}
private getInfo(pack: string): Thenable<string[]> {
const queryUrl = 'https://registry.npmjs.org/' + encodeURIComponent(pack).replace(/%40/g, '@');
return this.xhr({
url: queryUrl,
agent: USER_AGENT
}).then((success) => {
try {
const obj = JSON.parse(success.responseText);
if (obj) {
const result: string[] = [];
if (obj.description) {
result.push(obj.description);
}
const latest = obj && obj['dist-tags'] && obj['dist-tags']['latest'];
if (latest) {
result.push(localize('json.npm.version.hover', 'Latest version: {0}', latest));
}
if (obj.homepage) {
result.push(obj.homepage);
}
return result;
}
} catch (e) {
// ignore
}
return [];
return this.npmView(pack).then(info => {
const result: string[] = [];
result.push(info.description || '');
result.push(info.distTagsLatest ? localize('json.npm.version.hover', 'Latest version: {0}', info.distTagsLatest) : '');
result.push(info.homepage || '');
return result;
}, () => {
return [];
});
}
private npmView(pack: string): Promise<PackageInfo> {
return new Promise((resolve, reject) => {
const command = 'npm view --json ' + pack + ' description dist-tags.latest homepage';
cp.exec(command, (error, stdout) => {
if (error) {
return reject();
}
const content = JSON.parse(stdout);
resolve({
description: content['description'],
distTagsLatest: content['dist-tags.latest'],
homepage: content['homepage']
});
});
});
}
public getInfoContribution(_fileName: string, location: Location): Thenable<MarkedString[] | null> | null {
if ((location.matches(['dependencies', '*']) || location.matches(['devDependencies', '*']) || location.matches(['optionalDependencies', '*']) || location.matches(['peerDependencies', '*']))) {
const pack = location.path[location.path.length - 1];
......@@ -334,3 +323,9 @@ export class PackageJSONContribution implements IJSONContribution {
return null;
}
}
interface PackageInfo {
description: string;
distTagsLatest?: string;
homepage?: string;
}
\ No newline at end of file
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册