提交 f5cbb9fe 编写于 作者: J Joao Moreno

cleanup IGalleryExtension

上级 12ba6a2a
......@@ -94,8 +94,8 @@ class Main {
console.log(localize('foundExtension', "Found '{0}' in the marketplace.", id));
console.log(localize('installing', "Installing..."));
return this.extensionManagementService.install(extension).then(() => {
console.log(localize('successInstall', "Extension '{0}' v{1} was successfully installed!", id, extension.version));
return this.extensionManagementService.install(extension.manifest).then(() => {
console.log(localize('successInstall', "Extension '{0}' v{1} was successfully installed!", id, extension.manifest.version));
});
});
});
......
......@@ -44,6 +44,16 @@ export interface IExtension extends IExtensionManifest {
path?: string;
}
export interface IGalleryExtension extends IGalleryMetadata {
manifest: IExtensionManifest;
// name: galleryExtension.extensionName,
// displayName: galleryExtension.displayName || galleryExtension.extensionName,
// publisher: galleryExtension.publisher.publisherName,
// version: versions[0].version,
// engines: { vscode: void 0 }, // TODO: ugly
// description: galleryExtension.shortDescription || '',
}
export const IExtensionManagementService = createDecorator<IExtensionManagementService>('extensionManagementService');
export const IExtensionGalleryService = createDecorator<IExtensionGalleryService>('extensionGalleryService');
......@@ -54,10 +64,10 @@ export interface IQueryOptions {
}
export interface IQueryResult {
firstPage: IExtension[];
firstPage: IGalleryExtension[];
total: number;
pageSize: number;
getPage(pageNumber: number): TPromise<IExtension[]>;
getPage(pageNumber: number): TPromise<IGalleryExtension[]>;
}
export interface IExtensionGalleryService {
......@@ -76,7 +86,7 @@ export interface IExtensionManagementService {
onUninstallExtension: Event<string>;
onDidUninstallExtension: Event<string>;
install(extension: IExtension): TPromise<void>;
install(extension: IExtensionManifest): TPromise<void>;
install(zipPath: string): TPromise<void>;
uninstall(extension: IExtension): TPromise<void>;
getInstalled(includeDuplicateVersions?: boolean): TPromise<IExtension[]>;
......
......@@ -4,7 +4,7 @@
*--------------------------------------------------------------------------------------------*/
import { TPromise } from 'vs/base/common/winjs.base';
import { IExtension, IExtensionGalleryService, IGalleryVersion, IQueryOptions, IQueryResult } from 'vs/platform/extensionManagement/common/extensionManagement';
import { IGalleryExtension, IExtensionGalleryService, IGalleryVersion, IQueryOptions, IQueryResult } from 'vs/platform/extensionManagement/common/extensionManagement';
import { isUndefined } from 'vs/base/common/types';
import { assign, getOrDefault } from 'vs/base/common/objects';
import { IRequestService } from 'vs/platform/request/common/request';
......@@ -12,29 +12,29 @@ import { ITelemetryService } from 'vs/platform/telemetry/common/telemetry';
import pkg from 'vs/platform/package';
import product from 'vs/platform/product';
export interface IGalleryExtensionFile {
interface IRawGalleryExtensionFile {
assetType: string;
}
export interface IGalleryExtensionVersion {
interface IRawGalleryExtensionVersion {
version: string;
lastUpdated: string;
assetUri: string;
files: IGalleryExtensionFile[];
files: IRawGalleryExtensionFile[];
}
export interface IGalleryExtension {
interface IRawGalleryExtension {
extensionId: string;
extensionName: string;
displayName: string;
shortDescription: string;
publisher: { displayName: string, publisherId: string, publisherName: string; };
versions: IGalleryExtensionVersion[];
versions: IRawGalleryExtensionVersion[];
galleryApiUrl: string;
statistics: IGalleryExtensionStatistics[];
statistics: IRawGalleryExtensionStatistics[];
}
export interface IGalleryExtensionStatistics {
interface IRawGalleryExtensionStatistics {
statisticName: string;
value: number;
}
......@@ -152,7 +152,7 @@ class Query {
}
}
function getInstallCount(statistics: IGalleryExtensionStatistics[]): number {
function getInstallCount(statistics: IRawGalleryExtensionStatistics[]): number {
if (!statistics) {
return 0;
}
......@@ -161,7 +161,7 @@ function getInstallCount(statistics: IGalleryExtensionStatistics[]): number {
return result ? result.value : 0;
}
function toExtension(galleryExtension: IGalleryExtension, extensionsGalleryUrl: string, downloadHeaders: any): IExtension {
function toExtension(galleryExtension: IRawGalleryExtension, extensionsGalleryUrl: string, downloadHeaders: any): IGalleryExtension {
const versions = galleryExtension.versions.map<IGalleryVersion>(v => ({
version: v.version,
date: v.lastUpdated,
......@@ -172,21 +172,23 @@ function toExtension(galleryExtension: IGalleryExtension, extensionsGalleryUrl:
iconUrl: `${ v.assetUri }/Microsoft.VisualStudio.Services.Icons.Default`
}));
return {
const manifest = {
name: galleryExtension.extensionName,
displayName: galleryExtension.displayName || galleryExtension.extensionName,
publisher: galleryExtension.publisher.publisherName,
version: versions[0].version,
engines: { vscode: void 0 }, // TODO: ugly
description: galleryExtension.shortDescription || '',
galleryInformation: {
galleryApiUrl: extensionsGalleryUrl,
id: galleryExtension.extensionId,
publisherId: galleryExtension.publisher.publisherId,
publisherDisplayName: galleryExtension.publisher.displayName,
installCount: getInstallCount(galleryExtension.statistics),
versions
}
};
return {
galleryApiUrl: extensionsGalleryUrl,
id: galleryExtension.extensionId,
publisherId: galleryExtension.publisher.publisherId,
publisherDisplayName: galleryExtension.publisher.displayName,
installCount: getInstallCount(galleryExtension.statistics),
versions,
manifest
};
}
......@@ -253,7 +255,7 @@ export class ExtensionGalleryService implements IExtensionGalleryService {
});
}
private queryGallery(query: Query): TPromise<{ galleryExtensions: IGalleryExtension[], total: number; }> {
private queryGallery(query: Query): TPromise<{ galleryExtensions: IRawGalleryExtension[], total: number; }> {
const data = JSON.stringify(query.raw);
return this.getRequestHeaders()
......
......@@ -126,7 +126,7 @@ export class ExtensionManagementService implements IExtensionManagementService {
// ];
}
install(extension: IExtension): TPromise<void>;
install(extension: IExtensionManifest): TPromise<void>;
install(zipPath: string): TPromise<void>;
install(arg: any): TPromise<void> {
if (types.isString(arg)) {
......
......@@ -5,7 +5,7 @@
'use strict';
import { IExtension, IExtensionManagementService, IExtensionGalleryService } from 'vs/platform/extensionManagement/common/extensionManagement';
import { IExtension, IExtensionManifest, IExtensionManagementService, IExtensionGalleryService } from 'vs/platform/extensionManagement/common/extensionManagement';
import { TPromise } from 'vs/base/common/winjs.base';
import * as semver from 'semver';
......@@ -13,7 +13,7 @@ export function getExtensionId(extension: IExtension): string {
return `${ extension.publisher }.${ extension.name }`;
}
export function extensionEquals(one: IExtension, other: IExtension): boolean {
export function extensionEquals(one: IExtensionManifest, other: IExtensionManifest): boolean {
return one.publisher === other.publisher && one.name === other.name;
}
......@@ -39,10 +39,14 @@ export function getOutdatedExtensions(extensionsService: IExtensionManagementSer
return galleryService.query({ ids, pageSize: 1000 }).then(result => {
const available = result.firstPage;
return available.filter(extension => {
const local = installed.filter(local => extensionEquals(local, extension))[0];
return local && semver.lt(local.version, extension.version);
});
return available.map(extension => {
const local = installed.filter(local => extensionEquals(local, extension.manifest))[0];
if (local && semver.lt(local.version, extension.manifest.version)) {
return local;
} else {
return null;
}
}).filter(e => !!e);
});
});
}
\ No newline at end of file
......@@ -7,15 +7,14 @@
import { TPromise } from 'vs/base/common/winjs.base';
import { EditorInput } from 'vs/workbench/common/editor';
import { IExtension } from 'vs/platform/extensionManagement/common/extensionManagement';
import { extensionEquals } from 'vs/platform/extensionManagement/node/extensionManagementUtil';
import { IGalleryExtension } from 'vs/platform/extensionManagement/common/extensionManagement';
export class ExtensionsInput extends EditorInput {
static get ID() { return 'workbench.extensions.input2'; }
get extension(): IExtension { return this._extension; }
get extension(): IGalleryExtension { return this._extension; }
constructor(private _extension: IExtension) {
constructor(private _extension: IGalleryExtension) {
super();
}
......@@ -24,7 +23,7 @@ export class ExtensionsInput extends EditorInput {
}
getName(): string {
return this.extension.displayName;
return this.extension.manifest.displayName;
}
matches(other: any): boolean {
......@@ -33,7 +32,7 @@ export class ExtensionsInput extends EditorInput {
}
const otherExtensionInput = other as ExtensionsInput;
return extensionEquals(this.extension, otherExtensionInput.extension);
return this.extension.id === otherExtensionInput.extension.id;
}
resolve(refresh?: boolean): TPromise<any> {
......
......@@ -62,7 +62,7 @@ export class ExtensionEditor extends BaseEditor {
addClass(this.body, 'loading');
this.body.innerHTML = '';
const [version] = input.extension.galleryInformation.versions;
const [version] = input.extension.versions;
const headers = version.downloadHeaders;
const promise = super.setInput(input, options)
......
......@@ -9,10 +9,10 @@ import { append, emmet as $, addClass, removeClass } from 'vs/base/browser/dom';
import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation';
import { IDelegate } from 'vs/base/browser/ui/list/list';
import { IPagedRenderer } from 'vs/base/browser/ui/list/listPaging';
import { IExtension } from 'vs/platform/extensionManagement/common/extensionManagement';
import { IGalleryExtension } from 'vs/platform/extensionManagement/common/extensionManagement';
export interface ITemplateData {
extension: IExtension;
extension: IGalleryExtension;
element: HTMLElement;
icon: HTMLImageElement;
name: HTMLElement;
......@@ -21,23 +21,12 @@ export interface ITemplateData {
description: HTMLElement;
}
export enum ExtensionState {
Uninstalled,
Installed,
Outdated
}
export interface IExtensionEntry {
extension: IExtension;
state: ExtensionState;
}
export class Delegate implements IDelegate<IExtension> {
export class Delegate implements IDelegate<IGalleryExtension> {
getHeight() { return 62; }
getTemplateId() { return 'extension'; }
}
export class Renderer implements IPagedRenderer<IExtensionEntry, ITemplateData> {
export class Renderer implements IPagedRenderer<IGalleryExtension, ITemplateData> {
private _templates: ITemplateData[];
get templates(): ITemplateData[] { return this._templates; }
......@@ -75,18 +64,17 @@ export class Renderer implements IPagedRenderer<IExtensionEntry, ITemplateData>
data.description.textContent = '';
}
renderElement(entry: IExtensionEntry, index: number, data: ITemplateData): void {
const extension = entry.extension;
const publisher = extension.galleryInformation ? extension.galleryInformation.publisherDisplayName : extension.publisher;
const version = extension.galleryInformation.versions[0];
renderElement(extension: IGalleryExtension, index: number, data: ITemplateData): void {
const publisher = extension ? extension.publisherDisplayName : extension.manifest.publisher;
const version = extension.versions[0];
data.extension = extension;
removeClass(data.element, 'loading');
data.icon.src = version.iconUrl;
data.name.textContent = extension.displayName;
data.version.textContent = ` ${ extension.version }`;
data.name.textContent = extension.manifest.displayName;
data.version.textContent = ` ${ extension.manifest.version }`;
data.author.textContent = ` ${ publisher }`;
data.description.textContent = extension.description;
data.description.textContent = extension.manifest.description;
}
disposeTemplate(data: ITemplateData): void {
......
......@@ -13,12 +13,12 @@ import { IDisposable, dispose } from 'vs/base/common/lifecycle';
import { Builder, Dimension } from 'vs/base/browser/builder';
import { Viewlet } from 'vs/workbench/browser/viewlet';
import { append, emmet as $ } from 'vs/base/browser/dom';
import { PagedModel, mapPager } from 'vs/base/common/paging';
import { PagedModel } from 'vs/base/common/paging';
import { ITelemetryService } from 'vs/platform/telemetry/common/telemetry';
import { PagedList } from 'vs/base/browser/ui/list/listPaging';
import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation';
import { IExtensionEntry, Delegate, Renderer, ExtensionState } from './extensionsList';
import { IExtensionGalleryService } from 'vs/platform/extensionManagement/common/extensionManagement';
import { Delegate, Renderer } from './extensionsList';
import { IExtensionGalleryService, IGalleryExtension } from 'vs/platform/extensionManagement/common/extensionManagement';
import { ExtensionsInput } from '../common/extensionsInput';
import { IProgressService } from 'vs/platform/progress/common/progress';
import { IWorkbenchEditorService } from 'vs/workbench/services/editor/common/editorService';
......@@ -39,7 +39,7 @@ export class ExtensionsViewlet extends Viewlet {
private root: HTMLElement;
private searchBox: HTMLInputElement;
private extensionsBox: HTMLElement;
private list: PagedList<IExtensionEntry>;
private list: PagedList<IGalleryExtension>;
constructor(
@ITelemetryService telemetryService: ITelemetryService,
......@@ -70,13 +70,13 @@ export class ExtensionsViewlet extends Viewlet {
this.searchBox.oninput = () => this.triggerSearch(this.searchBox.value);
this.list.onSelectionChange(e => {
const [entry] = e.elements;
const [extension] = e.elements;
if (!entry) {
if (!extension) {
return;
}
return this.editorService.openEditor(new ExtensionsInput(entry.extension));
return this.editorService.openEditor(new ExtensionsInput(extension));
}, null, this.disposables);
return TPromise.as(null);
......@@ -110,7 +110,7 @@ export class ExtensionsViewlet extends Viewlet {
private doSearch(text: string = ''): TPromise<any> {
return this.galleryService.query({ text })
.then(result => new PagedModel(mapPager(result, extension => ({ extension, state: ExtensionState.Installed }))))
.then(result => new PagedModel(result))
.then(model => this.list.model = model);
}
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册