Skip to content

Commit d05dcc0

Browse files
committed
feat: add hidden --additional-base-packages flag to package convert
Supports 1GP-to-2GP conversions that extend a 2GP base package that can't be auto-discovered. Hidden until core side (W-22946445) honors it.
1 parent 85e75fa commit d05dcc0

4 files changed

Lines changed: 76 additions & 2 deletions

File tree

command-snapshot.json

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -187,6 +187,7 @@
187187
],
188188
"flagChars": ["a", "c", "f", "k", "m", "p", "s", "v", "w", "x"],
189189
"flags": [
190+
"additional-base-packages",
190191
"api-version",
191192
"build-instance",
192193
"code-coverage",
@@ -419,6 +420,7 @@
419420
"code-coverage",
420421
"definition-file",
421422
"flags-dir",
423+
"generate-pkg-zip",
422424
"installation-key",
423425
"installation-key-bypass",
424426
"json",
@@ -440,8 +442,7 @@
440442
"version-description",
441443
"version-name",
442444
"version-number",
443-
"wait",
444-
"generate-pkg-zip"
445+
"wait"
445446
],
446447
"plugin": "@salesforce/plugin-packaging"
447448
},

messages/package_convert.md

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -93,3 +93,11 @@ Calculate and store the code coverage percentage by running the packaged Apex te
9393
# flags.code-coverage.description
9494

9595
Before you can promote and release a managed package version, the Apex code must meet a minimum 75% code coverage requirement.
96+
97+
# flags.additional-base-packages.summary
98+
99+
Comma-separated list of second-generation base package version IDs (starts with 04t) that the package being converted extends.
100+
101+
# flags.additional-base-packages.description
102+
103+
Specify this flag when you convert a first-generation managed package that extends a second-generation base package. List the subscriber package version IDs (starts with 04t) of the base packages; they're installed before the converted package version. Most conversions don't need this flag because dependencies are detected automatically.

src/commands/package/convert.ts

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -106,6 +106,13 @@ export class PackageConvert extends SfCommand<PackageVersionCreateRequestResult>
106106
description: messages.getMessage('flags.code-coverage.description'),
107107
default: false,
108108
}),
109+
// Narrow flag for 1GP-extends-2GP conversions where the 2GP base package can't be
110+
// auto-discovered. Hidden until the core side (W-22946445) honors it.
111+
'additional-base-packages': Flags.string({
112+
summary: messages.getMessage('flags.additional-base-packages.summary'),
113+
description: messages.getMessage('flags.additional-base-packages.description'),
114+
hidden: true,
115+
}),
109116
};
110117

111118
public async run(): Promise<PackageVersionCreateRequestResult> {
@@ -142,6 +149,7 @@ export class PackageConvert extends SfCommand<PackageVersionCreateRequestResult>
142149
seedMetadata: flags['seed-metadata'] as string,
143150
patchversion: flags['patch-version'] as string,
144151
codecoverage: flags['code-coverage'] as boolean,
152+
additionalBasePackages: parseAdditionalBasePackages(flags['additional-base-packages']),
145153
},
146154
this.project
147155
);
@@ -187,3 +195,18 @@ export class PackageConvert extends SfCommand<PackageVersionCreateRequestResult>
187195
}
188196
}
189197
}
198+
199+
/**
200+
* Parse the comma-separated --additional-base-packages flag into a list of subscriber package
201+
* version IDs. Existence and validity checks are owned by the server.
202+
*/
203+
function parseAdditionalBasePackages(value: string | undefined): string[] | undefined {
204+
if (!value) {
205+
return undefined;
206+
}
207+
const ids = value
208+
.split(',')
209+
.map((id) => id.trim())
210+
.filter((id) => id.length > 0);
211+
return ids.length > 0 ? ids : undefined;
212+
}

test/commands/package/packageConvert.test.ts

Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -135,6 +135,48 @@ describe('package:convert', () => {
135135
expect(callArgs.codecoverage).to.equal(true);
136136
expect(result).to.deep.equal(pvc);
137137
});
138+
it('parses comma-separated --additional-base-packages into an array of 04t ids', async () => {
139+
const pvc = {
140+
Branch: 'main',
141+
ConvertedFromVersionId: null,
142+
CreatedBy: '133',
143+
CreatedDate: '2022-08-31 11:48',
144+
Error: [],
145+
HasMetadataRemoved: false,
146+
HasPassedCodeCoverageCheck: false,
147+
Id: '08c3i000000bmf6AAA',
148+
Package2Id: '0Ho3i000000Gmj6CAC',
149+
Package2Name: 'MyTestPackage',
150+
Package2VersionId: '05i3i000000bllhAAA',
151+
Status: Package2VersionStatus.inProgress,
152+
SubscriberPackageVersionId: '04t3i000002OUEkAAO',
153+
Tag: '',
154+
CodeCoverage: null,
155+
VersionNumber: null,
156+
TotalNumberOfMetadataFiles: null,
157+
TotalSizeOfMetadataFiles: null,
158+
} satisfies PackageVersionCreateRequestResult;
159+
160+
convertStub.restore();
161+
convertStub = $$.SANDBOX.stub(Package, 'convert').resolves(pvc);
162+
const cmd = new PackageConvert(
163+
[
164+
'-p',
165+
CONVERTED_FROM_PACKAGE_ID,
166+
'--installation-key',
167+
INSTALL_KEY,
168+
'-v',
169+
'test@user.com',
170+
'--additional-base-packages',
171+
'04t3i000002OUEkAAO, 04t3i000002OUElAAO',
172+
],
173+
config
174+
);
175+
stubSpinner(cmd);
176+
await cmd.run();
177+
const callArgs = convertStub.getCall(0).args[2] as ConvertPackageOptions;
178+
expect(callArgs.additionalBasePackages).to.deep.equal(['04t3i000002OUEkAAO', '04t3i000002OUElAAO']);
179+
});
138180
it('starts package version create request (error)', async () => {
139181
const pvc = {
140182
Branch: 'main',

0 commit comments

Comments
 (0)