#!/usr/bin/env node const fs = require('fs') const path = require('path') const globOrig = require('glob') const { promisify } = require('util') const glob = promisify(globOrig) function collectPaths(routes, paths = []) { for (const route of routes) { if (route.path && !route.redirect) { paths.push(route.path) } if (route.routes) { collectPaths(route.routes, paths) } } } async function main() { const manifests = ['errors/manifest.json', 'docs/manifest.json'] let hadError = false for (const manifest of manifests) { const dir = path.dirname(manifest) const files = await glob(path.join(dir, '**/*.md')) const manifestData = JSON.parse( await fs.promises.readFile(manifest, 'utf8') ) const paths = [] collectPaths(manifestData.routes, paths) const missingFiles = files.filter( (file) => !paths.includes(`/${file}`) && file !== 'errors/template.md' ) if (missingFiles.length) { hadError = true console.log(`Missing paths in ${manifest}:\n${missingFiles.join('\n')}`) } else { console.log(`No missing paths in ${manifest}`) } for (const filePath of paths) { if ( !(await fs.promises .access(path.join(process.cwd(), filePath), fs.constants.F_OK) .then(() => true) .catch(() => false)) ) { console.log('Could not find path:', filePath) hadError = true } } } if (hadError) { throw new Error('missing/incorrect manifest items detected see above') } } main() .then(() => console.log('success')) .catch((err) => { console.error(err) process.exit(1) })