Skip to content

Commit 927a729

Browse files
authored
Merge pull request #899 from salesforcecli/mahanteshnp27/W-17606033/Add-TotalNumberOfMetadataFiles-Field
Mahanteshnp27/w 17606033/add total number of metadata files field
2 parents eb4e1da + 12100b1 commit 927a729

15 files changed

+147
-43
lines changed

.gitignore

+2
Original file line numberDiff line numberDiff line change
@@ -48,3 +48,5 @@ node_modules
4848
.DS_Store
4949
.idea
5050
.iml
51+
plugin-packaging.iml
52+
.codegenie

messages/package_version_create.md

+4
Original file line numberDiff line numberDiff line change
@@ -228,3 +228,7 @@ Create version status: %s
228228
# unknownError
229229

230230
An unknown error occurred.
231+
232+
# warnOnTotalFileCountExceedingThreshold
233+
234+
This package contains more than %s metadata files. The maximum number of metadata files in a package is %s. If you reach the file limit, you won’t be able to create new package versions. To confirm the exact file count for this package, run sf package version report and review the “# Metadata Files” column.

package.json

+1-1
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@
88
"@oclif/core": "^4",
99
"@salesforce/core": "^8.8.2",
1010
"@salesforce/kit": "^3.2.3",
11-
"@salesforce/packaging": "^4.2.15",
11+
"@salesforce/packaging": "^4.3.0",
1212
"@salesforce/sf-plugins-core": "^12.1.4",
1313
"chalk": "^5.4.1"
1414
},

schemas/package-convert.json

+5-1
Original file line numberDiff line numberDiff line change
@@ -53,6 +53,9 @@
5353
},
5454
"ConvertedFromVersionId": {
5555
"type": ["string", "null"]
56+
},
57+
"TotalNumberOfMetadataFiles": {
58+
"type": ["number", "null"]
5659
}
5760
},
5861
"required": [
@@ -71,7 +74,8 @@
7174
"CodeCoverage",
7275
"VersionNumber",
7376
"CreatedBy",
74-
"ConvertedFromVersionId"
77+
"ConvertedFromVersionId",
78+
"TotalNumberOfMetadataFiles"
7579
],
7680
"additionalProperties": false
7781
},

schemas/package-list.json

+8-8
Original file line numberDiff line numberDiff line change
@@ -10,16 +10,11 @@
1010
},
1111
"Package2Result": {
1212
"type": "object",
13+
"additionalProperties": false,
1314
"properties": {
14-
"Id": {
15-
"type": "string"
16-
},
1715
"SubscriberPackageId": {
1816
"type": "string"
1917
},
20-
"Name": {
21-
"type": "string"
22-
},
2318
"Description": {
2419
"type": "string"
2520
},
@@ -46,9 +41,14 @@
4641
},
4742
"IsOrgDependent": {
4843
"type": "string"
44+
},
45+
"Id": {
46+
"type": "string"
47+
},
48+
"Name": {
49+
"type": "string"
4950
}
50-
},
51-
"additionalProperties": false
51+
}
5252
},
5353
"PackageType": {
5454
"type": "string",

schemas/package-version-create-list.json

+4
Original file line numberDiff line numberDiff line change
@@ -59,6 +59,9 @@
5959
},
6060
"ConvertedFromVersionId": {
6161
"type": ["string", "null"]
62+
},
63+
"TotalNumberOfMetadataFiles": {
64+
"type": ["number", "null"]
6265
}
6366
},
6467
"required": [
@@ -77,6 +80,7 @@
7780
"Status",
7881
"SubscriberPackageVersionId",
7982
"Tag",
83+
"TotalNumberOfMetadataFiles",
8084
"VersionNumber"
8185
]
8286
}

schemas/package-version-create-report.json

+5-1
Original file line numberDiff line numberDiff line change
@@ -59,6 +59,9 @@
5959
},
6060
"ConvertedFromVersionId": {
6161
"type": ["string", "null"]
62+
},
63+
"TotalNumberOfMetadataFiles": {
64+
"type": ["number", "null"]
6265
}
6366
},
6467
"required": [
@@ -77,7 +80,8 @@
7780
"CodeCoverage",
7881
"VersionNumber",
7982
"CreatedBy",
80-
"ConvertedFromVersionId"
83+
"ConvertedFromVersionId",
84+
"TotalNumberOfMetadataFiles"
8185
],
8286
"additionalProperties": false
8387
},

