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