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')); | ||
|  |   } | ||
|  | } |