Skip to content

Commit 86db455

Browse files
fix: add package:uninstall command
1 parent e84ac87 commit 86db455

File tree

2 files changed

+39
-10
lines changed

2 files changed

+39
-10
lines changed

messages/package_uninstall.md

Lines changed: 14 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -11,11 +11,11 @@ Uninstalls a second-generation package from the target org. To uninstall a first
1111
Specify the package ID for a second-generation package.
1212

1313
Examples:
14-
$ sfdx force:package:uninstall -p 04t... -u [email protected]
15-
$ sfdx force:package:uninstall -p undesirable_package_alias
16-
$ sfdx force:package:uninstall -p "Undesirable Package Alias"
14+
$ sfdx force:package:beta:uninstall -p 04t... -u [email protected]
15+
$ sfdx force:package:beta:uninstall -p undesirable_package_alias
16+
$ sfdx force:package:beta:uninstall -p "Undesirable Package Alias"
1717

18-
To list the org’s installed packages, run "sfdx force:package:installed:list".
18+
To list the org’s installed packages, run "sfdx force:package:beta:installed:list".
1919

2020
To uninstall a first-generation package, from Setup, enter Installed Packages in the Quick Find box, then select Installed Packages.
2121

@@ -61,4 +61,13 @@ Include either a %s value or a %s value.
6161

6262
# invalidIdOrPackage
6363

64-
Invalid alias or ID: %s. Either your alias is invalid or undefined, or the ID provided is invalid.
64+
Invalid alias or ID: %s. Either your alias is invalid or undefined, or the ID provided is invalid (must start with 04t).
65+
66+
# InProgress
67+
68+
PackageUninstallRequest is currently InProgress.
69+
You can continue to query the status using sfdx force:package:beta:uninstall:report -i %s -u %s
70+
71+
# Success
72+
73+
Successfully uninstalled package [%s]

src/commands/force/package/beta/uninstall.ts

Lines changed: 25 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,11 @@
66
*/
77

88
import { flags, FlagsConfig, SfdxCommand } from '@salesforce/command';
9-
import { Messages, SfdxPropertyKeys } from '@salesforce/core';
9+
import { Lifecycle, Messages } from '@salesforce/core';
10+
import { getPackageIdFromAlias, PackagingSObjects, uninstallPackage } from '@salesforce/packaging';
11+
import { Duration } from '@salesforce/kit';
12+
13+
type UninstallResult = PackagingSObjects.SubscriberPackageVersionUninstallRequest;
1014

1115
Messages.importMessagesDirectory(__dirname);
1216
const messages = Messages.loadMessages('@salesforce/plugin-packaging', 'package_uninstall');
@@ -15,14 +19,14 @@ export class PackageUninstallCommand extends SfdxCommand {
1519
public static readonly description = messages.getMessage('cliDescription');
1620
public static readonly longDescription = messages.getMessage('cliDescriptionLong');
1721
public static readonly help = messages.getMessage('help');
18-
public static readonly;
19-
public static readonly orgType = SfdxPropertyKeys.DEFAULT_USERNAME;
2022
public static readonly requiresUsername = true;
23+
public static readonly requiresProject = true;
2124
public static readonly flagsConfig: FlagsConfig = {
2225
wait: flags.minutes({
2326
char: 'w',
2427
description: messages.getMessage('wait'),
2528
longDescription: messages.getMessage('waitLong'),
29+
default: Duration.minutes(0),
2630
}),
2731
package: flags.string({
2832
char: 'p',
@@ -32,7 +36,23 @@ export class PackageUninstallCommand extends SfdxCommand {
3236
};
3337

3438
public async run(): Promise<unknown> {
35-
process.exitCode = 1;
36-
return Promise.resolve('Not yet implemented');
39+
// no awaits in async method
40+
// eslint-disable-next-line @typescript-eslint/require-await
41+
Lifecycle.getInstance().on('packageUninstall', async (data: UninstallResult) => {
42+
// Request still in progress. Just print a console message and move on. Server will be polled again.
43+
this.ux.log(`Waiting for the package uninstall request to get processed. Status = ${data.Status}`);
44+
});
45+
46+
const packageId = getPackageIdFromAlias(this.flags.package, this.project);
47+
if (!packageId.startsWith('04t')) {
48+
throw messages.createError('invalidIdOrPackage', [packageId]);
49+
}
50+
// TODO: fix type once packaging PR is published
51+
// eslint-disable-next-line @typescript-eslint/no-unsafe-call,@typescript-eslint/no-unsafe-assignment
52+
const result: UninstallResult = await uninstallPackage(packageId, this.org.getConnection(), this.flags.wait);
53+
const arg = result.Status === 'Success' ? [result.SubscriberPackageVersionId] : [result.Id, this.org.getUsername()];
54+
this.ux.log(messages.getMessage(result.Status, arg));
55+
56+
return result;
3757
}
3858
}

0 commit comments

Comments
 (0)