Herebyfile.mjs (3929B)
1 /** 2 * @license 3 * Copyright 2024 Google Inc. 4 * SPDX-License-Identifier: Apache-2.0 5 */ 6 7 /* eslint-disable import/order */ 8 9 import {readFile, writeFile} from 'fs/promises'; 10 11 import versionData from './versions.json' with {type: 'json'}; 12 13 import {docgen, spliceIntoSection} from '@puppeteer/docgen'; 14 import {execa} from 'execa'; 15 import {task} from 'hereby'; 16 import semver from 'semver'; 17 18 function addNoTocHeader(markdown) { 19 return `--- 20 hide_table_of_contents: true 21 --- 22 23 ${markdown}`; 24 } 25 26 /** 27 * This logic should match the one in `website/docusaurus.config.js`. 28 */ 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`; 34 } else { 35 return `https://github.com/puppeteer/puppeteer/blob/${version}/docs/api.md`; 36 } 37 } 38 39 export const docsNgSchematicsTask = task({ 40 name: 'docs:ng-schematics', 41 run: async () => { 42 const readme = await readFile('packages/ng-schematics/README.md', 'utf-8'); 43 await writeFile('docs/guides/ng-schematics.md', readme); 44 }, 45 }); 46 47 export const docsBrowserSupportTask = task({ 48 name: 'docs:supported-browsers', 49 run: async () => { 50 const content = await readFile('docs/supported-browsers.md', { 51 encoding: 'utf8', 52 }); 53 // Create table view 54 const buffer = [ 55 '| Puppeteer | Chrome | Firefox |', 56 '| --------- | ------ | ------- |', 57 ]; 58 for (const [puppeteerVersion, browserVersions] of versionData.versions) { 59 if (puppeteerVersion === 'NEXT') { 60 continue; 61 } 62 63 const puppeteerVer = `[Puppeteer ${puppeteerVersion}](${getApiUrl( 64 puppeteerVersion, 65 )})`; 66 67 let firefoxVer = ''; 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)`; 74 } else { 75 firefoxVer = `Firefox not supported`; 76 } 77 78 let chromeVer = ''; 79 if (semver.gte(puppeteerVersion, '20.0.0')) { 80 chromeVer = `[Chrome for Testing](https://developer.chrome.com/blog/chrome-for-testing/) ${browserVersions.chrome}`; 81 } else { 82 chromeVer = `Chromium ${browserVersions.chrome}`; 83 } 84 85 buffer.push(`| ${puppeteerVer} | ${chromeVer} | ${firefoxVer} |`); 86 } 87 await writeFile( 88 'docs/supported-browsers.md', 89 spliceIntoSection('version', content, buffer.join('\n')), 90 ); 91 }, 92 }); 93 94 export const docsTask = task({ 95 name: 'docs', 96 dependencies: [docsNgSchematicsTask, docsBrowserSupportTask], 97 run: async () => { 98 // Copy main page. 99 const mainPage = await readFile('README.md', 'utf-8'); 100 await writeFile('docs/index.md', addNoTocHeader(mainPage)); 101 102 // Generate documentation 103 for (const [name, folder] of [ 104 ['browsers', 'browsers-api'], 105 ['puppeteer', 'api'], 106 ]) { 107 docgen(`docs/${name}.api.json`, `docs/${folder}`); 108 } 109 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'); 113 await writeFile( 114 'docs/browsers-api/index.md', 115 index.replace('# API Reference', readme), 116 ); 117 118 // Copy combined changelog. 119 let changelog = await readFile('CHANGELOG.md', 'utf-8'); 120 // Escape for MDX. 121 changelog = changelog.replaceAll('{', '\\{'); 122 await writeFile('docs/CHANGELOG.md', changelog); 123 124 // Format everything. 125 await execa('prettier', ['--ignore-path', 'none', '--write', 'docs']); 126 }, 127 });