From 4599369c2925a73dbe93c6acef050697e26c63f7 Mon Sep 17 00:00:00 2001 From: Joao Moreno Date: Thu, 14 Apr 2016 11:10:06 +0200 Subject: [PATCH] limit keywords fixes #84 --- src/package.ts | 44 +++++++++++++++++++++++++++++--------------- 1 file changed, 29 insertions(+), 15 deletions(-) diff --git a/src/package.ts b/src/package.ts index 7b9f2d9..b4791ae 100644 --- a/src/package.ts +++ b/src/package.ts @@ -64,7 +64,7 @@ export interface IPackageOptions { export interface IProcessor { onFile(file: IFile): Promise; - onEnd(): void; + onEnd(): Promise; assets: IAsset[]; vsix: any; } @@ -74,7 +74,7 @@ export abstract class BaseProcessor implements IProcessor { public assets: IAsset[] = []; public vsix: any = Object.create(null); abstract onFile(file: IFile): Promise; - onEnd() {} + onEnd() { return Promise.resolve(null); } } function getUrl(url: string | { url?: string; }): string { @@ -106,7 +106,7 @@ class MainProcessor extends BaseProcessor { version: manifest.version, publisher: manifest.publisher, description: manifest.description || '', - tags: (manifest.keywords || []).join(','), + tags: (manifest.keywords || []).slice(0, 5).join(','), categories: (manifest.categories || []).join(','), flags: flags.join(' '), links: { @@ -121,6 +121,18 @@ class MainProcessor extends BaseProcessor { onFile(file: IFile): Promise { return Promise.resolve(file); } + + onEnd(): Promise { + const keywords = this.manifest.keywords || []; + + if (keywords.length > 5) { + console.warn(`The keyword list is limited to 5 keywords; only the following keywords will be in your extension: [${ keywords.slice(0, 5).join(', ') }].`); + return util.read('Do you want to continue? [y/N] ') + .then(answer => /^y$/i.test(answer) ? Promise.resolve(null) : Promise.reject('Aborted')); + } + + return Promise.resolve(null); + } } export class ReadmeProcessor extends BaseProcessor { @@ -259,10 +271,12 @@ class IconProcessor extends BaseProcessor { return Promise.resolve(file); } - onEnd(): void { + onEnd(): Promise { if (this.icon && !this.didFindIcon) { - throw new Error(`The specified icon '${ this.icon }' wasn't found in the extension.`); + return Promise.reject(new Error(`The specified icon '${ this.icon }' wasn't found in the extension.`)); } + + return Promise.resolve(null); } } @@ -370,17 +384,17 @@ export function processFiles(processors: IProcessor[], files: IFile[], options: const processedFiles = files.map(file => util.chain(file, processors, (file, processor) => processor.onFile(file))); return Promise.all(processedFiles).then(files => { - processors.forEach(p => p.onEnd()); + return Promise.all(processors.map(p => p.onEnd())).then(() => { + const assets = _.flatten(processors.map(p => p.assets)); + const vsix = ( _.assign)({ assets }, ...processors.map(p => p.vsix)); - const assets = _.flatten(processors.map(p => p.assets)); - const vsix = ( _.assign)({ assets }, ...processors.map(p => p.vsix)); - - return Promise.all([toVsixManifest(assets, vsix, options), toContentTypes(files)]).then(result => { - return [ - { path: 'extension.vsixmanifest', contents: new Buffer(result[0], 'utf8') }, - { path: '[Content_Types].xml', contents: new Buffer(result[1], 'utf8') }, - ...files - ]; + return Promise.all([toVsixManifest(assets, vsix, options), toContentTypes(files)]).then(result => { + return [ + { path: 'extension.vsixmanifest', contents: new Buffer(result[0], 'utf8') }, + { path: '[Content_Types].xml', contents: new Buffer(result[1], 'utf8') }, + ...files + ]; + }); }); }); }