-
Notifications
You must be signed in to change notification settings - Fork 12
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
chore(docs): auto-generate api reference (VIV-2180) #1984
base: main
Are you sure you want to change the base?
Changes from all commits
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
Original file line number | Diff line number | Diff line change | ||||||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
@@ -0,0 +1,139 @@ | ||||||||||||||||||||||||||
const markdownLibrary = require('../libraries/markdown-it'); | ||||||||||||||||||||||||||
const markdownTable = require('markdown-table'); | ||||||||||||||||||||||||||
const fs = require('fs'); | ||||||||||||||||||||||||||
|
||||||||||||||||||||||||||
const metadata = JSON.parse( | ||||||||||||||||||||||||||
fs.readFileSync(`dist/libs/wrapper-gen/component-metadata.json`, 'utf-8') | ||||||||||||||||||||||||||
); | ||||||||||||||||||||||||||
|
||||||||||||||||||||||||||
const escapeMarkdown = (text = '') => text.replace(/([<>{}])/gm, '\\$1'); | ||||||||||||||||||||||||||
|
||||||||||||||||||||||||||
const escapeType = (text = '') => text.replace(/([|])/gm, '\\$1'); | ||||||||||||||||||||||||||
Check failure Code scanning / CodeQL Incomplete string escaping or encoding High documentation
This does not escape backslash characters in the input.
Copilot Autofix AI 3 months ago To fix the problem, we need to ensure that the
Suggested changeset
1
apps/docs/shortcodes/apiReference.js
Copilot is powered by AI and may make mistakes. Always verify output.
Refresh and try again.
|
||||||||||||||||||||||||||
|
||||||||||||||||||||||||||
const escapeDescription = (text) => escapeMarkdown(text).replace(/\n/g, ' '); | ||||||||||||||||||||||||||
|
||||||||||||||||||||||||||
const withImportsResolved = (type) => | ||||||||||||||||||||||||||
type.flatMap((t) => (t.resolvedType ? t.resolvedType : [t])); | ||||||||||||||||||||||||||
|
||||||||||||||||||||||||||
const MaxEnumMembersToShow = 12; | ||||||||||||||||||||||||||
function generateEnumType(type) { | ||||||||||||||||||||||||||
let members = type.map((t) => t.text.replace(/['"]/g, '`')); | ||||||||||||||||||||||||||
if (members.length > MaxEnumMembersToShow) { | ||||||||||||||||||||||||||
members = members.slice(0, MaxEnumMembersToShow); | ||||||||||||||||||||||||||
members.push(`... ${type.length - MaxEnumMembersToShow} more ...`); | ||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||
return members.join('<br/>'); | ||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||
|
||||||||||||||||||||||||||
function generateTableWithType(objects, typeHeader = 'Type') { | ||||||||||||||||||||||||||
return markdownTable([ | ||||||||||||||||||||||||||
['Name', typeHeader, 'Description'], | ||||||||||||||||||||||||||
...objects.map(({ name, type, description }) => { | ||||||||||||||||||||||||||
const resolvedType = withImportsResolved(type); | ||||||||||||||||||||||||||
return [ | ||||||||||||||||||||||||||
`**${name}**`, | ||||||||||||||||||||||||||
(resolvedType.length === 1 | ||||||||||||||||||||||||||
? `\`${resolvedType[0].text}\`` | ||||||||||||||||||||||||||
: `*Enum*:<br/>${generateEnumType(resolvedType)}` | ||||||||||||||||||||||||||
).replace(/\|/g, '\\|'), | ||||||||||||||||||||||||||
Comment on lines
+35
to
+38
Check failure Code scanning / CodeQL Incomplete string escaping or encoding High documentation
This does not escape backslash characters in the input.
Copilot Autofix AI 3 months ago To fix the problem, we need to ensure that backslashes are properly escaped in the input strings. This can be achieved by adding a replacement for backslashes before any other replacements. Additionally, we should ensure that all replacements use the global flag to replace all occurrences of the target characters. The best way to fix the problem without changing existing functionality is to update the
Suggested changeset
1
apps/docs/shortcodes/apiReference.js
Copilot is powered by AI and may make mistakes. Always verify output.
Refresh and try again.
|
||||||||||||||||||||||||||
escapeDescription(description), | ||||||||||||||||||||||||||
]; | ||||||||||||||||||||||||||
}), | ||||||||||||||||||||||||||
]); | ||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||
|
||||||||||||||||||||||||||
function generateTable(slots) { | ||||||||||||||||||||||||||
return markdownTable([ | ||||||||||||||||||||||||||
['Name', 'Description'], | ||||||||||||||||||||||||||
...slots.map(({ name, description }) => [ | ||||||||||||||||||||||||||
`**${name}**`, | ||||||||||||||||||||||||||
escapeDescription(description), | ||||||||||||||||||||||||||
]), | ||||||||||||||||||||||||||
]); | ||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||
|
||||||||||||||||||||||||||
function generateMethodsTable(methods) { | ||||||||||||||||||||||||||
const getTypeString = (types) => | ||||||||||||||||||||||||||
withImportsResolved(types) | ||||||||||||||||||||||||||
.map((t) => t.text) | ||||||||||||||||||||||||||
.join(' \\| '); | ||||||||||||||||||||||||||
return markdownTable([ | ||||||||||||||||||||||||||
['Name', 'Type', 'Description'], | ||||||||||||||||||||||||||
...methods.map(({ name, args, returnType, description }) => [ | ||||||||||||||||||||||||||
`**${name}**`, | ||||||||||||||||||||||||||
`\`(${args.map( | ||||||||||||||||||||||||||
({ name: argName, type }) => `${argName}: ${getTypeString(type)}` | ||||||||||||||||||||||||||
)}) => ${getTypeString(returnType)}\``, | ||||||||||||||||||||||||||
escapeDescription(description), | ||||||||||||||||||||||||||
]), | ||||||||||||||||||||||||||
]); | ||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||
|
||||||||||||||||||||||||||
function generateVueModelsTable(vueModels, attributes) { | ||||||||||||||||||||||||||
const getTypeString = (types) => | ||||||||||||||||||||||||||
withImportsResolved(types) | ||||||||||||||||||||||||||
.map((t) => t.text) | ||||||||||||||||||||||||||
.join(' \\| '); | ||||||||||||||||||||||||||
return markdownTable([ | ||||||||||||||||||||||||||
['Name', 'Type', 'Description'], | ||||||||||||||||||||||||||
...vueModels.map(({ name, attributeName }) => { | ||||||||||||||||||||||||||
const attribute = attributes.find((attr) => attr.name === attributeName); | ||||||||||||||||||||||||||
|
||||||||||||||||||||||||||
return [ | ||||||||||||||||||||||||||
`**${name}**`, | ||||||||||||||||||||||||||
`\`${getTypeString(attribute.type)}\``, | ||||||||||||||||||||||||||
escapeDescription(attribute.description), | ||||||||||||||||||||||||||
]; | ||||||||||||||||||||||||||
}), | ||||||||||||||||||||||||||
]); | ||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||
|
||||||||||||||||||||||||||
function generateDocPageForComponent({ | ||||||||||||||||||||||||||
description, | ||||||||||||||||||||||||||
attributes, | ||||||||||||||||||||||||||
events, | ||||||||||||||||||||||||||
slots, | ||||||||||||||||||||||||||
methods, | ||||||||||||||||||||||||||
vueModels, | ||||||||||||||||||||||||||
}) { | ||||||||||||||||||||||||||
let text = `## API Reference | ||||||||||||||||||||||||||
|
||||||||||||||||||||||||||
${escapeMarkdown(description)}\n`; | ||||||||||||||||||||||||||
if (attributes.length > 0) { | ||||||||||||||||||||||||||
text += `\n### Props | ||||||||||||||||||||||||||
|
||||||||||||||||||||||||||
${generateTableWithType(attributes)}\n`; | ||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||
|
||||||||||||||||||||||||||
if (events.length > 0) { | ||||||||||||||||||||||||||
text += `\n### Events | ||||||||||||||||||||||||||
|
||||||||||||||||||||||||||
${generateTableWithType(events, 'Event Type')}\n`; | ||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||
|
||||||||||||||||||||||||||
if (slots.length > 0) { | ||||||||||||||||||||||||||
text += `\n### Slots | ||||||||||||||||||||||||||
|
||||||||||||||||||||||||||
${generateTable(slots)}\n`; | ||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||
|
||||||||||||||||||||||||||
if (methods.length > 0) { | ||||||||||||||||||||||||||
text += `\n### Methods | ||||||||||||||||||||||||||
|
||||||||||||||||||||||||||
${generateMethodsTable(methods)}\n`; | ||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||
|
||||||||||||||||||||||||||
if (vueModels.length > 0) { | ||||||||||||||||||||||||||
text += `\n### V-Models | ||||||||||||||||||||||||||
|
||||||||||||||||||||||||||
${generateVueModelsTable(vueModels, attributes)}\n`; | ||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||
|
||||||||||||||||||||||||||
return text; | ||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||
|
||||||||||||||||||||||||||
module.exports = function apiReference(componentName) { | ||||||||||||||||||||||||||
const def = metadata.find((def) => def.name === componentName); | ||||||||||||||||||||||||||
|
||||||||||||||||||||||||||
return markdownLibrary.render(generateDocPageForComponent(def)); | ||||||||||||||||||||||||||
}; |
Large diffs are not rendered by default.
Check failure
Code scanning / CodeQL
Incomplete string escaping or encoding High documentation
Copilot Autofix AI 3 months ago
To fix the problem, we need to ensure that backslashes are also escaped in the
escapeMarkdown
function. This can be done by adding backslashes to the list of characters to be escaped. We will use a regular expression that includes backslashes and ensure that all occurrences are replaced.escapeMarkdown
function to include backslashes in the characters to be escaped.