xref: /expo/docs/scripts/test-links.js (revision 33efd9c7)
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