From b44dc1cde495be61899f20b9d3b6cfbaf804602f Mon Sep 17 00:00:00 2001 From: Yury Semikhatsky Date: Wed, 10 Apr 2024 09:50:55 -0700 Subject: [PATCH] chore: class link generation in release notes --- utils/doclint/linkUtils.js | 24 +++++++++++++++++++++--- utils/generate_types/index.js | 2 +- utils/render_release_notes.mjs | 2 +- 3 files changed, 23 insertions(+), 5 deletions(-) diff --git a/utils/doclint/linkUtils.js b/utils/doclint/linkUtils.js index 469c3764dd..6380beecdc 100644 --- a/utils/doclint/linkUtils.js +++ b/utils/doclint/linkUtils.js @@ -13,6 +13,9 @@ * See the License for the specific language governing permissions and * limitations under the License. */ + +/** @typedef {'Types'|'ReleaseNotesMd'} OutputType */ + // @ts-check 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})`; }; +/** + * @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 {OutputType} outputType * @returns {import('../doclint/documentation').Renderer} */ -function docsLinkRendererForLanguage(language) { +function docsLinkRendererForLanguage(language, outputType) { const languagePath = languageToRelativeDocsPath(language); return ({ clazz, member, param, option }) => { if (param) return `\`${param}\``; if (option) return `\`${option}\``; - if (clazz) - return `{@link ${clazz.name}}`; + if (clazz) { + 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) throw new Error('Internal error'); const className = member.clazz.varName === 'playwrightAssertions' ? '' : member.clazz.varName + '.'; diff --git a/utils/generate_types/index.js b/utils/generate_types/index.js index 34fa8fae56..24966b1704 100644 --- a/utils/generate_types/index.js +++ b/utils/generate_types/index.js @@ -81,7 +81,7 @@ class TypesGenerator { * @returns {Promise} */ 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.generateSourceCodeComments(); diff --git a/utils/render_release_notes.mjs b/utils/render_release_notes.mjs index e9cdd45253..4d50acb7bc 100644 --- a/utils/render_release_notes.mjs +++ b/utils/render_release_notes.mjs @@ -40,7 +40,7 @@ if (language === 'js') { .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(); let nodes = md.parse(content); documentation.renderLinksInNodes(nodes);