chore: class link generation in release notes

This commit is contained in:
Yury Semikhatsky 2024-04-10 09:50:55 -07:00
parent b2ded9fed1
commit b44dc1cde4
3 changed files with 23 additions and 5 deletions

View file

@ -13,6 +13,9 @@
* See the License for the specific language governing permissions and * See the License for the specific language governing permissions and
* limitations under the License. * limitations under the License.
*/ */
/** @typedef {'Types'|'ReleaseNotesMd'} OutputType */
// @ts-check // @ts-check
const toKebabCase = require('lodash/kebabCase.js') const toKebabCase = require('lodash/kebabCase.js')
@ -27,19 +30,34 @@ const createMarkdownLink = (languagePath, member, text) => {
return `[${text}](https://playwright.dev${languagePath}/docs/api/class-${member.clazz.name.toLowerCase()}#${hash})`; return `[${text}](https://playwright.dev${languagePath}/docs/api/class-${member.clazz.name.toLowerCase()}#${hash})`;
}; };
/**
* @param {string} languagePath
* @param {import('../doclint/documentation').Class} clazz
* @returns {string}
*/
const createClassMarkdownLink = (languagePath, clazz) => {
return `[${clazz.name}](https://playwright.dev${languagePath}/docs/api/class-${clazz.name.toLowerCase()})`;
};
/** /**
* @param {string} language * @param {string} language
* @param {OutputType} outputType
* @returns {import('../doclint/documentation').Renderer} * @returns {import('../doclint/documentation').Renderer}
*/ */
function docsLinkRendererForLanguage(language) { function docsLinkRendererForLanguage(language, outputType) {
const languagePath = languageToRelativeDocsPath(language); const languagePath = languageToRelativeDocsPath(language);
return ({ clazz, member, param, option }) => { return ({ clazz, member, param, option }) => {
if (param) if (param)
return `\`${param}\``; return `\`${param}\``;
if (option) if (option)
return `\`${option}\``; return `\`${option}\``;
if (clazz) if (clazz) {
return `{@link ${clazz.name}}`; if (outputType === 'Types')
return `{@link ${clazz.name}}`;
if (outputType === 'ReleaseNotesMd')
return createClassMarkdownLink(languagePath, clazz);
throw new Error(`Unexpected output type ${outputType}`);
}
if (!member || !member.clazz) if (!member || !member.clazz)
throw new Error('Internal error'); throw new Error('Internal error');
const className = member.clazz.varName === 'playwrightAssertions' ? '' : member.clazz.varName + '.'; const className = member.clazz.varName === 'playwrightAssertions' ? '' : member.clazz.varName + '.';

View file

@ -81,7 +81,7 @@ class TypesGenerator {
* @returns {Promise<string>} * @returns {Promise<string>}
*/ */
async generateTypes(overridesFile) { async generateTypes(overridesFile) {
this.documentation.setLinkRenderer(docsLinkRendererForLanguage('js')); this.documentation.setLinkRenderer(docsLinkRendererForLanguage('js', 'Types'));
this.documentation.setCodeGroupsTransformer('js', tabs => tabs.filter(tab => tab.value === 'ts').map(tab => tab.spec)); this.documentation.setCodeGroupsTransformer('js', tabs => tabs.filter(tab => tab.value === 'ts').map(tab => tab.spec));
this.documentation.generateSourceCodeComments(); this.documentation.generateSourceCodeComments();

View file

@ -40,7 +40,7 @@ if (language === 'js') {
.mergeWith(parseApi(path.join(documentationRoot, 'test-reporter-api'))); .mergeWith(parseApi(path.join(documentationRoot, 'test-reporter-api')));
} }
documentation.setLinkRenderer(docsLinkRendererForLanguage(language)); documentation.setLinkRenderer(docsLinkRendererForLanguage(language, 'ReleaseNotesMd'));
const content = fs.readFileSync(path.join(documentationRoot, `release-notes-${language}.md`)).toString(); const content = fs.readFileSync(path.join(documentationRoot, `release-notes-${language}.md`)).toString();
let nodes = md.parse(content); let nodes = md.parse(content);
documentation.renderLinksInNodes(nodes); documentation.renderLinksInNodes(nodes);