Skip to content

Commit 755f89c

Browse files
fix: calculate if parent exists, return path to be calculated (#1431)
* fix: calculate if parent exists, return path to be calculated * test: fix windows UT?
1 parent f242291 commit 755f89c

File tree

6 files changed

+368
-2
lines changed

6 files changed

+368
-2
lines changed

src/convert/transformers/decomposedMetadataTransformer.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -213,14 +213,14 @@ export const getWriteInfosWithoutMerge =
213213
(defaultDirectory: string | undefined) =>
214214
(parentXmlObject: XmlObj) =>
215215
(component: SourceComponent): WriteInfo[] => {
216-
const output = join(defaultDirectory ?? '', getOutputFile(component));
216+
const output = getOutputFile(component);
217217
// if the parent would be empty
218218
// and it exists
219219
// and every child is addressable
220220
// don't overwrite the existing parent
221221
if (
222222
!objectHasSomeRealValues(component.type)(parentXmlObject) &&
223-
fs.existsSync(output) &&
223+
fs.existsSync(join(defaultDirectory ?? '', output)) &&
224224
Object.values(component.type.children ?? {}).every((child) => !child.isAddressable)
225225
) {
226226
return [];
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,63 @@
1+
<?xml version="1.0" encoding="UTF-8"?>
2+
<Layout xmlns="http://soap.sforce.com/2006/04/metadata">
3+
<layoutSections>
4+
<customLabel>false</customLabel>
5+
<detailHeading>false</detailHeading>
6+
<editHeading>true</editHeading>
7+
<label>Information</label>
8+
<layoutColumns>
9+
<layoutItems>
10+
<behavior>Required</behavior>
11+
<field>Name</field>
12+
</layoutItems>
13+
<layoutItems>
14+
<behavior>Edit</behavior>
15+
<field>completion__c</field>
16+
</layoutItems>
17+
<layoutItems>
18+
<behavior>Edit</behavior>
19+
<field>status__c</field>
20+
</layoutItems>
21+
</layoutColumns>
22+
<layoutColumns>
23+
<layoutItems>
24+
<behavior>Edit</behavior>
25+
<field>OwnerId</field>
26+
</layoutItems>
27+
</layoutColumns>
28+
<style>TwoColumnsTopToBottom</style>
29+
</layoutSections>
30+
<layoutSections>
31+
<customLabel>false</customLabel>
32+
<detailHeading>false</detailHeading>
33+
<editHeading>true</editHeading>
34+
<label>System Information</label>
35+
<layoutColumns>
36+
<layoutItems>
37+
<behavior>Readonly</behavior>
38+
<field>CreatedById</field>
39+
</layoutItems>
40+
</layoutColumns>
41+
<layoutColumns>
42+
<layoutItems>
43+
<behavior>Readonly</behavior>
44+
<field>LastModifiedById</field>
45+
</layoutItems>
46+
</layoutColumns>
47+
<style>TwoColumnsTopToBottom</style>
48+
</layoutSections>
49+
<layoutSections>
50+
<customLabel>false</customLabel>
51+
<detailHeading>false</detailHeading>
52+
<editHeading>true</editHeading>
53+
<layoutColumns/>
54+
<layoutColumns/>
55+
<layoutColumns/>
56+
<style>CustomLinks</style>
57+
</layoutSections>
58+
<showEmailCheckbox>false</showEmailCheckbox>
59+
<showHighlightsPanel>false</showHighlightsPanel>
60+
<showInteractionLogPanel>false</showInteractionLogPanel>
61+
<showRunAssignmentRulesCheckbox>false</showRunAssignmentRulesCheckbox>
62+
<showSubmitAndAttachButton>false</showSubmitAndAttachButton>
63+
</Layout>
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
<?xml version="1.0" encoding="UTF-8"?>
2+
<CustomField xmlns="http://soap.sforce.com/2006/04/metadata">
3+
<fullName>completion__c</fullName>
4+
<defaultValue>false</defaultValue>
5+
<label>completion</label>
6+
<trackTrending>false</trackTrending>
7+
<type>Checkbox</type>
8+
</CustomField>
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
<?xml version="1.0" encoding="UTF-8"?>
2+
<CustomField xmlns="http://soap.sforce.com/2006/04/metadata">
3+
<fullName>status__c</fullName>
4+
<label>status</label>
5+
<required>false</required>
6+
<trackTrending>false</trackTrending>
7+
<type>Picklist</type>
8+
<valueSet>
9+
<restricted>true</restricted>
10+
<valueSetDefinition>
11+
<sorted>false</sorted>
12+
<value>
13+
<fullName>done</fullName>
14+
<default>false</default>
15+
<label>done</label>
16+
</value>
17+
<value>
18+
<fullName>in progress</fullName>
19+
<default>false</default>
20+
<label>in progress</label>
21+
</value>
22+
<value>
23+
<fullName>broken</fullName>
24+
<default>false</default>
25+
<label>broken</label>
26+
</value>
27+
</valueSetDefinition>
28+
</valueSet>
29+
</CustomField>
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,165 @@
1+
<?xml version="1.0" encoding="UTF-8"?>
2+
<CustomObject xmlns="http://soap.sforce.com/2006/04/metadata">
3+
<actionOverrides>
4+
<actionName>Accept</actionName>
5+
<type>Default</type>
6+
</actionOverrides>
7+
<actionOverrides>
8+
<actionName>Accept</actionName>
9+
<formFactor>Large</formFactor>
10+
<type>Default</type>
11+
</actionOverrides>
12+
<actionOverrides>
13+
<actionName>Accept</actionName>
14+
<formFactor>Small</formFactor>
15+
<type>Default</type>
16+
</actionOverrides>
17+
<actionOverrides>
18+
<actionName>CancelEdit</actionName>
19+
<type>Default</type>
20+
</actionOverrides>
21+
<actionOverrides>
22+
<actionName>CancelEdit</actionName>
23+
<formFactor>Large</formFactor>
24+
<type>Default</type>
25+
</actionOverrides>
26+
<actionOverrides>
27+
<actionName>CancelEdit</actionName>
28+
<formFactor>Small</formFactor>
29+
<type>Default</type>
30+
</actionOverrides>
31+
<actionOverrides>
32+
<actionName>Clone</actionName>
33+
<type>Default</type>
34+
</actionOverrides>
35+
<actionOverrides>
36+
<actionName>Clone</actionName>
37+
<formFactor>Large</formFactor>
38+
<type>Default</type>
39+
</actionOverrides>
40+
<actionOverrides>
41+
<actionName>Clone</actionName>
42+
<formFactor>Small</formFactor>
43+
<type>Default</type>
44+
</actionOverrides>
45+
<actionOverrides>
46+
<actionName>Delete</actionName>
47+
<type>Default</type>
48+
</actionOverrides>
49+
<actionOverrides>
50+
<actionName>Delete</actionName>
51+
<formFactor>Large</formFactor>
52+
<type>Default</type>
53+
</actionOverrides>
54+
<actionOverrides>
55+
<actionName>Delete</actionName>
56+
<formFactor>Small</formFactor>
57+
<type>Default</type>
58+
</actionOverrides>
59+
<actionOverrides>
60+
<actionName>Edit</actionName>
61+
<type>Default</type>
62+
</actionOverrides>
63+
<actionOverrides>
64+
<actionName>Edit</actionName>
65+
<formFactor>Large</formFactor>
66+
<type>Default</type>
67+
</actionOverrides>
68+
<actionOverrides>
69+
<actionName>Edit</actionName>
70+
<formFactor>Small</formFactor>
71+
<type>Default</type>
72+
</actionOverrides>
73+
<actionOverrides>
74+
<actionName>List</actionName>
75+
<type>Default</type>
76+
</actionOverrides>
77+
<actionOverrides>
78+
<actionName>List</actionName>
79+
<formFactor>Large</formFactor>
80+
<type>Default</type>
81+
</actionOverrides>
82+
<actionOverrides>
83+
<actionName>List</actionName>
84+
<formFactor>Small</formFactor>
85+
<type>Default</type>
86+
</actionOverrides>
87+
<actionOverrides>
88+
<actionName>New</actionName>
89+
<type>Default</type>
90+
</actionOverrides>
91+
<actionOverrides>
92+
<actionName>New</actionName>
93+
<formFactor>Large</formFactor>
94+
<type>Default</type>
95+
</actionOverrides>
96+
<actionOverrides>
97+
<actionName>New</actionName>
98+
<formFactor>Small</formFactor>
99+
<type>Default</type>
100+
</actionOverrides>
101+
<actionOverrides>
102+
<actionName>SaveEdit</actionName>
103+
<type>Default</type>
104+
</actionOverrides>
105+
<actionOverrides>
106+
<actionName>SaveEdit</actionName>
107+
<formFactor>Large</formFactor>
108+
<type>Default</type>
109+
</actionOverrides>
110+
<actionOverrides>
111+
<actionName>SaveEdit</actionName>
112+
<formFactor>Small</formFactor>
113+
<type>Default</type>
114+
</actionOverrides>
115+
<actionOverrides>
116+
<actionName>Tab</actionName>
117+
<type>Default</type>
118+
</actionOverrides>
119+
<actionOverrides>
120+
<actionName>Tab</actionName>
121+
<formFactor>Large</formFactor>
122+
<type>Default</type>
123+
</actionOverrides>
124+
<actionOverrides>
125+
<actionName>Tab</actionName>
126+
<formFactor>Small</formFactor>
127+
<type>Default</type>
128+
</actionOverrides>
129+
<actionOverrides>
130+
<actionName>View</actionName>
131+
<type>Default</type>
132+
</actionOverrides>
133+
<actionOverrides>
134+
<actionName>View</actionName>
135+
<formFactor>Large</formFactor>
136+
<type>Default</type>
137+
</actionOverrides>
138+
<actionOverrides>
139+
<actionName>View</actionName>
140+
<formFactor>Small</formFactor>
141+
<type>Default</type>
142+
</actionOverrides>
143+
<allowInChatterGroups>false</allowInChatterGroups>
144+
<compactLayoutAssignment>SYSTEM</compactLayoutAssignment>
145+
<deploymentStatus>Deployed</deploymentStatus>
146+
<enableActivities>false</enableActivities>
147+
<enableBulkApi>true</enableBulkApi>
148+
<enableFeeds>false</enableFeeds>
149+
<enableHistory>false</enableHistory>
150+
<enableLicensing>false</enableLicensing>
151+
<enableReports>false</enableReports>
152+
<enableSearch>false</enableSearch>
153+
<enableSharing>true</enableSharing>
154+
<enableStreamingApi>true</enableStreamingApi>
155+
<externalSharingModel>Private</externalSharingModel>
156+
<label>test</label>
157+
<nameField>
158+
<label>test Name</label>
159+
<type>Text</type>
160+
</nameField>
161+
<pluralLabel>tests</pluralLabel>
162+
<searchLayouts></searchLayouts>
163+
<sharingModel>ReadWrite</sharingModel>
164+
<visibility>Public</visibility>
165+
</CustomObject>

test/snapshot/sampleProjects/singleCustomFieldRetrieve/snapshots.test.ts

Lines changed: 101 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -140,6 +140,107 @@ describe('a single field in a CustomObject xml does not overwrite (blank) the ex
140140
expect(fs.readdirSync(path.join(pathToBroker, 'fields')).length).to.equal(3);
141141
});
142142

143+
it('will not overwrite .object-meta.xml in package retrieval ', async () => {
144+
const TEST_PACKAGE = 'TestPackage';
145+
146+
const result: MetadataApiRetrieveStatus = {
147+
done: true,
148+
fileProperties: [
149+
{
150+
createdById: '005bm000006BUfFAAW',
151+
createdByName: 'William Ruemmele',
152+
createdDate: '2024-09-30T18:10:44.000Z',
153+
fileName: 'TestPackage/objects/test__c.object',
154+
fullName: 'test__c',
155+
id: '01Ibm000001ZQS5EAO',
156+
lastModifiedById: '005bm000006BUfFAAW',
157+
lastModifiedByName: 'William Ruemmele',
158+
lastModifiedDate: '2024-09-30T18:10:44.000Z',
159+
manageableState: ManageableState.Unmanaged,
160+
type: 'CustomObject',
161+
},
162+
{
163+
createdById: '005bm000006BUfFAAW',
164+
createdByName: 'William Ruemmele',
165+
createdDate: '2024-09-30T18:10:44.000Z',
166+
fileName: 'TestPackage/layouts/test__c-test Layout.layout',
167+
fullName: 'test__c-test Layout',
168+
id: '00hbm000006bcEHAAY',
169+
lastModifiedById: '005bm000006BUfFAAW',
170+
lastModifiedByName: 'William Ruemmele',
171+
lastModifiedDate: '2024-09-30T18:11:30.000Z',
172+
manageableState: ManageableState.Unmanaged,
173+
type: 'Layout',
174+
},
175+
{
176+
createdById: '005bm000006BUfFAAW',
177+
createdByName: 'William Ruemmele',
178+
createdDate: '2024-09-30T18:12:05.000Z',
179+
fileName: 'TestPackage/package.xml',
180+
fullName: 'package',
181+
id: '0A2bm000000eGN7CAM',
182+
lastModifiedById: '005bm000006BUfFAAW',
183+
lastModifiedByName: 'William Ruemmele',
184+
lastModifiedDate: '2024-09-30T18:12:05.000Z',
185+
manageableState: ManageableState.Unmanaged,
186+
type: 'Package',
187+
},
188+
{
189+
createdById: '005bm000006BUfFAAW',
190+
createdByName: 'William Ruemmele',
191+
createdDate: '2024-09-30T19:59:19.089Z',
192+
fileName: 'unpackaged/package.xml',
193+
fullName: 'unpackaged/package.xml',
194+
id: '',
195+
lastModifiedById: '005bm000006BUfFAAW',
196+
lastModifiedByName: 'William Ruemmele',
197+
lastModifiedDate: '2024-09-30T19:59:19.089Z',
198+
manageableState: ManageableState.Unmanaged,
199+
type: 'Package',
200+
},
201+
],
202+
id: '09Sbm000001mg2nEAA',
203+
status: RequestStatus.Succeeded,
204+
success: true,
205+
zipFile:
206+
'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',
207+
messages: [],
208+
};
209+
210+
const retrieve = new MetadataApiRetrieve({
211+
singlePackage: true,
212+
packageOptions: [{ name: TEST_PACKAGE, outputDir: path.join(testDir, TEST_PACKAGE) }],
213+
merge: true,
214+
output: path.join(testDir, TEST_PACKAGE),
215+
usernameOrConnection: 'abc',
216+
});
217+
await retrieve.post(result);
218+
expect(
219+
fs.existsSync(
220+
path.join(testDir, TEST_PACKAGE, 'main', 'default', 'objects', 'test__c', 'test__c.object-meta.xml')
221+
)
222+
).to.be.true;
223+
expect(
224+
fs.existsSync(
225+
path.join(testDir, TEST_PACKAGE, 'main', 'default', 'objects', 'test__c', 'fields', 'status__c.field-meta.xml')
226+
)
227+
).to.be.true;
228+
expect(
229+
fs.existsSync(
230+
path.join(
231+
testDir,
232+
TEST_PACKAGE,
233+
'main',
234+
'default',
235+
'objects',
236+
'test__c',
237+
'fields',
238+
'completion__c.field-meta.xml'
239+
)
240+
)
241+
).to.be.true;
242+
});
243+
143244
it(`verify ${FORCE_APP}`, async () => {
144245
await validateSourceDir(FORCE_APP);
145246
});

0 commit comments

Comments
 (0)