diff --git a/src/main.ts b/src/main.ts index cea5a9c..bd2c7a0 100644 --- a/src/main.ts +++ b/src/main.ts @@ -14,6 +14,7 @@ Commands: unpublish [ ] Unpublishes an extension list Lists all extensions published by the given publisher publisher create Creates a new publisher + publisher delete Deletes a publisher publisher add Add a publisher publisher rm Remove a publisher publisher list List all added publishers diff --git a/src/publish.ts b/src/publish.ts index 2caccac..5a64a80 100644 --- a/src/publish.ts +++ b/src/publish.ts @@ -71,7 +71,7 @@ export function unpublish(publisher?: string, name?: string, cwd = process.cwd() return details.then(({ publisher, name }) => { const fullName = `${ publisher }.${ name }`; - return read(`This will FOREVER delete ${ fullName }! Are you sure? [y/N] `) + return read(`This will FOREVER delete '${ fullName }'! Are you sure? [y/N] `) .then(answer => /^y$/i.test(answer) ? null : reject('Aborted')) .then(() => getPublisher(publisher)) .then(p => p.pat) diff --git a/src/store.ts b/src/store.ts index 59b9aca..674f475 100644 --- a/src/store.ts +++ b/src/store.ts @@ -1,9 +1,9 @@ import * as fs from 'fs'; import * as path from 'path'; import { exec } from 'child_process'; -import { Promise, nfcall, resolve, reject } from 'q'; +import { Promise, nfcall, resolve, reject, ninvoke } from 'q'; import { home } from 'osenv'; -import { read, getGalleryAPI } from './util'; +import { read, getGalleryAPI, getRawGalleryAPI } from './util'; import { validatePublisher } from './validation'; const storePath = path.join(home(), '.vsce'); @@ -55,6 +55,11 @@ function addPublisherToStore(store: IStore, publisher: IPublisher): Promise publisher); } +function removePublisherFromStore(store: IStore, publisherName: string): Promise { + store.publishers = store.publishers.filter(p => p.name !== publisherName); + return save(store); +} + function requestPAT(store: IStore, publisherName: string): Promise { return read(`Personal Access Token for publisher '${ publisherName }':`, { silent: true, replace: '*' }) .then(pat => { @@ -105,8 +110,7 @@ function rmPublisher(publisherName: string): Promise { return reject(`Unknown publisher '${ publisherName }'`); } - store.publishers = store.publishers.filter(p => p.name !== publisherName); - return save(store); + return removePublisherFromStore(store, publisherName); }); } @@ -130,6 +134,17 @@ function createPublisher(publisherName: string): Promise { .then(() => ({ name: publisherName, pat })); }) .then(publisher => load().then(store => addPublisherToStore(store, publisher))); + }) + .then(() => console.log(`Successfully created publisher '${ publisherName }'.`)); +} + +function deletePublisher(publisherName: string): Promise { + return getPublisher(publisherName).then(({ pat }) => { + return read(`This will FOREVER delete '${ publisherName }'! Are you sure? [y/N] `) + .then(answer => /^y$/i.test(answer) ? null : reject('Aborted')) + .then(() => ninvoke(getRawGalleryAPI(pat), 'deletePublisher', publisherName)) + .then(() => load().then(store => removePublisherFromStore(store, publisherName))) + .then(() => console.log(`Successfully deleted publisher '${ publisherName }'.`)); }); } @@ -137,11 +152,12 @@ function listPublishers(): Promise { return load().then(store => store.publishers); } -export function publisher(action: string, publisher: string): Promise { +export function publisher(action: string, publisherName: string): Promise { switch (action) { - case 'create': return createPublisher(publisher); - case 'add': return addPublisher(publisher); - case 'rm': return rmPublisher(publisher); + case 'create': return createPublisher(publisherName); + case 'delete': return deletePublisher(publisherName); + case 'add': return addPublisher(publisherName); + case 'rm': return rmPublisher(publisherName); case 'list': default: return listPublishers().then(publishers => publishers.forEach(p => console.log(p.name))); } } \ No newline at end of file