Skip to content

Commit 86afed4

Browse files
Merge pull request #804 from forcedotcom/2gp-readiness/w-20911193/unpackaged-md-conversion
[Conversion] [CLI] Support unpackaged metadata during conversion
2 parents 563e9e7 + d2a1a0b commit 86afed4

4 files changed

Lines changed: 110 additions & 10 deletions

File tree

package.json

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "@salesforce/packaging",
3-
"version": "4.18.12",
3+
"version": "4.18.0",
44
"description": "Packaging library for the Salesforce packaging platform",
55
"main": "lib/exported",
66
"types": "lib/exported.d.ts",
@@ -42,11 +42,11 @@
4242
"!lib/**/*.map"
4343
],
4444
"dependencies": {
45-
"@jsforce/jsforce-node": "^3.10.10",
45+
"@jsforce/jsforce-node": "^3.10.13",
4646
"@salesforce/core": "^8.25.0",
4747
"@salesforce/kit": "^3.2.4",
4848
"@salesforce/schemas": "^1.10.3",
49-
"@salesforce/source-deploy-retrieve": "^12.31.8",
49+
"@salesforce/source-deploy-retrieve": "^12.31.9",
5050
"@salesforce/ts-types": "^2.0.12",
5151
"@salesforce/types": "^1.6.0",
5252
"fast-xml-parser": "^4.5.0",

src/package/packageConvert.ts

Lines changed: 21 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -202,8 +202,10 @@ export async function createPackageVersionCreateRequest(
202202
const packageVersTmpRoot = path.join(os.tmpdir(), uniqueId);
203203
const packageVersMetadataFolder = path.join(packageVersTmpRoot, 'md-files');
204204
const seedMetadataFolder = path.join(packageVersTmpRoot, 'seed-md-files');
205+
const unpackagedMetadataFolder = path.join(packageVersTmpRoot, 'unpackaged-md-files');
205206
const packageVersBlobDirectory = path.join(packageVersTmpRoot, 'package-version-info');
206207
const seedMetadataZipFile = path.join(packageVersBlobDirectory, 'seed-metadata-package.zip');
208+
const unpackagedMetadataZipFile = path.join(packageVersBlobDirectory, 'unpackaged-metadata-package.zip');
207209
const settingsZipFile = path.join(packageVersBlobDirectory, 'settings.zip');
208210
const metadataZipFile = path.join(packageVersBlobDirectory, 'package.zip');
209211
const packageVersBlobZipFile = path.join(packageVersTmpRoot, 'package-version-info.zip');
@@ -241,13 +243,31 @@ export async function createPackageVersionCreateRequest(
241243
await fs.promises.mkdir(packageVersMetadataFolder, { recursive: true });
242244

243245
const seedMetadataPath = context.seedmetadata ?? packageDescriptorJson.seedMetadata?.path;
246+
244247
const hasSeedMetadata = await new MetadataResolver().resolveMetadata(
245248
seedMetadataPath,
246249
seedMetadataFolder,
247250
'seedMDDirectoryDoesNotExist',
248251
apiVersion
249252
);
250253

254+
if (context.codecoverage) {
255+
const unpackagedMetadataPath = packageDescriptorJson.unpackagedMetadata?.path;
256+
const hasUnpackaged = await new MetadataResolver().resolveMetadata(
257+
unpackagedMetadataPath,
258+
unpackagedMetadataFolder,
259+
'unpackagedMDDirectoryDoesNotExist',
260+
apiVersion
261+
);
262+
263+
if (hasUnpackaged) {
264+
Logger.childFromRoot('packageConvert').debug(
265+
`Including unpackaged metadata found in '${unpackagedMetadataPath ?? '<undefined unpackagedmetadata>'}'.`
266+
);
267+
await pkgUtils.zipDir(unpackagedMetadataFolder, unpackagedMetadataZipFile);
268+
}
269+
}
270+
251271
if (hasSeedMetadata) {
252272
// Zip the seedMetadataFolder folder and put the zip in {packageVersBlobDirectory}/{seedMetadataZipFile}
253273
Logger.childFromRoot('packageConvert:pollForStatusWithInterval').debug(
@@ -295,7 +315,7 @@ function buildPackageDescriptorJson(args: {
295315
...(base ?? {}),
296316
};
297317
if (packageObject && isPackagingDirectory(packageObject)) {
298-
const allowedKeys: Array<keyof PackageDescriptorJson> = ['apexTestAccess', 'seedMetadata'];
318+
const allowedKeys: Array<keyof PackageDescriptorJson> = ['apexTestAccess', 'seedMetadata', 'unpackagedMetadata'];
299319
for (const key of allowedKeys) {
300320
if (Object.prototype.hasOwnProperty.call(packageObject, key)) {
301321
const value = (packageObject as unknown as PackageDescriptorJson)[key];

test/package/packageConvert.test.ts

Lines changed: 55 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -160,6 +160,61 @@ describe('packageConvert', () => {
160160
}
161161
});
162162

163+
it('should pick up unpackagedMetadata from sfdx-project.json when codecoverage is enabled', async () => {
164+
$$.inProject(true);
165+
const project = SfProject.getInstance();
166+
167+
await fs.promises.mkdir(path.join(project.getPath(), 'force-app'), { recursive: true });
168+
169+
project.getSfProjectJson().set('packageDirectories', [
170+
{
171+
path: 'force-app',
172+
package: '0Ho3i000000Gmj6CAC',
173+
unpackagedMetadata: { path: 'unpackaged-md' },
174+
},
175+
]);
176+
await project.getSfProjectJson().write();
177+
178+
$$.SANDBOX.stub(fs, 'existsSync').returns(true);
179+
const resolveMetadataSpy = $$.SANDBOX.spy(MetadataResolver.prototype, 'resolveMetadata');
180+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
181+
$$.SANDBOX.stub(MetadataResolver.prototype, 'generateMDFolderForArtifact' as any).resolves();
182+
183+
await createPackageVersionCreateRequest({ codecoverage: true }, '0Ho3i000000Gmj6CAC', '60.0', project);
184+
185+
// check that resolveMetadata was called with the unpackaged metadata directory
186+
expect(resolveMetadataSpy.calledWith('unpackaged-md')).to.be.true;
187+
});
188+
189+
it('should NOT pick up unpackagedMetadata from sfdx-project.json when codecoverage is disabled', async () => {
190+
$$.inProject(true);
191+
const project = SfProject.getInstance();
192+
193+
await fs.promises.mkdir(path.join(project.getPath(), 'force-app'), { recursive: true });
194+
195+
project.getSfProjectJson().set('packageDirectories', [
196+
{
197+
path: 'force-app',
198+
package: '0Ho3i000000Gmj6CAC',
199+
unpackagedMetadata: { path: 'unpackaged-md' },
200+
},
201+
]);
202+
await project.getSfProjectJson().write();
203+
204+
const resolveMetadataSpy = $$.SANDBOX.spy(MetadataResolver.prototype, 'resolveMetadata');
205+
206+
await createPackageVersionCreateRequest(
207+
{ codecoverage: false }, // disabled
208+
'0Ho3i000000Gmj6CAC',
209+
'60.0',
210+
project
211+
);
212+
213+
// Verify it was NOT called for the unpackaged directory
214+
const unpackagedCall = resolveMetadataSpy.getCalls().find((call) => call.args[0] === 'unpackaged-md');
215+
expect(unpackagedCall).to.be.undefined;
216+
});
217+
163218
it('should set apexTestAccess permissions in package2descriptor.json when codecoverage is enabled', async () => {
164219
$$.inProject(true);
165220
const project = SfProject.getInstance();

yarn.lock

Lines changed: 31 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -451,7 +451,7 @@
451451
"@jridgewell/resolve-uri" "^3.1.0"
452452
"@jridgewell/sourcemap-codec" "^1.4.14"
453453

454-
"@jsforce/jsforce-node@^3.10.10", "@jsforce/jsforce-node@^3.10.13":
454+
"@jsforce/jsforce-node@^3.10.13":
455455
version "3.10.13"
456456
resolved "https://registry.yarnpkg.com/@jsforce/jsforce-node/-/jsforce-node-3.10.13.tgz#d1e832178e2e74646c75b952e629ac5b8ceff7d0"
457457
integrity sha512-Ft42/lp3WaVxijcX88Rb3yIxujk/u3LwL3913OTcB4WCpwjB9xTqP6jkVTKt2riXg+ZlNiS62SMpQeC3U1Efkw==
@@ -558,7 +558,32 @@
558558
strip-ansi "6.0.1"
559559
ts-retry-promise "^0.8.1"
560560

561-
"@salesforce/core@^8.23.1", "@salesforce/core@^8.24.0", "@salesforce/core@^8.25.0", "@salesforce/core@^8.8.0":
561+
"@salesforce/core@^8.23.1", "@salesforce/core@^8.24.0", "@salesforce/core@^8.8.0":
562+
version "8.24.3"
563+
resolved "https://registry.yarnpkg.com/@salesforce/core/-/core-8.24.3.tgz#c18fb2481ab212c460fd351520712a4fa8b4329f"
564+
integrity sha512-E9k4G3S8svS6QtsPVhUvxr0VHWyzg7KxH8sYM0o5pk7QEUXZCKQEQE5VjQOa+Gl3jRyX6zv/8Cp4UpQ2ZszOVg==
565+
dependencies:
566+
"@jsforce/jsforce-node" "^3.10.13"
567+
"@salesforce/kit" "^3.2.4"
568+
"@salesforce/ts-types" "^2.0.12"
569+
ajv "^8.17.1"
570+
change-case "^4.1.2"
571+
fast-levenshtein "^3.0.0"
572+
faye "^1.4.1"
573+
form-data "^4.0.4"
574+
js2xmlparser "^4.0.1"
575+
jsonwebtoken "9.0.3"
576+
jszip "3.10.1"
577+
memfs "^4.30.1"
578+
pino "^9.7.0"
579+
pino-abstract-transport "^1.2.0"
580+
pino-pretty "^11.3.0"
581+
proper-lockfile "^4.1.2"
582+
semver "^7.7.3"
583+
ts-retry-promise "^0.8.1"
584+
zod "^4.1.12"
585+
586+
"@salesforce/core@^8.25.0":
562587
version "8.25.0"
563588
resolved "https://registry.yarnpkg.com/@salesforce/core/-/core-8.25.0.tgz#2cf53f38aee8fb6ea1b0e6b6e301b66bc0d81d1c"
564589
integrity sha512-LdUDEK8mmiWpnKn6wtaSDcvZc2Svrg/xldint1OGyVhCGZUAQLjCWRKkBT5DdIVV3g9QrDNhLboi904jcwDe1g==
@@ -637,10 +662,10 @@
637662
resolved "https://registry.yarnpkg.com/@salesforce/schemas/-/schemas-1.10.3.tgz#52c867fdd60679cf216110aa49542b7ad391f5d1"
638663
integrity sha512-FKfvtrYTcvTXE9advzS25/DEY9yJhEyLvStm++eQFtnAaX1pe4G3oGHgiQ0q55BM5+0AlCh0+0CVtQv1t4oJRA==
639664

640-
"@salesforce/source-deploy-retrieve@^12.31.8":
641-
version "12.31.8"
642-
resolved "https://registry.yarnpkg.com/@salesforce/source-deploy-retrieve/-/source-deploy-retrieve-12.31.8.tgz#0eade61d5f117722fed81a4f2c04eb7a7d5f4703"
643-
integrity sha512-gp2yJUuAsR86v8QkGY50Sxyiup4H0QNyT7bC3rowxUnR/mw1q3gkXSDnhHOWt5toWsZr78oL1ztGQxG89l89XQ==
665+
"@salesforce/source-deploy-retrieve@^12.31.9":
666+
version "12.31.9"
667+
resolved "https://registry.yarnpkg.com/@salesforce/source-deploy-retrieve/-/source-deploy-retrieve-12.31.9.tgz#69592e0b1564157fce8b7c66b33412460fa62b6e"
668+
integrity sha512-UVRmLVl+Es1jLGnSx4G2xxTNHR7L6v5uzOpBFbg1ADMOQ4b1v8cDwZO9noJa9xAG+MLJJ7zDkcqywgFxU/3mmQ==
644669
dependencies:
645670
"@salesforce/core" "^8.24.0"
646671
"@salesforce/kit" "^3.2.4"

0 commit comments

Comments
 (0)