1const puppeteer = require('puppeteer'); 2 3const url = process.argv[2]; 4const externalLinks = [ 5 '/versions/latest/workflow/expo-cli/', // https://github.com/expo/expo-cli/blob/master/packages/expo-cli/README.md and https://github.com/expo/expo-cli/blob/master/README.md 6 '/versions/latest/workflow/configuration/', // https://github.com/expo/expo-cli/blob/master/CONTRIBUTING.md and https://github.com/expo/expo-cli/blob/master/packages/expo-cli/src/commands/init.js and https://github.com/expo/expo-cli/blob/master/packages/xdl/src/project/Doctor.js 7 // https://github.com/expo/expo-cli/blob/4e16a55e98e0612f71685ed16b3b5f8405219d4a/packages/xdl/README.md#xdl [Documentation](https://docs.expo.io/versions/devdocs/index.html) 8 '/versions/latest/distribution/building-standalone-apps/#switch-to-push-notification-key-on-ios', // https://github.com/expo/expo-cli/blob/master/packages/expo-cli/src/commands/build/ios/credentials/constants.js 9 '/versions/latest/distribution/building-standalone-apps/#2-configure-appjson', // https://github.com/expo/expo-cli/blob/master/packages/expo-cli/src/commands/build/AndroidBuilder.js 10 '/versions/latest/distribution/building-standalone-apps/#if-you-choose-to-build-for-android', // https://github.com/expo/expo-cli/blob/master/packages/expo-cli/src/commands/build/AndroidBuilder.js 11 '/versions/latest/distribution/uploading-apps/', // https://github.com/expo/expo-cli/blob/master/packages/expo-cli/src/commands/upload/BaseUploader.js 12 '/versions/latest/workflow/linking/', // https://github.com/expo/expo-cli/blob/master/packages/xdl/src/detach/Detach.js 13 '/versions/latest/workflow/configuration/#ios', // https://github.com/expo/expo-cli/blob/master/packages/xdl/src/detach/Detach.js 14 '/versions/latest/guides/splash-screens/#differences-between-environments---android', // https://github.com/expo/expo-cli/blob/master/packages/xdl/src/Android.js 15 '/versions/latest/sdk/overview/', // https://github.com/expo/expo-cli/blob/master/packages/xdl/src/project/Convert.js 16 '/versions/latest/distribution/building-standalone-apps/#2-configure-appjson', // https://github.com/expo/expo-cli/blob/master/packages/expo-cli/src/commands/build/ios/IOSBuilder.js 17 '/versions/latest/guides/configuring-ota-updates/', // https://github.com/expo/expo-cli/blob/master/packages/expo-cli/src/commands/build/BaseBuilder.js 18 '/versions/latest/expokit/eject/', // https://github.com/expo/expo-cli/blob/master/packages/expo-cli/src/commands/eject/Eject.js 19 '/versions/latest/introduction/faq/#can-i-use-nodejs-packages-with-expo', // https://github.com/expo/expo-cli/blob/master/packages/xdl/src/logs/PackagerLogsStream.js 20 '/versions/latest/guides/offline-support/', // https://github.com/expo/expo-cli/tree/master/packages/xdl/caches 21]; 22 23(async () => { 24 try { 25 const notFound = []; 26 const redirectsFailed = []; 27 28 const browser = await puppeteer.launch(); 29 for (const link of externalLinks) { 30 const page = await browser.newPage(); 31 let response = await page.goto(`${url}${link}`); 32 33 if (response.status() == 404) { 34 if ((await page.$$('#redirect-link')).length) { 35 await page.click('#redirect-link'); 36 if ((await page.$$('#__redirect_failed')).length) { 37 redirectsFailed.push(link); 38 } 39 } else { 40 notFound.push(link); 41 } 42 } 43 44 await page.close(); 45 } 46 await browser.close(); 47 48 if (notFound.length || redirectsFailed.length) { 49 if (notFound.length) { 50 console.error(`Pages not found for links: ${notFound.join(',')}`); 51 } else if (redirectsFailed.length) { 52 console.error(`Redirects failed for links: ${redirectsFailed.join(',')}`); 53 } 54 process.exit(-1); 55 } 56 } catch (e) { 57 console.error(e); 58 process.exit(-1); 59 } 60})(); 61