3 * Copyright 2024 Google Inc.
4 * SPDX-License-Identifier: Apache-2.0
7 /* eslint-disable import/order */
9 import {readFile, writeFile, copyFile} from 'fs/promises';
11 import versionData from './versions.json' with {type: 'json'};
13 import {docgen, spliceIntoSection} from '@puppeteer/docgen';
14 import {execa} from 'execa';
15 import {task} from 'hereby';
16 import semver from 'semver';
18 function addNoTocHeader(markdown) {
20 hide_table_of_contents: true
27 * This logic should match the one in `website/docusaurus.config.js`.
29 function getApiUrl(version) {
30 if (semver.gte(version, '19.3.0')) {
31 return `https://github.com/puppeteer/puppeteer/blob/puppeteer-${version}/docs/api/index.md`;
32 } else if (semver.gte(version, '15.3.0')) {
33 return `https://github.com/puppeteer/puppeteer/blob/${version}/docs/api/index.md`;
35 return `https://github.com/puppeteer/puppeteer/blob/${version}/docs/api.md`;
39 export const docsNgSchematicsTask = task({
40 name: 'docs:ng-schematics',
42 const readme = await readFile('packages/ng-schematics/README.md', 'utf-8');
43 await writeFile('docs/guides/ng-schematics.md', readme);
47 export const docsBrowserSupportTask = task({
48 name: 'docs:supported-browsers',
50 const content = await readFile('docs/supported-browsers.md', {
55 '| Puppeteer | Chrome | Firefox |',
56 '| --------- | ------ | ------- |',
58 for (const [puppeteerVersion, browserVersions] of versionData.versions) {
59 if (puppeteerVersion === 'NEXT') {
63 const puppeteerVer = `[Puppeteer ${puppeteerVersion}](${getApiUrl(
68 if (semver.gte(puppeteerVersion, '23.0.0')) {
69 // Firefox pin need a prefix of `stable_` to be downloaded
70 // For the user that is not relaxant on this page
71 firefoxVer = `[Firefox](https://www.mozilla.org/en-US/firefox/) ${browserVersions.firefox.split('_').at(-1)}`;
72 } else if (semver.gte(puppeteerVersion, '2.1.0')) {
73 firefoxVer = `Firefox Nightly (at the time)`;
75 firefoxVer = `Firefox not supported`;
79 if (semver.gte(puppeteerVersion, '20.0.0')) {
80 chromeVer = `[Chrome for Testing](https://developer.chrome.com/blog/chrome-for-testing/) ${browserVersions.chrome}`;
82 chromeVer = `Chromium ${browserVersions.chrome}`;
85 buffer.push(`| ${puppeteerVer} | ${chromeVer} | ${firefoxVer} |`);
88 'docs/supported-browsers.md',
89 spliceIntoSection('version', content, buffer.join('\n')),
94 export const docsTask = task({
96 dependencies: [docsNgSchematicsTask, docsBrowserSupportTask],
99 const mainPage = await readFile('README.md', 'utf-8');
100 await writeFile('docs/index.md', addNoTocHeader(mainPage));
102 // Generate documentation
103 for (const [name, folder] of [
104 ['browsers', 'browsers-api'],
105 ['puppeteer', 'api'],
107 docgen(`docs/${name}.api.json`, `docs/${folder}`);
110 // Update main @puppeteer/browsers page.
111 const readme = await readFile('packages/browsers/README.md', 'utf-8');
112 const index = await readFile('docs/browsers-api/index.md', 'utf-8');
114 'docs/browsers-api/index.md',
115 index.replace('# API Reference', readme),
118 // Copy combined changelog.
119 await copyFile('CHANGELOG.md', 'docs/CHANGELOG.md');
121 // Format everything.
122 await execa('prettier', ['--ignore-path', 'none', '--write', 'docs']);