schemas/package-version-create.json

+3
Original file line numberDiff line numberDiff line change
@@ -53,6 +53,9 @@
5353
},
5454
"ConvertedFromVersionId": {
5555
"type": ["string", "null"]
56+
},
57+
"TotalNumberOfMetadataFiles": {
58+
"type": ["number", "null"]
5659
}
5760
},
5861
"additionalProperties": false

schemas/package-version-list.json

+3-3
Original file line numberDiff line numberDiff line change
@@ -55,6 +55,9 @@
5555
"CreatedBy": {
5656
"type": "string"
5757
},
58+
"ValidatedAsync": {
59+
"type": "boolean"
60+
},
5861
"Id": {
5962
"type": "string"
6063
},
@@ -100,9 +103,6 @@
100103
"ValidationSkipped": {
101104
"type": "boolean"
102105
},
103-
"ValidatedAsync": {
104-
"type": "boolean"
105-
},
106106
"ConvertedFromVersionId": {
107107
"type": "string"
108108
},

schemas/package-version-report.json

+6-3
Original file line numberDiff line numberDiff line change
@@ -173,6 +173,12 @@
173173
"Language": {
174174
"type": "string"
175175
},
176+
"EndToEndBuildDurationInSeconds": {
177+
"type": "number"
178+
},
179+
"TotalNumberOfMetadataFiles": {
180+
"type": "number"
181+
},
176182
"SubscriberPackageVersion": {
177183
"type": "object",
178184
"properties": {
@@ -191,9 +197,6 @@
191197
},
192198
"AncestorId": {
193199
"type": ["string", "null"]
194-
},
195-
"EndToEndBuildDurationInSeconds": {
196-
"type": "number"
197200
}
198201
},
199202
"required": ["HasMetadataRemoved", "Package2", "Version"]

src/commands/package/version/create.ts

+7-1
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,8 @@ import Package2VersionStatus = PackagingSObjects.Package2VersionStatus;
2222

2323
Messages.importMessagesDirectoryFromMetaUrl(import.meta.url);
2424
const messages = Messages.loadMessages('@salesforce/plugin-packaging', 'package_version_create');
25-
25+
const fileCountThreshold = 7000;
26+
const maxFileCountLimit = 10000;
2627
export type PackageVersionCommandResult = Partial<PackageVersionCreateRequestResult>;
2728

