mirror of
				https://github.com/microsoft/playwright.git
				synced 2025-06-26 21:40:17 +00:00 
			
		
		
		
	* 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.
		
	
			
		
			
				
	
	
		
			122 lines
		
	
	
		
			3.3 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			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();
 |