Skip to content

Commit b93331f

Browse files
committed
Fixing issue when parsing standard object without the label property
1 parent 4b9eada commit b93331f

File tree

8 files changed

+133
-47
lines changed

8 files changed

+133
-47
lines changed
Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
# Account
2+
3+
## API Name
4+
`ns__Account`
Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
# Contact
2+
3+
## API Name
4+
`ns__Contact`
5+
6+
## Fields
7+
### PhotoUrl
8+
9+
**API Name**
10+
11+
`ns__PhotoUrl__c`
12+
13+
**Type**
14+
15+
*Url*

examples/markdown/docs/index.md

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,10 @@
22

33
## Custom Objects
44

5+
### [Account](custom-objects/Account.md)
6+
7+
### [Contact](custom-objects/Contact.md)
8+
59
### [Event__c](custom-objects/Event__c.md)
610

711
Represents an event that people can register for.
Lines changed: 90 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,90 @@
1+
<?xml version="1.0" encoding="UTF-8"?>
2+
<CustomObject xmlns="http://soap.sforce.com/2006/04/metadata">
3+
<actionOverrides>
4+
<actionName>CallHighlightAction</actionName>
5+
<type>Default</type>
6+
</actionOverrides>
7+
<actionOverrides>
8+
<actionName>CancelEdit</actionName>
9+
<type>Default</type>
10+
</actionOverrides>
11+
<actionOverrides>
12+
<actionName>Delete</actionName>
13+
<type>Default</type>
14+
</actionOverrides>
15+
<actionOverrides>
16+
<actionName>Edit</actionName>
17+
<type>Default</type>
18+
</actionOverrides>
19+
<actionOverrides>
20+
<actionName>EmailHighlightAction</actionName>
21+
<type>Default</type>
22+
</actionOverrides>
23+
<actionOverrides>
24+
<actionName>EnableCustomerPortalUser</actionName>
25+
<type>Default</type>
26+
</actionOverrides>
27+
<actionOverrides>
28+
<actionName>List</actionName>
29+
<type>Default</type>
30+
</actionOverrides>
31+
<actionOverrides>
32+
<actionName>ListClean</actionName>
33+
<type>Default</type>
34+
</actionOverrides>
35+
<actionOverrides>
36+
<actionName>New</actionName>
37+
<type>Default</type>
38+
</actionOverrides>
39+
<actionOverrides>
40+
<actionName>RequestUpdate</actionName>
41+
<type>Default</type>
42+
</actionOverrides>
43+
<actionOverrides>
44+
<actionName>SaveEdit</actionName>
45+
<type>Default</type>
46+
</actionOverrides>
47+
<actionOverrides>
48+
<actionName>SmsHighlightAction</actionName>
49+
<type>Default</type>
50+
</actionOverrides>
51+
<actionOverrides>
52+
<actionName>Tab</actionName>
53+
<type>Default</type>
54+
</actionOverrides>
55+
<actionOverrides>
56+
<actionName>View</actionName>
57+
<content>Account_Record_Page</content>
58+
<formFactor>Large</formFactor>
59+
<skipRecordTypeSelect>false</skipRecordTypeSelect>
60+
<type>Flexipage</type>
61+
</actionOverrides>
62+
<actionOverrides>
63+
<actionName>ViewCustomerPortalUser</actionName>
64+
<type>Default</type>
65+
</actionOverrides>
66+
<actionOverrides>
67+
<actionName>WebsiteHighlightAction</actionName>
68+
<type>Default</type>
69+
</actionOverrides>
70+
<compactLayoutAssignment>Account_Compact_Layout</compactLayoutAssignment>
71+
<enableEnhancedLookup>true</enableEnhancedLookup>
72+
<enableFeeds>true</enableFeeds>
73+
<enableHistory>false</enableHistory>
74+
<searchLayouts>
75+
<customTabListAdditionalFields>ACCOUNT.NAME</customTabListAdditionalFields>
76+
<customTabListAdditionalFields>ACCOUNT.ADDRESS1_CITY</customTabListAdditionalFields>
77+
<customTabListAdditionalFields>ACCOUNT.PHONE1</customTabListAdditionalFields>
78+
<lookupDialogsAdditionalFields>ACCOUNT.NAME</lookupDialogsAdditionalFields>
79+
<lookupDialogsAdditionalFields>CORE.USERS.ALIAS</lookupDialogsAdditionalFields>
80+
<lookupDialogsAdditionalFields>ACCOUNT.TYPE</lookupDialogsAdditionalFields>
81+
<lookupPhoneDialogsAdditionalFields>ACCOUNT.NAME</lookupPhoneDialogsAdditionalFields>
82+
<lookupPhoneDialogsAdditionalFields>CORE.USERS.ALIAS</lookupPhoneDialogsAdditionalFields>
83+
<lookupPhoneDialogsAdditionalFields>ACCOUNT.TYPE</lookupPhoneDialogsAdditionalFields>
84+
<lookupPhoneDialogsAdditionalFields>ACCOUNT.PHONE1</lookupPhoneDialogsAdditionalFields>
85+
<searchResultsAdditionalFields>ACCOUNT.NAME</searchResultsAdditionalFields>
86+
<searchResultsAdditionalFields>ACCOUNT.PHONE1</searchResultsAdditionalFields>
87+
<searchResultsAdditionalFields>CORE.USERS.ALIAS</searchResultsAdditionalFields>
88+
</searchLayouts>
89+
<sharingModel>ReadWrite</sharingModel>
90+
</CustomObject>
Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
<?xml version="1.0" encoding="UTF-8"?>
2+
<CustomObject xmlns="http://soap.sforce.com/2006/04/metadata">
3+
</CustomObject>

