fix: process documentation during publishing (#8433)

This commit is contained in:
jrandolf 2022-05-30 21:50:34 +02:00 committed by GitHub
parent 54efc2c949
commit d111d19f78
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
18 changed files with 107 additions and 168 deletions

View File

@ -1,4 +1,3 @@
releaseType: node releaseType: node
handleGHRelease: true
primaryBranch: main primaryBranch: main
manifest: true manifest: true

View File

@ -3,10 +3,36 @@ name: Publish
on: on:
push: push:
tags: tags:
- '*' - v*
jobs: jobs:
pre-publish:
runs-on: ubuntu-latest
permissions:
contents: write
steps:
- name: Checkout
uses: actions/checkout@v3
with:
ref: main
- name: Install dependencies
run: npm install
- name: Build
run: |
node utils/generate_version_file.js
IS_PRE_RELEASE=1 npm run doc
- name: Configure git
run: |
git config --global user.name 'actions-bot'
git config --global user.email '<github-actions-bot@google.com>'
- name: Commit and push
run: |
git add -A
git commit -m "chore: freeze current version in code"
git push
publish: publish:
needs: pre-publish
runs-on: ubuntu-latest runs-on: ubuntu-latest
permissions: permissions:
contents: read contents: read
@ -17,6 +43,8 @@ jobs:
run: npm install run: npm install
- name: Build puppeteer - name: Build puppeteer
run: npm run build run: npm run build
- name: Generate release documentation
run: IS_RELEASE=1 npm run doc
- name: Publish puppeteer - name: Publish puppeteer
env: env:
NPM_TOKEN: ${{secrets.NPM_TOKEN_PUPPETEER}} NPM_TOKEN: ${{secrets.NPM_TOKEN_PUPPETEER}}
@ -36,33 +64,3 @@ jobs:
npm config set registry 'https://wombat-dressing-room.appspot.com/' npm config set registry 'https://wombat-dressing-room.appspot.com/'
npm config set '//wombat-dressing-room.appspot.com/:_authToken' '${NPM_TOKEN}' npm config set '//wombat-dressing-room.appspot.com/:_authToken' '${NPM_TOKEN}'
npm publish npm publish
post-publish:
needs: publish
runs-on: ubuntu-latest
permissions:
contents: write
steps:
- name: Checkout
uses: actions/checkout@v3
with:
ref: main
- name: Append `-post` to version
id: post-version
run: |
npm version --no-git-tag-version --no-commit-hooks "$(jq -r .version ./package.json)-post"
echo ::set-output name=VERSION::$(jq -r .version ./package.json)
- name: Build
run: |
npm install
npm run build
npm run doc
- name: Configure git
run: |
git config --global user.name 'actions-bot'
git config --global user.email '<github-actions-bot@google.com>'
- name: Commit and push
run: |
git add -A
git commit -m "chore: bump version to ${{ steps.post-version.outputs.VERSION }}"
git push

View File

@ -1,4 +1,4 @@
#!/bin/sh #!/bin/sh
. "$(dirname "$0")/_/husky.sh" . "$(dirname "$0")/_/husky.sh"
npm run tsc && npm run eslint && npm run doc && npm run ensure-pinned-deps npm run tsc && npm run eslint && npm run doc && npm run prettier && npm run ensure-pinned-deps

View File

@ -14,3 +14,4 @@ CHANGELOG.md
test/assets/ test/assets/
/.local-chromium/ /.local-chromium/
/.local-firefox/ /.local-firefox/
test-ts-types

View File

@ -1,27 +0,0 @@
/**
* Copyright 2020 Google Inc. All rights reserved.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* https://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
module.exports = {
releaseCommitMessageFormat: 'chore(release): mark v{{currentTag}}',
skip: {
tag: true,
},
scripts: {
prerelease: 'node utils/remove_version_suffix.js',
postbump:
'node utils/generate_version_file.js && IS_RELEASE=true npm run doc && git add --update',
},
};

View File

@ -312,17 +312,4 @@ By default, it will use the Chromium revision in `src/revisions.ts` from the `ma
## Releasing to npm ## Releasing to npm
Releasing to npm consists of the following phases: We use [release-please](https://github.com/googleapis/release-please) to automate releases. When a release should be done, check for the release PR in our [pull requests](https://github.com/puppeteer/puppeteer/pulls) and merge it.
1. Source Code: mark a release.
1. Run `npm run release`. (This automatically bumps the version number in `package.json`, populates the changelog, updates the docs, and creates a Git commit for the next step.)
1. Send a PR for the commit created in the previous step.
1. Make sure the PR passes **all checks**.
- **WHY**: there are linters in place that help to avoid unnecessary errors, e.g. [like this](https://github.com/puppeteer/puppeteer/pull/2446)
1. Merge the PR.
1. Once merged, publish the release notes from `CHANGELOG.md` using [GitHubs “draft new release tag” option](https://github.com/puppeteer/puppeteer/releases/new).
- **NOTE**: tag names are prefixed with `'v'`, e.g. for version `1.4.0` the tag is `v1.4.0`.
1. As soon as the Git tag is created by completing the previous step, our CI automatically `npm publish`es the new releases for both the `puppeteer` and `puppeteer-core` packages.
1. Source Code: mark post-release.
1. Bump `package.json` version to the `-post` version, run `npm run doc` to update the “released APIs” section at the top of `docs/api.md` accordingly, and send a PR titled `'chore: bump version to vXXX.YYY.ZZZ-post'` ([example](https://github.com/puppeteer/puppeteer/pull/6808))
- **NOTE**: no other commits should be landed in-between release commit and bump commit.

View File

@ -8,7 +8,7 @@
<img src="https://user-images.githubusercontent.com/10379601/29446482-04f7036a-841f-11e7-9872-91d1fc2ea683.png" height="200" align="right"> <img src="https://user-images.githubusercontent.com/10379601/29446482-04f7036a-841f-11e7-9872-91d1fc2ea683.png" height="200" align="right">
###### [API](https://github.com/puppeteer/puppeteer/blob/v14.1.1/docs/api.md) | [FAQ](#faq) | [Contributing](https://github.com/puppeteer/puppeteer/blob/main/CONTRIBUTING.md) | [Troubleshooting](https://github.com/puppeteer/puppeteer/blob/main/docs/troubleshooting.md) ###### [API](https://github.com/puppeteer/puppeteer/blob/main/docs/api.md) | [FAQ](#faq) | [Contributing](https://github.com/puppeteer/puppeteer/blob/main/CONTRIBUTING.md) | [Troubleshooting](https://github.com/puppeteer/puppeteer/blob/main/docs/troubleshooting.md)
> Puppeteer is a Node library which provides a high-level API to control Chrome or Chromium over the [DevTools Protocol](https://chromedevtools.github.io/devtools-protocol/). Puppeteer runs [headless](https://developers.google.com/web/updates/2017/04/headless-chrome) by default, but can be configured to run full (non-headless) Chrome or Chromium. > Puppeteer is a Node library which provides a high-level API to control Chrome or Chromium over the [DevTools Protocol](https://chromedevtools.github.io/devtools-protocol/). Puppeteer runs [headless](https://developers.google.com/web/updates/2017/04/headless-chrome) by default, but can be configured to run full (non-headless) Chrome or Chromium.
@ -39,7 +39,7 @@ npm i puppeteer
# or "yarn add puppeteer" # or "yarn add puppeteer"
``` ```
Note: When you install Puppeteer, it downloads a recent version of Chromium (~170MB Mac, ~282MB Linux, ~280MB Win) that is guaranteed to work with the API. To skip the download, download into another path, or download a different browser, see [Environment variables](https://github.com/puppeteer/puppeteer/blob/v14.1.1/docs/api.md#environment-variables). Note: When you install Puppeteer, it downloads a recent version of Chromium (~170MB Mac, ~282MB Linux, ~280MB Win) that is guaranteed to work with the API. To skip the download, download into another path, or download a different browser, see [Environment variables](https://github.com/puppeteer/puppeteer/blob/main/docs/api.md#environment-variables).
### puppeteer-core ### puppeteer-core
@ -63,7 +63,7 @@ Note: Prior to v1.18.1, Puppeteer required at least Node v6.4.0. Versions from v
Node 8.9.0+. Starting from v3.0.0 Puppeteer starts to rely on Node 10.18.1+. All examples below use async/await which is only supported in Node v7.6.0 or greater. Node 8.9.0+. Starting from v3.0.0 Puppeteer starts to rely on Node 10.18.1+. All examples below use async/await which is only supported in Node v7.6.0 or greater.
Puppeteer will be familiar to people using other browser testing frameworks. You create an instance Puppeteer will be familiar to people using other browser testing frameworks. You create an instance
of `Browser`, open pages, and then manipulate them with [Puppeteer's API](https://github.com/puppeteer/puppeteer/blob/v14.1.1/docs/api.md#). of `Browser`, open pages, and then manipulate them with [Puppeteer's API](https://github.com/puppeteer/puppeteer/blob/main/docs/api.md#).
**Example** - navigating to https://example.com and saving a screenshot as _example.png_: **Example** - navigating to https://example.com and saving a screenshot as _example.png_:
@ -88,7 +88,7 @@ Execute script on the command line
node example.js node example.js
``` ```
Puppeteer sets an initial page size to 800×600px, which defines the screenshot size. The page size can be customized with [`Page.setViewport()`](https://github.com/puppeteer/puppeteer/blob/v14.1.1/docs/api.md#pagesetviewportviewport). Puppeteer sets an initial page size to 800×600px, which defines the screenshot size. The page size can be customized with [`Page.setViewport()`](https://github.com/puppeteer/puppeteer/blob/main/docs/api.md#pagesetviewportviewport).
**Example** - create a PDF. **Example** - create a PDF.
@ -115,7 +115,7 @@ Execute script on the command line
node hn.js node hn.js
``` ```
See [`Page.pdf()`](https://github.com/puppeteer/puppeteer/blob/v14.1.1/docs/api.md#pagepdfoptions) for more information about creating pdfs. See [`Page.pdf()`](https://github.com/puppeteer/puppeteer/blob/main/docs/api.md#pagepdfoptions) for more information about creating pdfs.
**Example** - evaluate script in the context of the page **Example** - evaluate script in the context of the page
@ -150,7 +150,7 @@ Execute script on the command line
node get-dimensions.js node get-dimensions.js
``` ```
See [`Page.evaluate()`](https://github.com/puppeteer/puppeteer/blob/v14.1.1/docs/api.md#pageevaluatepagefunction-args) for more information on `evaluate` and related methods like `evaluateOnNewDocument` and `exposeFunction`. See [`Page.evaluate()`](https://github.com/puppeteer/puppeteer/blob/main/docs/api.md#pageevaluatepagefunction-args) for more information on `evaluate` and related methods like `evaluateOnNewDocument` and `exposeFunction`.
<!-- [END getstarted] --> <!-- [END getstarted] -->
@ -160,7 +160,7 @@ See [`Page.evaluate()`](https://github.com/puppeteer/puppeteer/blob/v14.1.1/docs
**1. Uses Headless mode** **1. Uses Headless mode**
Puppeteer launches Chromium in [headless mode](https://developers.google.com/web/updates/2017/04/headless-chrome). To launch a full version of Chromium, set the [`headless` option](https://github.com/puppeteer/puppeteer/blob/v14.1.1/docs/api.md#puppeteerlaunchoptions) when launching a browser: Puppeteer launches Chromium in [headless mode](https://developers.google.com/web/updates/2017/04/headless-chrome). To launch a full version of Chromium, set the [`headless` option](https://github.com/puppeteer/puppeteer/blob/main/docs/api.md#puppeteerlaunchoptions) when launching a browser:
```js ```js
const browser = await puppeteer.launch({ headless: false }); // default is true const browser = await puppeteer.launch({ headless: false }); // default is true
@ -176,7 +176,7 @@ pass in the executable's path when creating a `Browser` instance:
const browser = await puppeteer.launch({ executablePath: '/path/to/Chrome' }); const browser = await puppeteer.launch({ executablePath: '/path/to/Chrome' });
``` ```
You can also use Puppeteer with Firefox Nightly (experimental support). See [`Puppeteer.launch()`](https://github.com/puppeteer/puppeteer/blob/v14.1.1/docs/api.md#puppeteerlaunchoptions) for more information. You can also use Puppeteer with Firefox Nightly (experimental support). See [`Puppeteer.launch()`](https://github.com/puppeteer/puppeteer/blob/main/docs/api.md#puppeteerlaunchoptions) for more information.
See [`this article`](https://www.howtogeek.com/202825/what%E2%80%99s-the-difference-between-chromium-and-chrome/) for a description of the differences between Chromium and Chrome. [`This article`](https://chromium.googlesource.com/chromium/src/+/refs/heads/main/docs/chromium_browser_vs_google_chrome.md) describes some differences for Linux users. See [`this article`](https://www.howtogeek.com/202825/what%E2%80%99s-the-difference-between-chromium-and-chrome/) for a description of the differences between Chromium and Chrome. [`This article`](https://chromium.googlesource.com/chromium/src/+/refs/heads/main/docs/chromium_browser_vs_google_chrome.md) describes some differences for Linux users.
@ -188,7 +188,7 @@ Puppeteer creates its own browser user profile which it **cleans up on every run
## Resources ## Resources
- [API Documentation](https://github.com/puppeteer/puppeteer/blob/v14.1.1/docs/api.md) - [API Documentation](https://github.com/puppeteer/puppeteer/blob/main/docs/api.md)
- [Examples](https://github.com/puppeteer/puppeteer/tree/main/examples/) - [Examples](https://github.com/puppeteer/puppeteer/tree/main/examples/)
- [Community list of Puppeteer resources](https://github.com/transitive-bullshit/awesome-puppeteer) - [Community list of Puppeteer resources](https://github.com/transitive-bullshit/awesome-puppeteer)
@ -330,7 +330,7 @@ See [Contributing](https://github.com/puppeteer/puppeteer/blob/main/CONTRIBUTING
Official Firefox support is currently experimental. The ongoing collaboration with Mozilla aims to support common end-to-end testing use cases, for which developers expect cross-browser coverage. The Puppeteer team needs input from users to stabilize Firefox support and to bring missing APIs to our attention. Official Firefox support is currently experimental. The ongoing collaboration with Mozilla aims to support common end-to-end testing use cases, for which developers expect cross-browser coverage. The Puppeteer team needs input from users to stabilize Firefox support and to bring missing APIs to our attention.
From Puppeteer v2.1.0 onwards you can specify [`puppeteer.launch({product: 'firefox'})`](https://github.com/puppeteer/puppeteer/blob/v14.1.1/docs/api.md#puppeteerlaunchoptions) to run your Puppeteer scripts in Firefox Nightly, without any additional custom patches. While [an older experiment](https://www.npmjs.com/package/puppeteer-firefox) required a patched version of Firefox, [the current approach](https://wiki.mozilla.org/Remote) works with “stock” Firefox. From Puppeteer v2.1.0 onwards you can specify [`puppeteer.launch({product: 'firefox'})`](https://github.com/puppeteer/puppeteer/blob/main/docs/api.md#puppeteerlaunchoptions) to run your Puppeteer scripts in Firefox Nightly, without any additional custom patches. While [an older experiment](https://www.npmjs.com/package/puppeteer-firefox) required a patched version of Firefox, [the current approach](https://wiki.mozilla.org/Remote) works with “stock” Firefox.
We will continue to collaborate with other browser vendors to bring Puppeteer support to browsers such as Safari. We will continue to collaborate with other browser vendors to bring Puppeteer support to browsers such as Safari.
This effort includes exploration of a standard for executing cross-browser commands (instead of relying on the non-standard DevTools Protocol used by Chrome). This effort includes exploration of a standard for executing cross-browser commands (instead of relying on the non-standard DevTools Protocol used by Chrome).
@ -433,7 +433,7 @@ await page.evaluate(() => {
You may find that Puppeteer does not behave as expected when controlling pages that incorporate audio and video. (For example, [video playback/screenshots is likely to fail](https://github.com/puppeteer/puppeteer/issues/291).) There are two reasons for this: You may find that Puppeteer does not behave as expected when controlling pages that incorporate audio and video. (For example, [video playback/screenshots is likely to fail](https://github.com/puppeteer/puppeteer/issues/291).) There are two reasons for this:
- Puppeteer is bundled with Chromium — not Chrome — and so by default, it inherits all of [Chromium's media-related limitations](https://www.chromium.org/audio-video). This means that Puppeteer does not support licensed formats such as AAC or H.264. (However, it is possible to force Puppeteer to use a separately-installed version Chrome instead of Chromium via the [`executablePath` option to `puppeteer.launch`](https://github.com/puppeteer/puppeteer/blob/v14.1.1/docs/api.md#puppeteerlaunchoptions). You should only use this configuration if you need an official release of Chrome that supports these media formats.) - Puppeteer is bundled with Chromium — not Chrome — and so by default, it inherits all of [Chromium's media-related limitations](https://www.chromium.org/audio-video). This means that Puppeteer does not support licensed formats such as AAC or H.264. (However, it is possible to force Puppeteer to use a separately-installed version Chrome instead of Chromium via the [`executablePath` option to `puppeteer.launch`](https://github.com/puppeteer/puppeteer/blob/main/docs/api.md#puppeteerlaunchoptions). You should only use this configuration if you need an official release of Chrome that supports these media formats.)
- Since Puppeteer (in all configurations) controls a desktop version of Chromium/Chrome, features that are only supported by the mobile version of Chrome are not supported. This means that Puppeteer [does not support HTTP Live Streaming (HLS)](https://caniuse.com/#feat=http-live-streaming). - Since Puppeteer (in all configurations) controls a desktop version of Chromium/Chrome, features that are only supported by the mobile version of Chrome are not supported. This means that Puppeteer [does not support HTTP Live Streaming (HLS)](https://caniuse.com/#feat=http-live-streaming).
#### Q: I am having trouble installing / running Puppeteer in my test environment. Where should I look for help? #### Q: I am having trouble installing / running Puppeteer in my test environment. Where should I look for help?

View File

@ -44,7 +44,7 @@
"commitlint": "commitlint --from=HEAD~1", "commitlint": "commitlint --from=HEAD~1",
"prettier": "prettier --check .", "prettier": "prettier --check .",
"prettier-fix": "prettier --write .", "prettier-fix": "prettier --write .",
"lint": "npm run eslint && npm run build && npm run doc && npm run prettier", "lint": "npm run build && npm run eslint && npm run doc && npm run prettier",
"doc": "node utils/doclint/cli.js", "doc": "node utils/doclint/cli.js",
"generate-api-docs-for-testing": "commonmark docs/api.md > docs/api.html", "generate-api-docs-for-testing": "commonmark docs/api.md > docs/api.html",
"clean-lib": "rimraf lib", "clean-lib": "rimraf lib",

View File

@ -1,5 +1,4 @@
{ {
"last-release-sha": "d4321e53c909c7ecf90f5f27d3a136cba176f40b",
"packages": { "packages": {
".": { ".": {
"releaseType": "node", "releaseType": "node",

View File

@ -6,9 +6,6 @@
"scripts": { "scripts": {
"compile": "../../node_modules/.bin/tsc" "compile": "../../node_modules/.bin/tsc"
}, },
"devDependencies": {
"typescript": "4.2.4"
},
"dependencies": { "dependencies": {
"puppeteer": "file:../../puppeteer.tgz" "puppeteer": "file:../../puppeteer.tgz"
} }

View File

@ -6,9 +6,6 @@
"scripts": { "scripts": {
"compile": "../../node_modules/.bin/tsc" "compile": "../../node_modules/.bin/tsc"
}, },
"devDependencies": {
"typescript": "4.2.4"
},
"dependencies": { "dependencies": {
"puppeteer": "file:../../puppeteer.tgz" "puppeteer": "file:../../puppeteer.tgz"
} }

View File

@ -6,9 +6,6 @@
"scripts": { "scripts": {
"compile": "../../node_modules/.bin/tsc" "compile": "../../node_modules/.bin/tsc"
}, },
"devDependencies": {
"typescript": "4.2.4"
},
"dependencies": { "dependencies": {
"puppeteer": "file:../../puppeteer.tgz" "puppeteer": "file:../../puppeteer.tgz"
} }

View File

@ -6,9 +6,6 @@
"scripts": { "scripts": {
"compile": "../../node_modules/.bin/tsc" "compile": "../../node_modules/.bin/tsc"
}, },
"devDependencies": {
"typescript": "4.2.4"
},
"dependencies": { "dependencies": {
"puppeteer": "file:../../puppeteer.tgz" "puppeteer": "file:../../puppeteer.tgz"
} }

View File

@ -6,9 +6,6 @@
"scripts": { "scripts": {
"compile": "../../node_modules/.bin/tsc" "compile": "../../node_modules/.bin/tsc"
}, },
"devDependencies": {
"typescript": "4.2.4"
},
"dependencies": { "dependencies": {
"puppeteer": "file:../../puppeteer.tgz" "puppeteer": "file:../../puppeteer.tgz"
} }

View File

@ -6,9 +6,6 @@
"scripts": { "scripts": {
"compile": "../../node_modules/.bin/tsc" "compile": "../../node_modules/.bin/tsc"
}, },
"devDependencies": {
"typescript": "4.2.4"
},
"dependencies": { "dependencies": {
"puppeteer": "file:../../puppeteer.tgz" "puppeteer": "file:../../puppeteer.tgz"
} }

View File

@ -29,6 +29,7 @@ const YELLOW_COLOR = '\x1b[33m';
const RESET_COLOR = '\x1b[0m'; const RESET_COLOR = '\x1b[0m';
const IS_RELEASE = Boolean(process.env.IS_RELEASE); const IS_RELEASE = Boolean(process.env.IS_RELEASE);
const IS_PRE_RELEASE = Boolean(process.env.IS_PRE_RELEASE);
run(); run();
@ -39,7 +40,7 @@ async function run() {
const messages = []; const messages = [];
let changedFiles = false; let changedFiles = false;
if (IS_RELEASE) { if (IS_RELEASE || IS_PRE_RELEASE) {
const versions = await Source.readFile( const versions = await Source.readFile(
path.join(PROJECT_DIR, 'versions.js') path.join(PROJECT_DIR, 'versions.js')
); );
@ -61,9 +62,15 @@ async function run() {
const mdSources = [readme, api, troubleshooting, contributing]; const mdSources = [readme, api, troubleshooting, contributing];
const preprocessor = require('./preprocessor/index.js'); const preprocessor = require('./preprocessor/index.js');
messages.push(...(await preprocessor.runCommands(mdSources, VERSION)));
messages.push( messages.push(
...(await preprocessor.ensureReleasedAPILinks([readme], VERSION)) ...(await preprocessor.runCommands(mdSources, VERSION, IS_RELEASE))
);
messages.push(
...(await preprocessor.ensureReleasedAPILinks(
[readme],
VERSION,
IS_RELEASE
))
); );
const browser = await puppeteer.launch(); const browser = await puppeteer.launch();

View File

@ -16,14 +16,16 @@
const Message = require('../Message.js'); const Message = require('../Message.js');
const IS_RELEASE = Boolean(process.env.IS_RELEASE); module.exports.ensureReleasedAPILinks = function (
sources,
module.exports.ensureReleasedAPILinks = function (sources, version) { version,
isReleaseVersion
) {
// Release version is everything that doesn't include "-". // Release version is everything that doesn't include "-".
const apiLinkRegex = const apiLinkRegex =
/https:\/\/github.com\/puppeteer\/puppeteer\/blob\/v[^/]*\/docs\/api.md/gi; /https:\/\/github.com\/puppeteer\/puppeteer\/blob\/[^/]*\/docs\/api.md/gi;
const lastReleasedAPI = `https://github.com/puppeteer/puppeteer/blob/v${ const lastReleasedAPI = `https://github.com/puppeteer/puppeteer/blob/${
version.split('-')[0] isReleaseVersion ? `v${version}` : 'main'
}/docs/api.md`; }/docs/api.md`;
const messages = []; const messages = [];
@ -36,10 +38,7 @@ module.exports.ensureReleasedAPILinks = function (sources, version) {
return messages; return messages;
}; };
module.exports.runCommands = function (sources, version) { module.exports.runCommands = function (sources, version, isReleaseVersion) {
// Release version is everything that doesn't include "-".
const isReleaseVersion = IS_RELEASE || !version.includes('-');
const messages = []; const messages = [];
const commands = []; const commands = [];
for (const source of sources) { for (const source of sources) {
@ -72,22 +71,31 @@ module.exports.runCommands = function (sources, version) {
commands.sort((a, b) => b.from - a.from); commands.sort((a, b) => b.from - a.from);
for (const command of commands) { for (const command of commands) {
let newText = null; let newText = null;
if (command.name === 'version') switch (command.name) {
newText = isReleaseVersion ? `v${version}` : 'Tip-Of-Tree'; case 'version':
else if (command.name === 'empty-if-release') newText = isReleaseVersion ? `v${version}` : 'Tip-Of-Tree';
newText = isReleaseVersion ? '' : command.originalText; break;
else if (command.name === 'toc') case 'empty-if-release':
newText = generateTableOfContents( newText = isReleaseVersion ? '' : command.originalText;
command.source.text().substring(command.to) break;
); case 'toc':
else if (command.name === 'versions-per-release') newText = generateTableOfContents(
newText = generateVersionsPerRelease(); command.source.text().substring(command.to)
if (newText === null) );
break;
case 'versions-per-release':
newText = generateVersionsPerRelease();
break;
}
if (newText === null) {
messages.push(Message.error(`Unknown command 'gen:${command.name}'`)); messages.push(Message.error(`Unknown command 'gen:${command.name}'`));
else if (applyCommand(command, newText)) changedSources.add(command.source); } else if (applyCommand(command, newText)) {
changedSources.add(command.source);
}
} }
for (const source of changedSources) for (const source of changedSources) {
messages.push(Message.info(`GEN: updated ${source.projectPath()}`)); messages.push(Message.info(`GEN: updated ${source.projectPath()}`));
}
return messages; return messages;
}; };

View File

@ -20,21 +20,6 @@ const expect = require('expect');
describe('doclint preprocessor specs', function () { describe('doclint preprocessor specs', function () {
describe('ensureReleasedAPILinks', function () { describe('ensureReleasedAPILinks', function () {
it('should work with non-release version', function () {
const source = new Source(
'doc.md',
`
[API](https://github.com/puppeteer/puppeteer/blob/v1.1.0/docs/api.md#class-page)
`
);
const messages = ensureReleasedAPILinks([source], '1.3.0-post');
expect(messages.length).toBe(1);
expect(messages[0].type).toBe('warning');
expect(messages[0].text).toContain('doc.md');
expect(source.text()).toBe(`
[API](https://github.com/puppeteer/puppeteer/blob/v1.3.0/docs/api.md#class-page)
`);
});
it('should work with release version', function () { it('should work with release version', function () {
const source = new Source( const source = new Source(
'doc.md', 'doc.md',
@ -42,22 +27,22 @@ describe('doclint preprocessor specs', function () {
[API](https://github.com/puppeteer/puppeteer/blob/v1.1.0/docs/api.md#class-page) [API](https://github.com/puppeteer/puppeteer/blob/v1.1.0/docs/api.md#class-page)
` `
); );
const messages = ensureReleasedAPILinks([source], '1.3.0'); const messages = ensureReleasedAPILinks([source], '1.3.0', true);
expect(messages.length).toBe(1); expect(messages.length).toBe(1);
expect(messages[0].type).toBe('warning'); expect(messages[0].type).toBe('info');
expect(messages[0].text).toContain('doc.md'); expect(messages[0].text).toContain('doc.md');
expect(source.text()).toBe(` expect(source.text()).toBe(`
[API](https://github.com/puppeteer/puppeteer/blob/v1.3.0/docs/api.md#class-page) [API](https://github.com/puppeteer/puppeteer/blob/v1.3.0/docs/api.md#class-page)
`); `);
}); });
it('should keep main branch links intact', function () { it('should keep main branch links intact on non-release', function () {
const source = new Source( const source = new Source(
'doc.md', 'doc.md',
` `
[API](https://github.com/puppeteer/puppeteer/blob/main/docs/api.md#class-page) [API](https://github.com/puppeteer/puppeteer/blob/main/docs/api.md#class-page)
` `
); );
const messages = ensureReleasedAPILinks([source], '1.3.0'); const messages = ensureReleasedAPILinks([source], '1.3.0', false);
expect(messages.length).toBe(0); expect(messages.length).toBe(0);
expect(source.text()).toBe(` expect(source.text()).toBe(`
[API](https://github.com/puppeteer/puppeteer/blob/main/docs/api.md#class-page) [API](https://github.com/puppeteer/puppeteer/blob/main/docs/api.md#class-page)
@ -73,7 +58,7 @@ describe('doclint preprocessor specs', function () {
<!-- gen:unknown-command -->something<!-- gen:stop --> <!-- gen:unknown-command -->something<!-- gen:stop -->
` `
); );
const messages = runCommands([source], '1.1.1'); const messages = runCommands([source], '1.1.1', true);
expect(source.hasUpdatedText()).toBe(false); expect(source.hasUpdatedText()).toBe(false);
expect(messages.length).toBe(1); expect(messages.length).toBe(1);
expect(messages[0].type).toBe('error'); expect(messages[0].type).toBe('error');
@ -87,9 +72,9 @@ describe('doclint preprocessor specs', function () {
Puppeteer <!-- gen:version -->XXX<!-- gen:stop --> Puppeteer <!-- gen:version -->XXX<!-- gen:stop -->
` `
); );
const messages = runCommands([source], '1.2.0'); const messages = runCommands([source], '1.2.0', true);
expect(messages.length).toBe(1); expect(messages.length).toBe(1);
expect(messages[0].type).toBe('warning'); expect(messages[0].type).toBe('info');
expect(messages[0].text).toContain('doc.md'); expect(messages[0].text).toContain('doc.md');
expect(source.text()).toBe(` expect(source.text()).toBe(`
Puppeteer <!-- gen:version -->v1.2.0<!-- gen:stop --> Puppeteer <!-- gen:version -->v1.2.0<!-- gen:stop -->
@ -102,9 +87,9 @@ describe('doclint preprocessor specs', function () {
Puppeteer <!-- gen:version -->XXX<!-- gen:stop --> Puppeteer <!-- gen:version -->XXX<!-- gen:stop -->
` `
); );
const messages = runCommands([source], '1.2.0-post'); const messages = runCommands([source], '1.2.0', false);
expect(messages.length).toBe(1); expect(messages.length).toBe(1);
expect(messages[0].type).toBe('warning'); expect(messages[0].type).toBe('info');
expect(messages[0].text).toContain('doc.md'); expect(messages[0].text).toContain('doc.md');
expect(source.text()).toBe(` expect(source.text()).toBe(`
Puppeteer <!-- gen:version -->Tip-Of-Tree<!-- gen:stop --> Puppeteer <!-- gen:version -->Tip-Of-Tree<!-- gen:stop -->
@ -116,14 +101,14 @@ describe('doclint preprocessor specs', function () {
`Puppeteer v<!-- gEn:version -->WHAT `Puppeteer v<!-- gEn:version -->WHAT
<!-- GEN:stop -->` <!-- GEN:stop -->`
); );
runCommands([source], '1.1.1'); runCommands([source], '1.1.1', true);
expect(source.text()).toBe( expect(source.text()).toBe(
`Puppeteer v<!-- gEn:version -->v1.1.1<!-- GEN:stop -->` `Puppeteer v<!-- gEn:version -->v1.1.1<!-- GEN:stop -->`
); );
}); });
it('should not tolerate missing gen:stop', function () { it('should not tolerate missing gen:stop', function () {
const source = new Source('doc.md', `<!--GEN:version-->`); const source = new Source('doc.md', `<!--GEN:version-->`);
const messages = runCommands([source], '1.2.0'); const messages = runCommands([source], '1.2.0', true);
expect(source.hasUpdatedText()).toBe(false); expect(source.hasUpdatedText()).toBe(false);
expect(messages.length).toBe(1); expect(messages.length).toBe(1);
expect(messages[0].type).toBe('error'); expect(messages[0].type).toBe('error');
@ -138,9 +123,9 @@ describe('doclint preprocessor specs', function () {
<!-- gen:empty-if-release -->XXX<!-- gen:stop --> <!-- gen:empty-if-release -->XXX<!-- gen:stop -->
` `
); );
const messages = runCommands([source], '1.1.1'); const messages = runCommands([source], '1.1.1', true);
expect(messages.length).toBe(1); expect(messages.length).toBe(1);
expect(messages[0].type).toBe('warning'); expect(messages[0].type).toBe('info');
expect(messages[0].text).toContain('doc.md'); expect(messages[0].text).toContain('doc.md');
expect(source.text()).toBe(` expect(source.text()).toBe(`
<!-- gen:empty-if-release --><!-- gen:stop --> <!-- gen:empty-if-release --><!-- gen:stop -->
@ -153,7 +138,7 @@ describe('doclint preprocessor specs', function () {
<!-- gen:empty-if-release -->XXX<!-- gen:stop --> <!-- gen:empty-if-release -->XXX<!-- gen:stop -->
` `
); );
const messages = runCommands([source], '1.1.1-post'); const messages = runCommands([source], '1.1.1', false);
expect(messages.length).toBe(0); expect(messages.length).toBe(0);
expect(source.text()).toBe(` expect(source.text()).toBe(`
<!-- gen:empty-if-release -->XXX<!-- gen:stop --> <!-- gen:empty-if-release -->XXX<!-- gen:stop -->
@ -169,9 +154,9 @@ describe('doclint preprocessor specs', function () {
#### page.$ #### page.$
#### page.$$` #### page.$$`
); );
const messages = runCommands([source], '1.3.0'); const messages = runCommands([source], '1.3.0', true);
expect(messages.length).toBe(1); expect(messages.length).toBe(1);
expect(messages[0].type).toBe('warning'); expect(messages[0].type).toBe('info');
expect(messages[0].text).toContain('doc.md'); expect(messages[0].text).toContain('doc.md');
expect(source.text()).toBe(`<!-- gen:toc --> expect(source.text()).toBe(`<!-- gen:toc -->
- [class: page](#class-page) - [class: page](#class-page)
@ -193,9 +178,9 @@ describe('doclint preprocessor specs', function () {
\`\`\` \`\`\`
` `
); );
const messages = runCommands([source], '1.3.0'); const messages = runCommands([source], '1.3.0', true);
expect(messages.length).toBe(1); expect(messages.length).toBe(1);
expect(messages[0].type).toBe('warning'); expect(messages[0].type).toBe('info');
expect(messages[0].text).toContain('doc.md'); expect(messages[0].text).toContain('doc.md');
expect(source.text()).toBe(`<!-- gen:toc --> expect(source.text()).toBe(`<!-- gen:toc -->
- [class: page](#class-page) - [class: page](#class-page)
@ -214,9 +199,9 @@ describe('doclint preprocessor specs', function () {
### some [link](#foobar) here ### some [link](#foobar) here
` `
); );
const messages = runCommands([source], '1.3.0'); const messages = runCommands([source], '1.3.0', true);
expect(messages.length).toBe(1); expect(messages.length).toBe(1);
expect(messages[0].type).toBe('warning'); expect(messages[0].type).toBe('info');
expect(messages[0].text).toContain('doc.md'); expect(messages[0].text).toContain('doc.md');
expect(source.text()).toBe(`<!-- gen:toc --> expect(source.text()).toBe(`<!-- gen:toc -->
- [some link here](#some-link-here) - [some link here](#some-link-here)
@ -234,9 +219,9 @@ describe('doclint preprocessor specs', function () {
<!-- gen:version -->ZZZ<!-- gen:stop --> <!-- gen:version -->ZZZ<!-- gen:stop -->
` `
); );
const messages = runCommands([source], '1.1.1'); const messages = runCommands([source], '1.1.1', true);
expect(messages.length).toBe(1); expect(messages.length).toBe(1);
expect(messages[0].type).toBe('warning'); expect(messages[0].type).toBe('info');
expect(messages[0].text).toContain('doc.md'); expect(messages[0].text).toContain('doc.md');
expect(source.text()).toBe(` expect(source.text()).toBe(`
<!-- gen:version -->v1.1.1<!-- gen:stop --> <!-- gen:version -->v1.1.1<!-- gen:stop -->