2829
export class PackageVersionCreateCommand extends SfCommand<PackageVersionCommandResult> {
@@ -284,6 +285,11 @@ export class PackageVersionCreateCommand extends SfCommand<PackageVersionCommand
284285
this.config.bin,
285286
])
286287
);
288+
if ((result.TotalNumberOfMetadataFiles ?? 0) > fileCountThreshold) {
289+
this.warn(
290+
messages.getMessage('warnOnTotalFileCountExceedingThreshold', [fileCountThreshold, maxFileCountLimit])
291+
);
292+
}
287293
break;
288294
default:
289295
this.log(

test/commands/package/packageConvert.test.ts

+3
Original file line numberDiff line numberDiff line change
@@ -69,6 +69,7 @@ describe('package:convert', () => {
6969
Tag: '',
7070
CodeCoverage: null,
7171
VersionNumber: null,
72+
TotalNumberOfMetadataFiles: null,
7273
} satisfies PackageVersionCreateRequestResult;
7374

7475
convertStub = $$.SANDBOX.stub(Package, 'convert').resolves(pvc);
@@ -100,6 +101,7 @@ describe('package:convert', () => {
100101
Tag: '',
101102
CodeCoverage: null,
102103
VersionNumber: null,
104+
TotalNumberOfMetadataFiles: null,
103105
};
104106

105107
convertStub.restore();
@@ -130,6 +132,7 @@ describe('package:convert', () => {
130132
Tag: '',
131133
CodeCoverage: null,
132134
VersionNumber: null,
135+
TotalNumberOfMetadataFiles: null,
133136
};
134137

135138
convertStub.restore();

test/commands/package/packageVersion.nut.ts

+25-3
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,28 @@ const expectedPVCRkeys = [
4242
'ConvertedFromVersionId',
4343
'CodeCoverage',
4444
'VersionNumber',
45+
'TotalNumberOfMetadataFiles',
46+
];
47+
48+
// Keys expected for Package version create list.
49+
// TotalNumberOfMetadataFiles is not included.
50+
const expectedPVCLkeys = [
51+
'Id',
52+
'Status',
53+
'Package2Id',
54+
'Package2Name',
55+
'Package2VersionId',
56+
'SubscriberPackageVersionId',
57+
'Tag',
58+
'Branch',
59+
'Error',
60+
'CreatedDate',
61+
'HasMetadataRemoved',
62+
'HasPassedCodeCoverageCheck',
63+
'CreatedBy',
64+
'ConvertedFromVersionId',
65+
'CodeCoverage',
66+
'VersionNumber',
4567
];
4668

4769
describe('package:version:*', () => {
@@ -215,7 +237,7 @@ describe('package:version:*', () => {
215237
expect(output).to.be.ok;
216238
expect(output?.status).to.equal(0);
217239
expect(output?.result).to.have.length.greaterThan(0);
218-
expect(output?.result[0]).to.have.keys(expectedPVCRkeys);
240+
expect(output?.result[0]).to.have.keys(expectedPVCLkeys);
219241
const current = Date.now();
220242
// @ts-ignore
221243
const created = Date.parse(output?.result?.at(0).CreatedDate);
@@ -234,7 +256,7 @@ describe('package:version:*', () => {
234256
expect(output).to.be.ok;
235257
expect(output?.status).to.equal(0);
236258
expect(output?.result).to.have.length.greaterThan(0);
237-
expect(output?.result[0]).to.have.keys(expectedPVCRkeys);
259+
expect(output?.result[0]).to.have.keys(expectedPVCLkeys);
238260
});
239261

240262
it('should list the package versions created as part of package conversion from 1GP --show-conversions-only flag (human)', async () => {
@@ -248,7 +270,7 @@ describe('package:version:*', () => {
248270
it('should list the package versions created --verbose (json)', async () => {
249271
const command = `package:version:create:list --status Success --created-last-days 10 -v ${session.hubOrg.username} --json --verbose`;
250272
const output = execCmd<CreateListCommandResult>(command, { ensureExitCode: 0 }).jsonOutput;
251-
const expectedVerboseKeys = [...expectedPVCRkeys, 'VersionName'];
273+
const expectedVerboseKeys = [...expectedPVCLkeys, 'VersionName'];
252274
expect(output).to.be.ok;
253275
expect(output?.status).to.equal(0);
254276
expect(output?.result).to.have.length.greaterThan(0);

test/commands/package/packageVersionCreate.test.ts

+69
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,7 @@ const pkgVersionCreateErrorResult: PackageVersionCreateRequestResult = {
3636
CodeCoverage: null,
3737
VersionNumber: null,
3838
ConvertedFromVersionId: null,
39+
TotalNumberOfMetadataFiles: null,
3940
};
4041

4142
const pkgVersionCreateSuccessResult: PackageVersionCreateRequestResult = {
@@ -55,6 +56,27 @@ const pkgVersionCreateSuccessResult: PackageVersionCreateRequestResult = {
5556
CodeCoverage: null,
5657
VersionNumber: null,
5758
ConvertedFromVersionId: null,
59+
TotalNumberOfMetadataFiles: null,
60+
};
61+
62+
const pkgVersionCreateSuccessResultExceedsFileCount: PackageVersionCreateRequestResult = {
63+
Id: '08c3i000000fylgAAA',
64+
Status: Package2VersionStatus.success,
65+
Package2Id: '0Ho3i000000TNHYCA4',
66+
Package2VersionId: '05i3i000000fxw1AAA',
67+
SubscriberPackageVersionId: '04t3i000002eya2AAA',
68+
Tag: '',
69+
Branch: '',
70+
Error: [],
71+
CreatedDate: '2022-11-03 09:46',
72+
HasMetadataRemoved: false,
73+
CreatedBy: '0053i000001ZIyGAAW',
74+
Package2Name: null,
75+
HasPassedCodeCoverageCheck: null,
76+
CodeCoverage: null,
77+
VersionNumber: null,
78+
ConvertedFromVersionId: null,
79+
TotalNumberOfMetadataFiles: 8000,
5880
};
5981

6082
describe('package:version:create - tests', () => {
@@ -65,6 +87,7 @@ describe('package:version:create - tests', () => {
6587

6688
// stubs
6789
let logStub: sinon.SinonStub;
90+
let warnStub: sinon.SinonStub;
6891

6992
const stubSpinner = (cmd: PackageVersionCreateCommand) => {
7093
$$.SANDBOX.stub(cmd.spinner, 'start');
@@ -78,6 +101,7 @@ describe('package:version:create - tests', () => {
78101

79102
beforeEach(async () => {
80103
logStub = $$.SANDBOX.stub(SfCommand.prototype, 'log');
104+
warnStub = $$.SANDBOX.stub(SfCommand.prototype, 'warn');
81105
});
82106

83107
afterEach(() => {
@@ -110,7 +134,9 @@ describe('package:version:create - tests', () => {
110134
CodeCoverage: null,
111135
VersionNumber: null,
112136
ConvertedFromVersionId: null,
137+
TotalNumberOfMetadataFiles: null,
113138
});
139+
expect(warnStub.callCount).to.equal(0);
114140
expect(logStub.callCount).to.equal(1);
115141
expect(logStub.args[0]).to.deep.equal([
116142
`Successfully created the package version [08c3i000000fylgAAA]. Subscriber Package Version Id: 04t3i000002eya2AAA${os.EOL}Package Installation URL: https://login.salesforce.com/packaging/installPackage.apexp?p0=04t3i000002eya2AAA${os.EOL}As an alternative, you can use the "sf package:install" command.`,
@@ -146,7 +172,50 @@ describe('package:version:create - tests', () => {
146172
CodeCoverage: null,
147173
VersionNumber: null,
148174
ConvertedFromVersionId: null,
175+
TotalNumberOfMetadataFiles: null,
149176
});
177+
expect(warnStub.callCount).to.equal(0);
178+
expect(logStub.callCount).to.equal(1);
179+
expect(logStub.args[0]).to.deep.equal([
180+
`Successfully created the package version [08c3i000000fylgAAA]. Subscriber Package Version Id: 04t3i000002eya2AAA${os.EOL}Package Installation URL: https://login.salesforce.com/packaging/installPackage.apexp?p0=04t3i000002eya2AAA${os.EOL}As an alternative, you can use the "sf package:install" command.`,
181+
]);
182+
});
183+
184+
it('should create a new package version with total file-count exceeding threshold', async () => {
185+
createStub = $$.SANDBOX.stub(PackageVersion, 'create');
186+
createStub.resolves(pkgVersionCreateSuccessResultExceedsFileCount);
187+
const envSpy = $$.SANDBOX.spy(env, 'setBoolean').withArgs('SF_APPLY_REPLACEMENTS_ON_CONVERT', true);
188+
189+
const cmd = new PackageVersionCreateCommand(
190+
['-p', '05i3i000000Gmj6XXX', '-v', 'test@hub.org', '-x', '--async-validation'],
191+
config
192+
);
193+
stubSpinner(cmd);
194+
const res = await cmd.run();
195+
expect(envSpy.calledOnce).to.equal(true);
196+
expect(res).to.deep.equal({
197+
Branch: '',
198+
CreatedBy: '0053i000001ZIyGAAW',
199+
CreatedDate: '2022-11-03 09:46',
200+
Error: [],
201+
HasMetadataRemoved: false,
202+
Id: '08c3i000000fylgAAA',
203+
Package2Id: '0Ho3i000000TNHYCA4',
204+
Package2VersionId: '05i3i000000fxw1AAA',
205+
Status: 'Success',
206+
SubscriberPackageVersionId: '04t3i000002eya2AAA',
207+
Tag: '',
208+
Package2Name: null,
209+
HasPassedCodeCoverageCheck: null,
210+
CodeCoverage: null,
211+
VersionNumber: null,
212+
ConvertedFromVersionId: null,
213+
TotalNumberOfMetadataFiles: 8000,
214+
});
215+
expect(warnStub.callCount).to.equal(1);
216+
expect(warnStub.args[0]).to.deep.equal([
217+
'This package contains more than 7000 metadata files. The maximum number of metadata files in a package is 10000. If you reach the file limit, you won’t be able to create new package versions. To confirm the exact file count for this package, run sf package version report and review the “# Metadata Files” column.',
218+
]);
150219
expect(logStub.callCount).to.equal(1);
151220
expect(logStub.args[0]).to.deep.equal([
152221
`Successfully created the package version [08c3i000000fylgAAA]. Subscriber Package Version Id: 04t3i000002eya2AAA${os.EOL}Package Installation URL: https://login.salesforce.com/packaging/installPackage.apexp?p0=04t3i000002eya2AAA${os.EOL}As an alternative, you can use the "sf package:install" command.`,

0 commit comments

Comments
 (0)