src/core/markdown/adapters/type-to-renderable.ts

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -254,7 +254,7 @@ function objectMetadataToRenderable(
254254
type: 'customobject',
255255
headingLevel: 1,
256256
apiName: getApiName(objectMetadata.name, config),
257-
heading: objectMetadata.label,
257+
heading: objectMetadata.label ?? objectMetadata.name,
258258
name: objectMetadata.name,
259259
doc: {
260260
description: objectMetadata.description ? [objectMetadata.description] : [],
@@ -277,10 +277,10 @@ function fieldMetadataToRenderable(
277277
return {
278278
type: 'field',
279279
headingLevel: headingLevel,
280-
heading: field.label,
280+
heading: field.label ?? field.name,
281281
description: field.description ? [field.description] : [],
282282
apiName: getApiName(field.name, config),
283-
fieldType: field.type,
283+
fieldType: field.type ?? '',
284284
};
285285
}
286286

src/core/reflection/sobject/reflect-custom-field-source.ts

Lines changed: 7 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -12,8 +12,8 @@ export type CustomFieldMetadata = {
1212
type_name: 'customfield';
1313
description: string | null;
1414
name: string;
15-
label: string;
16-
type: string;
15+
label?: string | null;
16+
type?: string | null;
1717
parentName: string;
1818
};
1919

@@ -43,7 +43,7 @@ function reflectCustomFieldSource(
4343
);
4444
}
4545

46-
function validate(parsedResult: unknown): E.Either<Error, { CustomField: object }> {
46+
function validate(parsedResult: unknown): E.Either<Error, { CustomField: unknown }> {
4747
const err = E.left(new Error('Invalid custom field metadata'));
4848

4949
function isObject(value: unknown) {
@@ -54,34 +54,16 @@ function validate(parsedResult: unknown): E.Either<Error, { CustomField: object
5454
return 'CustomField' in value ? E.right(value) : err;
5555
}
5656

57-
function theCustomFieldKeyIsAnObject(value: Record<'CustomField', unknown>) {
58-
return typeof value.CustomField === 'object' ? E.right(value as Record<'CustomField', object>) : err;
59-
}
60-
61-
function theCustomFieldObjectContainsTheLabelKey(value: Record<'CustomField', object>) {
62-
return 'label' in value.CustomField ? E.right(value) : err;
63-
}
64-
65-
function theCustomFieldObjectContainsTheTypeKey(value: Record<'CustomField', object>) {
66-
return 'type' in value.CustomField ? E.right(value) : err;
67-
}
68-
69-
return pipe(
70-
parsedResult,
71-
isObject,
72-
E.chain(hasTheCustomFieldKey),
73-
E.chain(theCustomFieldKeyIsAnObject),
74-
E.chain(theCustomFieldObjectContainsTheLabelKey),
75-
E.chain(theCustomFieldObjectContainsTheTypeKey),
76-
);
57+
return pipe(parsedResult, isObject, E.chain(hasTheCustomFieldKey));
7758
}
7859

79-
function toCustomFieldMetadata(parserResult: { CustomField: object }): CustomFieldMetadata {
60+
function toCustomFieldMetadata(parserResult: { CustomField: unknown }): CustomFieldMetadata {
61+
const customField = typeof parserResult.CustomField === 'object' ? parserResult.CustomField : {};
8062
const defaultValues = {
8163
description: null,
8264
};
8365

84-
return { ...defaultValues, ...parserResult.CustomField, type_name: 'customfield' } as CustomFieldMetadata;
66+
return { ...defaultValues, ...customField, type_name: 'customfield' } as CustomFieldMetadata;
8567
}
8668

8769
function addName(metadata: CustomFieldMetadata, name: string): CustomFieldMetadata {

src/core/reflection/sobject/reflect-custom-object-sources.ts

Lines changed: 7 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ export type ObjectMetadata = {
1313
type_name: 'customobject';
1414
deploymentStatus: string;
1515
visibility: string;
16-
label: string;
16+
label?: string | null;
1717
name: string;
1818
description: string | null;
1919
fields: ParsedFile<CustomFieldMetadata>[];
@@ -45,7 +45,7 @@ function reflectCustomObjectSource(
4545
);
4646
}
4747

48-
function validate(parseResult: unknown): E.Either<Error, { CustomObject: object }> {
48+
function validate(parseResult: unknown): E.Either<Error, { CustomObject: unknown }> {
4949
const err = E.left(new Error('Invalid SObject metadata'));
5050

5151
function isObject(value: unknown) {
@@ -56,31 +56,19 @@ function validate(parseResult: unknown): E.Either<Error, { CustomObject: object
5656
return 'CustomObject' in value ? E.right(value) : err;
5757
}
5858

59-
function theCustomObjectKeyIsAnObject(value: Record<'CustomObject', unknown>) {
60-
return typeof value.CustomObject === 'object' ? E.right(value as Record<'CustomObject', object>) : err;
61-
}
62-
63-
function theCustomObjectContainsTheLabelKey(value: Record<'CustomObject', object>) {
64-
return 'label' in value.CustomObject ? E.right(value) : err;
65-
}
66-
67-
return pipe(
68-
parseResult,
69-
isObject,
70-
E.chain(hasTheCustomObjectKey),
71-
E.chain(theCustomObjectKeyIsAnObject),
72-
E.chain(theCustomObjectContainsTheLabelKey),
73-
);
59+
return pipe(parseResult, isObject, E.chain(hasTheCustomObjectKey));
7460
}
7561

76-
function toObjectMetadata(parserResult: { CustomObject: object }): ObjectMetadata {
62+
function toObjectMetadata(parserResult: { CustomObject: unknown }): ObjectMetadata {
63+
const customObject = typeof parserResult.CustomObject === 'object' ? parserResult.CustomObject : {};
64+
7765
const defaultValues = {
7866
deploymentStatus: 'Deployed',
7967
visibility: 'Public',
8068
description: null,
8169
fields: [] as ParsedFile<CustomFieldMetadata>[],
8270
};
83-
return { ...defaultValues, ...parserResult.CustomObject } as ObjectMetadata;
71+
return { ...defaultValues, ...customObject } as ObjectMetadata;
8472
}
8573

8674
function addName(objectMetadata: ObjectMetadata, name: string): ObjectMetadata {

0 commit comments

Comments
 (0)