playwright/utils/doclint/generateFullConfigDoc.js
Yury Semikhatsky 81bcf2a53b
docs: document FullReporter API (#30186)
* FullConfig split into FullConfig and ConfigInWorker
* FullProject split into FullProject and ProjectInWorker
* Tests can only access {Config, Project}InWorker, while reporters can
only access Full{Config,Project}. This will allow in the future to
change the reporter API independently from the tests.
* Added documentation for the 4 classes.
2024-04-02 16:15:02 -07:00

122 lines
3.3 KiB
JavaScript

/**
* Copyright (c) Microsoft Corporation.
*
* 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.
*/
// @ts-check
const path = require('path');
const fs = require('fs');
const PROJECT_DIR = path.join(__dirname, '..', '..');
function generateFullConfigClass(fromClassName, toClassName, allowList) {
const allowedNames = new Set(allowList);
const content = fs.readFileSync(path.join(PROJECT_DIR, `docs/src/test-api/class-${fromClassName.toLowerCase()}.md`)).toString();
let sections = content.split('\n## ');
sections = filterAllowedSections(sections, allowedNames);
if (allowedNames.size)
console.log(`Undocumented properties for ${fromClassName}:\n ${[...allowedNames].join('\n ')}`);
sections = changeClassName(sections, fromClassName, toClassName);
sections = replacePropertyDescriptions(sections, fromClassName);
const fullconfig = sections.join('\n## ');
fs.writeFileSync(path.join(PROJECT_DIR, `docs/src/test-api/class-${toClassName.toLowerCase()}.md`), fullconfig);
}
function propertyNameFromSection(section) {
section = section.split('\n')[0];
const match = /\.(\w+)/.exec(section);
if (!match)
return null;
return match[1];
}
function filterAllowedSections(sections, allowedNames) {
return sections.filter(section => {
section = section.split('\n')[0];
const name = propertyNameFromSection(section);
if (!name)
return true;
return allowedNames.delete(name);
});
}
function changeClassName(sections, from, to) {
return sections.map(section => {
const lines = section.split('\n');
lines[0] = lines[0].replace(from, to);
return lines.join('\n');
});
}
function replacePropertyDescriptions(sections, configClassName) {
return sections.map(section => {
const parts = section.split('\n\n');
section = parts[0];
const name = propertyNameFromSection(section);
if (!name)
return `${section}\n`;
return `${section}\n\nSee [\`property: ${configClassName}.${name}\`].\n`;
});
}
function generateFullConfig() {
generateFullConfigClass('TestConfig', 'FullConfig', [
'forbidOnly',
'fullyParallel',
'globalSetup',
'globalTeardown',
'globalTimeout',
'grep',
'grepInvert',
'maxFailures',
'metadata',
'version',
'preserveOutput',
'projects',
'reporter',
'reportSlowTests',
'rootDir',
'quiet',
'shard',
'updateSnapshots',
'workers',
'webServer',
'configFile',
]);
}
function generateFullProject() {
generateFullConfigClass('TestProject', 'FullProject', [
'grep',
'grepInvert',
'metadata',
'name',
'dependencies',
'snapshotDir',
'outputDir',
'repeatEach',
'retries',
'teardown',
'testDir',
'testIgnore',
'testMatch',
'timeout',
'use',
]);
}
generateFullConfig();
generateFullProject();