2017-07-31 08:14:19 +00:00
|
|
|
|
/**
|
|
|
|
|
* Copyright 2017 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
|
|
|
|
|
*
|
|
|
|
|
* http://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.
|
|
|
|
|
*/
|
|
|
|
|
|
2022-02-09 14:49:25 +00:00
|
|
|
|
const Message = require('../Message.js');
|
2017-07-31 08:14:19 +00:00
|
|
|
|
|
2020-11-26 10:38:24 +00:00
|
|
|
|
const IS_RELEASE = Boolean(process.env.IS_RELEASE);
|
|
|
|
|
|
2020-05-07 10:54:55 +00:00
|
|
|
|
module.exports.ensureReleasedAPILinks = function (sources, version) {
|
2018-08-09 01:20:20 +00:00
|
|
|
|
// Release version is everything that doesn't include "-".
|
2021-05-12 14:48:30 +00:00
|
|
|
|
const apiLinkRegex =
|
|
|
|
|
/https:\/\/github.com\/puppeteer\/puppeteer\/blob\/v[^/]*\/docs\/api.md/gi;
|
2020-05-07 10:54:55 +00:00
|
|
|
|
const lastReleasedAPI = `https://github.com/puppeteer/puppeteer/blob/v${
|
|
|
|
|
version.split('-')[0]
|
|
|
|
|
}/docs/api.md`;
|
2018-08-09 01:20:20 +00:00
|
|
|
|
|
|
|
|
|
const messages = [];
|
|
|
|
|
for (const source of sources) {
|
|
|
|
|
const text = source.text();
|
|
|
|
|
const newText = text.replace(apiLinkRegex, lastReleasedAPI);
|
|
|
|
|
if (source.setText(newText))
|
|
|
|
|
messages.push(Message.warning(`GEN: updated ${source.projectPath()}`));
|
|
|
|
|
}
|
|
|
|
|
return messages;
|
|
|
|
|
};
|
|
|
|
|
|
2020-05-07 10:54:55 +00:00
|
|
|
|
module.exports.runCommands = function (sources, version) {
|
2018-04-26 00:11:45 +00:00
|
|
|
|
// Release version is everything that doesn't include "-".
|
2020-11-26 10:38:24 +00:00
|
|
|
|
const isReleaseVersion = IS_RELEASE || !version.includes('-');
|
2018-04-26 01:18:08 +00:00
|
|
|
|
|
2017-08-21 23:39:04 +00:00
|
|
|
|
const messages = [];
|
2018-04-26 00:11:45 +00:00
|
|
|
|
const commands = [];
|
2017-08-21 23:39:04 +00:00
|
|
|
|
for (const source of sources) {
|
2017-07-31 08:14:19 +00:00
|
|
|
|
const text = source.text();
|
2020-05-07 10:54:55 +00:00
|
|
|
|
const commandStartRegex = /<!--\s*gen:([a-z-]+)\s*-->/gi;
|
|
|
|
|
const commandEndRegex = /<!--\s*gen:stop\s*-->/gi;
|
2017-07-31 08:14:19 +00:00
|
|
|
|
let start;
|
|
|
|
|
|
2020-05-07 10:54:55 +00:00
|
|
|
|
while ((start = commandStartRegex.exec(text))) {
|
|
|
|
|
// eslint-disable-line no-cond-assign
|
2017-07-31 08:14:19 +00:00
|
|
|
|
commandEndRegex.lastIndex = commandStartRegex.lastIndex;
|
|
|
|
|
const end = commandEndRegex.exec(text);
|
|
|
|
|
if (!end) {
|
2020-05-07 10:54:55 +00:00
|
|
|
|
messages.push(
|
|
|
|
|
Message.error(`Failed to find 'gen:stop' for command ${start[0]}`)
|
|
|
|
|
);
|
2018-04-26 00:11:45 +00:00
|
|
|
|
return messages;
|
2017-07-31 08:14:19 +00:00
|
|
|
|
}
|
2017-07-31 10:23:29 +00:00
|
|
|
|
const name = start[1];
|
|
|
|
|
const from = commandStartRegex.lastIndex;
|
|
|
|
|
const to = end.index;
|
2018-04-26 00:11:45 +00:00
|
|
|
|
const originalText = text.substring(from, to);
|
2020-05-07 10:54:55 +00:00
|
|
|
|
commands.push({ name, from, to, originalText, source });
|
2017-07-31 08:14:19 +00:00
|
|
|
|
commandStartRegex.lastIndex = commandEndRegex.lastIndex;
|
|
|
|
|
}
|
|
|
|
|
}
|
2017-07-31 10:23:29 +00:00
|
|
|
|
|
2017-08-21 23:39:04 +00:00
|
|
|
|
const changedSources = new Set();
|
2017-07-31 10:23:29 +00:00
|
|
|
|
// Iterate commands in reverse order so that edits don't conflict.
|
|
|
|
|
commands.sort((a, b) => b.from - a.from);
|
2017-08-21 23:39:04 +00:00
|
|
|
|
for (const command of commands) {
|
2018-04-26 00:11:45 +00:00
|
|
|
|
let newText = null;
|
2017-08-01 04:14:50 +00:00
|
|
|
|
if (command.name === 'version')
|
2020-11-26 10:38:24 +00:00
|
|
|
|
newText = isReleaseVersion ? `v${version}` : 'Tip-Of-Tree';
|
2018-04-26 00:11:45 +00:00
|
|
|
|
else if (command.name === 'empty-if-release')
|
|
|
|
|
newText = isReleaseVersion ? '' : command.originalText;
|
2018-05-31 21:21:43 +00:00
|
|
|
|
else if (command.name === 'toc')
|
2020-05-07 10:54:55 +00:00
|
|
|
|
newText = generateTableOfContents(
|
|
|
|
|
command.source.text().substring(command.to)
|
|
|
|
|
);
|
2020-10-29 21:24:35 +00:00
|
|
|
|
else if (command.name === 'versions-per-release')
|
|
|
|
|
newText = generateVersionsPerRelease();
|
2018-04-26 00:11:45 +00:00
|
|
|
|
if (newText === null)
|
|
|
|
|
messages.push(Message.error(`Unknown command 'gen:${command.name}'`));
|
2020-05-07 10:54:55 +00:00
|
|
|
|
else if (applyCommand(command, newText)) changedSources.add(command.source);
|
2017-07-31 08:14:19 +00:00
|
|
|
|
}
|
2017-08-22 21:18:07 +00:00
|
|
|
|
for (const source of changedSources)
|
2017-07-31 08:14:19 +00:00
|
|
|
|
messages.push(Message.warning(`GEN: updated ${source.projectPath()}`));
|
|
|
|
|
return messages;
|
|
|
|
|
};
|
|
|
|
|
|
2017-07-31 10:23:29 +00:00
|
|
|
|
/**
|
2018-04-26 00:11:45 +00:00
|
|
|
|
* @param {{name: string, from: number, to: number, source: !Source}} command
|
|
|
|
|
* @param {string} editText
|
2020-06-12 10:38:24 +00:00
|
|
|
|
* @returns {boolean}
|
2017-07-31 10:23:29 +00:00
|
|
|
|
*/
|
2018-04-26 00:11:45 +00:00
|
|
|
|
function applyCommand(command, editText) {
|
|
|
|
|
const text = command.source.text();
|
2020-05-07 10:54:55 +00:00
|
|
|
|
const newText =
|
|
|
|
|
text.substring(0, command.from) + editText + text.substring(command.to);
|
2018-04-26 00:11:45 +00:00
|
|
|
|
return command.source.setText(newText);
|
2017-07-31 10:23:29 +00:00
|
|
|
|
}
|
|
|
|
|
|
2018-05-31 21:21:43 +00:00
|
|
|
|
function generateTableOfContents(mdText) {
|
|
|
|
|
const ids = new Set();
|
2019-04-03 02:08:22 +00:00
|
|
|
|
const titles = [];
|
|
|
|
|
let insideCodeBlock = false;
|
|
|
|
|
for (const aLine of mdText.split('\n')) {
|
|
|
|
|
const line = aLine.trim();
|
|
|
|
|
if (line.startsWith('```')) {
|
|
|
|
|
insideCodeBlock = !insideCodeBlock;
|
|
|
|
|
continue;
|
|
|
|
|
}
|
2020-05-07 10:54:55 +00:00
|
|
|
|
if (!insideCodeBlock && line.startsWith('#')) titles.push(line);
|
2019-04-03 02:08:22 +00:00
|
|
|
|
}
|
2018-05-31 21:21:43 +00:00
|
|
|
|
const tocEntries = [];
|
|
|
|
|
for (const title of titles) {
|
|
|
|
|
const [, nesting, name] = title.match(/^(#+)\s+(.*)$/);
|
2019-04-03 02:08:22 +00:00
|
|
|
|
const delinkifiedName = name.replace(/\[([^\]]+)\]\([^)]+\)/g, '$1');
|
2020-05-07 10:54:55 +00:00
|
|
|
|
const id = delinkifiedName
|
|
|
|
|
.trim()
|
|
|
|
|
.toLowerCase()
|
|
|
|
|
.replace(/\s/g, '-')
|
|
|
|
|
.replace(/[^-0-9a-zа-яё]/gi, '');
|
2018-05-31 21:21:43 +00:00
|
|
|
|
let dedupId = id;
|
|
|
|
|
let counter = 0;
|
2020-05-07 10:54:55 +00:00
|
|
|
|
while (ids.has(dedupId)) dedupId = id + '-' + ++counter;
|
2018-05-31 21:21:43 +00:00
|
|
|
|
ids.add(dedupId);
|
|
|
|
|
tocEntries.push({
|
|
|
|
|
level: nesting.length,
|
2019-04-03 02:08:22 +00:00
|
|
|
|
name: delinkifiedName,
|
2020-05-07 10:54:55 +00:00
|
|
|
|
id: dedupId,
|
2018-05-31 21:21:43 +00:00
|
|
|
|
});
|
|
|
|
|
}
|
|
|
|
|
|
2020-05-07 10:54:55 +00:00
|
|
|
|
const minLevel = Math.min(...tocEntries.map((entry) => entry.level));
|
|
|
|
|
tocEntries.forEach((entry) => (entry.level -= minLevel));
|
|
|
|
|
return (
|
|
|
|
|
'\n' +
|
|
|
|
|
tocEntries
|
|
|
|
|
.map((entry) => {
|
|
|
|
|
const prefix = entry.level % 2 === 0 ? '-' : '*';
|
|
|
|
|
const padding = ' '.repeat(entry.level);
|
|
|
|
|
return `${padding}${prefix} [${entry.name}](#${entry.id})`;
|
|
|
|
|
})
|
|
|
|
|
.join('\n') +
|
|
|
|
|
'\n'
|
|
|
|
|
);
|
2018-05-31 21:21:43 +00:00
|
|
|
|
}
|
2020-10-29 21:24:35 +00:00
|
|
|
|
|
|
|
|
|
const generateVersionsPerRelease = () => {
|
2022-01-26 11:22:20 +00:00
|
|
|
|
const { versionsPerRelease } = require('../../../versions.js');
|
2020-10-29 21:24:35 +00:00
|
|
|
|
const buffer = ['- Releases per Chromium version:'];
|
|
|
|
|
for (const [chromiumVersion, puppeteerVersion] of versionsPerRelease) {
|
|
|
|
|
if (puppeteerVersion === 'NEXT') continue;
|
|
|
|
|
buffer.push(
|
|
|
|
|
` * Chromium ${chromiumVersion} - [Puppeteer ${puppeteerVersion}](https://github.com/puppeteer/puppeteer/blob/${puppeteerVersion}/docs/api.md)`
|
|
|
|
|
);
|
|
|
|
|
}
|
|
|
|
|
buffer.push(
|
|
|
|
|
` * [All releases](https://github.com/puppeteer/puppeteer/releases)`
|
|
|
|
|
);
|
|
|
|
|
|
|
|
|
|
const output = '\n' + buffer.join('\n') + '\n';
|
|
|
|
|
return output;
|
|
|
|
|
};
|