From 6ffc631383b47b2289e358d5d904e3d98b56a743 Mon Sep 17 00:00:00 2001 From: Aman Mittal Date: Sun, 1 Mar 2026 10:54:02 +0530 Subject: [PATCH 1/4] [docs] Bump EAS CLI version in reference (#43532) # Why Bump EAS CLI version in reference to 18.0.6. # Checklist - [ ] I added a `changelog.md` entry and rebuilt the package sources according to [this short guide](https://github.com/expo/expo/blob/main/CONTRIBUTING.md#-before-submitting) - [ ] This diff will work correctly for `npx expo prebuild` & EAS Build (eg: updated a module plugin). - [ ] Conforms with the [Documentation Writing Style Guide](https://github.com/expo/expo/blob/main/guides/Expo%20Documentation%20Writing%20Style%20Guide.md) --- docs/pages/eas/cli.mdx | 2 +- docs/ui/components/EASCLIReference/data/eas-cli-commands.json | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/docs/pages/eas/cli.mdx b/docs/pages/eas/cli.mdx index 7325f765e8041d..588b72ed9ec118 100644 --- a/docs/pages/eas/cli.mdx +++ b/docs/pages/eas/cli.mdx @@ -2,7 +2,7 @@ title: EAS CLI reference sidebar_title: EAS CLI description: EAS CLI is a command-line tool that allows you to interact with Expo Application Services (EAS) from your terminal. -cliVersion: 18.0.5 +cliVersion: 18.0.6 --- import { EASCLIReference } from '~/ui/components/EASCLIReference'; diff --git a/docs/ui/components/EASCLIReference/data/eas-cli-commands.json b/docs/ui/components/EASCLIReference/data/eas-cli-commands.json index f3a9f72fedafb8..c7afcad3b93b22 100644 --- a/docs/ui/components/EASCLIReference/data/eas-cli-commands.json +++ b/docs/ui/components/EASCLIReference/data/eas-cli-commands.json @@ -1,8 +1,8 @@ { "source": { "url": "https://raw.githubusercontent.com/expo/eas-cli/main/packages/eas-cli/README.md", - "fetchedAt": "2026-02-25T17:06:26.787Z", - "cliVersion": "18.0.5" + "fetchedAt": "2026-02-28T06:56:56.329Z", + "cliVersion": "18.0.6" }, "totalCommands": 102, "commands": [ From 55e5ccc784afb6829b46bfe4129fb20c6cc35db9 Mon Sep 17 00:00:00 2001 From: Aman Mittal Date: Sun, 1 Mar 2026 12:06:49 +0530 Subject: [PATCH 2/4] [docs] Fix previous /prebuild internal links (#43522) # Why All internal links pointing to `/workflow/prebuild` are hitting a 301 redirect since the page was renamed to `/workflow/continuous-native-generation`. This adds unnecessary redirect hops for readers and shows stale URLs in the browser. # How - Replace `/workflow/prebuild` links across 38 files with the correct destination, using context-appropriate targets: - **CNG page**: used in SDK reference pages, guides, and "learn more" contexts where readers need the full explanation of how prebuild works. - **Glossary**: used for casual "if you use prebuild" mentions in config reference pages and non-SDK docs. - Consolidate a redundant double-link in `more/glossary-of-terms.mdx` where both "CNG" and "Expo Prebuild" linked to the same destination. # Test Plan Verify that no remaining references to `/workflow/prebuild` exist in the docs/pages/ directory. # Checklist - [ ] I added a `changelog.md` entry and rebuilt the package sources according to [this short guide](https://github.com/expo/expo/blob/main/CONTRIBUTING.md#-before-submitting) - [ ] This diff will work correctly for `npx expo prebuild` & EAS Build (eg: updated a module plugin). - [ ] Conforms with the [Documentation Writing Style Guide](https://github.com/expo/expo/blob/main/guides/Expo%20Documentation%20Writing%20Style%20Guide.md) --- docs/pages/bare/using-expo-cli.mdx | 2 +- docs/pages/build-reference/caching.mdx | 2 +- docs/pages/build-reference/easignore.mdx | 2 +- docs/pages/build-reference/ios-capabilities.mdx | 2 +- docs/pages/build-reference/local-builds.mdx | 2 +- docs/pages/core-concepts.mdx | 2 +- docs/pages/deploy/build-project.mdx | 2 +- docs/pages/develop/tools.mdx | 2 +- .../develop/user-interface/splash-screen-and-app-icon.mdx | 2 +- docs/pages/faq.mdx | 6 +++--- docs/pages/guides/adopting-prebuild.mdx | 6 +++--- docs/pages/guides/building-for-tv.mdx | 2 +- docs/pages/guides/permissions.mdx | 2 +- docs/pages/linking/into-your-app.mdx | 2 +- docs/pages/more/create-expo.mdx | 2 +- docs/pages/more/expo-cli.mdx | 6 +++--- docs/pages/more/glossary-of-terms.mdx | 4 ++-- docs/pages/versions/unversioned/config/metro.mdx | 4 ++-- docs/pages/versions/unversioned/config/package-json.mdx | 2 +- docs/pages/versions/unversioned/sdk/build-properties.mdx | 4 ++-- docs/pages/versions/unversioned/sdk/notifications.mdx | 2 +- docs/pages/versions/v53.0.0/config/metro.mdx | 4 ++-- docs/pages/versions/v53.0.0/config/package-json.mdx | 2 +- docs/pages/versions/v53.0.0/sdk/build-properties.mdx | 4 ++-- docs/pages/versions/v53.0.0/sdk/notifications.mdx | 2 +- docs/pages/versions/v53.0.0/sdk/sharing.mdx | 2 +- docs/pages/versions/v54.0.0/config/metro.mdx | 4 ++-- docs/pages/versions/v54.0.0/config/package-json.mdx | 2 +- docs/pages/versions/v54.0.0/sdk/build-properties.mdx | 4 ++-- docs/pages/versions/v54.0.0/sdk/notifications.mdx | 2 +- docs/pages/versions/v54.0.0/sdk/sharing.mdx | 2 +- docs/pages/versions/v55.0.0/config/metro.mdx | 4 ++-- docs/pages/versions/v55.0.0/config/package-json.mdx | 2 +- docs/pages/versions/v55.0.0/sdk/build-properties.mdx | 4 ++-- docs/pages/versions/v55.0.0/sdk/notifications.mdx | 2 +- docs/pages/workflow/configuration.mdx | 4 ++-- docs/pages/workflow/overview.mdx | 2 +- docs/pages/workflow/using-libraries.mdx | 2 +- 38 files changed, 54 insertions(+), 54 deletions(-) diff --git a/docs/pages/bare/using-expo-cli.mdx b/docs/pages/bare/using-expo-cli.mdx index a5e760e7489faf..db619b307c8886 100644 --- a/docs/pages/bare/using-expo-cli.mdx +++ b/docs/pages/bare/using-expo-cli.mdx @@ -32,7 +32,7 @@ Expo CLI commands provide several benefits over the similar commands in `@react- - Instant access to Hermes debugger with j keystroke. - The debugger ships with [React Native DevTools](/debugging/tools/#debugging-with-react-native-devtools). -- [Continuous Native Generation (CNG)](/workflow/continuous-native-generation/) support with [`expo prebuild`](/workflow/prebuild/) for upgrades, white-labeling, easy third-party package setup, and better maintainability of the codebase (by reducing the surface area). +- [Continuous Native Generation (CNG)](/workflow/continuous-native-generation/) support with [`expo prebuild`](/more/glossary-of-terms/#prebuild) for upgrades, white-labeling, easy third-party package setup, and better maintainability of the codebase (by reducing the surface area). - Support for file-based routing with [`expo-router`](/router/introduction/). - [Async bundling](/router/web/async-routes) in development. - Built-in [environment variable support](/guides/environment-variables) and **.env** file integration. diff --git a/docs/pages/build-reference/caching.mdx b/docs/pages/build-reference/caching.mdx index 876ed443089cbb..ceac55ea0cc5b2 100644 --- a/docs/pages/build-reference/caching.mdx +++ b/docs/pages/build-reference/caching.mdx @@ -256,7 +256,7 @@ To disable using our CocoaPods cache server for your builds set the `EAS_BUILD_D } ``` -It is typical to not have your project **Podfile.lock** committed to source control when using [prebuild](/workflow/prebuild) to generate your **ios** directory [remotely at build time](/build-reference/ios-builds). +It is typical to not have your project **Podfile.lock** committed to source control when using [prebuild](/more/glossary-of-terms/#prebuild) to generate your **ios** directory [remotely at build time](/build-reference/ios-builds). It can be useful to cache your **Podfile.lock** to have deterministic builds, but the tradeoff in this case is that, because you don't use the lockfile during local development, your ability to determine when a change is needed and to update specific dependencies is limited. If you cache this file, you may occasionally end up with build errors that require clearing the cache. To cache **Podfile.lock**, add **./ios/Podfile.lock** to the `cache.paths` list in your build profile in **eas.json**. diff --git a/docs/pages/build-reference/easignore.mdx b/docs/pages/build-reference/easignore.mdx index a4c98154f5d77f..667ec70e4f1a4c 100644 --- a/docs/pages/build-reference/easignore.mdx +++ b/docs/pages/build-reference/easignore.mdx @@ -37,7 +37,7 @@ Copy the content of the **.gitignore** file into the **.easignore** file. Then, /coverage ``` -If your project does not contain **android** and **ios** directories, [EAS Build will run Prebuild](/workflow/prebuild/#usage-with-eas-build) to generate these native directories before compilation. +If your project does not contain **android** and **ios** directories, [EAS Build will run Prebuild](/workflow/continuous-native-generation/#usage-with-eas-build) to generate these native directories before compilation. diff --git a/docs/pages/build-reference/ios-capabilities.mdx b/docs/pages/build-reference/ios-capabilities.mdx index d210251dfc43bb..c7e1a9df321828 100644 --- a/docs/pages/build-reference/ios-capabilities.mdx +++ b/docs/pages/build-reference/ios-capabilities.mdx @@ -114,7 +114,7 @@ There are two ways to manually enable Apple capabilities, both systems will requ ### Xcode -> Preferred method for projects that do **not** use [Expo Prebuild](/workflow/prebuild) to continuously generate the native **android** and **ios** directories. +> Preferred method for projects that do **not** use [Expo Prebuild](/more/glossary-of-terms/#prebuild) to continuously generate the native **android** and **ios** directories. 1. Open the **ios** directory in Xcode with `xed ios`. If you don't have an **ios** directory, run `npx expo prebuild -p ios` to generate one. 2. Then follow the steps mentioned in [Add a capability][apple-enable-capability]. diff --git a/docs/pages/build-reference/local-builds.mdx b/docs/pages/build-reference/local-builds.mdx index 2066c4be1bb694..f102c4590443f9 100644 --- a/docs/pages/build-reference/local-builds.mdx +++ b/docs/pages/build-reference/local-builds.mdx @@ -56,7 +56,7 @@ Some of the options available for cloud builds are not available locally. Limita ## App compilation for development and production builds locally -To compile your app locally for development with Expo CLI, use `npx expo run:android` or `npx expo run:ios` commands instead. If you use [Continuous Native Generation](/workflow/continuous-native-generation), you can also run [prebuild](/workflow/prebuild) to generate your **android** and **ios** directories and then proceed to open the projects in the respective IDEs and build them like any native project. For more details, see: +To compile your app locally for development with Expo CLI, use `npx expo run:android` or `npx expo run:ios` commands instead. If you use [Continuous Native Generation](/workflow/continuous-native-generation), you can also run [prebuild](/more/glossary-of-terms/#prebuild) to generate your **android** and **ios** directories and then proceed to open the projects in the respective IDEs and build them like any native project. For more details, see: **Note**: Following the guide below, in step four, when you build the release **.aab** for Android, run `./gradlew app:bundleRelease` from the **android** directory instead of `npx react-native build-android --mode=release`. diff --git a/docs/pages/develop/tools.mdx b/docs/pages/develop/tools.mdx index 41939a7751b8ca..2f50b09654a94c 100644 --- a/docs/pages/develop/tools.mdx +++ b/docs/pages/develop/tools.mdx @@ -25,7 +25,7 @@ The following is a list of common commands that you will use with Expo CLI while | Command | Description | | ------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------- | | `npx expo start` | Starts the development server (whether you are using a development build or Expo Go). | -| `npx expo prebuild` | Generates native Android and iOS directories using [Prebuild](/workflow/prebuild/). | +| `npx expo prebuild` | Generates native Android and iOS directories using [Prebuild](/workflow/continuous-native-generation/). | | `npx expo run:android` | Compiles native Android app locally. | | `npx expo run:ios` | Compiles native iOS app locally. | | `npx expo install package-name` | Used to install a new library or validate and update specific libraries in your project by adding `--fix` option to this command. | diff --git a/docs/pages/develop/user-interface/splash-screen-and-app-icon.mdx b/docs/pages/develop/user-interface/splash-screen-and-app-icon.mdx index c234328d892cba..c3fd9f1d4f1b6e 100644 --- a/docs/pages/develop/user-interface/splash-screen-and-app-icon.mdx +++ b/docs/pages/develop/user-interface/splash-screen-and-app-icon.mdx @@ -135,7 +135,7 @@ To test your new splash screen, build your app for [internal distribution](/tuto -If your app does not use [Expo Prebuild](/workflow/prebuild) (formerly the _managed workflow_) to generate the native **android** and **ios** directories, then changes in the app config will have no effect. For more information, see [how you can customize the configuration manually](https://github.com/expo/expo/tree/main/packages/expo-splash-screen#-installation-in-bare-react-native-projects). +If your app does not use [Expo Prebuild](/more/glossary-of-terms/#prebuild) (formerly the _managed workflow_) to generate the native **android** and **ios** directories, then changes in the app config will have no effect. For more information, see [how you can customize the configuration manually](https://github.com/expo/expo/tree/main/packages/expo-splash-screen#-installation-in-bare-react-native-projects). diff --git a/docs/pages/faq.mdx b/docs/pages/faq.mdx index 5ca5a23125208c..c24618573bc314 100644 --- a/docs/pages/faq.mdx +++ b/docs/pages/faq.mdx @@ -121,7 +121,7 @@ Source: [3.3.1 APIs and Functionality - B. Executable Code](https://developer.ap ## Should I use Expo CLI or React Native Community CLI? -Expo CLI offers the same core functionality as React Native Community CLI (also known as "React Native CLI") with additional features such as automatic [TypeScript setup](/guides/typescript), [web support](/workflow/web), [auto installing compatible libraries](/more/expo-cli/#install), [improved native build commands](/more/expo-cli#compiling), [tunneling](/more/expo-cli#tunneling), [Prebuild](/workflow/prebuild), and [more](/more/expo-cli). +Expo CLI offers the same core functionality as React Native Community CLI (also known as "React Native CLI") with additional features such as automatic [TypeScript setup](/guides/typescript), [web support](/workflow/web), [auto installing compatible libraries](/more/expo-cli/#install), [improved native build commands](/more/expo-cli#compiling), [tunneling](/more/expo-cli#tunneling), [Prebuild](/more/glossary-of-terms/#prebuild), and [more](/more/expo-cli). It can be used simultaneously with React Native Community. Regardless of which CLI you use, you can use any part of the [Expo SDK](/versions/latest/) and [Expo Application Services](/eas) with your project. For more information, see: @@ -145,6 +145,6 @@ Expo Go cannot use third-party libraries that require custom native code and you ## Is ejecting deprecated? -Yes, eject is a deprecated term and is no longer necessary. When Expo was first released, apps had larger native binary sizes and didn't support custom native code without "ejecting". This changed in December 2020 with the release of [EAS Build](/build/introduction) which supports any React Native app. The concept of "ejecting" was replaced by the [`npx expo prebuild`](/workflow/prebuild) command in SDK 41 (April 2021), which continuously generates native projects based on the libraries in your project and the app config (**app.json**). The `expo eject` command was fully deprecated in SDK 46 (August 2022). +Yes, eject is a deprecated term and is no longer necessary. When Expo was first released, apps had larger native binary sizes and didn't support custom native code without "ejecting". This changed in December 2020 with the release of [EAS Build](/build/introduction) which supports any React Native app. The concept of "ejecting" was replaced by the [`npx expo prebuild`](/more/glossary-of-terms/#prebuild) command in SDK 41 (April 2021), which continuously generates native projects based on the libraries in your project and the app config (**app.json**). The `expo eject` command was fully deprecated in SDK 46 (August 2022). -Unlike the previous eject workflow, authors can configure their libraries to work with Expo Prebuild by creating a [config plugin](/config-plugins/introduction/). This means you can use any library with Expo Prebuild. You can also use any custom native code with Expo Prebuild by creating a [development build](/develop/development-builds/introduction/). Learn more in the [Expo Prebuild documentation](/workflow/prebuild). +Unlike the previous eject workflow, authors can configure their libraries to work with Expo Prebuild by creating a [config plugin](/config-plugins/introduction/). This means you can use any library with Expo Prebuild. You can also use any custom native code with Expo Prebuild by creating a [development build](/develop/development-builds/introduction/). Learn more in the [Expo Prebuild documentation](/workflow/continuous-native-generation). diff --git a/docs/pages/guides/adopting-prebuild.mdx b/docs/pages/guides/adopting-prebuild.mdx index 9b4772dea0387e..2c5e45b584abd8 100644 --- a/docs/pages/guides/adopting-prebuild.mdx +++ b/docs/pages/guides/adopting-prebuild.mdx @@ -5,7 +5,7 @@ description: Learn how to adopt Expo Prebuild in a project that was bootstrapped import { DiffBlock, Terminal } from '~/ui/components/Snippet'; -There are [many advantages](/workflow/prebuild#pitch) of using [Expo Prebuild][prebuild] to [continuously generate your native projects](/workflow/continuous-native-generation). This guide will show you how to adopt Expo Prebuild in a project that was bootstrapped with `npx @react-native-community/cli@latest init`. The amount of time it will take to convert your project depends on the amount of custom native changes that you have made to your Android and iOS native projects. This may take a minute or two on a brand new project, and on a large project, it will be much longer. +There are [many advantages](/workflow/continuous-native-generation) of using [Expo Prebuild][prebuild] to [continuously generate your native projects](/workflow/continuous-native-generation). This guide will show you how to adopt Expo Prebuild in a project that was bootstrapped with `npx @react-native-community/cli@latest init`. The amount of time it will take to convert your project depends on the amount of custom native changes that you have made to your Android and iOS native projects. This may take a minute or two on a brand new project, and on a large project, it will be much longer. Adopting prebuild will automatically add support for developing modules with the [Expo native module API][expo-modules-core] by linking `expo-modules-core` natively. You can also use any command from [Expo CLI][cli] in your project. @@ -13,7 +13,7 @@ Adopting prebuild will automatically add support for developing modules with the ## Install the `expo` package -The `expo` package contains the [`npx expo prebuild`](/more/expo-cli/#prebuild) command and indicates which [prebuild template](/workflow/prebuild#templates) to use: +The `expo` package contains the [`npx expo prebuild`](/more/expo-cli/#prebuild) command and indicates which [prebuild template](/workflow/continuous-native-generation#templates) to use: @@ -140,5 +140,5 @@ Prebuild is the tip of the automation iceberg, here are some features you can ad [expo-modules-core]: /modules/module-api/ [dev-client]: /develop/development-builds/introduction/ [config-plugins]: /config-plugins/introduction/ -[prebuild]: /workflow/prebuild +[prebuild]: /workflow/continuous-native-generation [cli]: /more/expo-cli/ diff --git a/docs/pages/guides/building-for-tv.mdx b/docs/pages/guides/building-for-tv.mdx index 5bfb320a6f36ab..e25035eedf0b3a 100644 --- a/docs/pages/guides/building-for-tv.mdx +++ b/docs/pages/guides/building-for-tv.mdx @@ -19,7 +19,7 @@ Using the React Native TV library as the `react-native` dependency in an Expo pr ## Prerequisites -The necessary changes to the native Android and iOS files are minimal and can be automated with a [config plugin](https://github.com/react-native-tvos/config-tv/tree/main/packages/config-tv) if you use [prebuild](/workflow/prebuild/). Below is a list of changes made by the config plugins, which you can alternatively apply manually: +The necessary changes to the native Android and iOS files are minimal and can be automated with a [config plugin](https://github.com/react-native-tvos/config-tv/tree/main/packages/config-tv) if you use [prebuild](/more/glossary-of-terms/#prebuild). Below is a list of changes made by the config plugins, which you can alternatively apply manually: ### Android diff --git a/docs/pages/guides/permissions.mdx b/docs/pages/guides/permissions.mdx index 922070f6968159..f2375e1347d968 100644 --- a/docs/pages/guides/permissions.mdx +++ b/docs/pages/guides/permissions.mdx @@ -35,7 +35,7 @@ The only way to remove permissions that are added by package-level **AndroidMani } ``` -- See [`android.permissions`](/versions/latest/config/app/#permissions) to learn about which permissions are included in the default [prebuild template](/workflow/prebuild#templates). +- See [`android.permissions`](/versions/latest/config/app/#permissions) to learn about which permissions are included in the default [prebuild template](/workflow/continuous-native-generation#templates). - Apps using _dangerous_ or _signature_ permissions without valid reasons **may be rejected by Google**. Ensure you follow the [Android permissions best practices](https://developer.android.com/training/permissions/usage-notes) when submitting your app. - [All available Android `Manifest.permissions`](https://developer.android.com/reference/android/Manifest.permission). diff --git a/docs/pages/linking/into-your-app.mdx b/docs/pages/linking/into-your-app.mdx index 5957ad6e2c46bf..3e1e714c842931 100644 --- a/docs/pages/linking/into-your-app.mdx +++ b/docs/pages/linking/into-your-app.mdx @@ -27,7 +27,7 @@ To provide a link to your app, add a custom string to the [`scheme`](/versions/l After adding a custom scheme to your app, you need to [create a new development build](/develop/development-builds/create-a-build/). Once the app is installed on a device, you can open links within your app using `myapp://`. -If the **custom scheme is not defined**, the app will use `android.package` and `ios.bundleIdentifier` as the default schemes in both development and production builds. This is because [Expo Prebuild](/workflow/prebuild/) automatically adds these properties as custom schemes for Android and iOS. +If the **custom scheme is not defined**, the app will use `android.package` and `ios.bundleIdentifier` as the default schemes in both development and production builds. This is because [Expo Prebuild](/more/glossary-of-terms/#prebuild) automatically adds these properties as custom schemes for Android and iOS. ## Test the deep link diff --git a/docs/pages/more/create-expo.mdx b/docs/pages/more/create-expo.mdx index b0be85bead1e10..0592ea831f6445 100644 --- a/docs/pages/more/create-expo.mdx +++ b/docs/pages/more/create-expo.mdx @@ -53,7 +53,7 @@ You can use the `--template` option to select one of the following templates or | [`blank`](https://github.com/expo/expo/tree/main/templates/expo-template-blank) | Installs minimum required npm dependencies without configuring navigation. | | [`blank-typescript`](https://github.com/expo/expo/tree/main/templates/expo-template-blank-typescript) | A Blank template with TypeScript enabled. | | [`tabs`](https://github.com/expo/expo/tree/main/templates/expo-template-tabs) | Installs and configures file-based routing with Expo Router and TypeScript enabled. | -| [`bare-minimum`](https://github.com/expo/expo/tree/main/templates/expo-template-bare-minimum) | A Blank template with native directories (**android** and **ios**) generated. Runs [`npx expo prebuild`](/workflow/prebuild/) during the setup. | +| [`bare-minimum`](https://github.com/expo/expo/tree/main/templates/expo-template-bare-minimum) | A Blank template with native directories (**android** and **ios**) generated. Runs [`npx expo prebuild`](/workflow/continuous-native-generation) during the setup. | ### `--example` diff --git a/docs/pages/more/expo-cli.mdx b/docs/pages/more/expo-cli.mdx index 9298f9efb23270..cd8ae8307510ab 100644 --- a/docs/pages/more/expo-cli.mdx +++ b/docs/pages/more/expo-cli.mdx @@ -179,7 +179,7 @@ Building locally is useful for developing native modules and [debugging complex If your project does not have the corresponding native directories, the `npx expo prebuild` command will run once to generate the respective directory before building. -For example, if your project does not have an **ios** directory in the root of your project, then `npx expo run:ios` will first run `npx expo prebuild -p ios` before compiling your app. For more information on this process, see [Expo Prebuild](/workflow/prebuild). +For example, if your project does not have an **ios** directory in the root of your project, then `npx expo run:ios` will first run `npx expo prebuild -p ios` before compiling your app. For more information on this process, see [Expo Prebuild](/workflow/continuous-native-generation). **Cross-platform arguments** @@ -364,7 +364,7 @@ This command will be disabled if your project is configured to use `metro` for b -Native source code must be generated before a native app can compile. Expo CLI provides a unique and powerful system called _prebuild_, that generates the native code for your project. To learn more, read the [Expo Prebuild docs](/workflow/prebuild/). +Native source code must be generated before a native app can compile. Expo CLI provides a unique and powerful system called _prebuild_, that generates the native code for your project. To learn more, read the [Expo Prebuild docs](/workflow/continuous-native-generation/). ## Lint @@ -406,7 +406,7 @@ Evaluate the app config (**app.json**, or **app.config.js**) by running: There are three different config types that are generated from the app config: - `public`: The manifest file to use with OTA updates. Think of this like an `index.html` file's `` element but for native apps. -- `prebuild`: The config that is used for [Expo Prebuild](/workflow/prebuild) including async modifiers. This is the only time the config is not serializable. +- `prebuild`: The config that is used for [Expo Prebuild](/workflow/continuous-native-generation) including async modifiers. This is the only time the config is not serializable. - `introspect`: A subset of the `prebuild` config that only shows in-memory modifications like `Info.plist` or **AndroidManifest.xml** changes. Learn more about [introspection](/config-plugins/development-and-debugging/#introspection). ## Install diff --git a/docs/pages/more/glossary-of-terms.mdx b/docs/pages/more/glossary-of-terms.mdx index 523fadd0a16f23..219a2f028e3dba 100644 --- a/docs/pages/more/glossary-of-terms.mdx +++ b/docs/pages/more/glossary-of-terms.mdx @@ -54,7 +54,7 @@ Projects can configure how Babel is used by modifying the [**babel.config.js**]( Describes the approach when the native projects (in the **android** and **ios** directories) are versioned in Git and maintained manually. It's typical for **existing "bare" React Native apps** where you manually make changes to the native projects. There is freedom to customize them but also high maintenance overhead. -This is in contrast to using [app config and prebuild](/workflow/prebuild), where the native projects are not versioned. Instead, they are generated on demand using the `npx expo prebuild`, which is the [recommended approach](/workflow/prebuild/#pitch). +This is in contrast to using [app config and prebuild](/workflow/continuous-native-generation), where the native projects are not versioned. Instead, they are generated on demand using the `npx expo prebuild`, which is the [recommended approach](/workflow/continuous-native-generation). ### Bun @@ -82,7 +82,7 @@ A JavaScript function that is used to append [config mods](#config-mods) to the ### Continuous Native Generation (CNG) -An abstract concept that describes the process of generating native projects from a set of inputs. In the context of Expo, CNG is implemented via the [`prebuild`](#prebuild) command. See [CNG](/workflow/continuous-native-generation/) and [Expo Prebuild](/workflow/prebuild/) for more information. +An abstract concept that describes the process of generating native projects from a set of inputs. In the context of Expo, CNG is implemented via the [`prebuild`](#prebuild) command. See [Continuous Native Generation](/workflow/continuous-native-generation/) for more information. ### create-expo-app diff --git a/docs/pages/versions/unversioned/config/metro.mdx b/docs/pages/versions/unversioned/config/metro.mdx index 2fbffef5336501..c858f12ddf072c 100644 --- a/docs/pages/versions/unversioned/config/metro.mdx +++ b/docs/pages/versions/unversioned/config/metro.mdx @@ -635,9 +635,9 @@ Using a variable in the `Worker` constructor is not supported for bundling. To i ## Bare workflow setup -> This guide is versioned and will need to be revisited when upgrading/downgrading Expo. Alternatively, use [Expo Prebuild](/workflow/prebuild) for fully automated setup. +> This guide is versioned and will need to be revisited when upgrading/downgrading Expo. Alternatively, use [Expo Prebuild](/more/glossary-of-terms/#prebuild) for fully automated setup. -Projects that don't use [Expo Prebuild](/workflow/prebuild) must configure native files to ensure the Expo Metro config is always used to bundle the project. +Projects that don't use [Expo Prebuild](/more/glossary-of-terms/#prebuild) must configure native files to ensure the Expo Metro config is always used to bundle the project. {/* If this isn't done, then features like [aliases](/guides/typescript/#path-aliases-optional), [absolute imports](/guides/typescript/#absolute-imports-optional), asset hashing, and more will not work. */} diff --git a/docs/pages/versions/unversioned/config/package-json.mdx b/docs/pages/versions/unversioned/config/package-json.mdx index 01b148d8cbb67a..0229c98fb267e9 100644 --- a/docs/pages/versions/unversioned/config/package-json.mdx +++ b/docs/pages/versions/unversioned/config/package-json.mdx @@ -82,7 +82,7 @@ By default, the check is enabled and unknown packages are listed. ### `appConfigFieldsNotSyncedCheck` -Expo Doctor checks if your project includes native project directories such as **android** or **ios**. If these directories exist but are not listed in your **.gitignore** or [**.easignore**](/build-reference/easignore) files, Expo Doctor verifies the presence of an app config file. If this file exists, it means your project is configured to use [Prebuild](/workflow/prebuild). +Expo Doctor checks if your project includes native project directories such as **android** or **ios**. If these directories exist but are not listed in your **.gitignore** or [**.easignore**](/build-reference/easignore) files, Expo Doctor verifies the presence of an app config file. If this file exists, it means your project is configured to use [Prebuild](/more/glossary-of-terms/#prebuild). When the **android** or **ios** directories are present, EAS Build does not sync app config properties to the native projects. Expo Doctor throws a warning if these conditions are true. diff --git a/docs/pages/versions/unversioned/sdk/build-properties.mdx b/docs/pages/versions/unversioned/sdk/build-properties.mdx index bafbe2649e27e7..a9d3b7b5d8bea3 100644 --- a/docs/pages/versions/unversioned/sdk/build-properties.mdx +++ b/docs/pages/versions/unversioned/sdk/build-properties.mdx @@ -12,9 +12,9 @@ import { ConfigPluginExample } from '~/ui/components/ConfigSection'; import { Tabs, Tab } from '~/ui/components/Tabs'; `expo-build-properties` is a [config plugin](/config-plugins/introduction/) configuring the native build properties -of your **android/gradle.properties** and **ios/Podfile.properties.json** directories during [Prebuild](/workflow/prebuild). +of your **android/gradle.properties** and **ios/Podfile.properties.json** directories during [Prebuild](/workflow/continuous-native-generation). -> **info** This config plugin configures how [Prebuild command](/workflow/prebuild) generates the native **android** and **ios** directories +> **info** This config plugin configures how [Prebuild command](/workflow/continuous-native-generation/#usage) generates the native **android** and **ios** directories > and therefore cannot be used with projects that don't run `npx expo prebuild` (bare projects). ## Installation diff --git a/docs/pages/versions/unversioned/sdk/notifications.mdx b/docs/pages/versions/unversioned/sdk/notifications.mdx index 75e28c175a9ba8..ee1ed8f805defe 100644 --- a/docs/pages/versions/unversioned/sdk/notifications.mdx +++ b/docs/pages/versions/unversioned/sdk/notifications.mdx @@ -643,7 +643,7 @@ We encourage you to always ensure appropriate channels with informative names ar ### Custom notification icon and colors  -You can configure the `icon` and `color` keys for notification in the project by using the [`expo-notifications` config plugin](#configurable-properties) with [Expo Prebuild](/workflow/prebuild). These are build-time settings, so you'll need to recompile your native Android app with `eas build -p android` or `npx expo run:android` to see the changes. +You can configure the `icon` and `color` keys for notification in the project by using the [`expo-notifications` config plugin](#configurable-properties) with [Expo Prebuild](/workflow/continuous-native-generation). These are build-time settings, so you'll need to recompile your native Android app with `eas build -p android` or `npx expo run:android` to see the changes. For your notification icon, make sure you follow [Google's design guidelines](https://material.io/design/iconography/product-icons.html#design-principles) (the icon must be all white with a transparent background) or else it may not be displayed as intended. diff --git a/docs/pages/versions/v53.0.0/config/metro.mdx b/docs/pages/versions/v53.0.0/config/metro.mdx index 1787d29a63c2f1..0e4288df3f0cf4 100644 --- a/docs/pages/versions/v53.0.0/config/metro.mdx +++ b/docs/pages/versions/v53.0.0/config/metro.mdx @@ -623,9 +623,9 @@ Using a variable in the `Worker` constructor is not supported for bundling. To i ## Bare workflow setup -> This guide is versioned and will need to be revisited when upgrading/downgrading Expo. Alternatively, use [Expo Prebuild](/workflow/prebuild) for fully automated setup. +> This guide is versioned and will need to be revisited when upgrading/downgrading Expo. Alternatively, use [Expo Prebuild](/more/glossary-of-terms/#prebuild) for fully automated setup. -Projects that don't use [Expo Prebuild](/workflow/prebuild) must configure native files to ensure the Expo Metro config is always used to bundle the project. +Projects that don't use [Expo Prebuild](/more/glossary-of-terms/#prebuild) must configure native files to ensure the Expo Metro config is always used to bundle the project. {/* If this isn't done, then features like [aliases](/guides/typescript/#path-aliases-optional), [absolute imports](/guides/typescript/#absolute-imports-optional), asset hashing, and more will not work. */} diff --git a/docs/pages/versions/v53.0.0/config/package-json.mdx b/docs/pages/versions/v53.0.0/config/package-json.mdx index 01b148d8cbb67a..0229c98fb267e9 100644 --- a/docs/pages/versions/v53.0.0/config/package-json.mdx +++ b/docs/pages/versions/v53.0.0/config/package-json.mdx @@ -82,7 +82,7 @@ By default, the check is enabled and unknown packages are listed. ### `appConfigFieldsNotSyncedCheck` -Expo Doctor checks if your project includes native project directories such as **android** or **ios**. If these directories exist but are not listed in your **.gitignore** or [**.easignore**](/build-reference/easignore) files, Expo Doctor verifies the presence of an app config file. If this file exists, it means your project is configured to use [Prebuild](/workflow/prebuild). +Expo Doctor checks if your project includes native project directories such as **android** or **ios**. If these directories exist but are not listed in your **.gitignore** or [**.easignore**](/build-reference/easignore) files, Expo Doctor verifies the presence of an app config file. If this file exists, it means your project is configured to use [Prebuild](/more/glossary-of-terms/#prebuild). When the **android** or **ios** directories are present, EAS Build does not sync app config properties to the native projects. Expo Doctor throws a warning if these conditions are true. diff --git a/docs/pages/versions/v53.0.0/sdk/build-properties.mdx b/docs/pages/versions/v53.0.0/sdk/build-properties.mdx index 8c96991b48d547..ebe53a4b88ca33 100644 --- a/docs/pages/versions/v53.0.0/sdk/build-properties.mdx +++ b/docs/pages/versions/v53.0.0/sdk/build-properties.mdx @@ -12,9 +12,9 @@ import { ConfigPluginExample } from '~/ui/components/ConfigSection'; import { Tabs, Tab } from '~/ui/components/Tabs'; `expo-build-properties` is a [config plugin](/config-plugins/introduction/) configuring the native build properties -of your **android/gradle.properties** and **ios/Podfile.properties.json** directories during [Prebuild](/workflow/prebuild). +of your **android/gradle.properties** and **ios/Podfile.properties.json** directories during [Prebuild](/workflow/continuous-native-generation). -> **info** This config plugin configures how [Prebuild command](/workflow/prebuild) generates the native **android** and **ios** directories +> **info** This config plugin configures how [Prebuild command](/workflow/continuous-native-generation/#usage) generates the native **android** and **ios** directories > and therefore cannot be used with projects that don't run `npx expo prebuild` (bare projects). ## Installation diff --git a/docs/pages/versions/v53.0.0/sdk/notifications.mdx b/docs/pages/versions/v53.0.0/sdk/notifications.mdx index 37422dfde0337f..cc15dc185a5d77 100644 --- a/docs/pages/versions/v53.0.0/sdk/notifications.mdx +++ b/docs/pages/versions/v53.0.0/sdk/notifications.mdx @@ -639,7 +639,7 @@ We encourage you to always ensure appropriate channels with informative names ar ### Custom notification icon and colors  -You can configure the [`notification.icon`](../config/app/#notification) and [`notification.color`](../config/app/#notification) keys in the project's **app.json** if you are using [Expo Prebuild](/workflow/prebuild) or by using the [`expo-notifications` config plugin directly](#configurable-properties). These are build-time settings, so you'll need to recompile your native Android app with `eas build -p android` or `npx expo run:android` to see the changes. +You can configure the [`notification.icon`](../config/app/#notification) and [`notification.color`](../config/app/#notification) keys in the project's **app.json** if you are using [Expo Prebuild](/workflow/continuous-native-generation) or by using the [`expo-notifications` config plugin directly](#configurable-properties). These are build-time settings, so you'll need to recompile your native Android app with `eas build -p android` or `npx expo run:android` to see the changes. For your notification icon, make sure you follow [Google's design guidelines](https://material.io/design/iconography/product-icons.html#design-principles) (the icon must be all white with a transparent background) or else it may not be displayed as intended. diff --git a/docs/pages/versions/v53.0.0/sdk/sharing.mdx b/docs/pages/versions/v53.0.0/sdk/sharing.mdx index 8415f37b5e90d6..18e3ffdcd50e4d 100644 --- a/docs/pages/versions/v53.0.0/sdk/sharing.mdx +++ b/docs/pages/versions/v53.0.0/sdk/sharing.mdx @@ -23,7 +23,7 @@ import { ContentSpotlight } from '~/ui/components/ContentSpotlight'; #### Sharing to your app from other apps -Currently `expo-sharing` only supports sharing _from your app to other apps_ and you cannot register to your app to have content shared to it through the native share dialog on native platforms. You can read more [in the related feature request](https://expo.canny.io/feature-requests/p/share-extension-ios-share-intent-android). You can setup this functionality manually in Xcode and Android Studio and create an [Expo Config Plugin](/config-plugins/introduction/) to continue using [Expo Prebuild](/workflow/prebuild). +Currently `expo-sharing` only supports sharing _from your app to other apps_ and you cannot register to your app to have content shared to it through the native share dialog on native platforms. You can read more [in the related feature request](https://expo.canny.io/feature-requests/p/share-extension-ios-share-intent-android). You can setup this functionality manually in Xcode and Android Studio and create an [Expo Config Plugin](/config-plugins/introduction/) to continue using [Expo Prebuild](/workflow/continuous-native-generation). ## Installation diff --git a/docs/pages/versions/v54.0.0/config/metro.mdx b/docs/pages/versions/v54.0.0/config/metro.mdx index bdfc9f7cadf4a6..d08c1d6d4f0dee 100644 --- a/docs/pages/versions/v54.0.0/config/metro.mdx +++ b/docs/pages/versions/v54.0.0/config/metro.mdx @@ -635,9 +635,9 @@ Using a variable in the `Worker` constructor is not supported for bundling. To i ## Bare workflow setup -> This guide is versioned and will need to be revisited when upgrading/downgrading Expo. Alternatively, use [Expo Prebuild](/workflow/prebuild) for fully automated setup. +> This guide is versioned and will need to be revisited when upgrading/downgrading Expo. Alternatively, use [Expo Prebuild](/more/glossary-of-terms/#prebuild) for fully automated setup. -Projects that don't use [Expo Prebuild](/workflow/prebuild) must configure native files to ensure the Expo Metro config is always used to bundle the project. +Projects that don't use [Expo Prebuild](/more/glossary-of-terms/#prebuild) must configure native files to ensure the Expo Metro config is always used to bundle the project. {/* If this isn't done, then features like [aliases](/guides/typescript/#path-aliases-optional), [absolute imports](/guides/typescript/#absolute-imports-optional), asset hashing, and more will not work. */} diff --git a/docs/pages/versions/v54.0.0/config/package-json.mdx b/docs/pages/versions/v54.0.0/config/package-json.mdx index 01b148d8cbb67a..0229c98fb267e9 100644 --- a/docs/pages/versions/v54.0.0/config/package-json.mdx +++ b/docs/pages/versions/v54.0.0/config/package-json.mdx @@ -82,7 +82,7 @@ By default, the check is enabled and unknown packages are listed. ### `appConfigFieldsNotSyncedCheck` -Expo Doctor checks if your project includes native project directories such as **android** or **ios**. If these directories exist but are not listed in your **.gitignore** or [**.easignore**](/build-reference/easignore) files, Expo Doctor verifies the presence of an app config file. If this file exists, it means your project is configured to use [Prebuild](/workflow/prebuild). +Expo Doctor checks if your project includes native project directories such as **android** or **ios**. If these directories exist but are not listed in your **.gitignore** or [**.easignore**](/build-reference/easignore) files, Expo Doctor verifies the presence of an app config file. If this file exists, it means your project is configured to use [Prebuild](/more/glossary-of-terms/#prebuild). When the **android** or **ios** directories are present, EAS Build does not sync app config properties to the native projects. Expo Doctor throws a warning if these conditions are true. diff --git a/docs/pages/versions/v54.0.0/sdk/build-properties.mdx b/docs/pages/versions/v54.0.0/sdk/build-properties.mdx index 999bea1fe238f3..e194f07c1fcb01 100644 --- a/docs/pages/versions/v54.0.0/sdk/build-properties.mdx +++ b/docs/pages/versions/v54.0.0/sdk/build-properties.mdx @@ -12,9 +12,9 @@ import { ConfigPluginExample } from '~/ui/components/ConfigSection'; import { Tabs, Tab } from '~/ui/components/Tabs'; `expo-build-properties` is a [config plugin](/config-plugins/introduction/) configuring the native build properties -of your **android/gradle.properties** and **ios/Podfile.properties.json** directories during [Prebuild](/workflow/prebuild). +of your **android/gradle.properties** and **ios/Podfile.properties.json** directories during [Prebuild](/workflow/continuous-native-generation). -> **info** This config plugin configures how [Prebuild command](/workflow/prebuild) generates the native **android** and **ios** directories +> **info** This config plugin configures how [Prebuild command](/workflow/continuous-native-generation/#usage) generates the native **android** and **ios** directories > and therefore cannot be used with projects that don't run `npx expo prebuild` (bare projects). ## Installation diff --git a/docs/pages/versions/v54.0.0/sdk/notifications.mdx b/docs/pages/versions/v54.0.0/sdk/notifications.mdx index dbfba958f3f81c..2e53e6440d6e3f 100644 --- a/docs/pages/versions/v54.0.0/sdk/notifications.mdx +++ b/docs/pages/versions/v54.0.0/sdk/notifications.mdx @@ -643,7 +643,7 @@ We encourage you to always ensure appropriate channels with informative names ar ### Custom notification icon and colors  -You can configure the [`notification.icon`](../config/app/#notification) and [`notification.color`](../config/app/#notification) keys in the project's **app.json** if you are using [Expo Prebuild](/workflow/prebuild) or by using the [`expo-notifications` config plugin directly](#configurable-properties). These are build-time settings, so you'll need to recompile your native Android app with `eas build -p android` or `npx expo run:android` to see the changes. +You can configure the [`notification.icon`](../config/app/#notification) and [`notification.color`](../config/app/#notification) keys in the project's **app.json** if you are using [Expo Prebuild](/workflow/continuous-native-generation) or by using the [`expo-notifications` config plugin directly](#configurable-properties). These are build-time settings, so you'll need to recompile your native Android app with `eas build -p android` or `npx expo run:android` to see the changes. For your notification icon, make sure you follow [Google's design guidelines](https://material.io/design/iconography/product-icons.html#design-principles) (the icon must be all white with a transparent background) or else it may not be displayed as intended. diff --git a/docs/pages/versions/v54.0.0/sdk/sharing.mdx b/docs/pages/versions/v54.0.0/sdk/sharing.mdx index 0c331a79376478..4a6591509de985 100644 --- a/docs/pages/versions/v54.0.0/sdk/sharing.mdx +++ b/docs/pages/versions/v54.0.0/sdk/sharing.mdx @@ -23,7 +23,7 @@ import { ContentSpotlight } from '~/ui/components/ContentSpotlight'; #### Sharing to your app from other apps -Currently `expo-sharing` only supports sharing _from your app to other apps_ and you cannot register to your app to have content shared to it through the native share dialog on native platforms. You can read more [in the related feature request](https://expo.canny.io/feature-requests/p/share-extension-ios-share-intent-android). You can setup this functionality manually in Xcode and Android Studio and create an [Expo Config Plugin](/config-plugins/introduction/) to continue using [Expo Prebuild](/workflow/prebuild). +Currently `expo-sharing` only supports sharing _from your app to other apps_ and you cannot register to your app to have content shared to it through the native share dialog on native platforms. You can read more [in the related feature request](https://expo.canny.io/feature-requests/p/share-extension-ios-share-intent-android). You can setup this functionality manually in Xcode and Android Studio and create an [Expo Config Plugin](/config-plugins/introduction/) to continue using [Expo Prebuild](/workflow/continuous-native-generation). ## Installation diff --git a/docs/pages/versions/v55.0.0/config/metro.mdx b/docs/pages/versions/v55.0.0/config/metro.mdx index 2fbffef5336501..c858f12ddf072c 100644 --- a/docs/pages/versions/v55.0.0/config/metro.mdx +++ b/docs/pages/versions/v55.0.0/config/metro.mdx @@ -635,9 +635,9 @@ Using a variable in the `Worker` constructor is not supported for bundling. To i ## Bare workflow setup -> This guide is versioned and will need to be revisited when upgrading/downgrading Expo. Alternatively, use [Expo Prebuild](/workflow/prebuild) for fully automated setup. +> This guide is versioned and will need to be revisited when upgrading/downgrading Expo. Alternatively, use [Expo Prebuild](/more/glossary-of-terms/#prebuild) for fully automated setup. -Projects that don't use [Expo Prebuild](/workflow/prebuild) must configure native files to ensure the Expo Metro config is always used to bundle the project. +Projects that don't use [Expo Prebuild](/more/glossary-of-terms/#prebuild) must configure native files to ensure the Expo Metro config is always used to bundle the project. {/* If this isn't done, then features like [aliases](/guides/typescript/#path-aliases-optional), [absolute imports](/guides/typescript/#absolute-imports-optional), asset hashing, and more will not work. */} diff --git a/docs/pages/versions/v55.0.0/config/package-json.mdx b/docs/pages/versions/v55.0.0/config/package-json.mdx index 01b148d8cbb67a..0229c98fb267e9 100644 --- a/docs/pages/versions/v55.0.0/config/package-json.mdx +++ b/docs/pages/versions/v55.0.0/config/package-json.mdx @@ -82,7 +82,7 @@ By default, the check is enabled and unknown packages are listed. ### `appConfigFieldsNotSyncedCheck` -Expo Doctor checks if your project includes native project directories such as **android** or **ios**. If these directories exist but are not listed in your **.gitignore** or [**.easignore**](/build-reference/easignore) files, Expo Doctor verifies the presence of an app config file. If this file exists, it means your project is configured to use [Prebuild](/workflow/prebuild). +Expo Doctor checks if your project includes native project directories such as **android** or **ios**. If these directories exist but are not listed in your **.gitignore** or [**.easignore**](/build-reference/easignore) files, Expo Doctor verifies the presence of an app config file. If this file exists, it means your project is configured to use [Prebuild](/more/glossary-of-terms/#prebuild). When the **android** or **ios** directories are present, EAS Build does not sync app config properties to the native projects. Expo Doctor throws a warning if these conditions are true. diff --git a/docs/pages/versions/v55.0.0/sdk/build-properties.mdx b/docs/pages/versions/v55.0.0/sdk/build-properties.mdx index bafbe2649e27e7..a9d3b7b5d8bea3 100644 --- a/docs/pages/versions/v55.0.0/sdk/build-properties.mdx +++ b/docs/pages/versions/v55.0.0/sdk/build-properties.mdx @@ -12,9 +12,9 @@ import { ConfigPluginExample } from '~/ui/components/ConfigSection'; import { Tabs, Tab } from '~/ui/components/Tabs'; `expo-build-properties` is a [config plugin](/config-plugins/introduction/) configuring the native build properties -of your **android/gradle.properties** and **ios/Podfile.properties.json** directories during [Prebuild](/workflow/prebuild). +of your **android/gradle.properties** and **ios/Podfile.properties.json** directories during [Prebuild](/workflow/continuous-native-generation). -> **info** This config plugin configures how [Prebuild command](/workflow/prebuild) generates the native **android** and **ios** directories +> **info** This config plugin configures how [Prebuild command](/workflow/continuous-native-generation/#usage) generates the native **android** and **ios** directories > and therefore cannot be used with projects that don't run `npx expo prebuild` (bare projects). ## Installation diff --git a/docs/pages/versions/v55.0.0/sdk/notifications.mdx b/docs/pages/versions/v55.0.0/sdk/notifications.mdx index 75e28c175a9ba8..ee1ed8f805defe 100644 --- a/docs/pages/versions/v55.0.0/sdk/notifications.mdx +++ b/docs/pages/versions/v55.0.0/sdk/notifications.mdx @@ -643,7 +643,7 @@ We encourage you to always ensure appropriate channels with informative names ar ### Custom notification icon and colors  -You can configure the `icon` and `color` keys for notification in the project by using the [`expo-notifications` config plugin](#configurable-properties) with [Expo Prebuild](/workflow/prebuild). These are build-time settings, so you'll need to recompile your native Android app with `eas build -p android` or `npx expo run:android` to see the changes. +You can configure the `icon` and `color` keys for notification in the project by using the [`expo-notifications` config plugin](#configurable-properties) with [Expo Prebuild](/workflow/continuous-native-generation). These are build-time settings, so you'll need to recompile your native Android app with `eas build -p android` or `npx expo run:android` to see the changes. For your notification icon, make sure you follow [Google's design guidelines](https://material.io/design/iconography/product-icons.html#design-principles) (the icon must be all white with a transparent background) or else it may not be displayed as intended. diff --git a/docs/pages/workflow/configuration.mdx b/docs/pages/workflow/configuration.mdx index 08dcd582ebfaa6..be70237bba02a2 100644 --- a/docs/pages/workflow/configuration.mdx +++ b/docs/pages/workflow/configuration.mdx @@ -12,7 +12,7 @@ import { Terminal } from '~/ui/components/Snippet'; -The app config (**app.json**, **app.config.js**, **app.config.ts**) is used for configuring [Expo Prebuild](/workflow/prebuild) generation, how a project loads in [Expo Go](/get-started/expo-go/), and the OTA update manifest. +The app config (**app.json**, **app.config.js**, **app.config.ts**) is used for configuring [Expo Prebuild](/more/glossary-of-terms/#prebuild) generation, how a project loads in [Expo Go](/get-started/expo-go/), and the OTA update manifest. It must be located at the root of your project, next to the **package.json**. Here is a minimal example: @@ -62,7 +62,7 @@ The following fields are filtered out of the public app config (and not accessib Library authors can extend the app config by using [Expo Config plugins](/config-plugins/introduction/). -> **info** Config plugins are mostly used to configure the [`npx expo prebuild`](/workflow/prebuild) command. +> **info** Config plugins are mostly used to configure the [`npx expo prebuild`](/more/glossary-of-terms/#prebuild) command. ## Dynamic configuration diff --git a/docs/pages/workflow/overview.mdx b/docs/pages/workflow/overview.mdx index 8b7e6ecaa22114..b14729a1ae8c51 100644 --- a/docs/pages/workflow/overview.mdx +++ b/docs/pages/workflow/overview.mdx @@ -94,7 +94,7 @@ Android and Xcode projects that bundle the JavaScript app, serve as the launchpa Like any mobile app, the application that is distributed to users is created by compiling ("building") the Android Studio or Xcode project. -When you initialize a new app with `npx create-expo-app`, you will not see any **android** or **ios** directories. You can [generate the native projects by running `npx expo prebuild`](/workflow/prebuild/), which will initialize the native projects and then apply the project Expo app config (**app.json/app.config.js**) to them. +When you initialize a new app with `npx create-expo-app`, you will not see any **android** or **ios** directories. You can [generate the native projects by running `npx expo prebuild`](/workflow/continuous-native-generation/), which will initialize the native projects and then apply the project Expo app config (**app.json/app.config.js**) to them. If you use a cloud-based development workflow, you may never need to run prebuild or install Android Studio or Xcode on your own machine (although you may find this useful). This is explained below in the [Local and cloud-based development workflows](#cloud-based-and-local-development-workflows). diff --git a/docs/pages/workflow/using-libraries.mdx b/docs/pages/workflow/using-libraries.mdx index 7cdb8109b8b0a9..14b6da1be5a679 100644 --- a/docs/pages/workflow/using-libraries.mdx +++ b/docs/pages/workflow/using-libraries.mdx @@ -113,7 +113,7 @@ If the module needs additional native configuration, you can do so using [config -If your project does not support [Expo Prebuild](/workflow/prebuild) then you won't be able to use [config plugins](/config-plugins/introduction/). You can either [adopt Expo Prebuild](/guides/adopting-prebuild) or set up and configure each library manually by following any additional setup guides from the respective module's website or README. +If your project does not support [Expo Prebuild](/workflow/continuous-native-generation) then you won't be able to use [config plugins](/config-plugins/introduction/). You can either [adopt Expo Prebuild](/guides/adopting-prebuild) or set up and configure each library manually by following any additional setup guides from the respective module's website or README. From e156a160aea9101454409f4c7ec2434cc32c20d5 Mon Sep 17 00:00:00 2001 From: Aman Mittal Date: Sun, 1 Mar 2026 14:22:15 +0530 Subject: [PATCH 3/4] [docs] Add FAQPage JSON-LD structured data across FAQ sections (#43487) ## Why Fix ENG-19530 ## How - Add `buildFAQPageSchema()` following the same pattern as the existing `buildBreadcrumbListSchema`. Takes an array of `{ question, answer }` items and returns a `FAQPage` JSON-LD object. - Add a new `FAQ` wrapper component. - Wrap Collapsible blocks in FAQ sections with `...` across 6 "Frequently asked questions" pages and 17 "Common questions" pages. ## Test Plan - Run yarn dev, open a page with a VideoBoxLink (for example, http://localhost:3002/build/introduction/), view page source in developer console, and search for `application/ld+json`. - Copy and validate the JSON-LD snippet at [validator.schema.org](https://validator.schema.org/). CleanShot 2026-02-27 at 00 34
22@2x CleanShot 2026-02-27 at 00 34
00@2x # Checklist - [ ] I added a `changelog.md` entry and rebuilt the package sources according to [this short guide](https://github.com/expo/expo/blob/main/CONTRIBUTING.md#-before-submitting) - [ ] This diff will work correctly for `npx expo prebuild` & EAS Build (eg: updated a module plugin). - [ ] Conforms with the [Documentation Writing Style Guide](https://github.com/expo/expo/blob/main/guides/Expo%20Documentation%20Writing%20Style%20Guide.md) --- docs/constants/structured-data.test.ts | 48 ++++++++++- docs/constants/structured-data.ts | 18 ++++ docs/pages/bare/overview.mdx | 5 ++ docs/pages/bare/using-expo-cli.mdx | 5 ++ docs/pages/build/introduction.mdx | 5 ++ docs/pages/eas-update/codepush.mdx | 5 ++ .../integration-in-existing-native-apps.mdx | 5 ++ docs/pages/eas-update/introduction.mdx | 5 ++ docs/pages/eas/hosting/introduction.mdx | 5 ++ docs/pages/eas/metadata/index.mdx | 5 ++ docs/pages/eas/workflows/introduction.mdx | 5 ++ .../pages/eas/workflows/pre-packaged-jobs.mdx | 5 ++ docs/pages/guides/dom-components.mdx | 11 ++- docs/pages/guides/expo-ui-swift-ui/index.mdx | 5 ++ docs/pages/modules/overview.mdx | 5 ++ docs/pages/router/advanced/custom-tabs.mdx | 5 ++ docs/pages/router/introduction.mdx | 5 ++ docs/pages/router/web/data-loaders.mdx | 5 ++ docs/pages/router/web/server-rendering.mdx | 5 ++ docs/pages/submit/introduction.mdx | 5 ++ docs/pages/versions/unversioned/sdk/expo.mdx | 5 ++ docs/pages/versions/v53.0.0/sdk/expo.mdx | 5 ++ docs/pages/versions/v54.0.0/sdk/expo.mdx | 5 ++ docs/pages/versions/v55.0.0/sdk/expo.mdx | 5 ++ .../workflow/continuous-native-generation.mdx | 5 ++ docs/ui/components/FAQ/FAQ.test.tsx | 82 +++++++++++++++++++ docs/ui/components/FAQ/index.tsx | 31 +++++++ 27 files changed, 296 insertions(+), 4 deletions(-) create mode 100644 docs/ui/components/FAQ/FAQ.test.tsx create mode 100644 docs/ui/components/FAQ/index.tsx diff --git a/docs/constants/structured-data.test.ts b/docs/constants/structured-data.test.ts index c2413d7f5980c2..473b6568afb97f 100644 --- a/docs/constants/structured-data.test.ts +++ b/docs/constants/structured-data.test.ts @@ -1,4 +1,4 @@ -import { buildBreadcrumbListSchema } from './structured-data'; +import { buildBreadcrumbListSchema, buildFAQPageSchema } from './structured-data'; describe(buildBreadcrumbListSchema, () => { it('returns null for empty array', () => { @@ -66,3 +66,49 @@ describe(buildBreadcrumbListSchema, () => { expect(positions).toEqual([1, 2, 3]); }); }); + +describe(buildFAQPageSchema, () => { + it('returns null for empty array', () => { + expect(buildFAQPageSchema([])).toBeNull(); + }); + + it('returns valid FAQPage for a single item', () => { + const result = buildFAQPageSchema([ + { question: 'What is Expo?', answer: 'A framework for React Native.' }, + ]); + + expect(result).toEqual({ + '@context': 'https://schema.org', + '@type': 'FAQPage', + mainEntity: [ + { + '@type': 'Question', + name: 'What is Expo?', + acceptedAnswer: { '@type': 'Answer', text: 'A framework for React Native.' }, + }, + ], + }); + }); + + it('returns valid FAQPage for multiple items', () => { + const result = buildFAQPageSchema([ + { question: 'Q1?', answer: 'A1' }, + { question: 'Q2?', answer: 'A2' }, + { question: 'Q3?', answer: 'A3' }, + ]); + + expect(result?.mainEntity).toHaveLength(3); + expect(result?.mainEntity[1]).toEqual({ + '@type': 'Question', + name: 'Q2?', + acceptedAnswer: { '@type': 'Answer', text: 'A2' }, + }); + }); + + it('preserves answer text as-is', () => { + const answer = 'Use `npx expo install` to add packages.\nSee https://docs.expo.dev for more.'; + const result = buildFAQPageSchema([{ question: 'How?', answer }]); + + expect(result?.mainEntity[0].acceptedAnswer.text).toBe(answer); + }); +}); diff --git a/docs/constants/structured-data.ts b/docs/constants/structured-data.ts index c8829c8e548db1..16bbcef38fd363 100644 --- a/docs/constants/structured-data.ts +++ b/docs/constants/structured-data.ts @@ -20,6 +20,24 @@ export function buildBreadcrumbListSchema(items: BreadcrumbItem[]) { }; } +type FAQItem = { question: string; answer: string }; + +export function buildFAQPageSchema(items: FAQItem[]) { + if (items.length === 0) { + return null; + } + + return { + '@context': 'https://schema.org', + '@type': 'FAQPage', + mainEntity: items.map(item => ({ + '@type': 'Question', + name: item.question, + acceptedAnswer: { '@type': 'Answer', text: item.answer }, + })), + }; +} + export const websiteSchema = { '@context': 'https://schema.org', '@type': 'WebSite', diff --git a/docs/pages/bare/overview.mdx b/docs/pages/bare/overview.mdx index 182eb4ddc93886..79a162edcf0faf 100644 --- a/docs/pages/bare/overview.mdx +++ b/docs/pages/bare/overview.mdx @@ -14,6 +14,7 @@ import { Rocket02Icon } from '@expo/styleguide-icons/outline/Rocket02Icon'; import { BoxLink } from '~/ui/components/BoxLink'; import { Collapsible } from '~/ui/components/Collapsible'; +import { FAQ } from '~/ui/components/FAQ'; import { CODE } from '~/ui/components/Text'; If you have a React Native app that doesn't use any Expo tools, you might be wondering what Expo can provide for you, why you might want to use Expo tools and services, and how to get started. @@ -144,6 +145,8 @@ The following helps with your project's long term maintainability, native code m ## Common questions + + Adopting Expo doesn't have to be done in one step. You can start with the _quick wins_ and then move on to more complex parts. You can also pick and choose which features you want to adopt based on what is most helpful for your project. @@ -207,3 +210,5 @@ Yes, you can install and use third-party libraries that require native projects You can continue using any navigation library in your project. However, we recommend using Expo Router for all the benefits [described here](/router/introduction). + + diff --git a/docs/pages/bare/using-expo-cli.mdx b/docs/pages/bare/using-expo-cli.mdx index db619b307c8886..9c01eebcda79a8 100644 --- a/docs/pages/bare/using-expo-cli.mdx +++ b/docs/pages/bare/using-expo-cli.mdx @@ -9,6 +9,7 @@ import { BookOpen02Icon } from '@expo/styleguide-icons/outline/BookOpen02Icon'; import { BoxLink } from '~/ui/components/BoxLink'; import { Collapsible } from '~/ui/components/Collapsible'; +import { FAQ } from '~/ui/components/FAQ'; import { Terminal } from '~/ui/components/Snippet'; import { DEMI } from '~/ui/components/Text'; @@ -71,6 +72,8 @@ When building your project, you can choose a device or simulator by using the `- ## Common questions + + Expo Modules API is also installed when you install the `expo` package with `npx install-expo-modules`. If you want to try out Expo CLI for now without installing Expo Modules API, install the `expo` package with `npm install` and then configure the **react-native.config.js** to exclude the package from autolinking: @@ -99,6 +102,8 @@ Yes! Refer to the [Customized Prebuild Example repository](https://github.com/by + + ## Next steps Now, with the `expo` package installed and configured in your project, you can start using all features from Expo CLI and SDK. Here are some recommended next steps to dive deep: diff --git a/docs/pages/build/introduction.mdx b/docs/pages/build/introduction.mdx index 798af6247aa420..4dff2d86020191 100644 --- a/docs/pages/build/introduction.mdx +++ b/docs/pages/build/introduction.mdx @@ -9,6 +9,7 @@ import { Cube01Icon } from '@expo/styleguide-icons/outline/Cube01Icon'; import { BoxLink } from '~/ui/components/BoxLink'; import { Collapsible } from '~/ui/components/Collapsible'; import { NoIcon, YesIcon } from '~/ui/components/DocIcons'; +import { FAQ } from '~/ui/components/FAQ'; import { Terminal } from '~/ui/components/Snippet'; **EAS Build** is a hosted Expo Application Services (EAS) service that builds app binaries (also called [standalone apps](/more/glossary-of-terms/#standalone-app)) for your Expo and React Native projects. @@ -52,6 +53,8 @@ This command sends your project to EAS Build and produces installable binaries f ## Frequently asked questions + + Use [internal distribution](/build/internal-distribution/) to share builds with a URL. Set `"distribution": "internal"` in your [build profile](/build/eas-json/#build-profiles) in **eas.json** to generate installable Android Package (APK) files for Android or [ad hoc builds](/build/internal-distribution/) for iOS. @@ -111,6 +114,8 @@ Android builds run on Linux runners hosted in Google Cloud Platform, and iOS bui + + ## Get started + CodePush CLI has a `--mandatory` flag that allows you to release mandatory updates. You can build this functionality with EAS Update but there is no specific flag for it. @@ -130,6 +133,8 @@ Yes, EAS Update supports end-to-end code signing. It is available for EAS Produc + + ## Conceptual differences between CodePush and EAS Update CodePush and EAS Update are both services that allow you to send hotfixes to the JavaScript code of your app, but they take slightly different approaches, and so you may need to adapt your release process when moving to EAS Update. diff --git a/docs/pages/eas-update/integration-in-existing-native-apps.mdx b/docs/pages/eas-update/integration-in-existing-native-apps.mdx index e9fe44c0181e1c..e90660ec809495 100644 --- a/docs/pages/eas-update/integration-in-existing-native-apps.mdx +++ b/docs/pages/eas-update/integration-in-existing-native-apps.mdx @@ -5,6 +5,7 @@ description: Learn how to integrate EAS Update into your existing native Android --- import { Collapsible } from '~/ui/components/Collapsible'; +import { FAQ } from '~/ui/components/FAQ'; import { Terminal, DiffBlock } from '~/ui/components/Snippet'; import { Tabs, Tab } from '~/ui/components/Tabs'; @@ -496,6 +497,8 @@ public class CustomViewController: UIViewController, AppControllerDelegate { ## Common questions + + Assuming you are using the latest version of React Native supported by the Expo SDK, and you are comfortable with the React Native integration in your native projects, then you can likely integrate EAS Update in a similar amount of time as it would take you to integrate with a tool like CodePush or Sentry. @@ -509,3 +512,5 @@ The most important factor is the React Native version that your app uses. If you To learn more, see [Migrating from CodePush](/eas-update/codepush/) guide. + + diff --git a/docs/pages/eas-update/introduction.mdx b/docs/pages/eas-update/introduction.mdx index 467855a5bd4921..a6b07bbf736e27 100644 --- a/docs/pages/eas-update/introduction.mdx +++ b/docs/pages/eas-update/introduction.mdx @@ -13,6 +13,7 @@ import { BoxLink } from '~/ui/components/BoxLink'; import { Collapsible } from '~/ui/components/Collapsible'; import { ContentSpotlight } from '~/ui/components/ContentSpotlight'; import { NoIcon, YesIcon } from '~/ui/components/DocIcons'; +import { FAQ } from '~/ui/components/FAQ'; import { Terminal } from '~/ui/components/Snippet'; **EAS Update** is a cloud service from EAS (Expo Application Services) that serves updates for projects using the [`expo-updates`](/versions/latest/sdk/updates/) library. @@ -90,6 +91,8 @@ For scenarios marked with , use [EAS Build](/build/introduction/) to c ## Frequently asked questions (FAQ) + + One of the rules of EAS Update is that you need to follow the rules of the platforms and app stores you are building for. This means your updates need to follow the App Store and Play Store guidelines, including the content of the updates and how you use them. This usually means changes to your app's behavior need to be reviewed. @@ -168,6 +171,8 @@ We recommend transitioning to EAS Update or using a [self-hosted update service] + + ## Get started + EAS Hosting supports all three output modes configured in your app config's `expo.web.output`: @@ -134,6 +137,8 @@ For more information, see the [Web deployments with EAS Workflows](/eas/hosting/ + + ## Get started **important** **EAS Metadata** is in beta and subject to breaking changes. @@ -58,6 +59,8 @@ This dynamic store config allows you to gather information from other places lik ## Frequently asked questions (FAQ) + + We are committed to EAS Metadata and will expand functionality over time. This also means that not all functionality is implemented in EAS Metadata. The Google Play Store is one of those features currently not implemented. @@ -81,6 +84,8 @@ You'll need to authenticate with the app store before EAS Metadata can access th + + ## Get started + EAS Workflows are designed to help you and your team release your app. It comes preconfigured with pre-packaged job types that can build, submit, update, run Maestro tests, and more. All job types run on EAS, so you'll only have to manage one set of YAML files, and all the artifacts from your job runs will appear on [expo.dev](https://expo.dev/). @@ -149,6 +152,8 @@ Share the following slide in your next team meeting to discuss what EAS Workflow /> + + ## Get started + Repack job is suitable for the following use cases: @@ -1671,6 +1674,8 @@ Repack job is not suitable for the following use cases: + + #### Parameters You can pass the following parameters into the `params` list: diff --git a/docs/pages/guides/dom-components.mdx b/docs/pages/guides/dom-components.mdx index 0f0461b4fadde5..29a6dde4d818ce 100644 --- a/docs/pages/guides/dom-components.mdx +++ b/docs/pages/guides/dom-components.mdx @@ -5,6 +5,7 @@ description: Learn about rendering React DOM components in Expo native apps usin --- import { Collapsible } from '~/ui/components/Collapsible'; +import { FAQ } from '~/ui/components/FAQ'; import { Terminal } from '~/ui/components/Snippet'; import { Tabs, Tab } from '~/ui/components/Tabs'; @@ -514,16 +515,18 @@ While DOM components help with migration and moving quickly, we recommend using ## Common questions -### How to obtain a Secure Context in DOM components? + + + Some Web APIs require a [Secure Context](https://developer.mozilla.org/en-US/docs/Web/Security/Secure_Contexts) function correctly. For example, the [Clipboard API](https://developer.mozilla.org/en-US/docs/Web/API/Clipboard_API) is only available in secure contexts. A secure context means that remote resources must be served over HTTPS. [Learn more about features restricted to secure contexts](https://developer.mozilla.org/en-US/docs/Web/Security/Secure_Contexts/features_restricted_to_secure_contexts). To ensure your DOM components run within a secure context, follow these guidelines: - **Release builds**: DOM components served using the `file://` scheme are provided a secure context by default. -- **Debug builds**: When using development servers (which default to the `http:// `protocol), you can use [tunneling](/more/expo-cli/#tunneling) to serve DOM components over HTTPS. +- **Debug builds**: When using development servers (which default to the `http://` protocol), you can use [tunneling](/more/expo-cli/#tunneling) to serve DOM components over HTTPS. - +**Example commands to tunnel DOM components over HTTPS:** + + diff --git a/docs/pages/guides/expo-ui-swift-ui/index.mdx b/docs/pages/guides/expo-ui-swift-ui/index.mdx index 80efc206d71210..6b3f0ffbdce619 100644 --- a/docs/pages/guides/expo-ui-swift-ui/index.mdx +++ b/docs/pages/guides/expo-ui-swift-ui/index.mdx @@ -12,6 +12,7 @@ import { GithubIcon } from '@expo/styleguide-icons/custom/GithubIcon'; import { BoxLink } from '~/ui/components/BoxLink'; import { Collapsible } from '~/ui/components/Collapsible'; import { ContentSpotlight } from '~/ui/components/ContentSpotlight'; +import { FAQ } from '~/ui/components/FAQ'; import { Terminal } from '~/ui/components/Snippet'; import { Tabs, Tab } from '~/ui/components/Tabs'; import { CODE } from '~/ui/components/Text'; @@ -461,6 +462,8 @@ Use `VStack` with `alignment="leading"` for list items with title and subtitle. ## Common questions + + Flexbox styles can be applied to the `Host` component itself. Once you're inside the SwiftUI context, however, [`Yoga`](https://www.yogalayout.dev/) is not available — layouts should be defined using `` and `` instead. @@ -504,6 +507,8 @@ Because React's promise of _"learn once, write anywhere"_, it now extends to Swi + + ## Additional resources + Most of the time, Expo and React Native developers don't need to write any native code — libraries are already available for a wide range of use cases, from camera to video to maps to haptics and much more. @@ -80,6 +83,8 @@ Learn more about this in the [Integrate an existing library](/modules/existing-l + + ## Next steps + ` will resolve to `/directory/profile`, even when the `/directory/page` route is showing. Expo recommends against using relative hrefs. + + diff --git a/docs/pages/router/introduction.mdx b/docs/pages/router/introduction.mdx index 8bef955f75931c..4aa40a38dca864 100644 --- a/docs/pages/router/introduction.mdx +++ b/docs/pages/router/introduction.mdx @@ -13,6 +13,7 @@ import { YoutubeIcon } from '@expo/styleguide-icons/outline/YoutubeIcon'; import { BoxLink } from '~/ui/components/BoxLink'; import { Collapsible } from '~/ui/components/Collapsible'; +import { FAQ } from '~/ui/components/FAQ'; import { Terminal } from '~/ui/components/Snippet'; import { Step } from '~/ui/components/Step'; @@ -89,6 +90,8 @@ If you are looking to use [React Native Navigation by Wix](https://github.com/wi ## Common questions + + Historically, React Native has been non prescriptive about how apps should be built which is similar to using React without a modern web framework. Expo Router is an opinionated framework for React Native, similar to how Remix and Next.js are opinionated frameworks for web-only React. @@ -133,6 +136,8 @@ Basic static rendering (SSG) is supported in Expo Router. Server-side rendering + + ## Next steps + Yes. Data loaders work with both static rendering (`web.output: 'static'`) and server rendering (`web.output: 'server'`). @@ -377,3 +380,5 @@ Yes. Data loaders work with both static rendering (`web.output: 'static'`) and s No, `loader` exports are dropped from the client bundle. However, if another module contains server-side logic and is imported by client-side code outside of the **src/app** directory, it may be included in your client-side bundle. + + diff --git a/docs/pages/router/web/server-rendering.mdx b/docs/pages/router/web/server-rendering.mdx index 83d77091804769..c9eafa458f2ade 100644 --- a/docs/pages/router/web/server-rendering.mdx +++ b/docs/pages/router/web/server-rendering.mdx @@ -5,6 +5,7 @@ isAlpha: true --- import { Collapsible } from '~/ui/components/Collapsible'; +import { FAQ } from '~/ui/components/FAQ'; import { FileTree } from '~/ui/components/FileTree'; import { Terminal } from '~/ui/components/Snippet'; import { Step } from '~/ui/components/Step'; @@ -204,6 +205,8 @@ EAS Hosting supports server rendering out of the box. Export your app and deploy ## Common questions + + Yes. Server rendering works with [data loaders](/router/web/data-loaders) to fetch data on the server before rendering. @@ -227,3 +230,5 @@ Caching is handled at the server or CDN level. Configure your deployment platfor Yes. [API routes](/router/web/api-routes/) work independently of the rendering mode. They are always executed on the server. + + diff --git a/docs/pages/submit/introduction.mdx b/docs/pages/submit/introduction.mdx index 45538888e11f9d..276527f4b1ae4e 100644 --- a/docs/pages/submit/introduction.mdx +++ b/docs/pages/submit/introduction.mdx @@ -11,6 +11,7 @@ import { Settings01Icon } from '@expo/styleguide-icons/outline/Settings01Icon'; import { BoxLink } from '~/ui/components/BoxLink'; import { Collapsible } from '~/ui/components/Collapsible'; import { YesIcon, NoIcon } from '~/ui/components/DocIcons'; +import { FAQ } from '~/ui/components/FAQ'; import { Terminal } from '~/ui/components/Snippet'; **EAS Submit** is a hosted service from EAS (Expo Application Services) for submitting Android and iOS binaries directly to the Google Play Store and Apple App Store without opening the [Google Play Console](https://play.google.com/console), or downloading the [Transporter app](https://apps.apple.com/us/app/transporter/id1450874784). @@ -70,6 +71,8 @@ Build and submit in one step: ## Frequently asked questions (FAQ) + + Yes. EAS Submit accepts any valid **.aab** (Android App Bundle) or **.ipa** (iOS App Archive) file. @@ -149,6 +152,8 @@ To understand why your EAS Submit submission failed, open the submission details + + ## Get started + rootRegisterComponent setup for existing React Native projects}> If you are managing your React Native project's native directories (**android** and **ios**) manually, you need to follow the instructions below to set up the `registerRootComponent` function. This is necessary for the Expo modules to work correctly. @@ -192,3 +195,5 @@ registerRootComponent(App); **For projects that use [Expo Router](/router/introduction/)**, you can create a custom entry point by following these steps from [Expo Router's installation guide](/router/installation/#custom-entry-point-to-initialize-and-load). To use the top-level **src** directory in your Expo Router project, see [src directory reference](/router/reference/src-directory/) for more information. + + diff --git a/docs/pages/versions/v53.0.0/sdk/expo.mdx b/docs/pages/versions/v53.0.0/sdk/expo.mdx index 33aa94b8c35c2f..1d545494c21cf3 100644 --- a/docs/pages/versions/v53.0.0/sdk/expo.mdx +++ b/docs/pages/versions/v53.0.0/sdk/expo.mdx @@ -10,6 +10,7 @@ platforms: ['android', 'ios', 'tvos', 'web', 'expo-go'] import APISection from '~/components/plugins/APISection'; import { APIInstallSection } from '~/components/plugins/InstallSection'; import { Collapsible } from '~/ui/components/Collapsible'; +import { FAQ } from '~/ui/components/FAQ'; import { CODE } from '~/ui/components/Text'; ## Installation @@ -112,6 +113,8 @@ console.log(new URL('http://🥓').toString()); Some common questions about using the `expo` package in your project. + + rootRegisterComponent setup for existing React Native projects}> If you are managing your React Native project's native directories (**android** and **ios**) manually, you need to follow the instructions below to set up the `registerRootComponent` function. This is necessary for the Expo modules to work correctly. @@ -161,3 +164,5 @@ registerRootComponent(App); **For projects that use [Expo Router](/router/introduction/)**, you can create a custom entry point by following these steps from [Expo Router's installation guide](/router/installation/#custom-entry-point-to-initialize-and-load). To use the top-level **src** directory in your Expo Router project, see [src directory reference](/router/reference/src-directory/) for more information. + + diff --git a/docs/pages/versions/v54.0.0/sdk/expo.mdx b/docs/pages/versions/v54.0.0/sdk/expo.mdx index fabbfa3c4ba771..55e0a21d8a74f6 100644 --- a/docs/pages/versions/v54.0.0/sdk/expo.mdx +++ b/docs/pages/versions/v54.0.0/sdk/expo.mdx @@ -10,6 +10,7 @@ platforms: ['android', 'ios', 'tvos', 'web', 'expo-go'] import APISection from '~/components/plugins/APISection'; import { APIInstallSection } from '~/components/plugins/InstallSection'; import { Collapsible } from '~/ui/components/Collapsible'; +import { FAQ } from '~/ui/components/FAQ'; import { CODE } from '~/ui/components/Text'; ## Installation @@ -129,6 +130,8 @@ console.log(new URL('http://🥓').toString()); Some common questions about using the `expo` package in your project. + + rootRegisterComponent setup for existing React Native projects}> If you are managing your React Native project's native directories (**android** and **ios**) manually, you need to follow the instructions below to set up the `registerRootComponent` function. This is necessary for the Expo modules to work correctly. @@ -178,3 +181,5 @@ registerRootComponent(App); **For projects that use [Expo Router](/router/introduction/)**, you can create a custom entry point by following these steps from [Expo Router's installation guide](/router/installation/#custom-entry-point-to-initialize-and-load). To use the top-level **src** directory in your Expo Router project, see [src directory reference](/router/reference/src-directory/) for more information. + + diff --git a/docs/pages/versions/v55.0.0/sdk/expo.mdx b/docs/pages/versions/v55.0.0/sdk/expo.mdx index 11ad4e84ed2bc9..75ba6100a8813a 100644 --- a/docs/pages/versions/v55.0.0/sdk/expo.mdx +++ b/docs/pages/versions/v55.0.0/sdk/expo.mdx @@ -10,6 +10,7 @@ platforms: ['android', 'ios', 'tvos', 'web', 'expo-go'] import APISection from '~/components/plugins/APISection'; import { APIInstallSection } from '~/components/plugins/InstallSection'; import { Collapsible } from '~/ui/components/Collapsible'; +import { FAQ } from '~/ui/components/FAQ'; import { CODE } from '~/ui/components/Text'; ## Installation @@ -143,6 +144,8 @@ Remove any custom polyfills for `structuredClone` to prevent bloat. Refer to the Some common questions about using the `expo` package in your project. + + rootRegisterComponent setup for existing React Native projects}> If you are managing your React Native project's native directories (**android** and **ios**) manually, you need to follow the instructions below to set up the `registerRootComponent` function. This is necessary for the Expo modules to work correctly. @@ -192,3 +195,5 @@ registerRootComponent(App); **For projects that use [Expo Router](/router/introduction/)**, you can create a custom entry point by following these steps from [Expo Router's installation guide](/router/installation/#custom-entry-point-to-initialize-and-load). To use the top-level **src** directory in your Expo Router project, see [src directory reference](/router/reference/src-directory/) for more information. + + diff --git a/docs/pages/workflow/continuous-native-generation.mdx b/docs/pages/workflow/continuous-native-generation.mdx index 136f8181b11332..78c4d7701be68f 100644 --- a/docs/pages/workflow/continuous-native-generation.mdx +++ b/docs/pages/workflow/continuous-native-generation.mdx @@ -5,6 +5,7 @@ sidebar_title: Continuous Native Generation --- import { Collapsible } from '~/ui/components/Collapsible'; +import { FAQ } from '~/ui/components/FAQ'; import { Terminal, DiffBlock } from '~/ui/components/Snippet'; A single native project on its own is complicated to maintain, scale, and update. In a cross-platform app, you have multiple native projects that you must maintain and keep up to date with the latest operating system releases to avoid falling too far behind in any third-party dependencies. @@ -131,6 +132,8 @@ Everything offered by Expo including [EAS](/eas/), Expo CLI, and the libraries i ## Common questions + + ### CNG @@ -272,3 +275,5 @@ Other packages, such as [`react-native-ble-plx`](https://github.com/Polidea/reac Alternatively, we also have a repo for [out-of-tree config plugins](https://github.com/expo/config-plugins) which provides plugins for popular packages that haven't adopted the system yet. Think of this like [DefinitelyTyped](https://github.com/DefinitelyTyped/DefinitelyTyped) for TypeScript. We prefer packages ship their own config plugin, but if they haven't adopted the system yet, the community can use the packages listed in the repo. + + diff --git a/docs/ui/components/FAQ/FAQ.test.tsx b/docs/ui/components/FAQ/FAQ.test.tsx new file mode 100644 index 00000000000000..f98ecd4cffcbb8 --- /dev/null +++ b/docs/ui/components/FAQ/FAQ.test.tsx @@ -0,0 +1,82 @@ +import { jest } from '@jest/globals'; +import { render, screen } from '@testing-library/react'; +import { type PropsWithChildren, type ReactNode } from 'react'; + +jest.unstable_mockModule('~/ui/components/StructuredData', () => ({ + StructuredData: ({ data, id }: { data: Record; id: string }) => ( +
{JSON.stringify(data)}
+ ), +})); + +const { FAQ } = await import('.'); + +function FakeCollapsible({ summary, children }: PropsWithChildren<{ summary: ReactNode }>) { + return ( +
+ {summary} +
{children}
+
+ ); +} + +describe('FAQ', () => { + it('renders children unchanged', () => { + render( + + Answer one. + + ); + + expect(screen.getByText('Question one?')).toBeInTheDocument(); + expect(screen.getByText('Answer one.')).toBeInTheDocument(); + }); + + it('injects FAQPage JSON-LD from children with summary prop', () => { + render( + + A React Native framework. + Yes. + + ); + + const el = screen.getByTestId('faq'); + const data = JSON.parse(el.textContent!); + + expect(data['@type']).toBe('FAQPage'); + expect(data.mainEntity).toHaveLength(2); + expect(data.mainEntity[0].name).toBe('What is Expo?'); + expect(data.mainEntity[0].acceptedAnswer.text).toBe('A React Native framework.'); + expect(data.mainEntity[1].name).toBe('Is it free?'); + }); + + it('handles JSX fragment summaries', () => { + render( + + + Can I use expo-camera? + + }> + Yes you can. + + + ); + + const el = screen.getByTestId('faq'); + const data = JSON.parse(el.textContent!); + + expect(data.mainEntity[0].name).toBe('Can I use expo-camera?'); + }); + + it('does not render structured data when there are no children with summary prop', () => { + render( + +

Just a paragraph.

+
+ ); + + expect(screen.queryByTestId('faq')).not.toBeInTheDocument(); + expect(screen.getByText('Just a paragraph.')).toBeInTheDocument(); + }); +}); diff --git a/docs/ui/components/FAQ/index.tsx b/docs/ui/components/FAQ/index.tsx new file mode 100644 index 00000000000000..dc7fd9e4bc2c2c --- /dev/null +++ b/docs/ui/components/FAQ/index.tsx @@ -0,0 +1,31 @@ +import { Children, type PropsWithChildren, type ReactElement, isValidElement } from 'react'; + +import { toString } from '~/common/utilities'; +import { buildFAQPageSchema } from '~/constants/structured-data'; +import { StructuredData } from '~/ui/components/StructuredData'; + +export function FAQ({ children }: PropsWithChildren) { + const items: { question: string; answer: string }[] = []; + + Children.forEach(children, child => { + if ( + isValidElement(child) && + (child as ReactElement<{ summary?: unknown }>).props.summary !== undefined + ) { + const { summary, children: body } = child.props as { summary?: unknown; children?: unknown }; + items.push({ + question: toString(summary as React.ReactNode), + answer: toString(body as React.ReactNode), + }); + } + }); + + const schema = buildFAQPageSchema(items); + + return ( + <> + {schema && } + {children} + + ); +} From f8ac5a464af57fc44047a45760d451f948a10cd7 Mon Sep 17 00:00:00 2001 From: Aman Mittal Date: Sun, 1 Mar 2026 14:37:37 +0530 Subject: [PATCH 4/4] [docs] Add per-page TechArticle JSON-LD schema (#43509) --- docs/components/DocumentationPage.tsx | 20 +++++---- docs/constants/structured-data.test.ts | 59 +++++++++++++++++++++++++- docs/constants/structured-data.ts | 24 +++++++++++ 3 files changed, 93 insertions(+), 10 deletions(-) diff --git a/docs/components/DocumentationPage.tsx b/docs/components/DocumentationPage.tsx index 5d4cf8cf3f9fab..721e3b9b19bbb9 100644 --- a/docs/components/DocumentationPage.tsx +++ b/docs/components/DocumentationPage.tsx @@ -13,7 +13,7 @@ import DocumentationHead from '~/components/DocumentationHead'; import DocumentationNestedScrollLayout, { DocumentationNestedScrollLayoutHandles, } from '~/components/DocumentationNestedScrollLayout'; -import { buildBreadcrumbListSchema } from '~/constants/structured-data'; +import { buildBreadcrumbListSchema, buildTechArticleSchema } from '~/constants/structured-data'; import { usePageApiVersion } from '~/providers/page-api-version'; import versions from '~/public/static/constants/versions.json'; import { PageMetadata } from '~/types/common'; @@ -65,6 +65,14 @@ export default function DocumentationPage({ const sidebarActiveGroup = RoutesUtils.getPageSection(pathname); const breadcrumbTrail = getBreadcrumbTrail(routes, pathname); const breadcrumbSchema = buildBreadcrumbListSchema(breadcrumbTrail); + const canonicalUrl = + version !== 'unversioned' && !RoutesUtils.isInternalPath(pathname) + ? RoutesUtils.getCanonicalUrl(pathname) + : undefined; + const techArticleSchema = + title && canonicalUrl + ? buildTechArticleSchema({ title, description, modificationDate, url: canonicalUrl }) + : null; const sidebarScrollPosition = process?.browser ? window.__sidebarScroll : 0; const currentPath = router?.asPath ?? ''; const isLatestSdkPage = currentPath.startsWith('/versions/latest/sdk/'); @@ -315,14 +323,8 @@ export default function DocumentationPage({ isSidebarCollapsed={isNavigationCollapsed} isChatExpanded={isAskAIExpanded}> {breadcrumbSchema && } - + {techArticleSchema && } + {hideFromSearch !== true && ( { + it('returns TechArticle with all fields', () => { + const result = buildTechArticleSchema({ + title: 'Introduction to Expo Router', + description: 'Expo Router is a file-based routing library.', + modificationDate: '2026-01-15', + url: 'https://docs.expo.dev/router/introduction/', + }); + + expect(result).toEqual({ + '@context': 'https://schema.org', + '@type': 'TechArticle', + headline: 'Introduction to Expo Router', + description: 'Expo Router is a file-based routing library.', + dateModified: '2026-01-15', + publisher: websiteSchema.publisher, + url: 'https://docs.expo.dev/router/introduction/', + }); + }); + + it('omits description when not provided', () => { + const result = buildTechArticleSchema({ + title: 'Some page', + url: 'https://docs.expo.dev/some-page/', + }); + + expect(result).not.toHaveProperty('description'); + expect(result.headline).toBe('Some page'); + expect(result.url).toBe('https://docs.expo.dev/some-page/'); + }); + + it('omits dateModified when modificationDate is not provided', () => { + const result = buildTechArticleSchema({ + title: 'Some page', + description: 'A description.', + url: 'https://docs.expo.dev/some-page/', + }); + + expect(result).not.toHaveProperty('dateModified'); + expect(result).toHaveProperty('description', 'A description.'); + }); + + it('uses websiteSchema publisher', () => { + const result = buildTechArticleSchema({ + title: 'Any page', + url: 'https://docs.expo.dev/any/', + }); + + expect(result.publisher).toBe(websiteSchema.publisher); + }); +}); describe(buildBreadcrumbListSchema, () => { it('returns null for empty array', () => { diff --git a/docs/constants/structured-data.ts b/docs/constants/structured-data.ts index 16bbcef38fd363..fb31e73dec1ea1 100644 --- a/docs/constants/structured-data.ts +++ b/docs/constants/structured-data.ts @@ -20,6 +20,30 @@ export function buildBreadcrumbListSchema(items: BreadcrumbItem[]) { }; } +type TechArticleInput = { + title: string; + description?: string; + modificationDate?: string; + url: string; +}; + +export function buildTechArticleSchema({ + title, + description, + modificationDate, + url, +}: TechArticleInput) { + return { + '@context': 'https://schema.org', + '@type': 'TechArticle', + headline: title, + ...(description ? { description } : {}), + ...(modificationDate ? { dateModified: modificationDate } : {}), + publisher: websiteSchema.publisher, + url, + }; +} + type FAQItem = { question: string; answer: string }; export function buildFAQPageSchema(items: FAQItem[]) {