1231b3b26SBartosz Kaszubowskiimport puppeteer from 'puppeteer'; 2cc98028bSBrent Vatne 3cc98028bSBrent Vatneconst url = process.argv[2]; 4469c2847SBartosz Kaszubowski 5469c2847SBartosz Kaszubowskiif (!url) { 6469c2847SBartosz Kaszubowski console.error(`You need to provide the base URL for links as a parameter.`); 7469c2847SBartosz Kaszubowski process.exit(-1); 8469c2847SBartosz Kaszubowski} 9469c2847SBartosz Kaszubowski 10cc98028bSBrent Vatneconst externalLinks = [ 11f442e5cdSBrent Vatne '/versions/latest/workflow/expo-cli/', // https://github.com/expo/expo-cli/blob/main/packages/expo-cli/README.md and https://github.com/expo/expo-cli/blob/main/README.md 12f442e5cdSBrent Vatne '/versions/latest/workflow/configuration/', // https://github.com/expo/expo-cli/blob/main/CONTRIBUTING.md and https://github.com/expo/expo-cli/blob/main/packages/expo-cli/src/commands/init.js and https://github.com/expo/expo-cli/blob/main/packages/xdl/src/project/Doctor.js 1338fcf40fSJames Ide // https://github.com/expo/expo-cli/blob/4e16a55e98e0612f71685ed16b3b5f8405219d4a/packages/xdl/README.md#xdl [Documentation](https://docs.expo.dev/versions/devdocs/index.html) 14f442e5cdSBrent Vatne '/versions/latest/distribution/building-standalone-apps/#switch-to-push-notification-key-on-ios', // https://github.com/expo/expo-cli/blob/main/packages/expo-cli/src/commands/build/ios/credentials/constants.js 15f442e5cdSBrent Vatne '/versions/latest/distribution/building-standalone-apps/#2-configure-appjson', // https://github.com/expo/expo-cli/blob/main/packages/expo-cli/src/commands/build/AndroidBuilder.js 16f442e5cdSBrent Vatne '/versions/latest/distribution/building-standalone-apps/#if-you-choose-to-build-for-android', // https://github.com/expo/expo-cli/blob/main/packages/expo-cli/src/commands/build/AndroidBuilder.js 17*dc0355b4SEvan Bacon '/versions/latest/workflow/linking/', // https://github.com/expo/expo-cli/blob/main/packages/xdl/src/detach/Detach.ts 18f442e5cdSBrent Vatne '/versions/latest/workflow/configuration/#ios', // https://github.com/expo/expo-cli/blob/main/packages/xdl/src/detach/Detach.js 19f442e5cdSBrent Vatne '/versions/latest/guides/splash-screens/#differences-between-environments---android', // https://github.com/expo/expo-cli/blob/main/packages/xdl/src/Android.js 20f442e5cdSBrent Vatne '/versions/latest/sdk/overview/', // https://github.com/expo/expo-cli/blob/main/packages/xdl/src/project/Convert.js 21f442e5cdSBrent Vatne '/versions/latest/distribution/building-standalone-apps/#2-configure-appjson', // https://github.com/expo/expo-cli/blob/main/packages/expo-cli/src/commands/build/ios/IOSBuilder.js 22f442e5cdSBrent Vatne '/versions/latest/introduction/faq/#can-i-use-nodejs-packages-with-expo', // https://github.com/expo/expo-cli/blob/main/packages/xdl/src/logs/PackagerLogsStream.js 23cc98028bSBrent Vatne]; 24cc98028bSBrent Vatne 25cc98028bSBrent Vatne(async () => { 26cc98028bSBrent Vatne try { 27cc98028bSBrent Vatne const notFound = []; 28cc98028bSBrent Vatne const redirectsFailed = []; 29cc98028bSBrent Vatne 30cc98028bSBrent Vatne const browser = await puppeteer.launch(); 31cc98028bSBrent Vatne const page = await browser.newPage(); 32cc98028bSBrent Vatne 33ed5afd0fSNick Novitski for (const link of externalLinks) { 34586106d6SBartłomiej Klocek const response = await page.goto(`${url}${link}`); 35586106d6SBartłomiej Klocek if (response.status() === 404) { 36469c2847SBartosz Kaszubowski await page.waitForFunction( 37469c2847SBartosz Kaszubowski () => document.querySelector('#redirect-link') || document.querySelector('#__not_found'), 385eba5f7fSJon Samp { timeout: 500 } 395eba5f7fSJon Samp ); 40ed5afd0fSNick Novitski if (await page.$('#redirect-link')) { 41586106d6SBartłomiej Klocek await Promise.all([page.waitForNavigation(), page.click('#redirect-link')]); 42d5517a1fSBartosz Kaszubowski console.info(`Redirected from ${link} to ${page.url()}`); 43ed5afd0fSNick Novitski try { 44469c2847SBartosz Kaszubowski await page.waitForFunction( 45469c2847SBartosz Kaszubowski () => 465eba5f7fSJon Samp document.querySelector('#__redirect_failed') || 47469c2847SBartosz Kaszubowski document.querySelector('#__not_found'), 485eba5f7fSJon Samp { timeout: 500 } 495eba5f7fSJon Samp ); 50ed5afd0fSNick Novitski console.debug(`Redirect failed`); 51cc98028bSBrent Vatne redirectsFailed.push(link); 52ed5afd0fSNick Novitski } catch { 53ed5afd0fSNick Novitski console.debug(`Redirect successful`); 54cc98028bSBrent Vatne } 550f614f85SNick Novitski } else { 565eba5f7fSJon Samp console.debug(`Couldn't find ${link}`); 57cc98028bSBrent Vatne notFound.push(link); 58cc98028bSBrent Vatne } 59cc98028bSBrent Vatne } 60cc98028bSBrent Vatne } 61cc98028bSBrent Vatne await browser.close(); 62cc98028bSBrent Vatne 63cc98028bSBrent Vatne if (notFound.length || redirectsFailed.length) { 64cc98028bSBrent Vatne if (notFound.length) { 65cc98028bSBrent Vatne console.error(`Pages not found for links: ${notFound.join(',')}`); 66cc98028bSBrent Vatne } else if (redirectsFailed.length) { 67cc98028bSBrent Vatne console.error(`Redirects failed for links: ${redirectsFailed.join(',')}`); 68cc98028bSBrent Vatne } 69cc98028bSBrent Vatne process.exit(-1); 70cc98028bSBrent Vatne } 71cc98028bSBrent Vatne } catch (e) { 72cc98028bSBrent Vatne console.error(e); 73cc98028bSBrent Vatne process.exit(-1); 74cc98028bSBrent Vatne } 75cc98028bSBrent Vatne})(); 76