in sync-api-docs/propFormatter.js [20:198]
function formatTypeColumn(prop) {
// Checks for @type pragma comment
if (prop.rnTags && prop.rnTags.type) {
let tableRows = '';
const typeTags = prop.rnTags.type;
typeTags.forEach(tag => {
let url, text;
// Checks for @platform pragma in @type string
const isMatch = tag.match(/{@platform [a-z ,]*}/);
if (isMatch) {
// Extracts platforms from matched regex
const platform = isMatch[0].match(/ [a-z ,]*/);
// Replaces @platform strings with empty string
// and appends type with formatted platform
tag = tag.replace(/{@platform [a-z ,]*}/g, '');
if (Object.hasOwnProperty.call(magic.linkableTypeAliases, tag)) {
({url, text} = magic.linkableTypeAliases[tag]);
if (url) tag = `[${text}](${url})`;
}
tag = tag + formatMultiplePlatform(platform[0].split(','));
} else {
// Check if there are multiple comma separated types in a single line
if (tag.match(/, /)) {
let newTag = '';
const tags = tag.split(', ');
tags.forEach(item => {
if (Object.hasOwnProperty.call(magic.linkableTypeAliases, item)) {
({url, text} = magic.linkableTypeAliases[item]);
if (url) newTag += ', ' + `[${text}](${url})`;
} else newTag += ', ' + item;
});
//Trim comma from beginning
tag = newTag.replace(/^, /, '');
}
// If there is no comma separated types in rnTags
else if (Object.hasOwnProperty.call(magic.linkableTypeAliases, tag)) {
({url, text} = magic.linkableTypeAliases[tag]);
if (url) tag = `[${text}](${url})`;
}
}
tableRows = tableRows + tag + '<hr/>';
});
tableRows = tableRows.replace(/<hr\/>$/, '');
return tableRows;
}
// To extract type from prop flowType
else if (prop.flowType && Object.keys(prop.flowType).length >= 1) {
let text, url;
// Handles flowtype name for signatures
if (prop.flowType.name === 'signature') {
// Handles flowtype for function signature
if (prop.flowType.type === 'function') {
// Extracts EventType from the raw value
const isMatch = prop.flowType.raw.match(/: [a-zA-Z]*/);
if (isMatch) {
// Formats EventType
const eventType = isMatch[0].slice(2);
// Checks for aliases in magic and generates md url
if (
Object.hasOwnProperty.call(magic.linkableTypeAliases, eventType)
) {
({url, text} = magic.linkableTypeAliases[eventType]);
if (url) {
return `${prop.flowType.type}([${text}](${url}))`;
}
}
// TODO: Handling unknown function params
return `${prop.flowType.type}`;
} else {
return prop.flowType.type;
}
} else if (prop.flowType.type === 'object') {
return prop.flowType.type;
}
} else if (prop.flowType.name.includes('$ReadOnlyArray')) {
prop?.flowType?.elements[0]?.elements &&
prop?.flowType?.elements[0]?.elements.forEach(elem => {
if (
Object.hasOwnProperty.call(magic.linkableTypeAliases, elem.name)
) {
({url, text} = magic.linkableTypeAliases[elem.name]);
}
});
if (url) return `array of [${text}](${url})`;
else if (prop?.flowType?.elements[0].name === 'union') {
const unionTypes = prop?.flowType?.elements[0]?.elements.reduce(
(acc, curr) => {
acc.push(curr.value);
return acc;
},
[]
);
return `array of enum(${unionTypes.join(', ')})`;
} else if (prop?.flowType?.elements[0]?.name) {
const typeName = prop.flowType.elements[0].name;
//array of number
if (typeName === 'number') return `array of ${typeName}`;
else if (
Object.hasOwnProperty.call(magic.linkableTypeAliases, typeName)
) {
({url, text} = magic.linkableTypeAliases[typeName]);
if (url) return `array of [${text}](${url})`;
}
//default array for all other types
else return 'array';
}
} else if (prop.flowType.name === '$ReadOnly') {
// Special Case: switch#trackcolor
let markdown = '';
if (prop.flowType.elements[0]?.type === 'object') {
prop?.flowType?.elements[0]?.signature?.properties.forEach(
({key, value}) => {
value?.elements?.forEach(elem => {
if (
Object.hasOwnProperty.call(magic.linkableTypeAliases, elem.name)
) {
({url, text} = magic.linkableTypeAliases[elem.name]);
markdown += `${key}: [${text}](${url})` + ', ';
}
});
if (!url) markdown += `${key}: ${value.name}` + ', ';
}
);
if (markdown.match(/, $/)) markdown = markdown.replace(/, $/, '');
return `${prop.flowType.elements[0]?.type}: {${markdown}}`;
}
} else if (prop.flowType.name === 'union') {
let unionTypes = prop.flowType.raw.split('|');
// Trim whitespaces and remove any leftover `|` (to avoid table split)
unionTypes = unionTypes
.map(elem => {
return elem.trim().replace(/|/g, '');
})
.filter(item => {
if (item) return item;
});
// Get text and url from magic aliases
prop?.flowType?.elements?.forEach(elem => {
if (Object.hasOwnProperty.call(magic.linkableTypeAliases, elem.name)) {
({url, text} = magic.linkableTypeAliases[elem.name]);
}
});
if (url) return `[${text}](${url})`;
return `enum(${unionTypes.join(', ')})`;
} else if (prop.flowType.name === 'ReactElement') {
return 'element';
} else {
// Get text and url from magic aliases
prop?.flowType?.elements?.forEach(elem => {
if (Object.hasOwnProperty.call(magic.linkableTypeAliases, elem.name)) {
({url, text} = magic.linkableTypeAliases[elem.name]);
}
});
}
// If no text is found, get raw values as text
if (!text) {
// TO BE FIXED
text =
(prop.flowType.raw && stringToInlineCodeForTable(prop.flowType.raw)) ||
formatType(prop.flowType.name);
}
// If URL is found, return text and link in markdown format
if (url) {
return `[${text}](${url})`;
}
return text;
}
}