Skip to content

Commit aa5599f

Browse files
committed
Merge branch 'main' of github.com:forcedotcom/source-deploy-retrieve into phale/decompose-esr
2 parents fbd0528 + 7452436 commit aa5599f

File tree

24 files changed

+1455
-2431
lines changed

24 files changed

+1455
-2431
lines changed

CHANGELOG.md

Lines changed: 486 additions & 1745 deletions
Large diffs are not rendered by default.

METADATA_SUPPORT.md

Lines changed: 668 additions & 670 deletions
Large diffs are not rendered by default.

package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "@salesforce/source-deploy-retrieve",
3-
"version": "12.12.1",
3+
"version": "12.12.4",
44
"description": "JavaScript library to run Salesforce metadata deploys and retrieves",
55
"main": "lib/src/index.js",
66
"author": "Salesforce",

src/collections/componentSet.ts

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -511,6 +511,21 @@ export class ComponentSet extends LazyCollection<MetadataComponent> {
511511
this.components.set(key, new DecodeableMap<string, SourceComponent>());
512512
}
513513

514+
if (!deletionType && typeof component.type !== 'string') {
515+
// this component is meant to be added to manifestComponents, even if it's not a fully validated source component,
516+
// this ensures when getObject is called, we created consistent manifests whether using this.components, or this.manifestComponents
517+
// when no destructive changes are present, we use this.components (not fully validated as source components, so typos end up in the generated manifest)
518+
// when destructive changes are used, we use this.manifestComponents (fully validated, would not match this.components)
519+
// this ensures this.components manifest === this.manifestComponents manifest
520+
const sc = new SourceComponent({ type: component.type, name: component.fullName });
521+
const srcKey = sourceKey(sc);
522+
523+
if (!this.manifestComponents.has(key)) {
524+
this.manifestComponents.set(key, new DecodeableMap<string, SourceComponent>());
525+
}
526+
this.manifestComponents.get(key)?.set(srcKey, sc);
527+
}
528+
514529
if (!(component instanceof SourceComponent)) {
515530
return;
516531
}

