diff --git a/utils/doclint/linkUtils.js b/utils/doclint/linkUtils.js index 469c3764dd82b..89bdabc31661d 100644 --- a/utils/doclint/linkUtils.js +++ b/utils/doclint/linkUtils.js @@ -13,10 +13,14 @@ * 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') +const Documentation = require('./documentation'); -const createMarkdownLink = (languagePath, member, text) => { +function createMarkdownLink(languagePath, member, text) { const className = toKebabCase(member.clazz.name); const memberName = toKebabCase(member.name); let hash = null; @@ -27,19 +31,34 @@ const createMarkdownLink = (languagePath, member, text) => { return `[${text}](https://playwright.dev${languagePath}/docs/api/class-${member.clazz.name.toLowerCase()}#${hash})`; }; +/** + * @param {string} languagePath + * @param {Documentation.Class} clazz + * @returns {string} + */ +function createClassMarkdownLink(languagePath, clazz) { + return `[${clazz.name}](https://playwright.dev${languagePath}/docs/api/class-${clazz.name.toLowerCase()})`; +}; + /** * @param {string} language - * @returns {import('../doclint/documentation').Renderer} + * @param {OutputType} outputType + * @returns {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 + '.'; @@ -92,7 +111,7 @@ function assertionArgument(className) { } /** - * @param {import('../doclint/documentation').Member[]} args + * @param {Documentation.Member[]} args */ function renderJSSignature(args) { const tokens = []; diff --git a/utils/generate_types/index.js b/utils/generate_types/index.js index 34fa8fae56a29..24966b1704538 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 e9cdd45253648..4d50acb7bcd6a 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);