It is useful for manually checking that all guides/examples/images have owners in `.github/CODEOWNERS`, but is not used for automatic verification (e.g. on CI) for now. PR Close #28597
		
			
				
	
	
		
			88 lines
		
	
	
		
			3.1 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			88 lines
		
	
	
		
			3.1 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
| 'use strict';
 | |
| 
 | |
| // Imports
 | |
| const fs = require('fs');
 | |
| const path = require('path');
 | |
| 
 | |
| // Constants
 | |
| const PROJECT_ROOT_DIR = path.resolve(__dirname, '../..');
 | |
| const CODEOWNERS_PATH = path.resolve(PROJECT_ROOT_DIR, '.github/CODEOWNERS');
 | |
| const AIO_CONTENT_DIR = path.resolve(PROJECT_ROOT_DIR, 'aio/content');
 | |
| const AIO_GUIDES_DIR = path.resolve(AIO_CONTENT_DIR, 'guide');
 | |
| const AIO_GUIDE_IMAGES_DIR = path.resolve(AIO_CONTENT_DIR, 'images/guide');
 | |
| const AIO_GUIDE_EXAMPLES_DIR = path.resolve(AIO_CONTENT_DIR, 'examples');
 | |
| 
 | |
| // Run
 | |
| _main();
 | |
| 
 | |
| // Functions - Definitions
 | |
| function _main() {
 | |
|   const {guides: acGuidePaths, images: acGuideImagesPaths, examples: acExamplePaths} = getPathsFromAioContent();
 | |
|   const {guides: coGuidePaths, images: coGuideImagesPaths, examples: coExamplePaths} = getPathsFromCodeowners();
 | |
| 
 | |
|   const guidesDiff = arrayDiff(acGuidePaths, coGuidePaths);
 | |
|   const imagesDiff = arrayDiff(acGuideImagesPaths, coGuideImagesPaths);
 | |
|   const examplesDiff = arrayDiff(acExamplePaths, coExamplePaths);
 | |
|   const hasDiff = !!(guidesDiff.diffCount || imagesDiff.diffCount || examplesDiff.diffCount);
 | |
| 
 | |
|   if (hasDiff) {
 | |
|     const expectedGuidesSrc = path.relative(PROJECT_ROOT_DIR, AIO_GUIDES_DIR);
 | |
|     const expectedImagesSrc = path.relative(PROJECT_ROOT_DIR, AIO_GUIDE_IMAGES_DIR);
 | |
|     const expectedExamplesSrc = path.relative(PROJECT_ROOT_DIR, AIO_GUIDE_EXAMPLES_DIR);
 | |
|     const actualSrc = path.relative(PROJECT_ROOT_DIR, CODEOWNERS_PATH);
 | |
| 
 | |
|     reportDiff(guidesDiff, expectedGuidesSrc, actualSrc);
 | |
|     reportDiff(imagesDiff, expectedImagesSrc, actualSrc);
 | |
|     reportDiff(examplesDiff, expectedExamplesSrc, actualSrc);
 | |
|   }
 | |
| 
 | |
|   process.exit(hasDiff ? 1 : 0);
 | |
| }
 | |
| 
 | |
| function arrayDiff(expected, actual) {
 | |
|   const missing = expected.filter(x => !actual.includes(x)).sort();
 | |
|   const extra = actual.filter(x => !expected.includes(x)).sort();
 | |
| 
 | |
|   return {missing, extra, diffCount: missing.length + extra.length};
 | |
| }
 | |
| 
 | |
| function getPathsFromAioContent() {
 | |
|   return {
 | |
|     guides: fs.readdirSync(AIO_GUIDES_DIR),
 | |
|     images: fs.readdirSync(AIO_GUIDE_IMAGES_DIR),
 | |
|     examples: fs.readdirSync(AIO_GUIDE_EXAMPLES_DIR).
 | |
|       filter(name => fs.statSync(`${AIO_GUIDE_EXAMPLES_DIR}/${name}`).isDirectory()),
 | |
|   };
 | |
| }
 | |
| 
 | |
| function getPathsFromCodeowners() {
 | |
|   const guidesOrImagesPathRe = /^\/aio\/content\/(?:(images\/)?guide|(examples))\/([^\s/]+)/;
 | |
| 
 | |
|   return fs.
 | |
|     readFileSync(CODEOWNERS_PATH, 'utf8').
 | |
|     split('\n').
 | |
|     map(l => l.trim().match(guidesOrImagesPathRe)).
 | |
|     filter(m => m).
 | |
|     reduce((aggr, [, isImage, isExample, path]) => {
 | |
|       const list = isExample ? aggr.examples :
 | |
|                    isImage   ? aggr.images :
 | |
|                                aggr.guides;
 | |
|       list.push(path);
 | |
|       return aggr;
 | |
|     }, {guides: [], images: [], examples: []});
 | |
| }
 | |
| 
 | |
| function reportDiff(diff, expectedSrc, actualSrc) {
 | |
|   if (diff.missing.length) {
 | |
|     console.error(
 | |
|         `\nEntries in '${expectedSrc}' but not in '${actualSrc}':\n` +
 | |
|         diff.missing.map(x => `  - ${x}`).join('\n'));
 | |
|   }
 | |
| 
 | |
|   if (diff.extra.length) {
 | |
|     console.error(
 | |
|         `\nEntries in '${actualSrc}' but not in '${expectedSrc}':\n` +
 | |
|         diff.extra.map(x => `  - ${x}`).join('\n'));
 | |
|   }
 | |
| }
 |