src/convert/transformers/decomposedPermissionSetTransformer.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -123,7 +123,7 @@ export class DecomposedPermissionSetTransformer extends BaseMetadataTransformer
123123
return [...writeInfosForChildren, ...writeInfoForParent];
124124
}
125125
}
126-
/** for a component, parse the xml and create an json object with contents, child typeId, etc */
126+
/** for a component, parse the xml and create a json object with contents, child typeId, etc */
127127
const getComposedMetadataEntries = async (component: SourceComponent): Promise<ComposedMetadata[]> =>
128128
// composedMetadata might be undefined if you call toSourceFormat() from a non-source-backed Component
129129
Object.entries((await component.parseXml())[component.type.name] ?? {}).map(

src/registry/presets/decomposePermissionSetBeta2.json

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
"applicationvisibility": "permissionset",
44
"classaccess": "permissionset",
55
"custommetadatatypeaccess": "permissionset",
6-
"custompermissions": "permissionset",
6+
"custompermission": "permissionset",
77
"customsettingaccess": "permissionset",
88
"externalcredentialprincipalaccess": "permissionset",
99
"externaldatasourceaccess": "permissionset",
@@ -28,7 +28,7 @@
2828
"applicationVisibilities": "applicationvisibility",
2929
"classAccesses": "classaccess",
3030
"customMetadataTypeAccesses": "custommetadatatypeaccess",
31-
"customPermissions": "custompermissions",
31+
"customPermissions": "custompermission",
3232
"customSettingAccesses": "customsettingaccess",
3333
"externalCredentialPrincipalAccesses": "externalcredentialprincipalaccess",
3434
"externalDataSourceAccesses": "externaldatasourceaccess",
@@ -44,7 +44,7 @@
4444
"applicationVisibility": "applicationvisibility",
4545
"classAccess": "classaccess",
4646
"customMetadataTypeAccess": "custommetadatatypeaccess",
47-
"customPermission": "custompermissions",
47+
"customPermission": "custompermission",
4848
"customSettingAccess": "customsettingaccess",
4949
"externalCredentialPrincipalAccess": "externalcredentialprincipalaccess",
5050
"externalDataSourceAccess": "externaldatasourceaccess",
@@ -82,9 +82,9 @@
8282
"suffix": "customMetadataTypeAccess",
8383
"uniqueIdElement": "name"
8484
},
85-
"custompermissions": {
85+
"custompermission": {
8686
"directoryName": "",
87-
"id": "custompermissions",
87+
"id": "custompermission",
8888
"isAddressable": false,
8989
"name": "CustomPermission",
9090
"suffix": "customPermission",

src/registry/presets/decomposeSharingRulesBeta.json

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,6 @@
3030
"sharingcriteriarule": {
3131
"directoryName": "sharingCriteriaRules",
3232
"id": "sharingcriteriarule",
33-
"isAddressable": false,
3433
"name": "SharingCriteriaRule",
3534
"suffix": "sharingCriteriaRule",
3635
"uniqueIdElement": "fullName",
@@ -39,7 +38,6 @@
3938
"sharingguestrule": {
4039
"directoryName": "sharingGuestRules",
4140
"id": "sharingguestrule",
42-
"isAddressable": false,
4341
"name": "SharingGuestRule",
4442
"suffix": "sharingGuestRule",
4543
"uniqueIdElement": "fullName",
@@ -48,7 +46,6 @@
4846
"sharingownerrule": {
4947
"directoryName": "sharingOwnerRules",
5048
"id": "sharingownerrule",
51-
"isAddressable": false,
5249
"name": "SharingOwnerRule",
5350
"suffix": "sharingOwnerRule",
5451
"uniqueIdElement": "fullName",
@@ -57,7 +54,6 @@
5754
"sharingterritoryrule": {
5855
"directoryName": "sharingTerritoryRules",
5956
"id": "sharingterritoryrule",
60-
"isAddressable": false,
6157
"name": "SharingTerritoryRule",
6258
"suffix": "sharingTerritoryRule",
6359
"uniqueIdElement": "fullName",

test/collections/componentSet.test.ts

Lines changed: 28 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -31,12 +31,11 @@ import {
3131
SourceComponent,
3232
ZipTreeContainer,
3333
} from '../../src';
34-
import { decomposedtoplevel, matchingContentFile, mixedContentSingleFile, digitalExperienceBundle } from '../mock';
34+
import { decomposedtoplevel, digitalExperienceBundle, matchingContentFile, mixedContentSingleFile } from '../mock';
3535
import { MATCHING_RULES_COMPONENT } from '../mock/type-constants/customlabelsConstant';
3636
import * as manifestFiles from '../mock/manifestConstants';
37-
import { testApiVersionAsString } from '../mock/manifestConstants';
37+
import { testApiVersion, testApiVersionAsString } from '../mock/manifestConstants';
3838
import * as coverage from '../../src/registry/coverage';
39-
import { testApiVersion } from '../mock/manifestConstants';
4039

4140
const registryAccess = new RegistryAccess();
4241

@@ -1250,6 +1249,32 @@ describe('ComponentSet', () => {
12501249
expect(Array.from(set)).to.deep.equal([component]);
12511250
});
12521251

1252+
it('should keep manifestComponents/components in sync', async () => {
1253+
const set = new ComponentSet(undefined, registryAccess);
1254+
const jerryComponent = { fullName: 'Jerry', type: registry.types.staticresource };
1255+
const billComponent = new SourceComponent({ name: 'Bill', type: registry.types.staticresource });
1256+
const philComponent = new SourceComponent({ name: 'Phil', type: registry.types.staticresource });
1257+
1258+
expect(set.size).to.equal(0);
1259+
1260+
set.add(jerryComponent);
1261+
1262+
expect(set.size).to.equal(1); // @ts-ignore - private
1263+
expect(set.manifestComponents.size).to.equal(1); // @ts-ignore - private
1264+
expect(set.components.size).to.equal(1);
1265+
const allToDeployObject = await set.getObject();
1266+
1267+
set.add(philComponent, DestructiveChangesType.PRE); // @ts-ignore - private
1268+
expect(set.manifestComponents.size).to.equal(1); // @ts-ignore - private
1269+
expect(set.components.size).to.equal(2);
1270+
1271+
set.add(billComponent, DestructiveChangesType.POST); // @ts-ignore - private
1272+
expect(set.manifestComponents.size).to.equal(1); // @ts-ignore - private
1273+
expect(set.components.size).to.equal(3);
1274+
1275+
expect(await set.getObject()).to.deep.equal(allToDeployObject);
1276+
});
1277+
12531278
it('should add metadata component marked for delete to package components', () => {
12541279
const set = new ComponentSet(undefined, registryAccess);
12551280
expect(!!set.getTypesOfDestructiveChanges().length).to.be.false;

test/snapshot/sampleProjects/preset-decomposedPS2/__snapshots__/verify-md-files.expected/package.xml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
<members>dreamhouse</members>
55
<members>ebikes</members>
66
<members>noObjectSettings</members>
7+
<members>withCustomPermission</members>
78
<name>PermissionSet</name>
89
</types>
910
<version>60.0</version>
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
<?xml version="1.0" encoding="UTF-8"?>
2+
<PermissionSet xmlns="http://soap.sforce.com/2006/04/metadata">
3+
<applicationVisibilities>
4+
<application>withCustomPermission</application>
5+
<visible>true</visible>
6+
</applicationVisibilities>
7+
<classAccesses>
8+
<apexClass>PagedResult</apexClass>
9+
<enabled>true</enabled>
10+
</classAccesses>
11+
<classAccesses>
12+
<apexClass>PropertyController</apexClass>
13+
<enabled>true</enabled>
14+
</classAccesses>
15+
<classAccesses>
16+
<apexClass>SampleDataController</apexClass>
17+
<enabled>true</enabled>
18+
</classAccesses>
19+
<customPermissions>
20+
<enabled>true</enabled>
21+
<name>myCustomPerm</name>
22+
</customPermissions>
23+
<customPermissions>
24+
<enabled>true</enabled>
25+
<name>myCustomPerm1</name>
26+
</customPermissions>
27+
<hasActivationRequired>false</hasActivationRequired>
28+
<label>withCustomPermission</label>
29+
</PermissionSet>

0 commit comments

Comments
 (0)