diff --git a/docs/package.json b/docs/package.json
index b09d6da5de984..c189312d9caff 100644
--- a/docs/package.json
+++ b/docs/package.json
@@ -1,6 +1,7 @@
{
"name": "expo-docs",
"version": "48.0.0",
+ "betaVersion": "49.0.0",
"private": true,
"type": "module",
"scripts": {
diff --git a/docs/pages/versions/v49.0.0/config/app.mdx b/docs/pages/versions/v49.0.0/config/app.mdx
new file mode 100644
index 0000000000000..20712b38476f3
--- /dev/null
+++ b/docs/pages/versions/v49.0.0/config/app.mdx
@@ -0,0 +1,17 @@
+---
+title: app.json / app.config.js
+maxHeadingDepth: 5
+---
+
+{/* Hi! If you found an issue within the description of the manifest properties, please create a GitHub issue. */}
+
+import AppConfigSchemaPropertiesTable from '~/components/plugins/AppConfigSchemaPropertiesTable';
+import schema from '~/public/static/schemas/unversioned/app-config-schema.json';
+
+The following is a list of properties that are available for you under the `"expo"` key in **app.json** or **app.config.json**. These properties can be passed to the top level object of **app.config.js** or **app.config.ts**.
+
+For more general information on app configuration, such as the differences between the various app configuration files, see [Configuration with app.json/app.config.js](/workflow/configuration/).
+
+## Properties
+
+
diff --git a/docs/pages/versions/v49.0.0/config/metro.mdx b/docs/pages/versions/v49.0.0/config/metro.mdx
new file mode 100644
index 0000000000000..745dd47518599
--- /dev/null
+++ b/docs/pages/versions/v49.0.0/config/metro.mdx
@@ -0,0 +1,479 @@
+---
+title: metro.config.js
+---
+
+import { Terminal } from '~/ui/components/Snippet';
+import { FileTree } from '~/ui/components/FileTree';
+
+See more information about **metro.config.js** in the [customizing Metro guide](/guides/customizing-metro/).
+
+## Environment variables
+
+> For SDK 49 and above
+
+Environment variables can be loaded using **.env** files. These files are loaded according to the [standard **.env** file resolution](https://github.com/bkeepers/dotenv/blob/c6e583a/README.md#what-other-env-files-can-i-use).
+
+If you are migrating an older project to SDK 49 or above, then you should ignore local env files by adding the following to your **.gitignore**:
+
+```sh .gitignore
+# local env files
+.env*.local
+```
+
+### Client environment variables
+
+Environment variables prefixed with `EXPO_PUBLIC_` will be exposed to the app at build-time. For example, `EXPO_PUBLIC_API_KEY` will be available as `process.env.EXPO_PUBLIC_API_KEY`.
+
+Environment variables will not be inlined in code inside of **node_modules**.
+
+For security purposes, client environment variables are inlined in the bundle, which means that `process.env` is not an iterable object, and you cannot dynamically access environment variables. Every variable must be referenced as a static property in order for it to be inlined. For example, the expression `process.env.EXPO_PUBLIC_KEY` will be rewritten and `process.env[‘EXPO_PUBLIC_KEY’]` will not.
+
+- Client environment variables should not contain secrets as they will be viewable in plain-text format in the production binary.
+- Use client environment variables for partially protected values, such as public API keys you don't want to commit to Git or hard-code in your app and that may change depending on the environment.
+- Expo environment variables can be updated while the development server (`npx expo start`) is running, without restarting or clearing the bundler cache — however, you'll need to modify and save an included source file to see the updates. You must also perform a client reload, as environment variables do not support Fast Refresh.
+
+{/* TODO: Usage in EAS */}
+
+## CSS
+
+> Available in SDK 49 and higher.
+
+> **info** CSS support is under development and currently only works on web.
+
+Expo supports CSS in your project. You can import CSS files from any component. CSS Modules are also supported. To enable CSS, configure your `metro.config.js` as follows, setting `isCSSEnabled` to `true`:
+
+```js metro.config.js
+const { getDefaultConfig } = require('expo/metro-config');
+
+/** @type {import('expo/metro-config').MetroConfig} */
+const config = getDefaultConfig(__dirname, {
+ // Enable CSS support.
+ isCSSEnabled: true,
+});
+
+module.exports = config;
+```
+
+Now you'll need to clear the Metro cache and restart the development server:
+
+
+
+Ensure you don't have a custom Metro transformer that processes CSS files. If you do, you'll need to remove it.
+
+### Global CSS
+
+> Warning: Global styles are web-only, usage will cause your application to diverge visually on native.
+
+You can import a CSS file from any component. The CSS will be applied to the entire page.
+
+Here, we'll define a global style for the class name `.container`:
+
+```css styles.css
+.container {
+ background-color: red;
+}
+```
+
+We can then use the class name in our component by importing the stylesheet and using `.container`:
+
+```js App.js
+import './styles.css';
+import { View } from 'react-native';
+
+export default function App() {
+ return (
+ <>
+ {/* Use `className` to assign the style with React DOM components. */}
+
Hello World
+
+ {/* Use `style` with the following syntax to append class names in React Native for web. */}
+
+ Hello World
+
+ >
+ );
+}
+```
+
+You can also import stylesheets that are vendored in libraries, just like you would any node module:
+
+```js index.js
+// Applies the styles app-wide.
+import 'emoji-mart/css/emoji-mart.css';
+```
+
+- On native, all global stylesheets are automatically ignored.
+- Hot reloading is supported for global stylesheets, simply save the file and the changes will be applied.
+
+### CSS Modules
+
+> CSS Modules for native are under development and currently only work on web.
+
+CSS Modules are a way to scope CSS to a specific component. This is useful for avoiding naming collisions and for ensuring that styles are only applied to the intended component.
+
+In Expo, CSS Modules are defined by creating a file with the `.module.css` extension. The file can be imported from any component. The exported value is an object with the class names as keys and the web-only scoped names as the values. The import `unstable_styles` can be used to access `react-native-web`-safe styles.
+
+CSS Modules support platform extensions to allow you to define different styles for different platforms. For example, you can define a `module.ios.css` and `module.android.css` file to define styles for iOS and Android respectively. You'll need to import without the extension, for example:
+
+```diff App.js
+// Importing `./App.module.ios.css`:
+- import styles from './App.module.css';
++ import styles from './App.module';
+```
+
+Flipping the extension, e.g. `App.ios.module.css` will not work and result in a universal module named `App.ios.module`.
+
+> You cannot pass styles to the `className` prop of a React Native or React Native for web component. Instead, you must use the `style` prop.
+
+```js App.js
+import styles, { unstable_styles } from './App.module.css';
+
+export default function Page() {
+ return (
+ <>
+
+ Hello World
+
+ Hello World
+ {/* Web-only usage: */}
+ Hello World
+ >
+ );
+}
+```
+
+```css App.module.css
+.text {
+ color: red;
+}
+```
+
+- On web, all CSS values are available. CSS is not processed or auto-prefixed like it is with the React Native Web `StyleSheet` API. You can use `postcss.config.js` to autoprefix your CSS.
+- CSS Modules use [lightningcss](https://github.com/parcel-bundler/lightningcss) under the hood, check [the issues](https://github.com/parcel-bundler/lightningcss/issues) for unsupported features.
+
+### PostCSS
+
+> Changing the Post CSS or `browserslist` config will require you to clear the Metro cache: `npx expo start --clear` | `npx expo export --clear`.
+
+[PostCSS](https://github.com/postcss/postcss) can be customized by adding a `postcss.config.json` file to the root of your project. This file should export a function that returns a PostCSS configuration object. For example:
+
+```json postcss.config.json
+{
+ "plugins": {
+ "autoprefixer": {}
+ }
+}
+```
+
+Both `postcss.config.json` and `postcss.config.js` are supported, but `postcss.config.json` enables better caching.
+
+### SASS
+
+Expo Metro has _partial_ support for SCSS/SASS.
+
+To setup, install the `sass` package in your project:
+
+
+
+Then, ensure [CSS is setup](#css) in the `metro.config.js` file.
+
+- When `sass` is installed, then modules without extensions will be resolved in the following order: `scss`, `sass`, `css`.
+- Only use the intended syntax with `sass` files.
+- Importing other files from inside a scss/sass file is not currently supported.
+
+### Tailwind
+
+> **info** Tailwind does not support native platforms, this is web-only.
+
+[Tailwind](https://tailwindcss.com/) can be used with Metro for web. However, due to the advanced caching system in Metro, the setup is a little different from the default Tailwind setup. The following files are modified:
+
+
+
+To setup, install the `tailwindcss` package in your project:
+
+
+
+In your **app.json** ensure the project is using Metro for web:
+
+```json app.json
+{
+ "expo": {
+ "web": {
+ "bundler": "metro"
+ }
+ }
+}
+```
+
+Create **global.css** in your project:
+
+```css global.css
+/* This file adds the requisite utility classes for Tailwind to work. */
+@tailwind base;
+@tailwind components;
+@tailwind utilities;
+```
+
+Create **tailwind.config.js** in your project:
+
+```js tailwind.config.js
+/** @type {import('tailwindcss').Config} */
+module.exports = {
+ content: [
+ // Ensure this points to your source code...
+ './app/**/*.{js,tsx,ts,jsx}',
+ // If you use a `src` folder, add: './src/**/*.{js,tsx,ts,jsx}'
+ // Do the same with `components`, `hooks`, `styles`, or any other top-level folders...
+ ],
+ theme: {
+ extend: {},
+ },
+ plugins: [],
+};
+```
+
+In **metro.config.js**, enable CSS support and run the Tailwind CLI:
+
+```js metro.config.js
+const path = require('path');
+const { getDefaultConfig } = require('expo/metro-config');
+const tailwind = require('tailwindcss/lib/cli/build');
+
+module.exports = (async () => {
+ /** @type {import('expo/metro-config').MetroConfig} */
+ const config = getDefaultConfig(__dirname, {
+ // Enable CSS support.
+ isCSSEnabled: true,
+ });
+
+ // Run Tailwind CLI to generate CSS files.
+ await tailwind.build({
+ '--input': path.relative(__dirname, './global.css'),
+ '--output': path.resolve(__dirname, 'node_modules/.cache/expo/tailwind/eval.css'),
+ '--watch': process.env.NODE_ENV === 'development' ? 'always' : false,
+ '--poll': true,
+ });
+
+ return config;
+})();
+```
+
+In your app main entry file, add the following:
+
+```js index.js/App.js
+// Ensure we import the CSS for Tailwind so it's included in hot module reloads.
+const ctx = require.context(
+ // If this require.context is not inside the root directory (next to the package.json) then adjust this file path
+ // to resolve correctly.
+ './node_modules/.cache/expo/tailwind'
+);
+if (ctx.keys().length) ctx(ctx.keys()[0]);
+```
+
+#### Tailwind Usage
+
+You can use Tailwind with React DOM elements as-is:
+
+```jsx
+export default function Page() {
+ return (
+
+ );
+}
+```
+
+You can use the `{ $$css: true }` syntax to use Tailwind with React Native web elements:
+
+```jsx
+import { View, Text } from 'react-native';
+
+export default function Page() {
+ return (
+
+ Welcome to Tailwind
+
+ );
+}
+```
+
+## 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.
+
+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.
+
+{/* If this isn't done, then features like [aliases](/guides/typescript#path-aliases), [absolute imports](/guides/typescript#absolute-imports), asset hashing, and more will not work. */}
+
+These modifications are meant to replace `npx react-native bundle` and `npx react-native start` with `npx expo export:embed` and `npx expo start --dev-client` respectively.
+
+### `metro.config.js`
+
+Ensure the `metro.config.js` extends `expo/metro-config`:
+
+```js
+const { getDefaultConfig } = require('expo/metro-config');
+
+const config = getDefaultConfig(__dirname);
+
+module.exports = config;
+```
+
+### `android/app/build.gradle`
+
+The Android `app/build.gradle` must be configured to use Expo CLI for production bundling. Modify the `react` config object:
+
+```diff
+react {
+ ...
++ // Use Expo CLI to bundle the app, this ensures the Metro config
++ // works correctly with Expo projects.
++ cliFile = new File(["node", "--print", "require.resolve('@expo/cli')"].execute(null, rootDir).text.trim())
++ bundleCommand = "export:embed"
+}
+```
+
+### `ios/.xcodeproj/project.pbxproj`
+
+In your `ios/.xcodeproj/project.pbxproj` file, replace the following scripts:
+
+#### "Start Packager"
+
+```diff
++ shellScript = "if [[ -f \"$PODS_ROOT/../.xcode.env\" ]]; then\n source \"$PODS_ROOT/../.xcode.env\"\nfi\nif [[ -f \"$PODS_ROOT/../.xcode.env.local\" ]]; then\n source \"$PODS_ROOT/../.xcode.env.local\"\nfi\n\nexport RCT_METRO_PORT=\"${RCT_METRO_PORT:=8081}\"\necho \"export RCT_METRO_PORT=${RCT_METRO_PORT}\" > `$NODE_BINARY --print \"require('path').dirname(require.resolve('react-native/package.json')) + '/scripts/.packager.env'\"`\nif [ -z \"${RCT_NO_LAUNCH_PACKAGER+xxx}\" ] ; then\n if nc -w 5 -z localhost ${RCT_METRO_PORT} ; then\n if ! curl -s \"http://localhost:${RCT_METRO_PORT}/status\" | grep -q \"packager-status:running\" ; then\n echo \"Port ${RCT_METRO_PORT} already in use, packager is either not running or not running correctly\"\n exit 2\n fi\n else\n open `$NODE_BINARY --print \"require('path').dirname(require.resolve('expo/package.json')) + '/scripts/launchPackager.command'\"` || echo \"Can't start packager automatically\"\n fi\nfi\n";
+```
+
+**Alternatively**, in the Xcode project, select the "Start Packager" build phase and add the following modifications:
+
+```diff
++ if [[ -f "$PODS_ROOT/../.xcode.env" ]]; then
++ source "$PODS_ROOT/../.xcode.env"
++ fi
++ if [[ -f "$PODS_ROOT/../.xcode.env.local" ]]; then
++ source "$PODS_ROOT/../.xcode.env.local"
++ fi
+
+export RCT_METRO_PORT="${RCT_METRO_PORT:=8081}"
+echo "export RCT_METRO_PORT=${RCT_METRO_PORT}" > `$NODE_BINARY --print "require('path').dirname(require.resolve('react-native/package.json')) + '/scripts/.packager.env'"`
+if [ -z "${RCT_NO_LAUNCH_PACKAGER+xxx}" ] ; then
+ if nc -w 5 -z localhost ${RCT_METRO_PORT} ; then
+ if ! curl -s "http://localhost:${RCT_METRO_PORT}/status" | grep -q "packager-status:running" ; then
+ echo "Port ${RCT_METRO_PORT} already in use, packager is either not running or not running correctly"
+ exit 2
+ fi
+ else
+- open `$NODE_BINARY --print "require('path').dirname(require.resolve('react-native/package.json')) + '/scripts/launchPackager.command'"` || echo "Can't start packager automatically"
++ open `$NODE_BINARY --print "require('path').dirname(require.resolve('expo/package.json')) + '/scripts/launchPackager.command'"` || echo "Can't start packager automatically"
+ fi
+fi
+```
+
+#### "Bundle React Native code and images"
+
+```diff
++ shellScript = "if [[ -f \"$PODS_ROOT/../.xcode.env\" ]]; then\n source \"$PODS_ROOT/../.xcode.env\"\nfi\nif [[ -f \"$PODS_ROOT/../.xcode.env.local\" ]]; then\n source \"$PODS_ROOT/../.xcode.env.local\"\nfi\n\n# The project root by default is one level up from the ios directory\nexport PROJECT_ROOT=\"$PROJECT_DIR\"/..\n\nif [[ \"$CONFIGURATION\" = *Debug* ]]; then\n export SKIP_BUNDLING=1\nfi\nif [[ -z \"$ENTRY_FILE\" ]]; then\n # Set the entry JS file using the bundler's entry resolution.\n export ENTRY_FILE=\"$(\"$NODE_BINARY\" -e \"require('expo/scripts/resolveAppEntry')\" \"$PROJECT_ROOT\" ios relative | tail -n 1)\"\nfi\n\nif [[ -z \"$CLI_PATH\" ]]; then\n # Use Expo CLI\n export CLI_PATH=\"$(\"$NODE_BINARY\" --print \"require.resolve('@expo/cli')\")\"\nfi\nif [[ -z \"$BUNDLE_COMMAND\" ]]; then\n # Default Expo CLI command for bundling\n export BUNDLE_COMMAND=\"export:embed\"\nfi\n\n`\"$NODE_BINARY\" --print \"require('path').dirname(require.resolve('react-native/package.json')) + '/scripts/react-native-xcode.sh'\"`\n\n";
+```
+
+**Alternatively**, in the Xcode project, select the "Bundle React Native code and images" build phase and add the following modifications:
+
+```diff
+if [[ -f "$PODS_ROOT/../.xcode.env" ]]; then
+ source "$PODS_ROOT/../.xcode.env"
+fi
+if [[ -f "$PODS_ROOT/../.xcode.env.local" ]]; then
+ source "$PODS_ROOT/../.xcode.env.local"
+fi
+
+# The project root by default is one level up from the ios directory
+export PROJECT_ROOT="$PROJECT_DIR"/..
+
+if [[ "$CONFIGURATION" = *Debug* ]]; then
+ export SKIP_BUNDLING=1
+fi
++ if [[ -z "$ENTRY_FILE" ]]; then
++ # Set the entry JS file using the bundler's entry resolution.
++ export ENTRY_FILE="$("$NODE_BINARY" -e "require('expo/scripts/resolveAppEntry')" "$PROJECT_ROOT" ios relative | tail -n 1)"
++ fi
+
++ if [[ -z "$CLI_PATH" ]]; then
++ # Use Expo CLI
++ export CLI_PATH="$("$NODE_BINARY" --print "require.resolve('@expo/cli')")"
++ fi
++ if [[ -z "$BUNDLE_COMMAND" ]]; then
++ # Default Expo CLI command for bundling
++ export BUNDLE_COMMAND="export:embed"
++ fi
+
+`"$NODE_BINARY" --print "require('path').dirname(require.resolve('react-native/package.json')) + '/scripts/react-native-xcode.sh'"`
+```
+
+> You can set `CLI_PATH`, `BUNDLE_COMMAND`, and `ENTRY_FILE` environment variables to overwrite these defaults.
+
+### Custom Entry File
+
+By default, React Native only supports using a root `index.js` file as the entry file (or platform-specific variation like `index.ios.js`). Expo projects allow using any entry file, but this requires addition bare setup.
+
+#### Development
+
+Development mode entry files can be enabled by using the [`expo-dev-client`](/clients/introduction.mdx) package. Alternatively you can add the following configuration:
+
+In the `ios/[project]/AppDelegate.mm` file:
+
+```diff
+- (NSURL *)sourceURLForBridge:(RCTBridge *)bridge
+{
+#if DEBUG
+- return [[RCTBundleURLProvider sharedSettings] jsBundleURLForBundleRoot:@"index"];
++ return [[RCTBundleURLProvider sharedSettings] jsBundleURLForBundleRoot:@".expo/.virtual-metro-entry"];
+#else
+ return [[NSBundle mainBundle] URLForResource:@"main" withExtension:@"jsbundle"];
+#endif
+}
+```
+
+In the `android/app/src/main/java/**/MainApplication.java`:
+
+```diff
+@Override
+protected String getJSMainModuleName() {
+- return "index";
++ return ".expo/.virtual-metro-entry";
+}
+```
+
+#### Production
+
+In your `ios/.xcodeproj/project.pbxproj` file, replace the `"Bundle React Native code and images"` script to set `$ENTRY_FILE` according using Metro:
+
+```diff
++ shellScript = "if [[ -f \"$PODS_ROOT/../.xcode.env\" ]]; then\n source \"$PODS_ROOT/../.xcode.env\"\nfi\nif [[ -f \"$PODS_ROOT/../.xcode.env.local\" ]]; then\n source \"$PODS_ROOT/../.xcode.env.local\"\nfi\n\n# The project root by default is one level up from the ios directory\nexport PROJECT_ROOT=\"$PROJECT_DIR\"/..\n\nif [[ \"$CONFIGURATION\" = *Debug* ]]; then\n export SKIP_BUNDLING=1\nfi\nif [[ -z \"$ENTRY_FILE\" ]]; then\n # Set the entry JS file using the bundler's entry resolution.\n export ENTRY_FILE=\"$(\"$NODE_BINARY\" -e \"require('expo/scripts/resolveAppEntry')\" \"$PROJECT_ROOT\" ios relative | tail -n 1)\"\nfi\n\nif [[ -z \"$CLI_PATH\" ]]; then\n # Use Expo CLI\n export CLI_PATH=\"$(\"$NODE_BINARY\" --print \"require.resolve('@expo/cli')\")\"\nfi\nif [[ -z \"$BUNDLE_COMMAND\" ]]; then\n # Default Expo CLI command for bundling\n export BUNDLE_COMMAND=\"export:embed\"\nfi\n\n`\"$NODE_BINARY\" --print \"require('path').dirname(require.resolve('react-native/package.json')) + '/scripts/react-native-xcode.sh'\"`\n\n";
+```
+
+The Android `app/build.gradle` must be configured to use Metro module resolution to find the root entry file. Modify the `react` config object:
+
+```diff
++ def projectRoot = rootDir.getAbsoluteFile().getParentFile().getAbsolutePath()
+
+react {
++ entryFile = file(["node", "-e", "require('expo/scripts/resolveAppEntry')", projectRoot, "android", "absolute"].execute(null, rootDir).text.trim())
+}
+```
diff --git a/docs/pages/versions/v49.0.0/index.mdx b/docs/pages/versions/v49.0.0/index.mdx
new file mode 100644
index 0000000000000..e9a054c8cf71d
--- /dev/null
+++ b/docs/pages/versions/v49.0.0/index.mdx
@@ -0,0 +1,78 @@
+---
+title: Reference
+hideTOC: true
+---
+
+import VersionedRedirectNotification from '~/components/plugins/VersionedRedirectNotification';
+import { Terminal } from '~/ui/components/Snippet';
+import { BoxLink } from '~/ui/components/BoxLink';
+import { CODE } from '~/ui/components/Text';
+
+
+
+The Expo SDK provides access to device and system functionality such as contacts, camera, gyroscope, GPS location, and so on, in the form of packages. You can install any Expo SDK package using the `npx expo install` command. For example, three different packages are installed using the following command:
+
+
+
+After installing one or more packages, you can import them into your JavaScript code:
+
+```javascript
+import { Camera } from 'expo-camera';
+import * as Contacts from 'expo-contacts';
+import { Gyroscope } from 'expo-sensors';
+```
+
+This allows you to write [`Contacts.getContactsAsync()`](/versions/latest/sdk/contacts#contactsgetcontactsasynccontactquery) and read the contacts from the device, read the gyroscope sensor to detect device movement, or start the phone's camera and take photos.
+
+## These packages work in bare React Native apps too
+
+The easiest way to create a bare React Native app with support for the Expo SDK is by running the command:
+
+
+
+
+ Projects that were created with npx react-native init
require
+ additional setup to use the Expo SDK.
+ >
+ }
+/>
+
+
+
+## Each Expo SDK version depends on a React Native version
+
+Every quarter there is a new Expo SDK release that typically updates to the latest stable versions of React Native and React Native Web, and includes a variety of bug fixes, features, and improvements to the Expo SDK.
+
+| Expo SDK version | React Native version | React Native Web version |
+| ---------------- | -------------------- | ------------------------ |
+| 48.0.0 | 0.71 | 0.18.12 |
+| 47.0.0 | 0.70 | 0.18.9 |
+| 46.0.0 | 0.69 | 0.18.7 |
+| 45.0.0 | 0.68 | 0.17.7 |
+| 44.0.0 | 0.64 | 0.17.1 |
+
+### Support for other React Native versions
+
+Packages in the Expo SDK are intended to support the target React Native version for that SDK. Typically, they will not support older versions of React Native, but they may. When a new version of React Native is released, the latest versions of the Expo SDK packages are typically updated to support it. However, this may take weeks or more, depending on the extent of the changes in the release.
+
+## Support for Android and iOS versions
+
+Each version of Expo SDK supports a minimum OS version of Android and iOS. For Android, the `compileSdkVersion` is defined which tells the [Gradle](https://developer.android.com/studio/build) which Android SDK version to use to compile the app. This also means that you can use the Android API features included in that SDK version and from the previous versions.
+
+| Expo SDK version | Android version | `compileSdkVersion` | iOS version |
+| ---------------- | --------------- | ------------------- | ----------- |
+| 47.0.0 | 5+ | 31 | 13+ |
+| 46.0.0 | 5+ | 31 | 12.4+ |
+| 45.0.0 | 5+ | 31 | 12+ |
+| 44.0.0 | 5+ | 30 | 12+ |
diff --git a/docs/pages/versions/v49.0.0/sdk/accelerometer.mdx b/docs/pages/versions/v49.0.0/sdk/accelerometer.mdx
new file mode 100644
index 0000000000000..ec94121048ff8
--- /dev/null
+++ b/docs/pages/versions/v49.0.0/sdk/accelerometer.mdx
@@ -0,0 +1,118 @@
+---
+title: Accelerometer
+sourceCodeUrl: 'https://github.com/expo/expo/tree/sdk-49/packages/expo-sensors'
+packageName: 'expo-sensors'
+iconUrl: '/static/images/packages/expo-sensors.png'
+---
+
+import APISection from '~/components/plugins/APISection';
+import { APIInstallSection } from '~/components/plugins/InstallSection';
+import { SnackInline} from '~/ui/components/Snippet';
+
+import PlatformsSection from '~/components/plugins/PlatformsSection';
+
+`Accelerometer` from **`expo-sensors`** provides access to the device accelerometer sensor(s) and associated listeners to respond to changes in acceleration in three-dimensional space, meaning any movement or vibration.
+
+
+
+## Installation
+
+
+
+## Usage
+
+
+
+```jsx
+import React, { useState, useEffect } from 'react';
+import { StyleSheet, Text, TouchableOpacity, View } from 'react-native';
+import { Accelerometer } from 'expo-sensors';
+
+export default function App() {
+ const [{ x, y, z }, setData] = useState({
+ x: 0,
+ y: 0,
+ z: 0,
+ });
+ const [subscription, setSubscription] = useState(null);
+
+ const _slow = () => Accelerometer.setUpdateInterval(1000);
+ const _fast = () => Accelerometer.setUpdateInterval(16);
+
+ const _subscribe = () => {
+ setSubscription(
+ Accelerometer.addListener(setData)
+ );
+ };
+
+ const _unsubscribe = () => {
+ subscription && subscription.remove();
+ setSubscription(null);
+ };
+
+ useEffect(() => {
+ _subscribe();
+ return () => _unsubscribe();
+ }, []);
+
+ return (
+
+ Accelerometer: (in gs where 1g = 9.81 m/s^2)
+ x: {x}
+ y: {y}
+ z: {z}
+
+
+ {subscription ? 'On' : 'Off'}
+
+
+ Slow
+
+
+ Fast
+
+
+
+ );
+}
+
+/* @hide const styles = StyleSheet.create({ ... }); */
+const styles = StyleSheet.create({
+ container: {
+ flex: 1,
+ justifyContent: 'center',
+ paddingHorizontal: 20,
+ },
+ text: {
+ textAlign: 'center',
+ },
+ buttonContainer: {
+ flexDirection: 'row',
+ alignItems: 'stretch',
+ marginTop: 15,
+ },
+ button: {
+ flex: 1,
+ justifyContent: 'center',
+ alignItems: 'center',
+ backgroundColor: '#eee',
+ padding: 10,
+ },
+ middleButton: {
+ borderLeftWidth: 1,
+ borderRightWidth: 1,
+ borderColor: '#ccc',
+ },
+});
+/* @end */
+```
+
+
+
+## API
+
+```js
+import { Accelerometer } from 'expo-sensors';
+```
+
+
\ No newline at end of file
diff --git a/docs/pages/versions/v49.0.0/sdk/apple-authentication.mdx b/docs/pages/versions/v49.0.0/sdk/apple-authentication.mdx
new file mode 100644
index 0000000000000..a3560a4ec8152
--- /dev/null
+++ b/docs/pages/versions/v49.0.0/sdk/apple-authentication.mdx
@@ -0,0 +1,157 @@
+---
+title: AppleAuthentication
+sourceCodeUrl: 'https://github.com/expo/expo/tree/sdk-49/packages/expo-apple-authentication'
+packageName: 'expo-apple-authentication'
+---
+
+import { ConfigReactNative, ConfigPluginExample } from '~/components/plugins/ConfigSection';
+import APISection from '~/components/plugins/APISection';
+import { APIInstallSection } from '~/components/plugins/InstallSection';
+import PlatformsSection from '~/components/plugins/PlatformsSection';
+import { SnackInline } from '~/ui/components/Snippet';
+
+`expo-apple-authentication` provides Apple authentication for iOS 13+. It does not yet support lower iOS versions, Android, or the web.
+
+Beginning with iOS 13, any app that includes third-party authentication options **must** provide Apple authentication as an option
+in order to comply with App Store Review guidelines. For more information, see Apple authentication on the [Sign In with Apple](https://developer.apple.com/sign-in-with-apple/) website.
+
+
+
+## Installation
+
+
+
+## Configuration in app.json/app.config.js
+
+You can configure `expo-apple-authentication` using its built-in [config plugin](/config-plugins/introduction/) if you use config plugins
+in your project ([EAS Build](/build/introduction) or `npx expo run:[android|ios]`).
+The plugin allows you to configure various properties that cannot be set at runtime and require building a new app binary to take effect.
+If your app does **not** use EAS Build, then you'll need to manually configure the package.
+
+
+
+> This plugin is included automatically when installed.
+
+Running [EAS Build](/build/introduction) locally will use [iOS capabilities signing](/build-reference/ios-capabilities) to enable the required capabilities before building.
+
+```json app.json
+{
+ "expo": {
+ "plugins": ["expo-apple-authentication"]
+ }
+}
+```
+
+
+
+
+
+Apps that don't use [EAS Build](/build/introduction) must [manually configure](/build-reference/ios-capabilities#manual-setup)
+the **Apple Sign In** capability for their bundle identifier.
+
+If you enable the **Apple Sign In** capability through the [Apple Developer Console](/build-reference/ios-capabilities#apple-developer-console),
+then be sure to add the following entitlements in your **ios/[app]/[app].entitlements** file:
+
+```xml
+com.apple.developer.applesignin
+
+ Default
+
+```
+
+Also be sure to set `CFBundleAllowMixedLocalizations` to `true` in your **ios/[app]/Info.plist** to ensure the sign in button uses the device locale.
+
+
+
+## Usage
+
+
+
+```jsx
+import * as AppleAuthentication from 'expo-apple-authentication';
+import { View, StyleSheet } from 'react-native';
+
+export default function App() {
+ return (
+
+ {
+ try {
+ const credential = await AppleAuthentication.signInAsync({
+ requestedScopes: [
+ AppleAuthentication.AppleAuthenticationScope.FULL_NAME,
+ AppleAuthentication.AppleAuthenticationScope.EMAIL,
+ ],
+ });
+ // signed in
+ } catch (e) {
+ if (e.code === 'ERR_REQUEST_CANCELED') {
+ // handle that the user canceled the sign-in flow
+ } else {
+ // handle other errors
+ }
+ }
+ }}
+ />
+
+ );
+}
+
+/* @hide const styles = StyleSheet.create({ ... }); */
+const styles = StyleSheet.create({
+ container: {
+ flex: 1,
+ alignItems: 'center',
+ justifyContent: 'center',
+ },
+ button: {
+ width: 200,
+ height: 44,
+ },
+});
+/* @end */
+```
+
+
+
+## Development and Testing
+
+You can test this library in Expo Go on iOS without following any of the instructions above.
+However, you'll need to add the config plugin to use this library if you are using EAS Build.
+When you sign into Expo Go, the identifiers and values you receive will likely be different than what you'll receive in standalone apps.
+
+You can do limited testing of this library on the iOS Simulator. However, not all methods will behave the same as on a device,
+so we highly recommend testing on a real device when possible while developing.
+
+## Verifying the Response from Apple
+
+Apple's response includes a signed JWT with information about the user. To ensure that the response came from Apple,
+you can cryptographically verify the signature with Apple's public key, which is published at https://appleid.apple.com/auth/keys.
+This process is not specific to Expo.
+
+## API
+
+```js
+import * as AppleAuthentication from 'expo-apple-authentication';
+```
+
+
+
+## Error Codes
+
+Most of the error codes matches the official [Apple Authorization errors](https://developer.apple.com/documentation/authenticationservices/asauthorizationerror/code).
+
+| Code | Description |
+| --------------------------- | -------------------------------------------------------------------------------------- |
+| ERR_INVALID_OPERATION | An invalid authorization operation has been performed. |
+| ERR_INVALID_RESPONSE | The authorization request received an invalid response. |
+| ERR_INVALID_SCOPE | An invalid [`AppleAuthenticationScope`](#appleauthenticationscope) was passed in. |
+| ERR_REQUEST_CANCELED | The user canceled the authorization attempt. |
+| ERR_REQUEST_FAILED | The authorization attempt failed. See the error message for an additional information. |
+| ERR_REQUEST_NOT_HANDLED | The authorization request wasn’t correctly handled. |
+| ERR_REQUEST_NOT_INTERACTIVE | The authorization request isn’t interactive. |
+| ERR_REQUEST_UNKNOWN | The authorization attempt failed for an unknown reason. |
diff --git a/docs/pages/versions/v49.0.0/sdk/application.mdx b/docs/pages/versions/v49.0.0/sdk/application.mdx
new file mode 100644
index 0000000000000..8a71dbf13597b
--- /dev/null
+++ b/docs/pages/versions/v49.0.0/sdk/application.mdx
@@ -0,0 +1,36 @@
+---
+title: Application
+sourceCodeUrl: 'https://github.com/expo/expo/tree/sdk-49/packages/expo-application'
+packageName: 'expo-application'
+---
+
+import APISection from '~/components/plugins/APISection';
+import { APIInstallSection } from '~/components/plugins/InstallSection';
+import PlatformsSection from '~/components/plugins/PlatformsSection';
+
+**`expo-application`** provides useful information about the native application, itself, such as the ID, app name, and build version.
+
+
+
+## Installation
+
+
+
+## API
+
+```js
+import * as Application from 'expo-application';
+```
+
+
+
+## Error Codes
+
+| Code | Description |
+| ----------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
+| ERR_APPLICATION_PACKAGE_NAME_NOT_FOUND | Error code thrown by `getInstallationTimeAsync` and `getLastUpdateTimeAsync`. This may be thrown if the package information or package name could not be retrieved. |
+| ERR_APPLICATION_INSTALL_REFERRER_UNAVAILABLE | The current Play Store app doesn't provide the installation referrer API, or the Play Store may not be installed. This error code may come up when testing on an AVD that doesn't come with the Play Store pre-installed, such as the Google Pixel 3 and Nexus 6. |
+| ERR_APPLICATION_INSTALL_REFERRER_CONNECTION | A connection could not be established to the Google Play Store. |
+| ERR_APPLICATION_INSTALL_REFERRER_REMOTE_EXCEPTION | A `RemoteException` was thrown after a connection was established to the Play Store. This may happen if the process hosting the remote object is no longer available, which usually means the process crashed. See https://stackoverflow.com/questions/3156389/android-remoteexceptions-and-services. |
+| ERR_APPLICATION_INSTALL_REFERRER | General default case error code for the `getInstallReferrerAsync` method. This error code will be thrown if an exception occurred when getting the install referrer, but the exception was none of the more precise errors. The [`responseCode`](https://developer.android.com/reference/com/android/installreferrer/api/InstallReferrerClient.InstallReferrerResponse.html) is provided along with the error. |
+| ERR_APPLICATION_INSTALL_REFERRER_SERVICE_DISCONNECTED | Connection to the install referrer service was lost. This error is thrown when an attempt was made to connect and set up the install referrer service, but the connection was lost. See the [Android documentation](https://developer.android.com/reference/com/android/installreferrer/api/InstallReferrerStateListener) for more information. |
diff --git a/docs/pages/versions/v49.0.0/sdk/asset.mdx b/docs/pages/versions/v49.0.0/sdk/asset.mdx
new file mode 100644
index 0000000000000..c686182a3afe4
--- /dev/null
+++ b/docs/pages/versions/v49.0.0/sdk/asset.mdx
@@ -0,0 +1,25 @@
+---
+title: Asset
+sourceCodeUrl: 'https://github.com/expo/expo/tree/sdk-49/packages/expo-asset'
+packageName: 'expo-asset'
+---
+
+import APISection from '~/components/plugins/APISection';
+import { APIInstallSection } from '~/components/plugins/InstallSection';
+import PlatformsSection from '~/components/plugins/PlatformsSection';
+
+**`expo-asset`** provides an interface to Expo's asset system. An asset is any file that lives alongside the source code of your app that the app needs at runtime. Examples include images, fonts, and sounds. Expo's asset system integrates with React Native's, so that you can refer to files with `require('path/to/file')`. This is how you refer to static image files in React Native for use in an `Image` component, for example. Check out React Native's [documentation on static image resources](https://reactnative.dev/docs/images#static-image-resources) for more information. This method of referring to static image resources works out of the box with Expo.
+
+
+
+## Installation
+
+
+
+## API
+
+```js
+import { Asset } from 'expo-asset';
+```
+
+
diff --git a/docs/pages/versions/v49.0.0/sdk/async-storage.mdx b/docs/pages/versions/v49.0.0/sdk/async-storage.mdx
new file mode 100644
index 0000000000000..3c085f52b9fb0
--- /dev/null
+++ b/docs/pages/versions/v49.0.0/sdk/async-storage.mdx
@@ -0,0 +1,20 @@
+---
+title: AsyncStorage
+sourceCodeUrl: 'https://github.com/react-native-async-storage/async-storage'
+packageName: '@react-native-async-storage/async-storage'
+---
+
+import { APIInstallSection } from '~/components/plugins/InstallSection';
+import PlatformsSection from '~/components/plugins/PlatformsSection';
+
+An asynchronous, unencrypted, persistent, key-value storage API.
+
+
+
+## Installation
+
+
+
+## Usage
+
+See full documentation at [https://react-native-async-storage.github.io/async-storage/](https://react-native-async-storage.github.io/async-storage/docs/usage).
diff --git a/docs/pages/versions/v49.0.0/sdk/audio.mdx b/docs/pages/versions/v49.0.0/sdk/audio.mdx
new file mode 100644
index 0000000000000..ad3d1590bb248
--- /dev/null
+++ b/docs/pages/versions/v49.0.0/sdk/audio.mdx
@@ -0,0 +1,198 @@
+---
+title: Audio
+sourceCodeUrl: 'https://github.com/expo/expo/tree/sdk-49/packages/expo-av'
+packageName: 'expo-av'
+iconUrl: '/static/images/packages/expo-av.png'
+---
+
+import { APIInstallSection } from '~/components/plugins/InstallSection';
+import PlatformsSection from '~/components/plugins/PlatformsSection';
+import { SnackInline} from '~/ui/components/Snippet';
+import APISection from '~/components/plugins/APISection';
+import { PlatformTags } from '~/ui/components/Tag';
+
+**`expo-av`** allows you to implement audio playback and recording in your app.
+
+Note that audio automatically stops if headphones / bluetooth audio devices are disconnected.
+
+Try the [playlist example app](https://expo.dev/@documentation/playlist-example) (source code is [on GitHub](https://github.com/expo/playlist-example)) to see an example usage of the media playback API, and the [recording example app](https://expo.dev/@documentation/record) (source code is [on GitHub](https://github.com/expo/audio-recording-example)) to see an example usage of the recording API.
+
+
+
+## Installation
+
+
+
+## Usage
+
+### Playing sounds
+
+
+
+```jsx
+import * as React from 'react';
+import { Text, View, StyleSheet, Button } from 'react-native';
+import { Audio } from 'expo-av';
+
+export default function App() {
+ const [sound, setSound] = React.useState();
+
+ async function playSound() {
+ console.log('Loading Sound');
+ /* @info */ const { sound } = await Audio.Sound.createAsync(
+ /* @end */ require('./assets/Hello.mp3')
+ );
+ setSound(sound);
+
+ console.log('Playing Sound');
+ await /* @info */ sound.playAsync(); /* @end */
+ }
+
+ React.useEffect(() => {
+ return sound
+ ? () => {
+ console.log('Unloading Sound');
+ /* @info Always unload the Sound after using it to prevent memory leaks.*/ sound.unloadAsync(); /* @end */
+ }
+ : undefined;
+ }, [sound]);
+
+ return (
+
+
+
+ );
+}
+
+/* @hide const styles = StyleSheet.create({ ... }); */
+const styles = StyleSheet.create({
+ container: {
+ flex: 1,
+ justifyContent: 'center',
+ backgroundColor: '#ecf0f1',
+ padding: 10,
+ },
+});
+/* @end */
+```
+
+
+
+### Recording sounds
+
+
+
+```jsx
+import * as React from 'react';
+import { Text, View, StyleSheet, Button } from 'react-native';
+import { Audio } from 'expo-av';
+
+export default function App() {
+ const [recording, setRecording] = React.useState();
+
+ async function startRecording() {
+ try {
+ console.log('Requesting permissions..');
+ /* @info */ await Audio.requestPermissionsAsync();
+ await Audio.setAudioModeAsync({
+ allowsRecordingIOS: true,
+ playsInSilentModeIOS: true,
+ }); /* @end */
+
+ console.log('Starting recording..');
+ /* @info */ const { recording } = await Audio.Recording.createAsync(
+ /* @end */ Audio.RecordingOptionsPresets.HIGH_QUALITY
+ );
+ setRecording(recording);
+ console.log('Recording started');
+ } catch (err) {
+ console.error('Failed to start recording', err);
+ }
+ }
+
+ async function stopRecording() {
+ console.log('Stopping recording..');
+ setRecording(undefined);
+ /* @info */ await recording.stopAndUnloadAsync(); /* @end */
+ /* @info iOS may reroute audio playback to the phone earpiece when recording is allowed, so disable once finished. */ await Audio.setAudioModeAsync({
+ allowsRecordingIOS: false,
+ }); /* @end */
+ /* @info */ const uri = recording.getURI(); /* @end */
+ console.log('Recording stopped and stored at', uri);
+ }
+
+ return (
+
+
+
+ );
+}
+
+/* @hide const styles = StyleSheet.create({ ... }); */
+const styles = StyleSheet.create({
+ container: {
+ flex: 1,
+ justifyContent: 'center',
+ backgroundColor: '#ecf0f1',
+ padding: 10,
+ },
+});
+/* @end */
+```
+
+
+
+### Playing or recording audio in background
+
+On iOS, audio playback and recording in background is only available in standalone apps, and it requires some extra configuration.
+On iOS, each background feature requires a special key in `UIBackgroundModes` array in your **Info.plist** file.
+In standalone apps this array is empty by default, so in order to use background features you will need to add appropriate keys to your **app.json** configuration.
+
+See an example of **app.json** that enables audio playback in background:
+
+```json
+{
+ "expo": {
+ ...
+ "ios": {
+ ...
+ "infoPlist": {
+ ...
+ "UIBackgroundModes": [
+ "audio"
+ ]
+ }
+ }
+ }
+}
+```
+
+### Notes on web usage
+
+- A MediaRecorder issue on Chrome produces WebM files missing the duration metadata. [See the open Chromium issue](https://bugs.chromium.org/p/chromium/issues/detail?id=642012)
+- MediaRecorder encoding options and other configurations are inconsistent across browsers, utilising a Polyfill such as [kbumsik/opus-media-recorder](https://github.com/kbumsik/opus-media-recorder)
+ or [ai/audio-recorder-polyfill](https://github.com/ai/audio-recorder-polyfill) in your application will improve your experience.
+ Any options passed to `prepareToRecordAsync` will be passed directly to the MediaRecorder API and as such the polyfill.
+- Web browsers require sites to be served securely in order for them to listen to a mic.
+ See [MediaDevices#getUserMedia Security](https://developer.mozilla.org/en-US/docs/Web/API/MediaDevices/getUserMedia#security) for more details.
+
+## API
+
+```js
+import { Audio } from 'expo-av';
+```
+
+
+
+## Unified API
+
+The rest of the API on the `Sound.Audio` is the same as the API for `Video` component `ref` - see the [AV documentation](av/#playback) for further information.
diff --git a/docs/pages/versions/v49.0.0/sdk/auth-session.mdx b/docs/pages/versions/v49.0.0/sdk/auth-session.mdx
new file mode 100644
index 0000000000000..22846090a3de2
--- /dev/null
+++ b/docs/pages/versions/v49.0.0/sdk/auth-session.mdx
@@ -0,0 +1,168 @@
+---
+title: AuthSession
+sourceCodeUrl: 'https://github.com/expo/expo/tree/sdk-49/packages/expo-auth-session'
+packageName: 'expo-auth-session'
+---
+
+import APISection from '~/components/plugins/APISection';
+import PlatformsSection from '~/components/plugins/PlatformsSection';
+import { APIInstallSection } from '~/components/plugins/InstallSection';
+import { ConfigReactNative } from '~/components/plugins/ConfigSection';
+
+import { Terminal } from '~/ui/components/Snippet';
+
+`AuthSession` is the easiest way to add web browser based authentication (for example, browser-based OAuth flows) to your app, built on top of [WebBrowser](webbrowser.mdx) and [Crypto](crypto.mdx). If you would like to understand how it does this, read this document from top to bottom. If you just want to use it, jump to the [Authentication Guide](/guides/authentication).
+
+
+
+## Installation
+
+> `expo-crypto` is a peer dependency and must be installed alongside `expo-auth-session`.
+
+
+
+
+
+Use the [`uri-scheme` CLI][n-uri-scheme] to easily add, remove, list, and open your URIs.
+
+To make your native app handle `mycoolredirect://` simply run:
+
+
+
+You should now be able to see a list of all your project's schemes by running:
+
+
+
+You can test it to ensure it works like this:
+
+
+
+
+
+### Usage in standalone apps
+
+```json app.json
+{
+ "expo": {
+ "scheme": "mycoolredirect"
+ }
+}
+```
+
+In order to be able to deep link back into your app, you will need to set a `scheme` in your project **app.config.js**, or **app.json**, and then build your standalone app (it can't be updated with an update). If you do not include a scheme, the authentication flow will complete but it will be unable to pass the information back into your application and the user will have to manually exit the authentication modal (resulting in a cancelled event).
+
+## Guides
+
+> The guides have moved: [Authentication Guide](/guides/authentication.mdx).
+
+## How web browser based authentication flows work
+
+The typical flow for browser-based authentication in mobile apps is as follows:
+
+- **Initiation**: the user presses a sign in button
+- **Open web browser**: the app opens up a web browser to the authentication provider sign in page. The url that is opened for the sign in page usually includes information to identify the app, and a URL to redirect to on success. _Note: the web browser should share cookies with your system web browser so that users do not need to sign in again if they are already authenticated on the system browser -- Expo's [WebBrowser](webbrowser.mdx) API takes care of this._
+- **Authentication provider redirects**: upon successful authentication, the authentication provider should redirect back to the application by redirecting to URL provided by the app in the query parameters on the sign in page ([read more about how linking works in mobile apps](../../../guides/linking.mdx)), _provided that the URL is in the allowlist of allowed redirect URLs_. Allowlisting redirect URLs is important to prevent malicious actors from pretending to be your application. The redirect includes data in the URL (such as user id and token), either in the location hash, query parameters, or both.
+- **App handles redirect**: the redirect is handled by the app and data is parsed from the redirect URL.
+
+## Security considerations
+
+- **Never put any secret keys inside of your application code, there is no secure way to do this!** Instead, you should store your secret key(s) on a server and expose an endpoint that makes API calls for your client and passes the data back.
+
+## API
+
+```js
+import * as AuthSession from 'expo-auth-session';
+```
+
+
+
+## Providers
+
+AuthSession has built-in support for some popular providers to make usage as easy as possible. These allow you to skip repetitive things like defining endpoints and abstract common features like `language`.
+
+## Google
+
+```tsx
+import * as Google from 'expo-auth-session/providers/google';
+```
+
+- See the guide for more info on usage: [Google Authentication](/guides/authentication.mdx#google).
+- Provides an extra `loginHint` parameter. If the user's email address is known ahead of time, it can be supplied to be the default option.
+- Enforces minimum scopes to `['openid', 'https://www.googleapis.com/auth/userinfo.profile', 'https://www.googleapis.com/auth/userinfo.email']` for optimal usage with services like Firebase and Auth0.
+- By default, the authorization `code` will be automatically exchanged for an access token. This can be overridden with `shouldAutoExchangeCode`.
+- Defaults to using the bundle ID and package name for the native URI redirect instead of the reverse client ID.
+- Disables PKCE for implicit and id-token based auth responses.
+- On web, the popup is presented with the dimensions that are optimized for the Google login UI (`{ width: 515, height: 680 }`).
+
+### `useAuthRequest()`
+
+A hook used for opinionated Google authentication that works across platforms.
+
+#### Arguments
+
+- **config (`GoogleAuthRequestConfig`)** - A [`GoogleAuthRequestConfig`](#googleauthrequestconfig) object with client IDs for each platform that should be supported.
+- **redirectUriOptions (`AuthSessionRedirectUriOptions`)** - Optional properties used to construct the redirect URI (passed to `makeRedirectUri()`).
+
+#### Returns
+
+- **request (`GoogleAuthRequest | null`)** - An instance of [`GoogleAuthRequest`](#googleauthrequest) that can be used to prompt the user for authorization. This will be `null` until the auth request has finished loading.
+- **response (`AuthSessionResult | null`)** - This is `null` until `promptAsync` has been invoked. Once fulfilled it will return information about the authorization.
+- **promptAsync (`function`)** - When invoked, a web browser will open up and prompt the user for authentication. Accepts an [`AuthRequestPromptOptions`](#authrequestpromptoptions) object with options about how the prompt will execute.
+
+### `discovery`
+
+A [`DiscoveryDocument`](#discoverydocument) object containing the discovery URLs used for Google auth.
+
+## Facebook
+
+```tsx
+import * as Facebook from 'expo-auth-session/providers/facebook';
+```
+
+- Uses implicit auth (`ResponseType.Token`) by default.
+- See the guide for more info on usage: [Facebook Authentication](/guides/authentication.mdx#facebook).
+- Enforces minimum scopes to `['public_profile', 'email']` for optimal usage with services like Firebase and Auth0.
+- Uses `display=popup` for better UI results.
+- The URI redirect must be added to your **app.config.js** or **app.json** as `facebookScheme: 'fb'`.
+- Disables PKCE for implicit auth response.
+- On web, the popup is presented with the dimensions `{ width: 700, height: 600 }`
+
+### `useAuthRequest()`
+
+A hook used for opinionated Facebook authentication that works across platforms.
+
+#### Arguments
+
+- **config (`FacebookAuthRequestConfig`)** - A [`FacebookAuthRequestConfig`](#facebookauthrequestconfig) object with client IDs for each platform that should be supported.
+- **redirectUriOptions (`AuthSessionRedirectUriOptions`)** - Optional properties used to construct the redirect URI (passed to `makeRedirectUri()`).
+
+#### Returns
+
+- **request (`FacebookAuthRequest | null`)** - An instance of [`FacebookAuthRequest`](#facebookauthrequest) that can be used to prompt the user for authorization. This will be `null` until the auth request has finished loading.
+- **response (`AuthSessionResult | null`)** - This is `null` until `promptAsync` has been invoked. Once fulfilled it will return information about the authorization.
+- **promptAsync (`function`)** - When invoked, a web browser will open up and prompt the user for authentication. Accepts an [`AuthRequestPromptOptions`](#authrequestpromptoptions) object with options about how the prompt will execute.
+
+### `discovery`
+
+A [`DiscoveryDocument`](#discoverydocument) object containing the discovery URLs used for Facebook auth.
+
+## Advanced usage
+
+### Filtering out AuthSession events in Linking handlers
+
+There are many reasons why you might want to handle inbound links into your app, such as push notifications or just regular deep linking (you can read more about this in the [Linking guide](../../../guides/linking.mdx)); authentication redirects are only one type of deep link, and `AuthSession` handles these particular links for you. In your own `Linking.addEventListener` handlers, you can filter out deep links that are handled by `AuthSession` by checking if the URL includes the `+expo-auth-session` string -- if it does, you can ignore it. This works because `AuthSession` adds `+expo-auth-session` to the default `returnUrl`; however, if you provide your own `returnUrl`, you may want to consider adding a similar identifier to enable you to filter out `AuthSession` events from other handlers.
+
+### With React Navigation
+
+If you are using deep linking with React Navigation, filtering through `Linking.addEventListener` will not be sufficient because deep linking is [handled differently](https://reactnavigation.org/docs/configuring-links/#advanced-cases). Instead, to filter these events, add a custom `getStateFromPath` function to your linking configuration, and then filter by URL in the same way as described above.
+
+[n-uri-scheme]: https://www.npmjs.com/package/uri-scheme
diff --git a/docs/pages/versions/v49.0.0/sdk/av.mdx b/docs/pages/versions/v49.0.0/sdk/av.mdx
new file mode 100644
index 0000000000000..e0e67ef40a91b
--- /dev/null
+++ b/docs/pages/versions/v49.0.0/sdk/av.mdx
@@ -0,0 +1,202 @@
+---
+title: AV
+sourceCodeUrl: 'https://github.com/expo/expo/tree/sdk-49/packages/expo-av'
+packageName: 'expo-av'
+iconUrl: '/static/images/packages/expo-av.png'
+---
+
+import { APIInstallSection } from '~/components/plugins/InstallSection';
+import APISection from '~/components/plugins/APISection';
+import PlatformsSection from '~/components/plugins/PlatformsSection';
+import {
+ ConfigReactNative,
+ ConfigPluginExample,
+ ConfigPluginProperties,
+} from '~/components/plugins/ConfigSection';
+import { AndroidPermissions, IOSPermissions } from '~/components/plugins/permissions';
+
+The [`Audio.Sound`](audio.mdx) objects and [`Video`](video.mdx) components share a unified imperative API for media playback.
+
+Note that for `Video`, all of the operations are also available via props on the component. However, we recommend using this imperative playback API for most applications where finer control over the state of the video playback is needed.
+
+Try the [playlist example app](http://expo.dev/@community/playlist) (source code is [on GitHub](https://github.com/expo/playlist-example)) to see an example usage of the playback API for both `Audio.Sound` and `Video`.
+
+
+
+## Installation
+
+
+
+## Configuration in app.json/app.config.js
+
+You can configure `expo-av` using its built-in [config plugin](/config-plugins/introduction/) if you use config plugins in your project ([EAS Build](/build/introduction) or `npx expo run:[android|ios]`). The plugin allows you to configure various properties that cannot be set at runtime and require building a new app binary to take effect.
+
+
+
+```json app.json
+{
+ "expo": {
+ "plugins": [
+ [
+ "expo-av",
+ {
+ "microphonePermission": "Allow $(PRODUCT_NAME) to access your microphone."
+ }
+ ]
+ ]
+ }
+}
+```
+
+
+
+
+
+
+
+Learn how to configure the native projects in the [installation instructions in the `expo-av` repository](https://github.com/expo/expo/tree/main/packages/expo-av#installation-in-bare-react-native-projects).
+
+
+
+## Usage
+
+On this page, we reference operations on `playbackObject`s. Here is an example of obtaining access to the reference for both sound and video:
+
+### Example: `Audio.Sound`
+
+```javascript
+await Audio.setAudioModeAsync({ playsInSilentModeIOS: true });
+
+const playbackObject = new Audio.Sound();
+// OR
+const { sound: playbackObject } = await Audio.Sound.createAsync(
+ { uri: 'http://foo/bar.mp3' },
+ { shouldPlay: true }
+);
+...
+```
+
+See the [audio documentation](audio.mdx) for further information on `Audio.Sound.createAsync()`.
+
+### Example: `Video`
+
+```javascript
+...
+_handleVideoRef = component => {
+ const playbackObject = component;
+ ...
+}
+
+...
+
+render() {
+ return (
+ ...
+
+ ...
+ )
+}
+...
+```
+
+See the [video documentation](video.mdx) for further information.
+
+### Example: `setOnPlaybackStatusUpdate()`
+
+```javascript
+_onPlaybackStatusUpdate = playbackStatus => {
+ if (!playbackStatus.isLoaded) {
+ // Update your UI for the unloaded state
+ if (playbackStatus.error) {
+ console.log(`Encountered a fatal error during playback: ${playbackStatus.error}`);
+ // Send Expo team the error on Slack or the forums so we can help you debug!
+ }
+ } else {
+ // Update your UI for the loaded state
+
+ if (playbackStatus.isPlaying) {
+ // Update your UI for the playing state
+ } else {
+ // Update your UI for the paused state
+ }
+
+ if (playbackStatus.isBuffering) {
+ // Update your UI for the buffering state
+ }
+
+ if (playbackStatus.didJustFinish && !playbackStatus.isLooping) {
+ // The player has just finished playing and will stop. Maybe you want to play something else?
+ }
+
+ ... // etc
+ }
+};
+
+... // Load the playbackObject and obtain the reference.
+playbackObject.setOnPlaybackStatusUpdate(this._onPlaybackStatusUpdate);
+...
+```
+
+### Example: Loop media exactly 20 times
+
+```javascript
+const N = 20;
+...
+
+_onPlaybackStatusUpdate = (playbackStatus) => {
+ if (playbackStatus.didJustFinish) {
+ if (this.state.numberOfLoops == N - 1) {
+ playbackObject.setIsLooping(false);
+ }
+ this.setState({ numberOfLoops: this.state.numberOfLoops + 1 });
+ }
+};
+
+...
+this.setState({ numberOfLoops: 0 });
+... // Load the playbackObject and obtain the reference.
+playbackObject.setOnPlaybackStatusUpdate(this._onPlaybackStatusUpdate);
+playbackObject.setIsLooping(true);
+...
+```
+
+## What is seek tolerance and why would I want to use it [iOS only]
+
+When asked to seek an A/V item, native player in iOS sometimes may seek to a slightly different time. This technique, mentioned in [Apple documentation](https://developer.apple.com/documentation/avfoundation/avplayer/1387741-seek#discussion), is used to shorten the time of the `seekTo` call (the player may decide to play immediately from a different time than requested, instead of decoding the exact requested part and playing it with the decoding delay).
+
+If precision is important, you can specify the tolerance with which the player will seek. However, this will result in an increased delay.
+
+## API
+
+```js
+import { Audio, Video } from 'expo-av';
+```
+
+
+
+## Permissions
+
+### Android
+
+You must add the following permissions to your **app.json** inside the [`expo.android.permissions`](/versions/latest/config/app/#permissions) array.
+
+
+
+### iOS
+
+The following usage description keys are used by this library:
+
+
diff --git a/docs/pages/versions/v49.0.0/sdk/background-fetch.mdx b/docs/pages/versions/v49.0.0/sdk/background-fetch.mdx
new file mode 100644
index 0000000000000..cfb8db16b068a
--- /dev/null
+++ b/docs/pages/versions/v49.0.0/sdk/background-fetch.mdx
@@ -0,0 +1,194 @@
+---
+title: BackgroundFetch
+sourceCodeUrl: 'https://github.com/expo/expo/tree/sdk-49/packages/expo-background-fetch'
+packageName: 'expo-background-fetch'
+---
+
+import { APIInstallSection } from '~/components/plugins/InstallSection';
+import APISection from '~/components/plugins/APISection';
+import PlatformsSection from '~/components/plugins/PlatformsSection';
+import ImageSpotlight from '~/components/plugins/ImageSpotlight';
+import { SnackInline } from '~/ui/components/Snippet';
+import { PlatformTags } from '~/ui/components/Tag';
+import { ConfigReactNative } from '~/components/plugins/ConfigSection';
+import { AndroidPermissions } from '~/components/plugins/permissions';
+
+`expo-background-fetch` provides an API to perform [background fetch](https://developer.apple.com/documentation/uikit/core_app/managing_your_app_s_life_cycle/preparing_your_app_to_run_in_the_background/updating_your_app_with_background_app_refresh) tasks, allowing you to run specific code periodically in the background to update your app. This module uses [TaskManager](task-manager.mdx) Native API under the hood.
+
+
+
+#### Known issues
+
+`BackgroundFetch` only works when the app is backgrounded, not if the app was terminated or upon device reboot.
+You can check out [the relevant GitHub issue](https://github.com/expo/expo/issues/3582) for more details.
+
+## Installation
+
+
+
+## Configuration
+
+
+
+Learn how to configure the native projects in the [installation instructions in the `expo-background-fetch` repository](https://github.com/expo/expo/tree/main/packages/expo-background-fetch#installation-in-bare-react-native-projects).
+
+
+
+## Usage
+
+Below is an example that demonstrates how to use `expo-background-fetch`.
+
+
+
+```tsx
+import React from 'react';
+import { StyleSheet, Text, View, Button } from 'react-native';
+import * as BackgroundFetch from 'expo-background-fetch';
+import * as TaskManager from 'expo-task-manager';
+
+const BACKGROUND_FETCH_TASK = 'background-fetch';
+
+// 1. Define the task by providing a name and the function that should be executed
+// Note: This needs to be called in the global scope (e.g outside of your React components)
+TaskManager.defineTask(BACKGROUND_FETCH_TASK, async () => {
+ const now = Date.now();
+
+ console.log(`Got background fetch call at date: ${new Date(now).toISOString()}`);
+
+ // Be sure to return the successful result type!
+ return BackgroundFetch.BackgroundFetchResult.NewData;
+});
+
+// 2. Register the task at some point in your app by providing the same name,
+// and some configuration options for how the background fetch should behave
+// Note: This does NOT need to be in the global scope and CAN be used in your React components!
+async function registerBackgroundFetchAsync() {
+ return BackgroundFetch.registerTaskAsync(BACKGROUND_FETCH_TASK, {
+ minimumInterval: 60 * 15, // 15 minutes
+ stopOnTerminate: false, // android only,
+ startOnBoot: true, // android only
+ });
+}
+
+// 3. (Optional) Unregister tasks by specifying the task name
+// This will cancel any future background fetch calls that match the given name
+// Note: This does NOT need to be in the global scope and CAN be used in your React components!
+async function unregisterBackgroundFetchAsync() {
+ return BackgroundFetch.unregisterTaskAsync(BACKGROUND_FETCH_TASK);
+}
+
+export default function BackgroundFetchScreen() {
+ const [isRegistered, setIsRegistered] = React.useState(false);
+ const [status, setStatus] = React.useState(null);
+
+ React.useEffect(() => {
+ checkStatusAsync();
+ }, []);
+
+ const checkStatusAsync = async () => {
+ const status = await BackgroundFetch.getStatusAsync();
+ const isRegistered = await TaskManager.isTaskRegisteredAsync(BACKGROUND_FETCH_TASK);
+ setStatus(status);
+ setIsRegistered(isRegistered);
+ };
+
+ const toggleFetchTask = async () => {
+ if (isRegistered) {
+ await unregisterBackgroundFetchAsync();
+ } else {
+ await registerBackgroundFetchAsync();
+ }
+
+ checkStatusAsync();
+ };
+
+ return (
+
+
+
+ Background fetch status:{' '}
+
+ {status && BackgroundFetch.BackgroundFetchStatus[status]}
+
+
+
+ Background fetch task name:{' '}
+
+ {isRegistered ? BACKGROUND_FETCH_TASK : 'Not registered yet!'}
+
+
+
+
+
+
+ );
+}
+
+/* @hide const styles = StyleSheet.create({ ... }); */
+const styles = StyleSheet.create({
+ screen: {
+ flex: 1,
+ justifyContent: 'center',
+ alignItems: 'center',
+ },
+ textContainer: {
+ margin: 10,
+ },
+ boldText: {
+ fontWeight: 'bold',
+ },
+});
+/* @end */
+```
+
+
+
+## Triggering background fetches
+
+Background fetches can be difficult to test because they can happen inconsistently. Fortunately, you can trigger background fetches manually when developing your apps.
+
+For iOS, you can use the `Instruments` app on macOS to manually trigger background fetches:
+
+1. Open the Instruments app. The Instruments app can be searched through Spotlight (⌘ + Space) or opened from `/Applications/Xcode.app/Contents/Applications/Instruments.app`
+2. Select `Time Profiler`
+3. Select your device / simulator and pick the `Expo Go` app
+4. Press the `Record` button in the top left corner
+5. Navigate to the `Document` Menu and select `Simulate Background Fetch - Expo Go`:
+
+
+
+For Android, you can set the `minimumInterval` option of your task to a small number and background your application like so:
+
+```tsx
+async function registerBackgroundFetchAsync() {
+ return BackgroundFetch.registerTaskAsync(BACKGROUND_FETCH_TASK, {
+ minimumInterval: 1 * 60, // task will fire 1 minute after app is backgrounded
+ });
+}
+```
+
+## API
+
+```js
+import * as BackgroundFetch from 'expo-background-fetch';
+```
+
+
+
+## Permissions
+
+### Android
+
+On Android, this module might listen when the device is starting up. It's necessary to continue working on tasks started with `startOnBoot`. It also keeps devices "awake" that are going idle and asleep fast, to improve reliability of the tasks. Because of this both the `RECEIVE_BOOT_COMPLETED` and `WAKE_LOCK` permissions are added automatically.
+
+
+
+### iOS
+
+To use `BackgroundFetch` API in standalone apps on iOS, your app has to include background mode in the **Info.plist** file. See [background tasks configuration guide](task-manager.mdx#configuration-for-standalone-apps) for more details.
diff --git a/docs/pages/versions/v49.0.0/sdk/bar-code-scanner.mdx b/docs/pages/versions/v49.0.0/sdk/bar-code-scanner.mdx
new file mode 100644
index 0000000000000..5b885149f55d2
--- /dev/null
+++ b/docs/pages/versions/v49.0.0/sdk/bar-code-scanner.mdx
@@ -0,0 +1,192 @@
+---
+title: BarCodeScanner
+sourceCodeUrl: 'https://github.com/expo/expo/tree/sdk-49/packages/expo-barcode-scanner'
+packageName: 'expo-barcode-scanner'
+iconUrl: '/static/images/packages/expo-barcode-scanner.png'
+description: 'Allows scanning variety of supported barcodes both as standalone module and as extension for expo-camera.'
+---
+
+import APISection from '~/components/plugins/APISection';
+import { APIInstallSection } from '~/components/plugins/InstallSection';
+import PlatformsSection from '~/components/plugins/PlatformsSection';
+import { SnackInline } from '~/ui/components/Snippet';
+import { YesIcon, NoIcon } from '~/ui/components/DocIcons';
+import {
+ ConfigReactNative,
+ ConfigPluginExample,
+ ConfigPluginProperties,
+} from '~/components/plugins/ConfigSection';
+import { AndroidPermissions, IOSPermissions } from '~/components/plugins/permissions';
+
+`expo-barcode-scanner` provides a React component that renders a viewfinder for the device's camera (either front or back) and will scan bar codes that show up in the frame.
+
+
+
+#### Limitations
+
+> **info** Only one active `BarCodeScanner` preview is currently supported.
+
+When using navigation, the best practice is to unmount any previously rendered `BarCodeScanner` component so the following screens can use their own `BarCodeScanner` without any issue.
+
+## Installation
+
+
+
+## Configuration in app.json/app.config.js
+
+You can configure `expo-barcode-scanner` using its built-in [config plugin](/config-plugins/introduction/) if you use config plugins in your project ([EAS Build](/build/introduction) or `npx expo run:[android|ios]`). The plugin allows you to configure various properties that cannot be set at runtime and require building a new app binary to take effect.
+
+
+
+```json app.json
+{
+ "expo": {
+ "plugins": [
+ [
+ "expo-barcode-scanner",
+ {
+ "cameraPermission": "Allow $(PRODUCT_NAME) to access camera."
+ }
+ ]
+ ]
+ }
+}
+```
+
+
+
+
+
+
+
+Learn how to configure the native projects in the [installation instructions in the `expo-barcode-scanner` repository](https://github.com/expo/expo/tree/main/packages/expo-barcode-scanner#installation-in-bare-react-native-projects).
+
+
+
+## Supported formats
+
+| Bar code format | Android | iOS |
+| --------------- | ----------- | ------------- |
+| aztec | | |
+| codabar | | |
+| code39 | | \* |
+| code93 | | |
+| code128 | | |
+| code39mod43 | | |
+| datamatrix | | |
+| ean13 | | |
+| ean8 | | |
+| interleaved2of5 | use `itf14` | |
+| itf14 | | \* |
+| maxicode | | |
+| pdf417 | | \* |
+| rss14 | | |
+| rssexpanded | | |
+| upc_a | | |
+| upc_e | | |
+| upc_ean | | |
+| qr | | |
+
+#### Additional notes
+
+1. When an `ITF-14` barcode is recognized, it's type can sometimes be set to `interleaved2of5`.
+2. Scanning for either `PDF417` and/or `Code39` formats can result in a noticeable increase in battery consumption on iOS. It is recommended to provide only the bar code formats you expect to scan to the `barCodeTypes` prop.
+
+## Usage
+
+You must request permission to access the user's camera before attempting to get it. To do this, you will want to use the [Permissions](permissions.mdx) API. You can see this in practice in the following example.
+
+
+
+```jsx
+import React, { useState, useEffect } from 'react';
+import { Text, View, StyleSheet, Button } from 'react-native';
+import { BarCodeScanner } from 'expo-barcode-scanner';
+
+export default function App() {
+ const [hasPermission, setHasPermission] = useState(null);
+ const [scanned, setScanned] = useState(false);
+
+ useEffect(() => {
+ const getBarCodeScannerPermissions = async () => {
+ const { status } = await BarCodeScanner.requestPermissionsAsync();
+ setHasPermission(status === 'granted');
+ };
+
+ getBarCodeScannerPermissions();
+ }, []);
+
+ const handleBarCodeScanned = ({ type, data }) => {
+ setScanned(true);
+ alert(`Bar code with type ${type} and data ${data} has been scanned!`);
+ };
+
+ if (hasPermission === null) {
+ return Requesting for camera permission ;
+ }
+ if (hasPermission === false) {
+ return No access to camera ;
+ }
+
+ return (
+
+
+ {scanned && setScanned(false)} />}
+
+ );
+}
+
+/* @hide const styles = StyleSheet.create({ ... }); */
+const styles = StyleSheet.create({
+ container: {
+ flex: 1,
+ flexDirection: 'column',
+ justifyContent: 'center',
+ },
+});
+/* @end */
+```
+
+
+
+## API
+
+```js
+import { BarCodeScanner } from 'expo-barcode-scanner';
+```
+
+
+
+## Permissions
+
+### Android
+
+The following permissions are added automatically through this library's `AndroidManifest.xml`:
+
+
+
+### iOS
+
+The following usage description keys are used by this library:
+
+
diff --git a/docs/pages/versions/v49.0.0/sdk/barometer.mdx b/docs/pages/versions/v49.0.0/sdk/barometer.mdx
new file mode 100644
index 0000000000000..68c26aa5c7a65
--- /dev/null
+++ b/docs/pages/versions/v49.0.0/sdk/barometer.mdx
@@ -0,0 +1,98 @@
+---
+title: Barometer
+sourceCodeUrl: 'https://github.com/expo/expo/tree/sdk-49/packages/expo-sensors'
+packageName: 'expo-sensors'
+iconUrl: '/static/images/packages/expo-sensors.png'
+---
+
+import APISection from '~/components/plugins/APISection';
+import { APIInstallSection } from '~/components/plugins/InstallSection';
+import PlatformsSection from '~/components/plugins/PlatformsSection';
+import { SnackInline } from '~/ui/components/Snippet';
+import { NoIcon } from '~/ui/components/DocIcons';
+
+`Barometer` from **`expo-sensors`** provides access to the device barometer sensor to respond to changes in air pressure, which is measured in hectopascals (`hPa`).
+
+
+
+## Installation
+
+
+
+## Usage
+
+
+
+```jsx
+import React, { useState } from 'react';
+import { StyleSheet, Text, TouchableOpacity, View, Platform } from 'react-native';
+import { Barometer } from 'expo-sensors';
+
+export default function App() {
+ const [{ pressure, relativeAltitude }, setData] = useState({ pressure: 0, relativeAltitude: 0 });
+ const [subscription, setSubscription] = useState(null);
+
+ const toggleListener = () => {
+ subscription ? unsubscribe() : subscribe();
+ };
+
+ const subscribe = () => {
+ setSubscription(Barometer.addListener(setData));
+ };
+
+ const unsubscribe = () => {
+ subscription && subscription.remove();
+ setSubscription(null);
+ };
+
+ return (
+
+ Barometer: Listener {subscription ? 'ACTIVE' : 'INACTIVE'}
+ Pressure: {pressure} hPa
+
+ Relative Altitude:{' '}
+ {Platform.OS === 'ios' ? `${relativeAltitude} m` : `Only available on iOS`}
+
+
+ Toggle listener
+
+
+ );
+}
+
+/* @hide const styles = StyleSheet.create({ ... }); */
+const styles = StyleSheet.create({
+ button: {
+ justifyContent: 'center',
+ alignItems: 'center',
+ backgroundColor: '#eee',
+ padding: 10,
+ marginTop: 15,
+ },
+ wrapper: {
+ flex: 1,
+ alignItems: 'stretch',
+ justifyContent: 'center',
+ paddingHorizontal: 20,
+ },
+});
+/* @end */
+```
+
+
+
+## API
+
+```js
+import { Barometer } from 'expo-sensors';
+```
+
+
+
+## Units and Providers
+
+| OS | Units | Provider | Description |
+| ------- | ---------- | ------------------------------------------------------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------- |
+| iOS | _`hPa`_ | [`CMAltimeter`](https://developer.apple.com/documentation/coremotion/cmaltimeter) | Altitude events reflect the change in the current altitude, not the absolute altitude. |
+| Android | _`hPa`_ | [`Sensor.TYPE_PRESSURE`](https://developer.android.com/reference/android/hardware/Sensor#TYPE_PRESSURE) | Monitoring air pressure changes. |
+| Web | | | This sensor is not available on the web and cannot be accessed. An `UnavailabilityError` will be thrown if you attempt to get data. |
diff --git a/docs/pages/versions/v49.0.0/sdk/battery.mdx b/docs/pages/versions/v49.0.0/sdk/battery.mdx
new file mode 100644
index 0000000000000..b839fe59f5ae3
--- /dev/null
+++ b/docs/pages/versions/v49.0.0/sdk/battery.mdx
@@ -0,0 +1,83 @@
+---
+title: Battery
+sourceCodeUrl: 'https://github.com/expo/expo/tree/sdk-49/packages/expo-battery'
+packageName: 'expo-battery'
+iconUrl: '/static/images/packages/expo-battery.png'
+---
+
+import APISection from '~/components/plugins/APISection';
+import { APIInstallSection } from '~/components/plugins/InstallSection';
+import PlatformsSection from '~/components/plugins/PlatformsSection';
+import { SnackInline} from '~/ui/components/Snippet';
+
+**`expo-battery`** provides battery information for the physical device (such as battery level, whether or not the device is charging, and more) as well as corresponding event listeners.
+
+
+
+## Installation
+
+
+
+## Usage
+
+
+
+```jsx
+import { useEffect, useState, useCallback } from "react";
+import * as Battery from "expo-battery";
+import { StyleSheet, Text, View } from "react-native";
+
+export default function App() {
+ const [batteryLevel, setBatteryLevel] = useState(null);
+ const [subscription, setSubscription] = useState(null);
+
+ const _subscribe = async () => {
+ const batteryLevel = await Battery.getBatteryLevelAsync();
+ setBatteryLevel(batteryLevel);
+
+ setSubscription(
+ Battery.addBatteryLevelListener(({ batteryLevel }) => {
+ setBatteryLevel(batteryLevel);
+ console.log("batteryLevel changed!", batteryLevel);
+ })
+ );
+ };
+
+ const _unsubscribe = useCallback(() => {
+ subscription && subscription.remove();
+ setSubscription(null);
+ }, [subscription]);
+
+ useEffect(() => {
+ _subscribe();
+ return () => _unsubscribe();
+ }, [_unsubscribe]);
+
+ return (
+
+ Current Battery Level: {batteryLevel}
+
+ );
+}
+
+/* @hide const styles = StyleSheet.create({ ... }); */
+const styles = StyleSheet.create({
+ container: {
+ flex: 1,
+ marginTop: 15,
+ alignItems: 'center',
+ justifyContent: 'center',
+ },
+});
+/* @end */
+```
+
+
+
+## API
+
+```js
+import * as Battery from 'expo-battery';
+```
+
+
diff --git a/docs/pages/versions/v49.0.0/sdk/blur-view.mdx b/docs/pages/versions/v49.0.0/sdk/blur-view.mdx
new file mode 100644
index 0000000000000..6f8cf07c659b0
--- /dev/null
+++ b/docs/pages/versions/v49.0.0/sdk/blur-view.mdx
@@ -0,0 +1,81 @@
+---
+title: BlurView
+sourceCodeUrl: 'https://github.com/expo/expo/tree/sdk-49/packages/expo-blur'
+packageName: 'expo-blur'
+iconUrl: '/static/images/packages/expo-blur.png'
+---
+
+import APISection from '~/components/plugins/APISection';
+import { APIInstallSection } from '~/components/plugins/InstallSection';
+import PlatformsSection from '~/components/plugins/PlatformsSection';
+import { SnackInline} from '~/ui/components/Snippet';
+
+A React component that blurs everything underneath the view. On iOS, it renders a native blur view. On Android, it falls back to a semi-transparent view. Common usage of this is for navigation bars, tab bars, and modals.
+
+
+
+## Installation
+
+
+
+## Usage
+
+
+
+```jsx
+import React from 'react';
+import { Image, Text, StyleSheet, View } from 'react-native';
+import { BlurView } from 'expo-blur';
+
+const uri = 'https://s3.amazonaws.com/exp-icon-assets/ExpoEmptyManifest_192.png';
+
+export default function App() {
+ const text = 'Hello, my container is blurring contents underneath!';
+ return (
+
+
+
+ {text}
+
+
+ {text}
+
+
+ {text}
+
+
+ );
+}
+
+/* @hide const styles = StyleSheet.create({ ... }); */
+const styles = StyleSheet.create({
+ container: {
+ flex: 1,
+ },
+ image: {
+ width: '100%',
+ height: '100%',
+ resizeMode: 'cover',
+ },
+ blurContainer: {
+ flex: 1,
+ padding: 20,
+ justifyContent: 'center',
+ },
+ text: {
+ fontSize: 24,
+ fontWeight: '600',
+ },
+});
+/* @end */
+```
+
+
+
+## API
+
+```js
+import { BlurView } from 'expo-blur';
+```
+
+
diff --git a/docs/pages/versions/v49.0.0/sdk/brightness.mdx b/docs/pages/versions/v49.0.0/sdk/brightness.mdx
new file mode 100644
index 0000000000000..7ce8845a66b86
--- /dev/null
+++ b/docs/pages/versions/v49.0.0/sdk/brightness.mdx
@@ -0,0 +1,113 @@
+---
+title: Brightness
+sourceCodeUrl: 'https://github.com/expo/expo/tree/sdk-49/packages/expo-brightness'
+packageName: 'expo-brightness'
+iconUrl: '/static/images/packages/expo-brightness.png'
+---
+
+import APISection from '~/components/plugins/APISection';
+import { APIInstallSection } from '~/components/plugins/InstallSection';
+import PlatformsSection from '~/components/plugins/PlatformsSection';
+import { SnackInline } from '~/ui/components/Snippet';
+import { ConfigReactNative } from '~/components/plugins/ConfigSection';
+import { AndroidPermissions } from '~/components/plugins/permissions';
+
+An API to get and set screen brightness.
+
+On Android, there is a global system-wide brightness setting, and each app has its own brightness setting that can optionally override the global setting. It is possible to set either of these values with this API. On iOS, the system brightness setting cannot be changed programmatically; instead, any changes to the screen brightness will persist until the device is locked or powered off.
+
+
+
+## Installation
+
+
+
+## Configuration
+
+
+
+Learn how to configure the native projects in the [installation instructions in the `expo-brightness` repository](https://github.com/expo/expo/tree/main/packages/expo-brightness#installation-in-bare-react-native-projects).
+
+
+
+## Usage
+
+
+
+```jsx
+import React, { useEffect } from 'react';
+import { StyleSheet, View, Text } from 'react-native';
+import * as Brightness from 'expo-brightness';
+
+export default function App() {
+ useEffect(() => {
+ (async () => {
+ const { status } = await Brightness.requestPermissionsAsync();
+ if (status === 'granted') {
+ Brightness.setSystemBrightnessAsync(1);
+ }
+ })();
+ }, []);
+
+ return (
+
+ Brightness Module Example
+
+ );
+}
+
+/* @hide const styles = StyleSheet.create({ ... }); */
+const styles = StyleSheet.create({
+ container: {
+ flex: 1,
+ backgroundColor: '#fff',
+ alignItems: 'center',
+ justifyContent: 'center',
+ },
+});
+/* @end */
+```
+
+
+
+## API
+
+```js
+import * as Brightness from 'expo-brightness';
+```
+
+
+
+## Error Codes
+
+### `ERR_BRIGHTNESS`
+
+An error occurred when getting or setting the app brightness.
+
+### `ERR_BRIGHTNESS_MODE`
+
+An error occurred when getting or setting the system brightness mode. See the `nativeError` property of the thrown error for more information.
+
+### `ERR_BRIGHTNESS_PERMISSIONS_DENIED`
+
+An attempt to set the system brightness was made without the proper permissions from the user. The user did not grant `SYSTEM_BRIGHTNESS` permissions.
+
+### `ERR_BRIGHTNESS_SYSTEM`
+
+An error occurred when getting or setting the system brightness.
+
+### `ERR_INVALID_ARGUMENT`
+
+An invalid argument was passed. Only `BrightnessMode.MANUAL` or `BrightnessMode.AUTOMATIC` are allowed.
+
+## Permissions
+
+### Android
+
+You must add the following permissions to your **app.json** inside the [`expo.android.permissions`](/versions/latest/config/app/#permissions) array.
+
+
+
+### iOS
+
+_No permissions required_.
diff --git a/docs/pages/versions/v49.0.0/sdk/build-properties.mdx b/docs/pages/versions/v49.0.0/sdk/build-properties.mdx
new file mode 100644
index 0000000000000..dc9d87ce23236
--- /dev/null
+++ b/docs/pages/versions/v49.0.0/sdk/build-properties.mdx
@@ -0,0 +1,82 @@
+---
+title: BuildProperties
+sourceCodeUrl: 'https://github.com/expo/expo/tree/sdk-49/packages/expo-build-properties'
+packageName: 'expo-build-properties'
+---
+
+import APISection from '~/components/plugins/APISection';
+import { ConfigPluginExample } from '~/components/plugins/ConfigSection';
+import { APIInstallSection } from '~/components/plugins/InstallSection';
+import PlatformsSection from '~/components/plugins/PlatformsSection';
+
+`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).
+
+> **info** This config plugin configures how [Prebuild command](/workflow/prebuild) generates the native **android** and **ios** folders
+> and therefore cannot be used with projects that don't run `npx expo prebuild` (bare projects).
+
+
+
+## Installation
+
+
+
+## Usage
+
+
+
+```json app.json
+{
+ "expo": {
+ "plugins": [
+ [
+ "expo-build-properties",
+ {
+ "android": {
+ "compileSdkVersion": 31,
+ "targetSdkVersion": 31,
+ "buildToolsVersion": "31.0.0"
+ },
+ "ios": {
+ "deploymentTarget": "13.0"
+ }
+ }
+ ]
+ ]
+ }
+}
+```
+
+
+
+### Example app.config.js usage
+
+```js app.config.js
+export default {
+ expo: {
+ plugins: [
+ [
+ 'expo-build-properties',
+ {
+ android: {
+ compileSdkVersion: 31,
+ targetSdkVersion: 31,
+ buildToolsVersion: '31.0.0',
+ },
+ ios: {
+ deploymentTarget: '13.0',
+ },
+ },
+ ],
+ ],
+ },
+};
+```
+
+### All configurable properties
+
+[`PluginConfigType`](#pluginconfigtype) interface represents currently available configuration properties.
+
+## API
+
+
diff --git a/docs/pages/versions/v49.0.0/sdk/calendar.mdx b/docs/pages/versions/v49.0.0/sdk/calendar.mdx
new file mode 100644
index 0000000000000..fe28b681f72a9
--- /dev/null
+++ b/docs/pages/versions/v49.0.0/sdk/calendar.mdx
@@ -0,0 +1,158 @@
+---
+title: Calendar
+sourceCodeUrl: 'https://github.com/expo/expo/tree/sdk-49/packages/expo-calendar'
+packageName: 'expo-calendar'
+---
+
+import APISection from '~/components/plugins/APISection';
+import { APIInstallSection } from '~/components/plugins/InstallSection';
+import PlatformsSection from '~/components/plugins/PlatformsSection';
+import { SnackInline } from '~/ui/components/Snippet';
+import {
+ ConfigReactNative,
+ ConfigPluginExample,
+ ConfigPluginProperties,
+} from '~/components/plugins/ConfigSection';
+import { AndroidPermissions, IOSPermissions } from '~/components/plugins/permissions';
+
+`expo-calendar` provides an API for interacting with the device's system calendars, events, reminders, and associated records.
+
+
+
+## Installation
+
+
+
+## Configuration in app.json/app.config.js
+
+You can configure `expo-calendar` using its built-in [config plugin](/config-plugins/introduction/) if you use config plugins in your project ([EAS Build](/build/introduction) or `npx expo run:[android|ios]`). The plugin allows you to configure various properties that cannot be set at runtime and require building a new app binary to take effect.
+
+
+
+```json app.json
+{
+ "expo": {
+ "plugins": [
+ [
+ "expo-calendar",
+ {
+ "calendarPermission": "The app needs to access your calendar."
+ }
+ ]
+ ]
+ }
+}
+```
+
+
+
+
+
+
+
+Learn how to configure the native projects in the [installation instructions in the `expo-calendar` repository](https://github.com/expo/expo/tree/main/packages/expo-calendar#installation-in-bare-react-native-projects).
+
+
+
+## Usage
+
+
+
+```jsx
+import React, { useEffect } from 'react';
+import { StyleSheet, View, Text, Button, Platform } from 'react-native';
+import * as Calendar from 'expo-calendar';
+
+export default function App() {
+ useEffect(() => {
+ (async () => {
+ const { status } = await Calendar.requestCalendarPermissionsAsync();
+ if (status === 'granted') {
+ const calendars = await Calendar.getCalendarsAsync(Calendar.EntityTypes.EVENT);
+ console.log('Here are all your calendars:');
+ console.log({ calendars });
+ }
+ })();
+ }, []);
+
+ return (
+
+ Calendar Module Example
+
+
+ );
+}
+
+async function getDefaultCalendarSource() {
+ const defaultCalendar = await Calendar.getDefaultCalendarAsync();
+ return defaultCalendar.source;
+}
+
+async function createCalendar() {
+ const defaultCalendarSource =
+ Platform.OS === 'ios'
+ ? await getDefaultCalendarSource()
+ : { isLocalAccount: true, name: 'Expo Calendar' };
+ const newCalendarID = await Calendar.createCalendarAsync({
+ title: 'Expo Calendar',
+ color: 'blue',
+ entityType: Calendar.EntityTypes.EVENT,
+ sourceId: defaultCalendarSource.id,
+ source: defaultCalendarSource,
+ name: 'internalCalendarName',
+ ownerAccount: 'personal',
+ accessLevel: Calendar.CalendarAccessLevel.OWNER,
+ });
+ console.log(`Your new calendar ID is: ${newCalendarID}`);
+}
+
+/* @hide const styles = StyleSheet.create({ ... }); */
+const styles = StyleSheet.create({
+ container: {
+ flex: 1,
+ backgroundColor: '#fff',
+ alignItems: 'center',
+ justifyContent: 'space-around',
+ },
+});
+/* @end */
+```
+
+
+
+## API
+
+```js
+import * as Calendar from 'expo-calendar';
+```
+
+
+
+## Permissions
+
+### Android
+
+You must add the following permissions to your **app.json** inside the [`expo.android.permissions`](/versions/latest/config/app/#permissions) array.
+
+
+
+### iOS
+
+The following usage description keys are used by this library:
+
+
diff --git a/docs/pages/versions/v49.0.0/sdk/camera.mdx b/docs/pages/versions/v49.0.0/sdk/camera.mdx
new file mode 100644
index 0000000000000..1711df41a87a8
--- /dev/null
+++ b/docs/pages/versions/v49.0.0/sdk/camera.mdx
@@ -0,0 +1,191 @@
+---
+title: Camera
+sourceCodeUrl: 'https://github.com/expo/expo/tree/sdk-49/packages/expo-camera'
+packageName: 'expo-camera'
+iconUrl: '/static/images/packages/expo-camera.png'
+---
+
+import APISection from '~/components/plugins/APISection';
+import { APIInstallSection } from '~/components/plugins/InstallSection';
+import PlatformsSection from '~/components/plugins/PlatformsSection';
+import { SnackInline } from '~/ui/components/Snippet';
+import {
+ ConfigReactNative,
+ ConfigPluginExample,
+ ConfigPluginProperties,
+} from '~/components/plugins/ConfigSection';
+import { AndroidPermissions, IOSPermissions } from '~/components/plugins/permissions';
+
+`expo-camera` provides a React component that renders a preview of the device's front or back camera. The camera's parameters like zoom, auto focus, white balance and flash mode are adjustable. With the use of `Camera`, one can also take photos and record videos that are then saved to the app's cache. The component is also capable of detecting faces and bar codes appearing in the preview. Run the [example](#usage) on your device to see all these features working together.
+
+
+
+> **info** Android devices can use one of two available Camera APIs: you can opt-in to using [`Camera2`](https://developer.android.com/reference/android/hardware/camera2/package-summary) with the `useCamera2Api` prop.
+
+## Installation
+
+
+
+## Configuration in app.json/app.config.js
+
+You can configure `expo-camera` using its built-in [config plugin](/config-plugins/introduction/) if you use config plugins in your project ([EAS Build](/build/introduction) or `npx expo run:[android|ios]`). The plugin allows you to configure various properties that cannot be set at runtime and require building a new app binary to take effect.
+
+
+
+```json app.json
+{
+ "expo": {
+ "plugins": [
+ [
+ "expo-camera",
+ {
+ "cameraPermission": "Allow $(PRODUCT_NAME) to access your camera."
+ }
+ ]
+ ]
+ }
+}
+```
+
+
+
+
+
+
+
+Learn how to configure the native projects in the [installation instructions in the `expo-camera` repository](https://github.com/expo/expo/tree/main/packages/expo-camera#installation-in-bare-react-native-projects).
+
+
+
+## Usage
+
+> **warning** Only one Camera preview can be active at any given time. If you have multiple screens in your app, you should unmount `Camera` components whenever a screen is unfocused.
+
+
+
+```jsx
+import { Camera, CameraType } from 'expo-camera';
+import { useState } from 'react';
+import { Button, StyleSheet, Text, TouchableOpacity, View } from 'react-native';
+
+export default function App() {
+ const [type, setType] = useState(CameraType.back);
+ const [permission, requestPermission] = Camera.useCameraPermissions();
+
+ /* @hide if (!permission) ... */
+ if (!permission) {
+ // Camera permissions are still loading
+ return ;
+ }
+ /* @end */
+
+ /* @hide if (!permission.granted) ... */
+ if (!permission.granted) {
+ // Camera permissions are not granted yet
+ return (
+
+ We need your permission to show the camera
+
+
+ );
+ }
+ /* @end */
+
+ function toggleCameraType() {
+ setType(current => (current === CameraType.back ? CameraType.front : CameraType.back));
+ }
+
+ return (
+
+
+
+
+ Flip Camera
+
+
+
+
+ );
+}
+
+/* @hide const styles = StyleSheet.create({ ... }); */
+const styles = StyleSheet.create({
+ container: {
+ flex: 1,
+ justifyContent: 'center',
+ },
+ camera: {
+ flex: 1,
+ },
+ buttonContainer: {
+ flex: 1,
+ flexDirection: 'row',
+ backgroundColor: 'transparent',
+ margin: 64,
+ },
+ button: {
+ flex: 1,
+ alignSelf: 'flex-end',
+ alignItems: 'center',
+ },
+ text: {
+ fontSize: 24,
+ fontWeight: 'bold',
+ color: 'white',
+ },
+});
+/* @end */
+```
+
+
+
+## Web Support
+
+Luckily most browsers support at least some form of web camera functionality, you can check out the [web camera browser support here](https://caniuse.com/#feat=stream). Image URIs are always returned as base64 strings because local file system paths are not available in the browser.
+
+### Chrome `iframe` usage
+
+When using **Chrome versions 64+**, if you try to use a web camera in a cross-origin iframe nothing will render. To add support for cameras in your iframe simply add the attribute `allow="microphone; camera;"` to the iframe element:
+
+```html
+
+```
+
+## API
+
+```js
+import { Camera } from 'expo-camera';
+```
+
+
+
+## Permissions
+
+### Android
+
+This package automatically adds the `CAMERA` permission to your app. If you want to record videos with audio, you have to include the `RECORD_AUDIO` in your **app.json** inside the [`expo.android.permissions`](/versions/latest/config/app/#permissions) array.
+
+
+
+### iOS
+
+The following usage description keys are used by this library:
+
+
diff --git a/docs/pages/versions/v49.0.0/sdk/captureRef.mdx b/docs/pages/versions/v49.0.0/sdk/captureRef.mdx
new file mode 100644
index 0000000000000..051c11d2bb25a
--- /dev/null
+++ b/docs/pages/versions/v49.0.0/sdk/captureRef.mdx
@@ -0,0 +1,72 @@
+---
+title: captureRef
+sourceCodeUrl: 'https://github.com/gre/react-native-view-shot'
+packageName: 'react-native-view-shot'
+---
+
+import { APIInstallSection } from '~/components/plugins/InstallSection';
+import PlatformsSection from '~/components/plugins/PlatformsSection';
+
+> **info** This library is listed in the Expo SDK reference because it is included in [Expo Go](/get-started/expo-go/). You may use any library of your choice with [development builds](/develop/development-builds/introduction/).
+
+Given a view, `captureRef` will essentially screenshot that view and return an image for you. This is very useful for things like signature pads, where the user draws something and then you want to save an image from it.
+
+If you're interested in taking snapshots from the GLView, we recommend you use [GLView's takeSnapshotAsync](gl-view.mdx#takesnapshotasyncoptions) instead.
+
+
+
+## Installation
+
+
+
+## API
+
+```js
+import { captureRef } from 'react-native-view-shot';
+```
+
+### `captureRef(view, options)`
+
+Snapshots the given view.
+
+#### Arguments
+
+- **view (_number|ReactElement_)** -- The `ref` or `reactTag` (also known as node handle) for the view to snapshot.
+- **options (_object_)** --
+
+ An optional map of optional options
+
+ - **format (_string_)** -- `"png" | "jpg" | "webm"`, defaults to `"png"`, `"webm"` supported only on Android.
+ - **quality (_number_)** -- Number between 0 and 1 where 0 is worst quality and 1 is best, defaults to `1`
+ - **result (_string_)** -- The type for the resulting image.
+ \- `'tmpfile'` -- (default) Return a temporary file uri.
+ \- `'base64'` -- base64 encoded image.
+ \- `'data-uri'` -- base64 encoded image with data-uri prefix.
+ - **height (_number_)** -- Height of result in pixels
+ - **width (_number_)** -- Width of result in pixels
+ - **snapshotContentContainer (_bool_)** -- if true and when view is a ScrollView, the "content container" height will be evaluated instead of the container height
+
+#### Returns
+
+An image of the format specified in the options parameter.
+
+## Note on pixel values
+
+Remember to take the device `PixelRatio` into account. When you work with pixel values in a UI, most of the time those units are "logical pixels" or "device-independent pixels". With images like PNG files, you often work with "physical pixels". You can get the `PixelRatio` of the device using the React Native API: `PixelRatio.get()`
+
+For example, to save a 'FullHD' picture of `1080x1080`, you would do something like this:
+
+```js
+const targetPixelCount = 1080; // If you want full HD pictures
+const pixelRatio = PixelRatio.get(); // The pixel ratio of the device
+// pixels * pixelratio = targetPixelCount, so pixels = targetPixelCount / pixelRatio
+const pixels = targetPixelCount / pixelRatio;
+
+const result = await captureRef(this.imageContainer, {
+ result: 'tmpfile',
+ height: pixels,
+ width: pixels,
+ quality: 1,
+ format: 'png',
+});
+```
diff --git a/docs/pages/versions/v49.0.0/sdk/cellular.mdx b/docs/pages/versions/v49.0.0/sdk/cellular.mdx
new file mode 100644
index 0000000000000..81d1603c16c07
--- /dev/null
+++ b/docs/pages/versions/v49.0.0/sdk/cellular.mdx
@@ -0,0 +1,53 @@
+---
+title: Cellular
+sourceCodeUrl: 'https://github.com/expo/expo/tree/sdk-49/packages/expo-cellular'
+packageName: 'expo-cellular'
+---
+
+import APISection from '~/components/plugins/APISection';
+import { APIInstallSection } from '~/components/plugins/InstallSection';
+import PlatformsSection from '~/components/plugins/PlatformsSection';
+import { AndroidPermissions } from '~/components/plugins/permissions';
+import { ConfigReactNative } from '~/components/plugins/ConfigSection';
+
+`expo-cellular` provides information about the user's cellular service provider, such as its unique identifier, cellular connection type, and whether it allows VoIP calls on its network.
+
+
+
+## Installation
+
+
+
+## Configuration
+
+
+
+Learn how to configure the native projects in the [installation instructions in the `expo-cellular` repository](https://github.com/expo/expo/tree/main/packages/expo-cellular#installation-in-bare-react-native-projects).
+
+
+
+## API
+
+```js
+import * as Cellular from 'expo-cellular';
+```
+
+
+
+## Error Codes
+
+| Code | Description |
+| -------------------------------------------- | -------------------------------------------------------------------- |
+| ERR_CELLULAR_GENERATION_UNKNOWN_NETWORK_TYPE | Unable to access network type or not connected to a cellular network |
+
+## Permissions
+
+### Android
+
+You must add the following permissions to your **app.json** inside the [`expo.android.permissions`](/versions/latest/config/app/#permissions) array.
+
+
+
+### iOS
+
+_No permissions required_.
diff --git a/docs/pages/versions/v49.0.0/sdk/checkbox.mdx b/docs/pages/versions/v49.0.0/sdk/checkbox.mdx
new file mode 100644
index 0000000000000..5e07074f90021
--- /dev/null
+++ b/docs/pages/versions/v49.0.0/sdk/checkbox.mdx
@@ -0,0 +1,82 @@
+---
+title: Checkbox
+sourceCodeUrl: 'https://github.com/expo/expo/tree/sdk-49/packages/expo-checkbox'
+packageName: 'expo-checkbox'
+---
+
+import APISection from '~/components/plugins/APISection';
+import { APIInstallSection } from '~/components/plugins/InstallSection';
+import PlatformsSection from '~/components/plugins/PlatformsSection';
+import { SnackInline} from '~/ui/components/Snippet';
+
+**`expo-checkbox`** provides a basic `boolean` input element for all platforms. If you are looking for a more flexible checkbox component, please see the [guide to implementing your own checkbox](/ui-programming/implementing-a-checkbox.mdx).
+
+
+
+## Installation
+
+
+
+## Usage
+
+
+
+```js
+import Checkbox from 'expo-checkbox';
+import React, { useState } from 'react';
+import { StyleSheet, Text, View } from 'react-native';
+
+export default function App() {
+ const [isChecked, setChecked] = useState(false);
+
+ return (
+
+
+
+ Normal checkbox
+
+
+
+ Custom colored checkbox
+
+
+
+ Disabled checkbox
+
+
+ );
+}
+
+const styles = StyleSheet.create({
+ container: {
+ flex: 1,
+ marginHorizontal: 16,
+ marginVertical: 32,
+ },
+ section: {
+ flexDirection: 'row',
+ alignItems: 'center',
+ },
+ paragraph: {
+ fontSize: 15,
+ },
+ checkbox: {
+ margin: 8,
+ },
+});
+```
+
+
+
+## API
+
+```js
+import Checkbox from 'expo-checkbox';
+```
+
+
diff --git a/docs/pages/versions/v49.0.0/sdk/clipboard.mdx b/docs/pages/versions/v49.0.0/sdk/clipboard.mdx
new file mode 100644
index 0000000000000..686efcb39eca4
--- /dev/null
+++ b/docs/pages/versions/v49.0.0/sdk/clipboard.mdx
@@ -0,0 +1,81 @@
+---
+title: Clipboard
+sourceCodeUrl: 'https://github.com/expo/expo/tree/sdk-49/packages/expo-clipboard'
+packageName: 'expo-clipboard'
+---
+
+import APISection from '~/components/plugins/APISection';
+import { APIInstallSection } from '~/components/plugins/InstallSection';
+import PlatformsSection from '~/components/plugins/PlatformsSection';
+import { SnackInline} from '~/ui/components/Snippet';
+
+**`expo-clipboard`** provides an interface for getting and setting Clipboard content on Android, iOS, and Web.
+
+
+
+## Installation
+
+
+
+## Usage
+
+
+
+```jsx
+import * as React from 'react';
+import { View, Text, Button, StyleSheet } from 'react-native';
+import * as Clipboard from 'expo-clipboard';
+
+export default function App() {
+ const [copiedText, setCopiedText] = React.useState('');
+
+ const copyToClipboard = async () => {
+ /* @info Copy the text to the clipboard */
+ await Clipboard.setStringAsync('hello world');
+ /* @end */
+ };
+
+ const fetchCopiedText = async () => {
+ const text = /* @info Paste the text from the clipboard */ await Clipboard.getStringAsync();
+ /* @end */
+ setCopiedText(text);
+ };
+
+ return (
+
+
+
+ {copiedText}
+
+ );
+}
+
+/* @hide const styles = StyleSheet.create({ ... }); */
+const styles = StyleSheet.create({
+ container: {
+ flex: 1,
+ justifyContent: 'center',
+ alignItems: 'center',
+ },
+ copiedText: {
+ marginTop: 10,
+ color: 'red',
+ },
+});
+/* @end */
+```
+
+
+
+## API
+
+```js
+import * as Clipboard from 'expo-clipboard';
+```
+
+> **warning** On Web, this module uses the [`AsyncClipboard` API](https://developer.mozilla.org/en-US/docs/Web/API/Clipboard_API),
+> which might behave differently between browsers or not be fully supported.
+> Especially on WebKit, there's an issue which makes this API unusable in asynchronous code.
+> [Click here for more details](https://bugs.webkit.org/show_bug.cgi?id=222262).
+
+
diff --git a/docs/pages/versions/v49.0.0/sdk/constants.mdx b/docs/pages/versions/v49.0.0/sdk/constants.mdx
new file mode 100644
index 0000000000000..4bff9d859a9ae
--- /dev/null
+++ b/docs/pages/versions/v49.0.0/sdk/constants.mdx
@@ -0,0 +1,25 @@
+---
+title: Constants
+sourceCodeUrl: 'https://github.com/expo/expo/tree/sdk-49/packages/expo-constants'
+packageName: 'expo-constants'
+---
+
+import APISection from '~/components/plugins/APISection';
+import { APIInstallSection } from '~/components/plugins/InstallSection';
+import PlatformsSection from '~/components/plugins/PlatformsSection';
+
+**`expo-constants`** provides system information that remains constant throughout the lifetime of your app's install.
+
+
+
+## Installation
+
+
+
+## API
+
+```js
+import Constants from 'expo-constants';
+```
+
+
diff --git a/docs/pages/versions/v49.0.0/sdk/contacts.mdx b/docs/pages/versions/v49.0.0/sdk/contacts.mdx
new file mode 100644
index 0000000000000..9aa87aa3e49f7
--- /dev/null
+++ b/docs/pages/versions/v49.0.0/sdk/contacts.mdx
@@ -0,0 +1,135 @@
+---
+title: Contacts
+sourceCodeUrl: 'https://github.com/expo/expo/tree/sdk-49/packages/expo-contacts'
+packageName: 'expo-contacts'
+---
+
+import APISection from '~/components/plugins/APISection';
+import { APIInstallSection } from '~/components/plugins/InstallSection';
+import PlatformsSection from '~/components/plugins/PlatformsSection';
+import { SnackInline } from '~/ui/components/Snippet';
+import {
+ ConfigReactNative,
+ ConfigPluginExample,
+ ConfigPluginProperties,
+} from '~/components/plugins/ConfigSection';
+import { AndroidPermissions, IOSPermissions } from '~/components/plugins/permissions';
+
+`expo-contacts` provides access to the device's system contacts, allowing you to get contact information as well as adding, editing, or removing contacts.
+
+On iOS, contacts have a multi-layered grouping system that you can also access through this API.
+
+
+
+## Installation
+
+
+
+## Configuration in app.json/app.config.js
+
+You can configure `expo-contacts` using its built-in [config plugin](/config-plugins/introduction/) if you use config plugins in your project ([EAS Build](/build/introduction) or `npx expo run:[android|ios]`). The plugin allows you to configure various properties that cannot be set at runtime and require building a new app binary to take effect.
+
+
+
+```json app.json
+{
+ "expo": {
+ "plugins": [
+ [
+ "expo-contacts",
+ {
+ "contactsPermission": "Allow $(PRODUCT_NAME) to access your contacts."
+ }
+ ]
+ ]
+ }
+}
+```
+
+
+
+
+
+
+
+Learn how to configure the native projects in the [installation instructions in the `expo-contacts` repository](https://github.com/expo/expo/tree/main/packages/expo-contacts#installation-in-bare-react-native-projects).
+
+
+
+## Usage
+
+
+
+```jsx
+import React, { useEffect } from 'react';
+import { StyleSheet, View, Text } from 'react-native';
+import * as Contacts from 'expo-contacts';
+
+export default function App() {
+ useEffect(() => {
+ (async () => {
+ const { status } = await Contacts.requestPermissionsAsync();
+ if (status === 'granted') {
+ const { data } = await Contacts.getContactsAsync({
+ fields: [Contacts.Fields.Emails],
+ });
+
+ if (data.length > 0) {
+ const contact = data[0];
+ console.log(contact);
+ }
+ }
+ })();
+ }, []);
+
+ return (
+
+ Contacts Module Example
+
+ );
+}
+
+/* @hide const styles = StyleSheet.create({ ... }); */
+const styles = StyleSheet.create({
+ container: {
+ flex: 1,
+ backgroundColor: '#fff',
+ alignItems: 'center',
+ justifyContent: 'center',
+ },
+});
+/* @end */
+```
+
+
+
+## API
+
+```js
+import * as Contacts from 'expo-contacts';
+```
+
+
+
+## Permissions
+
+### Android
+
+You must add the following permissions to your **app.json** inside the [`expo.android.permissions`](/versions/latest/config/app/#permissions) array.
+
+
+
+### iOS
+
+The following usage description keys are used by this library:
+
+
diff --git a/docs/pages/versions/v49.0.0/sdk/crypto.mdx b/docs/pages/versions/v49.0.0/sdk/crypto.mdx
new file mode 100644
index 0000000000000..553fee6c7d5a5
--- /dev/null
+++ b/docs/pages/versions/v49.0.0/sdk/crypto.mdx
@@ -0,0 +1,76 @@
+---
+title: Crypto
+sourceCodeUrl: 'https://github.com/expo/expo/tree/sdk-49/packages/expo-crypto'
+packageName: 'expo-crypto'
+iconUrl: '/static/images/packages/expo-crypto.png'
+---
+
+import APISection from '~/components/plugins/APISection';
+import { APIInstallSection } from '~/components/plugins/InstallSection';
+import PlatformsSection from '~/components/plugins/PlatformsSection';
+import { SnackInline} from '~/ui/components/Snippet';
+
+`expo-crypto` enables you to hash data in an equivalent manner to the Node.js core `crypto` API.
+
+
+
+## Installation
+
+
+
+## Usage
+
+
+
+```jsx
+import React, { useEffect } from 'react';
+import { StyleSheet, View, Text } from 'react-native';
+import * as Crypto from 'expo-crypto';
+
+export default function App() {
+ useEffect(() => {
+ (async () => {
+ const digest = await Crypto.digestStringAsync(
+ Crypto.CryptoDigestAlgorithm.SHA256,
+ 'GitHub stars are neat 🌟'
+ );
+ console.log('Digest: ', digest);
+ /* Some crypto operation... */
+ })();
+ }, []);
+
+ return (
+
+ Crypto Module Example
+
+ );
+}
+
+/* @hide const styles = StyleSheet.create({ ... }); */
+const styles = StyleSheet.create({
+ container: {
+ flex: 1,
+ backgroundColor: '#fff',
+ alignItems: 'center',
+ justifyContent: 'center',
+ },
+});
+/* @end */
+```
+
+
+
+## API
+
+```js
+import * as Crypto from 'expo-crypto';
+```
+
+
+
+## Error Codes
+
+| Code | Description |
+| ------------------------ | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
+| `ERR_CRYPTO_UNAVAILABLE` | **Web Only.** Access to the WebCrypto API is restricted to secure origins (https). You can run your web project from a secure origin with `npx expo start --https`. |
+| `ERR_CRYPTO_DIGEST` | An invalid encoding type provided. |
diff --git a/docs/pages/versions/v49.0.0/sdk/date-time-picker.mdx b/docs/pages/versions/v49.0.0/sdk/date-time-picker.mdx
new file mode 100644
index 0000000000000..d4687055a9aeb
--- /dev/null
+++ b/docs/pages/versions/v49.0.0/sdk/date-time-picker.mdx
@@ -0,0 +1,23 @@
+---
+title: DateTimePicker
+sourceCodeUrl: 'https://github.com/react-native-community/react-native-datetimepicker'
+packageName: '@react-native-community/datetimepicker'
+---
+
+import { APIInstallSection } from '~/components/plugins/InstallSection';
+import PlatformsSection from '~/components/plugins/PlatformsSection';
+import Video from '~/components/plugins/Video';
+
+A component that provides access to the system UI for date and time selection.
+
+
+
+
+
+## Installation
+
+
+
+## Usage
+
+See full documentation at [react-native-community/react-native-datetimepicker](https://github.com/react-native-community/react-native-datetimepicker).
diff --git a/docs/pages/versions/v49.0.0/sdk/device.mdx b/docs/pages/versions/v49.0.0/sdk/device.mdx
new file mode 100644
index 0000000000000..a5ffe790ba821
--- /dev/null
+++ b/docs/pages/versions/v49.0.0/sdk/device.mdx
@@ -0,0 +1,31 @@
+---
+title: Device
+sourceCodeUrl: 'https://github.com/expo/expo/tree/sdk-49/packages/expo-device'
+packageName: 'expo-device'
+---
+
+import { APIInstallSection } from '~/components/plugins/InstallSection';
+import APISection from '~/components/plugins/APISection';
+import PlatformsSection from '~/components/plugins/PlatformsSection';
+
+**`expo-device`** provides access to system information about the physical device, such as its manufacturer and model.
+
+
+
+## Installation
+
+
+
+## API
+
+```js
+import * as Device from 'expo-device';
+```
+
+
+
+## Error Codes
+
+| Code | Description |
+| ------------------------- | ------------------------------------------------------------------------------------------------------------------------ |
+| ERR_DEVICE_ROOT_DETECTION | Error code thrown for `isRootedExperimentalAsync`. This may be thrown if there's no read access to certain system files. |
diff --git a/docs/pages/versions/v49.0.0/sdk/devicemotion.mdx b/docs/pages/versions/v49.0.0/sdk/devicemotion.mdx
new file mode 100644
index 0000000000000..4f7681b877197
--- /dev/null
+++ b/docs/pages/versions/v49.0.0/sdk/devicemotion.mdx
@@ -0,0 +1,80 @@
+---
+title: DeviceMotion
+sourceCodeUrl: 'https://github.com/expo/expo/tree/sdk-49/packages/expo-sensors'
+packageName: 'expo-sensors'
+iconUrl: '/static/images/packages/expo-sensors.png'
+---
+
+import APISection from '~/components/plugins/APISection';
+import { APIInstallSection } from '~/components/plugins/InstallSection';
+import PlatformsSection from '~/components/plugins/PlatformsSection';
+import {
+ ConfigReactNative,
+ ConfigPluginExample,
+ ConfigPluginProperties,
+} from '~/components/plugins/ConfigSection';
+import { IOSPermissions } from '~/components/plugins/permissions';
+
+`DeviceMotion` from `expo-sensors` provides access to the device motion and orientation sensors. All data is presented in terms of three axes that run through a device. According to portrait orientation: X runs from left to right, Y from bottom to top and Z perpendicularly through the screen from back to front.
+
+
+
+## Installation
+
+
+
+## Configuration in app.json/app.config.js
+
+You can configure `DeviceMotion` from `expo-sensor` using its built-in [config plugin](/config-plugins/introduction/) if you use config plugins in your project ([EAS Build](/build/introduction) or `npx expo run:[android|ios]`). The plugin allows you to configure various properties that cannot be set at runtime and require building a new app binary to take effect.
+
+
+
+```json app.json
+{
+ "expo": {
+ "plugins": [
+ [
+ "expo-sensors",
+ {
+ "motionPermission": "Allow $(PRODUCT_NAME) to access your device motion."
+ }
+ ]
+ ]
+ }
+}
+```
+
+
+
+
+
+
+
+Learn how to configure the native projects in the [installation instructions in the `expo-sensors` repository](https://github.com/expo/expo/tree/main/packages/expo-sensors#installation-in-bare-react-native-projects).
+
+
+
+## API
+
+```js
+import { DeviceMotion } from 'expo-sensors';
+```
+
+
+
+## Permissions
+
+### iOS
+
+The following usage description keys are used by this library:
+
+
diff --git a/docs/pages/versions/v49.0.0/sdk/document-picker.mdx b/docs/pages/versions/v49.0.0/sdk/document-picker.mdx
new file mode 100644
index 0000000000000..6fda3e563f296
--- /dev/null
+++ b/docs/pages/versions/v49.0.0/sdk/document-picker.mdx
@@ -0,0 +1,107 @@
+---
+title: DocumentPicker
+sourceCodeUrl: 'https://github.com/expo/expo/tree/sdk-49/packages/expo-document-picker'
+packageName: 'expo-document-picker'
+---
+
+import {
+ ConfigReactNative,
+ ConfigPluginExample,
+ ConfigPluginProperties,
+} from '~/components/plugins/ConfigSection';
+import APISection from '~/components/plugins/APISection';
+import { APIInstallSection } from '~/components/plugins/InstallSection';
+import PlatformsSection from '~/components/plugins/PlatformsSection';
+import Video from '~/components/plugins/Video';
+
+`expo-document-picker` provides access to the system's UI for selecting documents from the available providers on the user's device.
+
+
+
+
+
+## Installation
+
+
+
+## Configuration in app.json/app.config.js
+
+You can configure `expo-document-picker` using its built-in [config plugin](/config-plugins/introduction/) if you use config plugins in your project ([EAS Build](/build/introduction) or `npx expo run:[android|ios]`). The plugin allows you to configure various properties that cannot be set at runtime and require building a new app binary to take effect. If your app does **not** use EAS Build, then you'll need to manually configure the package.
+
+
+
+If you want to enable [iCloud storage features][icloud-entitlement], set the `expo.ios.usesIcloudStorage` key to `true` in the [app config](/workflow/configuration/) file as specified [configuration properties](/versions/latest/config/app/#usesicloudstorage).
+
+Running [EAS Build](/build/introduction) locally will use [iOS capabilities signing](/build-reference/ios-capabilities) to enable the required capabilities before building.
+
+```json app.json
+{
+ "expo": {
+ "plugins": [
+ [
+ "expo-document-picker",
+ {
+ "iCloudContainerEnvironment": "Production"
+ }
+ ]
+ ]
+ }
+}
+```
+
+
+
+
+
+
+
+Apps that don't use [EAS Build](/build/introduction) and want [iCloud storage features][icloud-entitlement] must [manually configure](/build-reference/ios-capabilities#manual-setup) the [**iCloud service with CloudKit support**](https://developer.apple.com/documentation/bundleresources/entitlements/com_apple_developer_icloud-container-environment) for their bundle identifier.
+
+If you enable the **iCloud** capability through the [Apple Developer Console](/build-reference/ios-capabilities#apple-developer-console), then be sure to add the following entitlements in your `ios/[app]/[app].entitlements` file (where `dev.expo.my-app` if your bundle identifier):
+
+```xml
+com.apple.developer.icloud-container-identifiers
+
+ iCloud.dev.expo.my-app
+
+com.apple.developer.icloud-services
+
+ CloudDocuments
+
+com.apple.developer.ubiquity-container-identifiers
+
+ iCloud.dev.expo.my-app
+
+com.apple.developer.ubiquity-kvstore-identifier
+$(TeamIdentifierPrefix)dev.expo.my-app
+```
+
+Apple Developer Console also requires an **iCloud Container** to be created. When registering the new container, you are asked to provide a description and identifier for the container. You may enter any name under the description. Under the identifier, add `iCloud.` (same value used for `com.apple.developer.icloud-container-identifiers` and `com.apple.developer.ubiquity-container-identifiers` entitlements).
+
+
+
+## Using with `expo-file-system`
+
+When using `expo-document-picker` with [`expo-file-system`](/versions/latest/sdk/filesystem/), it's not always possible for the file system to read the file immediately after the `expo-document-picker` picks it.
+
+To allow the `expo-file-system` to read the file immediately after it is picked, you'll need to ensure that the [`copyToCacheDirectory`](#documentpickeroptions) option is set to `true`.
+
+## API
+
+```js
+import * as DocumentPicker from 'expo-document-picker';
+```
+
+
+
+[icloud-entitlement]: https://developer.apple.com/documentation/bundleresources/entitlements/com_apple_developer_icloud-services
diff --git a/docs/pages/versions/v49.0.0/sdk/facedetector.mdx b/docs/pages/versions/v49.0.0/sdk/facedetector.mdx
new file mode 100644
index 0000000000000..9bdac03b5afea
--- /dev/null
+++ b/docs/pages/versions/v49.0.0/sdk/facedetector.mdx
@@ -0,0 +1,77 @@
+---
+title: FaceDetector
+sourceCodeUrl: 'https://github.com/expo/expo/tree/sdk-49/packages/expo-face-detector'
+packageName: 'expo-face-detector'
+---
+
+import APISection from '~/components/plugins/APISection';
+import { APIInstallSection } from '~/components/plugins/InstallSection';
+import PlatformsSection from '~/components/plugins/PlatformsSection';
+import { SnackInline } from '~/ui/components/Snippet';
+import { PlatformTags } from '~/ui/components/Tag';
+
+**`expo-face-detector`** lets you use the power of the [Google Mobile Vision](https://developers.google.com/vision/face-detection-concepts) framework to detect faces on images.
+
+
+
+#### Known issues
+
+Face detector does not recognize faces that aren't aligned with the interface (top of the interface matches top of the head).
+
+## Installation
+
+This module is **not** available in the [Expo Go app](https://expo.dev/expo-go) because it has dependencies that break builds for iOS Simulators.
+
+You can create a [development build](/develop/development-builds/create-a-build/) to work with this package.
+
+
+
+## Usage
+
+### Settings
+
+In order to configure detector's behavior modules pass a [`DetectionOptions`](#detectionoptions) object which is then interpreted by this module.
+
+### Example
+
+You can use the following snippet to detect faces in a fast mode without detecting landmarks or whether a face is smiling.
+
+
+
+```jsx
+import * as React from 'react';
+import { Camera } from 'expo-camera';
+import * as FaceDetector from 'expo-face-detector';
+
+const App = () => (
+
+);
+
+/* @hide const handleFacesDetected = ({ faces }) => { ... }; */
+const handleFacesDetected = ({ faces }) => {
+ console.log(faces);
+};
+
+export default App;
+/* @end */
+```
+
+
+
+## API
+
+```js
+import * as FaceDetector from 'expo-face-detector';
+```
+
+
diff --git a/docs/pages/versions/v49.0.0/sdk/filesystem.mdx b/docs/pages/versions/v49.0.0/sdk/filesystem.mdx
new file mode 100644
index 0000000000000..3b558e29e067c
--- /dev/null
+++ b/docs/pages/versions/v49.0.0/sdk/filesystem.mdx
@@ -0,0 +1,256 @@
+---
+title: FileSystem
+sourceCodeUrl: 'https://github.com/expo/expo/tree/sdk-49/packages/expo-file-system'
+packageName: 'expo-file-system'
+iconUrl: '/static/images/packages/expo-file-system.png'
+---
+
+import ImageSpotlight from '~/components/plugins/ImageSpotlight';
+import { ConfigReactNative } from '~/components/plugins/ConfigSection';
+import { AndroidPermissions } from '~/components/plugins/permissions';
+import APISection from '~/components/plugins/APISection';
+import { APIInstallSection } from '~/components/plugins/InstallSection';
+import PlatformsSection from '~/components/plugins/PlatformsSection';
+import { SnackInline } from '~/ui/components/Snippet';
+
+`expo-file-system` provides access to a file system stored locally on the device. Within Expo Go, each project has a separate file system and has no access to the file system of other Expo projects. However, it can save content shared by other projects to the local filesystem, as well as share local files with other projects. It is also capable of uploading and downloading files from network URLs.
+
+{/* TODO: update this image so we don't have to force a white background on it */}
+
+
+
+
+
+## Installation
+
+
+
+## Configuration
+
+
+
+Learn how to configure the native projects in the [installation instructions in the `expo-file-system` repository](https://github.com/expo/expo/tree/main/packages/expo-file-system#installation-in-bare-react-native-projects).
+
+
+
+## Usage
+
+### Downloading files
+
+```js Component.js
+const callback = downloadProgress => {
+ const progress = downloadProgress.totalBytesWritten / downloadProgress.totalBytesExpectedToWrite;
+ this.setState({
+ downloadProgress: progress,
+ });
+};
+
+const downloadResumable = FileSystem.createDownloadResumable(
+ 'http://techslides.com/demos/sample-videos/small.mp4',
+ FileSystem.documentDirectory + 'small.mp4',
+ {},
+ callback
+);
+
+try {
+ const { uri } = await downloadResumable.downloadAsync();
+ console.log('Finished downloading to ', uri);
+} catch (e) {
+ console.error(e);
+}
+
+try {
+ await downloadResumable.pauseAsync();
+ console.log('Paused download operation, saving for future retrieval');
+ AsyncStorage.setItem('pausedDownload', JSON.stringify(downloadResumable.savable()));
+} catch (e) {
+ console.error(e);
+}
+
+try {
+ const { uri } = await downloadResumable.resumeAsync();
+ console.log('Finished downloading to ', uri);
+} catch (e) {
+ console.error(e);
+}
+
+//To resume a download across app restarts, assuming the DownloadResumable.savable() object was stored:
+const downloadSnapshotJson = await AsyncStorage.getItem('pausedDownload');
+const downloadSnapshot = JSON.parse(downloadSnapshotJson);
+const downloadResumable = new FileSystem.DownloadResumable(
+ downloadSnapshot.url,
+ downloadSnapshot.fileUri,
+ downloadSnapshot.options,
+ callback,
+ downloadSnapshot.resumeData
+);
+
+try {
+ const { uri } = await downloadResumable.resumeAsync();
+ console.log('Finished downloading to ', uri);
+} catch (e) {
+ console.error(e);
+}
+```
+
+### Managing Giphy's
+
+
+
+```typescript
+import * as FileSystem from 'expo-file-system';
+
+const gifDir = FileSystem.cacheDirectory + 'giphy/';
+const gifFileUri = (gifId: string) => gifDir + `gif_${gifId}_200.gif`;
+const gifUrl = (gifId: string) => `https://media1.giphy.com/media/${gifId}/200.gif`;
+
+// Checks if gif directory exists. If not, creates it
+async function ensureDirExists() {
+ const dirInfo = await FileSystem.getInfoAsync(gifDir);
+ if (!dirInfo.exists) {
+ console.log("Gif directory doesn't exist, creating...");
+ await FileSystem.makeDirectoryAsync(gifDir, { intermediates: true });
+ }
+}
+
+// Downloads all gifs specified as array of IDs
+export async function addMultipleGifs(gifIds: string[]) {
+ try {
+ await ensureDirExists();
+
+ console.log('Downloading', gifIds.length, 'gif files...');
+ await Promise.all(gifIds.map(id => FileSystem.downloadAsync(gifUrl(id), gifFileUri(id))));
+ } catch (e) {
+ console.error("Couldn't download gif files:", e);
+ }
+}
+
+// Returns URI to our local gif file
+// If our gif doesn't exist locally, it downloads it
+export async function getSingleGif(gifId: string) {
+ await ensureDirExists();
+
+ const fileUri = gifFileUri(gifId);
+ const fileInfo = await FileSystem.getInfoAsync(fileUri);
+
+ if (!fileInfo.exists) {
+ console.log("Gif isn't cached locally. Downloading...");
+ await FileSystem.downloadAsync(gifUrl(gifId), fileUri);
+ }
+
+ return fileUri;
+}
+
+// Exports shareable URI - it can be shared outside your app
+export async function getGifContentUri(gifId: string) {
+ return FileSystem.getContentUriAsync(await getSingleGif(gifId));
+}
+
+// Deletes whole giphy directory with all its content
+export async function deleteAllGifs() {
+ console.log('Deleting all GIF files...');
+ await FileSystem.deleteAsync(gifDir);
+}
+```
+
+
+
+### Server: Handling multipart requests
+
+The simple server in Node.js, which can save uploaded images to disk:
+
+```js index.js
+const express = require('express');
+const app = express();
+const fs = require('fs');
+const multer = require('multer');
+const upload = multer({ dest: 'uploads/' });
+
+// This method will save the binary content of the request as a file.
+app.patch('/binary-upload', (req, res) => {
+ req.pipe(fs.createWriteStream('./uploads/image' + Date.now() + '.png'));
+ res.end('OK');
+});
+
+// This method will save a "photo" field from the request as a file.
+app.patch('/multipart-upload', upload.single('photo'), (req, res) => {
+ // You can access other HTTP parameters. They are located in the body object.
+ console.log(req.body);
+ res.end('OK');
+});
+
+app.listen(3000, () => {
+ console.log('Working on port 3000');
+});
+```
+
+## API
+
+```js
+import * as FileSystem from 'expo-file-system';
+```
+
+### Directories
+
+The API takes `file://` URIs pointing to local files on the device to identify files. Each app only has read and write access to locations under the following directories:
+
+- [`FileSystem.documentDirectory`](#documendirectory)
+- [`FileSystem.cacheDirectory`](#cachedirectory)
+
+So, for example, the URI to a file named `'myFile'` under `'myDirectory'` in the app's user documents directory would be `FileSystem.documentDirectory + 'myDirectory/myFile'`.
+
+Expo APIs that create files generally operate within these directories. This includes `Audio` recordings, `Camera` photos, `ImagePicker` results, `SQLite` databases and `takeSnapShotAsync()` results. This allows their use with the `FileSystem` API.
+
+Some `FileSystem` functions are able to read from (but not write to) other locations.
+
+### SAF URI
+
+A SAF URI is a URI that is compatible with the Storage Access Framework. It should look like this `content://com.android.externalstorage.*`.
+The easiest way to obtain such URI is by [`requestDirectoryPermissionsAsync`](#requestdirectorypermissionsasyncinitialfileurl) method.
+
+
+
+## Supported URI schemes
+
+In this table, you can see what type of URI can be handled by each method. For example, if you have an URI, which begins with `content://`, you cannot use `FileSystem.readAsStringAsync()`, but you can use `FileSystem.copyAsync()` which supports this scheme.
+
+| Method name | Android | iOS |
+| ------------------------- | ------------------------------------------------------------------------------------------------------------------------------------ | ----------------------------------------------------------------------------------------------- |
+| `getInfoAsync` | `file:///`, `content://`, `asset://`, no scheme | `file://`, `ph://`, `assets-library://` |
+| `readAsStringAsync` | `file:///`, `asset://`, [SAF URI](#saf-uri) | `file://` |
+| `writeAsStringAsync` | `file:///`, [SAF URI](#saf-uri) | `file://` |
+| `deleteAsync` | `file:///`, [SAF URI](#saf-uri) | `file://` |
+| `moveAsync` | Source: `file:///`, [SAF URI](#saf-uri) Destination: `file://` | Source: `file://` Destination: `file://` |
+| `copyAsync` | Source: `file:///`, `content://`, `asset://`, [SAF URI](#saf-uri), no scheme Destination: `file://` | Source: `file://`, `ph://`, `assets-library://` Destination: `file://` |
+| `makeDirectoryAsync` | `file:///` | `file://` |
+| `readDirectoryAsync` | `file:///` | `file://` |
+| `downloadAsync` | Source: `http://`, `https://` Destination: `file:///` | Source: `http://`, `https://` Destination: `file://` |
+| `uploadAsync` | Source: `file:///` Destination: `http://` `https://` | Source: `file://` Destination: `http://` `https://` |
+| `createDownloadResumable` | Source: `http://`, `https://` Destination: `file:///` | Source: `http://`, `https://` Destination: `file://` |
+
+> On Android **no scheme** defaults to a bundled resource.
+
+## Permissions
+
+### Android
+
+The following permissions are added automatically through this library's `AndroidManifest.xml`.
+
+
+
+### iOS
+
+_No permissions required_.
diff --git a/docs/pages/versions/v49.0.0/sdk/flash-list.mdx b/docs/pages/versions/v49.0.0/sdk/flash-list.mdx
new file mode 100644
index 0000000000000..e8ddbe44eddf0
--- /dev/null
+++ b/docs/pages/versions/v49.0.0/sdk/flash-list.mdx
@@ -0,0 +1,22 @@
+---
+title: FlashList
+sourceCodeUrl: 'https://github.com/shopify/flash-list'
+packageName: '@shopify/flash-list'
+---
+
+import { APIInstallSection } from '~/components/plugins/InstallSection';
+import PlatformsSection from '~/components/plugins/PlatformsSection';
+
+> **info** This library is listed in the Expo SDK reference because it is included in [Expo Go](/get-started/expo-go/). You may use any library of your choice with [development builds](/develop/development-builds/introduction/).
+
+**`@shopify/flash-list`** is a "Fast & performant React Native list" component that is a drop-in replacement for React Native's `` component. It "recycles components under the hood to maximize performance."
+
+
+
+## Installation
+
+
+
+## Usage
+
+See full documentation at [https://shopify.github.io/flash-list/](https://shopify.github.io/flash-list/).
diff --git a/docs/pages/versions/v49.0.0/sdk/font.mdx b/docs/pages/versions/v49.0.0/sdk/font.mdx
new file mode 100644
index 0000000000000..55c0bb6381129
--- /dev/null
+++ b/docs/pages/versions/v49.0.0/sdk/font.mdx
@@ -0,0 +1,89 @@
+---
+title: Font
+sourceCodeUrl: 'https://github.com/expo/expo/tree/sdk-49/packages/expo-font'
+packageName: 'expo-font'
+---
+
+import APISection from '~/components/plugins/APISection';
+import { APIInstallSection } from '~/components/plugins/InstallSection';
+import PlatformsSection from '~/components/plugins/PlatformsSection';
+import { SnackInline } from '~/ui/components/Snippet';
+
+`expo-font` allows loading fonts from the web and using them in React Native components. See more detailed usage information in the [Fonts](/develop/user-interface/fonts/) guide.
+
+
+
+## Installation
+
+
+
+## Usage
+
+
+
+```jsx
+import { useCallback } from 'react';
+import { Text, View, StyleSheet } from 'react-native';
+/* @info Import useFonts hook from 'expo-font'. */ import { useFonts } from 'expo-font'; /* @end */
+/* @info Also, import SplashScreen so that when the fonts are not loaded, we can continue to show SplashScreen. */ import * as SplashScreen from 'expo-splash-screen'; /* @end */
+
+/* @info This prevents SplashScreen from auto hiding while the fonts are loaded. */
+SplashScreen.preventAutoHideAsync();
+/* @end */
+
+export default function App() {
+ const [fontsLoaded] = useFonts({
+ 'Inter-Black': require('./assets/fonts/Inter-Black.otf'),
+ });
+
+ /* @info After the custom fonts have loaded, we can hide the splash screen and display the app screen. */
+ const onLayoutRootView = useCallback(async () => {
+ if (fontsLoaded) {
+ await SplashScreen.hideAsync();
+ }
+ }, [fontsLoaded]);
+ /* @end */
+
+ if (!fontsLoaded) {
+ return null;
+ }
+
+ return (
+
+ Inter Black
+ Platform Default
+
+ );
+}
+
+/* @hide const styles = StyleSheet.create({ ... }); */
+const styles = StyleSheet.create({
+ container: {
+ flex: 1,
+ justifyContent: 'center',
+ alignItems: 'center',
+ },
+});
+/* @end */
+```
+
+
+
+## API
+
+```js
+import * as Font from 'expo-font';
+```
+
+
+
+## Error Codes
+
+| Code | Description |
+| ------------------- | ----------------------------------------------------------------- |
+| ERR_FONT_API | If the arguments passed to `loadAsync` are invalid. |
+| ERR_FONT_SOURCE | The provided resource was of an incorrect type. |
+| ERR_WEB_ENVIRONMENT | The browser's `document` element doesn't support injecting fonts. |
+| ERR_DOWNLOAD | Failed to download the provided resource. |
+| ERR_FONT_FAMILY | Invalid font family name was provided. |
+| ERR_UNLOAD | Attempting to unload fonts that haven't finished loading yet. |
diff --git a/docs/pages/versions/v49.0.0/sdk/gesture-handler.mdx b/docs/pages/versions/v49.0.0/sdk/gesture-handler.mdx
new file mode 100644
index 0000000000000..ea1ca904a3748
--- /dev/null
+++ b/docs/pages/versions/v49.0.0/sdk/gesture-handler.mdx
@@ -0,0 +1,46 @@
+---
+title: GestureHandler
+sourceCodeUrl: 'https://github.com/software-mansion/react-native-gesture-handler'
+packageName: 'react-native-gesture-handler'
+---
+
+import { APIInstallSection } from '~/components/plugins/InstallSection';
+import PlatformsSection from '~/components/plugins/PlatformsSection';
+
+An API for handling complex gestures. From the project's README:
+
+> This library provides an API that exposes mobile platform specific native capabilities of touch & gesture handling and recognition. It allows for defining complex gesture handling and recognition logic that runs 100% in native thread and is therefore deterministic.
+
+
+
+## Installation
+
+
+
+## API
+
+Add this import to the top of your app entry file, such as **App.js**:
+
+```js
+import 'react-native-gesture-handler';
+```
+
+This will ensure that appropriate event handlers are registered with React Native. Now, you can import gesture handlers wherever you need them:
+
+```js
+import { TapGestureHandler, RotationGestureHandler } from 'react-native-gesture-handler';
+
+class ComponentName extends Component {
+ render() {
+ return (
+
+ ...
+
+ );
+ }
+}
+```
+
+## Usage
+
+Read the [react-native-gesture-handler docs](https://docs.swmansion.com/react-native-gesture-handler/) for more information on the API and usage.
diff --git a/docs/pages/versions/v49.0.0/sdk/gl-view.mdx b/docs/pages/versions/v49.0.0/sdk/gl-view.mdx
new file mode 100644
index 0000000000000..1a11f1c474bbe
--- /dev/null
+++ b/docs/pages/versions/v49.0.0/sdk/gl-view.mdx
@@ -0,0 +1,193 @@
+---
+title: GLView
+sourceCodeUrl: 'https://github.com/expo/expo/tree/sdk-49/packages/expo-gl'
+packageName: 'expo-gl'
+iconUrl: '/static/images/packages/expo-gl.png'
+---
+
+import APISection from '~/components/plugins/APISection';
+import { APIInstallSection } from '~/components/plugins/InstallSection';
+import PlatformsSection from '~/components/plugins/PlatformsSection';
+import { SnackInline} from '~/ui/components/Snippet';
+
+**`expo-gl`** provides a `View` that acts as an OpenGL ES render target, useful for rendering 2D and 3D graphics. On mounting, an OpenGL ES context is created. Its drawing buffer is presented as the contents of the `View` every frame.
+
+
+
+## Installation
+
+
+
+## Usage
+
+
+
+```js
+import React from 'react';
+import { View } from 'react-native';
+import { GLView } from 'expo-gl';
+
+export default function App() {
+ return (
+
+
+
+ );
+}
+
+function onContextCreate(gl) {
+ gl.viewport(0, 0, gl.drawingBufferWidth, gl.drawingBufferHeight);
+ gl.clearColor(0, 1, 1, 1);
+
+ // Create vertex shader (shape & position)
+ const vert = gl.createShader(gl.VERTEX_SHADER);
+ gl.shaderSource(
+ vert,
+ `
+ void main(void) {
+ gl_Position = vec4(0.0, 0.0, 0.0, 1.0);
+ gl_PointSize = 150.0;
+ }
+ `
+ );
+ gl.compileShader(vert);
+
+ // Create fragment shader (color)
+ const frag = gl.createShader(gl.FRAGMENT_SHADER);
+ gl.shaderSource(
+ frag,
+ `
+ void main(void) {
+ gl_FragColor = vec4(0.0, 0.0, 0.0, 1.0);
+ }
+ `
+ );
+ gl.compileShader(frag);
+
+ // Link together into a program
+ const program = gl.createProgram();
+ gl.attachShader(program, vert);
+ gl.attachShader(program, frag);
+ gl.linkProgram(program);
+ gl.useProgram(program);
+
+ gl.clear(gl.COLOR_BUFFER_BIT);
+ gl.drawArrays(gl.POINTS, 0, 1);
+
+ gl.flush();
+ gl.endFrameEXP();
+}
+```
+
+
+
+## High-level APIs
+
+Since the WebGL API is quite low-level, it can be helpful to use higher-level graphics APIs rendering through a `GLView` underneath. The following libraries integrate popular graphics APIs:
+
+- [expo-three](https://github.com/expo/expo-three) for [three.js](https://threejs.org)
+- [expo-processing](https://github.com/expo/expo-processing) for [processing.js](http://processingjs.org)
+
+Any WebGL-supporting library that expects a [WebGLRenderingContext](https://www.khronos.org/registry/webgl/specs/latest/1.0/#5.14) could be used. Some times such libraries assume a web JavaScript context (such as assuming `document`). Usually this is for resource loading or event handling, with the main rendering logic still only using pure WebGL. So these libraries can usually still be used with a couple workarounds. The Expo-specific integrations above include workarounds for some popular libraries.
+
+## Integration with Reanimated worklets
+
+To use this API inside Reanimated worklet, you need to pass the GL context ID to the worklet and recreate the GL object like in the example below.
+
+
+
+```js
+import React from 'react';
+import { View } from 'react-native';
+import { runOnUI } from 'react-native-reanimated';
+import { GLView } from 'expo-gl';
+
+function render(gl) {
+ 'worklet';
+ // add your WebGL code here
+}
+
+function onContextCreate(gl) {
+ runOnUI((contextId: number) => {
+ 'worklet';
+ const gl = GLView.getWorkletContext(contextId);
+ render(gl);
+ })(gl.contextId);
+}
+
+export default function App() {
+ return (
+
+
+
+ );
+}
+```
+
+
+
+For more in-depth example on how to use `expo-gl` with Reanimated and Gesture Handler you can check [this example](https://github.com/expo/expo/tree/main/apps/native-component-list/src/screens/GL/GLReanimatedExample.tsx).
+
+### Limitations
+
+Worklet runtime is imposing some limitations on the code that runs inside it, so if you have existing WebGL code, it'll likely require some modifications to run inside a worklet thread.
+
+- Third-party libraries like Pixi.js or Three.js won't work inside the worklet, you can only use functions that have `'worklet'` added at the start.
+- If you need to load some assets to pass to the WebGL code, it needs to be done on the main thread and passed via some reference to the worklet. If you are using `expo-assets` you can just pass asset object returned by `Asset.fromModule` or from hook `useAssets` to the `runOnUI` function.
+- To implement a rendering loop you need to use `requestAnimationFrame`, APIs like `setTimeout` are not supported.
+- It's supported only on Android and iOS, it doesn't work on Web.
+
+Check [Reanimated documentation](https://docs.swmansion.com/react-native-reanimated/docs/fundamentals/worklets) to learn more.
+
+## Remote Debugging & GLView
+
+This API does not function as intended with remote debugging enabled. The React Native debugger runs JavaScript on your computer, not the mobile device. GLView requires synchronous native calls that are not supported in Chrome.
+
+## API
+
+```js
+import { GLView } from 'expo-gl';
+```
+
+
+
+## WebGL API
+
+Once the component is mounted and the OpenGL ES context has been created, the `gl` object received through the `onContextCreate` prop becomes the interface to the OpenGL ES context, providing a WebGL API. It resembles a [WebGL2RenderingContext](https://www.khronos.org/registry/webgl/specs/latest/2.0/#3.7) in the WebGL 2 spec.
+
+Some older Android devices may not support WebGL2 features. To check whether the device supports WebGL2 it's recommended to use `gl instanceof WebGL2RenderingContext`.
+
+An additional method `gl.endFrameEXP()` is present, which notifies the context that the current frame is ready to present. This is similar to a 'swap buffers' API call in other OpenGL platforms.
+
+The following WebGL2RenderingContext methods are currently unimplemented:
+
+- `getFramebufferAttachmentParameter()`
+- `getRenderbufferParameter()`
+- `compressedTexImage2D()`
+- `compressedTexSubImage2D()`
+- `getTexParameter()`
+- `getUniform()`
+- `getVertexAttrib()`
+- `getVertexAttribOffset()`
+- `getBufferSubData()`
+- `getInternalformatParameter()`
+- `renderbufferStorageMultisample()`
+- `compressedTexImage3D()`
+- `compressedTexSubImage3D()`
+- `fenceSync()`
+- `isSync()`
+- `deleteSync()`
+- `clientWaitSync()`
+- `waitSync()`
+- `getSyncParameter()`
+- `getActiveUniformBlockParameter()`
+
+The `pixels` argument of [`texImage2D()`](https://developer.mozilla.org/en-US/docs/Web/API/WebGLRenderingContext/texImage2D) must be `null`, an `ArrayBuffer` with pixel data, or an object of the form `{ localUri }` where `localUri` is the `file://` URI of an image in the device's file system. Thus, an `Asset` object is used once `.downloadAsync()` has been called on it (and completed) to fetch the resource.
+
+For efficiency reasons, the current implementations of the methods don't perform type or bounds checking on their arguments. So, passing invalid arguments may cause a native crash. There are plans to update the API to perform argument checking in upcoming SDK versions.
+
+Currently, the priority for error checking is low since engines generally don't rely on the OpenGL API to perform argument checking; otherwise, checks performed by the underlying OpenGL ES implementation are often sufficient.
diff --git a/docs/pages/versions/v49.0.0/sdk/gyroscope.mdx b/docs/pages/versions/v49.0.0/sdk/gyroscope.mdx
new file mode 100644
index 0000000000000..07e23fdaad189
--- /dev/null
+++ b/docs/pages/versions/v49.0.0/sdk/gyroscope.mdx
@@ -0,0 +1,119 @@
+---
+title: Gyroscope
+sourceCodeUrl: 'https://github.com/expo/expo/tree/sdk-49/packages/expo-sensors'
+packageName: 'expo-sensors'
+iconUrl: '/static/images/packages/expo-sensors.png'
+---
+
+import APISection from '~/components/plugins/APISection';
+import { APIInstallSection } from '~/components/plugins/InstallSection';
+import PlatformsSection from '~/components/plugins/PlatformsSection';
+import { SnackInline} from '~/ui/components/Snippet';
+
+`Gyroscope` from **`expo-sensors`** provides access to the device's gyroscope sensor to respond to changes in rotation in three-dimensional space.
+
+
+
+## Installation
+
+
+
+## Usage
+
+
+
+```jsx
+import React, { useState, useEffect } from 'react';
+import { StyleSheet, Text, TouchableOpacity, View } from 'react-native';
+import { Gyroscope } from 'expo-sensors';
+
+export default function App() {
+ const [{ x, y, z }, setData] = useState({
+ x: 0,
+ y: 0,
+ z: 0,
+ });
+ const [subscription, setSubscription] = useState(null);
+
+ const _slow = () => Gyroscope.setUpdateInterval(1000);
+ const _fast = () => Gyroscope.setUpdateInterval(16);
+
+ const _subscribe = () => {
+ setSubscription(
+ Gyroscope.addListener(gyroscopeData => {
+ setData(gyroscopeData);
+ })
+ );
+ };
+
+ const _unsubscribe = () => {
+ subscription && subscription.remove();
+ setSubscription(null);
+ };
+
+ useEffect(() => {
+ _subscribe();
+ return () => _unsubscribe();
+ }, []);
+
+ return (
+
+ Gyroscope:
+ x: {x}
+ y: {y}
+ z: {z}
+
+
+ {subscription ? 'On' : 'Off'}
+
+
+ Slow
+
+
+ Fast
+
+
+
+ );
+}
+
+/* @hide const styles = StyleSheet.create({ ... }); */
+const styles = StyleSheet.create({
+ container: {
+ flex: 1,
+ justifyContent: 'center',
+ paddingHorizontal: 10,
+ },
+ text: {
+ textAlign: 'center',
+ },
+ buttonContainer: {
+ flexDirection: 'row',
+ alignItems: 'stretch',
+ marginTop: 15,
+ },
+ button: {
+ flex: 1,
+ justifyContent: 'center',
+ alignItems: 'center',
+ backgroundColor: '#eee',
+ padding: 10,
+ },
+ middleButton: {
+ borderLeftWidth: 1,
+ borderRightWidth: 1,
+ borderColor: '#ccc',
+ },
+});
+/* @end */
+```
+
+
+
+## API
+
+```js
+import { Gyroscope } from 'expo-sensors';
+```
+
+
\ No newline at end of file
diff --git a/docs/pages/versions/v49.0.0/sdk/haptics.mdx b/docs/pages/versions/v49.0.0/sdk/haptics.mdx
new file mode 100644
index 0000000000000..5628d58f60b36
--- /dev/null
+++ b/docs/pages/versions/v49.0.0/sdk/haptics.mdx
@@ -0,0 +1,135 @@
+---
+title: Haptics
+sourceCodeUrl: 'https://github.com/expo/expo/tree/sdk-49/packages/expo-haptics'
+packageName: 'expo-haptics'
+iconUrl: '/static/images/packages/expo-haptics.png'
+---
+
+import APISection from '~/components/plugins/APISection';
+import { APIInstallSection } from '~/components/plugins/InstallSection';
+import PlatformsSection from '~/components/plugins/PlatformsSection';
+import { SnackInline} from '~/ui/components/Snippet';
+
+**`expo-haptics`** provides haptic (touch) feedback for
+
+- iOS 10+ devices using the Taptic Engine
+- Android devices using Vibrator system service.
+
+On iOS, _the Taptic engine will do nothing if any of the following conditions are true on a user's device:_
+
+- Low Power Mode is enabled ([Feature Request](https://expo.canny.io/feature-requests/p/expose-low-power-mode-ios-battery-saver-android))
+- User disabled the Taptic Engine in settings ([Feature Request](https://expo.canny.io/feature-requests/p/react-native-settings))
+- Haptic engine generation is too low (less than 2nd gen) - Private API
+ - Using private API will get your app rejected: `[[UIDevice currentDevice] valueForKey: @"_feedbackSupportLevel"]` so this is not added in Expo
+- iOS version is less than 10 (iPhone 7 is the first phone to support this)
+ - This could be found through: `Constants.platform.ios.systemVersion` or `Constants.platform.ios.platform`
+- iOS Camera is active (in order prevent destabilization)
+
+
+
+## Installation
+
+
+
+## Configuration
+
+On Android, this module requires permission to control vibration on the device. The `VIBRATE` permission is added automatically.
+
+## Usage
+
+
+
+```jsx
+import * as React from 'react';
+import { StyleSheet, View, Text, Button } from 'react-native';
+import * as Haptics from 'expo-haptics';
+
+export default function App() {
+ return (
+
+ Haptics.selectionAsync
+
+ /* @info */ Haptics.selectionAsync() /* @end */} />
+
+ Haptics.notificationAsync
+
+
+ /* @info */ Haptics.notificationAsync(
+ Haptics.NotificationFeedbackType.Success
+ ) /* @end */
+ }
+ />
+
+ /* @info */ Haptics.notificationAsync(
+ Haptics.NotificationFeedbackType.Error
+ ) /* @end */
+ }
+ />
+
+ /* @info */ Haptics.notificationAsync(
+ Haptics.NotificationFeedbackType.Warning
+ ) /* @end */
+ }
+ />
+
+ Haptics.impactAsync
+
+ /* @info */ Haptics.impactAsync(Haptics.ImpactFeedbackStyle.Light) /* @end */
+ }
+ />
+ /* @info */ Haptics.impactAsync(Haptics.ImpactFeedbackStyle.Medium) /* @end */
+ }
+ />
+ /* @info */ Haptics.impactAsync(Haptics.ImpactFeedbackStyle.Heavy) /* @end */
+ }
+ />
+
+
+ );
+}
+
+/* @hide const styles = StyleSheet.create({ ... }); */
+const styles = StyleSheet.create({
+ container: {
+ flex: 1,
+ justifyContent: 'center',
+ paddingHorizontal: 16,
+ },
+ buttonContainer: {
+ flexDirection: 'row',
+ alignItems: 'stretch',
+ marginTop: 10,
+ marginBottom: 30,
+ justifyContent: 'space-between',
+ },
+});
+/* @end */
+```
+
+
+
+## API
+
+```js
+import * as Haptics from 'expo-haptics';
+```
+
+
diff --git a/docs/pages/versions/v49.0.0/sdk/image.mdx b/docs/pages/versions/v49.0.0/sdk/image.mdx
new file mode 100644
index 0000000000000..3ee6f6ad11a0b
--- /dev/null
+++ b/docs/pages/versions/v49.0.0/sdk/image.mdx
@@ -0,0 +1,148 @@
+---
+title: Image
+sourceCodeUrl: 'https://github.com/expo/expo/tree/sdk-49/packages/expo-image'
+packageName: 'expo-image'
+iconUrl: '/static/images/packages/expo-image.png'
+---
+
+import APISection from '~/components/plugins/APISection';
+import { APIInstallSection } from '~/components/plugins/InstallSection';
+import PlatformsSection from '~/components/plugins/PlatformsSection';
+import { Terminal } from '~/ui/components/Snippet';
+import { YesIcon, NoIcon, PendingIcon } from '~/ui/components/DocIcons';
+
+**`expo-image`** is a cross-platform React component that loads and renders images.
+
+**Main features:**
+
+- Designed for speed
+- Support for many image formats (including animated ones)
+- Disk and memory caching
+- Supports [BlurHash](https://blurha.sh) and [ThumbHash](https://evanw.github.io/thumbhash/) - compact representations of a placeholder for an image
+- Transitioning between images when the source changes (no more flickering!)
+- Implements the CSS [`object-fit`](https://developer.mozilla.org/en-US/docs/Web/CSS/object-fit) and [`object-position`](https://developer.mozilla.org/en-US/docs/Web/CSS/object-position) properties (see [`contentFit`](#contentfit) and [`contentPosition`](#contentposition) props)
+- Uses performant [`SDWebImage`](https://github.com/SDWebImage/SDWebImage) and [`Glide`](https://github.com/bumptech/glide) under the hood
+
+
+
+#### Supported image formats
+
+| Format | Android | iOS | Web |
+| :--------: | :---------: | :---------: | :-----------------------------------------------------------------: |
+| WebP | | | [~96% adoption](https://caniuse.com/webp) |
+| PNG / APNG | | | / [~96% adoption](https://caniuse.com/apng) |
+| AVIF | (No support for animated AVIFs)| | [~79% adoption](https://caniuse.com/avif) |
+| HEIC | | | [not adopted yet](https://caniuse.com/heif) |
+| JPEG | | | |
+| GIF | | | |
+| SVG | | | |
+| ICO | | | |
+| ICNS | | | |
+
+## Installation
+
+> **Info** `expo-image` is not yet available in Snack.
+
+
+
+## Usage
+
+```jsx
+import { Image } from 'expo-image';
+import { StyleSheet, View } from 'react-native';
+
+const blurhash =
+ '|rF?hV%2WCj[ayj[a|j[az_NaeWBj@ayfRayfQfQM{M|azj[azf6fQfQfQIpWXofj[ayj[j[fQayWCoeoeaya}j[ayfQa{oLj?j[WVj[ayayj[fQoff7azayj[ayj[j[ayofayayayj[fQj[ayayj[ayfjj[j[ayjuayj[';
+
+export default function App() {
+ return (
+
+
+
+ );
+}
+
+const styles = StyleSheet.create({
+ container: {
+ flex: 1,
+ backgroundColor: '#fff',
+ alignItems: 'center',
+ justifyContent: 'center',
+ },
+ image: {
+ flex: 1,
+ width: '100%',
+ backgroundColor: '#0553',
+ },
+});
+```
+
+## API
+
+```js
+import { Image } from 'expo-image';
+```
+
+
+
+## Generating a blurhash on a server
+
+Images can significantly improve the visual experience, however, they can also slow down app/page loading times due to their large file sizes. To overcome this, you can create placeholder images using blurhash algorithm that provides an immersive experience while deferring the loading of the actual picture until later.
+
+This guide demonstrates how to create a blurhash of an uploaded image on the backend using JavaScript and Express.js. The same techniques and principles apply to other languages and server technologies.
+
+Start by installing a few dependencies: [`multer`](https://github.com/expressjs/multer) for handling multipart requests, [`sharp`](https://github.com/lovell/sharp) for converting files to a data buffer, and the official [`blurhash` JavaScript package](https://github.com/woltapp/blurhash/tree/master/TypeScript).
+
+
+
+Next, import all required functions from installed packages and initialize `multer`:
+
+```js
+// Multer is a middleware for handling `multipart/form-data`.
+const multer = require('multer');
+// Sharp allows you to receive a data buffer from the uploaded image.
+const sharp = require('sharp');
+// Import the encode function from the blurhash package.
+const { encode } = require('blurhash');
+
+// Initialize `multer`.
+const upload = multer();
+```
+
+Assuming the `app` is a variable that holds a reference to the Express server, an endpoint can be created that accepts an image and returns a JSON response containing the generated blurhash.
+
+```js
+app.post('/blurhash', upload.single('image'), async (req, res) => {
+ const { file } = req;
+ // If the file is not available we're returning with error.
+ if (file === null) {
+ res.status(400).json({ message: 'Image is missing' });
+ return;
+ }
+
+ // Users can specify number of components in each axes.
+ const componentX = req.body.componentX ?? 4;
+ const componentY = req.body.componentY ?? 3;
+
+ // We're converting provided image to a byte buffer.
+ // Sharp currently supports multiple common formats like JPEG, PNG, WebP, GIF, and AVIF.
+ const { data, info } = await sharp(file.buffer).ensureAlpha().raw().toBuffer({
+ resolveWithObject: true,
+ });
+
+ const blurhash = encode(data, info.width, info.height, componentX, componentY);
+ res.json({ blurhash });
+});
+```
+
+Additionally, the request can include two parameters: `componentX` and `componentY`, are passed through the algorithm. These values can be calculated or hard-coded on the server or specified by the user. However, they must be within the range of 1 to 9 and have an aspect ratio similar to the uploaded image. A value of 9 will give the best results but may take longer to generate the hash.
+
+The process of generating a blurhash can be accomplished in various languages and server technologies, similar to the one using JavaScript. The key step is to locate an encoder for your chosen language, which can often be found in the [`woltapp/blurhash`](https://github.com/woltapp/blurhash#implementations) repository. Once you have the encoder, you will need to obtain a representation of the image. Some libraries use a default image class (for example, the Swift implementation uses `UIImage`). In other cases, you will have to provide raw byte data. Make sure to check the encoder's documentation to confirm the expected data format.
+
+> When working with raw byte data, ensure that the alpha layer is present (each pixel is represented by red, green, blue, and alpha values). Failing to do so will lead to errors such as "width and height must match the pixels array".
diff --git a/docs/pages/versions/v49.0.0/sdk/imagemanipulator.mdx b/docs/pages/versions/v49.0.0/sdk/imagemanipulator.mdx
new file mode 100644
index 0000000000000..1669c1cfee23e
--- /dev/null
+++ b/docs/pages/versions/v49.0.0/sdk/imagemanipulator.mdx
@@ -0,0 +1,101 @@
+---
+title: ImageManipulator
+sourceCodeUrl: 'https://github.com/expo/expo/tree/sdk-49/packages/expo-image-manipulator'
+packageName: 'expo-image-manipulator'
+iconUrl: '/static/images/packages/expo-image-manipulator.png'
+---
+
+import APISection from '~/components/plugins/APISection';
+import { APIInstallSection } from '~/components/plugins/InstallSection';
+import PlatformsSection from '~/components/plugins/PlatformsSection';
+import { SnackInline} from '~/ui/components/Snippet';
+
+**`expo-image-manipulator`** provides an API to modify images stored on the local file system.
+
+
+
+## Installation
+
+
+
+## Usage
+
+This will first rotate the image 90 degrees clockwise, then flip the rotated image vertically and save it as a PNG.
+
+
+
+```js
+import React, { useState, useEffect } from 'react';
+import { Button, Image, StyleSheet, View } from 'react-native';
+import { Asset } from 'expo-asset';
+import { manipulateAsync, FlipType, SaveFormat } from 'expo-image-manipulator';
+
+export default function App() {
+ const [ready, setReady] = useState(false);
+ const [image, setImage] = useState(null);
+
+ useEffect(() => {
+ (async () => {
+ const image = Asset.fromModule(require('./assets/snack-icon.png'));
+ await image.downloadAsync();
+ setImage(image);
+ setReady(true);
+ })();
+ }, []);
+
+ const _rotate90andFlip = async () => {
+ const manipResult = await manipulateAsync(
+ image.localUri || image.uri,
+ [{ rotate: 90 }, { flip: FlipType.Vertical }],
+ { compress: 1, format: SaveFormat.PNG }
+ );
+ setImage(manipResult);
+ };
+
+ const _renderImage = () => (
+
+
+
+ );
+
+ return (
+
+ {ready && image && _renderImage()}
+
+
+ );
+}
+
+/* @hide const styles = StyleSheet.create({ ... }); */
+const styles = StyleSheet.create({
+ container: {
+ flex: 1,
+ justifyContent: 'center',
+ },
+ imageContainer: {
+ marginVertical: 20,
+ alignItems: 'center',
+ justifyContent: 'center',
+ },
+ image: {
+ width: 300,
+ height: 300,
+ resizeMode: 'contain',
+ },
+});
+```
+
+
+
+## API
+
+```js
+import * as ImageManipulator from 'expo-image-manipulator';
+```
+
+
diff --git a/docs/pages/versions/v49.0.0/sdk/imagepicker.mdx b/docs/pages/versions/v49.0.0/sdk/imagepicker.mdx
new file mode 100644
index 0000000000000..c36da0205f73a
--- /dev/null
+++ b/docs/pages/versions/v49.0.0/sdk/imagepicker.mdx
@@ -0,0 +1,199 @@
+---
+title: ImagePicker
+sourceCodeUrl: 'https://github.com/expo/expo/tree/sdk-49/packages/expo-image-picker'
+packageName: 'expo-image-picker'
+iconUrl: '/static/images/packages/expo-image-picker.png'
+---
+
+import {
+ ConfigReactNative,
+ ConfigPluginExample,
+ ConfigPluginProperties,
+} from '~/components/plugins/ConfigSection';
+import { AndroidPermissions, IOSPermissions } from '~/components/plugins/permissions';
+import APISection from '~/components/plugins/APISection';
+import { APIInstallSection } from '~/components/plugins/InstallSection';
+import PlatformsSection from '~/components/plugins/PlatformsSection';
+import Video from '~/components/plugins/Video';
+import { SnackInline } from '~/ui/components/Snippet';
+import { BoxLink } from '~/ui/components/BoxLink';
+import { GithubIcon } from '@expo/styleguide-icons';
+import { PlatformTags } from '~/ui/components/Tag';
+
+**`expo-image-picker`** provides access to the system's UI for selecting images and videos from the phone's library or taking a photo with the camera.
+
+
+
+
+
+## Installation
+
+
+
+#### Known issues
+
+On iOS, when an image (usually of a [higher resolution](http://www.openradar.me/49866214)) is picked from the camera roll, the result of the cropped image gives the wrong value for the cropped rectangle in some cases. Unfortunately, this issue is with the underlying `UIImagePickerController` due to a bug in the closed-source tools built into iOS.
+
+## Configuration in app.json/app.config.js
+
+You can configure `expo-image-picker` using its built-in [config plugin](/config-plugins/introduction/) if you use config plugins in your project ([EAS Build](/build/introduction) or `npx expo run:[android|ios]`). The plugin allows you to configure various properties that cannot be set at runtime and require building a new app binary to take effect.
+
+
+
+Learn how to configure the native projects in the [installation instructions in the `expo-image-picker` repository](https://github.com/expo/expo/tree/main/packages/expo-image-picker#installation-in-bare-react-native-projects).
+
+
+
+
+
+```json app.json
+{
+ "expo": {
+ "plugins": [
+ [
+ "expo-image-picker",
+ {
+ "photosPermission": "The app accesses your photos to let you share them with your friends."
+ }
+ ]
+ ]
+ }
+}
+```
+
+
+
+
+
+## Usage
+
+
+
+```js
+import React, { useState, useEffect } from 'react';
+import { Button, Image, View, Platform } from 'react-native';
+import * as ImagePicker from 'expo-image-picker';
+
+export default function ImagePickerExample() {
+ const [image, setImage] = useState(null);
+
+ const pickImage = async () => {
+ // No permissions request is necessary for launching the image library
+ let result = await ImagePicker.launchImageLibraryAsync({
+ mediaTypes: ImagePicker.MediaTypeOptions.All,
+ allowsEditing: true,
+ aspect: [4, 3],
+ quality: 1,
+ });
+
+ console.log(result);
+
+ if (!result.canceled) {
+ setImage(result.assets[0].uri);
+ }
+ };
+
+ return (
+
+
+ {image && }
+
+ );
+}
+```
+
+
+
+When you run this example and pick an image, you will see the image that you picked show up in your app, and a similar log will be shown in the console:
+
+```json
+{
+ "assets": [
+ {
+ "assetId": "C166F9F5-B5FE-4501-9531",
+ "base64": null,
+ "duration": null,
+ "exif": null,
+ "fileName": "IMG.HEIC",
+ "fileSize": 6018901,
+ "height": 3025,
+ "type": "image",
+ "uri": "file:///data/user/0/host.exp.exponent/cache/cropped1814158652.jpg"
+ "width": 3024
+ }
+ ],
+ "canceled": false,
+ "cancelled": false
+}
+```
+
+### With AWS S3
+
+
+
+See [Amplify documentation](https://docs.amplify.aws/) guide to set up your project correctly.
+
+### With Firebase
+
+
+
+See [Using Firebase](/guides/using-firebase/) guide to set up your project correctly.
+
+## API
+
+```js
+import * as ImagePicker from 'expo-image-picker';
+```
+
+
+
+## Permissions
+
+### Android
+
+The following permissions are added automatically through the library **AndroidManifest.xml**.
+
+
+
+### iOS
+
+The following usage description keys are used by the APIs in this library.
+
+
diff --git a/docs/pages/versions/v49.0.0/sdk/in-app-purchases.mdx b/docs/pages/versions/v49.0.0/sdk/in-app-purchases.mdx
new file mode 100644
index 0000000000000..f511edf2660f6
--- /dev/null
+++ b/docs/pages/versions/v49.0.0/sdk/in-app-purchases.mdx
@@ -0,0 +1,51 @@
+---
+title: InAppPurchases
+sourceCodeUrl: 'https://github.com/expo/expo/tree/sdk-49/packages/expo-in-app-purchases'
+packageName: 'expo-in-app-purchases'
+---
+
+import { APIInstallSection } from '~/components/plugins/InstallSection';
+import APISection from '~/components/plugins/APISection';
+import PlatformsSection from '~/components/plugins/PlatformsSection';
+
+> **warning** **Development of `expo-in-app-purchases` is currently paused to focus on other projects**. Alternative libraries include [`react-native-iap`](https://github.com/dooboolab/react-native-iap) and [`react-native-purchases` from RevenueCat](https://www.revenuecat.com/blog/using-revenuecat-with-expos-managed-workflow/).
+
+**`expo-in-app-purchases`** provides an API to accept payments for in-app products. Internally this relies on the [Google Play Billing](https://developer.android.com/google/play/billing/billing_library_overview) library on Android and the [StoreKit](https://developer.apple.com/documentation/storekit?language=objc) framework on iOS.
+
+
+
+## Installation
+
+This module is **not** available in the [Expo Go app](https://expo.dev/expo-go) due to app store restrictions.
+
+You can create a [development build](/develop/development-builds/create-a-build/) to work with this package.
+
+
+
+## Setup
+
+### iOS
+
+In order to use the In-App Purchases API on iOS, you’ll need to sign the [Paid Applications Agreement](https://help.apple.com/app-store-connect/#/devb6df5ee51) and set up your banking and tax information. You also need to enable the [In-App Purchases capability](https://help.apple.com/xcode/mac/current/#/dev88ff319e7) for your app in Xcode.
+
+Next, create an entry for your app in [App Store Connect](https://appstoreconnect.apple.com/) and configure your in-app purchases, including details (such as name, pricing, and description) that highlight the features and functionality of your in-app products. Make sure each product's status says `Ready to Submit`, otherwise it will not be queryable from within your app when you are testing. Be sure to add any necessary metadata to do so including uploading a screenshot (this can be anything when you're testing) and review notes. Your app's status must also say `Ready to Submit` but you do not need to actually submit your app or its products for review to test purchases in sandbox mode.
+
+Now you can create a [sandbox account](https://help.apple.com/app-store-connect/#/dev8b997bee1) to test in-app purchases before you make your app available.
+
+For more information, see Apple's workflow for configuring In-App Purchases [here](https://help.apple.com/app-store-connect/#/devb57be10e7).
+
+### Android
+
+On Android, you must first create an entry for your app and upload a release APK in the [Google Play Console](https://developer.android.com/distribute/console/). From there, you can configure your in-app purchases and their details under `Store Presence > In-app products`.
+
+Then to test your purchases, you must publish your app to a closed or open testing track in Google Play. Note that it may take a few hours for the app to be available for testers. Ensure the testers you invite (including yourself) opt in to your app's test. On your test’s opt-in URL, your testers will get an explanation of what it means to be a tester and a link to opt-in. At this point, they're all set and can start making purchases once they download your app or build from source. For more information on testing, follow [these instructions](https://developer.android.com/google/play/billing/billing_testing).
+
+> Note that in-app purchases require physical devices to work on both platforms and therefore **cannot be tested on simulators**.
+
+## API
+
+```js
+import * as InAppPurchases from 'expo-in-app-purchases';
+```
+
+
diff --git a/docs/pages/versions/v49.0.0/sdk/intent-launcher.mdx b/docs/pages/versions/v49.0.0/sdk/intent-launcher.mdx
new file mode 100644
index 0000000000000..6b8010dcccd28
--- /dev/null
+++ b/docs/pages/versions/v49.0.0/sdk/intent-launcher.mdx
@@ -0,0 +1,34 @@
+---
+title: IntentLauncher
+sourceCodeUrl: 'https://github.com/expo/expo/tree/sdk-49/packages/expo-intent-launcher'
+packageName: 'expo-intent-launcher'
+---
+
+import APISection from '~/components/plugins/APISection';
+import { APIInstallSection } from '~/components/plugins/InstallSection';
+import PlatformsSection from '~/components/plugins/PlatformsSection';
+
+**`expo-intent-launcher`** provides a way to launch Android intents. For example, you can use this API to open a specific settings screen.
+
+
+
+## Installation
+
+
+
+## Usage
+
+```ts
+import { startActivityAsync, ActivityAction } from 'expo-intent-launcher';
+
+// Open location settings
+startActivityAsync(ActivityAction.LOCATION_SOURCE_SETTINGS);
+```
+
+## API
+
+```js
+import * as IntentLauncher from 'expo-intent-launcher';
+```
+
+
diff --git a/docs/pages/versions/v49.0.0/sdk/keep-awake.mdx b/docs/pages/versions/v49.0.0/sdk/keep-awake.mdx
new file mode 100644
index 0000000000000..dce6d8ffbc8a6
--- /dev/null
+++ b/docs/pages/versions/v49.0.0/sdk/keep-awake.mdx
@@ -0,0 +1,90 @@
+---
+title: KeepAwake
+sourceCodeUrl: 'https://github.com/expo/expo/tree/sdk-49/packages/expo-keep-awake'
+packageName: 'expo-keep-awake'
+---
+
+import APISection from '~/components/plugins/APISection';
+import { APIInstallSection } from '~/components/plugins/InstallSection';
+import PlatformsSection from '~/components/plugins/PlatformsSection';
+import { SnackInline} from '~/ui/components/Snippet';
+
+**`expo-keep-awake`** provides a React hook that prevents the screen from sleeping and a pair of functions to enable this behavior imperatively.
+
+
+
+## Installation
+
+
+
+## Usage
+
+### Example: hook
+
+
+
+```javascript
+import { useKeepAwake } from 'expo-keep-awake';
+import React from 'react';
+import { Text, View } from 'react-native';
+
+export default function KeepAwakeExample() {
+ /* @info As long as this component is mounted, the screen will not turn off from being idle. */
+ useKeepAwake();
+ /* @end */
+ return (
+
+ This screen will never sleep!
+
+ );
+}
+```
+
+
+
+### Example: functions
+
+
+
+```javascript
+import { activateKeepAwake, deactivateKeepAwake } from 'expo-keep-awake';
+import React from 'react';
+import { Button, View } from 'react-native';
+
+export default class KeepAwakeExample extends React.Component {
+ render() {
+ return (
+
+
+
+
+ );
+ }
+
+ _activate = () => {
+ /* @info Screen will remain on after called until deactivateKeepAwake() is called. */ activateKeepAwake(); /* @end */
+ alert('Activated!');
+ };
+
+ _deactivate = () => {
+ /* @info Deactivates KeepAwake, or does nothing if it was never activated. */ deactivateKeepAwake(); /* @end */
+ alert('Deactivated!');
+ };
+}
+```
+
+
+
+## API
+
+```js
+import KeepAwake from 'expo-keep-awake';
+```
+
+
diff --git a/docs/pages/versions/v49.0.0/sdk/light-sensor.mdx b/docs/pages/versions/v49.0.0/sdk/light-sensor.mdx
new file mode 100644
index 0000000000000..329f7b3357807
--- /dev/null
+++ b/docs/pages/versions/v49.0.0/sdk/light-sensor.mdx
@@ -0,0 +1,103 @@
+---
+title: LightSensor
+sourceCodeUrl: 'https://github.com/expo/expo/tree/sdk-49/packages/expo-sensors'
+packageName: 'expo-sensors'
+iconUrl: '/static/images/packages/expo-sensors.png'
+---
+
+import APISection from '~/components/plugins/APISection';
+import { APIInstallSection } from '~/components/plugins/InstallSection';
+import PlatformsSection from '~/components/plugins/PlatformsSection';
+import { SnackInline } from '~/ui/components/Snippet';
+
+`LightSensor` from `expo-sensors` provides access to the device's light sensor to respond to illuminance changes.
+
+
+
+## Installation
+
+
+
+## Usage
+
+
+
+```jsx
+import React, { useState, useEffect } from 'react';
+import { StyleSheet, Text, TouchableOpacity, View, Platform } from 'react-native';
+import { LightSensor } from 'expo-sensors';
+
+export default function App() {
+ const [{ illuminance }, setData] = useState({ illuminance: 0 });
+
+ useEffect(() => {
+ _toggle();
+
+ return () => {
+ _unsubscribe();
+ };
+ }, []);
+
+ const _toggle = () => {
+ if (this._subscription) {
+ _unsubscribe();
+ } else {
+ _subscribe();
+ }
+ };
+
+ const _subscribe = () => {
+ this._subscription = LightSensor.addListener(setData);
+ };
+
+ const _unsubscribe = () => {
+ this._subscription && this._subscription.remove();
+ this._subscription = null;
+ };
+
+ return (
+
+ Light Sensor:
+
+ Illuminance: {Platform.OS === 'android' ? `${illuminance} lx` : `Only available on Android`}
+
+
+
+ Toggle
+
+
+
+ );
+}
+
+/* @hide const styles = StyleSheet.create({ ... }); */
+const styles = StyleSheet.create({
+ buttonContainer: {
+ flexDirection: 'row',
+ alignItems: 'stretch',
+ marginTop: 15,
+ },
+ button: {
+ flex: 1,
+ justifyContent: 'center',
+ alignItems: 'center',
+ backgroundColor: '#eee',
+ padding: 10,
+ },
+ sensor: {
+ marginTop: 45,
+ paddingHorizontal: 10,
+ },
+});
+/* @end */
+```
+
+
+
+## API
+
+```js
+import { LightSensor } from 'expo-sensors';
+```
+
+
diff --git a/docs/pages/versions/v49.0.0/sdk/linear-gradient.mdx b/docs/pages/versions/v49.0.0/sdk/linear-gradient.mdx
new file mode 100644
index 0000000000000..ffe1385cb0f72
--- /dev/null
+++ b/docs/pages/versions/v49.0.0/sdk/linear-gradient.mdx
@@ -0,0 +1,85 @@
+---
+title: LinearGradient
+sourceCodeUrl: 'https://github.com/expo/expo/tree/sdk-49/packages/expo-linear-gradient'
+packageName: 'expo-linear-gradient'
+iconUrl: '/static/images/packages/expo-linear-gradient.png'
+---
+
+import APISection from '~/components/plugins/APISection';
+import { APIInstallSection } from '~/components/plugins/InstallSection';
+import PlatformsSection from '~/components/plugins/PlatformsSection';
+import { SnackInline} from '~/ui/components/Snippet';
+
+**`expo-linear-gradient`** provides a native React view that transitions between multiple colors in a linear direction.
+
+
+
+## Installation
+
+
+
+## Usage
+
+
+
+```tsx
+import * as React from 'react';
+import { StyleSheet, Text, View } from 'react-native';
+import { LinearGradient } from 'expo-linear-gradient';
+
+export default function App() {
+ return (
+
+
+
+ Sign in with Facebook
+
+
+ );
+}
+
+/* @hide const styles = StyleSheet.create({ ... }); */
+const styles = StyleSheet.create({
+ container: {
+ flex: 1,
+ alignItems: 'center',
+ justifyContent: 'center',
+ backgroundColor: 'orange',
+ },
+ background: {
+ position: 'absolute',
+ left: 0,
+ right: 0,
+ top: 0,
+ height: 300,
+ },
+ button: {
+ padding: 15,
+ alignItems: 'center',
+ borderRadius: 5,
+ },
+ text: {
+ backgroundColor: 'transparent',
+ fontSize: 15,
+ color: '#fff',
+ },
+});
+/* @end */
+```
+
+
+
+## API
+
+```js
+import { LinearGradient } from 'expo-linear-gradient';
+```
+
+
diff --git a/docs/pages/versions/v49.0.0/sdk/linking.mdx b/docs/pages/versions/v49.0.0/sdk/linking.mdx
new file mode 100644
index 0000000000000..c8ea96def8022
--- /dev/null
+++ b/docs/pages/versions/v49.0.0/sdk/linking.mdx
@@ -0,0 +1,27 @@
+---
+title: Linking
+sourceCodeUrl: 'https://github.com/expo/expo/tree/sdk-49/packages/expo-linking'
+packageName: 'expo-linking'
+---
+
+import APISection from '~/components/plugins/APISection';
+import { APIInstallSection } from '~/components/plugins/InstallSection';
+import PlatformsSection from '~/components/plugins/PlatformsSection';
+
+`expo-linking` provides utilities for your app to interact with other installed apps using deep links. It also provides helper methods for constructing and parsing deep links into your app. This module is an extension of the React Native [Linking](https://reactnative.dev/docs/linking.html) module.
+
+For a more comprehensive explanation of how to use `expo-linking`, refer to the [Linking guide](/guides/linking).
+
+
+
+## Installation
+
+
+
+## API
+
+```js
+import * as Linking from 'expo-linking';
+```
+
+
diff --git a/docs/pages/versions/v49.0.0/sdk/local-authentication.mdx b/docs/pages/versions/v49.0.0/sdk/local-authentication.mdx
new file mode 100644
index 0000000000000..093e8684b7690
--- /dev/null
+++ b/docs/pages/versions/v49.0.0/sdk/local-authentication.mdx
@@ -0,0 +1,87 @@
+---
+title: LocalAuthentication
+sourceCodeUrl: 'https://github.com/expo/expo/tree/sdk-49/packages/expo-local-authentication'
+packageName: 'expo-local-authentication'
+iconUrl: '/static/images/packages/expo-local-authentication.png'
+---
+
+import APISection from '~/components/plugins/APISection';
+import { APIInstallSection } from '~/components/plugins/InstallSection';
+import PlatformsSection from '~/components/plugins/PlatformsSection';
+import {
+ ConfigReactNative,
+ ConfigPluginExample,
+ ConfigPluginProperties,
+} from '~/components/plugins/ConfigSection';
+import { AndroidPermissions, IOSPermissions } from '~/components/plugins/permissions';
+
+`expo-local-authentication` allows you to use the Biometric Prompt (Android) or FaceID and TouchID (iOS) to authenticate the user with a fingerprint or face scan.
+
+
+
+## Installation
+
+
+
+## Configuration in app.json/app.config.js
+
+You can configure `expo-local-authentication` using its built-in [config plugin](/config-plugins/introduction/) if you use config plugins in your project ([EAS Build](/build/introduction) or `npx expo run:[android|ios]`). The plugin allows you to configure various properties that cannot be set at runtime and require building a new app binary to take effect.
+
+
+
+```json app.json
+{
+ "expo": {
+ "plugins": [
+ [
+ "expo-local-authentication",
+ {
+ "faceIDPermission": "Allow $(PRODUCT_NAME) to use Face ID."
+ }
+ ]
+ ]
+ }
+}
+```
+
+
+
+
+
+
+
+Learn how to configure the native projects in the [installation instructions in the `expo-local-authentication` repository](https://github.com/expo/expo/tree/main/packages/expo-local-authentication#installation-in-bare-react-native-projects).
+
+
+
+## API
+
+```js
+import * as LocalAuthentication from 'expo-local-authentication';
+```
+
+
+
+## Permissions
+
+### Android
+
+The following permissions are added automatically through this library's `AndroidManifest.xml`:
+
+
+
+### iOS
+
+The following usage description keys are used by this library:
+
+
diff --git a/docs/pages/versions/v49.0.0/sdk/localization.mdx b/docs/pages/versions/v49.0.0/sdk/localization.mdx
new file mode 100644
index 0000000000000..2e10a969b2023
--- /dev/null
+++ b/docs/pages/versions/v49.0.0/sdk/localization.mdx
@@ -0,0 +1,37 @@
+---
+title: Localization
+sourceCodeUrl: 'https://github.com/expo/expo/tree/sdk-49/packages/expo-localization'
+packageName: 'expo-localization'
+iconUrl: '/static/images/packages/expo-localization.png'
+---
+
+import APISection from '~/components/plugins/APISection';
+import { APIInstallSection } from '~/components/plugins/InstallSection';
+import PlatformsSection from '~/components/plugins/PlatformsSection';
+
+`expo-localization` allows you to Localize your app, customizing the experience for specific regions, languages, or cultures. It also provides access to the locale data on the native device.
+Using the popular library [`i18n-js`](https://github.com/fnando/i18n-js) with `expo-localization` will enable you to create a very accessible experience for users.
+
+
+
+## Installation
+
+
+
+## Usage
+
+Find more information about using `expo-localization` in the [Localization](/guides/localization) guide.
+
+## API
+
+```jsx
+import { getLocales, getCalendars } from 'expo-localization';
+```
+
+### Behavior
+
+You can use synchronous `getLocales()` and `getCalendars()` methods to get the locale settings of the user device. On iOS, the results will remain the same while the app is running.
+
+On Android, the user can change locale preferences in Settings without restarting apps. To keep the localization current, you can rerun the `getLocales()` and `getCalendars()` methods every time the app returns to the foreground. Use `AppState` to detect this.
+
+
diff --git a/docs/pages/versions/v49.0.0/sdk/location.mdx b/docs/pages/versions/v49.0.0/sdk/location.mdx
new file mode 100644
index 0000000000000..2daf4eee13dcb
--- /dev/null
+++ b/docs/pages/versions/v49.0.0/sdk/location.mdx
@@ -0,0 +1,247 @@
+---
+title: Location
+sourceCodeUrl: 'https://github.com/expo/expo/tree/sdk-49/packages/expo-location'
+packageName: 'expo-location'
+---
+
+import APISection from '~/components/plugins/APISection';
+import { APIInstallSection } from '~/components/plugins/InstallSection';
+import PlatformsSection from '~/components/plugins/PlatformsSection';
+import { SnackInline } from '~/ui/components/Snippet';
+import { AndroidPermissions, IOSPermissions } from '~/components/plugins/permissions';
+import {
+ ConfigReactNative,
+ ConfigPluginExample,
+ ConfigPluginProperties,
+} from '~/components/plugins/ConfigSection';
+
+`expo-location` allows reading geolocation information from the device. Your app can poll for the current location or subscribe to location update events.
+
+
+
+## Installation
+
+
+
+## Configuration in app.json/app.config.js
+
+You can configure `expo-location` using its built-in [config plugin](/config-plugins/introduction/) if you use config plugins in your project ([EAS Build](/build/introduction) or `npx expo run:[android|ios]`). The plugin allows you to configure various properties that cannot be set at runtime and require building a new app binary to take effect.
+
+
+
+```json app.json
+{
+ "expo": {
+ "plugins": [
+ [
+ "expo-location",
+ {
+ "locationAlwaysAndWhenInUsePermission": "Allow $(PRODUCT_NAME) to use your location."
+ }
+ ]
+ ]
+ }
+}
+```
+
+
+
+
+
+
+
+Learn how to configure the native projects in the [installation instructions in the `expo-location` repository](https://github.com/expo/expo/tree/main/packages/expo-location#installation-in-bare-react-native-projects).
+
+
+
+### Background Location Methods
+
+To use Background Location methods, the following requirements apply:
+
+- Location permissions must be granted. On iOS it must be granted with `Always` option.
+- **(_iOS only_)** `"location"` background mode must be specified in **Info.plist** file. See [background tasks configuration guide](task-manager.mdx#configuration).
+- Background location task must be defined in the top-level scope, using [TaskManager.defineTask](task-manager.mdx#taskmanagerdefinetasktaskname-taskexecutor).
+
+### Geofencing Methods
+
+To use Geofencing methods, the following requirements apply:
+
+- Location permissions must be granted. On iOS it must be granted with `Always` option.
+- The Geofencing task must be defined in the top-level scope, using [TaskManager.defineTask](task-manager.mdx#taskmanagerdefinetasktaskname-taskexecutor).
+- On iOS, there is a [limit of 20](https://developer.apple.com/documentation/corelocation/monitoring_the_user_s_proximity_to_geographic_regions) `regions` that can be simultaneously monitored.
+
+## Usage
+
+If you're using the iOS or Android Emulators, ensure that [Location is enabled](#enabling-emulator-location).
+
+
+
+```jsx
+import React, { useState, useEffect } from 'react';
+import { Platform, Text, View, StyleSheet } from 'react-native';
+/* @hide */
+import Device from 'expo-device';
+/* @end */
+import * as Location from 'expo-location';
+
+export default function App() {
+ const [location, setLocation] = useState(null);
+ const [errorMsg, setErrorMsg] = useState(null);
+
+ useEffect(() => {
+ (async () => {
+ /* @hide */
+ if (Platform.OS === 'android' && !Device.isDevice) {
+ setErrorMsg(
+ 'Oops, this will not work on Snack in an Android Emulator. Try it on your device!'
+ );
+ return;
+ }
+ /* @end */
+ let { status } = await Location.requestForegroundPermissionsAsync();
+ if (status !== 'granted') {
+ setErrorMsg('Permission to access location was denied');
+ return;
+ }
+
+ let location = await Location.getCurrentPositionAsync({});
+ setLocation(location);
+ })();
+ }, []);
+
+ let text = 'Waiting..';
+ if (errorMsg) {
+ text = errorMsg;
+ } else if (location) {
+ text = JSON.stringify(location);
+ }
+
+ return (
+
+ {text}
+
+ );
+}
+
+/* @hide const styles = StyleSheet.create({ ... }); */
+const styles = StyleSheet.create({
+ container: {
+ flex: 1,
+ alignItems: 'center',
+ justifyContent: 'center',
+ padding: 20,
+ },
+ paragraph: {
+ fontSize: 18,
+ textAlign: 'center',
+ },
+});
+/* @end */
+```
+
+
+
+## Enabling Emulator Location
+
+### iOS Simulator
+
+With Simulator open, go to Debug > Location and choose any option besides "None" (obviously).
+
+![iOS Simulator location](/static/images/ios-simulator-location.png)
+
+### Android Emulator
+
+Open Android Studio, and launch your AVD in the emulator. Then, on the options bar for your device, click the icon for "More" and navigate to the "Location" tab.
+
+![Android Simulator location](/static/images/android-emulator-location.png)
+
+If you don't receive the locations in the emulator, you may have to turn off "Improve Location Accuracy" in Settings - Location in the emulator. This will turn off Wi-Fi location and only use GPS. Then you can manipulate the location with GPS data through the emulator.
+
+## API
+
+```js
+import * as Location from 'expo-location';
+```
+
+
+
+## Permissions
+
+### Android
+
+When you install the `expo-location` module, it automatically adds the following permissions:
+
+- `ACCESS_COARSE_LOCATION`: for approximate device location
+- `ACCESS_FINE_LOCATION`: for precise device location
+- `FOREGROUND_SERVICE`: to subscribe to location updates while the app is in use
+
+To use background location features, you must add the `ACCESS_BACKGROUND_LOCATION` in **app.json** and [submit your app for review and request access to use the background location permission](https://support.google.com/googleplay/android-developer/answer/9799150?hl=en).
+
+
+
+#### Excluding a permission
+
+> **Note**: Excluding a **required permission** from a module in your app can break the functionality corresponding to that permission. Always make sure to include all permissions a module is dependent on.
+
+When your Expo project doesn't benefit from having particular permission included, you can omit it. For example, if your application doesn't need access to the precise location, you can exclude the `ACCESS_FINE_LOCATION` permission.
+
+Another example can be stated using [available location accuracies](#accuracy). Android defines the approximate location accuracy estimation within about 3 square kilometers, and the precise location accuracy estimation within about 50 meters. For example, if the location accuracy value is [Low](#low), you can exclude `ACCESS_FINE_LOCATION` permission. To learn more about levels of location accuracies, see [Android documentation](https://developer.android.com/training/location/permissions#accuracy).
+
+To learn more on how to exclude permission, see [Excluding Android permissions](/guides/permissions/#excluding-android-permissions).
+
+### iOS
+
+The following usage description keys are used by this library:
+
+
diff --git a/docs/pages/versions/v49.0.0/sdk/lottie.mdx b/docs/pages/versions/v49.0.0/sdk/lottie.mdx
new file mode 100644
index 0000000000000..4fb13cf619e25
--- /dev/null
+++ b/docs/pages/versions/v49.0.0/sdk/lottie.mdx
@@ -0,0 +1,92 @@
+---
+title: Lottie
+sourceCodeUrl: 'https://github.com/lottie-react-native/lottie-react-native'
+packageName: 'lottie-react-native'
+---
+
+import { APIInstallSection } from '~/components/plugins/InstallSection';
+import PlatformsSection from '~/components/plugins/PlatformsSection';
+import { SnackInline } from '~/ui/components/Snippet';
+
+> **info** This library is listed in the Expo SDK reference because it is included in [Expo Go](/get-started/expo-go/). You may use any library of your choice with [development builds](/develop/development-builds/introduction/).
+
+[Lottie](https://airbnb.design/lottie/) renders After Effects animations in real time, allowing apps to use animations as easily as they use static images.
+
+
+
+## Installation
+
+
+
+## Usage
+
+
+
+```js
+import React, { useRef, useEffect } from 'react';
+import { Button, StyleSheet, View } from 'react-native';
+import LottieView from 'lottie-react-native';
+
+export default function App() {
+ const animation = useRef(null);
+ useEffect(() => {
+ // You can control the ref programmatically, rather than using autoPlay
+ // animation.current?.play();
+ }, []);
+
+ return (
+
+
+
+ {
+ animation.current?.reset();
+ animation.current?.play();
+ }}
+ />
+
+
+ );
+}
+
+const styles = StyleSheet.create({
+ animationContainer: {
+ backgroundColor: '#fff',
+ alignItems: 'center',
+ justifyContent: 'center',
+ flex: 1,
+ },
+ buttonContainer: {
+ paddingTop: 20,
+ },
+});
+```
+
+
+
+## API
+
+```javascript
+import LottieView from 'lottie-react-native';
+```
+
+Refer to the [lottie-react-native repository](https://github.com/lottie-react-native/lottie-react-native#usage) for more detailed documentation.
diff --git a/docs/pages/versions/v49.0.0/sdk/magnetometer.mdx b/docs/pages/versions/v49.0.0/sdk/magnetometer.mdx
new file mode 100644
index 0000000000000..e3cba5bb594c2
--- /dev/null
+++ b/docs/pages/versions/v49.0.0/sdk/magnetometer.mdx
@@ -0,0 +1,121 @@
+---
+title: Magnetometer
+sourceCodeUrl: 'https://github.com/expo/expo/tree/sdk-49/packages/expo-sensors'
+packageName: 'expo-sensors'
+iconUrl: '/static/images/packages/expo-sensors.png'
+---
+
+import APISection from '~/components/plugins/APISection';
+import { APIInstallSection } from '~/components/plugins/InstallSection';
+import PlatformsSection from '~/components/plugins/PlatformsSection';
+import { SnackInline} from '~/ui/components/Snippet';
+
+`Magnetometer` from **`expo-sensors`** provides access to the device magnetometer sensor(s) to respond to and measure the changes in the magnetic field measured in microtesla (`μT`).
+
+You can access the calibrated values with `Magnetometer` and uncalibrated raw values with `MagnetometerUncalibrated`.
+
+
+
+## Installation
+
+
+
+## Usage
+
+
+
+```jsx
+import React, { useState, useEffect } from 'react';
+import { StyleSheet, Text, TouchableOpacity, View } from 'react-native';
+import { Magnetometer } from 'expo-sensors';
+
+export default function Compass() {
+ const [{ x, y, z }, setData] = useState({
+ x: 0,
+ y: 0,
+ z: 0,
+ });
+ const [subscription, setSubscription] = useState(null);
+
+ const _slow = () => Magnetometer.setUpdateInterval(1000);
+ const _fast = () => Magnetometer.setUpdateInterval(16);
+
+ const _subscribe = () => {
+ setSubscription(
+ Magnetometer.addListener(result => {
+ setData(result);
+ })
+ );
+ };
+
+ const _unsubscribe = () => {
+ subscription && subscription.remove();
+ setSubscription(null);
+ };
+
+ useEffect(() => {
+ _subscribe();
+ return () => _unsubscribe();
+ }, []);
+
+ return (
+
+ Magnetometer:
+ x: {x}
+ y: {y}
+ z: {z}
+
+
+ {subscription ? 'On' : 'Off'}
+
+
+ Slow
+
+
+ Fast
+
+
+
+ );
+}
+
+/* @hide const styles = StyleSheet.create({ ... }); */
+const styles = StyleSheet.create({
+ container: {
+ flex: 1,
+ justifyContent: 'center',
+ paddingHorizontal: 10,
+ },
+ text: {
+ textAlign: 'center',
+ },
+ buttonContainer: {
+ flexDirection: 'row',
+ alignItems: 'stretch',
+ marginTop: 15,
+ },
+ button: {
+ flex: 1,
+ justifyContent: 'center',
+ alignItems: 'center',
+ backgroundColor: '#eee',
+ padding: 10,
+ },
+ middleButton: {
+ borderLeftWidth: 1,
+ borderRightWidth: 1,
+ borderColor: '#ccc',
+ },
+});
+/* @end */
+```
+
+
+
+## API
+
+```js
+import { Magnetometer, MagnetometerUncalibrated } from 'expo-sensors';
+```
+
+
\ No newline at end of file
diff --git a/docs/pages/versions/v49.0.0/sdk/mail-composer.mdx b/docs/pages/versions/v49.0.0/sdk/mail-composer.mdx
new file mode 100644
index 0000000000000..18825dbc593c3
--- /dev/null
+++ b/docs/pages/versions/v49.0.0/sdk/mail-composer.mdx
@@ -0,0 +1,29 @@
+---
+title: MailComposer
+sourceCodeUrl: 'https://github.com/expo/expo/tree/sdk-49/packages/expo-mail-composer'
+packageName: 'expo-mail-composer'
+iconUrl: '/static/images/packages/expo-mail-composer.png'
+---
+
+import APISection from '~/components/plugins/APISection';
+import { APIInstallSection } from '~/components/plugins/InstallSection';
+import PlatformsSection from '~/components/plugins/PlatformsSection';
+import Video from '~/components/plugins/Video';
+
+**`expo-mail-composer`** allows you to compose and send emails quickly and easily using the OS UI. This module can't be used on iOS Simulators since you can't sign into a mail account on them.
+
+
+
+
+
+## Installation
+
+
+
+## API
+
+```js
+import * as MailComposer from 'expo-mail-composer';
+```
+
+
diff --git a/docs/pages/versions/v49.0.0/sdk/map-view.mdx b/docs/pages/versions/v49.0.0/sdk/map-view.mdx
new file mode 100644
index 0000000000000..b43a202288174
--- /dev/null
+++ b/docs/pages/versions/v49.0.0/sdk/map-view.mdx
@@ -0,0 +1,171 @@
+---
+title: MapView
+sourceCodeUrl: 'https://github.com/react-native-maps/react-native-maps'
+packageName: 'react-native-maps'
+---
+
+import { APIInstallSection } from '~/components/plugins/InstallSection';
+import PlatformsSection from '~/components/plugins/PlatformsSection';
+import { SnackInline } from '~/ui/components/Snippet';
+import { Step } from '~/ui/components/Step';
+import { Tabs, Tab } from '~/ui/components/Tabs';
+
+> **info** This library is listed in the Expo SDK reference because it is included in [Expo Go](/get-started/expo-go/). You may use any library of your choice with [development builds](/develop/development-builds/introduction/).
+
+`react-native-maps` provides a Map component that uses Google Maps on Android and Apple Maps or Google Maps on iOS.
+
+No additional setup is required when testing your project using Expo Go. However, **to deploy the app binary on app stores** additional steps are required for Google Maps. For more information, see the [instructions below](#deploy-app-with-google-maps).
+
+
+
+## Installation
+
+
+
+## Usage
+
+See full documentation at [react-native-maps/react-native-maps](https://github.com/react-native-maps/react-native-maps).
+
+
+
+```jsx
+import React from 'react';
+import MapView from 'react-native-maps';
+import { StyleSheet, View } from 'react-native';
+
+export default function App() {
+ return (
+
+
+
+ );
+}
+
+const styles = StyleSheet.create({
+ container: {
+ flex: 1,
+ },
+ map: {
+ width: '100%',
+ height: '100%',
+ },
+});
+```
+
+
+
+## Deploy app with Google Maps
+
+### Android
+
+> If you've already registered a project for another Google service on Android, such as Google Sign In, you enable the **Maps SDK for Android** on your project and jump to step 4.
+
+
+#### Register a Google Cloud API project and enable the Maps SDK for Android
+
+- Open your browser to the [Google API Manager](https://console.developers.google.com/apis) and create a project.
+- Once it's created, go to the project and enable the **Maps SDK for Android**.
+
+
+
+
+#### Copy your app's SHA-1 certificate fingerprint
+
+
+
+
+- **If you are deploying your app to the Google Play Store**, you'll need to [upload your app binary to Google Play console](/submit/android/) at least once. This is required for Google to generate your app signing credentials.
+- Go to the **[Google Play Console](https://play.google.com/console) > (your app) > Release > Setup > App integrity > App Signing**.
+- Copy the value of **SHA-1 certificate fingerprint**.
+
+
+
+
+
+- If you have already created a [development build](/develop/development-builds/introduction/), your project will be signed using a debug keystore.
+- After the build is complete, go to your [project's dashboard](https://expo.dev/accounts/[username]/projects/[project-name]), then, under **Configure** > click **Credentials**.
+- Under **Application Identifiers**, click your project's package name and under **Android Keystore** copy the value of **SHA-1 Certificate Fingerprint**.
+
+
+
+
+
+
+
+
+#### Create an API key
+
+- Go to [Google Cloud Credential manager](https://console.cloud.google.com/apis/credentials) and click **Create Credentials**, then **API Key**.
+- In the modal, click **Edit API key**.
+- Under **Key restrictions** > **Application restrictions**, choose **Android apps**.
+- Under **Restrict usage to your Android apps**, click **Add an item**.
+- Add your `android.package` from **app.json** (for example: `com.company.myapp`) to the package name field.
+- Then, add the **SHA-1 certificate fingerprint's** value from step 2.
+- Click **Done** and then click **Save**.
+
+
+
+
+#### Add the API key to your project
+
+- Copy your **API Key** into your **app.json** under the `android.config.googleMaps.apiKey` field.
+- In your code, import `{ PROVIDER_GOOGLE }` from `react-native-maps` and add the property `provider=PROVIDER_GOOGLE` to your ``. This property works on both Android and iOS.
+- Rebuild the app binary (or re-submit to the Google Play Store in case your app is already uploaded). An easy way to test if the configuration was successful is to do an [emulator build](/develop/development-builds/create-a-build/#create-a-development-build-for-emulatorsimulator).
+
+
+
+### iOS
+
+> If you've already registered a project for another Google service on iOS, such as Google Sign In, you enable the **Maps SDK for iOS** on your project and jump to step 3.
+
+
+#### Register a Google Cloud API project and enable the Maps SDK for iOS
+
+- Open your browser to the [Google API Manager](https://console.developers.google.com/apis) and create a project.
+- Then, go to the project, click **Enable APIs and Services** and enable the **Maps SDK for iOS**.
+
+
+
+
+#### Create an API key
+
+- Go to [Google Cloud Credential manager](https://console.cloud.google.com/apis/credentials) and click **Create Credentials**, then **API Key**.
+- In the modal, click **Edit API key**.
+- Under **Key restrictions** > **Application restrictions**, choose **iOS apps**.
+- Under **Accept requests from an iOS application with one of these bundle identifiers**, click the **Add an item** button.
+- Add your `ios.bundleIdentifier` from **app.json** (for example: `com.company.myapp`) to the bundle ID field.
+- Click **Done** and then click **Save**.
+
+
+
+
+#### Add the API key to your project
+
+- Copy your API key into **app.json** under the `ios.config.googleMapsApiKey` field.
+- In your code, import `{ PROVIDER_GOOGLE }` from `react-native-maps` and add the property `provider=PROVIDER_GOOGLE` to your ``. This property works on both Android and iOS.
+- Rebuild the app binary. An easy way to test if the configuration was successful is to do a [simulator build](/develop/development-builds/create-a-build/#create-a-development-build-for-emulatorsimulator).
+
+
+
+## Configuration for web
+
+> **warning** Web support is experimental. We do not recommend using this library on the web yet.
+
+To use this on the web, add the following script to your **web/index.html**. This script may already be present. If this is the case, replace the `API_KEY` with your Google Maps API key, which you can obtain here: [Google Maps: Get API key](https://developers.google.com/maps/documentation/javascript/get-api-key).
+
+```html web/index.html
+
+
+
+
+
+
+
+
+
+
+```
diff --git a/docs/pages/versions/v49.0.0/sdk/masked-view.mdx b/docs/pages/versions/v49.0.0/sdk/masked-view.mdx
new file mode 100644
index 0000000000000..f857429547c50
--- /dev/null
+++ b/docs/pages/versions/v49.0.0/sdk/masked-view.mdx
@@ -0,0 +1,24 @@
+---
+title: MaskedView
+sourceCodeUrl: 'https://github.com/react-native-masked-view/masked-view'
+packageName: '@react-native-masked-view/masked-view'
+---
+
+import { APIInstallSection } from '~/components/plugins/InstallSection';
+import PlatformsSection from '~/components/plugins/PlatformsSection';
+
+**`@react-native-masked-view/masked-view`** provides a masked view which only displays the pixels that overlap with the view rendered in its mask element.
+
+> **warning** You can only have one of either `@react-native-community/masked-view` (deprecated) or `@react-native-masked-view/masked-view` installed in your project at any given time. React Navigation v6 and above requires `@react-native-masked-view/masked-view`, so you should use that package instead if you are using the latest version of React Navigation.
+
+> **warning** Android support for this library is experimental and you may encounter inconsistencies in behavior across platforms. Please report issues you encounter to [react-native-masked-view/masked-view/issues](https://github.com/react-native-masked-view/masked-view).
+
+
+
+## Installation
+
+
+
+## Usage
+
+See full documentation at [react-native-masked-view/masked-view](https://github.com/react-native-masked-view/masked-view).
diff --git a/docs/pages/versions/v49.0.0/sdk/media-library.mdx b/docs/pages/versions/v49.0.0/sdk/media-library.mdx
new file mode 100644
index 0000000000000..04eae259c6e78
--- /dev/null
+++ b/docs/pages/versions/v49.0.0/sdk/media-library.mdx
@@ -0,0 +1,107 @@
+---
+title: MediaLibrary
+sourceCodeUrl: 'https://github.com/expo/expo/tree/sdk-49/packages/expo-media-library'
+packageName: 'expo-media-library'
+iconUrl: '/static/images/packages/expo-media-library.png'
+---
+
+import {
+ ConfigReactNative,
+ ConfigPluginExample,
+ ConfigPluginProperties,
+} from '~/components/plugins/ConfigSection';
+import { AndroidPermissions, IOSPermissions } from '~/components/plugins/permissions';
+import APISection from '~/components/plugins/APISection';
+import { APIInstallSection } from '~/components/plugins/InstallSection';
+import PlatformsSection from '~/components/plugins/PlatformsSection';
+
+`expo-media-library` provides access to the user's media library, allowing them to access their existing images and videos from your app, as well as save new ones. You can also subscribe to any updates made to the user's media library.
+
+> **warning** If your Android app created an album using SDK <= 40 and you want to add more assets to this album, you may need to migrate it to the new scoped directory. Otherwise, your app won't have access to the old album directory and `expo-media-library` won't be able to add new assets to it. However, all other functions will work without problems. You only need to migrate the old album if you want to add something to it. For more information, check out [Android R changes](https://expo.fyi/android-r) and [`MediaLibrary.migrateAlbumIfNeededAsync`](#medialibrarymigratealbumifneededasyncalbum).
+
+
+
+## Installation
+
+
+
+## Configuration in app.json/app.config.js
+
+You can configure `expo-media-library` using its built-in [config plugin](/config-plugins/introduction/) if you use config plugins in your project ([EAS Build](/build/introduction) or `npx expo run:[android|ios]`). The plugin allows you to configure various properties that cannot be set at runtime and require building a new app binary to take effect.
+
+
+
+Learn how to configure the native projects in the [installation instructions in the `expo-media-library` repository](https://github.com/expo/expo/tree/main/packages/expo-media-library#installation-in-bare-react-native-projects).
+
+
+
+
+
+```json
+{
+ "expo": {
+ "plugins": [
+ [
+ "expo-media-library",
+ {
+ "photosPermission": "Allow $(PRODUCT_NAME) to access your photos.",
+ "savePhotosPermission": "Allow $(PRODUCT_NAME) to save photos.",
+ "isAccessMediaLocationEnabled": true
+ }
+ ]
+ ]
+ }
+}
+```
+
+
+
+
+
+## API
+
+```js
+import * as MediaLibrary from 'expo-media-library';
+```
+
+
+
+## Permissions
+
+### Android
+
+The following permissions are added automatically through this library's `AndroidManifest.xml`.
+
+
+
+### iOS
+
+The following usage description keys are used by this library:
+
+
diff --git a/docs/pages/versions/v49.0.0/sdk/navigation-bar.mdx b/docs/pages/versions/v49.0.0/sdk/navigation-bar.mdx
new file mode 100644
index 0000000000000..637892eab9ddc
--- /dev/null
+++ b/docs/pages/versions/v49.0.0/sdk/navigation-bar.mdx
@@ -0,0 +1,29 @@
+---
+title: NavigationBar
+sourceCodeUrl: 'https://github.com/expo/expo/tree/sdk-49/packages/expo-navigation-bar'
+packageName: 'expo-navigation-bar'
+---
+
+import APISection from '~/components/plugins/APISection';
+import { APIInstallSection } from '~/components/plugins/InstallSection';
+import PlatformsSection from '~/components/plugins/PlatformsSection';
+
+**`expo-navigation-bar`** enables you to modify and observe the native navigation bar on Android devices. Due to some Android platform restrictions, parts of this API overlap with the `expo-status-bar` API.
+
+Properties are named after style properties; visibility, position, backgroundColor, borderColor, etc.
+
+The APIs in this package have no impact when "Gesture Navigation" is enabled on the Android device. There is currently no native Android API to detect if "Gesture Navigation" is enabled or not.
+
+
+
+## Installation
+
+
+
+## API
+
+```js
+import * as NavigationBar from 'expo-navigation-bar';
+```
+
+
diff --git a/docs/pages/versions/v49.0.0/sdk/netinfo.mdx b/docs/pages/versions/v49.0.0/sdk/netinfo.mdx
new file mode 100644
index 0000000000000..d41b44710a679
--- /dev/null
+++ b/docs/pages/versions/v49.0.0/sdk/netinfo.mdx
@@ -0,0 +1,70 @@
+---
+title: NetInfo
+sourceCodeUrl: 'https://github.com/react-native-community/react-native-netinfo'
+packageName: '@react-native-community/netinfo'
+---
+
+import { APIInstallSection } from '~/components/plugins/InstallSection';
+import PlatformsSection from '~/components/plugins/PlatformsSection';
+
+`@react-native-community/netinfo` allows you to get information about connection type and connection quality.
+
+
+
+## Installation
+
+
+
+## API
+
+To import this library, use:
+
+```js
+import NetInfo from '@react-native-community/netinfo';
+```
+
+If you want to grab information about the network connection just once, you can use:
+
+```js
+NetInfo.fetch().then(state => {
+ console.log('Connection type', state.type);
+ console.log('Is connected?', state.isConnected);
+});
+```
+
+Or, if you'd rather subscribe to updates about the network state (which then allows you to run code/perform actions anytime the network state changes) use:
+
+```js
+const unsubscribe = NetInfo.addEventListener(state => {
+ console.log('Connection type', state.type);
+ console.log('Is connected?', state.isConnected);
+});
+
+// To unsubscribe to these update, just use:
+unsubscribe();
+```
+
+## Accessing the SSID
+
+In order to access the `ssid` property (available under `state.details.ssid`), there are few additional configuration steps:
+
+#### Android & iOS
+
+- Request location permissions with [`Location.requestPermissionsAsync()`](location.mdx#locationrequestpermissionsasync)
+
+#### iOS only
+
+- Add the `com.apple.developer.networking.wifi-info` entitlement to your **app.json** under `ios.entitlements`:
+
+```json
+ "ios": {
+ "entitlements": {
+ "com.apple.developer.networking.wifi-info": true
+ }
+ }
+```
+
+- Check the **Access Wi-Fi Information** box in your app's App Identifier, [which can be found here](https://developer.apple.com/account/resources/identifiers/list)
+- Rebuild your app with [`eas build --platform ios`](/build/setup/#4-run-a-build) or [`npx expo run:ios`](/more/expo-cli/#compiling)
+
+For more information on API and usage, see [react-native-netinfo documentation](https://github.com/react-native-community/react-native-netinfo#react-native-communitynetinfo).
diff --git a/docs/pages/versions/v49.0.0/sdk/network.mdx b/docs/pages/versions/v49.0.0/sdk/network.mdx
new file mode 100644
index 0000000000000..bceb7afe1c42d
--- /dev/null
+++ b/docs/pages/versions/v49.0.0/sdk/network.mdx
@@ -0,0 +1,40 @@
+---
+title: Network
+sourceCodeUrl: 'https://github.com/expo/expo/tree/sdk-49/packages/expo-network'
+packageName: 'expo-network'
+iconUrl: '/static/images/packages/expo-network.png'
+---
+
+import APISection from '~/components/plugins/APISection';
+import { APIInstallSection } from '~/components/plugins/InstallSection';
+import PlatformsSection from '~/components/plugins/PlatformsSection';
+
+**`expo-network`** provides useful information about the device's network such as its IP address, MAC address, and airplane mode status.
+
+
+
+## Installation
+
+
+
+## Configuration
+
+On Android, this module requires permissions to access the network and Wi-Fi state. The permissions `ACCESS_NETWORK_STATE` and `ACCESS_WIFI_STATE` are added automatically.
+
+## API
+
+```js
+import * as Network from 'expo-network';
+```
+
+
+
+## Error Codes
+
+| Code | Description |
+| --------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
+| ERR_NETWORK_IP_ADDRESS | On Android, there may be an unknown Wi-Fi host when trying to access `WifiManager` in `getIpAddressAsync`. On iOS, no network interfaces could be retrieved. |
+| ERR_NETWORK_UNDEFINED_INTERFACE | An undefined `interfaceName` was passed as an argument in `getMacAddressAsync`. |
+| ERR_NETWORK_SOCKET_EXCEPTION | An error was encountered in creating or accessing the socket in `getMacAddressAsync`. |
+| ERR_NETWORK_INVALID_PERMISSION_INTERNET | There are invalid permissions for [`android.permission.ACCESS_WIFI_STATE`](https://developer.android.com/reference/android/Manifest.permission#ACCESS_WIFI_STATE) in `getMacAddressAsync`. |
+| ERR_NETWORK_NO_ACCESS_NETWORKINFO | Unable to access network information |
diff --git a/docs/pages/versions/v49.0.0/sdk/notifications.mdx b/docs/pages/versions/v49.0.0/sdk/notifications.mdx
new file mode 100644
index 0000000000000..09a4a4b4ce5c1
--- /dev/null
+++ b/docs/pages/versions/v49.0.0/sdk/notifications.mdx
@@ -0,0 +1,563 @@
+---
+title: Notifications
+sourceCodeUrl: 'https://github.com/expo/expo/tree/sdk-49/packages/expo-notifications'
+packageName: 'expo-notifications'
+iconUrl: '/static/images/packages/expo-notifications.png'
+---
+
+import { ConfigReactNative, ConfigPluginProperties } from '~/components/plugins/ConfigSection';
+import { AndroidPermissions } from '~/components/plugins/permissions';
+import { SnackInline } from '~/ui/components/Snippet';
+import ImageSpotlight from '~/components/plugins/ImageSpotlight';
+import { APIInstallSection } from '~/components/plugins/InstallSection';
+import PlatformsSection from '~/components/plugins/PlatformsSection';
+import { Collapsible } from '~/ui/components/Collapsible';
+import APISection from '~/components/plugins/APISection';
+import { PlatformTags } from '~/ui/components/Tag';
+
+`expo-notifications` provides an API to fetch push notification tokens and to present, schedule, receive and respond to notifications.
+
+> Migrating from Expo's `LegacyNotifications` module? See [the migration guide](https://expo.fyi/legacy-notifications-to-expo-notifications).
+
+
+
+
+
+## Features
+
+- Schedule a one-off notification for a specific date or some time from now
+- Schedule a notification repeating in some time interval (or a calendar date match on iOS)
+- Get and set the application badge icon number
+- Fetch a native device push token so you can send push notifications with FCM and APNs
+- Fetch an Expo push token so you can send push notifications with Expo
+- Listen to incoming notifications in the foreground and background
+- Listen to interactions with notifications
+- Handle notifications when the app is in the foreground
+- Imperatively dismiss notifications from Notification Center/tray
+- Create, update, and delete Android notification channels
+- Set custom icon and color for notifications on Android
+
+## Installation
+
+
+
+## Usage
+
+Check out the example Snack below to see Notifications in action, make sure to use a physical device to test it. Push notifications don't work on emulators/simulators.
+
+
+
+```jsx
+import { useState, useEffect, useRef } from 'react';
+import { Text, View, Button, Platform } from 'react-native';
+import * as Device from 'expo-device';
+import * as Notifications from 'expo-notifications';
+
+Notifications.setNotificationHandler({
+ handleNotification: async () => ({
+ shouldShowAlert: true,
+ shouldPlaySound: false,
+ shouldSetBadge: false,
+ }),
+});
+
+export default function App() {
+ const [expoPushToken, setExpoPushToken] = useState('');
+ const [notification, setNotification] = useState(false);
+ const notificationListener = useRef();
+ const responseListener = useRef();
+
+ useEffect(() => {
+ registerForPushNotificationsAsync().then(token => setExpoPushToken(token));
+
+ notificationListener.current = Notifications.addNotificationReceivedListener(notification => {
+ setNotification(notification);
+ });
+
+ responseListener.current = Notifications.addNotificationResponseReceivedListener(response => {
+ console.log(response);
+ });
+
+ return () => {
+ Notifications.removeNotificationSubscription(notificationListener.current);
+ Notifications.removeNotificationSubscription(responseListener.current);
+ };
+ }, []);
+
+ return (
+
+ Your expo push token: {expoPushToken}
+
+ Title: {notification && notification.request.content.title}
+ Body: {notification && notification.request.content.body}
+ Data: {notification && JSON.stringify(notification.request.content.data)}
+
+ {
+ await schedulePushNotification();
+ }}
+ />
+
+ );
+}
+
+async function schedulePushNotification() {
+ await Notifications.scheduleNotificationAsync({
+ content: {
+ title: "You've got mail! 📬",
+ body: 'Here is the notification body',
+ data: { data: 'goes here' },
+ },
+ trigger: { seconds: 2 },
+ });
+}
+
+async function registerForPushNotificationsAsync() {
+ let token;
+
+ if (Platform.OS === 'android') {
+ await Notifications.setNotificationChannelAsync('default', {
+ name: 'default',
+ importance: Notifications.AndroidImportance.MAX,
+ vibrationPattern: [0, 250, 250, 250],
+ lightColor: '#FF231F7C',
+ });
+ }
+
+ if (Device.isDevice) {
+ const { status: existingStatus } = await Notifications.getPermissionsAsync();
+ let finalStatus = existingStatus;
+ if (existingStatus !== 'granted') {
+ const { status } = await Notifications.requestPermissionsAsync();
+ finalStatus = status;
+ }
+ if (finalStatus !== 'granted') {
+ alert('Failed to get push token for push notification!');
+ return;
+ }
+ token = (await Notifications.getExpoPushTokenAsync()).data;
+ console.log(token);
+ } else {
+ alert('Must use physical device for Push Notifications');
+ }
+
+ return token;
+}
+```
+
+
+
+### Present the notification to the user
+
+```ts
+import * as Notifications from 'expo-notifications';
+
+// First, set the handler that will cause the notification
+// to show the alert
+
+Notifications.setNotificationHandler({
+ handleNotification: async () => ({
+ shouldShowAlert: true,
+ shouldPlaySound: false,
+ shouldSetBadge: false,
+ }),
+});
+
+// Second, call the method
+
+Notifications.scheduleNotificationAsync({
+ content: {
+ title: 'Look at that notification',
+ body: "I'm so proud of myself!",
+ },
+ trigger: null,
+});
+```
+
+### Handle push notifications with React Navigation
+
+If you'd like to deep link to a specific screen in your app when you receive a push notification, you can configure React Navigation's [linking](https://reactnavigation.org/docs/navigation-container#linking) prop to do that:
+
+```tsx
+import React from 'react';
+import { Linking } from 'react-native';
+import * as Notifications from 'expo-notifications';
+import { NavigationContainer } from '@react-navigation/native';
+
+export default function App() {
+ return (
+ listener(url);
+
+ // Listen to incoming links from deep linking
+ const eventListenerSubscription = Linking.addEventListener('url', onReceiveURL);
+
+ // Listen to expo push notifications
+ const subscription = Notifications.addNotificationResponseReceivedListener(response => {
+ const url = response.notification.request.content.data.url;
+
+ // Any custom logic to see whether the URL needs to be handled
+ //...
+
+ // Let React Navigation handle the URL
+ listener(url);
+ });
+
+ return () => {
+ // Clean up the event listeners
+ eventListenerSubscription.remove();
+ subscription.remove();
+ };
+ },
+ }}>
+ {/* Your app content */}
+
+ );
+}
+```
+
+See more details on [React Navigation documentation](https://reactnavigation.org/docs/deep-linking/#third-party-integrations).
+
+## Configuration
+
+### Credentials
+
+#### Android
+
+Firebase Cloud Messaging credentials are required for all Android apps to receive push notifications in your app (except when testing in Expo Go). For more information, see how to get [FCM credentials](/push-notifications/push-notifications-setup/#android) for your app.
+
+#### iOS
+
+To register your iOS device and automatically enable push notifications for your EAS Build, see [push notification setup](/push-notifications/push-notifications-setup/#ios).
+
+### App config
+
+To configure `expo-notifications`, use the built-in [config plugin](/config-plugins/introduction/) in the app config (**app.json** or **app.config.js**) for [EAS Build](/build/introduction) or with `npx expo run:[android|ios]`. The plugin allows you to configure the following properties that cannot be set at runtime and require building a new app binary to take effect:
+
+
+
+Here is an example of using the config plugin in the app config file:
+
+```json app.json
+{
+ "expo": {
+ "plugins": [
+ [
+ "expo-notifications",
+ {
+ "icon": "./local/assets/notification-icon.png",
+ "color": "#ffffff",
+ "sounds": [
+ "./local/assets/notification-sound.wav",
+ "./local/assets/notification-sound-other.wav"
+ ]
+ }
+ ]
+ ]
+ }
+}
+```
+
+
+
+Learn how to configure the native projects in the [installation instructions in the `expo-notifications` repository](https://github.com/expo/expo/tree/main/packages/expo-notifications#installation-in-bare-react-native-projects).
+
+
+
+> The iOS APNs entitlement is _always_ set to 'development'. Xcode automatically changes this to 'production' during the archive.
+> [Learn more](https://stackoverflow.com/a/42293632/4047926).
+
+## Permissions
+
+### Android
+
+- On Android, this module requires permission to subscribe to the device boot. It's used to setup scheduled notifications when the device (re)starts.
+ The `RECEIVE_BOOT_COMPLETED` permission is added automatically through the library **AndroidManifest.xml**.
+
+- Starting from Android 12 (API level 31), to schedule the notification that triggers at the exact time, you need to add
+ ` ` to **AndroidManifest.xml**.
+ You can read more about the [exact alarm permission](https://developer.android.com/about/versions/12/behavior-changes-12#exact-alarm-permission).
+
+- On Android 13, app users must opt-in to receive notifications via a permissions prompt automatically triggered by the operating system.
+ This prompt will not appear until at least one notification channel is created. The `setNotificationChannelAsync` must be called before
+ `getDevicePushTokenAsync` or `getExpoPushTokenAsync` to obtain a push token. You can read more about the new notification permission behavior for Android 13
+ in the [official documentation](https://developer.android.com/develop/ui/views/notifications/notification-permission#new-apps).
+
+
+
+### iOS
+
+No usage description is required, see [notification-related permissions](#fetching-information-about-notifications-related-permissions).
+
+## Notification events listeners
+
+Notification events include incoming notifications, interactions your users perform with notifications (this can be tapping on a notification,
+or interacting with it via [notification categories](#managing-notification-categories-interactive-notifications)), and rare occasions when your notifications may be dropped.
+
+A few different listeners are exposed, so we've provided a chart below which will hopefully help you understand when you can expect each one to be triggered:
+
+| User interacted with notification? | App state | Listener(s) triggered |
+| :--------------------------------- | :--------: | ----------------------------------------------------------------------- |
+| false | Foreground | `NotificationReceivedListener` |
+| false | Background | `BackgroundNotificationTask` |
+| false | Killed | none |
+| true | Foreground | `NotificationReceivedListener` & `NotificationResponseReceivedListener` |
+| true | Background | `NotificationResponseReceivedListener` |
+| true | Killed | `NotificationResponseReceivedListener` |
+
+In the table above, whenever `NotificationResponseReceivedListener` is triggered, the same would apply to the `useLastNotificationResponse` hook.
+
+### Background events
+
+> **warning** Background event listeners are not supported in Expo Go.
+
+To handle notifications while the app is backgrounded on iOS, you _must_ add `remote-notification` to the `ios.infoPlist.UIBackgroundModes` key in your **app.json**,
+and add `"content-available": 1` to your push notification payload. Under normal circumstances, the "content-available" flag should launch your app if it isn't running
+and wasn't killed by the user, however, this is ultimately decided by the OS, so it might not always happen.
+
+## Additional information
+
+### Set custom notification sounds
+
+Custom notification sounds are only supported when using [EAS Build](/build/introduction).
+
+To add custom push notification sounds to your app, add the `expo-notifications` plugin to your **app.json** file and then under the `sounds` key, provide an array of local paths to sound files that can be used as custom notification sounds. These local paths are local to your project.
+
+```json app.json
+{
+ "expo": {
+ "plugins": [
+ [
+ "expo-notifications",
+ {
+ "sounds": ["local/path/to/mySoundFile.wav"]
+ }
+ ]
+ ]
+ }
+}
+```
+
+After building your app, the array of files will be available for use in both [`NotificationContentInput`](#notificationcontentinput) and [`NotificationChannelInput`](#notificationchannelinput).
+You only need to provide the base filename. Here's an example using the config above:
+
+```js
+await Notifications.setNotificationChannelAsync('new-emails', {
+ name: 'E-mail notifications',
+ sound: 'mySoundFile.wav', // Provide ONLY the base filename
+});
+
+await Notifications.scheduleNotificationAsync({
+ content: {
+ title: "You've got mail! 📬",
+ sound: 'mySoundFile.wav', // Provide ONLY the base filename
+ },
+ trigger: {
+ seconds: 2,
+ channelId: 'new-emails',
+ },
+});
+```
+
+You can also manually add notification files to your Android and iOS projects if you prefer:
+
+
+
+On Androids 8.0+, playing a custom sound for a notification requires more than setting the `sound` property on the `NotificationContentInput`.
+You will also need to configure the `NotificationChannel` with the appropriate `sound`, and use it when sending/scheduling the notification.
+
+For the example below to work, you would place your `email-sound.wav` file in `android/app/src/main/res/raw/`.
+
+```ts
+// Prepare the notification channel
+await Notifications.setNotificationChannelAsync('new-emails', {
+ name: 'E-mail notifications',
+ importance: Notifications.AndroidImportance.HIGH,
+ sound: 'email-sound.wav', // <- for Android 8.0+, see channelId property below
+});
+
+// Eg. schedule the notification
+await Notifications.scheduleNotificationAsync({
+ content: {
+ title: "You've got mail! 📬",
+ body: 'Open the notification to read them all',
+ sound: 'email-sound.wav', // <- for Android below 8.0
+ },
+ trigger: {
+ seconds: 2,
+ channelId: 'new-emails', // <- for Android 8.0+, see definition above
+ },
+});
+```
+
+
+
+
+
+On iOS, all that's needed is to place your sound file in your Xcode project (see the screenshot below),
+and then specify the sound file in your `NotificationContentInput`, like this:
+
+```ts
+await Notifications.scheduleNotificationAsync({
+ content: {
+ title: "You've got mail! 📬",
+ body: 'Open the notification to read them all',
+ sound: 'notification.wav',
+ },
+ trigger: {
+ // ...
+ },
+});
+```
+
+
+
+
+
+### Android push notification payload specification
+
+When sending a push notification, put an object conforming to the following type as `data` of the notification:
+
+```ts
+export interface FirebaseData {
+ title?: string;
+ message?: string;
+ subtitle?: string;
+ sound?: boolean | string;
+ vibrate?: boolean | number[];
+ priority?: AndroidNotificationPriority;
+ badge?: number;
+}
+```
+
+### Interpret the iOS permissions response
+
+On iOS, permissions for sending notifications are a little more granular than they are on Android.
+Because of this, you should rely on the `NotificationPermissionsStatus`'s `ios.status` field, instead of the root `status` field.
+This value will be one of the following, accessible under `Notifications.IosAuthorizationStatus`:
+
+- `NOT_DETERMINED`: The user hasn't yet made a choice about whether the app is allowed to schedule notifications
+- `DENIED`: The app isn't authorized to schedule or receive notifications
+- `AUTHORIZED`: The app is authorized to schedule or receive notifications
+- `PROVISIONAL`: The application is provisionally authorized to post noninterruptive user notifications
+- `EPHEMERAL`: The app is authorized to schedule or receive notifications for a limited amount of time
+
+### Manage notification categories (interactive notifications)
+
+Notification categories allow you to create interactive push notifications, so that a user can respond directly to the incoming notification
+either via buttons or a text response. A category defines the set of actions a user can take, and then those actions are applied to a notification
+by specifying the `categoryIdentifier` in the [`NotificationContent`](#notificationcontent).
+
+
+
+On iOS, notification categories also allow you to customize your notifications further. With each category, not only can you set interactive actions a user can take, but you can also configure things like the placeholder text to display when the user disables notification previews for your app.
+
+> Notification categories are not supported on the web and all related methods will result in noop.
+
+## Platform specific guides
+
+### Handling notification channels
+
+Starting in Android 8.0 (API level 26), all notifications must be assigned to a channel. For each channel,
+you can set the visual and auditory behavior that is applied to all notifications in that channel.
+Then, users can change these settings and decide which notification channels from your app should be intrusive or visible at all,
+as [Android developer docs](https://developer.android.com/training/notify-user/channels) states.
+
+If you do not specify a notification channel, `expo-notifications` will create a fallback channel for you, named **Miscellaneous**.
+We encourage you to always ensure appropriate channels with informative names are set up for the application and to always send notifications to these channels.
+
+> Calling these methods is a no-op for platforms that do not support this feature (Android below version 8.0 (26), iOS and web).
+
+### Custom notification icon and colors
+
+You can configure the [`notification.icon`](../config/app.mdx#notification) and [`notification.color`](../config/app.mdx#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](#expo-config).
+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.
+
+You can also set a custom notification color **per-notification** directly in your [`NotificationContentInput`](#notificationcontentinput) under the `color` attribute.
+
+## API
+
+```js
+import * as Notifications from 'expo-notifications';
+```
+
+
diff --git a/docs/pages/versions/v49.0.0/sdk/pedometer.mdx b/docs/pages/versions/v49.0.0/sdk/pedometer.mdx
new file mode 100644
index 0000000000000..58d6a617fbe1f
--- /dev/null
+++ b/docs/pages/versions/v49.0.0/sdk/pedometer.mdx
@@ -0,0 +1,93 @@
+---
+title: Pedometer
+sourceCodeUrl: 'https://github.com/expo/expo/tree/sdk-49/packages/expo-sensors'
+packageName: 'expo-sensors'
+iconUrl: '/static/images/packages/expo-sensors.png'
+---
+
+import APISection from '~/components/plugins/APISection';
+import { APIInstallSection } from '~/components/plugins/InstallSection';
+import PlatformsSection from '~/components/plugins/PlatformsSection';
+import { SnackInline } from '~/ui/components/Snippet';
+
+`Pedometer` from `expo-sensors` uses the system `hardware.Sensor` on Android and Core Motion on iOS to get the user's step count, and also allows you to subscribe to pedometer updates.
+
+
+
+## Installation
+
+
+
+## Usage
+
+
+
+```jsx
+import { useState, useEffect } from 'react';
+import { StyleSheet, Text, View } from 'react-native';
+import { Pedometer } from 'expo-sensors';
+
+export default function App() {
+ const [isPedometerAvailable, setIsPedometerAvailable] = useState('checking');
+ const [pastStepCount, setPastStepCount] = useState(0);
+ const [currentStepCount, setCurrentStepCount] = useState(0);
+
+ const subscribe = async () => {
+ const isAvailable = await Pedometer.isAvailableAsync();
+ setIsPedometerAvailable(String(isAvailable));
+
+ if (isAvailable) {
+ const end = new Date();
+ const start = new Date();
+ start.setDate(end.getDate() - 1);
+
+ const pastStepCountResult = await Pedometer.getStepCountAsync(start, end);
+ if (pastStepCountResult) {
+ setPastStepCount(pastStepCountResult.steps);
+ }
+
+ return Pedometer.watchStepCount(result => {
+ setCurrentStepCount(result.steps);
+ });
+ }
+ };
+
+ useEffect(() => {
+ const subscription = subscribe();
+ return () => subscription && subscription.remove();
+ }, []);
+
+ return (
+
+ Pedometer.isAvailableAsync(): {isPedometerAvailable}
+ Steps taken in the last 24 hours: {pastStepCount}
+ Walk! And watch this go up: {currentStepCount}
+
+ );
+}
+
+/* @hide const styles = StyleSheet.create({ ... }); */
+const styles = StyleSheet.create({
+ container: {
+ flex: 1,
+ marginTop: 15,
+ alignItems: 'center',
+ justifyContent: 'center',
+ },
+});
+/* @end */
+```
+
+
+
+## API
+
+```js
+import { Pedometer } from 'expo-sensors';
+```
+
+
+
+## Standalone applications
+
+You'll need to [configure an Android OAuth client](https://developers.google.com/fit/android/get-api-key) for your app on the Google Play console for it to work as a standalone application on the Android platform.
diff --git a/docs/pages/versions/v49.0.0/sdk/picker.mdx b/docs/pages/versions/v49.0.0/sdk/picker.mdx
new file mode 100644
index 0000000000000..3e5e50cbace69
--- /dev/null
+++ b/docs/pages/versions/v49.0.0/sdk/picker.mdx
@@ -0,0 +1,25 @@
+---
+title: Picker
+sourceCodeUrl: 'https://github.com/react-native-picker/picker'
+packageName: '@react-native-picker/picker'
+---
+
+import { APIInstallSection } from '~/components/plugins/InstallSection';
+import PlatformsSection from '~/components/plugins/PlatformsSection';
+import Video from '~/components/plugins/Video';
+
+{/* todo: add video */}
+
+> **info** This library is listed in the Expo SDK reference because it is included in [Expo Go](/get-started/expo-go/). You may use any library of your choice with [development builds](/develop/development-builds/introduction/).
+
+A component that provides access to the system UI for picking between several options.
+
+
+
+## Installation
+
+
+
+## Usage
+
+See full documentation at [react-native-picker/picker](https://github.com/react-native-picker/picker).
diff --git a/docs/pages/versions/v49.0.0/sdk/print.mdx b/docs/pages/versions/v49.0.0/sdk/print.mdx
new file mode 100644
index 0000000000000..98376ceacf9cf
--- /dev/null
+++ b/docs/pages/versions/v49.0.0/sdk/print.mdx
@@ -0,0 +1,174 @@
+---
+title: Print
+sourceCodeUrl: 'https://github.com/expo/expo/tree/sdk-49/packages/expo-print'
+packageName: 'expo-print'
+---
+
+import APISection from '~/components/plugins/APISection';
+import { APIInstallSection } from '~/components/plugins/InstallSection';
+import PlatformsSection from '~/components/plugins/PlatformsSection';
+import { SnackInline } from '~/ui/components/Snippet';
+
+`expo-print` provides an API for Android and iOS (AirPrint) printing functionality.
+
+
+
+## Installation
+
+
+
+## Usage
+
+
+
+```jsx
+import * as React from 'react';
+import { View, StyleSheet, Button, Platform, Text } from 'react-native';
+import * as Print from 'expo-print';
+import { shareAsync } from 'expo-sharing';
+
+const html = `
+
+
+
+
+
+
+ Hello Expo!
+
+
+
+
+`;
+
+export default function App() {
+ const [selectedPrinter, setSelectedPrinter] = React.useState();
+
+ const print = async () => {
+ // On iOS/android prints the given html. On web prints the HTML from the current page.
+ /* @info */ await Print.printAsync({
+ html,
+ printerUrl: selectedPrinter?.url, // iOS only
+ }); /* @end */
+ };
+
+ const printToFile = async () => {
+ // On iOS/android prints the given html. On web prints the HTML from the current page.
+ /* @info */ const { uri } = await Print.printToFileAsync({ html }); /* @end */
+ console.log('File has been saved to:', uri);
+ await shareAsync(uri, { UTI: '.pdf', mimeType: 'application/pdf' });
+ };
+
+ const selectPrinter = async () => {
+ /* @info */ const printer = await Print.selectPrinterAsync(); // iOS only
+ /* @end */
+ setSelectedPrinter(printer);
+ };
+
+ return (
+
+
+
+
+ {Platform.OS === 'ios' && (
+ <>
+
+
+
+ {selectedPrinter ? (
+ {`Selected printer: ${selectedPrinter.name}`}
+ ) : undefined}
+ >
+ )}
+
+ );
+}
+
+/* @hide const styles = StyleSheet.create({ ... }); */
+const styles = StyleSheet.create({
+ container: {
+ flex: 1,
+ justifyContent: 'center',
+ backgroundColor: '#ecf0f1',
+ flexDirection: 'column',
+ padding: 8,
+ },
+ spacer: {
+ height: 8,
+ },
+ printer: {
+ textAlign: 'center',
+ },
+});
+/* @end */
+```
+
+
+
+## API
+
+```js
+import * as Print from 'expo-print';
+```
+
+
+
+## Local images
+
+On iOS, printing from HTML source doesn't support local asset URLs (due to WKWebView limitations). Instead, images need to be converted to base64 and inlined into the HTML.
+
+```js
+import { Asset } from 'expo-asset';
+import { printAsync } from 'expo-print';
+import { manipulateAsync } from 'expo-image-manipulator';
+
+async function generateHTML() {
+ const asset = Asset.fromModule(require('../../assets/logo.png'));
+ const image = await manipulateAsync(asset.localUri ?? asset.uri, [], { base64: true });
+ return `
+
+
+
+ `;
+}
+
+async function print() {
+ const html = await generateHTML();
+ await printAsync({ html });
+}
+```
+
+## Page margins
+
+**On iOS** you can set the page margins using the `margins` option:
+
+```js
+const { uri } = await Print.printToFileAsync({
+ html: 'This page is printed with margins',
+ margins: {
+ left: 20,
+ top: 50,
+ right: 20,
+ bottom: 100,
+ },
+});
+```
+
+If `useMarkupFormatter` is set to `true`, setting margins may cause a blank page to appear at the end of your printout. To prevent this, make sure your HTML string is a well-formed document, including `` at the beginning of the string.
+
+**On Android**, if you're using `html` option in `printAsync` or `printToFileAsync`, the resulting print might contain page margins (it depends on the WebView engine).
+They are set by `@page` style block and you can override them in your HTML code:
+
+```html
+
+```
+
+See [@page docs on MDN](https://developer.mozilla.org/en-US/docs/Web/CSS/@page) for more details.
diff --git a/docs/pages/versions/v49.0.0/sdk/random.mdx b/docs/pages/versions/v49.0.0/sdk/random.mdx
new file mode 100644
index 0000000000000..a2b0827eb5595
--- /dev/null
+++ b/docs/pages/versions/v49.0.0/sdk/random.mdx
@@ -0,0 +1,27 @@
+---
+title: Random
+sourceCodeUrl: 'https://github.com/expo/expo/tree/sdk-49/packages/expo-random'
+packageName: 'expo-random'
+---
+
+import APISection from '~/components/plugins/APISection';
+import { APIInstallSection } from '~/components/plugins/InstallSection';
+import PlatformsSection from '~/components/plugins/PlatformsSection';
+
+> **warning** **Deprecated:** This module will no longer be available in SDK 49. Use [expo-crypto](crypto.mdx) instead.
+
+`expo-random` provides a native interface for creating strong random bytes. With `Random` you can create values equivalent to Node.js core `crypto.randomBytes` API. `expo-random` also works with `expo-standard-web-crypto`, which implements the W3C Crypto API for generating random bytes.
+
+
+
+## Installation
+
+
+
+## API
+
+```js
+import * as Random from 'expo-random';
+```
+
+
diff --git a/docs/pages/versions/v49.0.0/sdk/reanimated.mdx b/docs/pages/versions/v49.0.0/sdk/reanimated.mdx
new file mode 100644
index 0000000000000..2706a8f231a07
--- /dev/null
+++ b/docs/pages/versions/v49.0.0/sdk/reanimated.mdx
@@ -0,0 +1,100 @@
+---
+title: Reanimated
+sourceCodeUrl: 'https://github.com/software-mansion/react-native-reanimated'
+packageName: 'react-native-reanimated'
+---
+
+import { APIInstallSection } from '~/components/plugins/InstallSection';
+import PlatformsSection from '~/components/plugins/PlatformsSection';
+
+> **info** This library is listed in the Expo SDK reference because it is included in [Expo Go](/get-started/expo-go/). You may use any library of your choice with [development builds](/develop/development-builds/introduction/).
+
+`react-native-reanimated` provides an API that greatly simplifies the process of creating smooth, powerful, and maintainable animations.
+
+> **Reanimated uses React Native APIs that are incompatible with "Remote JS Debugging" for JavaScriptCore**. In order to use a debugger with your app with `react-native-reanimated`, you'll need to use the [Hermes JavaScript engine](/guides/using-hermes) and the [JavaScript Inspector for Hermes](/guides/using-hermes#javascript-inspector-for-hermes).
+
+
+
+## Installation
+
+
+
+After the installation completes, you must also add the Babel plugin to **babel.config.js**:
+
+```js babel.config.js
+module.exports = function (api) {
+ api.cache(true);
+ return {
+ presets: ['babel-preset-expo'],
+ plugins: ['react-native-reanimated/plugin'],
+ };
+};
+```
+
+After you add the Babel plugin, restart your development server and clear the bundler cache: `npx expo start --clear`.
+
+> If you load other Babel plugins, the Reanimated plugin has to be the last item in the plugins array.
+
+### Web support
+
+**For web,** you'll have to install the [`@babel/plugin-proposal-export-namespace-from`](https://babeljs.io/docs/en/babel-plugin-proposal-export-namespace-from#installation) Babel plugin and update the **babel.config.js** to load it:
+
+{/* prettier-ignore */}
+```js babel.config.js
+plugins: [
+ '@babel/plugin-proposal-export-namespace-from',
+ 'react-native-reanimated/plugin',
+],
+```
+
+After you add the Babel plugin, restart your development server and clear the bundler cache: `npx expo start --clear`.
+
+## Usage
+
+You should refer to the [react-native-reanimated docs](https://docs.swmansion.com/react-native-reanimated/docs/) for more information on the API and its usage. But the following example (courtesy of that repo) is a quick way to get started.
+
+```js
+import Animated, {
+ useSharedValue,
+ withTiming,
+ useAnimatedStyle,
+ Easing,
+} from 'react-native-reanimated';
+import { View, Button } from 'react-native';
+import React from 'react';
+
+export default function AnimatedStyleUpdateExample(props) {
+ const randomWidth = useSharedValue(10);
+
+ const config = {
+ duration: 500,
+ easing: Easing.bezier(0.5, 0.01, 0, 1),
+ };
+
+ const style = useAnimatedStyle(() => {
+ return {
+ width: withTiming(randomWidth.value, config),
+ };
+ });
+
+ return (
+
+
+ {
+ randomWidth.value = Math.random() * 350;
+ }}
+ />
+
+ );
+}
+```
diff --git a/docs/pages/versions/v49.0.0/sdk/register-root-component.mdx b/docs/pages/versions/v49.0.0/sdk/register-root-component.mdx
new file mode 100644
index 0000000000000..211874ae1d21f
--- /dev/null
+++ b/docs/pages/versions/v49.0.0/sdk/register-root-component.mdx
@@ -0,0 +1,103 @@
+---
+title: registerRootComponent
+sourceCodeUrl: 'https://github.com/expo/expo/tree/sdk-49/packages/expo/src/launch'
+packageName: 'expo'
+---
+
+import { APIInstallSection } from '~/components/plugins/InstallSection';
+import PlatformsSection from '~/components/plugins/PlatformsSection';
+
+Sets the initial React component to render natively in the app's root React Native view on iOS, Android, and the web. It also adds dev-only debugging tools for use with `npx expo start`.
+
+
+
+## Installation
+
+
+
+### Manual Android setup
+
+> This is only required if your app does **not** use [Expo Prebuild](/workflow/prebuild) to continuously generate the **android** directory.
+
+Update the **android/app/src/main/your-package/MainActivity.java** file to use the name `main` in the `getMainComponentName` function.
+
+```diff
+ @Override
+ protected String getMainComponentName() {
++ return "main";
+ }
+```
+
+### Manual iOS setup
+
+> This is only required if your app does **not** use [Expo Prebuild](/workflow/prebuild) to continuously generate the **ios** directory.
+
+Update the iOS **ios/your-name/AppDelegate.(m|mm|swift)** file to use the **moduleName** `main` in the `createRootViewWithBridge:bridge moduleName:@"main" initialProperties:initProps` line of the `application:didFinishLaunchingWithOptions:` function.
+
+## API
+
+```ts
+import { registerRootComponent } from 'expo';
+```
+
+### `registerRootComponent(component)`
+
+Sets the initial React component to render natively in your app's root React Native view (`RCTView`).
+
+This function does the following:
+
+- Invokes React Native's [AppRegistry.registerComponent](https://reactnative.dev/docs/appregistry.html)
+- Invokes React Native web's `AppRegistry.runApplication` on web to render to the root `index.html` file.
+- Polyfills the [`process.nextTick`](https://nodejs.org/en/docs/guides/event-loop-timers-and-nexttick/#process-nexttick) function globally.
+- Adds support for using the `fontFamily` React Native style with the `expo-font` package.
+
+This function also adds the following dev-only features that are **removed** in production bundles.
+
+- Adds the Fast Refresh and bundle splitting indicator to the app.
+- Asserts if the `expo-updates` package is misconfigured.
+- Asserts if `react-native` is not aliased to `react-native-web` when running in the browser.
+ {/* TODO: Remove this after https://github.com/expo/expo/pull/18596 */}
+- Polyfills `console.log` to send logs to the dev server via `/logs`
+
+#### Arguments
+
+- **component (ReactComponent)** -- The React component class that renders the rest of your app.
+
+#### Returns
+
+No return value.
+
+## Common questions
+
+### What if I want to name my main app file something other than App.js?
+
+{/* NOTE: This is only accurate if we land https://github.com/expo/expo/pull/18381 */}
+
+You can set the `"main"` in **package.json** to any file within your
+project. If you do this, then you need to use `registerRootComponent`;
+`export default` will not make this component the root for the app
+if you are using a custom entry file.
+
+For example, let's say you want to make `"src/main.js"` the entry file
+for your app -- maybe you don't like having JavaScript files in the
+project root. First, set this in **package.json**:
+
+```json
+{
+ "main": "src/main.js"
+}
+```
+
+Then in `"src/main.js"`, make sure you call `registerRootComponent` and
+pass in the component you want to render at the root of the app.
+
+```tsx
+import { registerRootComponent } from 'expo';
+import { View } from 'react-native';
+
+function App() {
+ return ;
+}
+
+registerRootComponent(App);
+```
diff --git a/docs/pages/versions/v49.0.0/sdk/safe-area-context.mdx b/docs/pages/versions/v49.0.0/sdk/safe-area-context.mdx
new file mode 100644
index 0000000000000..6c1992acf9611
--- /dev/null
+++ b/docs/pages/versions/v49.0.0/sdk/safe-area-context.mdx
@@ -0,0 +1,166 @@
+---
+title: SafeAreaContext
+sourceCodeUrl: 'https://github.com/th3rdwave/react-native-safe-area-context'
+packageName: 'react-native-safe-area-context'
+---
+
+import { APIInstallSection } from '~/components/plugins/InstallSection';
+import PlatformsSection from '~/components/plugins/PlatformsSection';
+
+> **info** This library is listed in the Expo SDK reference because it is included in [Expo Go](/get-started/expo-go/). You may use any library of your choice with [development builds](/develop/development-builds/introduction/).
+
+**`react-native-safe-area-context`** provides a flexible API for accessing device safe area inset information. This allows you to position your content appropriately around notches, status bars, home indicators, and other such device and operating system interface elements. It also provides a `SafeAreaView` component that you can use in place of `View` to automatically inset your views to account for safe areas.
+
+
+
+## Installation
+
+
+
+## API
+
+```js
+import {
+ SafeAreaView,
+ SafeAreaProvider,
+ SafeAreaInsetsContext,
+ useSafeAreaInsets,
+ initialWindowMetrics,
+} from 'react-native-safe-area-context';
+```
+
+`SafeAreaView` is a regular `View` component with the safe area edges applied as padding.
+
+If you set your own padding on the view, it will be added to the padding from the safe area.
+
+**If you are targeting web, you must set up `SafeAreaProvider` as described in the hooks section**. You do not need to for native platforms.
+
+```js
+import { SafeAreaView } from 'react-native-safe-area-context';
+
+function SomeComponent() {
+ return (
+
+
+
+ );
+}
+```
+
+### Props
+
+All props are optional.
+
+#### `emulateUnlessSupported`
+
+`true` (default) or `false`
+
+On iOS 10, emulate the safe area using the status bar height and home indicator sizes.
+
+#### `edges`
+
+Array of `top`, `right`, `bottom`, and `left`. Defaults to all.
+
+Sets the edges to apply the safe area insets to.
+
+## Hooks
+
+Hooks give you direct access to the safe area insets. This is a more advanced use-case, and might perform worse than `SafeAreaView` when rotating the device.
+
+First, add `SafeAreaProvider` in your app root component. You may need to add it in other places too, including at the root of any modals any any routes when using `react-native-screen`.
+
+```js
+import { SafeAreaProvider } from 'react-native-safe-area-context';
+
+function App() {
+ return ... ;
+}
+```
+
+You use the `useSafeAreaInsets` hook to get the insets in the form of `{ top: number, right: number, bottom: number: number, left: number }`.
+
+```js
+import { useSafeAreaInsets } from 'react-native-safe-area-context';
+
+function HookComponent() {
+ const insets = useSafeAreaInsets();
+
+ return ;
+}
+```
+
+Usage with consumer api:
+
+```js
+import { SafeAreaInsetsContext } from 'react-native-safe-area-context';
+
+class ClassComponent extends React.Component {
+ render() {
+ return (
+
+ {insets => }
+
+ );
+ }
+}
+```
+
+## Optimization
+
+If you can, use `SafeAreaView`. It's implemented natively so when rotating the device, there is no delay from the asynchronous bridge.
+
+To speed up the initial render, you can import `initialWindowMetrics` from this package and set as the `initialMetrics` prop on the provider as described in Web SSR. You cannot do this if your provider remounts, or you are using `react-native-navigation`.
+
+```js
+import { SafeAreaProvider, initialWindowMetrics } from 'react-native-safe-area-context';
+
+function App() {
+ return ... ;
+}
+```
+
+## Web SSR
+
+If you are doing server side rendering on the web, you can use `initialSafeAreaInsets` to inject values based on the device the user has, or simply pass zero. Otherwise, insets measurement will break rendering your page content since it is async.
+
+## Migrating from CSS
+
+#### Before
+
+In a web-only app, you would use CSS environment variables to get the size of the screen's safe area insets.
+
+**styles.css**
+
+```css
+div {
+ padding-top: env(safe-area-inset-top);
+ padding-left: env(safe-area-inset-left);
+ padding-bottom: env(safe-area-inset-bottom);
+ padding-right: env(safe-area-inset-right);
+}
+```
+
+#### After
+
+Universally, the hook `useSafeAreaInsets()` can provide access to this information.
+
+**App.js**
+
+```jsx
+import { useSafeAreaInsets } from 'react-native-safe-area-context';
+
+function App() {
+ const insets = useSafeAreaInsets();
+
+ return (
+
+ );
+}
+```
diff --git a/docs/pages/versions/v49.0.0/sdk/screen-capture.mdx b/docs/pages/versions/v49.0.0/sdk/screen-capture.mdx
new file mode 100644
index 0000000000000..2d8a9e3bcac72
--- /dev/null
+++ b/docs/pages/versions/v49.0.0/sdk/screen-capture.mdx
@@ -0,0 +1,111 @@
+---
+title: ScreenCapture
+sourceCodeUrl: 'https://github.com/expo/expo/tree/sdk-49/packages/expo-screen-capture'
+packageName: 'expo-screen-capture'
+---
+
+import APISection from '~/components/plugins/APISection';
+import { APIInstallSection } from '~/components/plugins/InstallSection';
+import PlatformsSection from '~/components/plugins/PlatformsSection';
+import { SnackInline } from '~/ui/components/Snippet';
+
+`expo-screen-capture` allows you to protect screens in your app from being captured or recorded, as well as be notified if a screenshot is taken while your app is foregrounded. The two most common reasons you may want to prevent screen capture are:
+
+- If a screen is displaying sensitive information (password, credit card data, and so on)
+- You are displaying paid content that you don't want to be recorded and shared
+
+This is especially important on Android since the [`android.media.projection`](https://developer.android.com/about/versions/android-5.0.html#ScreenCapture) API allows third-party apps to perform screen capture or screen sharing (even if the app is in the background).
+
+> **warning** Currently, taking screenshots on iOS cannot be prevented. This is due to underlying OS limitations.
+
+
+
+## Installation
+
+
+
+## Usage
+
+### Example: hook
+
+
+
+```js
+import { usePreventScreenCapture } from 'expo-screen-capture';
+import React from 'react';
+import { Text, View } from 'react-native';
+
+export default function ScreenCaptureExample() {
+ usePreventScreenCapture();
+
+ return (
+
+ As long as this component is mounted, this screen is unrecordable!
+
+ );
+}
+```
+
+
+
+### Example: functions
+
+
+
+```js
+import { useEffect } from 'react';
+import { Button, StyleSheet, View } from 'react-native';
+import * as ScreenCapture from 'expo-screen-capture';
+import * as MediaLibrary from 'expo-media-library';
+
+export default function ScreenCaptureExample() {
+ useEffect(() => {
+ if (hasPermissions()) {
+ const subscription = ScreenCapture.addScreenshotListener(() => {
+ alert('Thanks for screenshotting my beautiful app 😊');
+ });
+ return () => subscription.remove();
+ }
+ }, []);
+
+ const hasPermissions = async () => {
+ const { status } = await MediaLibrary.requestPermissionsAsync();
+ return status === 'granted';
+ };
+
+ const activate = async () => {
+ await ScreenCapture.preventScreenCaptureAsync();
+ };
+
+ const deactivate = async () => {
+ await ScreenCapture.allowScreenCaptureAsync();
+ };
+
+ return (
+
+
+
+
+ );
+}
+
+/* @hide const styles = StyleSheet.create({ ... }); */
+const styles = StyleSheet.create({
+ container: {
+ flex: 1,
+ alignItems: 'center',
+ justifyContent: 'center',
+ },
+});
+/* @end */
+```
+
+
+
+## API
+
+```js
+import * as ScreenCapture from 'expo-screen-capture';
+```
+
+
diff --git a/docs/pages/versions/v49.0.0/sdk/screen-orientation.mdx b/docs/pages/versions/v49.0.0/sdk/screen-orientation.mdx
new file mode 100644
index 0000000000000..8afb7237d0263
--- /dev/null
+++ b/docs/pages/versions/v49.0.0/sdk/screen-orientation.mdx
@@ -0,0 +1,90 @@
+---
+title: ScreenOrientation
+sourceCodeUrl: 'https://github.com/expo/expo/tree/sdk-49/packages/expo-screen-orientation'
+packageName: 'expo-screen-orientation'
+---
+
+import {
+ ConfigReactNative,
+ ConfigPluginExample,
+ ConfigPluginProperties,
+} from '~/components/plugins/ConfigSection';
+import { palette } from '@expo/styleguide';
+import APISection from '~/components/plugins/APISection';
+import ImageSpotlight from '~/components/plugins/ImageSpotlight';
+import { APIInstallSection } from '~/components/plugins/InstallSection';
+import PlatformsSection from '~/components/plugins/PlatformsSection';
+
+Screen Orientation is defined as the orientation in which graphics are painted on the device. For example, the figure below has a device in a vertical and horizontal physical orientation, but a portrait screen orientation. For physical device orientation, see the orientation section of [Device Motion](devicemotion.mdx).
+
+
+
+On both Android and iOS platforms, changes to the screen orientation will override any system settings or user preferences. On Android, it is possible to change the screen orientation while taking the user's preferred orientation into account. On iOS, user and system settings are not accessible by the application and any changes to the screen orientation will override existing settings.
+
+> Web support has [limited support](https://caniuse.com/#feat=deviceorientation). For improved resize detection on mobile Safari, check out the docs on using [Resize Observer in Expo web](/guides/customizing-webpack/#resizeobserver).
+
+
+
+## Installation
+
+
+
+### Warning
+
+Apple added support for _split view_ mode to iPads in iOS 9. This changed how the screen orientation is handled by the system. To put the matter shortly, for iOS, your iPad is always in landscape mode unless you open two applications side by side. To be able to lock screen orientation using this module you will need to disable support for this feature. For more information about the _split view_ mode, check out [the official Apple documentation](https://support.apple.com/en-us/HT207582).
+
+## Configuration in app.json/app.config.js
+
+You can configure `expo-screen-orientation` using its built-in [config plugin](/config-plugins/introduction/) if you use config plugins in your project ([EAS Build](/build/introduction) or `npx expo run:[android|ios]`). The plugin allows you to configure various properties that cannot be set at runtime and require building a new app binary to take effect.
+
+
+
+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. Tick the `Requires Full Screen` checkbox in Xcode. It should be located under `Project Target > General > Deployment Info`.
+
+
+
+
+
+```json app.json
+{
+ "expo": {
+ "ios": {
+ "requireFullScreen": true
+ },
+ "plugins": [
+ [
+ "expo-screen-orientation",
+ {
+ "initialOrientation": "DEFAULT"
+ }
+ ]
+ ]
+ }
+}
+```
+
+
+
+
+
+## API
+
+```js
+import * as ScreenOrientation from 'expo-screen-orientation';
+```
+
+
\ No newline at end of file
diff --git a/docs/pages/versions/v49.0.0/sdk/screens.mdx b/docs/pages/versions/v49.0.0/sdk/screens.mdx
new file mode 100644
index 0000000000000..33faa5a9fc589
--- /dev/null
+++ b/docs/pages/versions/v49.0.0/sdk/screens.mdx
@@ -0,0 +1,24 @@
+---
+title: Screens
+sourceCodeUrl: 'https://github.com/software-mansion/react-native-screens'
+packageName: 'react-native-screens'
+---
+
+import { APIInstallSection } from '~/components/plugins/InstallSection';
+import PlatformsSection from '~/components/plugins/PlatformsSection';
+
+**`react-native-screens`** provides native primitives to represent screens instead of plain `` components in order to better take advantage of operating system behavior and optimizations around screens. This capability is used by library authors and unlikely to be used directly by most app developers. It also provides the native components needed for React Navigation's [createNativeStackNavigator](https://reactnavigation.org/docs/native-stack-navigator).
+
+> Note: Please refer to [the issue tracker](https://github.com/software-mansion/react-native-screens/issues) if you encounter any problems.
+
+
+
+## Installation
+
+
+
+## API
+
+The complete API reference and documentation is available [in the README](https://github.com/software-mansion/react-native-screens).
+
+To use the native stack navigator, refer to the [createNativeStackNavigator documentation](https://reactnavigation.org/docs/native-stack-navigator).
diff --git a/docs/pages/versions/v49.0.0/sdk/securestore.mdx b/docs/pages/versions/v49.0.0/sdk/securestore.mdx
new file mode 100644
index 0000000000000..9c95fbb8f7101
--- /dev/null
+++ b/docs/pages/versions/v49.0.0/sdk/securestore.mdx
@@ -0,0 +1,157 @@
+---
+title: SecureStore
+sourceCodeUrl: 'https://github.com/expo/expo/tree/sdk-49/packages/expo-secure-store'
+packageName: 'expo-secure-store'
+iconUrl: '/static/images/packages/expo-secure-store.png'
+---
+
+import APISection from '~/components/plugins/APISection';
+import { APIInstallSection } from '~/components/plugins/InstallSection';
+import PlatformsSection from '~/components/plugins/PlatformsSection';
+import { SnackInline } from '~/ui/components/Snippet';
+
+`expo-secure-store` provides a way to encrypt and securely store key–value pairs locally on the device. Each Expo project has a separate storage system and has no access to the storage of other Expo projects.
+
+**Size limit for a value is 2048 bytes. An attempt to store larger values may fail. Currently, we print a warning when the limit is reached, however, in a future SDK version an error might be thrown.**
+
+
+
+> This API is not compatible with devices running Android 5 or lower.
+
+## Installation
+
+
+
+## Platform value storage
+
+### Android
+
+On Android, values are stored in [`SharedPreferences`](https://developer.android.com/training/data-storage/shared-preferences), encrypted with [Android's Keystore system](https://developer.android.com/training/articles/keystore.html).
+
+### iOS
+
+> For iOS standalone apps, data stored with `expo-secure-store` can persist across app installs.
+
+On iOS, values are stored using the [keychain services](https://developer.apple.com/documentation/security/keychain_services) as `kSecClassGenericPassword`. iOS has the additional option of being able to set the value's `kSecAttrAccessible` attribute, which controls when the value is available to be fetched.
+
+#### Exempting encryption prompt
+
+Apple App Store Connect prompts you to select the type of encryption algorithm your app implements. This is known as **Export Compliance Information**. It is asked when publishing the app or submitting for TestFlight.
+
+When using `expo-secure-store`, you can set the [`ios.config.usesNonExemptEncryption`](/versions/latest/config/app/#usesnonexemptencryption) property to `false` in the app config:
+
+{/* prettier-ignore */}
+```json app.json
+{
+ "expo": {
+ "ios": {
+ "config": {
+ "usesNonExemptEncryption": false
+ }
+ /* @hide ... */ /* @end */
+ }
+ }
+}
+```
+
+Setting this property automatically handles the compliance information prompt.
+
+## Usage
+
+
+
+```jsx
+import * as React from 'react';
+import { Text, View, StyleSheet, TextInput, Button } from 'react-native';
+import * as SecureStore from 'expo-secure-store';
+
+async function save(key, value) {
+ await SecureStore.setItemAsync(key, value);
+}
+
+async function getValueFor(key) {
+ let result = await SecureStore.getItemAsync(key);
+ if (result) {
+ alert("🔐 Here's your value 🔐 \n" + result);
+ } else {
+ alert('No values stored under that key.');
+ }
+}
+
+export default function App() {
+ const [key, onChangeKey] = React.useState('Your key here');
+ const [value, onChangeValue] = React.useState('Your value here');
+
+ return (
+
+ Save an item, and grab it later!
+ {/* @hide Add some TextInput components... */}
+
+ onChangeKey(text)}
+ value={key}
+ />
+ onChangeValue(text)}
+ value={value}
+ />
+ {/* @end */}
+ {
+ save(key, value);
+ onChangeKey('Your key here');
+ onChangeValue('Your value here');
+ }}
+ />
+ 🔐 Enter your key 🔐
+ {
+ getValueFor(event.nativeEvent.text);
+ }}
+ placeholder="Enter the key for the value you want to get"
+ />
+
+ );
+}
+
+/* @hide const styles = StyleSheet.create({ ... }); */
+const styles = StyleSheet.create({
+ container: {
+ flex: 1,
+ justifyContent: 'center',
+ paddingTop: 10,
+ backgroundColor: '#ecf0f1',
+ padding: 8,
+ },
+ paragraph: {
+ marginTop: 34,
+ margin: 24,
+ fontSize: 18,
+ fontWeight: 'bold',
+ textAlign: 'center',
+ },
+ textInput: {
+ height: 35,
+ borderColor: 'gray',
+ borderWidth: 0.5,
+ padding: 4,
+ },
+});
+/* @end */
+```
+
+
+
+## API
+
+```js
+import * as SecureStore from 'expo-secure-store';
+```
+
+
diff --git a/docs/pages/versions/v49.0.0/sdk/segmented-control.mdx b/docs/pages/versions/v49.0.0/sdk/segmented-control.mdx
new file mode 100644
index 0000000000000..7a24c0fa32f4e
--- /dev/null
+++ b/docs/pages/versions/v49.0.0/sdk/segmented-control.mdx
@@ -0,0 +1,20 @@
+---
+title: SegmentedControl
+sourceCodeUrl: 'https://github.com/react-native-community/segmented-control'
+packageName: '@react-native-segmented-control/segmented-control'
+---
+
+import { APIInstallSection } from '~/components/plugins/InstallSection';
+import PlatformsSection from '~/components/plugins/PlatformsSection';
+
+It's like a fancy radio button, or in Apple's words: "A horizontal control that consists of multiple segments, each segment functioning as a discrete button" ([source](https://developer.apple.com/documentation/uikit/uisegmentedcontrol)). This component renders to a [`UISegmentedControl`](https://developer.apple.com/documentation/uikit/uisegmentedcontrol) on iOS, and to faithful recreations of that control on Android and web (because no equivalent exists on those platforms' standard libraries).
+
+
+
+## Installation
+
+
+
+## Usage
+
+See full documentation at [react-native-community/segmented-control](https://github.com/react-native-community/segmented-control#usage).
diff --git a/docs/pages/versions/v49.0.0/sdk/sensors.mdx b/docs/pages/versions/v49.0.0/sdk/sensors.mdx
new file mode 100644
index 0000000000000..b8effaff3ff45
--- /dev/null
+++ b/docs/pages/versions/v49.0.0/sdk/sensors.mdx
@@ -0,0 +1,93 @@
+---
+title: Sensors
+sourceCodeUrl: 'https://github.com/expo/expo/tree/sdk-49/packages/expo-sensors'
+packageName: 'expo-sensors'
+iconUrl: '/static/images/packages/expo-sensors.png'
+---
+
+import { APIInstallSection } from '~/components/plugins/InstallSection';
+import PlatformsSection from '~/components/plugins/PlatformsSection';
+import { BoxLink } from '~/ui/components/BoxLink';
+import { AndroidPermissions, IOSPermissions } from '~/components/plugins/permissions';
+import { ConfigReactNative } from '~/components/plugins/ConfigSection';
+
+`expo-sensors` provides various APIs for accessing device sensors to measure motion, orientation, pressure, magnetic fields, ambient light, and step count.
+
+
+
+## Installation
+
+
+
+## API
+
+```js
+import * as Sensors from 'expo-sensors';
+// OR
+import {
+ Accelerometer,
+ Barometer,
+ DeviceMotion,
+ Gyroscope,
+ LightSensor,
+ Magnetometer,
+ MagnetometerUncalibrated,
+ Pedometer,
+} from 'expo-sensors';
+```
+
+## Permissions
+
+### Android
+
+Starting in Android 12 (API level 31), the system has a 200ms limit for each sensor updates.
+
+If you need an update interval of less than 200ms, you must add the following permissions to your **app.json** inside the [`expo.android.permissions`](/versions/latest/config/app/#permissions) array.
+
+
+
+
+
+Learn how to configure the native projects in the [installation instructions in the `expo-sensors` repository](https://github.com/expo/expo/tree/main/packages/expo-sensors#installation-in-bare-react-native-projects).
+
+
+
+## Available sensors
+
+For more information, please see the documentation for the sensor you are interested in:
+
+
+
+
+
+
+
+
diff --git a/docs/pages/versions/v49.0.0/sdk/sharing.mdx b/docs/pages/versions/v49.0.0/sdk/sharing.mdx
new file mode 100644
index 0000000000000..6729190213abf
--- /dev/null
+++ b/docs/pages/versions/v49.0.0/sdk/sharing.mdx
@@ -0,0 +1,38 @@
+---
+title: Sharing
+sourceCodeUrl: 'https://github.com/expo/expo/tree/sdk-49/packages/expo-sharing'
+packageName: 'expo-sharing'
+---
+
+import APISection from '~/components/plugins/APISection';
+import { APIInstallSection } from '~/components/plugins/InstallSection';
+import PlatformsSection from '~/components/plugins/PlatformsSection';
+import Video from '~/components/plugins/Video';
+
+**`expo-sharing`** allows you to share files directly with other compatible applications.
+
+
+
+
+
+#### Sharing limitations on web
+
+- `expo-sharing` for web is built on top of the Web Share API, which still has [very limited browser support](https://caniuse.com/#feat=web-share). Be sure to check that the API can be used before calling it by using `Sharing.isAvailableAsync()`.
+- **HTTPS required on web**: The Web Share API is only available on web when the page is served over https. Run your app with `npx expo start --https` to enable it.
+- **No local file sharing on web**: Sharing local files by URI works on iOS and Android, but not on web. You cannot share local files on web by URI — you will need to upload them somewhere and share that URI.
+
+#### 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).
+
+## Installation
+
+
+
+## API
+
+```js
+import * as Sharing from 'expo-sharing';
+```
+
+
diff --git a/docs/pages/versions/v49.0.0/sdk/skia.mdx b/docs/pages/versions/v49.0.0/sdk/skia.mdx
new file mode 100644
index 0000000000000..87dc5bf32a8ae
--- /dev/null
+++ b/docs/pages/versions/v49.0.0/sdk/skia.mdx
@@ -0,0 +1,24 @@
+---
+title: Skia
+sourceCodeUrl: 'https://github.com/shopify/react-native-skia'
+packageName: '@shopify/react-native-skia'
+---
+
+import { APIInstallSection } from '~/components/plugins/InstallSection';
+import PlatformsSection from '~/components/plugins/PlatformsSection';
+
+> **info** This library is listed in the Expo SDK reference because it is included in [Expo Go](/get-started/expo-go/). You may use any library of your choice with [development builds](/develop/development-builds/introduction/).
+
+**`@shopify/react-native-skia`** brings the Skia Graphics Library to React Native. Skia serves as the graphics engine for Google Chrome and Chrome OS, Android, Flutter, Mozilla Firefox and Firefox OS, and many other products.
+
+
+
+## Installation
+
+
+
+> **Additional setup required for web**: if you want to use Skia on web, you will need to follow [web installation instructions](https://shopify.github.io/react-native-skia/docs/getting-started/web/#expo) to load CanvasKit.
+
+## Usage
+
+See full documentation at [https://shopify.github.io/react-native-skia/](https://shopify.github.io/react-native-skia/).
diff --git a/docs/pages/versions/v49.0.0/sdk/slider.mdx b/docs/pages/versions/v49.0.0/sdk/slider.mdx
new file mode 100644
index 0000000000000..486bffbcf62e5
--- /dev/null
+++ b/docs/pages/versions/v49.0.0/sdk/slider.mdx
@@ -0,0 +1,25 @@
+---
+title: Slider
+sourceCodeUrl: 'https://github.com/callstack/react-native-slider'
+packageName: '@react-native-community/slider'
+---
+
+import { APIInstallSection } from '~/components/plugins/InstallSection';
+import PlatformsSection from '~/components/plugins/PlatformsSection';
+import Video from '~/components/plugins/Video';
+
+{/* todo: add video */}
+
+> **info** This library is listed in the Expo SDK reference because it is included in [Expo Go](/get-started/expo-go/). You may use any library of your choice with [development builds](/develop/development-builds/introduction/).
+
+A component that provides access to the system UI for a slider control, that allows users to pick among a range of values by dragging an anchor.
+
+
+
+## Installation
+
+
+
+## Usage
+
+See full documentation at [callstack/react-native-slider](https://github.com/callstack/react-native-slider).
diff --git a/docs/pages/versions/v49.0.0/sdk/sms.mdx b/docs/pages/versions/v49.0.0/sdk/sms.mdx
new file mode 100644
index 0000000000000..ee57a40f88170
--- /dev/null
+++ b/docs/pages/versions/v49.0.0/sdk/sms.mdx
@@ -0,0 +1,26 @@
+---
+title: SMS
+sourceCodeUrl: 'https://github.com/expo/expo/tree/sdk-49/packages/expo-sms'
+packageName: 'expo-sms'
+iconUrl: '/static/images/packages/expo-sms.png'
+---
+
+import APISection from '~/components/plugins/APISection';
+import { APIInstallSection } from '~/components/plugins/InstallSection';
+import PlatformsSection from '~/components/plugins/PlatformsSection';
+
+**`expo-sms`** provides access to the system's UI/app for sending SMS messages.
+
+
+
+## Installation
+
+
+
+## API
+
+```js
+import * as SMS from 'expo-sms';
+```
+
+
diff --git a/docs/pages/versions/v49.0.0/sdk/speech.mdx b/docs/pages/versions/v49.0.0/sdk/speech.mdx
new file mode 100644
index 0000000000000..2d8a98c99b48f
--- /dev/null
+++ b/docs/pages/versions/v49.0.0/sdk/speech.mdx
@@ -0,0 +1,62 @@
+---
+title: Speech
+sourceCodeUrl: 'https://github.com/expo/expo/tree/sdk-49/packages/expo-speech'
+packageName: 'expo-speech'
+---
+
+import APISection from '~/components/plugins/APISection';
+import { APIInstallSection } from '~/components/plugins/InstallSection';
+import PlatformsSection from '~/components/plugins/PlatformsSection';
+import { SnackInline} from '~/ui/components/Snippet';
+
+**`expo-speech`** provides an API that allows you to utilize Text-to-speech functionality in your app.
+
+
+
+## Installation
+
+
+
+## Usage
+
+
+
+```jsx
+import * as React from 'react';
+import { View, StyleSheet, Button } from 'react-native';
+import * as Speech from 'expo-speech';
+
+export default function App() {
+ const speak = () => {
+ const thingToSay = '1';
+ Speech.speak(thingToSay);
+ };
+
+ return (
+
+
+
+ );
+}
+
+/* @hide const styles = StyleSheet.create({ ... }); */
+const styles = StyleSheet.create({
+ container: {
+ flex: 1,
+ justifyContent: 'center',
+ backgroundColor: '#ecf0f1',
+ padding: 8,
+ },
+});
+/* @end */
+```
+
+
+
+## API
+
+```js
+import * as Speech from 'expo-speech';
+```
+
+
diff --git a/docs/pages/versions/v49.0.0/sdk/splash-screen.mdx b/docs/pages/versions/v49.0.0/sdk/splash-screen.mdx
new file mode 100644
index 0000000000000..879b9a3990167
--- /dev/null
+++ b/docs/pages/versions/v49.0.0/sdk/splash-screen.mdx
@@ -0,0 +1,108 @@
+---
+title: SplashScreen
+sourceCodeUrl: 'https://github.com/expo/expo/tree/sdk-49/packages/expo-splash-screen'
+packageName: 'expo-splash-screen'
+---
+
+import { ConfigReactNative } from '~/components/plugins/ConfigSection';
+import APISection from '~/components/plugins/APISection';
+import { APIInstallSection } from '~/components/plugins/InstallSection';
+import PlatformsSection from '~/components/plugins/PlatformsSection';
+
+The `SplashScreen` module from the `expo-splash-screen` library is used to tell the splash screen to remain visible until it has been explicitly told to hide. This is useful to do tasks that will happen behind the scenes such as making API calls, pre-loading fonts, animating the splash screen and so on.
+
+Also, see the guide on [creating a splash screen image](/develop/user-interface/splash-screen/), or [quickly generate an icon and splash screen using your browser](https://buildicon.netlify.app/).
+
+
+
+## Installation
+
+
+
+## Usage
+
+This example shows how to keep the splash screen visible while loading app resources and then hide the splash screen when the app has rendered some initial content.
+
+```js
+import React, { useCallback, useEffect, useState } from 'react';
+import { Text, View } from 'react-native';
+import Entypo from '@expo/vector-icons/Entypo';
+import * as SplashScreen from 'expo-splash-screen';
+import * as Font from 'expo-font';
+
+// Keep the splash screen visible while we fetch resources
+SplashScreen.preventAutoHideAsync();
+
+export default function App() {
+ const [appIsReady, setAppIsReady] = useState(false);
+
+ useEffect(() => {
+ async function prepare() {
+ try {
+ // Pre-load fonts, make any API calls you need to do here
+ await Font.loadAsync(Entypo.font);
+ // Artificially delay for two seconds to simulate a slow loading
+ // experience. Please remove this if you copy and paste the code!
+ await new Promise(resolve => setTimeout(resolve, 2000));
+ } catch (e) {
+ console.warn(e);
+ } finally {
+ // Tell the application to render
+ setAppIsReady(true);
+ }
+ }
+
+ prepare();
+ }, []);
+
+ const onLayoutRootView = useCallback(async () => {
+ if (appIsReady) {
+ // This tells the splash screen to hide immediately! If we call this after
+ // `setAppIsReady`, then we may see a blank screen while the app is
+ // loading its initial state and rendering its first pixels. So instead,
+ // we hide the splash screen once we know the root view has already
+ // performed layout.
+ await SplashScreen.hideAsync();
+ }
+ }, [appIsReady]);
+
+ if (!appIsReady) {
+ return null;
+ }
+
+ return (
+
+ SplashScreen Demo! 👋
+
+
+ );
+}
+```
+
+## Configuration
+
+To configure `expo-splash-screen`, see the following [app config](/workflow/configuration/) properties.
+
+- [`splash`](../config/app.mdx#splash)
+- [`android.splash`](../config/app.mdx#splash-2)
+- [`ios.splash`](../config/app.mdx#splash-1)
+
+
+
+See how to configure the native projects in the [installation instructions in the `expo-splash-screen` repository](https://github.com/expo/expo/tree/main/packages/expo-splash-screen#-installation-in-bare-react-native-projects).
+
+
+
+### Animating the splash screen
+
+See the [with-splash-screen](https://github.com/expo/examples/tree/master/with-splash-screen) example on how to apply any arbitrary animations to your splash screen, such as a fade out. You can initialize a new project from this example by running `npx create-react-native-app -t with-splash-screen`.
+
+## API
+
+```js
+import * as SplashScreen from 'expo-splash-screen';
+```
+
+
diff --git a/docs/pages/versions/v49.0.0/sdk/sqlite.mdx b/docs/pages/versions/v49.0.0/sdk/sqlite.mdx
new file mode 100644
index 0000000000000..32fd0aa7031ae
--- /dev/null
+++ b/docs/pages/versions/v49.0.0/sdk/sqlite.mdx
@@ -0,0 +1,95 @@
+---
+title: SQLite
+sourceCodeUrl: 'https://github.com/expo/expo/tree/sdk-49/packages/expo-sqlite'
+packageName: 'expo-sqlite'
+---
+
+import APISection from '~/components/plugins/APISection';
+import { APIInstallSection } from '~/components/plugins/InstallSection';
+import PlatformsSection from '~/components/plugins/PlatformsSection';
+import { Terminal } from '~/ui/components/Snippet';
+import { Step } from '~/ui/components/Step';
+import { BoxLink } from '~/ui/components/BoxLink';
+import { GithubIcon } from '@expo/styleguide-icons';
+
+`expo-sqlite` gives your app access to a database that can be queried through a [WebSQL](https://www.w3.org/TR/webdatabase/)-like API. The database is persisted across restarts of your app.
+
+
+
+## Installation
+
+
+
+## Usage
+
+
+
+### Importing an existing database
+
+To open a new SQLite database using an existing `.db` file you already have, follow the steps below:
+
+
+Install `expo-file-system` and `expo-asset` modules:
+
+
+
+
+
+
+Create a **metro.config.js** file at the root of your project with the following contents to include [extra asset extensions](/guides/customizing-metro/#adding-more-file-extensions-to--assetexts):
+
+```js
+const { getDefaultConfig } = require('expo/metro-config');
+
+const defaultConfig = getDefaultConfig(__dirname);
+
+defaultConfig.resolver.assetExts.push('db');
+
+module.exports = defaultConfig;
+```
+
+
+
+
+
+Use the following function (or similar) to open your database:
+
+```ts
+async function openDatabase(pathToDatabaseFile: string): Promise {
+ if (!(await FileSystem.getInfoAsync(FileSystem.documentDirectory + 'SQLite')).exists) {
+ await FileSystem.makeDirectoryAsync(FileSystem.documentDirectory + 'SQLite');
+ }
+ await FileSystem.downloadAsync(
+ Asset.fromModule(require(pathToDatabaseFile)).uri,
+ FileSystem.documentDirectory + 'SQLite/myDatabaseName.db'
+ );
+ return SQLite.openDatabase('myDatabaseName.db');
+}
+```
+
+
+
+### Executing statements outside of a transaction
+
+> You should use this kind of execution only when it is necessary. For instance, when code is a no-op within transactions. Example: `PRAGMA foreign_keys = ON;`.
+
+```js
+const db = SQLite.openDatabase('dbName', version);
+
+db.exec([{ sql: 'PRAGMA foreign_keys = ON;', args: [] }], false, () =>
+ console.log('Foreign keys turned on')
+);
+```
+
+## API
+
+```js
+import * as SQLite from 'expo-sqlite';
+```
+
+
diff --git a/docs/pages/versions/v49.0.0/sdk/status-bar.mdx b/docs/pages/versions/v49.0.0/sdk/status-bar.mdx
new file mode 100644
index 0000000000000..a042d33bcaa90
--- /dev/null
+++ b/docs/pages/versions/v49.0.0/sdk/status-bar.mdx
@@ -0,0 +1,58 @@
+---
+id: statusbar
+title: StatusBar
+sourceCodeUrl: 'https://github.com/expo/expo/tree/sdk-49/packages/expo-status-bar'
+packageName: 'expo-status-bar'
+---
+
+import APISection from '~/components/plugins/APISection';
+import { APIInstallSection } from '~/components/plugins/InstallSection';
+import PlatformsSection from '~/components/plugins/PlatformsSection';
+import { SnackInline} from '~/ui/components/Snippet';
+
+**`expo-status-bar`** gives you a component and imperative interface to control the app status bar to change its text color, background color, hide it, make it translucent or opaque, and apply animations to any of these changes. Exactly what you are able to do with the `StatusBar` component depends on the platform you're using.
+
+
+
+> **Web support**
+>
+> There is no API available on the web for controlling the operating system status bar, so `expo-status-bar` will noop, so it will do nothing, it will also **not** error.
+
+## Installation
+
+
+
+## Usage
+
+
+
+```js
+import React from 'react';
+import { Text, View } from 'react-native';
+import { StatusBar } from 'expo-status-bar';
+
+const App = () => (
+
+ Notice that the status bar has light text!
+
+
+);
+
+export default App;
+```
+
+
+
+## API
+
+```js
+import { StatusBar } from 'expo-status-bar';
+```
+
+
diff --git a/docs/pages/versions/v49.0.0/sdk/storereview.mdx b/docs/pages/versions/v49.0.0/sdk/storereview.mdx
new file mode 100644
index 0000000000000..2dce6afd7faa3
--- /dev/null
+++ b/docs/pages/versions/v49.0.0/sdk/storereview.mdx
@@ -0,0 +1,80 @@
+---
+title: StoreReview
+sourceCodeUrl: 'https://github.com/expo/expo/tree/sdk-49/packages/expo-store-review'
+packageName: 'expo-store-review'
+---
+
+import APISection from '~/components/plugins/APISection';
+import ImageSpotlight from '~/components/plugins/ImageSpotlight';
+import { APIInstallSection } from '~/components/plugins/InstallSection';
+import PlatformsSection from '~/components/plugins/PlatformsSection';
+
+**`expo-store-review`** provides access to the `SKStoreReviewController` API on iOS, and `ReviewManager` API in Android 5.0+ allowing you to ask the user to rate your app without ever having to leave the app itself.
+
+
+
+
+
+## Installation
+
+> `expo-linking` is a peer dependency and must be installed alongside `expo-store-review`.
+
+
+
+## Usage
+
+It is important that you follow the [Human Interface Guidelines](https://developer.apple.com/design/human-interface-guidelines/ratings-and-reviews) for iOS and [Guidelines](https://developer.android.com/guide/playcore/in-app-review#when-to-request) for Android when using this API.
+
+**Specifically:**
+
+- Don't call `StoreReview.requestReview()` from a button - instead try calling it after the user has finished some signature interaction in the app.
+- Don't spam the user.
+- Don't request a review when the user is doing something time sensitive like navigating.
+- Don't ask the user any questions before or while presenting the rating button or card.
+
+### Write Reviews
+
+#### iOS
+
+You can redirect someone to the "Write a Review" screen for an app in the iOS App Store by using the query parameter `action=write-review`. For example:
+
+```ts
+const itunesItemId = 982107779;
+// Open the iOS App Store in the browser -> redirects to App Store on iOS
+Linking.openURL(`https://apps.apple.com/app/apple-store/id${itunesItemId}?action=write-review`);
+// Open the iOS App Store directly
+Linking.openURL(
+ `itms-apps://itunes.apple.com/app/viewContentsUserReviews/id${itunesItemId}?action=write-review`
+);
+```
+
+#### Android
+
+There is no equivalent redirect on Android, you can still open the Play Store to the reviews sections using the query parameter `showAllReviews=true` like this:
+
+```ts
+const androidPackageName = 'host.exp.exponent';
+// Open the Android Play Store in the browser -> redirects to Play Store on Android
+Linking.openURL(
+ `https://play.google.com/store/apps/details?id=${androidPackageName}&showAllReviews=true`
+);
+// Open the Android Play Store directly
+Linking.openURL(`market://details?id=${androidPackageName}&showAllReviews=true`);
+```
+
+## API
+
+```js
+import * as StoreReview from 'expo-store-review';
+```
+
+
+
+## Error Codes
+
+### `ERR_STORE_REVIEW_FAILED`
+
+This error occurs when the store review request was not successful.
diff --git a/docs/pages/versions/v49.0.0/sdk/stripe.mdx b/docs/pages/versions/v49.0.0/sdk/stripe.mdx
new file mode 100644
index 0000000000000..3ec43403eb691
--- /dev/null
+++ b/docs/pages/versions/v49.0.0/sdk/stripe.mdx
@@ -0,0 +1,91 @@
+---
+title: Stripe
+sourceCodeUrl: 'https://github.com/stripe/stripe-react-native'
+packageName: '@stripe/stripe-react-native'
+---
+
+import { APIInstallSection } from '~/components/plugins/InstallSection';
+import PlatformsSection from '~/components/plugins/PlatformsSection';
+import { SnackInline } from '~/ui/components/Snippet';
+
+Expo includes support for [`@stripe/stripe-react-native`](https://github.com/stripe/stripe-react-native), which allows you to build delightful payment experiences in your native Android and iOS apps using React Native and Expo. This library provides powerful and customizable UI screens and elements that can be used out-of-the-box to collect your users' payment details.
+
+> Migrating from Expo's `expo-payments-stripe` module? [Learn more about how to transition to the new `@stripe/stripe-react-native` library](https://github.com/expo/fyi/blob/main/payments-migration-guide.md#how-to-migrate-from-expo-payments-stripe-to-the-new-stripestripe-react-native-library).
+
+
+
+## Installation
+
+Each Expo SDK version requires a specific `@stripe/stripe-react-native` version. See the [Stripe CHANGELOG](https://github.com/stripe/stripe-react-native/blob/master/CHANGELOG.md) for a mapping of versions. To automatically install the correct version for your Expo SDK version, run:
+
+
+
+### Config plugin setup (optional)
+
+If you're using EAS Build, you can do most of your Stripe setup using the `@stripe/stripe-react-native` [config plugin](/config-plugins/introduction/). To setup, just add the config plugin to the `plugins` array of your **app.json** or **app.config.js** as shown below, then rebuild the app.
+
+```json
+{
+ "expo": {
+ ...
+ "plugins": [
+ [
+ "@stripe/stripe-react-native",
+ {
+ "merchantIdentifier": string | string [],
+ "enableGooglePay": boolean
+ }
+ ]
+ ],
+ }
+}
+```
+
+- **merchantIdentifier**: iOS only. This is the Apple merchant ID obtained [here](https://stripe.com/docs/apple-pay?platform=react-native). Otherwise, Apple Pay will not work as expected. If you have multiple merchantIdentifiers, you can set them in an array.
+- **enableGooglePay**: Android only. Boolean indicating whether or not Google Pay is enabled. Defaults to `false`.
+
+## Example
+
+Trying out Stripe takes just a few seconds. Connect to [this Snack](https://snack.expo.dev/@charliecruzan/stripe-react-native-example?platform=mydevice) on your device.
+
+Under the hood, that example connects to [this Glitch server code](https://glitch.com/edit/#!/expo-stripe-server-example), so you'll need to open that page to spin up the server. Feel free to run your own Glitch server and copy that code!
+
+## Usage
+
+For usage information and detailed documentation, please refer to:
+
+- [Stripe's React Native SDK reference](https://stripe.dev/stripe-react-native/api-reference/index.html)
+- [Stripe's React Native GitHub repo](https://github.com/stripe/stripe-react-native)
+- [Stripe's example React Native app](https://github.com/stripe/stripe-react-native/tree/master/example)
+
+### Common issues
+
+#### Browser pop-ups are not redirecting back to my app
+
+If you're relying on redirects, you'll need to pass in a `urlScheme` to `initStripe`. To make sure you always use the proper `urlScheme`, pass in:
+
+```js
+import * as Linking from 'expo-linking';
+import Constants from 'expo-constants';
+
+urlScheme:
+ Constants.appOwnership === 'expo'
+ ? Linking.createURL('/--/')
+ : Linking.createURL(''),
+```
+
+[Linking.createURL](/versions/latest/sdk/linking.mdx#linkingcreateurlpath-options) will ensure you're using the proper scheme, whether you're running in Expo Go or your production app. `'/--/'` is necessary in Expo Go because it indicates that the substring after it corresponds to the deep link path, and is not part of the path to the app itself.
+
+## Limitations
+
+### Standalone apps
+
+`@stripe/stripe-react-native` is supported in Expo Go on Android and iOS out of the box, **however**, for iOS, it is only available for standalone apps built with [EAS Build](/build/introduction), and not for apps built on the classic build system- `expo build:ios`. Android apps built with `expo build:android` _will_ have access to the `@stripe/stripe-react-native` library.
+
+### Google Pay
+
+Google Pay **is not** supported in [Expo Go](https://expo.dev/expo-go). To use Google Pay, you must create a [development build](/develop/development-builds/create-a-build/). This can be done with [EAS Build](/build/introduction), or locally by running `npx expo run:android`.
+
+### Apple Pay
+
+Apple Pay **is not** supported in [Expo Go](https://expo.dev/expo-go). To use Apple Pay, you must create a [development build](/develop/development-builds/create-a-build/). This can be done with [EAS Build](/build/introduction), or locally by running `npx expo run:ios`.
diff --git a/docs/pages/versions/v49.0.0/sdk/svg.mdx b/docs/pages/versions/v49.0.0/sdk/svg.mdx
new file mode 100644
index 0000000000000..acd0e5be5e23f
--- /dev/null
+++ b/docs/pages/versions/v49.0.0/sdk/svg.mdx
@@ -0,0 +1,58 @@
+---
+title: Svg
+sourceCodeUrl: 'https://github.com/react-native-community/react-native-svg'
+packageName: 'react-native-svg'
+---
+
+import { APIInstallSection } from '~/components/plugins/InstallSection';
+import PlatformsSection from '~/components/plugins/PlatformsSection';
+import { SnackInline } from '~/ui/components/Snippet';
+
+> **info** This library is listed in the Expo SDK reference because it is included in [Expo Go](/get-started/expo-go/). You may use any library of your choice with [development builds](/develop/development-builds/introduction/).
+
+**`react-native-svg`** allows you to use SVGs in your app, with support for interactivity and animation.
+
+
+
+## Installation
+
+
+
+## API
+
+```js
+import * as Svg from 'react-native-svg';
+```
+
+### `Svg`
+
+A set of drawing primitives such as `Circle`, `Rect`, `Path`,
+`ClipPath`, and `Polygon`. It supports most SVG elements and properties.
+The implementation is provided by [react-native-svg](https://github.com/react-native-community/react-native-svg), and documentation is provided in that repository.
+
+
+
+```tsx
+import * as React from 'react';
+import Svg, { Circle, Rect } from 'react-native-svg';
+
+export default function SvgComponent(props) {
+ return (
+
+
+
+
+ );
+}
+```
+
+
+
+### Pro Tips
+
+Here are some helpful links that will get you moving fast!
+
+- Looking for SVGs? Try the [noun project](https://thenounproject.com/).
+- Create or modify your own SVGs for free using [Figma](https://www.figma.com/).
+- Optimize your SVG with [SVGOMG](https://jakearchibald.github.io/svgomg/). This will make the code smaller and easier to work with. Be sure not to remove the `viewbox` for best results on Android.
+- Convert your SVG to an Expo component in the browser using [React SVGR](https://react-svgr.com/playground/?native=true&typescript=true).
diff --git a/docs/pages/versions/v49.0.0/sdk/system-ui.mdx b/docs/pages/versions/v49.0.0/sdk/system-ui.mdx
new file mode 100644
index 0000000000000..b1230e6efc63e
--- /dev/null
+++ b/docs/pages/versions/v49.0.0/sdk/system-ui.mdx
@@ -0,0 +1,25 @@
+---
+title: SystemUI
+sourceCodeUrl: 'https://github.com/expo/expo/tree/sdk-49/packages/expo-system-ui'
+packageName: 'expo-system-ui'
+---
+
+import APISection from '~/components/plugins/APISection';
+import { APIInstallSection } from '~/components/plugins/InstallSection';
+import PlatformsSection from '~/components/plugins/PlatformsSection';
+
+**`expo-system-ui`** enables you to interact with UI elements that fall outside of the React tree. Specifically the root view background color, and locking the user interface style globally on Android.
+
+
+
+## Installation
+
+
+
+## API
+
+```js
+import * as SystemUI from 'expo-system-ui';
+```
+
+
diff --git a/docs/pages/versions/v49.0.0/sdk/task-manager.mdx b/docs/pages/versions/v49.0.0/sdk/task-manager.mdx
new file mode 100644
index 0000000000000..b057dcd23bd65
--- /dev/null
+++ b/docs/pages/versions/v49.0.0/sdk/task-manager.mdx
@@ -0,0 +1,115 @@
+---
+title: TaskManager
+sourceCodeUrl: 'https://github.com/expo/expo/tree/sdk-49/packages/expo-task-manager'
+packageName: 'expo-task-manager'
+---
+
+import { APIInstallSection } from '~/components/plugins/InstallSection';
+import APISection from '~/components/plugins/APISection';
+import PlatformsSection from '~/components/plugins/PlatformsSection';
+import { SnackInline } from '~/ui/components/Snippet';
+import { ConfigReactNative } from '~/components/plugins/ConfigSection';
+
+`expo-task-manager` provides an API that allows you to manage long-running tasks, in particular those tasks that can run while your app is in the background.
+Some features of this module are used by other modules under the hood. Here is a list of Expo modules that use TaskManager:
+
+- [Location](location.mdx)
+- [BackgroundFetch](background-fetch.mdx)
+
+
+
+## Installation
+
+
+
+## Configuration for standalone apps
+
+### Background modes on iOS
+
+`TaskManager` works out of the box in the Expo Go app on Android, however, on iOS, you'll need to use a [development build](/develop/development-builds/introduction/).
+
+Standalone apps need some extra configuration: on iOS, each background feature requires a special key in `UIBackgroundModes` array in your **Info.plist** file. In standalone apps this array is empty by default, so to use background features you will need to add appropriate keys to your **app.json** configuration.
+
+Here is an example of an **app.json** configuration that enables background location and background fetch:
+
+```json app.json
+{
+ "expo": {
+ "ios": {
+ "infoPlist": {
+ "UIBackgroundModes": ["location", "fetch"]
+ }
+ }
+ }
+}
+```
+
+
+
+Learn how to configure the native projects in the [installation instructions in the `expo-task-manager` repository](https://github.com/expo/expo/tree/main/packages/expo-task-manager#installation-in-bare-ios-react-native-project).
+
+
+
+## Example
+
+
+
+```jsx
+import React from 'react';
+import { Button, View, StyleSheet } from 'react-native';
+import * as TaskManager from 'expo-task-manager';
+import * as Location from 'expo-location';
+
+const LOCATION_TASK_NAME = 'background-location-task';
+
+const requestPermissions = async () => {
+ const { status: foregroundStatus } = await Location.requestForegroundPermissionsAsync();
+ if (foregroundStatus === 'granted') {
+ const { status: backgroundStatus } = await Location.requestBackgroundPermissionsAsync();
+ if (backgroundStatus === 'granted') {
+ await Location.startLocationUpdatesAsync(LOCATION_TASK_NAME, {
+ accuracy: Location.Accuracy.Balanced,
+ });
+ }
+ }
+};
+
+const PermissionsButton = () => (
+
+
+
+);
+
+TaskManager.defineTask(LOCATION_TASK_NAME, ({ data, error }) => {
+ if (error) {
+ // Error occurred - check `error.message` for more details.
+ return;
+ }
+ if (data) {
+ const { locations } = data;
+ // do something with the locations captured in the background
+ }
+});
+
+/* @hide const styles = StyleSheet.create({ ... }); */
+const styles = StyleSheet.create({
+ container: {
+ flex: 1,
+ alignItems: 'center',
+ justifyContent: 'center',
+ },
+});
+/* @end */
+
+export default PermissionsButton;
+```
+
+
+
+## API
+
+```js
+import * as TaskManager from 'expo-task-manager';
+```
+
+
diff --git a/docs/pages/versions/v49.0.0/sdk/tracking-transparency.mdx b/docs/pages/versions/v49.0.0/sdk/tracking-transparency.mdx
new file mode 100644
index 0000000000000..c31bd3babeb61
--- /dev/null
+++ b/docs/pages/versions/v49.0.0/sdk/tracking-transparency.mdx
@@ -0,0 +1,130 @@
+---
+title: TrackingTransparency
+sourceCodeUrl: 'https://github.com/expo/expo/tree/sdk-49/packages/expo-tracking-transparency'
+packageName: 'expo-tracking-transparency'
+---
+
+import {
+ ConfigReactNative,
+ ConfigPluginExample,
+ ConfigPluginProperties,
+} from '~/components/plugins/ConfigSection';
+import { AndroidPermissions, IOSPermissions } from '~/components/plugins/permissions';
+import APISection from '~/components/plugins/APISection';
+import { APIInstallSection } from '~/components/plugins/InstallSection';
+import PlatformsSection from '~/components/plugins/PlatformsSection';
+import { SnackInline } from '~/ui/components/Snippet';
+
+A library for requesting permission to track the user or their device. Examples of data used for tracking include email address, device ID, advertising ID, etc... This permission is only necessary on iOS 14 and higher; on iOS 13 and below this permission is always granted. If the "Allow Apps to Request to Track" device-level setting is off, this permission will be denied. Be sure to add `NSUserTrackingUsageDescription` to your [**Info.plist**](/versions/latest/config/app/#infoplist) to explain how the user will be tracked, otherwise your app will be rejected by Apple.
+
+For more information on Apple's new App Tracking Transparency framework, please refer to their [documentation](https://developer.apple.com/app-store/user-privacy-and-data-use/).
+
+
+
+## Installation
+
+
+
+## Configuration in app.json/app.config.js
+
+You can configure `expo-tracking-transparency` using its built-in [config plugin](/config-plugins/introduction/) if you use config plugins in your project ([EAS Build](/build/introduction) or `npx expo run:[android|ios]`). The plugin allows you to configure various properties that cannot be set at runtime and require building a new app binary to take effect.
+
+
+
+Learn how to configure the native projects in the [installation instructions in the `expo-tracking-transparency` repository](https://github.com/expo/expo/tree/main/packages/expo-tracking-transparency#installation-in-bare-react-native-projects).
+
+
+
+
+
+```json app.json
+{
+ "expo": {
+ "plugins": [
+ [
+ "expo-tracking-transparency",
+ {
+ "userTrackingPermission": "This identifier will be used to deliver personalized ads to you."
+ }
+ ]
+ ]
+ }
+}
+```
+
+
+
+
+
+## Usage
+
+
+
+```jsx
+import React, { useEffect } from 'react';
+import { Text, StyleSheet, View } from 'react-native';
+import { requestTrackingPermissionsAsync } from 'expo-tracking-transparency';
+
+export default function App() {
+ useEffect(() => {
+ (async () => {
+ const { status } = await requestTrackingPermissionsAsync();
+ if (status === 'granted') {
+ console.log('Yay! I have user permission to track data');
+ }
+ })();
+ }, []);
+
+ return (
+
+ Tracking Transparency Module Example
+
+ );
+}
+
+/* @hide const styles = StyleSheet.create({ ... }); */
+const styles = StyleSheet.create({
+ container: {
+ flex: 1,
+ alignItems: 'center',
+ justifyContent: 'center',
+ },
+});
+/* @end */
+```
+
+
+
+## API
+
+```js
+import {
+ requestTrackingPermissionsAsync,
+ getTrackingPermissionsAsync,
+} from 'expo-tracking-transparency';
+```
+
+
+
+## Permissions
+
+### Android
+
+_No permissions required_.
+
+### iOS
+
+The following usage description keys are used by this library:
+
+
diff --git a/docs/pages/versions/v49.0.0/sdk/updates.mdx b/docs/pages/versions/v49.0.0/sdk/updates.mdx
new file mode 100644
index 0000000000000..8cc0525be26e3
--- /dev/null
+++ b/docs/pages/versions/v49.0.0/sdk/updates.mdx
@@ -0,0 +1,143 @@
+---
+title: Updates
+sourceCodeUrl: 'https://github.com/expo/expo/tree/sdk-49/packages/expo-updates'
+packageName: 'expo-updates'
+---
+
+import APISection from '~/components/plugins/APISection';
+import { APIInstallSection } from '~/components/plugins/InstallSection';
+import PlatformsSection from '~/components/plugins/PlatformsSection';
+import { YesIcon, NoIcon } from '~/ui/components/DocIcons';
+import { ConfigReactNative, ConfigPluginExample } from '~/components/plugins/ConfigSection';
+import { BoxLink } from '~/ui/components/BoxLink';
+import { GithubIcon } from '@expo/styleguide-icons';
+
+The `expo-updates` library allows you to programmatically control and respond to new updates made available to your app.
+
+
+
+## Installation
+
+
+
+## Configuration in app.json/app.config.js
+
+The plugin is configured with the Expo account's username automatically when EAS CLI is used.
+
+
+
+```json app.json
+{
+ "expo": {
+ "plugins": [
+ [
+ "expo-updates",
+ {
+ "username": "account-username"
+ }
+ ]
+ ]
+ }
+}
+```
+
+
+
+
+
+Learn how to configure the native projects in the [installation instructions in the `expo-updates` repository](https://github.com/expo/expo/tree/main/packages/expo-updates#installation-in-bare-react-native-projects).
+
+
+
+## Usage
+
+Most of the methods and constants in this module can only be used or tested in release mode. In debug builds, the default behavior is to always load the latest JavaScript from a development server. It is possible to [build a debug version of your app with the same updates behavior as a release build](/eas-update/debug/#debugging-of-native-code-in-an-app). Such an app will not open the latest JavaScript from your development server — it will load published updates just as a release build does. This may be useful for debugging the behavior of your app when it is not connected to a development server.
+
+**To test manual updates in the Expo Go app**, run [`eas update`](/eas-update/introduction) and then open the published version of your app with Expo Go.
+
+**To test manual updates with standalone apps**, you can create a [**.apk**](/build-reference/apk) or a [simulator build](/build-reference/simulators), or make a release build locally with `npx expo run:android --variant release` and `npx expo run:ios --configuration Release` (you don't need to submit this build to the store to test).
+
+### Check for updates manually
+
+The `expo-updates` library exports a variety of functions to interact with updates once the app is already running. In some scenarios, you may want to check if updates are available or not. This can be done manually by using [`checkForUpdateAsync()`](#updatescheckforupdateasync) as shown in the example below:
+
+```jsx App.js
+import { View, Button } from 'react-native';
+import * as Updates from 'expo-updates';
+
+function App() {
+ async function onFetchUpdateAsync() {
+ try {
+ const update = await Updates.checkForUpdateAsync();
+
+ if (update.isAvailable) {
+ await Updates.fetchUpdateAsync();
+ await Updates.reloadAsync();
+ }
+ } catch (error) {
+ // You can also add an alert() to see the error message in case of an error when fetching updates.
+ alert(`Error fetching latest Expo update: ${error}`);
+ }
+ }
+
+ return (
+
+
+
+ );
+}
+```
+
+### Use `expo-updates` with a custom server
+
+Every custom updates server must implement the [Expo Updates protocol](/technical-specs/expo-updates-1/).
+
+
+
+### Configuration options
+
+There are build-time configuration options that control the behavior of `expo-updates`.
+
+On Android, these options are set as `meta-data` tags adjacent to the tags added during installation in the **AndroidManifest.xml** file. You can also define these options at runtime by passing a `Map` as the second parameter of `UpdatesController.initialize()`, and the provided values will override any value specified in **AndroidManifest.xml**.
+
+On iOS, these properties are set as keys in **Expo.plist** file. You can also set them at runtime by calling `[EXUpdatesAppController.sharedInstance setConfiguration:]` at any point before calling `start` or `startAndShowLaunchScreen`, and the values in this dictionary will override any values specified in **Expo.plist**.
+
+| iOS plist/dictionary key | Android Map key | Android meta-data name | Default | Required? |
+| ------------------------------------------------------------- | ---------------------------------------------------- | ------------------------------------------------------------------------------- | ---------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------- |
+| `EXUpdatesEnabled` | `enabled` | `expo.modules.updates.ENABLED` | `true` | |
+| `EXUpdatesURL` | `updateUrl` | `expo.modules.updates.EXPO_UPDATE_URL` | (none) | |
+| `EXUpdatesRequestHeaders` | `requestHeaders` | `expo.modules.updates.UPDATES_CONFIGURATION_REQUEST_HEADERS_KEY` | (none) | |
+| `EXUpdatesSDKVersion` | `sdkVersion` | `expo.modules.updates.EXPO_SDK_VERSION` | (none) | (exactly one of `sdkVersion` or `runtimeVersion` is required, Required for apps hosted on Expo's server) |
+| `EXUpdatesRuntimeVersion` | `runtimeVersion` | `expo.modules.updates.EXPO_RUNTIME_VERSION` | (none) | (exactly one of `sdkVersion` or `runtimeVersion` is required) |
+| `EXUpdatesReleaseChannel` | `releaseChannel` | `expo.modules.updates.EXPO_RELEASE_CHANNEL` | `default` | |
+| `EXUpdatesCheckOnLaunch` | `checkOnLaunch` | `expo.modules.updates.EXPO_UPDATES_CHECK_ON_LAUNCH` | `ALWAYS` (`ALWAYS`, `NEVER`, `WIFI_ONLY`, `ERROR_RECOVERY_ONLY`) | |
+| `EXUpdatesLaunchWaitMs` | `launchWaitMs` | `expo.modules.updates.EXPO_UPDATES_LAUNCH_WAIT_MS` | `0` | |
+| `EXUpdatesCodeSigningCertificate` | `codeSigningCertificate` | `expo.modules.updates.CODE_SIGNING_CERTIFICATE` | (none) | |
+| `EXUpdatesCodeSigningMetadata` | `codeSigningMetadata` | `expo.modules.updates.CODE_SIGNING_METADATA` | (none) | |
+| `EXUpdatesCodeSigningIncludeManifestResponseCertificateChain` | `codeSigningIncludeManifestResponseCertificateChain` | `expo.modules.updates.CODE_SIGNING_INCLUDE_MANIFEST_RESPONSE_CERTIFICATE_CHAIN` | false | |
+| `EXUpdatesConfigCodeSigningAllowUnsignedManifests` | `codeSigningAllowUnsignedManifests` | `expo.modules.updates.CODE_SIGNING_ALLOW_UNSIGNED_MANIFESTS` | false | |
+
+For a detailed explanation, see the [`expo-updates`](https://github.com/expo/expo/blob/main/packages/expo-updates/README.md) repository.
+
+## API
+
+```js
+import * as Updates from 'expo-updates';
+```
+
+
+
+## Error Codes
+
+| Code | Description |
+| ----------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
+| `ERR_UPDATES_DISABLED` | A method call was attempted when the Updates module was disabled, or the application was running in development mode |
+| `ERR_UPDATES_RELOAD` | An error occurred when trying to reload the application and it could not be reloaded. For bare workflow apps, double check the setup steps for this module to ensure it has been installed correctly and the proper native initialization methods are called. |
+| `ERR_UPDATES_CHECK` | An unexpected error occurred when trying to check for new updates. Check the error message for more information. |
+| `ERR_UPDATES_FETCH` | An unexpected error occurred when trying to fetch a new update. Check the error message for more information. |
+| `ERR_UPDATES_READ_LOGS` | An unexpected error occurred when trying to read log entries. Check the error message for more information. |
diff --git a/docs/pages/versions/v49.0.0/sdk/video-thumbnails.mdx b/docs/pages/versions/v49.0.0/sdk/video-thumbnails.mdx
new file mode 100644
index 0000000000000..8e024b9c18619
--- /dev/null
+++ b/docs/pages/versions/v49.0.0/sdk/video-thumbnails.mdx
@@ -0,0 +1,79 @@
+---
+title: VideoThumbnails
+sourceCodeUrl: 'https://github.com/expo/expo/tree/sdk-49/packages/expo-video-thumbnails'
+packageName: 'expo-video-thumbnails'
+---
+
+import APISection from '~/components/plugins/APISection';
+import { APIInstallSection } from '~/components/plugins/InstallSection';
+import PlatformsSection from '~/components/plugins/PlatformsSection';
+import { SnackInline} from '~/ui/components/Snippet';
+
+**`expo-video-thumbnails`** allows you to generate an image to serve as a thumbnail from a video file.
+
+
+
+## Installation
+
+
+
+## Usage
+
+
+
+```jsx
+import React, { useState } from 'react';
+import { StyleSheet, Button, View, Image, Text } from 'react-native';
+import * as VideoThumbnails from 'expo-video-thumbnails';
+
+export default function App() {
+ const [image, setImage] = useState(null);
+
+ const generateThumbnail = async () => {
+ try {
+ const { uri } = await VideoThumbnails.getThumbnailAsync(
+ 'http://d23dyxeqlo5psv.cloudfront.net/big_buck_bunny.mp4',
+ {
+ time: 15000,
+ }
+ );
+ setImage(uri);
+ } catch (e) {
+ console.warn(e);
+ }
+ };
+
+ return (
+
+
+ {image && }
+ {image}
+
+ );
+}
+
+/* @hide const styles = StyleSheet.create({ ... }); */
+const styles = StyleSheet.create({
+ container: {
+ flex: 1,
+ justifyContent: 'center',
+ alignItems: 'center',
+ backgroundColor: '#F5FCFF',
+ },
+ image: {
+ width: 200,
+ height: 200,
+ },
+});
+/* @end */
+```
+
+
+
+## API
+
+```js
+import * as VideoThumbnails from 'expo-video-thumbnails';
+```
+
+
diff --git a/docs/pages/versions/v49.0.0/sdk/video.mdx b/docs/pages/versions/v49.0.0/sdk/video.mdx
new file mode 100644
index 0000000000000..a5bc652ea2bf9
--- /dev/null
+++ b/docs/pages/versions/v49.0.0/sdk/video.mdx
@@ -0,0 +1,97 @@
+---
+title: Video
+sourceCodeUrl: 'https://github.com/expo/expo/tree/sdk-49/packages/expo-av'
+packageName: 'expo-av'
+iconUrl: '/static/images/packages/expo-av.png'
+---
+
+import APISection from '~/components/plugins/APISection';
+import { APIInstallSection } from '~/components/plugins/InstallSection';
+import PlatformsSection from '~/components/plugins/PlatformsSection';
+import { SnackInline } from '~/ui/components/Snippet';
+
+The `Video` component from **`expo-av`** displays a video inline with the other UI elements in your app.
+
+Much of Video and Audio have common APIs that are documented in [AV documentation](av.mdx). This page covers video-specific props and APIs. We encourage you to skim through this document to get basic video working, and then move on to [AV documentation](av.mdx) for more advanced functionality. The audio experience of video (such as whether to interrupt music already playing in another app, or whether to play sound while the phone is on silent mode) can be customized using the [Audio API](audio.mdx).
+
+
+
+## Installation
+
+
+
+## Usage
+
+Here's a simple example of a video with a play/pause button.
+
+
+
+```jsx
+import * as React from 'react';
+import { View, StyleSheet, Button } from 'react-native';
+import { Video, ResizeMode } from 'expo-av';
+
+export default function App() {
+ const video = React.useRef(null);
+ const [status, setStatus] = React.useState({});
+ return (
+
+ setStatus(() => status)}
+ />
+
+
+ status.isPlaying ? video.current.pauseAsync() : video.current.playAsync()
+ }
+ />
+
+
+ );
+}
+
+/* @hide const styles = StyleSheet.create({ ... }); */
+const styles = StyleSheet.create({
+ container: {
+ flex: 1,
+ justifyContent: 'center',
+ backgroundColor: '#ecf0f1',
+ },
+ video: {
+ alignSelf: 'center',
+ width: 320,
+ height: 200,
+ },
+ buttons: {
+ flexDirection: 'row',
+ justifyContent: 'center',
+ alignItems: 'center',
+ },
+});
+/* @end */
+```
+
+
+
+For more advanced examples, check out the [Playlist example](https://github.com/expo/playlist-example/blob/master/App.js), and the [custom `VideoPlayer` controls component](https://github.com/ihmpavel/expo-video-player/blob/master/lib/index.tsx) that wraps ``, adds custom controls and use the `` API extensively. The `VideoPlayer` controls is used in [this app](https://github.com/expo/harvard-cs50-app).
+
+## API
+
+```js
+import { Video } from 'expo-av';
+```
+
+
+
+## Unified API
+
+The rest of the API on the `Video` component `ref` is the same as the API for `Audio.Sound` - see the [AV documentation](av/#playback) for further information.
diff --git a/docs/pages/versions/v49.0.0/sdk/view-pager.mdx b/docs/pages/versions/v49.0.0/sdk/view-pager.mdx
new file mode 100644
index 0000000000000..40f9da83aeacb
--- /dev/null
+++ b/docs/pages/versions/v49.0.0/sdk/view-pager.mdx
@@ -0,0 +1,64 @@
+---
+title: ViewPager
+sourceCodeUrl: 'https://github.com/callstack/react-native-pager-view'
+packageName: 'react-native-pager-view'
+---
+
+import { APIInstallSection } from '~/components/plugins/InstallSection';
+import PlatformsSection from '~/components/plugins/PlatformsSection';
+import Video from '~/components/plugins/Video';
+
+> **info** This library is listed in the Expo SDK reference because it is included in [Expo Go](/get-started/expo-go/). You may use any library of your choice with [development builds](/develop/development-builds/introduction/).
+
+**`react-native-pager-view`** exposes a component that provides the layout and gestures to scroll between pages of content, like a carousel.
+
+
+
+
+
+## Installation
+
+
+
+## Usage
+
+See full documentation at [callstack/react-native-pager-view](https://github.com/callstack/react-native-pager-view).
+
+## Basic Example
+
+```js
+import React from 'react';
+import { StyleSheet, View, Text } from 'react-native';
+import PagerView from 'react-native-pager-view';
+
+const MyPager = () => {
+ return (
+
+
+
+ First page
+ Swipe ➡️
+
+
+ Second page
+
+
+ Third page
+
+
+
+ );
+};
+
+const styles = StyleSheet.create({
+ viewPager: {
+ flex: 1,
+ },
+ page: {
+ justifyContent: 'center',
+ alignItems: 'center',
+ },
+});
+
+export default MyPager;
+```
diff --git a/docs/pages/versions/v49.0.0/sdk/webbrowser.mdx b/docs/pages/versions/v49.0.0/sdk/webbrowser.mdx
new file mode 100644
index 0000000000000..a4445df40b5c8
--- /dev/null
+++ b/docs/pages/versions/v49.0.0/sdk/webbrowser.mdx
@@ -0,0 +1,93 @@
+---
+title: WebBrowser
+sourceCodeUrl: 'https://github.com/expo/expo/tree/sdk-49/packages/expo-web-browser'
+packageName: 'expo-web-browser'
+iconUrl: '/static/images/packages/expo-web-browser.png'
+---
+
+import APISection from '~/components/plugins/APISection';
+import { APIInstallSection } from '~/components/plugins/InstallSection';
+import PlatformsSection from '~/components/plugins/PlatformsSection';
+import { SnackInline } from '~/ui/components/Snippet';
+
+`expo-web-browser` provides access to the system's web browser and supports handling redirects. On Android, it uses `ChromeCustomTabs` and on iOS, it uses `SFSafariViewController` or `SFAuthenticationSession`, depending on the method you call. As of iOS 11, `SFSafariViewController` no longer shares cookies with Safari, so if you are using `WebBrowser` for authentication you will want to use `WebBrowser.openAuthSessionAsync`, and if you just want to open a webpage (such as your app privacy policy), then use `WebBrowser.openBrowserAsync`.
+
+
+
+## Installation
+
+
+
+## Usage
+
+
+
+```jsx
+import React, { useState } from 'react';
+import { Button, Text, View, StyleSheet } from 'react-native';
+import * as WebBrowser from 'expo-web-browser';
+/* @hide */
+import Constants from 'expo-constants';
+/* @end */
+
+export default function App() {
+ const [result, setResult] = useState(null);
+
+ const _handlePressButtonAsync = async () => {
+ let result = await WebBrowser.openBrowserAsync('https://expo.dev');
+ setResult(result);
+ };
+ return (
+
+
+ {result && JSON.stringify(result)}
+
+ );
+}
+
+/* @hide const styles = StyleSheet.create({ ... }); */
+const styles = StyleSheet.create({
+ container: {
+ flex: 1,
+ alignItems: 'center',
+ justifyContent: 'center',
+ paddingTop: Constants.statusBarHeight,
+ backgroundColor: '#ecf0f1',
+ },
+});
+/* @end */
+```
+
+
+
+### Handling deep links from the WebBrowser
+
+If you use the `WebBrowser` window for authentication or another use case where you want to pass information back into your app through a deep link, add a handler with `Linking.addEventListener` before opening the browser. When the listener fires, you should call [dismissBrowser](#webbrowserdismissbrowser) -- it will not automatically dismiss when a deep link is handled. Aside from that, redirects from `WebBrowser` work the same as other deep links. [Read more about it in the Linking guide](/guides/linking#handling-links).
+
+## API
+
+```js
+import * as WebBrowser from 'expo-web-browser';
+```
+
+
+
+## Error Codes
+
+### `ERR_WEB_BROWSER_REDIRECT`
+
+**Web only:** The window cannot complete the redirect request because the invoking window doesn't have a reference to it's parent. This can happen if the parent window was reloaded.
+
+### `ERR_WEB_BROWSER_BLOCKED`
+
+**Web only:** The popup window was blocked by the browser or failed to open. This can happen in mobile browsers when the `window.open()` method was invoked too long after a user input was fired.
+
+Mobile browsers do this to prevent malicious websites from opening many unwanted popups on mobile.
+
+You're method can still run in an async function but there cannot be any long running tasks before it. You can use hooks to disable user-inputs until any other processes have finished loading.
+
+### `ERR_WEB_BROWSER_CRYPTO`
+
+**Web only:** The current environment doesn't support crypto. Ensure you are running from a secure origin (https).
+
+> **Tip:** You can run `npx expo start --web --https` to open your web page in a secure development environment.
diff --git a/docs/pages/versions/v49.0.0/sdk/webview.mdx b/docs/pages/versions/v49.0.0/sdk/webview.mdx
new file mode 100644
index 0000000000000..6487845759e4e
--- /dev/null
+++ b/docs/pages/versions/v49.0.0/sdk/webview.mdx
@@ -0,0 +1,87 @@
+---
+title: WebView
+sourceCodeUrl: 'https://github.com/react-native-community/react-native-webview'
+packageName: 'react-native-webview'
+---
+
+import { APIInstallSection } from '~/components/plugins/InstallSection';
+import PlatformsSection from '~/components/plugins/PlatformsSection';
+import { SnackInline} from '~/ui/components/Snippet';
+
+**`react-native-webview`** provides a `WebView` component that renders web content in a native view.
+
+
+
+## Installation
+
+
+
+## Usage
+
+You should refer to the [react-native-webview docs](https://github.com/react-native-webview/react-native-webview/blob/master/docs/Guide.md#react-native-webview-guide) for more information on the API and its usage. But the following example (courtesy of that repo) is a quick way to get up and running!
+
+
+
+{/* prettier-ignore */}
+```jsx
+import * as React from 'react';
+import { WebView } from 'react-native-webview';
+/* @hide */
+import { StyleSheet } from 'react-native';
+import Constants from 'expo-constants';
+/* @end */
+
+export default function App() {
+ return (
+
+ );
+}
+
+/* @hide const styles = StyleSheet.create({ ... }); */
+const styles = StyleSheet.create({
+ container: {
+ flex: 1,
+ marginTop: Constants.statusBarHeight,
+ },
+});
+/* @end */
+```
+
+
+
+Minimal example with inline HTML:
+
+
+
+```jsx
+import * as React from 'react';
+import { WebView } from 'react-native-webview';
+/* @hide */
+import { StyleSheet } from 'react-native';
+import Constants from 'expo-constants';
+/* @end */
+
+export default function App() {
+ return (
+ Hello world ' }}
+ />
+ );
+}
+
+/* @hide const styles = StyleSheet.create({ ... }); */
+const styles = StyleSheet.create({
+ container: {
+ flex: 1,
+ marginTop: Constants.statusBarHeight,
+ },
+});
+/* @end */
+```
+
+
diff --git a/docs/public/static/data/unversioned/expo-asset.json b/docs/public/static/data/unversioned/expo-asset.json
index c5a86324b7b40..33c14e407bbc1 100644
--- a/docs/public/static/data/unversioned/expo-asset.json
+++ b/docs/public/static/data/unversioned/expo-asset.json
@@ -1 +1 @@
-{"name":"expo-asset","kind":1,"children":[{"name":"Asset","kind":128,"comment":{"summary":[{"kind":"text","text":"The "},{"kind":"code","text":"`Asset`"},{"kind":"text","text":" class represents an asset in your app. It gives metadata about the asset (such as its\nname and type) and provides facilities to load the asset data."}]},"children":[{"name":"constructor","kind":512,"signatures":[{"name":"new Asset","kind":16384,"parameters":[{"name":"__namedParameters","kind":32768,"type":{"type":"reference","name":"AssetDescriptor"}}],"type":{"type":"reference","name":"Asset"}}]},{"name":"downloaded","kind":1024,"type":{"type":"intrinsic","name":"boolean"},"defaultValue":"false"},{"name":"downloading","kind":1024,"type":{"type":"intrinsic","name":"boolean"},"defaultValue":"false"},{"name":"hash","kind":1024,"comment":{"summary":[{"kind":"text","text":"The MD5 hash of the asset's data."}]},"type":{"type":"union","types":[{"type":"literal","value":null},{"type":"intrinsic","name":"string"}]},"defaultValue":"null"},{"name":"height","kind":1024,"comment":{"summary":[{"kind":"text","text":"If the asset is an image, the height of the image data divided by the scale factor. The scale factor is the number after "},{"kind":"code","text":"`@`"},{"kind":"text","text":" in the filename, or "},{"kind":"code","text":"`1`"},{"kind":"text","text":" if not present."}]},"type":{"type":"union","types":[{"type":"literal","value":null},{"type":"intrinsic","name":"number"}]},"defaultValue":"null"},{"name":"localUri","kind":1024,"comment":{"summary":[{"kind":"text","text":"If the asset has been downloaded (by calling ["},{"kind":"code","text":"`downloadAsync()`"},{"kind":"text","text":"](#downloadasync)), the\n"},{"kind":"code","text":"`file://`"},{"kind":"text","text":" URI pointing to the local file on the device that contains the asset data."}]},"type":{"type":"union","types":[{"type":"literal","value":null},{"type":"intrinsic","name":"string"}]},"defaultValue":"null"},{"name":"name","kind":1024,"comment":{"summary":[{"kind":"text","text":"The name of the asset file without the extension. Also without the part from "},{"kind":"code","text":"`@`"},{"kind":"text","text":" onward in the\nfilename (used to specify scale factor for images)."}]},"type":{"type":"intrinsic","name":"string"}},{"name":"type","kind":1024,"comment":{"summary":[{"kind":"text","text":"The extension of the asset filename."}]},"type":{"type":"intrinsic","name":"string"}},{"name":"uri","kind":1024,"comment":{"summary":[{"kind":"text","text":"A URI that points to the asset's data on the remote server. When running the published version\nof your app, this refers to the location on Expo's asset server where Expo has stored your\nasset. When running the app from Expo CLI during development, this URI points to Expo CLI's\nserver running on your computer and the asset is served directly from your computer. If you\nare not using Classic Updates (legacy), this field should be ignored as we ensure your assets \nare on device before before running your application logic."}]},"type":{"type":"intrinsic","name":"string"}},{"name":"width","kind":1024,"comment":{"summary":[{"kind":"text","text":"If the asset is an image, the width of the image data divided by the scale factor. The scale\nfactor is the number after "},{"kind":"code","text":"`@`"},{"kind":"text","text":" in the filename, or "},{"kind":"code","text":"`1`"},{"kind":"text","text":" if not present."}]},"type":{"type":"union","types":[{"type":"literal","value":null},{"type":"intrinsic","name":"number"}]},"defaultValue":"null"},{"name":"downloadAsync","kind":2048,"signatures":[{"name":"downloadAsync","kind":4096,"comment":{"summary":[{"kind":"text","text":"Downloads the asset data to a local file in the device's cache directory. Once the returned\npromise is fulfilled without error, the ["},{"kind":"code","text":"`localUri`"},{"kind":"text","text":"](#assetlocaluri) field of this asset points\nto a local file containing the asset data. The asset is only downloaded if an up-to-date local\nfile for the asset isn't already present due to an earlier download. The downloaded "},{"kind":"code","text":"`Asset`"},{"kind":"text","text":"\nwill be returned when the promise is resolved."}],"blockTags":[{"tag":"@returns","content":[{"kind":"text","text":"Returns a Promise which fulfills with an "},{"kind":"code","text":"`Asset`"},{"kind":"text","text":" instance."}]}]},"type":{"type":"reference","typeArguments":[{"type":"reference","name":"Asset"}],"name":"Promise","qualifiedName":"Promise","package":"typescript"}}]},{"name":"fromMetadata","kind":2048,"flags":{"isStatic":true},"signatures":[{"name":"fromMetadata","kind":4096,"parameters":[{"name":"meta","kind":32768,"type":{"type":"reference","name":"AssetMetadata"}}],"type":{"type":"reference","name":"Asset"}}]},{"name":"fromModule","kind":2048,"flags":{"isStatic":true},"signatures":[{"name":"fromModule","kind":4096,"comment":{"summary":[{"kind":"text","text":"Returns the ["},{"kind":"code","text":"`Asset`"},{"kind":"text","text":"](#asset) instance representing an asset given its module or URL."}],"blockTags":[{"tag":"@returns","content":[{"kind":"text","text":"The ["},{"kind":"code","text":"`Asset`"},{"kind":"text","text":"](#asset) instance for the asset."}]}]},"parameters":[{"name":"virtualAssetModule","kind":32768,"comment":{"summary":[{"kind":"text","text":"The value of "},{"kind":"code","text":"`require('path/to/file')`"},{"kind":"text","text":" for the asset or external\nnetwork URL"}]},"type":{"type":"union","types":[{"type":"intrinsic","name":"string"},{"type":"intrinsic","name":"number"}]}}],"type":{"type":"reference","name":"Asset"}}]},{"name":"fromURI","kind":2048,"flags":{"isStatic":true},"signatures":[{"name":"fromURI","kind":4096,"parameters":[{"name":"uri","kind":32768,"type":{"type":"intrinsic","name":"string"}}],"type":{"type":"reference","name":"Asset"}}]},{"name":"loadAsync","kind":2048,"flags":{"isStatic":true},"signatures":[{"name":"loadAsync","kind":4096,"comment":{"summary":[{"kind":"text","text":"A helper that wraps "},{"kind":"code","text":"`Asset.fromModule(module).downloadAsync`"},{"kind":"text","text":" for convenience."}],"blockTags":[{"tag":"@returns","content":[{"kind":"text","text":"Returns a Promise that fulfills with an array of "},{"kind":"code","text":"`Asset`"},{"kind":"text","text":"s when the asset(s) has been\nsaved to disk."}]},{"tag":"@example","content":[{"kind":"code","text":"```ts\nconst [{ localUri }] = await Asset.loadAsync(require('./assets/snack-icon.png'));\n```"}]}]},"parameters":[{"name":"moduleId","kind":32768,"comment":{"summary":[{"kind":"text","text":"An array of "},{"kind":"code","text":"`require('path/to/file')`"},{"kind":"text","text":" or external network URLs. Can also be\njust one module or URL without an Array."}]},"type":{"type":"union","types":[{"type":"intrinsic","name":"string"},{"type":"intrinsic","name":"number"},{"type":"array","elementType":{"type":"intrinsic","name":"number"}},{"type":"array","elementType":{"type":"intrinsic","name":"string"}}]}}],"type":{"type":"reference","typeArguments":[{"type":"array","elementType":{"type":"reference","name":"Asset"}}],"name":"Promise","qualifiedName":"Promise","package":"typescript"}}]}]},{"name":"AssetDescriptor","kind":4194304,"type":{"type":"reflection","declaration":{"name":"__type","kind":65536,"children":[{"name":"hash","kind":1024,"flags":{"isOptional":true},"type":{"type":"union","types":[{"type":"intrinsic","name":"string"},{"type":"literal","value":null}]}},{"name":"height","kind":1024,"flags":{"isOptional":true},"type":{"type":"union","types":[{"type":"intrinsic","name":"number"},{"type":"literal","value":null}]}},{"name":"name","kind":1024,"type":{"type":"intrinsic","name":"string"}},{"name":"type","kind":1024,"type":{"type":"intrinsic","name":"string"}},{"name":"uri","kind":1024,"type":{"type":"intrinsic","name":"string"}},{"name":"width","kind":1024,"flags":{"isOptional":true},"type":{"type":"union","types":[{"type":"intrinsic","name":"number"},{"type":"literal","value":null}]}}]}}},{"name":"AssetMetadata","kind":4194304,"type":{"type":"intersection","types":[{"type":"reference","typeArguments":[{"type":"reference","name":"PackagerAsset"},{"type":"union","types":[{"type":"literal","value":"httpServerLocation"},{"type":"literal","value":"name"},{"type":"literal","value":"hash"},{"type":"literal","value":"type"},{"type":"literal","value":"scales"},{"type":"literal","value":"width"},{"type":"literal","value":"height"}]}],"name":"Pick","qualifiedName":"Pick","package":"typescript"},{"type":"reflection","declaration":{"name":"__type","kind":65536,"children":[{"name":"fileHashes","kind":1024,"flags":{"isOptional":true},"type":{"type":"array","elementType":{"type":"intrinsic","name":"string"}}},{"name":"fileUris","kind":1024,"flags":{"isOptional":true},"type":{"type":"array","elementType":{"type":"intrinsic","name":"string"}}},{"name":"uri","kind":1024,"flags":{"isOptional":true},"type":{"type":"intrinsic","name":"string"}}]}}]}},{"name":"useAssets","kind":64,"signatures":[{"name":"useAssets","kind":4096,"comment":{"summary":[{"kind":"text","text":"Downloads and stores one or more assets locally.\nAfter the assets are loaded, this hook returns a list of asset instances.\nIf something went wrong when loading the assets, an error is returned.\n\n> Note, the assets are not \"reloaded\" when you dynamically change the asset list."}],"blockTags":[{"tag":"@returns","content":[{"kind":"text","text":"Returns an array containing:\n- on the first position, a list of all loaded assets. If they aren't loaded yet, this value is\n "},{"kind":"code","text":"`undefined`"},{"kind":"text","text":".\n- on the second position, an error which encountered when loading the assets. If there was no\n error, this value is "},{"kind":"code","text":"`undefined`"},{"kind":"text","text":"."}]},{"tag":"@example","content":[{"kind":"code","text":"```tsx\nconst [assets, error] = useAssets([require('path/to/asset.jpg'), require('path/to/other.png')]);\n\nreturn assets ? : null;\n```"}]}]},"parameters":[{"name":"moduleIds","kind":32768,"type":{"type":"union","types":[{"type":"intrinsic","name":"number"},{"type":"array","elementType":{"type":"intrinsic","name":"number"}}]}}],"type":{"type":"tuple","elements":[{"type":"union","types":[{"type":"array","elementType":{"type":"reference","name":"Asset"}},{"type":"intrinsic","name":"undefined"}]},{"type":"union","types":[{"type":"reference","name":"Error","qualifiedName":"Error","package":"typescript"},{"type":"intrinsic","name":"undefined"}]}]}}]}]}
\ No newline at end of file
+{"name":"expo-asset","kind":1,"children":[{"name":"Asset","kind":128,"comment":{"summary":[{"kind":"text","text":"The "},{"kind":"code","text":"`Asset`"},{"kind":"text","text":" class represents an asset in your app. It gives metadata about the asset (such as its\nname and type) and provides facilities to load the asset data."}]},"children":[{"name":"constructor","kind":512,"signatures":[{"name":"new Asset","kind":16384,"parameters":[{"name":"__namedParameters","kind":32768,"type":{"type":"reference","name":"AssetDescriptor"}}],"type":{"type":"reference","name":"Asset"}}]},{"name":"downloaded","kind":1024,"type":{"type":"intrinsic","name":"boolean"},"defaultValue":"false"},{"name":"downloading","kind":1024,"type":{"type":"intrinsic","name":"boolean"},"defaultValue":"false"},{"name":"hash","kind":1024,"comment":{"summary":[{"kind":"text","text":"The MD5 hash of the asset's data."}]},"type":{"type":"union","types":[{"type":"literal","value":null},{"type":"intrinsic","name":"string"}]},"defaultValue":"null"},{"name":"height","kind":1024,"comment":{"summary":[{"kind":"text","text":"If the asset is an image, the height of the image data divided by the scale factor. The scale factor is the number after "},{"kind":"code","text":"`@`"},{"kind":"text","text":" in the filename, or "},{"kind":"code","text":"`1`"},{"kind":"text","text":" if not present."}]},"type":{"type":"union","types":[{"type":"literal","value":null},{"type":"intrinsic","name":"number"}]},"defaultValue":"null"},{"name":"localUri","kind":1024,"comment":{"summary":[{"kind":"text","text":"If the asset has been downloaded (by calling ["},{"kind":"code","text":"`downloadAsync()`"},{"kind":"text","text":"](#downloadasync)), the\n"},{"kind":"code","text":"`file://`"},{"kind":"text","text":" URI pointing to the local file on the device that contains the asset data."}]},"type":{"type":"union","types":[{"type":"literal","value":null},{"type":"intrinsic","name":"string"}]},"defaultValue":"null"},{"name":"name","kind":1024,"comment":{"summary":[{"kind":"text","text":"The name of the asset file without the extension. Also without the part from "},{"kind":"code","text":"`@`"},{"kind":"text","text":" onward in the\nfilename (used to specify scale factor for images)."}]},"type":{"type":"intrinsic","name":"string"}},{"name":"type","kind":1024,"comment":{"summary":[{"kind":"text","text":"The extension of the asset filename."}]},"type":{"type":"intrinsic","name":"string"}},{"name":"uri","kind":1024,"comment":{"summary":[{"kind":"text","text":"A URI that points to the asset's data on the remote server. When running the published version\nof your app, this refers to the location on Expo's asset server where Expo has stored your\nasset. When running the app from Expo CLI during development, this URI points to Expo CLI's\nserver running on your computer and the asset is served directly from your computer. If you\nare not using Classic Updates (legacy), this field should be ignored as we ensure your assets\nare on device before before running your application logic."}]},"type":{"type":"intrinsic","name":"string"}},{"name":"width","kind":1024,"comment":{"summary":[{"kind":"text","text":"If the asset is an image, the width of the image data divided by the scale factor. The scale\nfactor is the number after "},{"kind":"code","text":"`@`"},{"kind":"text","text":" in the filename, or "},{"kind":"code","text":"`1`"},{"kind":"text","text":" if not present."}]},"type":{"type":"union","types":[{"type":"literal","value":null},{"type":"intrinsic","name":"number"}]},"defaultValue":"null"},{"name":"downloadAsync","kind":2048,"signatures":[{"name":"downloadAsync","kind":4096,"comment":{"summary":[{"kind":"text","text":"Downloads the asset data to a local file in the device's cache directory. Once the returned\npromise is fulfilled without error, the ["},{"kind":"code","text":"`localUri`"},{"kind":"text","text":"](#assetlocaluri) field of this asset points\nto a local file containing the asset data. The asset is only downloaded if an up-to-date local\nfile for the asset isn't already present due to an earlier download. The downloaded "},{"kind":"code","text":"`Asset`"},{"kind":"text","text":"\nwill be returned when the promise is resolved."}],"blockTags":[{"tag":"@returns","content":[{"kind":"text","text":"Returns a Promise which fulfills with an "},{"kind":"code","text":"`Asset`"},{"kind":"text","text":" instance."}]}]},"type":{"type":"reference","typeArguments":[{"type":"reference","name":"Asset"}],"name":"Promise","qualifiedName":"Promise","package":"typescript"}}]},{"name":"fromMetadata","kind":2048,"flags":{"isStatic":true},"signatures":[{"name":"fromMetadata","kind":4096,"parameters":[{"name":"meta","kind":32768,"type":{"type":"reference","name":"AssetMetadata"}}],"type":{"type":"reference","name":"Asset"}}]},{"name":"fromModule","kind":2048,"flags":{"isStatic":true},"signatures":[{"name":"fromModule","kind":4096,"comment":{"summary":[{"kind":"text","text":"Returns the ["},{"kind":"code","text":"`Asset`"},{"kind":"text","text":"](#asset) instance representing an asset given its module or URL."}],"blockTags":[{"tag":"@returns","content":[{"kind":"text","text":"The ["},{"kind":"code","text":"`Asset`"},{"kind":"text","text":"](#asset) instance for the asset."}]}]},"parameters":[{"name":"virtualAssetModule","kind":32768,"comment":{"summary":[{"kind":"text","text":"The value of "},{"kind":"code","text":"`require('path/to/file')`"},{"kind":"text","text":" for the asset or external\nnetwork URL"}]},"type":{"type":"union","types":[{"type":"intrinsic","name":"string"},{"type":"intrinsic","name":"number"}]}}],"type":{"type":"reference","name":"Asset"}}]},{"name":"fromURI","kind":2048,"flags":{"isStatic":true},"signatures":[{"name":"fromURI","kind":4096,"parameters":[{"name":"uri","kind":32768,"type":{"type":"intrinsic","name":"string"}}],"type":{"type":"reference","name":"Asset"}}]},{"name":"loadAsync","kind":2048,"flags":{"isStatic":true},"signatures":[{"name":"loadAsync","kind":4096,"comment":{"summary":[{"kind":"text","text":"A helper that wraps "},{"kind":"code","text":"`Asset.fromModule(module).downloadAsync`"},{"kind":"text","text":" for convenience."}],"blockTags":[{"tag":"@returns","content":[{"kind":"text","text":"Returns a Promise that fulfills with an array of "},{"kind":"code","text":"`Asset`"},{"kind":"text","text":"s when the asset(s) has been\nsaved to disk."}]},{"tag":"@example","content":[{"kind":"code","text":"```ts\nconst [{ localUri }] = await Asset.loadAsync(require('./assets/snack-icon.png'));\n```"}]}]},"parameters":[{"name":"moduleId","kind":32768,"comment":{"summary":[{"kind":"text","text":"An array of "},{"kind":"code","text":"`require('path/to/file')`"},{"kind":"text","text":" or external network URLs. Can also be\njust one module or URL without an Array."}]},"type":{"type":"union","types":[{"type":"intrinsic","name":"string"},{"type":"intrinsic","name":"number"},{"type":"array","elementType":{"type":"intrinsic","name":"number"}},{"type":"array","elementType":{"type":"intrinsic","name":"string"}}]}}],"type":{"type":"reference","typeArguments":[{"type":"array","elementType":{"type":"reference","name":"Asset"}}],"name":"Promise","qualifiedName":"Promise","package":"typescript"}}]}]},{"name":"AssetDescriptor","kind":4194304,"type":{"type":"reflection","declaration":{"name":"__type","kind":65536,"children":[{"name":"hash","kind":1024,"flags":{"isOptional":true},"type":{"type":"union","types":[{"type":"intrinsic","name":"string"},{"type":"literal","value":null}]}},{"name":"height","kind":1024,"flags":{"isOptional":true},"type":{"type":"union","types":[{"type":"intrinsic","name":"number"},{"type":"literal","value":null}]}},{"name":"name","kind":1024,"type":{"type":"intrinsic","name":"string"}},{"name":"type","kind":1024,"type":{"type":"intrinsic","name":"string"}},{"name":"uri","kind":1024,"type":{"type":"intrinsic","name":"string"}},{"name":"width","kind":1024,"flags":{"isOptional":true},"type":{"type":"union","types":[{"type":"intrinsic","name":"number"},{"type":"literal","value":null}]}}]}}},{"name":"AssetMetadata","kind":4194304,"type":{"type":"intersection","types":[{"type":"reference","typeArguments":[{"type":"reference","name":"PackagerAsset"},{"type":"union","types":[{"type":"literal","value":"httpServerLocation"},{"type":"literal","value":"name"},{"type":"literal","value":"hash"},{"type":"literal","value":"type"},{"type":"literal","value":"scales"},{"type":"literal","value":"width"},{"type":"literal","value":"height"}]}],"name":"Pick","qualifiedName":"Pick","package":"typescript"},{"type":"reflection","declaration":{"name":"__type","kind":65536,"children":[{"name":"fileHashes","kind":1024,"flags":{"isOptional":true},"type":{"type":"array","elementType":{"type":"intrinsic","name":"string"}}},{"name":"fileUris","kind":1024,"flags":{"isOptional":true},"type":{"type":"array","elementType":{"type":"intrinsic","name":"string"}}},{"name":"uri","kind":1024,"flags":{"isOptional":true},"type":{"type":"intrinsic","name":"string"}}]}}]}},{"name":"useAssets","kind":64,"signatures":[{"name":"useAssets","kind":4096,"comment":{"summary":[{"kind":"text","text":"Downloads and stores one or more assets locally.\nAfter the assets are loaded, this hook returns a list of asset instances.\nIf something went wrong when loading the assets, an error is returned.\n\n> Note, the assets are not \"reloaded\" when you dynamically change the asset list."}],"blockTags":[{"tag":"@returns","content":[{"kind":"text","text":"Returns an array containing:\n- on the first position, a list of all loaded assets. If they aren't loaded yet, this value is\n "},{"kind":"code","text":"`undefined`"},{"kind":"text","text":".\n- on the second position, an error which encountered when loading the assets. If there was no\n error, this value is "},{"kind":"code","text":"`undefined`"},{"kind":"text","text":"."}]},{"tag":"@example","content":[{"kind":"code","text":"```tsx\nconst [assets, error] = useAssets([require('path/to/asset.jpg'), require('path/to/other.png')]);\n\nreturn assets ? : null;\n```"}]}]},"parameters":[{"name":"moduleIds","kind":32768,"type":{"type":"union","types":[{"type":"intrinsic","name":"number"},{"type":"array","elementType":{"type":"intrinsic","name":"number"}}]}}],"type":{"type":"tuple","elements":[{"type":"union","types":[{"type":"array","elementType":{"type":"reference","name":"Asset"}},{"type":"intrinsic","name":"undefined"}]},{"type":"union","types":[{"type":"reference","name":"Error","qualifiedName":"Error","package":"typescript"},{"type":"intrinsic","name":"undefined"}]}]}}]}]}
\ No newline at end of file
diff --git a/docs/public/static/data/unversioned/expo-auth-session.json b/docs/public/static/data/unversioned/expo-auth-session.json
index 646a41eafec03..02a3da40b5be6 100644
--- a/docs/public/static/data/unversioned/expo-auth-session.json
+++ b/docs/public/static/data/unversioned/expo-auth-session.json
@@ -1 +1 @@
-{"name":"expo-auth-session","kind":1,"children":[{"name":"CodeChallengeMethod","kind":8,"children":[{"name":"Plain","kind":16,"comment":{"summary":[{"kind":"text","text":"This should not be used. When used, the code verifier will be sent to the server as-is."}]},"type":{"type":"literal","value":"plain"}},{"name":"S256","kind":16,"comment":{"summary":[{"kind":"text","text":"The default and recommended method for transforming the code verifier.\n- Convert the code verifier to ASCII.\n- Create a digest of the string using crypto method SHA256.\n- Convert the digest to Base64 and URL encode it."}]},"type":{"type":"literal","value":"S256"}}]},{"name":"GrantType","kind":8,"comment":{"summary":[{"kind":"text","text":"Grant type values used in dynamic client registration and auth requests."}],"blockTags":[{"tag":"@see","content":[{"kind":"text","text":"[Appendix A.10](https://tools.ietf.org/html/rfc6749#appendix-A.10)"}]}]},"children":[{"name":"AuthorizationCode","kind":16,"comment":{"summary":[{"kind":"text","text":"Used for exchanging an authorization code for one or more tokens.\n\n[Section 4.1.3](https://tools.ietf.org/html/rfc6749#section-4.1.3)"}]},"type":{"type":"literal","value":"authorization_code"}},{"name":"ClientCredentials","kind":16,"comment":{"summary":[{"kind":"text","text":"Used for client credentials flow.\n\n[Section 4.4.2](https://tools.ietf.org/html/rfc6749#section-4.4.2)"}]},"type":{"type":"literal","value":"client_credentials"}},{"name":"Implicit","kind":16,"comment":{"summary":[{"kind":"text","text":"Used when obtaining an access token.\n\n[Section 4.2](https://tools.ietf.org/html/rfc6749#section-4.2)"}]},"type":{"type":"literal","value":"implicit"}},{"name":"RefreshToken","kind":16,"comment":{"summary":[{"kind":"text","text":"Used when exchanging a refresh token for a new token.\n\n[Section 6](https://tools.ietf.org/html/rfc6749#section-6)"}]},"type":{"type":"literal","value":"refresh_token"}}]},{"name":"Prompt","kind":8,"comment":{"summary":[{"kind":"text","text":"Informs the server if the user should be prompted to login or consent again.\nThis can be used to present a dialog for switching accounts after the user has already been logged in.\nYou should use this in favor of clearing cookies (which is mostly not possible on iOS)."}],"blockTags":[{"tag":"@see","content":[{"kind":"text","text":"[Section 3.1.2.1](https://openid.net/specs/openid-connect-core-1_0.html#AuthorizationRequest)."}]}]},"children":[{"name":"Consent","kind":16,"comment":{"summary":[{"kind":"text","text":"Server should prompt the user for consent before returning information to the client.\nIf it cannot obtain consent, it must return an error, typically "},{"kind":"code","text":"`consent_required`"},{"kind":"text","text":"."}]},"type":{"type":"literal","value":"consent"}},{"name":"Login","kind":16,"comment":{"summary":[{"kind":"text","text":"The server should prompt the user to reauthenticate.\nIf it cannot reauthenticate the End-User, it must return an error, typically "},{"kind":"code","text":"`login_required`"},{"kind":"text","text":"."}]},"type":{"type":"literal","value":"login"}},{"name":"None","kind":16,"comment":{"summary":[{"kind":"text","text":"Server must not display any auth or consent UI. Can be used to check for existing auth or consent.\nAn error is returned if a user isn't already authenticated or the client doesn't have pre-configured consent for the requested claims, or does not fulfill other conditions for processing the request.\nThe error code will typically be "},{"kind":"code","text":"`login_required`"},{"kind":"text","text":", "},{"kind":"code","text":"`interaction_required`"},{"kind":"text","text":", or another code defined in [Section 3.1.2.6](https://openid.net/specs/openid-connect-core-1_0.html#AuthError)."}]},"type":{"type":"literal","value":"none"}},{"name":"SelectAccount","kind":16,"comment":{"summary":[{"kind":"text","text":"Server should prompt the user to select an account. Can be used to switch accounts.\nIf it can't obtain an account selection choice made by the user, it must return an error, typically "},{"kind":"code","text":"`account_selection_required`"},{"kind":"text","text":"."}]},"type":{"type":"literal","value":"select_account"}}]},{"name":"ResponseType","kind":8,"comment":{"summary":[{"kind":"text","text":"The client informs the authorization server of the desired grant type by using the response type."}],"blockTags":[{"tag":"@see","content":[{"kind":"text","text":"[Section 3.1.1](https://tools.ietf.org/html/rfc6749#section-3.1.1)."}]}]},"children":[{"name":"Code","kind":16,"comment":{"summary":[{"kind":"text","text":"For requesting an authorization code as described by [Section 4.1.1](https://tools.ietf.org/html/rfc6749#section-4.1.1)."}]},"type":{"type":"literal","value":"code"}},{"name":"IdToken","kind":16,"comment":{"summary":[{"kind":"text","text":"A custom registered type for getting an "},{"kind":"code","text":"`id_token`"},{"kind":"text","text":" from Google OAuth."}]},"type":{"type":"literal","value":"id_token"}},{"name":"Token","kind":16,"comment":{"summary":[{"kind":"text","text":"For requesting an access token (implicit grant) as described by [Section 4.2.1](https://tools.ietf.org/html/rfc6749#section-4.2.1)."}]},"type":{"type":"literal","value":"token"}}]},{"name":"TokenTypeHint","kind":8,"comment":{"summary":[{"kind":"text","text":"A hint about the type of the token submitted for revocation. If not included then the server should attempt to deduce the token type."}],"blockTags":[{"tag":"@see","content":[{"kind":"text","text":"[Section 2.1](https://tools.ietf.org/html/rfc7009#section-2.1)"}]}]},"children":[{"name":"AccessToken","kind":16,"comment":{"summary":[{"kind":"text","text":"Access token.\n\n[Section 1.4](https://tools.ietf.org/html/rfc6749#section-1.4)"}]},"type":{"type":"literal","value":"access_token"}},{"name":"RefreshToken","kind":16,"comment":{"summary":[{"kind":"text","text":"Refresh token.\n\n[Section 1.5](https://tools.ietf.org/html/rfc6749#section-1.5)"}]},"type":{"type":"literal","value":"refresh_token"}}]},{"name":"AccessTokenRequest","kind":128,"comment":{"summary":[{"kind":"text","text":"Access token request. Exchange an authorization code for a user access token.\n\n[Section 4.1.3](https://tools.ietf.org/html/rfc6749#section-4.1.3)"}]},"children":[{"name":"constructor","kind":512,"signatures":[{"name":"new AccessTokenRequest","kind":16384,"parameters":[{"name":"options","kind":32768,"type":{"type":"reference","name":"AccessTokenRequestConfig"}}],"type":{"type":"reference","name":"AccessTokenRequest"},"overwrites":{"type":"reference","name":"TokenRequest.constructor"}}],"overwrites":{"type":"reference","name":"TokenRequest.constructor"}},{"name":"clientId","kind":1024,"flags":{"isReadonly":true},"comment":{"summary":[{"kind":"text","text":"A unique string representing the registration information provided by the client.\nThe client identifier is not a secret; it is exposed to the resource owner and shouldn't be used\nalone for client authentication.\n\nThe client identifier is unique to the authorization server.\n\n[Section 2.2](https://tools.ietf.org/html/rfc6749#section-2.2)"}]},"type":{"type":"intrinsic","name":"string"},"inheritedFrom":{"type":"reference","name":"TokenRequest.clientId"},"implementationOf":{"type":"reference","name":"AccessTokenRequestConfig.clientId"}},{"name":"clientSecret","kind":1024,"flags":{"isOptional":true,"isReadonly":true},"comment":{"summary":[{"kind":"text","text":"Client secret supplied by an auth provider.\nThere is no secure way to store this on the client.\n\n[Section 2.3.1](https://tools.ietf.org/html/rfc6749#section-2.3.1)"}]},"type":{"type":"intrinsic","name":"string"},"inheritedFrom":{"type":"reference","name":"TokenRequest.clientSecret"},"implementationOf":{"type":"reference","name":"AccessTokenRequestConfig.clientSecret"}},{"name":"code","kind":1024,"flags":{"isReadonly":true},"comment":{"summary":[{"kind":"text","text":"The authorization code received from the authorization server."}]},"type":{"type":"intrinsic","name":"string"},"implementationOf":{"type":"reference","name":"AccessTokenRequestConfig.code"}},{"name":"extraParams","kind":1024,"flags":{"isOptional":true,"isReadonly":true},"comment":{"summary":[{"kind":"text","text":"Extra query params that'll be added to the query string."}]},"type":{"type":"reference","typeArguments":[{"type":"intrinsic","name":"string"},{"type":"intrinsic","name":"string"}],"name":"Record","qualifiedName":"Record","package":"typescript"},"inheritedFrom":{"type":"reference","name":"TokenRequest.extraParams"},"implementationOf":{"type":"reference","name":"AccessTokenRequestConfig.extraParams"}},{"name":"grantType","kind":1024,"flags":{"isPublic":true},"type":{"type":"reference","name":"GrantType"},"inheritedFrom":{"type":"reference","name":"TokenRequest.grantType"}},{"name":"redirectUri","kind":1024,"flags":{"isReadonly":true},"comment":{"summary":[{"kind":"text","text":"If the "},{"kind":"code","text":"`redirectUri`"},{"kind":"text","text":" parameter was included in the "},{"kind":"code","text":"`AuthRequest`"},{"kind":"text","text":", then it must be supplied here as well.\n\n[Section 3.1.2](https://tools.ietf.org/html/rfc6749#section-3.1.2)"}]},"type":{"type":"intrinsic","name":"string"},"implementationOf":{"type":"reference","name":"AccessTokenRequestConfig.redirectUri"}},{"name":"scopes","kind":1024,"flags":{"isOptional":true,"isReadonly":true},"comment":{"summary":[{"kind":"text","text":"List of strings to request access to.\n\n[Section 3.3](https://tools.ietf.org/html/rfc6749#section-3.3)"}]},"type":{"type":"array","elementType":{"type":"intrinsic","name":"string"}},"inheritedFrom":{"type":"reference","name":"TokenRequest.scopes"},"implementationOf":{"type":"reference","name":"AccessTokenRequestConfig.scopes"}},{"name":"getHeaders","kind":2048,"signatures":[{"name":"getHeaders","kind":4096,"type":{"type":"reference","name":"Headers"},"inheritedFrom":{"type":"reference","name":"TokenRequest.getHeaders"}}],"inheritedFrom":{"type":"reference","name":"TokenRequest.getHeaders"}},{"name":"getQueryBody","kind":2048,"signatures":[{"name":"getQueryBody","kind":4096,"type":{"type":"reference","typeArguments":[{"type":"intrinsic","name":"string"},{"type":"intrinsic","name":"string"}],"name":"Record","qualifiedName":"Record","package":"typescript"},"overwrites":{"type":"reference","name":"TokenRequest.getQueryBody"}}],"overwrites":{"type":"reference","name":"TokenRequest.getQueryBody"}},{"name":"getRequestConfig","kind":2048,"signatures":[{"name":"getRequestConfig","kind":4096,"type":{"type":"reflection","declaration":{"name":"__type","kind":65536,"children":[{"name":"clientId","kind":1024,"type":{"type":"intrinsic","name":"string"},"defaultValue":"..."},{"name":"clientSecret","kind":1024,"type":{"type":"union","types":[{"type":"intrinsic","name":"undefined"},{"type":"intrinsic","name":"string"}]},"defaultValue":"..."},{"name":"code","kind":1024,"type":{"type":"intrinsic","name":"string"},"defaultValue":"..."},{"name":"extraParams","kind":1024,"type":{"type":"union","types":[{"type":"intrinsic","name":"undefined"},{"type":"reference","typeArguments":[{"type":"intrinsic","name":"string"},{"type":"intrinsic","name":"string"}],"name":"Record","qualifiedName":"Record","package":"typescript"}]},"defaultValue":"..."},{"name":"grantType","kind":1024,"type":{"type":"reference","name":"GrantType"},"defaultValue":"..."},{"name":"redirectUri","kind":1024,"type":{"type":"intrinsic","name":"string"},"defaultValue":"..."},{"name":"scopes","kind":1024,"type":{"type":"union","types":[{"type":"intrinsic","name":"undefined"},{"type":"array","elementType":{"type":"intrinsic","name":"string"}}]},"defaultValue":"..."}]}},"overwrites":{"type":"reference","name":"TokenRequest.getRequestConfig"}}],"overwrites":{"type":"reference","name":"TokenRequest.getRequestConfig"}},{"name":"performAsync","kind":2048,"signatures":[{"name":"performAsync","kind":4096,"parameters":[{"name":"discovery","kind":32768,"type":{"type":"reference","typeArguments":[{"type":"reference","name":"DiscoveryDocument"},{"type":"literal","value":"tokenEndpoint"}],"name":"Pick","qualifiedName":"Pick","package":"typescript"}}],"type":{"type":"reference","typeArguments":[{"type":"reference","name":"TokenResponse"}],"name":"Promise","qualifiedName":"Promise","package":"typescript"},"inheritedFrom":{"type":"reference","name":"TokenRequest.performAsync"}}],"inheritedFrom":{"type":"reference","name":"TokenRequest.performAsync"}}],"extendedTypes":[{"type":"reference","typeArguments":[{"type":"reference","name":"AccessTokenRequestConfig"}],"name":"TokenRequest"}],"implementedTypes":[{"type":"reference","name":"AccessTokenRequestConfig"}]},{"name":"AuthError","kind":128,"comment":{"summary":[{"kind":"text","text":"Represents an authorization response error: [Section 5.2](https://tools.ietf.org/html/rfc6749#section-5.2).\nOften times providers will fail to return the proper error message for a given error code.\nThis error method will add the missing description for more context on what went wrong."}]},"children":[{"name":"constructor","kind":512,"signatures":[{"name":"new AuthError","kind":16384,"parameters":[{"name":"response","kind":32768,"type":{"type":"reference","name":"AuthErrorConfig"}}],"type":{"type":"reference","name":"AuthError"},"overwrites":{"type":"reference","name":"ResponseError.constructor"}}],"overwrites":{"type":"reference","name":"ResponseError.constructor"}},{"name":"code","kind":1024,"type":{"type":"intrinsic","name":"string"},"inheritedFrom":{"type":"reference","name":"ResponseError.code"}},{"name":"description","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"Used to assist the client developer in\nunderstanding the error that occurred."}]},"type":{"type":"intrinsic","name":"string"},"inheritedFrom":{"type":"reference","name":"ResponseError.description"}},{"name":"info","kind":1024,"flags":{"isOptional":true},"type":{"type":"intrinsic","name":"any"},"inheritedFrom":{"type":"reference","name":"ResponseError.info"}},{"name":"params","kind":1024,"comment":{"summary":[{"kind":"text","text":"Raw results of the error."}]},"type":{"type":"reference","typeArguments":[{"type":"intrinsic","name":"string"},{"type":"intrinsic","name":"string"}],"name":"Record","qualifiedName":"Record","package":"typescript"},"inheritedFrom":{"type":"reference","name":"ResponseError.params"}},{"name":"state","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"Required only if state is used in the initial request"}]},"type":{"type":"intrinsic","name":"string"}},{"name":"uri","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"A URI identifying a human-readable web page with\ninformation about the error, used to provide the client\ndeveloper with additional information about the error."}]},"type":{"type":"intrinsic","name":"string"},"inheritedFrom":{"type":"reference","name":"ResponseError.uri"}}],"extendedTypes":[{"type":"reference","name":"ResponseError"}]},{"name":"AuthRequest","kind":128,"comment":{"summary":[{"kind":"text","text":"Used to manage an authorization request according to the OAuth spec: [Section 4.1.1](https://tools.ietf.org/html/rfc6749#section-4.1.1).\nYou can use this class directly for more info around the authorization.\n\n**Common use-cases:**\n\n- Parse a URL returned from the authorization server with "},{"kind":"code","text":"`parseReturnUrlAsync()`"},{"kind":"text","text":".\n- Get the built authorization URL with "},{"kind":"code","text":"`makeAuthUrlAsync()`"},{"kind":"text","text":".\n- Get a loaded JSON representation of the auth request with crypto state loaded with "},{"kind":"code","text":"`getAuthRequestConfigAsync()`"},{"kind":"text","text":"."}],"blockTags":[{"tag":"@example","content":[{"kind":"code","text":"```ts\n// Create a request.\nconst request = new AuthRequest({ ... });\n\n// Prompt for an auth code\nconst result = await request.promptAsync(discovery);\n\n// Get the URL to invoke\nconst url = await request.makeAuthUrlAsync(discovery);\n\n// Get the URL to invoke\nconst parsed = await request.parseReturnUrlAsync(\"\");\n```"}]}]},"children":[{"name":"constructor","kind":512,"signatures":[{"name":"new AuthRequest","kind":16384,"parameters":[{"name":"request","kind":32768,"type":{"type":"reference","name":"AuthRequestConfig"}}],"type":{"type":"reference","name":"AuthRequest"}}]},{"name":"clientId","kind":1024,"flags":{"isReadonly":true},"type":{"type":"intrinsic","name":"string"},"implementationOf":{"type":"reference","name":"Omit.clientId"}},{"name":"clientSecret","kind":1024,"flags":{"isOptional":true,"isReadonly":true},"type":{"type":"intrinsic","name":"string"},"implementationOf":{"type":"reference","name":"Omit.clientSecret"}},{"name":"codeChallenge","kind":1024,"flags":{"isPublic":true,"isOptional":true},"type":{"type":"intrinsic","name":"string"},"implementationOf":{"type":"reference","name":"Omit.codeChallenge"}},{"name":"codeChallengeMethod","kind":1024,"flags":{"isReadonly":true},"type":{"type":"reference","name":"CodeChallengeMethod"},"implementationOf":{"type":"reference","name":"Omit.codeChallengeMethod"}},{"name":"codeVerifier","kind":1024,"flags":{"isPublic":true,"isOptional":true},"type":{"type":"intrinsic","name":"string"}},{"name":"extraParams","kind":1024,"flags":{"isReadonly":true},"type":{"type":"reference","typeArguments":[{"type":"intrinsic","name":"string"},{"type":"intrinsic","name":"string"}],"name":"Record","qualifiedName":"Record","package":"typescript"},"implementationOf":{"type":"reference","name":"Omit.extraParams"}},{"name":"prompt","kind":1024,"flags":{"isOptional":true,"isReadonly":true},"type":{"type":"reference","name":"Prompt"},"implementationOf":{"type":"reference","name":"Omit.prompt"}},{"name":"redirectUri","kind":1024,"flags":{"isReadonly":true},"type":{"type":"intrinsic","name":"string"},"implementationOf":{"type":"reference","name":"Omit.redirectUri"}},{"name":"responseType","kind":1024,"flags":{"isReadonly":true},"type":{"type":"intrinsic","name":"string"},"implementationOf":{"type":"reference","name":"Omit.responseType"}},{"name":"scopes","kind":1024,"flags":{"isOptional":true,"isReadonly":true},"type":{"type":"array","elementType":{"type":"intrinsic","name":"string"}},"implementationOf":{"type":"reference","name":"Omit.scopes"}},{"name":"state","kind":1024,"flags":{"isPublic":true},"comment":{"summary":[{"kind":"text","text":"Used for protection against [Cross-Site Request Forgery](https://tools.ietf.org/html/rfc6749#section-10.12)."}]},"type":{"type":"intrinsic","name":"string"}},{"name":"url","kind":1024,"flags":{"isPublic":true},"type":{"type":"union","types":[{"type":"literal","value":null},{"type":"intrinsic","name":"string"}]},"defaultValue":"null"},{"name":"usePKCE","kind":1024,"flags":{"isOptional":true,"isReadonly":true},"type":{"type":"intrinsic","name":"boolean"},"implementationOf":{"type":"reference","name":"Omit.usePKCE"}},{"name":"getAuthRequestConfigAsync","kind":2048,"signatures":[{"name":"getAuthRequestConfigAsync","kind":4096,"comment":{"summary":[{"kind":"text","text":"Load and return a valid auth request based on the input config."}]},"type":{"type":"reference","typeArguments":[{"type":"reference","name":"AuthRequestConfig"}],"name":"Promise","qualifiedName":"Promise","package":"typescript"}}]},{"name":"makeAuthUrlAsync","kind":2048,"signatures":[{"name":"makeAuthUrlAsync","kind":4096,"comment":{"summary":[{"kind":"text","text":"Create the URL for authorization."}]},"parameters":[{"name":"discovery","kind":32768,"type":{"type":"reference","name":"AuthDiscoveryDocument"}}],"type":{"type":"reference","typeArguments":[{"type":"intrinsic","name":"string"}],"name":"Promise","qualifiedName":"Promise","package":"typescript"}}]},{"name":"parseReturnUrl","kind":2048,"signatures":[{"name":"parseReturnUrl","kind":4096,"parameters":[{"name":"url","kind":32768,"type":{"type":"intrinsic","name":"string"}}],"type":{"type":"reference","name":"AuthSessionResult"}}]},{"name":"promptAsync","kind":2048,"signatures":[{"name":"promptAsync","kind":4096,"comment":{"summary":[{"kind":"text","text":"Prompt a user to authorize for a code."}]},"parameters":[{"name":"discovery","kind":32768,"type":{"type":"reference","name":"AuthDiscoveryDocument"}},{"name":"promptOptions","kind":32768,"type":{"type":"reference","name":"AuthRequestPromptOptions"},"defaultValue":"{}"}],"type":{"type":"reference","typeArguments":[{"type":"reference","name":"AuthSessionResult"}],"name":"Promise","qualifiedName":"Promise","package":"typescript"}}]}],"implementedTypes":[{"type":"reference","typeArguments":[{"type":"reference","name":"AuthRequestConfig"},{"type":"literal","value":"state"}],"name":"Omit","qualifiedName":"Omit","package":"typescript"}]},{"name":"RefreshTokenRequest","kind":128,"comment":{"summary":[{"kind":"text","text":"Refresh request.\n\n[Section 6](https://tools.ietf.org/html/rfc6749#section-6)"}]},"children":[{"name":"constructor","kind":512,"signatures":[{"name":"new RefreshTokenRequest","kind":16384,"parameters":[{"name":"options","kind":32768,"type":{"type":"reference","name":"RefreshTokenRequestConfig"}}],"type":{"type":"reference","name":"RefreshTokenRequest"},"overwrites":{"type":"reference","name":"TokenRequest.constructor"}}],"overwrites":{"type":"reference","name":"TokenRequest.constructor"}},{"name":"clientId","kind":1024,"flags":{"isReadonly":true},"comment":{"summary":[{"kind":"text","text":"A unique string representing the registration information provided by the client.\nThe client identifier is not a secret; it is exposed to the resource owner and shouldn't be used\nalone for client authentication.\n\nThe client identifier is unique to the authorization server.\n\n[Section 2.2](https://tools.ietf.org/html/rfc6749#section-2.2)"}]},"type":{"type":"intrinsic","name":"string"},"inheritedFrom":{"type":"reference","name":"TokenRequest.clientId"},"implementationOf":{"type":"reference","name":"RefreshTokenRequestConfig.clientId"}},{"name":"clientSecret","kind":1024,"flags":{"isOptional":true,"isReadonly":true},"comment":{"summary":[{"kind":"text","text":"Client secret supplied by an auth provider.\nThere is no secure way to store this on the client.\n\n[Section 2.3.1](https://tools.ietf.org/html/rfc6749#section-2.3.1)"}]},"type":{"type":"intrinsic","name":"string"},"inheritedFrom":{"type":"reference","name":"TokenRequest.clientSecret"},"implementationOf":{"type":"reference","name":"RefreshTokenRequestConfig.clientSecret"}},{"name":"extraParams","kind":1024,"flags":{"isOptional":true,"isReadonly":true},"comment":{"summary":[{"kind":"text","text":"Extra query params that'll be added to the query string."}]},"type":{"type":"reference","typeArguments":[{"type":"intrinsic","name":"string"},{"type":"intrinsic","name":"string"}],"name":"Record","qualifiedName":"Record","package":"typescript"},"inheritedFrom":{"type":"reference","name":"TokenRequest.extraParams"},"implementationOf":{"type":"reference","name":"RefreshTokenRequestConfig.extraParams"}},{"name":"grantType","kind":1024,"flags":{"isPublic":true},"type":{"type":"reference","name":"GrantType"},"inheritedFrom":{"type":"reference","name":"TokenRequest.grantType"}},{"name":"refreshToken","kind":1024,"flags":{"isOptional":true,"isReadonly":true},"comment":{"summary":[{"kind":"text","text":"The refresh token issued to the client."}]},"type":{"type":"intrinsic","name":"string"},"implementationOf":{"type":"reference","name":"RefreshTokenRequestConfig.refreshToken"}},{"name":"scopes","kind":1024,"flags":{"isOptional":true,"isReadonly":true},"comment":{"summary":[{"kind":"text","text":"List of strings to request access to.\n\n[Section 3.3](https://tools.ietf.org/html/rfc6749#section-3.3)"}]},"type":{"type":"array","elementType":{"type":"intrinsic","name":"string"}},"inheritedFrom":{"type":"reference","name":"TokenRequest.scopes"},"implementationOf":{"type":"reference","name":"RefreshTokenRequestConfig.scopes"}},{"name":"getHeaders","kind":2048,"signatures":[{"name":"getHeaders","kind":4096,"type":{"type":"reference","name":"Headers"},"inheritedFrom":{"type":"reference","name":"TokenRequest.getHeaders"}}],"inheritedFrom":{"type":"reference","name":"TokenRequest.getHeaders"}},{"name":"getQueryBody","kind":2048,"signatures":[{"name":"getQueryBody","kind":4096,"type":{"type":"reference","typeArguments":[{"type":"intrinsic","name":"string"},{"type":"intrinsic","name":"string"}],"name":"Record","qualifiedName":"Record","package":"typescript"},"overwrites":{"type":"reference","name":"TokenRequest.getQueryBody"}}],"overwrites":{"type":"reference","name":"TokenRequest.getQueryBody"}},{"name":"getRequestConfig","kind":2048,"signatures":[{"name":"getRequestConfig","kind":4096,"type":{"type":"reflection","declaration":{"name":"__type","kind":65536,"children":[{"name":"clientId","kind":1024,"type":{"type":"intrinsic","name":"string"},"defaultValue":"..."},{"name":"clientSecret","kind":1024,"type":{"type":"union","types":[{"type":"intrinsic","name":"undefined"},{"type":"intrinsic","name":"string"}]},"defaultValue":"..."},{"name":"extraParams","kind":1024,"type":{"type":"union","types":[{"type":"intrinsic","name":"undefined"},{"type":"reference","typeArguments":[{"type":"intrinsic","name":"string"},{"type":"intrinsic","name":"string"}],"name":"Record","qualifiedName":"Record","package":"typescript"}]},"defaultValue":"..."},{"name":"grantType","kind":1024,"type":{"type":"reference","name":"GrantType"},"defaultValue":"..."},{"name":"refreshToken","kind":1024,"type":{"type":"union","types":[{"type":"intrinsic","name":"undefined"},{"type":"intrinsic","name":"string"}]},"defaultValue":"..."},{"name":"scopes","kind":1024,"type":{"type":"union","types":[{"type":"intrinsic","name":"undefined"},{"type":"array","elementType":{"type":"intrinsic","name":"string"}}]},"defaultValue":"..."}]}},"overwrites":{"type":"reference","name":"TokenRequest.getRequestConfig"}}],"overwrites":{"type":"reference","name":"TokenRequest.getRequestConfig"}},{"name":"performAsync","kind":2048,"signatures":[{"name":"performAsync","kind":4096,"parameters":[{"name":"discovery","kind":32768,"type":{"type":"reference","typeArguments":[{"type":"reference","name":"DiscoveryDocument"},{"type":"literal","value":"tokenEndpoint"}],"name":"Pick","qualifiedName":"Pick","package":"typescript"}}],"type":{"type":"reference","typeArguments":[{"type":"reference","name":"TokenResponse"}],"name":"Promise","qualifiedName":"Promise","package":"typescript"},"inheritedFrom":{"type":"reference","name":"TokenRequest.performAsync"}}],"inheritedFrom":{"type":"reference","name":"TokenRequest.performAsync"}}],"extendedTypes":[{"type":"reference","typeArguments":[{"type":"reference","name":"RefreshTokenRequestConfig"}],"name":"TokenRequest"}],"implementedTypes":[{"type":"reference","name":"RefreshTokenRequestConfig"}]},{"name":"RevokeTokenRequest","kind":128,"comment":{"summary":[{"kind":"text","text":"Revocation request for a given token.\n\n[Section 2.1](https://tools.ietf.org/html/rfc7009#section-2.1)"}]},"children":[{"name":"constructor","kind":512,"signatures":[{"name":"new RevokeTokenRequest","kind":16384,"parameters":[{"name":"request","kind":32768,"type":{"type":"reference","name":"RevokeTokenRequestConfig"}}],"type":{"type":"reference","name":"RevokeTokenRequest"},"overwrites":{"type":"reference","name":"Request.constructor"}}],"overwrites":{"type":"reference","name":"Request.constructor"}},{"name":"clientId","kind":1024,"flags":{"isOptional":true,"isReadonly":true},"comment":{"summary":[{"kind":"text","text":"A unique string representing the registration information provided by the client.\nThe client identifier is not a secret; it is exposed to the resource owner and shouldn't be used\nalone for client authentication.\n\nThe client identifier is unique to the authorization server.\n\n[Section 2.2](https://tools.ietf.org/html/rfc6749#section-2.2)"}]},"type":{"type":"intrinsic","name":"string"},"implementationOf":{"type":"reference","name":"RevokeTokenRequestConfig.clientId"}},{"name":"clientSecret","kind":1024,"flags":{"isOptional":true,"isReadonly":true},"comment":{"summary":[{"kind":"text","text":"Client secret supplied by an auth provider.\nThere is no secure way to store this on the client.\n\n[Section 2.3.1](https://tools.ietf.org/html/rfc6749#section-2.3.1)"}]},"type":{"type":"intrinsic","name":"string"},"implementationOf":{"type":"reference","name":"RevokeTokenRequestConfig.clientSecret"}},{"name":"token","kind":1024,"flags":{"isReadonly":true},"comment":{"summary":[{"kind":"text","text":"The token that the client wants to get revoked.\n\n[Section 3.1](https://tools.ietf.org/html/rfc6749#section-3.1)"}]},"type":{"type":"intrinsic","name":"string"},"implementationOf":{"type":"reference","name":"RevokeTokenRequestConfig.token"}},{"name":"tokenTypeHint","kind":1024,"flags":{"isOptional":true,"isReadonly":true},"comment":{"summary":[{"kind":"text","text":"A hint about the type of the token submitted for revocation.\n\n[Section 3.2](https://tools.ietf.org/html/rfc6749#section-3.2)"}]},"type":{"type":"reference","name":"TokenTypeHint"},"implementationOf":{"type":"reference","name":"RevokeTokenRequestConfig.tokenTypeHint"}},{"name":"getHeaders","kind":2048,"signatures":[{"name":"getHeaders","kind":4096,"type":{"type":"reference","name":"Headers"}}]},{"name":"getQueryBody","kind":2048,"signatures":[{"name":"getQueryBody","kind":4096,"type":{"type":"reference","typeArguments":[{"type":"intrinsic","name":"string"},{"type":"intrinsic","name":"string"}],"name":"Record","qualifiedName":"Record","package":"typescript"},"overwrites":{"type":"reference","name":"Request.getQueryBody"}}],"overwrites":{"type":"reference","name":"Request.getQueryBody"}},{"name":"getRequestConfig","kind":2048,"signatures":[{"name":"getRequestConfig","kind":4096,"type":{"type":"reflection","declaration":{"name":"__type","kind":65536,"children":[{"name":"clientId","kind":1024,"type":{"type":"union","types":[{"type":"intrinsic","name":"undefined"},{"type":"intrinsic","name":"string"}]},"defaultValue":"..."},{"name":"clientSecret","kind":1024,"type":{"type":"union","types":[{"type":"intrinsic","name":"undefined"},{"type":"intrinsic","name":"string"}]},"defaultValue":"..."},{"name":"token","kind":1024,"type":{"type":"intrinsic","name":"string"},"defaultValue":"..."},{"name":"tokenTypeHint","kind":1024,"type":{"type":"union","types":[{"type":"intrinsic","name":"undefined"},{"type":"reference","name":"TokenTypeHint"}]},"defaultValue":"..."}]}},"overwrites":{"type":"reference","name":"Request.getRequestConfig"}}],"overwrites":{"type":"reference","name":"Request.getRequestConfig"}},{"name":"performAsync","kind":2048,"signatures":[{"name":"performAsync","kind":4096,"comment":{"summary":[{"kind":"text","text":"Perform a token revocation request."}]},"parameters":[{"name":"discovery","kind":32768,"comment":{"summary":[{"kind":"text","text":"The "},{"kind":"code","text":"`revocationEndpoint`"},{"kind":"text","text":" for a provider."}]},"type":{"type":"reference","typeArguments":[{"type":"reference","name":"DiscoveryDocument"},{"type":"literal","value":"revocationEndpoint"}],"name":"Pick","qualifiedName":"Pick","package":"typescript"}}],"type":{"type":"reference","typeArguments":[{"type":"intrinsic","name":"boolean"}],"name":"Promise","qualifiedName":"Promise","package":"typescript"},"overwrites":{"type":"reference","name":"Request.performAsync"}}],"overwrites":{"type":"reference","name":"Request.performAsync"}}],"extendedTypes":[{"type":"reference","typeArguments":[{"type":"reference","name":"RevokeTokenRequestConfig"},{"type":"intrinsic","name":"boolean"}],"name":"Request"}],"implementedTypes":[{"type":"reference","name":"RevokeTokenRequestConfig"}]},{"name":"TokenError","kind":128,"comment":{"summary":[{"kind":"text","text":"[Section 4.1.2.1](https://tools.ietf.org/html/rfc6749#section-4.1.2.1)"}]},"children":[{"name":"constructor","kind":512,"signatures":[{"name":"new TokenError","kind":16384,"parameters":[{"name":"response","kind":32768,"type":{"type":"reference","name":"ResponseErrorConfig"}}],"type":{"type":"reference","name":"TokenError"},"overwrites":{"type":"reference","name":"ResponseError.constructor"}}],"overwrites":{"type":"reference","name":"ResponseError.constructor"}},{"name":"code","kind":1024,"type":{"type":"intrinsic","name":"string"},"inheritedFrom":{"type":"reference","name":"ResponseError.code"}},{"name":"description","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"Used to assist the client developer in\nunderstanding the error that occurred."}]},"type":{"type":"intrinsic","name":"string"},"inheritedFrom":{"type":"reference","name":"ResponseError.description"}},{"name":"info","kind":1024,"flags":{"isOptional":true},"type":{"type":"intrinsic","name":"any"},"inheritedFrom":{"type":"reference","name":"ResponseError.info"}},{"name":"params","kind":1024,"comment":{"summary":[{"kind":"text","text":"Raw results of the error."}]},"type":{"type":"reference","typeArguments":[{"type":"intrinsic","name":"string"},{"type":"intrinsic","name":"string"}],"name":"Record","qualifiedName":"Record","package":"typescript"},"inheritedFrom":{"type":"reference","name":"ResponseError.params"}},{"name":"uri","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"A URI identifying a human-readable web page with\ninformation about the error, used to provide the client\ndeveloper with additional information about the error."}]},"type":{"type":"intrinsic","name":"string"},"inheritedFrom":{"type":"reference","name":"ResponseError.uri"}}],"extendedTypes":[{"type":"reference","name":"ResponseError"}]},{"name":"TokenResponse","kind":128,"comment":{"summary":[{"kind":"text","text":"Token Response.\n\n[Section 5.1](https://tools.ietf.org/html/rfc6749#section-5.1)"}]},"children":[{"name":"constructor","kind":512,"signatures":[{"name":"new TokenResponse","kind":16384,"parameters":[{"name":"response","kind":32768,"type":{"type":"reference","name":"TokenResponseConfig"}}],"type":{"type":"reference","name":"TokenResponse"}}]},{"name":"accessToken","kind":1024,"comment":{"summary":[{"kind":"text","text":"The access token issued by the authorization server.\n\n[Section 4.2.2](https://tools.ietf.org/html/rfc6749#section-4.2.2)"}]},"type":{"type":"intrinsic","name":"string"},"implementationOf":{"type":"reference","name":"TokenResponseConfig.accessToken"}},{"name":"expiresIn","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"The lifetime in seconds of the access token.\n\nFor example, the value "},{"kind":"code","text":"`3600`"},{"kind":"text","text":" denotes that the access token will\nexpire in one hour from the time the response was generated.\n\nIf omitted, the authorization server should provide the\nexpiration time via other means or document the default value.\n\n[Section 4.2.2](https://tools.ietf.org/html/rfc6749#section-4.2.2)"}]},"type":{"type":"intrinsic","name":"number"},"implementationOf":{"type":"reference","name":"TokenResponseConfig.expiresIn"}},{"name":"idToken","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"ID Token value associated with the authenticated session.\n\n[TokenResponse](https://openid.net/specs/openid-connect-core-1_0.html#TokenResponse)"}]},"type":{"type":"intrinsic","name":"string"},"implementationOf":{"type":"reference","name":"TokenResponseConfig.idToken"}},{"name":"issuedAt","kind":1024,"comment":{"summary":[{"kind":"text","text":"Time in seconds when the token was received by the client."}]},"type":{"type":"intrinsic","name":"number"},"implementationOf":{"type":"reference","name":"TokenResponseConfig.issuedAt"}},{"name":"refreshToken","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"The refresh token, which can be used to obtain new access tokens using the same authorization grant.\n\n[Section 5.1](https://tools.ietf.org/html/rfc6749#section-5.1)"}]},"type":{"type":"intrinsic","name":"string"},"implementationOf":{"type":"reference","name":"TokenResponseConfig.refreshToken"}},{"name":"scope","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"The scope of the access token. Only required if it's different to the scope that was requested by the client.\n\n[Section 3.3](https://tools.ietf.org/html/rfc6749#section-3.3)"}]},"type":{"type":"intrinsic","name":"string"},"implementationOf":{"type":"reference","name":"TokenResponseConfig.scope"}},{"name":"state","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"Required if the \"state\" parameter was present in the client\nauthorization request. The exact value received from the client.\n\n[Section 4.2.2](https://tools.ietf.org/html/rfc6749#section-4.2.2)"}]},"type":{"type":"intrinsic","name":"string"},"implementationOf":{"type":"reference","name":"TokenResponseConfig.state"}},{"name":"tokenType","kind":1024,"comment":{"summary":[{"kind":"text","text":"The type of the token issued. Value is case insensitive.\n\n[Section 7.1](https://tools.ietf.org/html/rfc6749#section-7.1)"}]},"type":{"type":"reference","name":"TokenType"},"implementationOf":{"type":"reference","name":"TokenResponseConfig.tokenType"}},{"name":"getRequestConfig","kind":2048,"signatures":[{"name":"getRequestConfig","kind":4096,"type":{"type":"reference","name":"TokenResponseConfig"}}]},{"name":"refreshAsync","kind":2048,"signatures":[{"name":"refreshAsync","kind":4096,"parameters":[{"name":"config","kind":32768,"type":{"type":"reference","typeArguments":[{"type":"reference","name":"TokenRequestConfig"},{"type":"union","types":[{"type":"literal","value":"grantType"},{"type":"literal","value":"refreshToken"}]}],"name":"Omit","qualifiedName":"Omit","package":"typescript"}},{"name":"discovery","kind":32768,"type":{"type":"reference","typeArguments":[{"type":"reference","name":"DiscoveryDocument"},{"type":"literal","value":"tokenEndpoint"}],"name":"Pick","qualifiedName":"Pick","package":"typescript"}}],"type":{"type":"reference","typeArguments":[{"type":"reference","name":"TokenResponse"}],"name":"Promise","qualifiedName":"Promise","package":"typescript"}}]},{"name":"shouldRefresh","kind":2048,"signatures":[{"name":"shouldRefresh","kind":4096,"type":{"type":"intrinsic","name":"boolean"}}]},{"name":"fromQueryParams","kind":2048,"flags":{"isStatic":true},"signatures":[{"name":"fromQueryParams","kind":4096,"comment":{"summary":[{"kind":"text","text":"Creates a "},{"kind":"code","text":"`TokenResponse`"},{"kind":"text","text":" from query parameters returned from an "},{"kind":"code","text":"`AuthRequest`"},{"kind":"text","text":"."}]},"parameters":[{"name":"params","kind":32768,"type":{"type":"reference","typeArguments":[{"type":"intrinsic","name":"string"},{"type":"intrinsic","name":"any"}],"name":"Record","qualifiedName":"Record","package":"typescript"}}],"type":{"type":"reference","name":"TokenResponse"}}]},{"name":"isTokenFresh","kind":2048,"flags":{"isStatic":true},"signatures":[{"name":"isTokenFresh","kind":4096,"comment":{"summary":[{"kind":"text","text":"Determines whether a token refresh request must be made to refresh the tokens"}]},"parameters":[{"name":"token","kind":32768,"type":{"type":"reference","typeArguments":[{"type":"reference","name":"TokenResponse"},{"type":"union","types":[{"type":"literal","value":"expiresIn"},{"type":"literal","value":"issuedAt"}]}],"name":"Pick","qualifiedName":"Pick","package":"typescript"}},{"name":"secondsMargin","kind":32768,"type":{"type":"intrinsic","name":"number"},"defaultValue":"..."}],"type":{"type":"intrinsic","name":"boolean"}}]}],"implementedTypes":[{"type":"reference","name":"TokenResponseConfig"}]},{"name":"AccessTokenRequestConfig","kind":256,"comment":{"summary":[{"kind":"text","text":"Config used to exchange an authorization code for an access token."}],"blockTags":[{"tag":"@see","content":[{"kind":"text","text":"[Section 4.1.3](https://tools.ietf.org/html/rfc6749#section-4.1.3)"}]}]},"children":[{"name":"clientId","kind":1024,"comment":{"summary":[{"kind":"text","text":"A unique string representing the registration information provided by the client.\nThe client identifier is not a secret; it is exposed to the resource owner and shouldn't be used\nalone for client authentication.\n\nThe client identifier is unique to the authorization server.\n\n[Section 2.2](https://tools.ietf.org/html/rfc6749#section-2.2)"}]},"type":{"type":"intrinsic","name":"string"},"inheritedFrom":{"type":"reference","name":"TokenRequestConfig.clientId"}},{"name":"clientSecret","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"Client secret supplied by an auth provider.\nThere is no secure way to store this on the client.\n\n[Section 2.3.1](https://tools.ietf.org/html/rfc6749#section-2.3.1)"}]},"type":{"type":"intrinsic","name":"string"},"inheritedFrom":{"type":"reference","name":"TokenRequestConfig.clientSecret"}},{"name":"code","kind":1024,"comment":{"summary":[{"kind":"text","text":"The authorization code received from the authorization server."}]},"type":{"type":"intrinsic","name":"string"}},{"name":"extraParams","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"Extra query params that'll be added to the query string."}]},"type":{"type":"reference","typeArguments":[{"type":"intrinsic","name":"string"},{"type":"intrinsic","name":"string"}],"name":"Record","qualifiedName":"Record","package":"typescript"},"inheritedFrom":{"type":"reference","name":"TokenRequestConfig.extraParams"}},{"name":"redirectUri","kind":1024,"comment":{"summary":[{"kind":"text","text":"If the "},{"kind":"code","text":"`redirectUri`"},{"kind":"text","text":" parameter was included in the "},{"kind":"code","text":"`AuthRequest`"},{"kind":"text","text":", then it must be supplied here as well.\n\n[Section 3.1.2](https://tools.ietf.org/html/rfc6749#section-3.1.2)"}]},"type":{"type":"intrinsic","name":"string"}},{"name":"scopes","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"List of strings to request access to.\n\n[Section 3.3](https://tools.ietf.org/html/rfc6749#section-3.3)"}]},"type":{"type":"array","elementType":{"type":"intrinsic","name":"string"}},"inheritedFrom":{"type":"reference","name":"TokenRequestConfig.scopes"}}],"extendedTypes":[{"type":"reference","name":"TokenRequestConfig"}],"implementedBy":[{"type":"reference","name":"AccessTokenRequest"}]},{"name":"AuthRequestConfig","kind":256,"comment":{"summary":[{"kind":"text","text":"Represents an OAuth authorization request as JSON."}]},"children":[{"name":"clientId","kind":1024,"comment":{"summary":[{"kind":"text","text":"A unique string representing the registration information provided by the client.\nThe client identifier is not a secret; it is exposed to the resource owner and shouldn't be used\nalone for client authentication.\n\nThe client identifier is unique to the authorization server.\n\n[Section 2.2](https://tools.ietf.org/html/rfc6749#section-2.2)"}]},"type":{"type":"intrinsic","name":"string"}},{"name":"clientSecret","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"Client secret supplied by an auth provider.\nThere is no secure way to store this on the client.\n\n[Section 2.3.1](https://tools.ietf.org/html/rfc6749#section-2.3.1)"}]},"type":{"type":"intrinsic","name":"string"}},{"name":"codeChallenge","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"Derived from the code verifier by using the "},{"kind":"code","text":"`CodeChallengeMethod`"},{"kind":"text","text":".\n\n[Section 4.2](https://tools.ietf.org/html/rfc7636#section-4.2)"}]},"type":{"type":"intrinsic","name":"string"}},{"name":"codeChallengeMethod","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"Method used to generate the code challenge. You should never use "},{"kind":"code","text":"`Plain`"},{"kind":"text","text":" as it's not good enough for secure verification."}],"blockTags":[{"tag":"@default","content":[{"kind":"text","text":"CodeChallengeMethod.S256"}]}]},"type":{"type":"reference","name":"CodeChallengeMethod"}},{"name":"extraParams","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"Extra query params that'll be added to the query string."}]},"type":{"type":"reference","typeArguments":[{"type":"intrinsic","name":"string"},{"type":"intrinsic","name":"string"}],"name":"Record","qualifiedName":"Record","package":"typescript"}},{"name":"prompt","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"Informs the server if the user should be prompted to login or consent again.\nThis can be used to present a dialog for switching accounts after the user has already been logged in.\n\n[Section 3.1.2.1](https://openid.net/specs/openid-connect-core-1_0.html#AuthorizationRequest)"}]},"type":{"type":"reference","name":"Prompt"}},{"name":"redirectUri","kind":1024,"comment":{"summary":[{"kind":"text","text":"After completing an interaction with a resource owner the\nserver will redirect to this URI. Learn more about [linking in Expo](/guides/linking/).\n\n[Section 3.1.2](https://tools.ietf.org/html/rfc6749#section-3.1.2)"}]},"type":{"type":"intrinsic","name":"string"}},{"name":"responseType","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"Specifies what is returned from the authorization server.\n\n[Section 3.1.1](https://tools.ietf.org/html/rfc6749#section-3.1.1)"}],"blockTags":[{"tag":"@default","content":[{"kind":"text","text":"ResponseType.Code"}]}]},"type":{"type":"intrinsic","name":"string"}},{"name":"scopes","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"List of strings to request access to.\n\n[Section 3.3](https://tools.ietf.org/html/rfc6749#section-3.3)"}]},"type":{"type":"array","elementType":{"type":"intrinsic","name":"string"}}},{"name":"state","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"Used for protection against [Cross-Site Request Forgery](https://tools.ietf.org/html/rfc6749#section-10.12)."}]},"type":{"type":"intrinsic","name":"string"}},{"name":"usePKCE","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"Should use [Proof Key for Code Exchange](https://oauth.net/2/pkce/)."}],"blockTags":[{"tag":"@default","content":[{"kind":"text","text":"true"}]}]},"type":{"type":"intrinsic","name":"boolean"}}]},{"name":"DiscoveryDocument","kind":256,"children":[{"name":"authorizationEndpoint","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"Used to interact with the resource owner and obtain an authorization grant.\n\n[Section 3.1](https://tools.ietf.org/html/rfc6749#section-3.1)"}]},"type":{"type":"intrinsic","name":"string"}},{"name":"discoveryDocument","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"All metadata about the provider."}]},"type":{"type":"reference","name":"ProviderMetadata"}},{"name":"endSessionEndpoint","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"URL at the OP to which an RP can perform a redirect to request that the End-User be logged out at the OP.\n\n[OPMetadata](https://openid.net/specs/openid-connect-session-1_0-17.html#OPMetadata)"}]},"type":{"type":"intrinsic","name":"string"}},{"name":"registrationEndpoint","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"URL of the OP's [Dynamic Client Registration](https://openid.net/specs/openid-connect-discovery-1_0.html#OpenID.Registration) Endpoint."}]},"type":{"type":"intrinsic","name":"string"}},{"name":"revocationEndpoint","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"Used to revoke a token (generally for signing out). The spec requires a revocation endpoint,\nbut some providers (like Spotify) do not support one.\n\n[Section 2.1](https://tools.ietf.org/html/rfc7009#section-2.1)"}]},"type":{"type":"intrinsic","name":"string"}},{"name":"tokenEndpoint","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"Used by the client to obtain an access token by presenting its authorization grant or refresh token.\nThe token endpoint is used with every authorization grant except for the\nimplicit grant type (since an access token is issued directly).\n\n[Section 3.2](https://tools.ietf.org/html/rfc6749#section-3.2)"}]},"type":{"type":"intrinsic","name":"string"}},{"name":"userInfoEndpoint","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"URL of the OP's UserInfo Endpoint used to return info about the authenticated user.\n\n[UserInfo](https://openid.net/specs/openid-connect-core-1_0.html#UserInfo)"}]},"type":{"type":"intrinsic","name":"string"}}]},{"name":"FacebookAuthRequestConfig","kind":256,"children":[{"name":"androidClientId","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"Android native client ID for use in development builds and bare workflow."}]},"type":{"type":"intrinsic","name":"string"}},{"name":"clientId","kind":1024,"comment":{"summary":[{"kind":"text","text":"A unique string representing the registration information provided by the client.\nThe client identifier is not a secret; it is exposed to the resource owner and shouldn't be used\nalone for client authentication.\n\nThe client identifier is unique to the authorization server.\n\n[Section 2.2](https://tools.ietf.org/html/rfc6749#section-2.2)"}]},"type":{"type":"intrinsic","name":"string"},"inheritedFrom":{"type":"reference","name":"ProviderAuthRequestConfig.clientId"}},{"name":"clientSecret","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"Client secret supplied by an auth provider.\nThere is no secure way to store this on the client.\n\n[Section 2.3.1](https://tools.ietf.org/html/rfc6749#section-2.3.1)"}]},"type":{"type":"intrinsic","name":"string"},"inheritedFrom":{"type":"reference","name":"ProviderAuthRequestConfig.clientSecret"}},{"name":"codeChallenge","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"Derived from the code verifier by using the "},{"kind":"code","text":"`CodeChallengeMethod`"},{"kind":"text","text":".\n\n[Section 4.2](https://tools.ietf.org/html/rfc7636#section-4.2)"}]},"type":{"type":"intrinsic","name":"string"},"inheritedFrom":{"type":"reference","name":"ProviderAuthRequestConfig.codeChallenge"}},{"name":"codeChallengeMethod","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"Method used to generate the code challenge. You should never use "},{"kind":"code","text":"`Plain`"},{"kind":"text","text":" as it's not good enough for secure verification."}],"blockTags":[{"tag":"@default","content":[{"kind":"text","text":"CodeChallengeMethod.S256"}]}]},"type":{"type":"reference","name":"CodeChallengeMethod"},"inheritedFrom":{"type":"reference","name":"ProviderAuthRequestConfig.codeChallengeMethod"}},{"name":"expoClientId","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"Proxy client ID for use when testing with Expo Go on Android and iOS."}]},"type":{"type":"intrinsic","name":"string"}},{"name":"extraParams","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"Extra query params that'll be added to the query string."}]},"type":{"type":"reference","typeArguments":[{"type":"intrinsic","name":"string"},{"type":"intrinsic","name":"string"}],"name":"Record","qualifiedName":"Record","package":"typescript"},"inheritedFrom":{"type":"reference","name":"ProviderAuthRequestConfig.extraParams"}},{"name":"iosClientId","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"iOS native client ID for use in development builds and bare workflow."}]},"type":{"type":"intrinsic","name":"string"}},{"name":"language","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"Language for the sign in UI, in the form of ISO 639-1 language code optionally followed by a dash\nand ISO 3166-1 alpha-2 region code, such as 'it' or 'pt-PT'.\nOnly set this value if it's different from the system default (which you can access via expo-localization)."}]},"type":{"type":"intrinsic","name":"string"},"inheritedFrom":{"type":"reference","name":"ProviderAuthRequestConfig.language"}},{"name":"prompt","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"Informs the server if the user should be prompted to login or consent again.\nThis can be used to present a dialog for switching accounts after the user has already been logged in.\n\n[Section 3.1.2.1](https://openid.net/specs/openid-connect-core-1_0.html#AuthorizationRequest)"}]},"type":{"type":"reference","name":"Prompt"},"inheritedFrom":{"type":"reference","name":"ProviderAuthRequestConfig.prompt"}},{"name":"redirectUri","kind":1024,"comment":{"summary":[{"kind":"text","text":"After completing an interaction with a resource owner the\nserver will redirect to this URI. Learn more about [linking in Expo](/guides/linking/).\n\n[Section 3.1.2](https://tools.ietf.org/html/rfc6749#section-3.1.2)"}]},"type":{"type":"intrinsic","name":"string"},"inheritedFrom":{"type":"reference","name":"ProviderAuthRequestConfig.redirectUri"}},{"name":"responseType","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"Specifies what is returned from the authorization server.\n\n[Section 3.1.1](https://tools.ietf.org/html/rfc6749#section-3.1.1)"}],"blockTags":[{"tag":"@default","content":[{"kind":"text","text":"ResponseType.Code"}]}]},"type":{"type":"intrinsic","name":"string"},"inheritedFrom":{"type":"reference","name":"ProviderAuthRequestConfig.responseType"}},{"name":"scopes","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"List of strings to request access to.\n\n[Section 3.3](https://tools.ietf.org/html/rfc6749#section-3.3)"}]},"type":{"type":"array","elementType":{"type":"intrinsic","name":"string"}},"inheritedFrom":{"type":"reference","name":"ProviderAuthRequestConfig.scopes"}},{"name":"state","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"Used for protection against [Cross-Site Request Forgery](https://tools.ietf.org/html/rfc6749#section-10.12)."}]},"type":{"type":"intrinsic","name":"string"},"inheritedFrom":{"type":"reference","name":"ProviderAuthRequestConfig.state"}},{"name":"usePKCE","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"Should use [Proof Key for Code Exchange](https://oauth.net/2/pkce/)."}],"blockTags":[{"tag":"@default","content":[{"kind":"text","text":"true"}]}]},"type":{"type":"intrinsic","name":"boolean"},"inheritedFrom":{"type":"reference","name":"ProviderAuthRequestConfig.usePKCE"}},{"name":"webClientId","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"Expo web client ID for use in the browser."}]},"type":{"type":"intrinsic","name":"string"}}],"extendedTypes":[{"type":"reference","name":"ProviderAuthRequestConfig"}]},{"name":"GoogleAuthRequestConfig","kind":256,"children":[{"name":"androidClientId","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"Android native client ID for use in standalone, and bare workflow."}]},"type":{"type":"intrinsic","name":"string"}},{"name":"clientId","kind":1024,"comment":{"summary":[{"kind":"text","text":"A unique string representing the registration information provided by the client.\nThe client identifier is not a secret; it is exposed to the resource owner and shouldn't be used\nalone for client authentication.\n\nThe client identifier is unique to the authorization server.\n\n[Section 2.2](https://tools.ietf.org/html/rfc6749#section-2.2)"}]},"type":{"type":"intrinsic","name":"string"},"inheritedFrom":{"type":"reference","name":"ProviderAuthRequestConfig.clientId"}},{"name":"clientSecret","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"Client secret supplied by an auth provider.\nThere is no secure way to store this on the client.\n\n[Section 2.3.1](https://tools.ietf.org/html/rfc6749#section-2.3.1)"}]},"type":{"type":"intrinsic","name":"string"},"inheritedFrom":{"type":"reference","name":"ProviderAuthRequestConfig.clientSecret"}},{"name":"codeChallenge","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"Derived from the code verifier by using the "},{"kind":"code","text":"`CodeChallengeMethod`"},{"kind":"text","text":".\n\n[Section 4.2](https://tools.ietf.org/html/rfc7636#section-4.2)"}]},"type":{"type":"intrinsic","name":"string"},"inheritedFrom":{"type":"reference","name":"ProviderAuthRequestConfig.codeChallenge"}},{"name":"codeChallengeMethod","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"Method used to generate the code challenge. You should never use "},{"kind":"code","text":"`Plain`"},{"kind":"text","text":" as it's not good enough for secure verification."}],"blockTags":[{"tag":"@default","content":[{"kind":"text","text":"CodeChallengeMethod.S256"}]}]},"type":{"type":"reference","name":"CodeChallengeMethod"},"inheritedFrom":{"type":"reference","name":"ProviderAuthRequestConfig.codeChallengeMethod"}},{"name":"expoClientId","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"Proxy client ID for use in the Expo client on Android and iOS."}]},"type":{"type":"intrinsic","name":"string"}},{"name":"extraParams","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"Extra query params that'll be added to the query string."}]},"type":{"type":"reference","typeArguments":[{"type":"intrinsic","name":"string"},{"type":"intrinsic","name":"string"}],"name":"Record","qualifiedName":"Record","package":"typescript"},"inheritedFrom":{"type":"reference","name":"ProviderAuthRequestConfig.extraParams"}},{"name":"iosClientId","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"iOS native client ID for use in standalone, bare workflow, and custom clients."}]},"type":{"type":"intrinsic","name":"string"}},{"name":"language","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"Language code ISO 3166-1 alpha-2 region code, such as 'it' or 'pt-PT'."}]},"type":{"type":"intrinsic","name":"string"},"overwrites":{"type":"reference","name":"ProviderAuthRequestConfig.language"}},{"name":"loginHint","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"If the user's email address is known ahead of time, it can be supplied to be the default option.\nIf the user has approved access for this app in the past then auth may return without any further interaction."}]},"type":{"type":"intrinsic","name":"string"}},{"name":"prompt","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"Informs the server if the user should be prompted to login or consent again.\nThis can be used to present a dialog for switching accounts after the user has already been logged in.\n\n[Section 3.1.2.1](https://openid.net/specs/openid-connect-core-1_0.html#AuthorizationRequest)"}]},"type":{"type":"reference","name":"Prompt"},"inheritedFrom":{"type":"reference","name":"ProviderAuthRequestConfig.prompt"}},{"name":"redirectUri","kind":1024,"comment":{"summary":[{"kind":"text","text":"After completing an interaction with a resource owner the\nserver will redirect to this URI. Learn more about [linking in Expo](/guides/linking/).\n\n[Section 3.1.2](https://tools.ietf.org/html/rfc6749#section-3.1.2)"}]},"type":{"type":"intrinsic","name":"string"},"inheritedFrom":{"type":"reference","name":"ProviderAuthRequestConfig.redirectUri"}},{"name":"responseType","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"Specifies what is returned from the authorization server.\n\n[Section 3.1.1](https://tools.ietf.org/html/rfc6749#section-3.1.1)"}],"blockTags":[{"tag":"@default","content":[{"kind":"text","text":"ResponseType.Code"}]}]},"type":{"type":"intrinsic","name":"string"},"inheritedFrom":{"type":"reference","name":"ProviderAuthRequestConfig.responseType"}},{"name":"scopes","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"List of strings to request access to.\n\n[Section 3.3](https://tools.ietf.org/html/rfc6749#section-3.3)"}]},"type":{"type":"array","elementType":{"type":"intrinsic","name":"string"}},"inheritedFrom":{"type":"reference","name":"ProviderAuthRequestConfig.scopes"}},{"name":"selectAccount","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"When "},{"kind":"code","text":"`true`"},{"kind":"text","text":", the service will allow the user to switch between accounts (if possible)."}],"blockTags":[{"tag":"@default","content":[{"kind":"text","text":"false."}]}]},"type":{"type":"intrinsic","name":"boolean"}},{"name":"shouldAutoExchangeCode","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"Should the hook automatically exchange the response code for an authentication token.\n\nDefaults to "},{"kind":"code","text":"`true`"},{"kind":"text","text":" on installed apps (Android, iOS) when "},{"kind":"code","text":"`ResponseType.Code`"},{"kind":"text","text":" is used (default)."}]},"type":{"type":"intrinsic","name":"boolean"}},{"name":"state","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"Used for protection against [Cross-Site Request Forgery](https://tools.ietf.org/html/rfc6749#section-10.12)."}]},"type":{"type":"intrinsic","name":"string"},"inheritedFrom":{"type":"reference","name":"ProviderAuthRequestConfig.state"}},{"name":"usePKCE","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"Should use [Proof Key for Code Exchange](https://oauth.net/2/pkce/)."}],"blockTags":[{"tag":"@default","content":[{"kind":"text","text":"true"}]}]},"type":{"type":"intrinsic","name":"boolean"},"inheritedFrom":{"type":"reference","name":"ProviderAuthRequestConfig.usePKCE"}},{"name":"webClientId","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"Expo web client ID for use in the browser."}]},"type":{"type":"intrinsic","name":"string"}}],"extendedTypes":[{"type":"reference","name":"ProviderAuthRequestConfig"}]},{"name":"RefreshTokenRequestConfig","kind":256,"comment":{"summary":[{"kind":"text","text":"Config used to request a token refresh, or code exchange."}],"blockTags":[{"tag":"@see","content":[{"kind":"text","text":"[Section 6](https://tools.ietf.org/html/rfc6749#section-6)"}]}]},"children":[{"name":"clientId","kind":1024,"comment":{"summary":[{"kind":"text","text":"A unique string representing the registration information provided by the client.\nThe client identifier is not a secret; it is exposed to the resource owner and shouldn't be used\nalone for client authentication.\n\nThe client identifier is unique to the authorization server.\n\n[Section 2.2](https://tools.ietf.org/html/rfc6749#section-2.2)"}]},"type":{"type":"intrinsic","name":"string"},"inheritedFrom":{"type":"reference","name":"TokenRequestConfig.clientId"}},{"name":"clientSecret","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"Client secret supplied by an auth provider.\nThere is no secure way to store this on the client.\n\n[Section 2.3.1](https://tools.ietf.org/html/rfc6749#section-2.3.1)"}]},"type":{"type":"intrinsic","name":"string"},"inheritedFrom":{"type":"reference","name":"TokenRequestConfig.clientSecret"}},{"name":"extraParams","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"Extra query params that'll be added to the query string."}]},"type":{"type":"reference","typeArguments":[{"type":"intrinsic","name":"string"},{"type":"intrinsic","name":"string"}],"name":"Record","qualifiedName":"Record","package":"typescript"},"inheritedFrom":{"type":"reference","name":"TokenRequestConfig.extraParams"}},{"name":"refreshToken","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"The refresh token issued to the client."}]},"type":{"type":"intrinsic","name":"string"}},{"name":"scopes","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"List of strings to request access to.\n\n[Section 3.3](https://tools.ietf.org/html/rfc6749#section-3.3)"}]},"type":{"type":"array","elementType":{"type":"intrinsic","name":"string"}},"inheritedFrom":{"type":"reference","name":"TokenRequestConfig.scopes"}}],"extendedTypes":[{"type":"reference","name":"TokenRequestConfig"}],"implementedBy":[{"type":"reference","name":"RefreshTokenRequest"}]},{"name":"RevokeTokenRequestConfig","kind":256,"comment":{"summary":[{"kind":"text","text":"Config used to revoke a token."}],"blockTags":[{"tag":"@see","content":[{"kind":"text","text":"[Section 2.1](https://tools.ietf.org/html/rfc7009#section-2.1)"}]}]},"children":[{"name":"clientId","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"A unique string representing the registration information provided by the client.\nThe client identifier is not a secret; it is exposed to the resource owner and shouldn't be used\nalone for client authentication.\n\nThe client identifier is unique to the authorization server.\n\n[Section 2.2](https://tools.ietf.org/html/rfc6749#section-2.2)"}]},"type":{"type":"intrinsic","name":"string"},"inheritedFrom":{"type":"reference","name":"Partial.clientId"}},{"name":"clientSecret","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"Client secret supplied by an auth provider.\nThere is no secure way to store this on the client.\n\n[Section 2.3.1](https://tools.ietf.org/html/rfc6749#section-2.3.1)"}]},"type":{"type":"intrinsic","name":"string"},"inheritedFrom":{"type":"reference","name":"Partial.clientSecret"}},{"name":"extraParams","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"Extra query params that'll be added to the query string."}]},"type":{"type":"reference","typeArguments":[{"type":"intrinsic","name":"string"},{"type":"intrinsic","name":"string"}],"name":"Record","qualifiedName":"Record","package":"typescript"},"inheritedFrom":{"type":"reference","name":"Partial.extraParams"}},{"name":"scopes","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"List of strings to request access to.\n\n[Section 3.3](https://tools.ietf.org/html/rfc6749#section-3.3)"}]},"type":{"type":"array","elementType":{"type":"intrinsic","name":"string"}},"inheritedFrom":{"type":"reference","name":"Partial.scopes"}},{"name":"token","kind":1024,"comment":{"summary":[{"kind":"text","text":"The token that the client wants to get revoked.\n\n[Section 3.1](https://tools.ietf.org/html/rfc6749#section-3.1)"}]},"type":{"type":"intrinsic","name":"string"}},{"name":"tokenTypeHint","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"A hint about the type of the token submitted for revocation.\n\n[Section 3.2](https://tools.ietf.org/html/rfc6749#section-3.2)"}]},"type":{"type":"reference","name":"TokenTypeHint"}}],"extendedTypes":[{"type":"reference","typeArguments":[{"type":"reference","name":"TokenRequestConfig"}],"name":"Partial","qualifiedName":"Partial","package":"typescript"}],"implementedBy":[{"type":"reference","name":"RevokeTokenRequest"}]},{"name":"ServerTokenResponseConfig","kind":256,"comment":{"summary":[{"kind":"text","text":"Object returned from the server after a token response."}]},"children":[{"name":"access_token","kind":1024,"type":{"type":"intrinsic","name":"string"}},{"name":"expires_in","kind":1024,"flags":{"isOptional":true},"type":{"type":"intrinsic","name":"number"}},{"name":"id_token","kind":1024,"flags":{"isOptional":true},"type":{"type":"intrinsic","name":"string"}},{"name":"issued_at","kind":1024,"flags":{"isOptional":true},"type":{"type":"intrinsic","name":"number"}},{"name":"refresh_token","kind":1024,"flags":{"isOptional":true},"type":{"type":"intrinsic","name":"string"}},{"name":"scope","kind":1024,"flags":{"isOptional":true},"type":{"type":"intrinsic","name":"string"}},{"name":"token_type","kind":1024,"flags":{"isOptional":true},"type":{"type":"reference","name":"TokenType"}}]},{"name":"TokenRequestConfig","kind":256,"comment":{"summary":[{"kind":"text","text":"Config used to request a token refresh, revocation, or code exchange."}]},"children":[{"name":"clientId","kind":1024,"comment":{"summary":[{"kind":"text","text":"A unique string representing the registration information provided by the client.\nThe client identifier is not a secret; it is exposed to the resource owner and shouldn't be used\nalone for client authentication.\n\nThe client identifier is unique to the authorization server.\n\n[Section 2.2](https://tools.ietf.org/html/rfc6749#section-2.2)"}]},"type":{"type":"intrinsic","name":"string"}},{"name":"clientSecret","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"Client secret supplied by an auth provider.\nThere is no secure way to store this on the client.\n\n[Section 2.3.1](https://tools.ietf.org/html/rfc6749#section-2.3.1)"}]},"type":{"type":"intrinsic","name":"string"}},{"name":"extraParams","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"Extra query params that'll be added to the query string."}]},"type":{"type":"reference","typeArguments":[{"type":"intrinsic","name":"string"},{"type":"intrinsic","name":"string"}],"name":"Record","qualifiedName":"Record","package":"typescript"}},{"name":"scopes","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"List of strings to request access to.\n\n[Section 3.3](https://tools.ietf.org/html/rfc6749#section-3.3)"}]},"type":{"type":"array","elementType":{"type":"intrinsic","name":"string"}}}],"extendedBy":[{"type":"reference","name":"AccessTokenRequestConfig"},{"type":"reference","name":"RefreshTokenRequestConfig"}]},{"name":"TokenResponseConfig","kind":256,"children":[{"name":"accessToken","kind":1024,"comment":{"summary":[{"kind":"text","text":"The access token issued by the authorization server.\n\n[Section 4.2.2](https://tools.ietf.org/html/rfc6749#section-4.2.2)"}]},"type":{"type":"intrinsic","name":"string"}},{"name":"expiresIn","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"The lifetime in seconds of the access token.\n\nFor example, the value "},{"kind":"code","text":"`3600`"},{"kind":"text","text":" denotes that the access token will\nexpire in one hour from the time the response was generated.\n\nIf omitted, the authorization server should provide the\nexpiration time via other means or document the default value.\n\n[Section 4.2.2](https://tools.ietf.org/html/rfc6749#section-4.2.2)"}]},"type":{"type":"intrinsic","name":"number"}},{"name":"idToken","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"ID Token value associated with the authenticated session.\n\n[TokenResponse](https://openid.net/specs/openid-connect-core-1_0.html#TokenResponse)"}]},"type":{"type":"intrinsic","name":"string"}},{"name":"issuedAt","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"Time in seconds when the token was received by the client."}]},"type":{"type":"intrinsic","name":"number"}},{"name":"refreshToken","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"The refresh token, which can be used to obtain new access tokens using the same authorization grant.\n\n[Section 5.1](https://tools.ietf.org/html/rfc6749#section-5.1)"}]},"type":{"type":"intrinsic","name":"string"}},{"name":"scope","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"The scope of the access token. Only required if it's different to the scope that was requested by the client.\n\n[Section 3.3](https://tools.ietf.org/html/rfc6749#section-3.3)"}]},"type":{"type":"intrinsic","name":"string"}},{"name":"state","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"Required if the \"state\" parameter was present in the client\nauthorization request. The exact value received from the client.\n\n[Section 4.2.2](https://tools.ietf.org/html/rfc6749#section-4.2.2)"}]},"type":{"type":"intrinsic","name":"string"}},{"name":"tokenType","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"The type of the token issued. Value is case insensitive.\n\n[Section 7.1](https://tools.ietf.org/html/rfc6749#section-7.1)"}]},"type":{"type":"reference","name":"TokenType"}}],"implementedBy":[{"type":"reference","name":"TokenResponse"}]},{"name":"AuthRequestPromptOptions","kind":4194304,"comment":{"summary":[{"kind":"text","text":"Options passed to the "},{"kind":"code","text":"`promptAsync()`"},{"kind":"text","text":" method of "},{"kind":"code","text":"`AuthRequest`"},{"kind":"text","text":"s.\nThis can be used to configure how the web browser should look and behave."}]},"type":{"type":"intersection","types":[{"type":"reference","typeArguments":[{"type":"reference","name":"WebBrowserOpenOptions"},{"type":"literal","value":"windowFeatures"}],"name":"Omit","qualifiedName":"Omit","package":"typescript"},{"type":"reflection","declaration":{"name":"__type","kind":65536,"children":[{"name":"projectNameForProxy","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"Project name to use for the "},{"kind":"code","text":"`auth.expo.io`"},{"kind":"text","text":" proxy when "},{"kind":"code","text":"`useProxy`"},{"kind":"text","text":" is "},{"kind":"code","text":"`true`"},{"kind":"text","text":"."}]},"type":{"type":"intrinsic","name":"string"}},{"name":"proxyOptions","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"URL options to be used when creating the redirect URL for the auth proxy."}]},"type":{"type":"intersection","types":[{"type":"reference","typeArguments":[{"type":"reference","name":"CreateURLOptions"},{"type":"literal","value":"queryParams"}],"name":"Omit","qualifiedName":"Omit","package":"typescript"},{"type":"reflection","declaration":{"name":"__type","kind":65536,"children":[{"name":"path","kind":1024,"flags":{"isOptional":true},"type":{"type":"intrinsic","name":"string"}}]}}]}},{"name":"url","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"URL to open when prompting the user. This usually should be defined internally and left "},{"kind":"code","text":"`undefined`"},{"kind":"text","text":" in most cases."}]},"type":{"type":"intrinsic","name":"string"}},{"name":"useProxy","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"Should the authentication request use the Expo proxy service "},{"kind":"code","text":"`auth.expo.io`"},{"kind":"text","text":"."}],"blockTags":[{"tag":"@default","content":[{"kind":"text","text":"false"}]},{"tag":"@deprecated","content":[{"kind":"text","text":"This option will be removed in a future release, for more information check [the migration guide](https://expo.fyi/auth-proxy-migration)."}]}]},"type":{"type":"intrinsic","name":"boolean"}},{"name":"windowFeatures","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"Features to use with "},{"kind":"code","text":"`window.open()`"},{"kind":"text","text":"."}],"blockTags":[{"tag":"@platform","content":[{"kind":"text","text":"web"}]}]},"type":{"type":"reference","name":"WebBrowserWindowFeatures"}}]}}]}},{"name":"AuthSessionOptions","kind":4194304,"type":{"type":"reflection","declaration":{"name":"__type","kind":65536,"children":[{"name":"authUrl","kind":1024,"comment":{"summary":[{"kind":"text","text":"The URL that points to the sign in page that you would like to open the user to."}]},"type":{"type":"intrinsic","name":"string"}},{"name":"projectNameForProxy","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"Project name to use for the "},{"kind":"code","text":"`auth.expo.io`"},{"kind":"text","text":" proxy."}]},"type":{"type":"intrinsic","name":"string"}},{"name":"returnUrl","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"The URL to return to the application. In managed apps, it's optional and defaults to output of ["},{"kind":"code","text":"`Linking.createURL('expo-auth-session', params)`"},{"kind":"text","text":"](./linking/#linkingcreateurlpath-namedparameters)\ncall with "},{"kind":"code","text":"`scheme`"},{"kind":"text","text":" and "},{"kind":"code","text":"`queryParams`"},{"kind":"text","text":" params. However, in the bare app, it's required - "},{"kind":"code","text":"`AuthSession`"},{"kind":"text","text":" needs to know where to wait for the response.\nHence, this method will throw an exception, if you don't provide "},{"kind":"code","text":"`returnUrl`"},{"kind":"text","text":"."}]},"type":{"type":"intrinsic","name":"string"}},{"name":"showInRecents","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"A boolean determining whether browsed website should be shown as separate entry in Android recents/multitasking view."}],"blockTags":[{"tag":"@default","content":[{"kind":"text","text":"false"}]},{"tag":"@platform","content":[{"kind":"text","text":"android"}]}]},"type":{"type":"intrinsic","name":"boolean"}}]}}},{"name":"AuthSessionRedirectUriOptions","kind":4194304,"comment":{"summary":[{"kind":"text","text":"Options passed to "},{"kind":"code","text":"`makeRedirectUri`"},{"kind":"text","text":"."}]},"type":{"type":"reflection","declaration":{"name":"__type","kind":65536,"children":[{"name":"isTripleSlashed","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"Should the URI be triple slashed "},{"kind":"code","text":"`scheme:///path`"},{"kind":"text","text":" or double slashed "},{"kind":"code","text":"`scheme://path`"},{"kind":"text","text":".\nDefaults to "},{"kind":"code","text":"`false`"},{"kind":"text","text":".\nPassed to "},{"kind":"code","text":"`Linking.createURL()`"},{"kind":"text","text":" when "},{"kind":"code","text":"`useProxy`"},{"kind":"text","text":" is "},{"kind":"code","text":"`false`"},{"kind":"text","text":"."}]},"type":{"type":"intrinsic","name":"boolean"}},{"name":"native","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"Manual scheme to use in Bare and Standalone native app contexts. Takes precedence over all other properties.\nYou must define the URI scheme that will be used in a custom built native application or standalone Expo application.\nThe value should conform to your native app's URI schemes.\nYou can see conformance with "},{"kind":"code","text":"`npx uri-scheme list`"},{"kind":"text","text":"."}]},"type":{"type":"intrinsic","name":"string"}},{"name":"path","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"Optional path to append to a URI. This will not be added to "},{"kind":"code","text":"`native`"},{"kind":"text","text":"."}]},"type":{"type":"intrinsic","name":"string"}},{"name":"preferLocalhost","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"Attempt to convert the Expo server IP address to localhost.\nThis is useful for testing when your IP changes often, this will only work for iOS simulator."}],"blockTags":[{"tag":"@default","content":[{"kind":"text","text":"false"}]}]},"type":{"type":"intrinsic","name":"boolean"}},{"name":"projectNameForProxy","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"Project name to use for the "},{"kind":"code","text":"`auth.expo.io`"},{"kind":"text","text":" proxy when "},{"kind":"code","text":"`useProxy`"},{"kind":"text","text":" is "},{"kind":"code","text":"`true`"},{"kind":"text","text":"."}]},"type":{"type":"intrinsic","name":"string"}},{"name":"queryParams","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"Optional native scheme to use when proxy is disabled.\nURI protocol "},{"kind":"code","text":"`://`"},{"kind":"text","text":" that must be built into your native app.\nPassed to "},{"kind":"code","text":"`Linking.createURL()`"},{"kind":"text","text":" when "},{"kind":"code","text":"`useProxy`"},{"kind":"text","text":" is "},{"kind":"code","text":"`false`"},{"kind":"text","text":"."}]},"type":{"type":"reference","typeArguments":[{"type":"intrinsic","name":"string"},{"type":"union","types":[{"type":"intrinsic","name":"string"},{"type":"intrinsic","name":"undefined"}]}],"name":"Record","qualifiedName":"Record","package":"typescript"}},{"name":"scheme","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"URI protocol "},{"kind":"code","text":"`://`"},{"kind":"text","text":" that must be built into your native app.\nPassed to "},{"kind":"code","text":"`Linking.createURL()`"},{"kind":"text","text":" when "},{"kind":"code","text":"`useProxy`"},{"kind":"text","text":" is "},{"kind":"code","text":"`false`"},{"kind":"text","text":"."}]},"type":{"type":"intrinsic","name":"string"}},{"name":"useProxy","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"Should use the `auth.expo.io` proxy.\nThis is useful for testing managed native apps that require a custom URI scheme."}],"blockTags":[{"tag":"@default","content":[{"kind":"text","text":"false"}]},{"tag":"@deprecated","content":[{"kind":"text","text":"This option will be removed in a future release, for more information check [the migration guide](https://expo.fyi/auth-proxy-migration)."}]}]},"type":{"type":"intrinsic","name":"boolean"}}]}}},{"name":"AuthSessionResult","kind":4194304,"comment":{"summary":[{"kind":"text","text":"Object returned after an auth request has completed.\n- If the user cancelled the authentication session by closing the browser, the result is "},{"kind":"code","text":"`{ type: 'cancel' }`"},{"kind":"text","text":".\n- If the authentication is dismissed manually with "},{"kind":"code","text":"`AuthSession.dismiss()`"},{"kind":"text","text":", the result is "},{"kind":"code","text":"`{ type: 'dismiss' }`"},{"kind":"text","text":".\n- If the authentication flow is successful, the result is "},{"kind":"code","text":"`{ type: 'success', params: Object, event: Object }`"},{"kind":"text","text":".\n- If the authentication flow is returns an error, the result is "},{"kind":"code","text":"`{ type: 'error', params: Object, error: string, event: Object }`"},{"kind":"text","text":".\n- If you call "},{"kind":"code","text":"`AuthSession.startAsync()`"},{"kind":"text","text":" more than once before the first call has returned, the result is "},{"kind":"code","text":"`{ type: 'locked' }`"},{"kind":"text","text":",\n because only one "},{"kind":"code","text":"`AuthSession`"},{"kind":"text","text":" can be in progress at any time."}]},"type":{"type":"union","types":[{"type":"reflection","declaration":{"name":"__type","kind":65536,"children":[{"name":"type","kind":1024,"comment":{"summary":[{"kind":"text","text":"How the auth completed."}]},"type":{"type":"union","types":[{"type":"literal","value":"cancel"},{"type":"literal","value":"dismiss"},{"type":"literal","value":"opened"},{"type":"literal","value":"locked"}]}}]}},{"type":"reflection","declaration":{"name":"__type","kind":65536,"children":[{"name":"authentication","kind":1024,"comment":{"summary":[{"kind":"text","text":"Returned when the auth finishes with an "},{"kind":"code","text":"`access_token`"},{"kind":"text","text":" property."}]},"type":{"type":"union","types":[{"type":"reference","name":"TokenResponse"},{"type":"literal","value":null}]}},{"name":"error","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"Possible error if the auth failed with type "},{"kind":"code","text":"`error`"},{"kind":"text","text":"."}]},"type":{"type":"union","types":[{"type":"reference","name":"AuthError"},{"type":"literal","value":null}]}},{"name":"errorCode","kind":1024,"comment":{"summary":[],"blockTags":[{"tag":"@deprecated","content":[{"kind":"text","text":"Legacy error code query param, use "},{"kind":"code","text":"`error`"},{"kind":"text","text":" instead."}]}]},"type":{"type":"union","types":[{"type":"intrinsic","name":"string"},{"type":"literal","value":null}]}},{"name":"params","kind":1024,"comment":{"summary":[{"kind":"text","text":"Query params from the "},{"kind":"code","text":"`url`"},{"kind":"text","text":" as an object."}]},"type":{"type":"reference","typeArguments":[{"type":"intrinsic","name":"string"},{"type":"intrinsic","name":"string"}],"name":"Record","qualifiedName":"Record","package":"typescript"}},{"name":"type","kind":1024,"comment":{"summary":[{"kind":"text","text":"How the auth completed."}]},"type":{"type":"union","types":[{"type":"literal","value":"error"},{"type":"literal","value":"success"}]}},{"name":"url","kind":1024,"comment":{"summary":[{"kind":"text","text":"Auth URL that was opened"}]},"type":{"type":"intrinsic","name":"string"}}]}}]}},{"name":"Issuer","kind":4194304,"comment":{"summary":[{"kind":"text","text":"URL using the "},{"kind":"code","text":"`https`"},{"kind":"text","text":" scheme with no query or fragment component that the OP asserts as its Issuer Identifier."}]},"type":{"type":"intrinsic","name":"string"}},{"name":"IssuerOrDiscovery","kind":4194304,"type":{"type":"union","types":[{"type":"reference","name":"Issuer"},{"type":"reference","name":"DiscoveryDocument"}]}},{"name":"ProviderMetadata","kind":4194304,"comment":{"summary":[{"kind":"text","text":"OpenID Providers have metadata describing their configuration.\n[ProviderMetadata](https://openid.net/specs/openid-connect-discovery-1_0.html#ProviderMetadata)"}]},"type":{"type":"intersection","types":[{"type":"reference","typeArguments":[{"type":"intrinsic","name":"string"},{"type":"union","types":[{"type":"intrinsic","name":"string"},{"type":"intrinsic","name":"boolean"},{"type":"array","elementType":{"type":"intrinsic","name":"string"}}]}],"name":"Record","qualifiedName":"Record","package":"typescript"},{"type":"reference","name":"ProviderMetadataEndpoints"},{"type":"reflection","declaration":{"name":"__type","kind":65536,"children":[{"name":"backchannel_logout_session_supported","kind":1024,"flags":{"isOptional":true},"type":{"type":"intrinsic","name":"boolean"}},{"name":"backchannel_logout_supported","kind":1024,"flags":{"isOptional":true},"type":{"type":"intrinsic","name":"boolean"}},{"name":"check_session_iframe","kind":1024,"flags":{"isOptional":true},"type":{"type":"intrinsic","name":"string"}},{"name":"claim_types_supported","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"a list of the Claim Types that the OpenID Provider supports."}]},"type":{"type":"array","elementType":{"type":"intrinsic","name":"string"}}},{"name":"claims_locales_supported","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"Languages and scripts supported for values in Claims being returned."}]},"type":{"type":"array","elementType":{"type":"intrinsic","name":"string"}}},{"name":"claims_parameter_supported","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"Boolean value specifying whether the OP supports use of the claims parameter, with "},{"kind":"code","text":"`true`"},{"kind":"text","text":" indicating support."}],"blockTags":[{"tag":"@default","content":[{"kind":"text","text":"false"}]}]},"type":{"type":"intrinsic","name":"boolean"}},{"name":"claims_supported","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"a list of the Claim Names of the Claims that the OpenID Provider may be able to supply values for.\nNote that for privacy or other reasons, this might not be an exhaustive list."}]},"type":{"type":"array","elementType":{"type":"intrinsic","name":"string"}}},{"name":"code_challenge_methods_supported","kind":1024,"flags":{"isOptional":true},"type":{"type":"array","elementType":{"type":"reference","name":"CodeChallengeMethod"}}},{"name":"display_values_supported","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"a list of the "},{"kind":"code","text":"`display`"},{"kind":"text","text":" parameter values that the OpenID Provider supports."}]},"type":{"type":"array","elementType":{"type":"intrinsic","name":"string"}}},{"name":"frontchannel_logout_session_supported","kind":1024,"flags":{"isOptional":true},"type":{"type":"intrinsic","name":"boolean"}},{"name":"frontchannel_logout_supported","kind":1024,"flags":{"isOptional":true},"type":{"type":"intrinsic","name":"boolean"}},{"name":"grant_types_supported","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"JSON array containing a list of the OAuth 2.0 Grant Type values that this OP supports.\nDynamic OpenID Providers MUST support the authorization_code and implicit Grant Type values and MAY support other Grant Types.\nIf omitted, the default value is [\"authorization_code\", \"implicit\"]."}]},"type":{"type":"array","elementType":{"type":"intrinsic","name":"string"}}},{"name":"id_token_signing_alg_values_supported","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"JSON array containing a list of the JWS signing algorithms (alg values) supported by the OP for the ID Token to encode the Claims in a JWT.\nThe algorithm RS256 MUST be included."}]},"type":{"type":"array","elementType":{"type":"intrinsic","name":"string"}}},{"name":"jwks_uri","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"URL of the OP's JSON Web Key Set [JWK](https://openid.net/specs/openid-connect-discovery-1_0.html#JWK) document."}]},"type":{"type":"intrinsic","name":"string"}},{"name":"op_policy_uri","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"URL that the OpenID Provider provides to the person registering the Client to read about the OP's requirements on how\nthe Relying Party can use the data provided by the OP. The registration process SHOULD display this URL to the person\nregistering the Client if it is given."}]},"type":{"type":"intrinsic","name":"string"}},{"name":"op_tos_uri","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"URL that the OpenID Provider provides to the person registering the Client to read about OpenID Provider's terms of service.\nThe registration process should display this URL to the person registering the Client if it is given."}]},"type":{"type":"intrinsic","name":"string"}},{"name":"request_parameter_supported","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"Boolean value specifying whether the OP supports use of the request parameter, with "},{"kind":"code","text":"`true`"},{"kind":"text","text":" indicating support."}],"blockTags":[{"tag":"@default","content":[{"kind":"text","text":"false"}]}]},"type":{"type":"intrinsic","name":"boolean"}},{"name":"request_uri_parameter_supported","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"Whether the OP supports use of the "},{"kind":"code","text":"`request_uri`"},{"kind":"text","text":" parameter, with "},{"kind":"code","text":"`true`"},{"kind":"text","text":" indicating support."}],"blockTags":[{"tag":"@default","content":[{"kind":"text","text":"true"}]}]},"type":{"type":"intrinsic","name":"boolean"}},{"name":"require_request_uri_registration","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"Whether the OP requires any "},{"kind":"code","text":"`request_uri`"},{"kind":"text","text":" values used to be pre-registered using the "},{"kind":"code","text":"`request_uris`"},{"kind":"text","text":" registration parameter.\nPre-registration is required when the value is "},{"kind":"code","text":"`true`"},{"kind":"text","text":"."}],"blockTags":[{"tag":"@default","content":[{"kind":"text","text":"false"}]}]},"type":{"type":"intrinsic","name":"boolean"}},{"name":"response_modes_supported","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"JSON array containing a list of the OAuth 2.0 "},{"kind":"code","text":"`response_mode`"},{"kind":"text","text":" values that this OP supports,\nas specified in [OAuth 2.0 Multiple Response Type Encoding Practices](https://openid.net/specs/openid-connect-discovery-1_0.html#OAuth.Responses).\nIf omitted, the default for Dynamic OpenID Providers is "},{"kind":"code","text":"`[\"query\", \"fragment\"]`"},{"kind":"text","text":"."}]},"type":{"type":"array","elementType":{"type":"intrinsic","name":"string"}}},{"name":"response_types_supported","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"JSON array containing a list of the OAuth 2.0 "},{"kind":"code","text":"`response_type`"},{"kind":"text","text":" values that this OP supports.\nDynamic OpenID Providers must support the "},{"kind":"code","text":"`code`"},{"kind":"text","text":", "},{"kind":"code","text":"`id_token`"},{"kind":"text","text":", and the "},{"kind":"code","text":"`token`"},{"kind":"text","text":" "},{"kind":"code","text":"`id_token`"},{"kind":"text","text":" Response Type values"}]},"type":{"type":"array","elementType":{"type":"intrinsic","name":"string"}}},{"name":"scopes_supported","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"JSON array containing a list of the OAuth 2.0 [RFC6749](https://openid.net/specs/openid-connect-discovery-1_0.html#RFC6749)\nscope values that this server supports."}]},"type":{"type":"array","elementType":{"type":"intrinsic","name":"string"}}},{"name":"service_documentation","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"URL of a page containing human-readable information that developers might want or need to know when using the OpenID Provider.\nIn particular, if the OpenID Provider does not support Dynamic Client Registration, then information on how to register Clients\nneeds to be provided in this documentation."}]},"type":{"type":"intrinsic","name":"string"}},{"name":"subject_types_supported","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"JSON array containing a list of the Subject Identifier types that this OP supports.\nValid types include "},{"kind":"code","text":"`pairwise`"},{"kind":"text","text":" and "},{"kind":"code","text":"`public`"},{"kind":"text","text":"."}]},"type":{"type":"array","elementType":{"type":"intrinsic","name":"string"}}},{"name":"token_endpoint_auth_methods_supported","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"A list of Client authentication methods supported by this Token Endpoint.\nIf omitted, the default is "},{"kind":"code","text":"`['client_secret_basic']`"}]},"type":{"type":"array","elementType":{"type":"union","types":[{"type":"literal","value":"client_secret_post"},{"type":"literal","value":"client_secret_basic"},{"type":"literal","value":"client_secret_jwt"},{"type":"literal","value":"private_key_jwt"},{"type":"intrinsic","name":"string"}]}}},{"name":"ui_locales_supported","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"Languages and scripts supported for the user interface,\nrepresented as a JSON array of [BCP47](https://openid.net/specs/openid-connect-discovery-1_0.html#RFC5646) language tag values."}]},"type":{"type":"array","elementType":{"type":"intrinsic","name":"string"}}}]}}]}},{"name":"TokenType","kind":4194304,"comment":{"summary":[{"kind":"text","text":"Access token type."}],"blockTags":[{"tag":"@see","content":[{"kind":"text","text":"[Section 7.1](https://tools.ietf.org/html/rfc6749#section-7.1)"}]}]},"type":{"type":"union","types":[{"type":"literal","value":"bearer"},{"type":"literal","value":"mac"}]}},{"name":"dismiss","kind":64,"signatures":[{"name":"dismiss","kind":4096,"comment":{"summary":[{"kind":"text","text":"Cancels an active "},{"kind":"code","text":"`AuthSession`"},{"kind":"text","text":" if there is one. No return value, but if there is an active "},{"kind":"code","text":"`AuthSession`"},{"kind":"text","text":"\nthen the Promise returned by the "},{"kind":"code","text":"`AuthSession.startAsync()`"},{"kind":"text","text":" that initiated it resolves to "},{"kind":"code","text":"`{ type: 'dismiss' }`"},{"kind":"text","text":"."}]},"type":{"type":"intrinsic","name":"void"}}]},{"name":"exchangeCodeAsync","kind":64,"signatures":[{"name":"exchangeCodeAsync","kind":4096,"comment":{"summary":[{"kind":"text","text":"Exchange an authorization code for an access token that can be used to get data from the provider."}],"blockTags":[{"tag":"@returns","content":[{"kind":"text","text":"Returns a discovery document with a valid "},{"kind":"code","text":"`tokenEndpoint`"},{"kind":"text","text":" URL."}]}]},"parameters":[{"name":"config","kind":32768,"comment":{"summary":[{"kind":"text","text":"Configuration used to exchange the code for a token."}]},"type":{"type":"reference","name":"AccessTokenRequestConfig"}},{"name":"discovery","kind":32768,"comment":{"summary":[{"kind":"text","text":"The "},{"kind":"code","text":"`tokenEndpoint`"},{"kind":"text","text":" for a provider."}]},"type":{"type":"reference","typeArguments":[{"type":"reference","name":"DiscoveryDocument"},{"type":"literal","value":"tokenEndpoint"}],"name":"Pick","qualifiedName":"Pick","package":"typescript"}}],"type":{"type":"reference","typeArguments":[{"type":"reference","name":"TokenResponse"}],"name":"Promise","qualifiedName":"Promise","package":"typescript"}}]},{"name":"fetchDiscoveryAsync","kind":64,"signatures":[{"name":"fetchDiscoveryAsync","kind":4096,"comment":{"summary":[{"kind":"text","text":"Fetch a "},{"kind":"code","text":"`DiscoveryDocument`"},{"kind":"text","text":" from a well-known resource provider that supports auto discovery."}],"blockTags":[{"tag":"@returns","content":[{"kind":"text","text":"Returns a discovery document that can be used for authentication."}]}]},"parameters":[{"name":"issuer","kind":32768,"comment":{"summary":[{"kind":"text","text":"An "},{"kind":"code","text":"`Issuer`"},{"kind":"text","text":" URL to fetch from."}]},"type":{"type":"intrinsic","name":"string"}}],"type":{"type":"reference","typeArguments":[{"type":"reference","name":"DiscoveryDocument"}],"name":"Promise","qualifiedName":"Promise","package":"typescript"}}]},{"name":"fetchUserInfoAsync","kind":64,"signatures":[{"name":"fetchUserInfoAsync","kind":4096,"comment":{"summary":[{"kind":"text","text":"Fetch generic user info from the provider's OpenID Connect "},{"kind":"code","text":"`userInfoEndpoint`"},{"kind":"text","text":" (if supported)."}],"blockTags":[{"tag":"@see","content":[{"kind":"text","text":"[UserInfo](https://openid.net/specs/openid-connect-core-1_0.html#UserInfo)."}]}]},"parameters":[{"name":"config","kind":32768,"comment":{"summary":[{"kind":"text","text":"The "},{"kind":"code","text":"`accessToken`"},{"kind":"text","text":" for a user, returned from a code exchange or auth request."}]},"type":{"type":"reference","typeArguments":[{"type":"reference","name":"TokenResponse"},{"type":"literal","value":"accessToken"}],"name":"Pick","qualifiedName":"Pick","package":"typescript"}},{"name":"discovery","kind":32768,"comment":{"summary":[{"kind":"text","text":"The "},{"kind":"code","text":"`userInfoEndpoint`"},{"kind":"text","text":" for a provider."}]},"type":{"type":"reference","typeArguments":[{"type":"reference","name":"DiscoveryDocument"},{"type":"literal","value":"userInfoEndpoint"}],"name":"Pick","qualifiedName":"Pick","package":"typescript"}}],"type":{"type":"reference","typeArguments":[{"type":"reference","typeArguments":[{"type":"intrinsic","name":"string"},{"type":"intrinsic","name":"any"}],"name":"Record","qualifiedName":"Record","package":"typescript"}],"name":"Promise","qualifiedName":"Promise","package":"typescript"}}]},{"name":"generateHexStringAsync","kind":64,"signatures":[{"name":"generateHexStringAsync","kind":4096,"comment":{"summary":[{"kind":"text","text":"Digest a random string with hex encoding, useful for creating "},{"kind":"code","text":"`nonce`"},{"kind":"text","text":"s."}]},"parameters":[{"name":"size","kind":32768,"type":{"type":"intrinsic","name":"number"}}],"type":{"type":"reference","typeArguments":[{"type":"intrinsic","name":"string"}],"name":"Promise","qualifiedName":"Promise","package":"typescript"}}]},{"name":"getDefaultReturnUrl","kind":64,"signatures":[{"name":"getDefaultReturnUrl","kind":4096,"parameters":[{"name":"urlPath","kind":32768,"flags":{"isOptional":true},"type":{"type":"intrinsic","name":"string"}},{"name":"options","kind":32768,"flags":{"isOptional":true},"type":{"type":"reference","typeArguments":[{"type":"reference","name":"CreateURLOptions"},{"type":"literal","value":"queryParams"}],"name":"Omit","qualifiedName":"Omit","package":"typescript"}}],"type":{"type":"intrinsic","name":"string"}}]},{"name":"getRedirectUrl","kind":64,"signatures":[{"name":"getRedirectUrl","kind":4096,"comment":{"summary":[{"kind":"text","text":"Get the URL that your authentication provider needs to redirect to. For example: "},{"kind":"code","text":"`https://auth.expo.io/@your-username/your-app-slug`"},{"kind":"text","text":". You can pass an additional path component to be appended to the default redirect URL.\n> **Note** This method will throw an exception if you're using the bare workflow on native."}],"blockTags":[{"tag":"@returns","content":[]},{"tag":"@example","content":[{"kind":"code","text":"```ts\nconst url = AuthSession.getRedirectUrl('redirect');\n\n// Managed: https://auth.expo.io/@your-username/your-app-slug/redirect\n// Web: https://localhost:19006/redirect\n```"}]},{"tag":"@deprecated","content":[{"kind":"text","text":"Use "},{"kind":"code","text":"`makeRedirectUri()`"},{"kind":"text","text":" instead."}]}]},"parameters":[{"name":"path","kind":32768,"flags":{"isOptional":true},"type":{"type":"intrinsic","name":"string"}}],"type":{"type":"intrinsic","name":"string"}}]},{"name":"loadAsync","kind":64,"signatures":[{"name":"loadAsync","kind":4096,"comment":{"summary":[{"kind":"text","text":"Build an "},{"kind":"code","text":"`AuthRequest`"},{"kind":"text","text":" and load it before returning."}],"blockTags":[{"tag":"@returns","content":[{"kind":"text","text":"Returns an instance of "},{"kind":"code","text":"`AuthRequest`"},{"kind":"text","text":" that can be used to prompt the user for authorization."}]}]},"parameters":[{"name":"config","kind":32768,"comment":{"summary":[{"kind":"text","text":"A valid ["},{"kind":"code","text":"`AuthRequestConfig`"},{"kind":"text","text":"](#authrequestconfig) that specifies what provider to use."}]},"type":{"type":"reference","name":"AuthRequestConfig"}},{"name":"issuerOrDiscovery","kind":32768,"comment":{"summary":[{"kind":"text","text":"A loaded ["},{"kind":"code","text":"`DiscoveryDocument`"},{"kind":"text","text":"](#discoverydocument) or issuer URL.\n(Only "},{"kind":"code","text":"`authorizationEndpoint`"},{"kind":"text","text":" is required for requesting an authorization code)."}]},"type":{"type":"reference","name":"IssuerOrDiscovery"}}],"type":{"type":"reference","typeArguments":[{"type":"reference","name":"AuthRequest"}],"name":"Promise","qualifiedName":"Promise","package":"typescript"}}]},{"name":"makeRedirectUri","kind":64,"signatures":[{"name":"makeRedirectUri","kind":4096,"comment":{"summary":[{"kind":"text","text":"Create a redirect url for the current platform and environment. You need to manually define the redirect that will be used in\na bare workflow React Native app, or an Expo standalone app, this is because it cannot be inferred automatically.\n- **Web:** Generates a path based on the current "},{"kind":"code","text":"`window.location`"},{"kind":"text","text":". For production web apps, you should hard code the URL as well.\n- **Managed workflow:** Uses the "},{"kind":"code","text":"`scheme`"},{"kind":"text","text":" property of your "},{"kind":"code","text":"`app.config.js`"},{"kind":"text","text":" or "},{"kind":"code","text":"`app.json`"},{"kind":"text","text":".\n - **Proxy:** Uses "},{"kind":"code","text":"`auth.expo.io`"},{"kind":"text","text":" as the base URL for the path. This only works in Expo Go and standalone environments.\n- **Bare workflow:** Will fallback to using the "},{"kind":"code","text":"`native`"},{"kind":"text","text":" option for bare workflow React Native apps."}],"blockTags":[{"tag":"@returns","content":[{"kind":"text","text":"The "},{"kind":"code","text":"`redirectUri`"},{"kind":"text","text":" to use in an authentication request."}]},{"tag":"@example","content":[{"kind":"code","text":"```ts\nconst redirectUri = makeRedirectUri({\n scheme: 'my-scheme',\n path: 'redirect'\n});\n// Development Build: my-scheme://redirect\n// Expo Go: exp://127.0.0.1:19000/--/redirect\n// Web dev: https://localhost:19006/redirect\n// Web prod: https://yourwebsite.com/redirect\n\nconst redirectUri2 = makeRedirectUri({\n scheme: 'scheme2',\n preferLocalhost: true,\n isTripleSlashed: true,\n});\n// Development Build: scheme2:///\n// Expo Go: exp://localhost:19000\n// Web dev: https://localhost:19006\n// Web prod: https://yourwebsite.com\n```"}]}]},"parameters":[{"name":"options","kind":32768,"comment":{"summary":[{"kind":"text","text":"Additional options for configuring the path."}]},"type":{"type":"reference","name":"AuthSessionRedirectUriOptions"},"defaultValue":"{}"}],"type":{"type":"intrinsic","name":"string"}}]},{"name":"refreshAsync","kind":64,"signatures":[{"name":"refreshAsync","kind":4096,"comment":{"summary":[{"kind":"text","text":"Refresh an access token.\n- If the provider didn't return a "},{"kind":"code","text":"`refresh_token`"},{"kind":"text","text":" then the access token may not be refreshed.\n- If the provider didn't return a "},{"kind":"code","text":"`expires_in`"},{"kind":"text","text":" then it's assumed that the token does not expire.\n- Determine if a token needs to be refreshed via "},{"kind":"code","text":"`TokenResponse.isTokenFresh()`"},{"kind":"text","text":" or "},{"kind":"code","text":"`shouldRefresh()`"},{"kind":"text","text":" on an instance of "},{"kind":"code","text":"`TokenResponse`"},{"kind":"text","text":"."}],"blockTags":[{"tag":"@see","content":[{"kind":"text","text":"[Section 6](https://tools.ietf.org/html/rfc6749#section-6)."}]},{"tag":"@returns","content":[{"kind":"text","text":"Returns a discovery document with a valid "},{"kind":"code","text":"`tokenEndpoint`"},{"kind":"text","text":" URL."}]}]},"parameters":[{"name":"config","kind":32768,"comment":{"summary":[{"kind":"text","text":"Configuration used to refresh the given access token."}]},"type":{"type":"reference","name":"RefreshTokenRequestConfig"}},{"name":"discovery","kind":32768,"comment":{"summary":[{"kind":"text","text":"The "},{"kind":"code","text":"`tokenEndpoint`"},{"kind":"text","text":" for a provider."}]},"type":{"type":"reference","typeArguments":[{"type":"reference","name":"DiscoveryDocument"},{"type":"literal","value":"tokenEndpoint"}],"name":"Pick","qualifiedName":"Pick","package":"typescript"}}],"type":{"type":"reference","typeArguments":[{"type":"reference","name":"TokenResponse"}],"name":"Promise","qualifiedName":"Promise","package":"typescript"}}]},{"name":"resolveDiscoveryAsync","kind":64,"signatures":[{"name":"resolveDiscoveryAsync","kind":4096,"comment":{"summary":[{"kind":"text","text":"Utility method for resolving the discovery document from an issuer or object."}]},"parameters":[{"name":"issuerOrDiscovery","kind":32768,"type":{"type":"reference","name":"IssuerOrDiscovery"}}],"type":{"type":"reference","typeArguments":[{"type":"reference","name":"DiscoveryDocument"}],"name":"Promise","qualifiedName":"Promise","package":"typescript"}}]},{"name":"revokeAsync","kind":64,"signatures":[{"name":"revokeAsync","kind":4096,"comment":{"summary":[{"kind":"text","text":"Revoke a token with a provider. This makes the token unusable, effectively requiring the user to login again."}],"blockTags":[{"tag":"@returns","content":[{"kind":"text","text":"Returns a discovery document with a valid "},{"kind":"code","text":"`revocationEndpoint`"},{"kind":"text","text":" URL. Many providers do not support this feature."}]}]},"parameters":[{"name":"config","kind":32768,"comment":{"summary":[{"kind":"text","text":"Configuration used to revoke a refresh or access token."}]},"type":{"type":"reference","name":"RevokeTokenRequestConfig"}},{"name":"discovery","kind":32768,"comment":{"summary":[{"kind":"text","text":"The "},{"kind":"code","text":"`revocationEndpoint`"},{"kind":"text","text":" for a provider."}]},"type":{"type":"reference","typeArguments":[{"type":"reference","name":"DiscoveryDocument"},{"type":"literal","value":"revocationEndpoint"}],"name":"Pick","qualifiedName":"Pick","package":"typescript"}}],"type":{"type":"reference","typeArguments":[{"type":"intrinsic","name":"boolean"}],"name":"Promise","qualifiedName":"Promise","package":"typescript"}}]},{"name":"startAsync","kind":64,"signatures":[{"name":"startAsync","kind":4096,"comment":{"summary":[{"kind":"text","text":"Initiate a proxied authentication session with the given options. Only one "},{"kind":"code","text":"`AuthSession`"},{"kind":"text","text":" can be active at any given time in your application.\nIf you attempt to open a second session while one is still in progress, the second session will return a value to indicate that "},{"kind":"code","text":"`AuthSession`"},{"kind":"text","text":" is locked."}],"blockTags":[{"tag":"@returns","content":[{"kind":"text","text":"Returns a Promise that resolves to an "},{"kind":"code","text":"`AuthSessionResult`"},{"kind":"text","text":" object."}]}]},"parameters":[{"name":"options","kind":32768,"comment":{"summary":[{"kind":"text","text":"An object of type "},{"kind":"code","text":"`AuthSessionOptions`"},{"kind":"text","text":"."}]},"type":{"type":"reference","name":"AuthSessionOptions"}}],"type":{"type":"reference","typeArguments":[{"type":"reference","name":"AuthSessionResult"}],"name":"Promise","qualifiedName":"Promise","package":"typescript"}}]},{"name":"useAuthRequest","kind":64,"signatures":[{"name":"useAuthRequest","kind":4096,"comment":{"summary":[{"kind":"text","text":"Load an authorization request for a code. When the prompt method completes then the response will be fulfilled.\n\n> In order to close the popup window on web, you need to invoke "},{"kind":"code","text":"`WebBrowser.maybeCompleteAuthSession()`"},{"kind":"text","text":".\n> See the [Identity example](/guides/authentication.md#identityserver-4) for more info.\n\nIf an Implicit grant flow was used, you can pass the "},{"kind":"code","text":"`response.params`"},{"kind":"text","text":" to "},{"kind":"code","text":"`TokenResponse.fromQueryParams()`"},{"kind":"text","text":"\nto get a "},{"kind":"code","text":"`TokenResponse`"},{"kind":"text","text":" instance which you can use to easily refresh the token."}],"blockTags":[{"tag":"@returns","content":[{"kind":"text","text":"Returns a loaded request, a response, and a prompt method in a single array in the following order:\n- "},{"kind":"code","text":"`request`"},{"kind":"text","text":" - An instance of ["},{"kind":"code","text":"`AuthRequest`"},{"kind":"text","text":"](#authrequest) that can be used to prompt the user for authorization.\n This will be "},{"kind":"code","text":"`null`"},{"kind":"text","text":" until the auth request has finished loading.\n- "},{"kind":"code","text":"`response`"},{"kind":"text","text":" - This is "},{"kind":"code","text":"`null`"},{"kind":"text","text":" until "},{"kind":"code","text":"`promptAsync`"},{"kind":"text","text":" has been invoked. Once fulfilled it will return information about the authorization.\n- "},{"kind":"code","text":"`promptAsync`"},{"kind":"text","text":" - When invoked, a web browser will open up and prompt the user for authentication.\n Accepts an ["},{"kind":"code","text":"`AuthRequestPromptOptions`"},{"kind":"text","text":"](#authrequestpromptoptions) object with options about how the prompt will execute."}]},{"tag":"@example","content":[{"kind":"code","text":"```ts\nconst [request, response, promptAsync] = useAuthRequest({ ... }, { ... });\n```"}]}]},"parameters":[{"name":"config","kind":32768,"comment":{"summary":[{"kind":"text","text":"A valid ["},{"kind":"code","text":"`AuthRequestConfig`"},{"kind":"text","text":"](#authrequestconfig) that specifies what provider to use."}]},"type":{"type":"reference","name":"AuthRequestConfig"}},{"name":"discovery","kind":32768,"comment":{"summary":[{"kind":"text","text":"A loaded ["},{"kind":"code","text":"`DiscoveryDocument`"},{"kind":"text","text":"](#discoverydocument) with endpoints used for authenticating.\nOnly "},{"kind":"code","text":"`authorizationEndpoint`"},{"kind":"text","text":" is required for requesting an authorization code."}]},"type":{"type":"union","types":[{"type":"literal","value":null},{"type":"reference","name":"DiscoveryDocument"}]}}],"type":{"type":"tuple","elements":[{"type":"union","types":[{"type":"reference","name":"AuthRequest"},{"type":"literal","value":null}]},{"type":"union","types":[{"type":"reference","name":"AuthSessionResult"},{"type":"literal","value":null}]},{"type":"reflection","declaration":{"name":"__type","kind":65536,"signatures":[{"name":"__type","kind":4096,"parameters":[{"name":"options","kind":32768,"flags":{"isOptional":true},"type":{"type":"reference","name":"AuthRequestPromptOptions"}}],"type":{"type":"reference","typeArguments":[{"type":"reference","name":"AuthSessionResult"}],"name":"Promise","qualifiedName":"Promise","package":"typescript"}}]}}]}}]},{"name":"useAutoDiscovery","kind":64,"signatures":[{"name":"useAutoDiscovery","kind":4096,"comment":{"summary":[{"kind":"text","text":"Given an OpenID Connect issuer URL, this will fetch and return the ["},{"kind":"code","text":"`DiscoveryDocument`"},{"kind":"text","text":"](#discoverydocument)\n(a collection of URLs) from the resource provider."}],"blockTags":[{"tag":"@returns","content":[{"kind":"text","text":"Returns "},{"kind":"code","text":"`null`"},{"kind":"text","text":" until the ["},{"kind":"code","text":"`DiscoveryDocument`"},{"kind":"text","text":"](#discoverydocument) has been fetched from the provided issuer URL."}]},{"tag":"@example","content":[{"kind":"code","text":"```ts\nconst discovery = useAutoDiscovery('https://example.com/auth');\n```"}]}]},"parameters":[{"name":"issuerOrDiscovery","kind":32768,"comment":{"summary":[{"kind":"text","text":"URL using the "},{"kind":"code","text":"`https`"},{"kind":"text","text":" scheme with no query or fragment component that the OP asserts as its Issuer Identifier."}]},"type":{"type":"reference","name":"IssuerOrDiscovery"}}],"type":{"type":"union","types":[{"type":"reference","name":"DiscoveryDocument"},{"type":"literal","value":null}]}}]}]}
+{"name":"expo-auth-session","kind":1,"children":[{"name":"CodeChallengeMethod","kind":8,"children":[{"name":"Plain","kind":16,"comment":{"summary":[{"kind":"text","text":"This should not be used. When used, the code verifier will be sent to the server as-is."}]},"type":{"type":"literal","value":"plain"}},{"name":"S256","kind":16,"comment":{"summary":[{"kind":"text","text":"The default and recommended method for transforming the code verifier.\n- Convert the code verifier to ASCII.\n- Create a digest of the string using crypto method SHA256.\n- Convert the digest to Base64 and URL encode it."}]},"type":{"type":"literal","value":"S256"}}]},{"name":"GrantType","kind":8,"comment":{"summary":[{"kind":"text","text":"Grant type values used in dynamic client registration and auth requests."}],"blockTags":[{"tag":"@see","content":[{"kind":"text","text":"[Appendix A.10](https://tools.ietf.org/html/rfc6749#appendix-A.10)"}]}]},"children":[{"name":"AuthorizationCode","kind":16,"comment":{"summary":[{"kind":"text","text":"Used for exchanging an authorization code for one or more tokens.\n\n[Section 4.1.3](https://tools.ietf.org/html/rfc6749#section-4.1.3)"}]},"type":{"type":"literal","value":"authorization_code"}},{"name":"ClientCredentials","kind":16,"comment":{"summary":[{"kind":"text","text":"Used for client credentials flow.\n\n[Section 4.4.2](https://tools.ietf.org/html/rfc6749#section-4.4.2)"}]},"type":{"type":"literal","value":"client_credentials"}},{"name":"Implicit","kind":16,"comment":{"summary":[{"kind":"text","text":"Used when obtaining an access token.\n\n[Section 4.2](https://tools.ietf.org/html/rfc6749#section-4.2)"}]},"type":{"type":"literal","value":"implicit"}},{"name":"RefreshToken","kind":16,"comment":{"summary":[{"kind":"text","text":"Used when exchanging a refresh token for a new token.\n\n[Section 6](https://tools.ietf.org/html/rfc6749#section-6)"}]},"type":{"type":"literal","value":"refresh_token"}}]},{"name":"Prompt","kind":8,"comment":{"summary":[{"kind":"text","text":"Informs the server if the user should be prompted to login or consent again.\nThis can be used to present a dialog for switching accounts after the user has already been logged in.\nYou should use this in favor of clearing cookies (which is mostly not possible on iOS)."}],"blockTags":[{"tag":"@see","content":[{"kind":"text","text":"[Section 3.1.2.1](https://openid.net/specs/openid-connect-core-1_0.html#AuthorizationRequest)."}]}]},"children":[{"name":"Consent","kind":16,"comment":{"summary":[{"kind":"text","text":"Server should prompt the user for consent before returning information to the client.\nIf it cannot obtain consent, it must return an error, typically "},{"kind":"code","text":"`consent_required`"},{"kind":"text","text":"."}]},"type":{"type":"literal","value":"consent"}},{"name":"Login","kind":16,"comment":{"summary":[{"kind":"text","text":"The server should prompt the user to reauthenticate.\nIf it cannot reauthenticate the End-User, it must return an error, typically "},{"kind":"code","text":"`login_required`"},{"kind":"text","text":"."}]},"type":{"type":"literal","value":"login"}},{"name":"None","kind":16,"comment":{"summary":[{"kind":"text","text":"Server must not display any auth or consent UI. Can be used to check for existing auth or consent.\nAn error is returned if a user isn't already authenticated or the client doesn't have pre-configured consent for the requested claims, or does not fulfill other conditions for processing the request.\nThe error code will typically be "},{"kind":"code","text":"`login_required`"},{"kind":"text","text":", "},{"kind":"code","text":"`interaction_required`"},{"kind":"text","text":", or another code defined in [Section 3.1.2.6](https://openid.net/specs/openid-connect-core-1_0.html#AuthError)."}]},"type":{"type":"literal","value":"none"}},{"name":"SelectAccount","kind":16,"comment":{"summary":[{"kind":"text","text":"Server should prompt the user to select an account. Can be used to switch accounts.\nIf it can't obtain an account selection choice made by the user, it must return an error, typically "},{"kind":"code","text":"`account_selection_required`"},{"kind":"text","text":"."}]},"type":{"type":"literal","value":"select_account"}}]},{"name":"ResponseType","kind":8,"comment":{"summary":[{"kind":"text","text":"The client informs the authorization server of the desired grant type by using the response type."}],"blockTags":[{"tag":"@see","content":[{"kind":"text","text":"[Section 3.1.1](https://tools.ietf.org/html/rfc6749#section-3.1.1)."}]}]},"children":[{"name":"Code","kind":16,"comment":{"summary":[{"kind":"text","text":"For requesting an authorization code as described by [Section 4.1.1](https://tools.ietf.org/html/rfc6749#section-4.1.1)."}]},"type":{"type":"literal","value":"code"}},{"name":"IdToken","kind":16,"comment":{"summary":[{"kind":"text","text":"A custom registered type for getting an "},{"kind":"code","text":"`id_token`"},{"kind":"text","text":" from Google OAuth."}]},"type":{"type":"literal","value":"id_token"}},{"name":"Token","kind":16,"comment":{"summary":[{"kind":"text","text":"For requesting an access token (implicit grant) as described by [Section 4.2.1](https://tools.ietf.org/html/rfc6749#section-4.2.1)."}]},"type":{"type":"literal","value":"token"}}]},{"name":"TokenTypeHint","kind":8,"comment":{"summary":[{"kind":"text","text":"A hint about the type of the token submitted for revocation. If not included then the server should attempt to deduce the token type."}],"blockTags":[{"tag":"@see","content":[{"kind":"text","text":"[Section 2.1](https://tools.ietf.org/html/rfc7009#section-2.1)"}]}]},"children":[{"name":"AccessToken","kind":16,"comment":{"summary":[{"kind":"text","text":"Access token.\n\n[Section 1.4](https://tools.ietf.org/html/rfc6749#section-1.4)"}]},"type":{"type":"literal","value":"access_token"}},{"name":"RefreshToken","kind":16,"comment":{"summary":[{"kind":"text","text":"Refresh token.\n\n[Section 1.5](https://tools.ietf.org/html/rfc6749#section-1.5)"}]},"type":{"type":"literal","value":"refresh_token"}}]},{"name":"AccessTokenRequest","kind":128,"comment":{"summary":[{"kind":"text","text":"Access token request. Exchange an authorization code for a user access token.\n\n[Section 4.1.3](https://tools.ietf.org/html/rfc6749#section-4.1.3)"}]},"children":[{"name":"constructor","kind":512,"signatures":[{"name":"new AccessTokenRequest","kind":16384,"parameters":[{"name":"options","kind":32768,"type":{"type":"reference","name":"AccessTokenRequestConfig"}}],"type":{"type":"reference","name":"AccessTokenRequest"},"overwrites":{"type":"reference","name":"TokenRequest.constructor"}}],"overwrites":{"type":"reference","name":"TokenRequest.constructor"}},{"name":"clientId","kind":1024,"flags":{"isReadonly":true},"comment":{"summary":[{"kind":"text","text":"A unique string representing the registration information provided by the client.\nThe client identifier is not a secret; it is exposed to the resource owner and shouldn't be used\nalone for client authentication.\n\nThe client identifier is unique to the authorization server.\n\n[Section 2.2](https://tools.ietf.org/html/rfc6749#section-2.2)"}]},"type":{"type":"intrinsic","name":"string"},"inheritedFrom":{"type":"reference","name":"TokenRequest.clientId"},"implementationOf":{"type":"reference","name":"AccessTokenRequestConfig.clientId"}},{"name":"clientSecret","kind":1024,"flags":{"isOptional":true,"isReadonly":true},"comment":{"summary":[{"kind":"text","text":"Client secret supplied by an auth provider.\nThere is no secure way to store this on the client.\n\n[Section 2.3.1](https://tools.ietf.org/html/rfc6749#section-2.3.1)"}]},"type":{"type":"intrinsic","name":"string"},"inheritedFrom":{"type":"reference","name":"TokenRequest.clientSecret"},"implementationOf":{"type":"reference","name":"AccessTokenRequestConfig.clientSecret"}},{"name":"code","kind":1024,"flags":{"isReadonly":true},"comment":{"summary":[{"kind":"text","text":"The authorization code received from the authorization server."}]},"type":{"type":"intrinsic","name":"string"},"implementationOf":{"type":"reference","name":"AccessTokenRequestConfig.code"}},{"name":"extraParams","kind":1024,"flags":{"isOptional":true,"isReadonly":true},"comment":{"summary":[{"kind":"text","text":"Extra query params that'll be added to the query string."}]},"type":{"type":"reference","typeArguments":[{"type":"intrinsic","name":"string"},{"type":"intrinsic","name":"string"}],"name":"Record","qualifiedName":"Record","package":"typescript"},"inheritedFrom":{"type":"reference","name":"TokenRequest.extraParams"},"implementationOf":{"type":"reference","name":"AccessTokenRequestConfig.extraParams"}},{"name":"grantType","kind":1024,"flags":{"isPublic":true},"type":{"type":"reference","name":"GrantType"},"inheritedFrom":{"type":"reference","name":"TokenRequest.grantType"}},{"name":"redirectUri","kind":1024,"flags":{"isReadonly":true},"comment":{"summary":[{"kind":"text","text":"If the "},{"kind":"code","text":"`redirectUri`"},{"kind":"text","text":" parameter was included in the "},{"kind":"code","text":"`AuthRequest`"},{"kind":"text","text":", then it must be supplied here as well.\n\n[Section 3.1.2](https://tools.ietf.org/html/rfc6749#section-3.1.2)"}]},"type":{"type":"intrinsic","name":"string"},"implementationOf":{"type":"reference","name":"AccessTokenRequestConfig.redirectUri"}},{"name":"scopes","kind":1024,"flags":{"isOptional":true,"isReadonly":true},"comment":{"summary":[{"kind":"text","text":"List of strings to request access to.\n\n[Section 3.3](https://tools.ietf.org/html/rfc6749#section-3.3)"}]},"type":{"type":"array","elementType":{"type":"intrinsic","name":"string"}},"inheritedFrom":{"type":"reference","name":"TokenRequest.scopes"},"implementationOf":{"type":"reference","name":"AccessTokenRequestConfig.scopes"}},{"name":"getHeaders","kind":2048,"signatures":[{"name":"getHeaders","kind":4096,"type":{"type":"reference","name":"Headers"},"inheritedFrom":{"type":"reference","name":"TokenRequest.getHeaders"}}],"inheritedFrom":{"type":"reference","name":"TokenRequest.getHeaders"}},{"name":"getQueryBody","kind":2048,"signatures":[{"name":"getQueryBody","kind":4096,"type":{"type":"reference","typeArguments":[{"type":"intrinsic","name":"string"},{"type":"intrinsic","name":"string"}],"name":"Record","qualifiedName":"Record","package":"typescript"},"overwrites":{"type":"reference","name":"TokenRequest.getQueryBody"}}],"overwrites":{"type":"reference","name":"TokenRequest.getQueryBody"}},{"name":"getRequestConfig","kind":2048,"signatures":[{"name":"getRequestConfig","kind":4096,"type":{"type":"reflection","declaration":{"name":"__type","kind":65536,"children":[{"name":"clientId","kind":1024,"type":{"type":"intrinsic","name":"string"},"defaultValue":"..."},{"name":"clientSecret","kind":1024,"type":{"type":"union","types":[{"type":"intrinsic","name":"undefined"},{"type":"intrinsic","name":"string"}]},"defaultValue":"..."},{"name":"code","kind":1024,"type":{"type":"intrinsic","name":"string"},"defaultValue":"..."},{"name":"extraParams","kind":1024,"type":{"type":"union","types":[{"type":"intrinsic","name":"undefined"},{"type":"reference","typeArguments":[{"type":"intrinsic","name":"string"},{"type":"intrinsic","name":"string"}],"name":"Record","qualifiedName":"Record","package":"typescript"}]},"defaultValue":"..."},{"name":"grantType","kind":1024,"type":{"type":"reference","name":"GrantType"},"defaultValue":"..."},{"name":"redirectUri","kind":1024,"type":{"type":"intrinsic","name":"string"},"defaultValue":"..."},{"name":"scopes","kind":1024,"type":{"type":"union","types":[{"type":"intrinsic","name":"undefined"},{"type":"array","elementType":{"type":"intrinsic","name":"string"}}]},"defaultValue":"..."}]}},"overwrites":{"type":"reference","name":"TokenRequest.getRequestConfig"}}],"overwrites":{"type":"reference","name":"TokenRequest.getRequestConfig"}},{"name":"performAsync","kind":2048,"signatures":[{"name":"performAsync","kind":4096,"parameters":[{"name":"discovery","kind":32768,"type":{"type":"reference","typeArguments":[{"type":"reference","name":"DiscoveryDocument"},{"type":"literal","value":"tokenEndpoint"}],"name":"Pick","qualifiedName":"Pick","package":"typescript"}}],"type":{"type":"reference","typeArguments":[{"type":"reference","name":"TokenResponse"}],"name":"Promise","qualifiedName":"Promise","package":"typescript"},"inheritedFrom":{"type":"reference","name":"TokenRequest.performAsync"}}],"inheritedFrom":{"type":"reference","name":"TokenRequest.performAsync"}}],"extendedTypes":[{"type":"reference","typeArguments":[{"type":"reference","name":"AccessTokenRequestConfig"}],"name":"TokenRequest"}],"implementedTypes":[{"type":"reference","name":"AccessTokenRequestConfig"}]},{"name":"AuthError","kind":128,"comment":{"summary":[{"kind":"text","text":"Represents an authorization response error: [Section 5.2](https://tools.ietf.org/html/rfc6749#section-5.2).\nOften times providers will fail to return the proper error message for a given error code.\nThis error method will add the missing description for more context on what went wrong."}]},"children":[{"name":"constructor","kind":512,"signatures":[{"name":"new AuthError","kind":16384,"parameters":[{"name":"response","kind":32768,"type":{"type":"reference","name":"AuthErrorConfig"}}],"type":{"type":"reference","name":"AuthError"},"overwrites":{"type":"reference","name":"ResponseError.constructor"}}],"overwrites":{"type":"reference","name":"ResponseError.constructor"}},{"name":"code","kind":1024,"type":{"type":"intrinsic","name":"string"},"inheritedFrom":{"type":"reference","name":"ResponseError.code"}},{"name":"description","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"Used to assist the client developer in\nunderstanding the error that occurred."}]},"type":{"type":"intrinsic","name":"string"},"inheritedFrom":{"type":"reference","name":"ResponseError.description"}},{"name":"info","kind":1024,"flags":{"isOptional":true},"type":{"type":"intrinsic","name":"any"},"inheritedFrom":{"type":"reference","name":"ResponseError.info"}},{"name":"params","kind":1024,"comment":{"summary":[{"kind":"text","text":"Raw results of the error."}]},"type":{"type":"reference","typeArguments":[{"type":"intrinsic","name":"string"},{"type":"intrinsic","name":"string"}],"name":"Record","qualifiedName":"Record","package":"typescript"},"inheritedFrom":{"type":"reference","name":"ResponseError.params"}},{"name":"state","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"Required only if state is used in the initial request"}]},"type":{"type":"intrinsic","name":"string"}},{"name":"uri","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"A URI identifying a human-readable web page with\ninformation about the error, used to provide the client\ndeveloper with additional information about the error."}]},"type":{"type":"intrinsic","name":"string"},"inheritedFrom":{"type":"reference","name":"ResponseError.uri"}}],"extendedTypes":[{"type":"reference","name":"ResponseError"}]},{"name":"AuthRequest","kind":128,"comment":{"summary":[{"kind":"text","text":"Used to manage an authorization request according to the OAuth spec: [Section 4.1.1](https://tools.ietf.org/html/rfc6749#section-4.1.1).\nYou can use this class directly for more info around the authorization.\n\n**Common use-cases:**\n\n- Parse a URL returned from the authorization server with "},{"kind":"code","text":"`parseReturnUrlAsync()`"},{"kind":"text","text":".\n- Get the built authorization URL with "},{"kind":"code","text":"`makeAuthUrlAsync()`"},{"kind":"text","text":".\n- Get a loaded JSON representation of the auth request with crypto state loaded with "},{"kind":"code","text":"`getAuthRequestConfigAsync()`"},{"kind":"text","text":"."}],"blockTags":[{"tag":"@example","content":[{"kind":"code","text":"```ts\n// Create a request.\nconst request = new AuthRequest({ ... });\n\n// Prompt for an auth code\nconst result = await request.promptAsync(discovery);\n\n// Get the URL to invoke\nconst url = await request.makeAuthUrlAsync(discovery);\n\n// Get the URL to invoke\nconst parsed = await request.parseReturnUrlAsync(\"\");\n```"}]}]},"children":[{"name":"constructor","kind":512,"signatures":[{"name":"new AuthRequest","kind":16384,"parameters":[{"name":"request","kind":32768,"type":{"type":"reference","name":"AuthRequestConfig"}}],"type":{"type":"reference","name":"AuthRequest"}}]},{"name":"clientId","kind":1024,"flags":{"isReadonly":true},"type":{"type":"intrinsic","name":"string"},"implementationOf":{"type":"reference","name":"Omit.clientId"}},{"name":"clientSecret","kind":1024,"flags":{"isOptional":true,"isReadonly":true},"type":{"type":"intrinsic","name":"string"},"implementationOf":{"type":"reference","name":"Omit.clientSecret"}},{"name":"codeChallenge","kind":1024,"flags":{"isPublic":true,"isOptional":true},"type":{"type":"intrinsic","name":"string"},"implementationOf":{"type":"reference","name":"Omit.codeChallenge"}},{"name":"codeChallengeMethod","kind":1024,"flags":{"isReadonly":true},"type":{"type":"reference","name":"CodeChallengeMethod"},"implementationOf":{"type":"reference","name":"Omit.codeChallengeMethod"}},{"name":"codeVerifier","kind":1024,"flags":{"isPublic":true,"isOptional":true},"type":{"type":"intrinsic","name":"string"}},{"name":"extraParams","kind":1024,"flags":{"isReadonly":true},"type":{"type":"reference","typeArguments":[{"type":"intrinsic","name":"string"},{"type":"intrinsic","name":"string"}],"name":"Record","qualifiedName":"Record","package":"typescript"},"implementationOf":{"type":"reference","name":"Omit.extraParams"}},{"name":"prompt","kind":1024,"flags":{"isOptional":true,"isReadonly":true},"type":{"type":"reference","name":"Prompt"},"implementationOf":{"type":"reference","name":"Omit.prompt"}},{"name":"redirectUri","kind":1024,"flags":{"isReadonly":true},"type":{"type":"intrinsic","name":"string"},"implementationOf":{"type":"reference","name":"Omit.redirectUri"}},{"name":"responseType","kind":1024,"flags":{"isReadonly":true},"type":{"type":"intrinsic","name":"string"},"implementationOf":{"type":"reference","name":"Omit.responseType"}},{"name":"scopes","kind":1024,"flags":{"isOptional":true,"isReadonly":true},"type":{"type":"array","elementType":{"type":"intrinsic","name":"string"}},"implementationOf":{"type":"reference","name":"Omit.scopes"}},{"name":"state","kind":1024,"flags":{"isPublic":true},"comment":{"summary":[{"kind":"text","text":"Used for protection against [Cross-Site Request Forgery](https://tools.ietf.org/html/rfc6749#section-10.12)."}]},"type":{"type":"intrinsic","name":"string"}},{"name":"url","kind":1024,"flags":{"isPublic":true},"type":{"type":"union","types":[{"type":"literal","value":null},{"type":"intrinsic","name":"string"}]},"defaultValue":"null"},{"name":"usePKCE","kind":1024,"flags":{"isOptional":true,"isReadonly":true},"type":{"type":"intrinsic","name":"boolean"},"implementationOf":{"type":"reference","name":"Omit.usePKCE"}},{"name":"getAuthRequestConfigAsync","kind":2048,"signatures":[{"name":"getAuthRequestConfigAsync","kind":4096,"comment":{"summary":[{"kind":"text","text":"Load and return a valid auth request based on the input config."}]},"type":{"type":"reference","typeArguments":[{"type":"reference","name":"AuthRequestConfig"}],"name":"Promise","qualifiedName":"Promise","package":"typescript"}}]},{"name":"makeAuthUrlAsync","kind":2048,"signatures":[{"name":"makeAuthUrlAsync","kind":4096,"comment":{"summary":[{"kind":"text","text":"Create the URL for authorization."}]},"parameters":[{"name":"discovery","kind":32768,"type":{"type":"reference","name":"AuthDiscoveryDocument"}}],"type":{"type":"reference","typeArguments":[{"type":"intrinsic","name":"string"}],"name":"Promise","qualifiedName":"Promise","package":"typescript"}}]},{"name":"parseReturnUrl","kind":2048,"signatures":[{"name":"parseReturnUrl","kind":4096,"parameters":[{"name":"url","kind":32768,"type":{"type":"intrinsic","name":"string"}}],"type":{"type":"reference","name":"AuthSessionResult"}}]},{"name":"promptAsync","kind":2048,"signatures":[{"name":"promptAsync","kind":4096,"comment":{"summary":[{"kind":"text","text":"Prompt a user to authorize for a code."}]},"parameters":[{"name":"discovery","kind":32768,"type":{"type":"reference","name":"AuthDiscoveryDocument"}},{"name":"promptOptions","kind":32768,"type":{"type":"reference","name":"AuthRequestPromptOptions"},"defaultValue":"{}"}],"type":{"type":"reference","typeArguments":[{"type":"reference","name":"AuthSessionResult"}],"name":"Promise","qualifiedName":"Promise","package":"typescript"}}]}],"implementedTypes":[{"type":"reference","typeArguments":[{"type":"reference","name":"AuthRequestConfig"},{"type":"literal","value":"state"}],"name":"Omit","qualifiedName":"Omit","package":"typescript"}]},{"name":"RefreshTokenRequest","kind":128,"comment":{"summary":[{"kind":"text","text":"Refresh request.\n\n[Section 6](https://tools.ietf.org/html/rfc6749#section-6)"}]},"children":[{"name":"constructor","kind":512,"signatures":[{"name":"new RefreshTokenRequest","kind":16384,"parameters":[{"name":"options","kind":32768,"type":{"type":"reference","name":"RefreshTokenRequestConfig"}}],"type":{"type":"reference","name":"RefreshTokenRequest"},"overwrites":{"type":"reference","name":"TokenRequest.constructor"}}],"overwrites":{"type":"reference","name":"TokenRequest.constructor"}},{"name":"clientId","kind":1024,"flags":{"isReadonly":true},"comment":{"summary":[{"kind":"text","text":"A unique string representing the registration information provided by the client.\nThe client identifier is not a secret; it is exposed to the resource owner and shouldn't be used\nalone for client authentication.\n\nThe client identifier is unique to the authorization server.\n\n[Section 2.2](https://tools.ietf.org/html/rfc6749#section-2.2)"}]},"type":{"type":"intrinsic","name":"string"},"inheritedFrom":{"type":"reference","name":"TokenRequest.clientId"},"implementationOf":{"type":"reference","name":"RefreshTokenRequestConfig.clientId"}},{"name":"clientSecret","kind":1024,"flags":{"isOptional":true,"isReadonly":true},"comment":{"summary":[{"kind":"text","text":"Client secret supplied by an auth provider.\nThere is no secure way to store this on the client.\n\n[Section 2.3.1](https://tools.ietf.org/html/rfc6749#section-2.3.1)"}]},"type":{"type":"intrinsic","name":"string"},"inheritedFrom":{"type":"reference","name":"TokenRequest.clientSecret"},"implementationOf":{"type":"reference","name":"RefreshTokenRequestConfig.clientSecret"}},{"name":"extraParams","kind":1024,"flags":{"isOptional":true,"isReadonly":true},"comment":{"summary":[{"kind":"text","text":"Extra query params that'll be added to the query string."}]},"type":{"type":"reference","typeArguments":[{"type":"intrinsic","name":"string"},{"type":"intrinsic","name":"string"}],"name":"Record","qualifiedName":"Record","package":"typescript"},"inheritedFrom":{"type":"reference","name":"TokenRequest.extraParams"},"implementationOf":{"type":"reference","name":"RefreshTokenRequestConfig.extraParams"}},{"name":"grantType","kind":1024,"flags":{"isPublic":true},"type":{"type":"reference","name":"GrantType"},"inheritedFrom":{"type":"reference","name":"TokenRequest.grantType"}},{"name":"refreshToken","kind":1024,"flags":{"isOptional":true,"isReadonly":true},"comment":{"summary":[{"kind":"text","text":"The refresh token issued to the client."}]},"type":{"type":"intrinsic","name":"string"},"implementationOf":{"type":"reference","name":"RefreshTokenRequestConfig.refreshToken"}},{"name":"scopes","kind":1024,"flags":{"isOptional":true,"isReadonly":true},"comment":{"summary":[{"kind":"text","text":"List of strings to request access to.\n\n[Section 3.3](https://tools.ietf.org/html/rfc6749#section-3.3)"}]},"type":{"type":"array","elementType":{"type":"intrinsic","name":"string"}},"inheritedFrom":{"type":"reference","name":"TokenRequest.scopes"},"implementationOf":{"type":"reference","name":"RefreshTokenRequestConfig.scopes"}},{"name":"getHeaders","kind":2048,"signatures":[{"name":"getHeaders","kind":4096,"type":{"type":"reference","name":"Headers"},"inheritedFrom":{"type":"reference","name":"TokenRequest.getHeaders"}}],"inheritedFrom":{"type":"reference","name":"TokenRequest.getHeaders"}},{"name":"getQueryBody","kind":2048,"signatures":[{"name":"getQueryBody","kind":4096,"type":{"type":"reference","typeArguments":[{"type":"intrinsic","name":"string"},{"type":"intrinsic","name":"string"}],"name":"Record","qualifiedName":"Record","package":"typescript"},"overwrites":{"type":"reference","name":"TokenRequest.getQueryBody"}}],"overwrites":{"type":"reference","name":"TokenRequest.getQueryBody"}},{"name":"getRequestConfig","kind":2048,"signatures":[{"name":"getRequestConfig","kind":4096,"type":{"type":"reflection","declaration":{"name":"__type","kind":65536,"children":[{"name":"clientId","kind":1024,"type":{"type":"intrinsic","name":"string"},"defaultValue":"..."},{"name":"clientSecret","kind":1024,"type":{"type":"union","types":[{"type":"intrinsic","name":"undefined"},{"type":"intrinsic","name":"string"}]},"defaultValue":"..."},{"name":"extraParams","kind":1024,"type":{"type":"union","types":[{"type":"intrinsic","name":"undefined"},{"type":"reference","typeArguments":[{"type":"intrinsic","name":"string"},{"type":"intrinsic","name":"string"}],"name":"Record","qualifiedName":"Record","package":"typescript"}]},"defaultValue":"..."},{"name":"grantType","kind":1024,"type":{"type":"reference","name":"GrantType"},"defaultValue":"..."},{"name":"refreshToken","kind":1024,"type":{"type":"union","types":[{"type":"intrinsic","name":"undefined"},{"type":"intrinsic","name":"string"}]},"defaultValue":"..."},{"name":"scopes","kind":1024,"type":{"type":"union","types":[{"type":"intrinsic","name":"undefined"},{"type":"array","elementType":{"type":"intrinsic","name":"string"}}]},"defaultValue":"..."}]}},"overwrites":{"type":"reference","name":"TokenRequest.getRequestConfig"}}],"overwrites":{"type":"reference","name":"TokenRequest.getRequestConfig"}},{"name":"performAsync","kind":2048,"signatures":[{"name":"performAsync","kind":4096,"parameters":[{"name":"discovery","kind":32768,"type":{"type":"reference","typeArguments":[{"type":"reference","name":"DiscoveryDocument"},{"type":"literal","value":"tokenEndpoint"}],"name":"Pick","qualifiedName":"Pick","package":"typescript"}}],"type":{"type":"reference","typeArguments":[{"type":"reference","name":"TokenResponse"}],"name":"Promise","qualifiedName":"Promise","package":"typescript"},"inheritedFrom":{"type":"reference","name":"TokenRequest.performAsync"}}],"inheritedFrom":{"type":"reference","name":"TokenRequest.performAsync"}}],"extendedTypes":[{"type":"reference","typeArguments":[{"type":"reference","name":"RefreshTokenRequestConfig"}],"name":"TokenRequest"}],"implementedTypes":[{"type":"reference","name":"RefreshTokenRequestConfig"}]},{"name":"RevokeTokenRequest","kind":128,"comment":{"summary":[{"kind":"text","text":"Revocation request for a given token.\n\n[Section 2.1](https://tools.ietf.org/html/rfc7009#section-2.1)"}]},"children":[{"name":"constructor","kind":512,"signatures":[{"name":"new RevokeTokenRequest","kind":16384,"parameters":[{"name":"request","kind":32768,"type":{"type":"reference","name":"RevokeTokenRequestConfig"}}],"type":{"type":"reference","name":"RevokeTokenRequest"},"overwrites":{"type":"reference","name":"Request.constructor"}}],"overwrites":{"type":"reference","name":"Request.constructor"}},{"name":"clientId","kind":1024,"flags":{"isOptional":true,"isReadonly":true},"comment":{"summary":[{"kind":"text","text":"A unique string representing the registration information provided by the client.\nThe client identifier is not a secret; it is exposed to the resource owner and shouldn't be used\nalone for client authentication.\n\nThe client identifier is unique to the authorization server.\n\n[Section 2.2](https://tools.ietf.org/html/rfc6749#section-2.2)"}]},"type":{"type":"intrinsic","name":"string"},"implementationOf":{"type":"reference","name":"RevokeTokenRequestConfig.clientId"}},{"name":"clientSecret","kind":1024,"flags":{"isOptional":true,"isReadonly":true},"comment":{"summary":[{"kind":"text","text":"Client secret supplied by an auth provider.\nThere is no secure way to store this on the client.\n\n[Section 2.3.1](https://tools.ietf.org/html/rfc6749#section-2.3.1)"}]},"type":{"type":"intrinsic","name":"string"},"implementationOf":{"type":"reference","name":"RevokeTokenRequestConfig.clientSecret"}},{"name":"token","kind":1024,"flags":{"isReadonly":true},"comment":{"summary":[{"kind":"text","text":"The token that the client wants to get revoked.\n\n[Section 3.1](https://tools.ietf.org/html/rfc6749#section-3.1)"}]},"type":{"type":"intrinsic","name":"string"},"implementationOf":{"type":"reference","name":"RevokeTokenRequestConfig.token"}},{"name":"tokenTypeHint","kind":1024,"flags":{"isOptional":true,"isReadonly":true},"comment":{"summary":[{"kind":"text","text":"A hint about the type of the token submitted for revocation.\n\n[Section 3.2](https://tools.ietf.org/html/rfc6749#section-3.2)"}]},"type":{"type":"reference","name":"TokenTypeHint"},"implementationOf":{"type":"reference","name":"RevokeTokenRequestConfig.tokenTypeHint"}},{"name":"getHeaders","kind":2048,"signatures":[{"name":"getHeaders","kind":4096,"type":{"type":"reference","name":"Headers"}}]},{"name":"getQueryBody","kind":2048,"signatures":[{"name":"getQueryBody","kind":4096,"type":{"type":"reference","typeArguments":[{"type":"intrinsic","name":"string"},{"type":"intrinsic","name":"string"}],"name":"Record","qualifiedName":"Record","package":"typescript"},"overwrites":{"type":"reference","name":"Request.getQueryBody"}}],"overwrites":{"type":"reference","name":"Request.getQueryBody"}},{"name":"getRequestConfig","kind":2048,"signatures":[{"name":"getRequestConfig","kind":4096,"type":{"type":"reflection","declaration":{"name":"__type","kind":65536,"children":[{"name":"clientId","kind":1024,"type":{"type":"union","types":[{"type":"intrinsic","name":"undefined"},{"type":"intrinsic","name":"string"}]},"defaultValue":"..."},{"name":"clientSecret","kind":1024,"type":{"type":"union","types":[{"type":"intrinsic","name":"undefined"},{"type":"intrinsic","name":"string"}]},"defaultValue":"..."},{"name":"token","kind":1024,"type":{"type":"intrinsic","name":"string"},"defaultValue":"..."},{"name":"tokenTypeHint","kind":1024,"type":{"type":"union","types":[{"type":"intrinsic","name":"undefined"},{"type":"reference","name":"TokenTypeHint"}]},"defaultValue":"..."}]}},"overwrites":{"type":"reference","name":"Request.getRequestConfig"}}],"overwrites":{"type":"reference","name":"Request.getRequestConfig"}},{"name":"performAsync","kind":2048,"signatures":[{"name":"performAsync","kind":4096,"comment":{"summary":[{"kind":"text","text":"Perform a token revocation request."}]},"parameters":[{"name":"discovery","kind":32768,"comment":{"summary":[{"kind":"text","text":"The "},{"kind":"code","text":"`revocationEndpoint`"},{"kind":"text","text":" for a provider."}]},"type":{"type":"reference","typeArguments":[{"type":"reference","name":"DiscoveryDocument"},{"type":"literal","value":"revocationEndpoint"}],"name":"Pick","qualifiedName":"Pick","package":"typescript"}}],"type":{"type":"reference","typeArguments":[{"type":"intrinsic","name":"boolean"}],"name":"Promise","qualifiedName":"Promise","package":"typescript"},"overwrites":{"type":"reference","name":"Request.performAsync"}}],"overwrites":{"type":"reference","name":"Request.performAsync"}}],"extendedTypes":[{"type":"reference","typeArguments":[{"type":"reference","name":"RevokeTokenRequestConfig"},{"type":"intrinsic","name":"boolean"}],"name":"Request"}],"implementedTypes":[{"type":"reference","name":"RevokeTokenRequestConfig"}]},{"name":"TokenError","kind":128,"comment":{"summary":[{"kind":"text","text":"[Section 4.1.2.1](https://tools.ietf.org/html/rfc6749#section-4.1.2.1)"}]},"children":[{"name":"constructor","kind":512,"signatures":[{"name":"new TokenError","kind":16384,"parameters":[{"name":"response","kind":32768,"type":{"type":"reference","name":"ResponseErrorConfig"}}],"type":{"type":"reference","name":"TokenError"},"overwrites":{"type":"reference","name":"ResponseError.constructor"}}],"overwrites":{"type":"reference","name":"ResponseError.constructor"}},{"name":"code","kind":1024,"type":{"type":"intrinsic","name":"string"},"inheritedFrom":{"type":"reference","name":"ResponseError.code"}},{"name":"description","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"Used to assist the client developer in\nunderstanding the error that occurred."}]},"type":{"type":"intrinsic","name":"string"},"inheritedFrom":{"type":"reference","name":"ResponseError.description"}},{"name":"info","kind":1024,"flags":{"isOptional":true},"type":{"type":"intrinsic","name":"any"},"inheritedFrom":{"type":"reference","name":"ResponseError.info"}},{"name":"params","kind":1024,"comment":{"summary":[{"kind":"text","text":"Raw results of the error."}]},"type":{"type":"reference","typeArguments":[{"type":"intrinsic","name":"string"},{"type":"intrinsic","name":"string"}],"name":"Record","qualifiedName":"Record","package":"typescript"},"inheritedFrom":{"type":"reference","name":"ResponseError.params"}},{"name":"uri","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"A URI identifying a human-readable web page with\ninformation about the error, used to provide the client\ndeveloper with additional information about the error."}]},"type":{"type":"intrinsic","name":"string"},"inheritedFrom":{"type":"reference","name":"ResponseError.uri"}}],"extendedTypes":[{"type":"reference","name":"ResponseError"}]},{"name":"TokenResponse","kind":128,"comment":{"summary":[{"kind":"text","text":"Token Response.\n\n[Section 5.1](https://tools.ietf.org/html/rfc6749#section-5.1)"}]},"children":[{"name":"constructor","kind":512,"signatures":[{"name":"new TokenResponse","kind":16384,"parameters":[{"name":"response","kind":32768,"type":{"type":"reference","name":"TokenResponseConfig"}}],"type":{"type":"reference","name":"TokenResponse"}}]},{"name":"accessToken","kind":1024,"comment":{"summary":[{"kind":"text","text":"The access token issued by the authorization server.\n\n[Section 4.2.2](https://tools.ietf.org/html/rfc6749#section-4.2.2)"}]},"type":{"type":"intrinsic","name":"string"},"implementationOf":{"type":"reference","name":"TokenResponseConfig.accessToken"}},{"name":"expiresIn","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"The lifetime in seconds of the access token.\n\nFor example, the value "},{"kind":"code","text":"`3600`"},{"kind":"text","text":" denotes that the access token will\nexpire in one hour from the time the response was generated.\n\nIf omitted, the authorization server should provide the\nexpiration time via other means or document the default value.\n\n[Section 4.2.2](https://tools.ietf.org/html/rfc6749#section-4.2.2)"}]},"type":{"type":"intrinsic","name":"number"},"implementationOf":{"type":"reference","name":"TokenResponseConfig.expiresIn"}},{"name":"idToken","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"ID Token value associated with the authenticated session.\n\n[TokenResponse](https://openid.net/specs/openid-connect-core-1_0.html#TokenResponse)"}]},"type":{"type":"intrinsic","name":"string"},"implementationOf":{"type":"reference","name":"TokenResponseConfig.idToken"}},{"name":"issuedAt","kind":1024,"comment":{"summary":[{"kind":"text","text":"Time in seconds when the token was received by the client."}]},"type":{"type":"intrinsic","name":"number"},"implementationOf":{"type":"reference","name":"TokenResponseConfig.issuedAt"}},{"name":"refreshToken","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"The refresh token, which can be used to obtain new access tokens using the same authorization grant.\n\n[Section 5.1](https://tools.ietf.org/html/rfc6749#section-5.1)"}]},"type":{"type":"intrinsic","name":"string"},"implementationOf":{"type":"reference","name":"TokenResponseConfig.refreshToken"}},{"name":"scope","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"The scope of the access token. Only required if it's different to the scope that was requested by the client.\n\n[Section 3.3](https://tools.ietf.org/html/rfc6749#section-3.3)"}]},"type":{"type":"intrinsic","name":"string"},"implementationOf":{"type":"reference","name":"TokenResponseConfig.scope"}},{"name":"state","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"Required if the \"state\" parameter was present in the client\nauthorization request. The exact value received from the client.\n\n[Section 4.2.2](https://tools.ietf.org/html/rfc6749#section-4.2.2)"}]},"type":{"type":"intrinsic","name":"string"},"implementationOf":{"type":"reference","name":"TokenResponseConfig.state"}},{"name":"tokenType","kind":1024,"comment":{"summary":[{"kind":"text","text":"The type of the token issued. Value is case insensitive.\n\n[Section 7.1](https://tools.ietf.org/html/rfc6749#section-7.1)"}]},"type":{"type":"reference","name":"TokenType"},"implementationOf":{"type":"reference","name":"TokenResponseConfig.tokenType"}},{"name":"getRequestConfig","kind":2048,"signatures":[{"name":"getRequestConfig","kind":4096,"type":{"type":"reference","name":"TokenResponseConfig"}}]},{"name":"refreshAsync","kind":2048,"signatures":[{"name":"refreshAsync","kind":4096,"parameters":[{"name":"config","kind":32768,"type":{"type":"reference","typeArguments":[{"type":"reference","name":"TokenRequestConfig"},{"type":"union","types":[{"type":"literal","value":"grantType"},{"type":"literal","value":"refreshToken"}]}],"name":"Omit","qualifiedName":"Omit","package":"typescript"}},{"name":"discovery","kind":32768,"type":{"type":"reference","typeArguments":[{"type":"reference","name":"DiscoveryDocument"},{"type":"literal","value":"tokenEndpoint"}],"name":"Pick","qualifiedName":"Pick","package":"typescript"}}],"type":{"type":"reference","typeArguments":[{"type":"reference","name":"TokenResponse"}],"name":"Promise","qualifiedName":"Promise","package":"typescript"}}]},{"name":"shouldRefresh","kind":2048,"signatures":[{"name":"shouldRefresh","kind":4096,"type":{"type":"intrinsic","name":"boolean"}}]},{"name":"fromQueryParams","kind":2048,"flags":{"isStatic":true},"signatures":[{"name":"fromQueryParams","kind":4096,"comment":{"summary":[{"kind":"text","text":"Creates a "},{"kind":"code","text":"`TokenResponse`"},{"kind":"text","text":" from query parameters returned from an "},{"kind":"code","text":"`AuthRequest`"},{"kind":"text","text":"."}]},"parameters":[{"name":"params","kind":32768,"type":{"type":"reference","typeArguments":[{"type":"intrinsic","name":"string"},{"type":"intrinsic","name":"any"}],"name":"Record","qualifiedName":"Record","package":"typescript"}}],"type":{"type":"reference","name":"TokenResponse"}}]},{"name":"isTokenFresh","kind":2048,"flags":{"isStatic":true},"signatures":[{"name":"isTokenFresh","kind":4096,"comment":{"summary":[{"kind":"text","text":"Determines whether a token refresh request must be made to refresh the tokens"}]},"parameters":[{"name":"token","kind":32768,"type":{"type":"reference","typeArguments":[{"type":"reference","name":"TokenResponse"},{"type":"union","types":[{"type":"literal","value":"expiresIn"},{"type":"literal","value":"issuedAt"}]}],"name":"Pick","qualifiedName":"Pick","package":"typescript"}},{"name":"secondsMargin","kind":32768,"type":{"type":"intrinsic","name":"number"},"defaultValue":"..."}],"type":{"type":"intrinsic","name":"boolean"}}]}],"implementedTypes":[{"type":"reference","name":"TokenResponseConfig"}]},{"name":"AccessTokenRequestConfig","kind":256,"comment":{"summary":[{"kind":"text","text":"Config used to exchange an authorization code for an access token."}],"blockTags":[{"tag":"@see","content":[{"kind":"text","text":"[Section 4.1.3](https://tools.ietf.org/html/rfc6749#section-4.1.3)"}]}]},"children":[{"name":"clientId","kind":1024,"comment":{"summary":[{"kind":"text","text":"A unique string representing the registration information provided by the client.\nThe client identifier is not a secret; it is exposed to the resource owner and shouldn't be used\nalone for client authentication.\n\nThe client identifier is unique to the authorization server.\n\n[Section 2.2](https://tools.ietf.org/html/rfc6749#section-2.2)"}]},"type":{"type":"intrinsic","name":"string"},"inheritedFrom":{"type":"reference","name":"TokenRequestConfig.clientId"}},{"name":"clientSecret","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"Client secret supplied by an auth provider.\nThere is no secure way to store this on the client.\n\n[Section 2.3.1](https://tools.ietf.org/html/rfc6749#section-2.3.1)"}]},"type":{"type":"intrinsic","name":"string"},"inheritedFrom":{"type":"reference","name":"TokenRequestConfig.clientSecret"}},{"name":"code","kind":1024,"comment":{"summary":[{"kind":"text","text":"The authorization code received from the authorization server."}]},"type":{"type":"intrinsic","name":"string"}},{"name":"extraParams","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"Extra query params that'll be added to the query string."}]},"type":{"type":"reference","typeArguments":[{"type":"intrinsic","name":"string"},{"type":"intrinsic","name":"string"}],"name":"Record","qualifiedName":"Record","package":"typescript"},"inheritedFrom":{"type":"reference","name":"TokenRequestConfig.extraParams"}},{"name":"redirectUri","kind":1024,"comment":{"summary":[{"kind":"text","text":"If the "},{"kind":"code","text":"`redirectUri`"},{"kind":"text","text":" parameter was included in the "},{"kind":"code","text":"`AuthRequest`"},{"kind":"text","text":", then it must be supplied here as well.\n\n[Section 3.1.2](https://tools.ietf.org/html/rfc6749#section-3.1.2)"}]},"type":{"type":"intrinsic","name":"string"}},{"name":"scopes","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"List of strings to request access to.\n\n[Section 3.3](https://tools.ietf.org/html/rfc6749#section-3.3)"}]},"type":{"type":"array","elementType":{"type":"intrinsic","name":"string"}},"inheritedFrom":{"type":"reference","name":"TokenRequestConfig.scopes"}}],"extendedTypes":[{"type":"reference","name":"TokenRequestConfig"}],"implementedBy":[{"type":"reference","name":"AccessTokenRequest"}]},{"name":"AuthRequestConfig","kind":256,"comment":{"summary":[{"kind":"text","text":"Represents an OAuth authorization request as JSON."}]},"children":[{"name":"clientId","kind":1024,"comment":{"summary":[{"kind":"text","text":"A unique string representing the registration information provided by the client.\nThe client identifier is not a secret; it is exposed to the resource owner and shouldn't be used\nalone for client authentication.\n\nThe client identifier is unique to the authorization server.\n\n[Section 2.2](https://tools.ietf.org/html/rfc6749#section-2.2)"}]},"type":{"type":"intrinsic","name":"string"}},{"name":"clientSecret","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"Client secret supplied by an auth provider.\nThere is no secure way to store this on the client.\n\n[Section 2.3.1](https://tools.ietf.org/html/rfc6749#section-2.3.1)"}]},"type":{"type":"intrinsic","name":"string"}},{"name":"codeChallenge","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"Derived from the code verifier by using the "},{"kind":"code","text":"`CodeChallengeMethod`"},{"kind":"text","text":".\n\n[Section 4.2](https://tools.ietf.org/html/rfc7636#section-4.2)"}]},"type":{"type":"intrinsic","name":"string"}},{"name":"codeChallengeMethod","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"Method used to generate the code challenge. You should never use "},{"kind":"code","text":"`Plain`"},{"kind":"text","text":" as it's not good enough for secure verification."}],"blockTags":[{"tag":"@default","content":[{"kind":"text","text":"CodeChallengeMethod.S256"}]}]},"type":{"type":"reference","name":"CodeChallengeMethod"}},{"name":"extraParams","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"Extra query params that'll be added to the query string."}]},"type":{"type":"reference","typeArguments":[{"type":"intrinsic","name":"string"},{"type":"intrinsic","name":"string"}],"name":"Record","qualifiedName":"Record","package":"typescript"}},{"name":"prompt","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"Informs the server if the user should be prompted to login or consent again.\nThis can be used to present a dialog for switching accounts after the user has already been logged in.\n\n[Section 3.1.2.1](https://openid.net/specs/openid-connect-core-1_0.html#AuthorizationRequest)"}]},"type":{"type":"reference","name":"Prompt"}},{"name":"redirectUri","kind":1024,"comment":{"summary":[{"kind":"text","text":"After completing an interaction with a resource owner the\nserver will redirect to this URI. Learn more about [linking in Expo](/guides/linking/).\n\n[Section 3.1.2](https://tools.ietf.org/html/rfc6749#section-3.1.2)"}]},"type":{"type":"intrinsic","name":"string"}},{"name":"responseType","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"Specifies what is returned from the authorization server.\n\n[Section 3.1.1](https://tools.ietf.org/html/rfc6749#section-3.1.1)"}],"blockTags":[{"tag":"@default","content":[{"kind":"text","text":"ResponseType.Code"}]}]},"type":{"type":"intrinsic","name":"string"}},{"name":"scopes","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"List of strings to request access to.\n\n[Section 3.3](https://tools.ietf.org/html/rfc6749#section-3.3)"}]},"type":{"type":"array","elementType":{"type":"intrinsic","name":"string"}}},{"name":"state","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"Used for protection against [Cross-Site Request Forgery](https://tools.ietf.org/html/rfc6749#section-10.12)."}]},"type":{"type":"intrinsic","name":"string"}},{"name":"usePKCE","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"Should use [Proof Key for Code Exchange](https://oauth.net/2/pkce/)."}],"blockTags":[{"tag":"@default","content":[{"kind":"text","text":"true"}]}]},"type":{"type":"intrinsic","name":"boolean"}}]},{"name":"DiscoveryDocument","kind":256,"children":[{"name":"authorizationEndpoint","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"Used to interact with the resource owner and obtain an authorization grant.\n\n[Section 3.1](https://tools.ietf.org/html/rfc6749#section-3.1)"}]},"type":{"type":"intrinsic","name":"string"}},{"name":"discoveryDocument","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"All metadata about the provider."}]},"type":{"type":"reference","name":"ProviderMetadata"}},{"name":"endSessionEndpoint","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"URL at the OP to which an RP can perform a redirect to request that the End-User be logged out at the OP.\n\n[OPMetadata](https://openid.net/specs/openid-connect-session-1_0-17.html#OPMetadata)"}]},"type":{"type":"intrinsic","name":"string"}},{"name":"registrationEndpoint","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"URL of the OP's [Dynamic Client Registration](https://openid.net/specs/openid-connect-discovery-1_0.html#OpenID.Registration) Endpoint."}]},"type":{"type":"intrinsic","name":"string"}},{"name":"revocationEndpoint","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"Used to revoke a token (generally for signing out). The spec requires a revocation endpoint,\nbut some providers (like Spotify) do not support one.\n\n[Section 2.1](https://tools.ietf.org/html/rfc7009#section-2.1)"}]},"type":{"type":"intrinsic","name":"string"}},{"name":"tokenEndpoint","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"Used by the client to obtain an access token by presenting its authorization grant or refresh token.\nThe token endpoint is used with every authorization grant except for the\nimplicit grant type (since an access token is issued directly).\n\n[Section 3.2](https://tools.ietf.org/html/rfc6749#section-3.2)"}]},"type":{"type":"intrinsic","name":"string"}},{"name":"userInfoEndpoint","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"URL of the OP's UserInfo Endpoint used to return info about the authenticated user.\n\n[UserInfo](https://openid.net/specs/openid-connect-core-1_0.html#UserInfo)"}]},"type":{"type":"intrinsic","name":"string"}}]},{"name":"FacebookAuthRequestConfig","kind":256,"children":[{"name":"androidClientId","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"Android native client ID for use in development builds and bare workflow."}]},"type":{"type":"intrinsic","name":"string"}},{"name":"clientId","kind":1024,"comment":{"summary":[{"kind":"text","text":"A unique string representing the registration information provided by the client.\nThe client identifier is not a secret; it is exposed to the resource owner and shouldn't be used\nalone for client authentication.\n\nThe client identifier is unique to the authorization server.\n\n[Section 2.2](https://tools.ietf.org/html/rfc6749#section-2.2)"}]},"type":{"type":"intrinsic","name":"string"},"inheritedFrom":{"type":"reference","name":"ProviderAuthRequestConfig.clientId"}},{"name":"clientSecret","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"Client secret supplied by an auth provider.\nThere is no secure way to store this on the client.\n\n[Section 2.3.1](https://tools.ietf.org/html/rfc6749#section-2.3.1)"}]},"type":{"type":"intrinsic","name":"string"},"inheritedFrom":{"type":"reference","name":"ProviderAuthRequestConfig.clientSecret"}},{"name":"codeChallenge","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"Derived from the code verifier by using the "},{"kind":"code","text":"`CodeChallengeMethod`"},{"kind":"text","text":".\n\n[Section 4.2](https://tools.ietf.org/html/rfc7636#section-4.2)"}]},"type":{"type":"intrinsic","name":"string"},"inheritedFrom":{"type":"reference","name":"ProviderAuthRequestConfig.codeChallenge"}},{"name":"codeChallengeMethod","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"Method used to generate the code challenge. You should never use "},{"kind":"code","text":"`Plain`"},{"kind":"text","text":" as it's not good enough for secure verification."}],"blockTags":[{"tag":"@default","content":[{"kind":"text","text":"CodeChallengeMethod.S256"}]}]},"type":{"type":"reference","name":"CodeChallengeMethod"},"inheritedFrom":{"type":"reference","name":"ProviderAuthRequestConfig.codeChallengeMethod"}},{"name":"expoClientId","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"Proxy client ID for use when testing with Expo Go on Android and iOS."}]},"type":{"type":"intrinsic","name":"string"}},{"name":"extraParams","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"Extra query params that'll be added to the query string."}]},"type":{"type":"reference","typeArguments":[{"type":"intrinsic","name":"string"},{"type":"intrinsic","name":"string"}],"name":"Record","qualifiedName":"Record","package":"typescript"},"inheritedFrom":{"type":"reference","name":"ProviderAuthRequestConfig.extraParams"}},{"name":"iosClientId","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"iOS native client ID for use in development builds and bare workflow."}]},"type":{"type":"intrinsic","name":"string"}},{"name":"language","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"Language for the sign in UI, in the form of ISO 639-1 language code optionally followed by a dash\nand ISO 3166-1 alpha-2 region code, such as 'it' or 'pt-PT'.\nOnly set this value if it's different from the system default (which you can access via expo-localization)."}]},"type":{"type":"intrinsic","name":"string"},"inheritedFrom":{"type":"reference","name":"ProviderAuthRequestConfig.language"}},{"name":"prompt","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"Informs the server if the user should be prompted to login or consent again.\nThis can be used to present a dialog for switching accounts after the user has already been logged in.\n\n[Section 3.1.2.1](https://openid.net/specs/openid-connect-core-1_0.html#AuthorizationRequest)"}]},"type":{"type":"reference","name":"Prompt"},"inheritedFrom":{"type":"reference","name":"ProviderAuthRequestConfig.prompt"}},{"name":"redirectUri","kind":1024,"comment":{"summary":[{"kind":"text","text":"After completing an interaction with a resource owner the\nserver will redirect to this URI. Learn more about [linking in Expo](/guides/linking/).\n\n[Section 3.1.2](https://tools.ietf.org/html/rfc6749#section-3.1.2)"}]},"type":{"type":"intrinsic","name":"string"},"inheritedFrom":{"type":"reference","name":"ProviderAuthRequestConfig.redirectUri"}},{"name":"responseType","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"Specifies what is returned from the authorization server.\n\n[Section 3.1.1](https://tools.ietf.org/html/rfc6749#section-3.1.1)"}],"blockTags":[{"tag":"@default","content":[{"kind":"text","text":"ResponseType.Code"}]}]},"type":{"type":"intrinsic","name":"string"},"inheritedFrom":{"type":"reference","name":"ProviderAuthRequestConfig.responseType"}},{"name":"scopes","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"List of strings to request access to.\n\n[Section 3.3](https://tools.ietf.org/html/rfc6749#section-3.3)"}]},"type":{"type":"array","elementType":{"type":"intrinsic","name":"string"}},"inheritedFrom":{"type":"reference","name":"ProviderAuthRequestConfig.scopes"}},{"name":"state","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"Used for protection against [Cross-Site Request Forgery](https://tools.ietf.org/html/rfc6749#section-10.12)."}]},"type":{"type":"intrinsic","name":"string"},"inheritedFrom":{"type":"reference","name":"ProviderAuthRequestConfig.state"}},{"name":"usePKCE","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"Should use [Proof Key for Code Exchange](https://oauth.net/2/pkce/)."}],"blockTags":[{"tag":"@default","content":[{"kind":"text","text":"true"}]}]},"type":{"type":"intrinsic","name":"boolean"},"inheritedFrom":{"type":"reference","name":"ProviderAuthRequestConfig.usePKCE"}},{"name":"webClientId","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"Expo web client ID for use in the browser."}]},"type":{"type":"intrinsic","name":"string"}}],"extendedTypes":[{"type":"reference","name":"ProviderAuthRequestConfig"}]},{"name":"GoogleAuthRequestConfig","kind":256,"children":[{"name":"androidClientId","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"Android native client ID for use in standalone, and bare workflow."}]},"type":{"type":"intrinsic","name":"string"}},{"name":"clientId","kind":1024,"comment":{"summary":[{"kind":"text","text":"A unique string representing the registration information provided by the client.\nThe client identifier is not a secret; it is exposed to the resource owner and shouldn't be used\nalone for client authentication.\n\nThe client identifier is unique to the authorization server.\n\n[Section 2.2](https://tools.ietf.org/html/rfc6749#section-2.2)"}]},"type":{"type":"intrinsic","name":"string"},"inheritedFrom":{"type":"reference","name":"ProviderAuthRequestConfig.clientId"}},{"name":"clientSecret","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"Client secret supplied by an auth provider.\nThere is no secure way to store this on the client.\n\n[Section 2.3.1](https://tools.ietf.org/html/rfc6749#section-2.3.1)"}]},"type":{"type":"intrinsic","name":"string"},"inheritedFrom":{"type":"reference","name":"ProviderAuthRequestConfig.clientSecret"}},{"name":"codeChallenge","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"Derived from the code verifier by using the "},{"kind":"code","text":"`CodeChallengeMethod`"},{"kind":"text","text":".\n\n[Section 4.2](https://tools.ietf.org/html/rfc7636#section-4.2)"}]},"type":{"type":"intrinsic","name":"string"},"inheritedFrom":{"type":"reference","name":"ProviderAuthRequestConfig.codeChallenge"}},{"name":"codeChallengeMethod","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"Method used to generate the code challenge. You should never use "},{"kind":"code","text":"`Plain`"},{"kind":"text","text":" as it's not good enough for secure verification."}],"blockTags":[{"tag":"@default","content":[{"kind":"text","text":"CodeChallengeMethod.S256"}]}]},"type":{"type":"reference","name":"CodeChallengeMethod"},"inheritedFrom":{"type":"reference","name":"ProviderAuthRequestConfig.codeChallengeMethod"}},{"name":"expoClientId","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"Proxy client ID for use in the Expo client on Android and iOS."}]},"type":{"type":"intrinsic","name":"string"}},{"name":"extraParams","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"Extra query params that'll be added to the query string."}]},"type":{"type":"reference","typeArguments":[{"type":"intrinsic","name":"string"},{"type":"intrinsic","name":"string"}],"name":"Record","qualifiedName":"Record","package":"typescript"},"inheritedFrom":{"type":"reference","name":"ProviderAuthRequestConfig.extraParams"}},{"name":"iosClientId","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"iOS native client ID for use in standalone, bare workflow, and custom clients."}]},"type":{"type":"intrinsic","name":"string"}},{"name":"language","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"Language code ISO 3166-1 alpha-2 region code, such as 'it' or 'pt-PT'."}]},"type":{"type":"intrinsic","name":"string"},"overwrites":{"type":"reference","name":"ProviderAuthRequestConfig.language"}},{"name":"loginHint","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"If the user's email address is known ahead of time, it can be supplied to be the default option.\nIf the user has approved access for this app in the past then auth may return without any further interaction."}]},"type":{"type":"intrinsic","name":"string"}},{"name":"prompt","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"Informs the server if the user should be prompted to login or consent again.\nThis can be used to present a dialog for switching accounts after the user has already been logged in.\n\n[Section 3.1.2.1](https://openid.net/specs/openid-connect-core-1_0.html#AuthorizationRequest)"}]},"type":{"type":"reference","name":"Prompt"},"inheritedFrom":{"type":"reference","name":"ProviderAuthRequestConfig.prompt"}},{"name":"redirectUri","kind":1024,"comment":{"summary":[{"kind":"text","text":"After completing an interaction with a resource owner the\nserver will redirect to this URI. Learn more about [linking in Expo](/guides/linking/).\n\n[Section 3.1.2](https://tools.ietf.org/html/rfc6749#section-3.1.2)"}]},"type":{"type":"intrinsic","name":"string"},"inheritedFrom":{"type":"reference","name":"ProviderAuthRequestConfig.redirectUri"}},{"name":"responseType","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"Specifies what is returned from the authorization server.\n\n[Section 3.1.1](https://tools.ietf.org/html/rfc6749#section-3.1.1)"}],"blockTags":[{"tag":"@default","content":[{"kind":"text","text":"ResponseType.Code"}]}]},"type":{"type":"intrinsic","name":"string"},"inheritedFrom":{"type":"reference","name":"ProviderAuthRequestConfig.responseType"}},{"name":"scopes","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"List of strings to request access to.\n\n[Section 3.3](https://tools.ietf.org/html/rfc6749#section-3.3)"}]},"type":{"type":"array","elementType":{"type":"intrinsic","name":"string"}},"inheritedFrom":{"type":"reference","name":"ProviderAuthRequestConfig.scopes"}},{"name":"selectAccount","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"When "},{"kind":"code","text":"`true`"},{"kind":"text","text":", the service will allow the user to switch between accounts (if possible)."}],"blockTags":[{"tag":"@default","content":[{"kind":"text","text":"false."}]}]},"type":{"type":"intrinsic","name":"boolean"}},{"name":"shouldAutoExchangeCode","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"Should the hook automatically exchange the response code for an authentication token.\n\nDefaults to "},{"kind":"code","text":"`true`"},{"kind":"text","text":" on installed apps (Android, iOS) when "},{"kind":"code","text":"`ResponseType.Code`"},{"kind":"text","text":" is used (default)."}]},"type":{"type":"intrinsic","name":"boolean"}},{"name":"state","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"Used for protection against [Cross-Site Request Forgery](https://tools.ietf.org/html/rfc6749#section-10.12)."}]},"type":{"type":"intrinsic","name":"string"},"inheritedFrom":{"type":"reference","name":"ProviderAuthRequestConfig.state"}},{"name":"usePKCE","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"Should use [Proof Key for Code Exchange](https://oauth.net/2/pkce/)."}],"blockTags":[{"tag":"@default","content":[{"kind":"text","text":"true"}]}]},"type":{"type":"intrinsic","name":"boolean"},"inheritedFrom":{"type":"reference","name":"ProviderAuthRequestConfig.usePKCE"}},{"name":"webClientId","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"Expo web client ID for use in the browser."}]},"type":{"type":"intrinsic","name":"string"}}],"extendedTypes":[{"type":"reference","name":"ProviderAuthRequestConfig"}]},{"name":"RefreshTokenRequestConfig","kind":256,"comment":{"summary":[{"kind":"text","text":"Config used to request a token refresh, or code exchange."}],"blockTags":[{"tag":"@see","content":[{"kind":"text","text":"[Section 6](https://tools.ietf.org/html/rfc6749#section-6)"}]}]},"children":[{"name":"clientId","kind":1024,"comment":{"summary":[{"kind":"text","text":"A unique string representing the registration information provided by the client.\nThe client identifier is not a secret; it is exposed to the resource owner and shouldn't be used\nalone for client authentication.\n\nThe client identifier is unique to the authorization server.\n\n[Section 2.2](https://tools.ietf.org/html/rfc6749#section-2.2)"}]},"type":{"type":"intrinsic","name":"string"},"inheritedFrom":{"type":"reference","name":"TokenRequestConfig.clientId"}},{"name":"clientSecret","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"Client secret supplied by an auth provider.\nThere is no secure way to store this on the client.\n\n[Section 2.3.1](https://tools.ietf.org/html/rfc6749#section-2.3.1)"}]},"type":{"type":"intrinsic","name":"string"},"inheritedFrom":{"type":"reference","name":"TokenRequestConfig.clientSecret"}},{"name":"extraParams","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"Extra query params that'll be added to the query string."}]},"type":{"type":"reference","typeArguments":[{"type":"intrinsic","name":"string"},{"type":"intrinsic","name":"string"}],"name":"Record","qualifiedName":"Record","package":"typescript"},"inheritedFrom":{"type":"reference","name":"TokenRequestConfig.extraParams"}},{"name":"refreshToken","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"The refresh token issued to the client."}]},"type":{"type":"intrinsic","name":"string"}},{"name":"scopes","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"List of strings to request access to.\n\n[Section 3.3](https://tools.ietf.org/html/rfc6749#section-3.3)"}]},"type":{"type":"array","elementType":{"type":"intrinsic","name":"string"}},"inheritedFrom":{"type":"reference","name":"TokenRequestConfig.scopes"}}],"extendedTypes":[{"type":"reference","name":"TokenRequestConfig"}],"implementedBy":[{"type":"reference","name":"RefreshTokenRequest"}]},{"name":"RevokeTokenRequestConfig","kind":256,"comment":{"summary":[{"kind":"text","text":"Config used to revoke a token."}],"blockTags":[{"tag":"@see","content":[{"kind":"text","text":"[Section 2.1](https://tools.ietf.org/html/rfc7009#section-2.1)"}]}]},"children":[{"name":"clientId","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"A unique string representing the registration information provided by the client.\nThe client identifier is not a secret; it is exposed to the resource owner and shouldn't be used\nalone for client authentication.\n\nThe client identifier is unique to the authorization server.\n\n[Section 2.2](https://tools.ietf.org/html/rfc6749#section-2.2)"}]},"type":{"type":"intrinsic","name":"string"},"inheritedFrom":{"type":"reference","name":"Partial.clientId"}},{"name":"clientSecret","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"Client secret supplied by an auth provider.\nThere is no secure way to store this on the client.\n\n[Section 2.3.1](https://tools.ietf.org/html/rfc6749#section-2.3.1)"}]},"type":{"type":"intrinsic","name":"string"},"inheritedFrom":{"type":"reference","name":"Partial.clientSecret"}},{"name":"extraParams","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"Extra query params that'll be added to the query string."}]},"type":{"type":"reference","typeArguments":[{"type":"intrinsic","name":"string"},{"type":"intrinsic","name":"string"}],"name":"Record","qualifiedName":"Record","package":"typescript"},"inheritedFrom":{"type":"reference","name":"Partial.extraParams"}},{"name":"scopes","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"List of strings to request access to.\n\n[Section 3.3](https://tools.ietf.org/html/rfc6749#section-3.3)"}]},"type":{"type":"array","elementType":{"type":"intrinsic","name":"string"}},"inheritedFrom":{"type":"reference","name":"Partial.scopes"}},{"name":"token","kind":1024,"comment":{"summary":[{"kind":"text","text":"The token that the client wants to get revoked.\n\n[Section 3.1](https://tools.ietf.org/html/rfc6749#section-3.1)"}]},"type":{"type":"intrinsic","name":"string"}},{"name":"tokenTypeHint","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"A hint about the type of the token submitted for revocation.\n\n[Section 3.2](https://tools.ietf.org/html/rfc6749#section-3.2)"}]},"type":{"type":"reference","name":"TokenTypeHint"}}],"extendedTypes":[{"type":"reference","typeArguments":[{"type":"reference","name":"TokenRequestConfig"}],"name":"Partial","qualifiedName":"Partial","package":"typescript"}],"implementedBy":[{"type":"reference","name":"RevokeTokenRequest"}]},{"name":"ServerTokenResponseConfig","kind":256,"comment":{"summary":[{"kind":"text","text":"Object returned from the server after a token response."}]},"children":[{"name":"access_token","kind":1024,"type":{"type":"intrinsic","name":"string"}},{"name":"expires_in","kind":1024,"flags":{"isOptional":true},"type":{"type":"intrinsic","name":"number"}},{"name":"id_token","kind":1024,"flags":{"isOptional":true},"type":{"type":"intrinsic","name":"string"}},{"name":"issued_at","kind":1024,"flags":{"isOptional":true},"type":{"type":"intrinsic","name":"number"}},{"name":"refresh_token","kind":1024,"flags":{"isOptional":true},"type":{"type":"intrinsic","name":"string"}},{"name":"scope","kind":1024,"flags":{"isOptional":true},"type":{"type":"intrinsic","name":"string"}},{"name":"token_type","kind":1024,"flags":{"isOptional":true},"type":{"type":"reference","name":"TokenType"}}]},{"name":"TokenRequestConfig","kind":256,"comment":{"summary":[{"kind":"text","text":"Config used to request a token refresh, revocation, or code exchange."}]},"children":[{"name":"clientId","kind":1024,"comment":{"summary":[{"kind":"text","text":"A unique string representing the registration information provided by the client.\nThe client identifier is not a secret; it is exposed to the resource owner and shouldn't be used\nalone for client authentication.\n\nThe client identifier is unique to the authorization server.\n\n[Section 2.2](https://tools.ietf.org/html/rfc6749#section-2.2)"}]},"type":{"type":"intrinsic","name":"string"}},{"name":"clientSecret","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"Client secret supplied by an auth provider.\nThere is no secure way to store this on the client.\n\n[Section 2.3.1](https://tools.ietf.org/html/rfc6749#section-2.3.1)"}]},"type":{"type":"intrinsic","name":"string"}},{"name":"extraParams","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"Extra query params that'll be added to the query string."}]},"type":{"type":"reference","typeArguments":[{"type":"intrinsic","name":"string"},{"type":"intrinsic","name":"string"}],"name":"Record","qualifiedName":"Record","package":"typescript"}},{"name":"scopes","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"List of strings to request access to.\n\n[Section 3.3](https://tools.ietf.org/html/rfc6749#section-3.3)"}]},"type":{"type":"array","elementType":{"type":"intrinsic","name":"string"}}}],"extendedBy":[{"type":"reference","name":"AccessTokenRequestConfig"},{"type":"reference","name":"RefreshTokenRequestConfig"}]},{"name":"TokenResponseConfig","kind":256,"children":[{"name":"accessToken","kind":1024,"comment":{"summary":[{"kind":"text","text":"The access token issued by the authorization server.\n\n[Section 4.2.2](https://tools.ietf.org/html/rfc6749#section-4.2.2)"}]},"type":{"type":"intrinsic","name":"string"}},{"name":"expiresIn","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"The lifetime in seconds of the access token.\n\nFor example, the value "},{"kind":"code","text":"`3600`"},{"kind":"text","text":" denotes that the access token will\nexpire in one hour from the time the response was generated.\n\nIf omitted, the authorization server should provide the\nexpiration time via other means or document the default value.\n\n[Section 4.2.2](https://tools.ietf.org/html/rfc6749#section-4.2.2)"}]},"type":{"type":"intrinsic","name":"number"}},{"name":"idToken","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"ID Token value associated with the authenticated session.\n\n[TokenResponse](https://openid.net/specs/openid-connect-core-1_0.html#TokenResponse)"}]},"type":{"type":"intrinsic","name":"string"}},{"name":"issuedAt","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"Time in seconds when the token was received by the client."}]},"type":{"type":"intrinsic","name":"number"}},{"name":"refreshToken","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"The refresh token, which can be used to obtain new access tokens using the same authorization grant.\n\n[Section 5.1](https://tools.ietf.org/html/rfc6749#section-5.1)"}]},"type":{"type":"intrinsic","name":"string"}},{"name":"scope","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"The scope of the access token. Only required if it's different to the scope that was requested by the client.\n\n[Section 3.3](https://tools.ietf.org/html/rfc6749#section-3.3)"}]},"type":{"type":"intrinsic","name":"string"}},{"name":"state","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"Required if the \"state\" parameter was present in the client\nauthorization request. The exact value received from the client.\n\n[Section 4.2.2](https://tools.ietf.org/html/rfc6749#section-4.2.2)"}]},"type":{"type":"intrinsic","name":"string"}},{"name":"tokenType","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"The type of the token issued. Value is case insensitive.\n\n[Section 7.1](https://tools.ietf.org/html/rfc6749#section-7.1)"}]},"type":{"type":"reference","name":"TokenType"}}],"implementedBy":[{"type":"reference","name":"TokenResponse"}]},{"name":"AuthRequestPromptOptions","kind":4194304,"comment":{"summary":[{"kind":"text","text":"Options passed to the "},{"kind":"code","text":"`promptAsync()`"},{"kind":"text","text":" method of "},{"kind":"code","text":"`AuthRequest`"},{"kind":"text","text":"s.\nThis can be used to configure how the web browser should look and behave."}]},"type":{"type":"intersection","types":[{"type":"reference","typeArguments":[{"type":"reference","name":"WebBrowserOpenOptions"},{"type":"literal","value":"windowFeatures"}],"name":"Omit","qualifiedName":"Omit","package":"typescript"},{"type":"reflection","declaration":{"name":"__type","kind":65536,"children":[{"name":"url","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"URL to open when prompting the user. This usually should be defined internally and left "},{"kind":"code","text":"`undefined`"},{"kind":"text","text":" in most cases."}]},"type":{"type":"intrinsic","name":"string"}},{"name":"windowFeatures","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"Features to use with "},{"kind":"code","text":"`window.open()`"},{"kind":"text","text":"."}],"blockTags":[{"tag":"@platform","content":[{"kind":"text","text":"web"}]}]},"type":{"type":"reference","name":"WebBrowserWindowFeatures"}}]}}]}},{"name":"AuthSessionOptions","kind":4194304,"type":{"type":"reflection","declaration":{"name":"__type","kind":65536,"children":[{"name":"authUrl","kind":1024,"comment":{"summary":[{"kind":"text","text":"The URL that points to the sign in page that you would like to open the user to."}]},"type":{"type":"intrinsic","name":"string"}},{"name":"projectNameForProxy","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"Project name to use for the "},{"kind":"code","text":"`auth.expo.io`"},{"kind":"text","text":" proxy."}]},"type":{"type":"intrinsic","name":"string"}},{"name":"returnUrl","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"The URL to return to the application. In managed apps, it's optional and defaults to output of ["},{"kind":"code","text":"`Linking.createURL('expo-auth-session', params)`"},{"kind":"text","text":"](./linking/#linkingcreateurlpath-namedparameters)\ncall with "},{"kind":"code","text":"`scheme`"},{"kind":"text","text":" and "},{"kind":"code","text":"`queryParams`"},{"kind":"text","text":" params. However, in the bare app, it's required - "},{"kind":"code","text":"`AuthSession`"},{"kind":"text","text":" needs to know where to wait for the response.\nHence, this method will throw an exception, if you don't provide "},{"kind":"code","text":"`returnUrl`"},{"kind":"text","text":"."}]},"type":{"type":"intrinsic","name":"string"}},{"name":"showInRecents","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"A boolean determining whether browsed website should be shown as separate entry in Android recents/multitasking view."}],"blockTags":[{"tag":"@default","content":[{"kind":"text","text":"false"}]},{"tag":"@platform","content":[{"kind":"text","text":"android"}]}]},"type":{"type":"intrinsic","name":"boolean"}}]}}},{"name":"AuthSessionRedirectUriOptions","kind":4194304,"comment":{"summary":[{"kind":"text","text":"Options passed to "},{"kind":"code","text":"`makeRedirectUri`"},{"kind":"text","text":"."}]},"type":{"type":"reflection","declaration":{"name":"__type","kind":65536,"children":[{"name":"isTripleSlashed","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"Should the URI be triple slashed "},{"kind":"code","text":"`scheme:///path`"},{"kind":"text","text":" or double slashed "},{"kind":"code","text":"`scheme://path`"},{"kind":"text","text":".\nDefaults to "},{"kind":"code","text":"`false`"},{"kind":"text","text":"."}]},"type":{"type":"intrinsic","name":"boolean"}},{"name":"native","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"Manual scheme to use in Bare and Standalone native app contexts. Takes precedence over all other properties.\nYou must define the URI scheme that will be used in a custom built native application or standalone Expo application.\nThe value should conform to your native app's URI schemes.\nYou can see conformance with "},{"kind":"code","text":"`npx uri-scheme list`"},{"kind":"text","text":"."}]},"type":{"type":"intrinsic","name":"string"}},{"name":"path","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"Optional path to append to a URI. This will not be added to "},{"kind":"code","text":"`native`"},{"kind":"text","text":"."}]},"type":{"type":"intrinsic","name":"string"}},{"name":"preferLocalhost","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"Attempt to convert the Expo server IP address to localhost.\nThis is useful for testing when your IP changes often, this will only work for iOS simulator."}],"blockTags":[{"tag":"@default","content":[{"kind":"text","text":"false"}]}]},"type":{"type":"intrinsic","name":"boolean"}},{"name":"queryParams","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"Optional native scheme\nURI protocol "},{"kind":"code","text":"`://`"},{"kind":"text","text":" that must be built into your native app."}]},"type":{"type":"reference","typeArguments":[{"type":"intrinsic","name":"string"},{"type":"union","types":[{"type":"intrinsic","name":"string"},{"type":"intrinsic","name":"undefined"}]}],"name":"Record","qualifiedName":"Record","package":"typescript"}},{"name":"scheme","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"URI protocol "},{"kind":"code","text":"`://`"},{"kind":"text","text":" that must be built into your native app."}]},"type":{"type":"intrinsic","name":"string"}}]}}},{"name":"AuthSessionResult","kind":4194304,"comment":{"summary":[{"kind":"text","text":"Object returned after an auth request has completed.\n- If the user cancelled the authentication session by closing the browser, the result is "},{"kind":"code","text":"`{ type: 'cancel' }`"},{"kind":"text","text":".\n- If the authentication is dismissed manually with "},{"kind":"code","text":"`AuthSession.dismiss()`"},{"kind":"text","text":", the result is "},{"kind":"code","text":"`{ type: 'dismiss' }`"},{"kind":"text","text":".\n- If the authentication flow is successful, the result is "},{"kind":"code","text":"`{ type: 'success', params: Object, event: Object }`"},{"kind":"text","text":".\n- If the authentication flow is returns an error, the result is "},{"kind":"code","text":"`{ type: 'error', params: Object, error: string, event: Object }`"},{"kind":"text","text":".\n- If you call "},{"kind":"code","text":"`AuthSession.startAsync()`"},{"kind":"text","text":" more than once before the first call has returned, the result is "},{"kind":"code","text":"`{ type: 'locked' }`"},{"kind":"text","text":",\n because only one "},{"kind":"code","text":"`AuthSession`"},{"kind":"text","text":" can be in progress at any time."}]},"type":{"type":"union","types":[{"type":"reflection","declaration":{"name":"__type","kind":65536,"children":[{"name":"type","kind":1024,"comment":{"summary":[{"kind":"text","text":"How the auth completed."}]},"type":{"type":"union","types":[{"type":"literal","value":"cancel"},{"type":"literal","value":"dismiss"},{"type":"literal","value":"opened"},{"type":"literal","value":"locked"}]}}]}},{"type":"reflection","declaration":{"name":"__type","kind":65536,"children":[{"name":"authentication","kind":1024,"comment":{"summary":[{"kind":"text","text":"Returned when the auth finishes with an "},{"kind":"code","text":"`access_token`"},{"kind":"text","text":" property."}]},"type":{"type":"union","types":[{"type":"reference","name":"TokenResponse"},{"type":"literal","value":null}]}},{"name":"error","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"Possible error if the auth failed with type "},{"kind":"code","text":"`error`"},{"kind":"text","text":"."}]},"type":{"type":"union","types":[{"type":"reference","name":"AuthError"},{"type":"literal","value":null}]}},{"name":"errorCode","kind":1024,"comment":{"summary":[],"blockTags":[{"tag":"@deprecated","content":[{"kind":"text","text":"Legacy error code query param, use "},{"kind":"code","text":"`error`"},{"kind":"text","text":" instead."}]}]},"type":{"type":"union","types":[{"type":"intrinsic","name":"string"},{"type":"literal","value":null}]}},{"name":"params","kind":1024,"comment":{"summary":[{"kind":"text","text":"Query params from the "},{"kind":"code","text":"`url`"},{"kind":"text","text":" as an object."}]},"type":{"type":"reference","typeArguments":[{"type":"intrinsic","name":"string"},{"type":"intrinsic","name":"string"}],"name":"Record","qualifiedName":"Record","package":"typescript"}},{"name":"type","kind":1024,"comment":{"summary":[{"kind":"text","text":"How the auth completed."}]},"type":{"type":"union","types":[{"type":"literal","value":"error"},{"type":"literal","value":"success"}]}},{"name":"url","kind":1024,"comment":{"summary":[{"kind":"text","text":"Auth URL that was opened"}]},"type":{"type":"intrinsic","name":"string"}}]}}]}},{"name":"Issuer","kind":4194304,"comment":{"summary":[{"kind":"text","text":"URL using the "},{"kind":"code","text":"`https`"},{"kind":"text","text":" scheme with no query or fragment component that the OP asserts as its Issuer Identifier."}]},"type":{"type":"intrinsic","name":"string"}},{"name":"IssuerOrDiscovery","kind":4194304,"type":{"type":"union","types":[{"type":"reference","name":"Issuer"},{"type":"reference","name":"DiscoveryDocument"}]}},{"name":"ProviderMetadata","kind":4194304,"comment":{"summary":[{"kind":"text","text":"OpenID Providers have metadata describing their configuration.\n[ProviderMetadata](https://openid.net/specs/openid-connect-discovery-1_0.html#ProviderMetadata)"}]},"type":{"type":"intersection","types":[{"type":"reference","typeArguments":[{"type":"intrinsic","name":"string"},{"type":"union","types":[{"type":"intrinsic","name":"string"},{"type":"intrinsic","name":"boolean"},{"type":"array","elementType":{"type":"intrinsic","name":"string"}}]}],"name":"Record","qualifiedName":"Record","package":"typescript"},{"type":"reference","name":"ProviderMetadataEndpoints"},{"type":"reflection","declaration":{"name":"__type","kind":65536,"children":[{"name":"backchannel_logout_session_supported","kind":1024,"flags":{"isOptional":true},"type":{"type":"intrinsic","name":"boolean"}},{"name":"backchannel_logout_supported","kind":1024,"flags":{"isOptional":true},"type":{"type":"intrinsic","name":"boolean"}},{"name":"check_session_iframe","kind":1024,"flags":{"isOptional":true},"type":{"type":"intrinsic","name":"string"}},{"name":"claim_types_supported","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"a list of the Claim Types that the OpenID Provider supports."}]},"type":{"type":"array","elementType":{"type":"intrinsic","name":"string"}}},{"name":"claims_locales_supported","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"Languages and scripts supported for values in Claims being returned."}]},"type":{"type":"array","elementType":{"type":"intrinsic","name":"string"}}},{"name":"claims_parameter_supported","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"Boolean value specifying whether the OP supports use of the claims parameter, with "},{"kind":"code","text":"`true`"},{"kind":"text","text":" indicating support."}],"blockTags":[{"tag":"@default","content":[{"kind":"text","text":"false"}]}]},"type":{"type":"intrinsic","name":"boolean"}},{"name":"claims_supported","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"a list of the Claim Names of the Claims that the OpenID Provider may be able to supply values for.\nNote that for privacy or other reasons, this might not be an exhaustive list."}]},"type":{"type":"array","elementType":{"type":"intrinsic","name":"string"}}},{"name":"code_challenge_methods_supported","kind":1024,"flags":{"isOptional":true},"type":{"type":"array","elementType":{"type":"reference","name":"CodeChallengeMethod"}}},{"name":"display_values_supported","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"a list of the "},{"kind":"code","text":"`display`"},{"kind":"text","text":" parameter values that the OpenID Provider supports."}]},"type":{"type":"array","elementType":{"type":"intrinsic","name":"string"}}},{"name":"frontchannel_logout_session_supported","kind":1024,"flags":{"isOptional":true},"type":{"type":"intrinsic","name":"boolean"}},{"name":"frontchannel_logout_supported","kind":1024,"flags":{"isOptional":true},"type":{"type":"intrinsic","name":"boolean"}},{"name":"grant_types_supported","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"JSON array containing a list of the OAuth 2.0 Grant Type values that this OP supports.\nDynamic OpenID Providers MUST support the authorization_code and implicit Grant Type values and MAY support other Grant Types.\nIf omitted, the default value is [\"authorization_code\", \"implicit\"]."}]},"type":{"type":"array","elementType":{"type":"intrinsic","name":"string"}}},{"name":"id_token_signing_alg_values_supported","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"JSON array containing a list of the JWS signing algorithms (alg values) supported by the OP for the ID Token to encode the Claims in a JWT.\nThe algorithm RS256 MUST be included."}]},"type":{"type":"array","elementType":{"type":"intrinsic","name":"string"}}},{"name":"jwks_uri","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"URL of the OP's JSON Web Key Set [JWK](https://openid.net/specs/openid-connect-discovery-1_0.html#JWK) document."}]},"type":{"type":"intrinsic","name":"string"}},{"name":"op_policy_uri","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"URL that the OpenID Provider provides to the person registering the Client to read about the OP's requirements on how\nthe Relying Party can use the data provided by the OP. The registration process SHOULD display this URL to the person\nregistering the Client if it is given."}]},"type":{"type":"intrinsic","name":"string"}},{"name":"op_tos_uri","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"URL that the OpenID Provider provides to the person registering the Client to read about OpenID Provider's terms of service.\nThe registration process should display this URL to the person registering the Client if it is given."}]},"type":{"type":"intrinsic","name":"string"}},{"name":"request_parameter_supported","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"Boolean value specifying whether the OP supports use of the request parameter, with "},{"kind":"code","text":"`true`"},{"kind":"text","text":" indicating support."}],"blockTags":[{"tag":"@default","content":[{"kind":"text","text":"false"}]}]},"type":{"type":"intrinsic","name":"boolean"}},{"name":"request_uri_parameter_supported","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"Whether the OP supports use of the "},{"kind":"code","text":"`request_uri`"},{"kind":"text","text":" parameter, with "},{"kind":"code","text":"`true`"},{"kind":"text","text":" indicating support."}],"blockTags":[{"tag":"@default","content":[{"kind":"text","text":"true"}]}]},"type":{"type":"intrinsic","name":"boolean"}},{"name":"require_request_uri_registration","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"Whether the OP requires any "},{"kind":"code","text":"`request_uri`"},{"kind":"text","text":" values used to be pre-registered using the "},{"kind":"code","text":"`request_uris`"},{"kind":"text","text":" registration parameter.\nPre-registration is required when the value is "},{"kind":"code","text":"`true`"},{"kind":"text","text":"."}],"blockTags":[{"tag":"@default","content":[{"kind":"text","text":"false"}]}]},"type":{"type":"intrinsic","name":"boolean"}},{"name":"response_modes_supported","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"JSON array containing a list of the OAuth 2.0 "},{"kind":"code","text":"`response_mode`"},{"kind":"text","text":" values that this OP supports,\nas specified in [OAuth 2.0 Multiple Response Type Encoding Practices](https://openid.net/specs/openid-connect-discovery-1_0.html#OAuth.Responses).\nIf omitted, the default for Dynamic OpenID Providers is "},{"kind":"code","text":"`[\"query\", \"fragment\"]`"},{"kind":"text","text":"."}]},"type":{"type":"array","elementType":{"type":"intrinsic","name":"string"}}},{"name":"response_types_supported","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"JSON array containing a list of the OAuth 2.0 "},{"kind":"code","text":"`response_type`"},{"kind":"text","text":" values that this OP supports.\nDynamic OpenID Providers must support the "},{"kind":"code","text":"`code`"},{"kind":"text","text":", "},{"kind":"code","text":"`id_token`"},{"kind":"text","text":", and the "},{"kind":"code","text":"`token`"},{"kind":"text","text":" "},{"kind":"code","text":"`id_token`"},{"kind":"text","text":" Response Type values"}]},"type":{"type":"array","elementType":{"type":"intrinsic","name":"string"}}},{"name":"scopes_supported","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"JSON array containing a list of the OAuth 2.0 [RFC6749](https://openid.net/specs/openid-connect-discovery-1_0.html#RFC6749)\nscope values that this server supports."}]},"type":{"type":"array","elementType":{"type":"intrinsic","name":"string"}}},{"name":"service_documentation","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"URL of a page containing human-readable information that developers might want or need to know when using the OpenID Provider.\nIn particular, if the OpenID Provider does not support Dynamic Client Registration, then information on how to register Clients\nneeds to be provided in this documentation."}]},"type":{"type":"intrinsic","name":"string"}},{"name":"subject_types_supported","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"JSON array containing a list of the Subject Identifier types that this OP supports.\nValid types include "},{"kind":"code","text":"`pairwise`"},{"kind":"text","text":" and "},{"kind":"code","text":"`public`"},{"kind":"text","text":"."}]},"type":{"type":"array","elementType":{"type":"intrinsic","name":"string"}}},{"name":"token_endpoint_auth_methods_supported","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"A list of Client authentication methods supported by this Token Endpoint.\nIf omitted, the default is "},{"kind":"code","text":"`['client_secret_basic']`"}]},"type":{"type":"array","elementType":{"type":"union","types":[{"type":"literal","value":"client_secret_post"},{"type":"literal","value":"client_secret_basic"},{"type":"literal","value":"client_secret_jwt"},{"type":"literal","value":"private_key_jwt"},{"type":"intrinsic","name":"string"}]}}},{"name":"ui_locales_supported","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"Languages and scripts supported for the user interface,\nrepresented as a JSON array of [BCP47](https://openid.net/specs/openid-connect-discovery-1_0.html#RFC5646) language tag values."}]},"type":{"type":"array","elementType":{"type":"intrinsic","name":"string"}}}]}}]}},{"name":"TokenType","kind":4194304,"comment":{"summary":[{"kind":"text","text":"Access token type."}],"blockTags":[{"tag":"@see","content":[{"kind":"text","text":"[Section 7.1](https://tools.ietf.org/html/rfc6749#section-7.1)"}]}]},"type":{"type":"union","types":[{"type":"literal","value":"bearer"},{"type":"literal","value":"mac"}]}},{"name":"dismiss","kind":64,"signatures":[{"name":"dismiss","kind":4096,"comment":{"summary":[{"kind":"text","text":"Cancels an active "},{"kind":"code","text":"`AuthSession`"},{"kind":"text","text":" if there is one. No return value, but if there is an active "},{"kind":"code","text":"`AuthSession`"},{"kind":"text","text":"\nthen the Promise returned by the "},{"kind":"code","text":"`AuthSession.startAsync()`"},{"kind":"text","text":" that initiated it resolves to "},{"kind":"code","text":"`{ type: 'dismiss' }`"},{"kind":"text","text":"."}]},"type":{"type":"intrinsic","name":"void"}}]},{"name":"exchangeCodeAsync","kind":64,"signatures":[{"name":"exchangeCodeAsync","kind":4096,"comment":{"summary":[{"kind":"text","text":"Exchange an authorization code for an access token that can be used to get data from the provider."}],"blockTags":[{"tag":"@returns","content":[{"kind":"text","text":"Returns a discovery document with a valid "},{"kind":"code","text":"`tokenEndpoint`"},{"kind":"text","text":" URL."}]}]},"parameters":[{"name":"config","kind":32768,"comment":{"summary":[{"kind":"text","text":"Configuration used to exchange the code for a token."}]},"type":{"type":"reference","name":"AccessTokenRequestConfig"}},{"name":"discovery","kind":32768,"comment":{"summary":[{"kind":"text","text":"The "},{"kind":"code","text":"`tokenEndpoint`"},{"kind":"text","text":" for a provider."}]},"type":{"type":"reference","typeArguments":[{"type":"reference","name":"DiscoveryDocument"},{"type":"literal","value":"tokenEndpoint"}],"name":"Pick","qualifiedName":"Pick","package":"typescript"}}],"type":{"type":"reference","typeArguments":[{"type":"reference","name":"TokenResponse"}],"name":"Promise","qualifiedName":"Promise","package":"typescript"}}]},{"name":"fetchDiscoveryAsync","kind":64,"signatures":[{"name":"fetchDiscoveryAsync","kind":4096,"comment":{"summary":[{"kind":"text","text":"Fetch a "},{"kind":"code","text":"`DiscoveryDocument`"},{"kind":"text","text":" from a well-known resource provider that supports auto discovery."}],"blockTags":[{"tag":"@returns","content":[{"kind":"text","text":"Returns a discovery document that can be used for authentication."}]}]},"parameters":[{"name":"issuer","kind":32768,"comment":{"summary":[{"kind":"text","text":"An "},{"kind":"code","text":"`Issuer`"},{"kind":"text","text":" URL to fetch from."}]},"type":{"type":"intrinsic","name":"string"}}],"type":{"type":"reference","typeArguments":[{"type":"reference","name":"DiscoveryDocument"}],"name":"Promise","qualifiedName":"Promise","package":"typescript"}}]},{"name":"fetchUserInfoAsync","kind":64,"signatures":[{"name":"fetchUserInfoAsync","kind":4096,"comment":{"summary":[{"kind":"text","text":"Fetch generic user info from the provider's OpenID Connect "},{"kind":"code","text":"`userInfoEndpoint`"},{"kind":"text","text":" (if supported)."}],"blockTags":[{"tag":"@see","content":[{"kind":"text","text":"[UserInfo](https://openid.net/specs/openid-connect-core-1_0.html#UserInfo)."}]}]},"parameters":[{"name":"config","kind":32768,"comment":{"summary":[{"kind":"text","text":"The "},{"kind":"code","text":"`accessToken`"},{"kind":"text","text":" for a user, returned from a code exchange or auth request."}]},"type":{"type":"reference","typeArguments":[{"type":"reference","name":"TokenResponse"},{"type":"literal","value":"accessToken"}],"name":"Pick","qualifiedName":"Pick","package":"typescript"}},{"name":"discovery","kind":32768,"comment":{"summary":[{"kind":"text","text":"The "},{"kind":"code","text":"`userInfoEndpoint`"},{"kind":"text","text":" for a provider."}]},"type":{"type":"reference","typeArguments":[{"type":"reference","name":"DiscoveryDocument"},{"type":"literal","value":"userInfoEndpoint"}],"name":"Pick","qualifiedName":"Pick","package":"typescript"}}],"type":{"type":"reference","typeArguments":[{"type":"reference","typeArguments":[{"type":"intrinsic","name":"string"},{"type":"intrinsic","name":"any"}],"name":"Record","qualifiedName":"Record","package":"typescript"}],"name":"Promise","qualifiedName":"Promise","package":"typescript"}}]},{"name":"generateHexStringAsync","kind":64,"signatures":[{"name":"generateHexStringAsync","kind":4096,"comment":{"summary":[{"kind":"text","text":"Digest a random string with hex encoding, useful for creating "},{"kind":"code","text":"`nonce`"},{"kind":"text","text":"s."}]},"parameters":[{"name":"size","kind":32768,"type":{"type":"intrinsic","name":"number"}}],"type":{"type":"reference","typeArguments":[{"type":"intrinsic","name":"string"}],"name":"Promise","qualifiedName":"Promise","package":"typescript"}}]},{"name":"getDefaultReturnUrl","kind":64,"signatures":[{"name":"getDefaultReturnUrl","kind":4096,"parameters":[{"name":"urlPath","kind":32768,"flags":{"isOptional":true},"type":{"type":"intrinsic","name":"string"}},{"name":"options","kind":32768,"flags":{"isOptional":true},"type":{"type":"reference","typeArguments":[{"type":"reference","name":"CreateURLOptions"},{"type":"literal","value":"queryParams"}],"name":"Omit","qualifiedName":"Omit","package":"typescript"}}],"type":{"type":"intrinsic","name":"string"}}]},{"name":"getRedirectUrl","kind":64,"signatures":[{"name":"getRedirectUrl","kind":4096,"comment":{"summary":[{"kind":"text","text":"Get the URL that your authentication provider needs to redirect to. For example: "},{"kind":"code","text":"`https://auth.expo.io/@your-username/your-app-slug`"},{"kind":"text","text":". You can pass an additional path component to be appended to the default redirect URL.\n> **Note** This method will throw an exception if you're using the bare workflow on native."}],"blockTags":[{"tag":"@returns","content":[]},{"tag":"@example","content":[{"kind":"code","text":"```ts\nconst url = AuthSession.getRedirectUrl('redirect');\n\n// Managed: https://auth.expo.io/@your-username/your-app-slug/redirect\n// Web: https://localhost:19006/redirect\n```"}]},{"tag":"@deprecated","content":[{"kind":"text","text":"Use "},{"kind":"code","text":"`makeRedirectUri()`"},{"kind":"text","text":" instead."}]}]},"parameters":[{"name":"path","kind":32768,"flags":{"isOptional":true},"type":{"type":"intrinsic","name":"string"}}],"type":{"type":"intrinsic","name":"string"}}]},{"name":"loadAsync","kind":64,"signatures":[{"name":"loadAsync","kind":4096,"comment":{"summary":[{"kind":"text","text":"Build an "},{"kind":"code","text":"`AuthRequest`"},{"kind":"text","text":" and load it before returning."}],"blockTags":[{"tag":"@returns","content":[{"kind":"text","text":"Returns an instance of "},{"kind":"code","text":"`AuthRequest`"},{"kind":"text","text":" that can be used to prompt the user for authorization."}]}]},"parameters":[{"name":"config","kind":32768,"comment":{"summary":[{"kind":"text","text":"A valid ["},{"kind":"code","text":"`AuthRequestConfig`"},{"kind":"text","text":"](#authrequestconfig) that specifies what provider to use."}]},"type":{"type":"reference","name":"AuthRequestConfig"}},{"name":"issuerOrDiscovery","kind":32768,"comment":{"summary":[{"kind":"text","text":"A loaded ["},{"kind":"code","text":"`DiscoveryDocument`"},{"kind":"text","text":"](#discoverydocument) or issuer URL.\n(Only "},{"kind":"code","text":"`authorizationEndpoint`"},{"kind":"text","text":" is required for requesting an authorization code)."}]},"type":{"type":"reference","name":"IssuerOrDiscovery"}}],"type":{"type":"reference","typeArguments":[{"type":"reference","name":"AuthRequest"}],"name":"Promise","qualifiedName":"Promise","package":"typescript"}}]},{"name":"makeRedirectUri","kind":64,"signatures":[{"name":"makeRedirectUri","kind":4096,"comment":{"summary":[{"kind":"text","text":"Create a redirect url for the current platform and environment. You need to manually define the redirect that will be used in\na bare workflow React Native app, or an Expo standalone app, this is because it cannot be inferred automatically.\n- **Web:** Generates a path based on the current "},{"kind":"code","text":"`window.location`"},{"kind":"text","text":". For production web apps, you should hard code the URL as well.\n- **Managed workflow:** Uses the "},{"kind":"code","text":"`scheme`"},{"kind":"text","text":" property of your "},{"kind":"code","text":"`app.config.js`"},{"kind":"text","text":" or "},{"kind":"code","text":"`app.json`"},{"kind":"text","text":".\n - **Proxy:** Uses "},{"kind":"code","text":"`auth.expo.io`"},{"kind":"text","text":" as the base URL for the path. This only works in Expo Go and standalone environments.\n- **Bare workflow:** Will fallback to using the "},{"kind":"code","text":"`native`"},{"kind":"text","text":" option for bare workflow React Native apps."}],"blockTags":[{"tag":"@returns","content":[{"kind":"text","text":"The "},{"kind":"code","text":"`redirectUri`"},{"kind":"text","text":" to use in an authentication request."}]},{"tag":"@example","content":[{"kind":"code","text":"```ts\nconst redirectUri = makeRedirectUri({\n scheme: 'my-scheme',\n path: 'redirect'\n});\n// Development Build: my-scheme://redirect\n// Expo Go: exp://127.0.0.1:8081/--/redirect\n// Web dev: https://localhost:19006/redirect\n// Web prod: https://yourwebsite.com/redirect\n\nconst redirectUri2 = makeRedirectUri({\n scheme: 'scheme2',\n preferLocalhost: true,\n isTripleSlashed: true,\n});\n// Development Build: scheme2:///\n// Expo Go: exp://localhost:8081\n// Web dev: https://localhost:19006\n// Web prod: https://yourwebsite.com\n```"}]}]},"parameters":[{"name":"options","kind":32768,"comment":{"summary":[{"kind":"text","text":"Additional options for configuring the path."}]},"type":{"type":"reference","name":"AuthSessionRedirectUriOptions"},"defaultValue":"{}"}],"type":{"type":"intrinsic","name":"string"}}]},{"name":"refreshAsync","kind":64,"signatures":[{"name":"refreshAsync","kind":4096,"comment":{"summary":[{"kind":"text","text":"Refresh an access token.\n- If the provider didn't return a "},{"kind":"code","text":"`refresh_token`"},{"kind":"text","text":" then the access token may not be refreshed.\n- If the provider didn't return a "},{"kind":"code","text":"`expires_in`"},{"kind":"text","text":" then it's assumed that the token does not expire.\n- Determine if a token needs to be refreshed via "},{"kind":"code","text":"`TokenResponse.isTokenFresh()`"},{"kind":"text","text":" or "},{"kind":"code","text":"`shouldRefresh()`"},{"kind":"text","text":" on an instance of "},{"kind":"code","text":"`TokenResponse`"},{"kind":"text","text":"."}],"blockTags":[{"tag":"@see","content":[{"kind":"text","text":"[Section 6](https://tools.ietf.org/html/rfc6749#section-6)."}]},{"tag":"@returns","content":[{"kind":"text","text":"Returns a discovery document with a valid "},{"kind":"code","text":"`tokenEndpoint`"},{"kind":"text","text":" URL."}]}]},"parameters":[{"name":"config","kind":32768,"comment":{"summary":[{"kind":"text","text":"Configuration used to refresh the given access token."}]},"type":{"type":"reference","name":"RefreshTokenRequestConfig"}},{"name":"discovery","kind":32768,"comment":{"summary":[{"kind":"text","text":"The "},{"kind":"code","text":"`tokenEndpoint`"},{"kind":"text","text":" for a provider."}]},"type":{"type":"reference","typeArguments":[{"type":"reference","name":"DiscoveryDocument"},{"type":"literal","value":"tokenEndpoint"}],"name":"Pick","qualifiedName":"Pick","package":"typescript"}}],"type":{"type":"reference","typeArguments":[{"type":"reference","name":"TokenResponse"}],"name":"Promise","qualifiedName":"Promise","package":"typescript"}}]},{"name":"resolveDiscoveryAsync","kind":64,"signatures":[{"name":"resolveDiscoveryAsync","kind":4096,"comment":{"summary":[{"kind":"text","text":"Utility method for resolving the discovery document from an issuer or object."}]},"parameters":[{"name":"issuerOrDiscovery","kind":32768,"type":{"type":"reference","name":"IssuerOrDiscovery"}}],"type":{"type":"reference","typeArguments":[{"type":"reference","name":"DiscoveryDocument"}],"name":"Promise","qualifiedName":"Promise","package":"typescript"}}]},{"name":"revokeAsync","kind":64,"signatures":[{"name":"revokeAsync","kind":4096,"comment":{"summary":[{"kind":"text","text":"Revoke a token with a provider. This makes the token unusable, effectively requiring the user to login again."}],"blockTags":[{"tag":"@returns","content":[{"kind":"text","text":"Returns a discovery document with a valid "},{"kind":"code","text":"`revocationEndpoint`"},{"kind":"text","text":" URL. Many providers do not support this feature."}]}]},"parameters":[{"name":"config","kind":32768,"comment":{"summary":[{"kind":"text","text":"Configuration used to revoke a refresh or access token."}]},"type":{"type":"reference","name":"RevokeTokenRequestConfig"}},{"name":"discovery","kind":32768,"comment":{"summary":[{"kind":"text","text":"The "},{"kind":"code","text":"`revocationEndpoint`"},{"kind":"text","text":" for a provider."}]},"type":{"type":"reference","typeArguments":[{"type":"reference","name":"DiscoveryDocument"},{"type":"literal","value":"revocationEndpoint"}],"name":"Pick","qualifiedName":"Pick","package":"typescript"}}],"type":{"type":"reference","typeArguments":[{"type":"intrinsic","name":"boolean"}],"name":"Promise","qualifiedName":"Promise","package":"typescript"}}]},{"name":"useAuthRequest","kind":64,"signatures":[{"name":"useAuthRequest","kind":4096,"comment":{"summary":[{"kind":"text","text":"Load an authorization request for a code. When the prompt method completes then the response will be fulfilled.\n\n> In order to close the popup window on web, you need to invoke "},{"kind":"code","text":"`WebBrowser.maybeCompleteAuthSession()`"},{"kind":"text","text":".\n> See the [Identity example](/guides/authentication#identityserver-4) for more info.\n\nIf an Implicit grant flow was used, you can pass the "},{"kind":"code","text":"`response.params`"},{"kind":"text","text":" to "},{"kind":"code","text":"`TokenResponse.fromQueryParams()`"},{"kind":"text","text":"\nto get a "},{"kind":"code","text":"`TokenResponse`"},{"kind":"text","text":" instance which you can use to easily refresh the token."}],"blockTags":[{"tag":"@returns","content":[{"kind":"text","text":"Returns a loaded request, a response, and a prompt method in a single array in the following order:\n- "},{"kind":"code","text":"`request`"},{"kind":"text","text":" - An instance of ["},{"kind":"code","text":"`AuthRequest`"},{"kind":"text","text":"](#authrequest) that can be used to prompt the user for authorization.\n This will be "},{"kind":"code","text":"`null`"},{"kind":"text","text":" until the auth request has finished loading.\n- "},{"kind":"code","text":"`response`"},{"kind":"text","text":" - This is "},{"kind":"code","text":"`null`"},{"kind":"text","text":" until "},{"kind":"code","text":"`promptAsync`"},{"kind":"text","text":" has been invoked. Once fulfilled it will return information about the authorization.\n- "},{"kind":"code","text":"`promptAsync`"},{"kind":"text","text":" - When invoked, a web browser will open up and prompt the user for authentication.\n Accepts an ["},{"kind":"code","text":"`AuthRequestPromptOptions`"},{"kind":"text","text":"](#authrequestpromptoptions) object with options about how the prompt will execute."}]},{"tag":"@example","content":[{"kind":"code","text":"```ts\nconst [request, response, promptAsync] = useAuthRequest({ ... }, { ... });\n```"}]}]},"parameters":[{"name":"config","kind":32768,"comment":{"summary":[{"kind":"text","text":"A valid ["},{"kind":"code","text":"`AuthRequestConfig`"},{"kind":"text","text":"](#authrequestconfig) that specifies what provider to use."}]},"type":{"type":"reference","name":"AuthRequestConfig"}},{"name":"discovery","kind":32768,"comment":{"summary":[{"kind":"text","text":"A loaded ["},{"kind":"code","text":"`DiscoveryDocument`"},{"kind":"text","text":"](#discoverydocument) with endpoints used for authenticating.\nOnly "},{"kind":"code","text":"`authorizationEndpoint`"},{"kind":"text","text":" is required for requesting an authorization code."}]},"type":{"type":"union","types":[{"type":"literal","value":null},{"type":"reference","name":"DiscoveryDocument"}]}}],"type":{"type":"tuple","elements":[{"type":"union","types":[{"type":"reference","name":"AuthRequest"},{"type":"literal","value":null}]},{"type":"union","types":[{"type":"reference","name":"AuthSessionResult"},{"type":"literal","value":null}]},{"type":"reflection","declaration":{"name":"__type","kind":65536,"signatures":[{"name":"__type","kind":4096,"parameters":[{"name":"options","kind":32768,"flags":{"isOptional":true},"type":{"type":"reference","name":"AuthRequestPromptOptions"}}],"type":{"type":"reference","typeArguments":[{"type":"reference","name":"AuthSessionResult"}],"name":"Promise","qualifiedName":"Promise","package":"typescript"}}]}}]}}]},{"name":"useAutoDiscovery","kind":64,"signatures":[{"name":"useAutoDiscovery","kind":4096,"comment":{"summary":[{"kind":"text","text":"Given an OpenID Connect issuer URL, this will fetch and return the ["},{"kind":"code","text":"`DiscoveryDocument`"},{"kind":"text","text":"](#discoverydocument)\n(a collection of URLs) from the resource provider."}],"blockTags":[{"tag":"@returns","content":[{"kind":"text","text":"Returns "},{"kind":"code","text":"`null`"},{"kind":"text","text":" until the ["},{"kind":"code","text":"`DiscoveryDocument`"},{"kind":"text","text":"](#discoverydocument) has been fetched from the provided issuer URL."}]},{"tag":"@example","content":[{"kind":"code","text":"```ts\nconst discovery = useAutoDiscovery('https://example.com/auth');\n```"}]}]},"parameters":[{"name":"issuerOrDiscovery","kind":32768,"comment":{"summary":[{"kind":"text","text":"URL using the "},{"kind":"code","text":"`https`"},{"kind":"text","text":" scheme with no query or fragment component that the OP asserts as its Issuer Identifier."}]},"type":{"type":"reference","name":"IssuerOrDiscovery"}}],"type":{"type":"union","types":[{"type":"reference","name":"DiscoveryDocument"},{"type":"literal","value":null}]}}]}]}
\ No newline at end of file
diff --git a/docs/public/static/data/unversioned/expo-battery.json b/docs/public/static/data/unversioned/expo-battery.json
index 79c8ce8a6f1ca..84c53c9d02211 100644
--- a/docs/public/static/data/unversioned/expo-battery.json
+++ b/docs/public/static/data/unversioned/expo-battery.json
@@ -1 +1 @@
-{"name":"expo-battery","kind":1,"children":[{"name":"BatteryState","kind":8,"children":[{"name":"CHARGING","kind":16,"comment":{"summary":[{"kind":"text","text":"if battery is charging."}]},"type":{"type":"literal","value":2}},{"name":"FULL","kind":16,"comment":{"summary":[{"kind":"text","text":"if the battery level is full."}]},"type":{"type":"literal","value":3}},{"name":"UNKNOWN","kind":16,"comment":{"summary":[{"kind":"text","text":"if the battery state is unknown or inaccessible."}]},"type":{"type":"literal","value":0}},{"name":"UNPLUGGED","kind":16,"comment":{"summary":[{"kind":"text","text":"if battery is not charging or discharging."}]},"type":{"type":"literal","value":1}}]},{"name":"BatteryLevelEvent","kind":4194304,"type":{"type":"reflection","declaration":{"name":"__type","kind":65536,"children":[{"name":"batteryLevel","kind":1024,"comment":{"summary":[{"kind":"text","text":"A number between "},{"kind":"code","text":"`0`"},{"kind":"text","text":" and "},{"kind":"code","text":"`1`"},{"kind":"text","text":", inclusive, or "},{"kind":"code","text":"`-1`"},{"kind":"text","text":" if the battery level is unknown."}]},"type":{"type":"intrinsic","name":"number"}}]}}},{"name":"BatteryStateEvent","kind":4194304,"type":{"type":"reflection","declaration":{"name":"__type","kind":65536,"children":[{"name":"batteryState","kind":1024,"comment":{"summary":[{"kind":"text","text":"An enum value representing the battery state."}]},"type":{"type":"reference","name":"BatteryState"}}]}}},{"name":"PowerModeEvent","kind":4194304,"type":{"type":"reflection","declaration":{"name":"__type","kind":65536,"children":[{"name":"lowPowerMode","kind":1024,"comment":{"summary":[{"kind":"text","text":"A boolean value, "},{"kind":"code","text":"`true`"},{"kind":"text","text":" if lowPowerMode is on, "},{"kind":"code","text":"`false`"},{"kind":"text","text":" if lowPowerMode is off"}]},"type":{"type":"intrinsic","name":"boolean"}}]}}},{"name":"PowerState","kind":4194304,"type":{"type":"reflection","declaration":{"name":"__type","kind":65536,"children":[{"name":"batteryLevel","kind":1024,"comment":{"summary":[{"kind":"text","text":"A number between "},{"kind":"code","text":"`0`"},{"kind":"text","text":" and "},{"kind":"code","text":"`1`"},{"kind":"text","text":", inclusive, or "},{"kind":"code","text":"`-1`"},{"kind":"text","text":" if the battery level is unknown."}]},"type":{"type":"intrinsic","name":"number"}},{"name":"batteryState","kind":1024,"comment":{"summary":[{"kind":"text","text":"An enum value representing the battery state."}]},"type":{"type":"reference","name":"BatteryState"}},{"name":"lowPowerMode","kind":1024,"comment":{"summary":[{"kind":"text","text":"A boolean value, "},{"kind":"code","text":"`true`"},{"kind":"text","text":" if lowPowerMode is on, "},{"kind":"code","text":"`false`"},{"kind":"text","text":" if lowPowerMode is off"}]},"type":{"type":"intrinsic","name":"boolean"}}]}}},{"name":"Subscription","kind":4194304,"type":{"type":"reflection","declaration":{"name":"__type","kind":65536,"children":[{"name":"remove","kind":1024,"type":{"type":"reflection","declaration":{"name":"__type","kind":65536,"signatures":[{"name":"__type","kind":4096,"comment":{"summary":[{"kind":"text","text":"A method to unsubscribe the listener."}]},"type":{"type":"intrinsic","name":"void"}}]}}}]}}},{"name":"addBatteryLevelListener","kind":64,"signatures":[{"name":"addBatteryLevelListener","kind":4096,"comment":{"summary":[{"kind":"text","text":"Subscribe to the battery level change updates.\n\nOn iOS devices, the event fires when the battery level drops one percent or more, but is only\nfired once per minute at maximum.\n\nOn Android devices, the event fires only when significant changes happens, which is when the\nbattery level drops below ["},{"kind":"code","text":"`\"android.intent.action.BATTERY_LOW\"`"},{"kind":"text","text":"](https://developer.android.com/reference/android/content/Intent#ACTION_BATTERY_LOW)\nor rises above ["},{"kind":"code","text":"`\"android.intent.action.BATTERY_OKAY\"`"},{"kind":"text","text":"](https://developer.android.com/reference/android/content/Intent#ACTION_BATTERY_OKAY)\nfrom a low battery level. See [here](https://developer.android.com/training/monitoring-device-state/battery-monitoring)\nto read more from the Android docs.\n\nOn web, the event never fires."}],"blockTags":[{"tag":"@returns","content":[{"kind":"text","text":"A "},{"kind":"code","text":"`Subscription`"},{"kind":"text","text":" object on which you can call "},{"kind":"code","text":"`remove()`"},{"kind":"text","text":" to unsubscribe from the listener.s"}]}]},"parameters":[{"name":"listener","kind":32768,"comment":{"summary":[{"kind":"text","text":"A callback that is invoked when battery level changes. The callback is provided a\nsingle argument that is an object with a "},{"kind":"code","text":"`batteryLevel`"},{"kind":"text","text":" key."}]},"type":{"type":"reflection","declaration":{"name":"__type","kind":65536,"signatures":[{"name":"__type","kind":4096,"parameters":[{"name":"event","kind":32768,"type":{"type":"reference","name":"BatteryLevelEvent"}}],"type":{"type":"intrinsic","name":"void"}}]}}}],"type":{"type":"reference","name":"Subscription"}}]},{"name":"addBatteryStateListener","kind":64,"signatures":[{"name":"addBatteryStateListener","kind":4096,"comment":{"summary":[{"kind":"text","text":"Subscribe to the battery state change updates to receive an object with a ["},{"kind":"code","text":"`Battery.BatteryState`"},{"kind":"text","text":"](#batterystate)\nenum value for whether the device is any of the four states.\n\nOn web, the event never fires."}],"blockTags":[{"tag":"@returns","content":[{"kind":"text","text":"A "},{"kind":"code","text":"`Subscription`"},{"kind":"text","text":" object on which you can call "},{"kind":"code","text":"`remove()`"},{"kind":"text","text":" to unsubscribe from the listener."}]}]},"parameters":[{"name":"listener","kind":32768,"comment":{"summary":[{"kind":"text","text":"A callback that is invoked when battery state changes. The callback is provided a\nsingle argument that is an object with a "},{"kind":"code","text":"`batteryState`"},{"kind":"text","text":" key."}]},"type":{"type":"reflection","declaration":{"name":"__type","kind":65536,"signatures":[{"name":"__type","kind":4096,"parameters":[{"name":"event","kind":32768,"type":{"type":"reference","name":"BatteryStateEvent"}}],"type":{"type":"intrinsic","name":"void"}}]}}}],"type":{"type":"reference","name":"Subscription"}}]},{"name":"addLowPowerModeListener","kind":64,"signatures":[{"name":"addLowPowerModeListener","kind":4096,"comment":{"summary":[{"kind":"text","text":"Subscribe to Low Power Mode (iOS) or Power Saver Mode (Android) updates. The event fires whenever\nthe power mode is toggled.\n\nOn web, the event never fires."}],"blockTags":[{"tag":"@returns","content":[{"kind":"text","text":"A "},{"kind":"code","text":"`Subscription`"},{"kind":"text","text":" object on which you can call "},{"kind":"code","text":"`remove()`"},{"kind":"text","text":" to unsubscribe from the listener."}]}]},"parameters":[{"name":"listener","kind":32768,"comment":{"summary":[{"kind":"text","text":"A callback that is invoked when Low Power Mode (iOS) or Power Saver Mode (Android)\nchanges. The callback is provided a single argument that is an object with a "},{"kind":"code","text":"`lowPowerMode`"},{"kind":"text","text":" key."}]},"type":{"type":"reflection","declaration":{"name":"__type","kind":65536,"signatures":[{"name":"__type","kind":4096,"parameters":[{"name":"event","kind":32768,"type":{"type":"reference","name":"PowerModeEvent"}}],"type":{"type":"intrinsic","name":"void"}}]}}}],"type":{"type":"reference","name":"Subscription"}}]},{"name":"getBatteryLevelAsync","kind":64,"signatures":[{"name":"getBatteryLevelAsync","kind":4096,"comment":{"summary":[{"kind":"text","text":"Gets the battery level of the device as a number between "},{"kind":"code","text":"`0`"},{"kind":"text","text":" and "},{"kind":"code","text":"`1`"},{"kind":"text","text":", inclusive. If the device\ndoes not support retrieving the battery level, this method returns "},{"kind":"code","text":"`-1`"},{"kind":"text","text":". On web, this method\nalways returns "},{"kind":"code","text":"`-1`"},{"kind":"text","text":"."}],"blockTags":[{"tag":"@returns","content":[{"kind":"text","text":"A "},{"kind":"code","text":"`Promise`"},{"kind":"text","text":" that fulfils with a number between "},{"kind":"code","text":"`0`"},{"kind":"text","text":" and "},{"kind":"code","text":"`1`"},{"kind":"text","text":" representing the battery level,\nor "},{"kind":"code","text":"`-1`"},{"kind":"text","text":" if the device does not provide it."}]},{"tag":"@example","content":[{"kind":"code","text":"```ts\nawait Battery.getBatteryLevelAsync();\n// 0.759999\n```"}]}]},"type":{"type":"reference","typeArguments":[{"type":"intrinsic","name":"number"}],"name":"Promise","qualifiedName":"Promise","package":"typescript"}}]},{"name":"getBatteryStateAsync","kind":64,"signatures":[{"name":"getBatteryStateAsync","kind":4096,"comment":{"summary":[{"kind":"text","text":"Tells the battery's current state. On web, this always returns "},{"kind":"code","text":"`BatteryState.UNKNOWN`"},{"kind":"text","text":"."}],"blockTags":[{"tag":"@returns","content":[{"kind":"text","text":"Returns a "},{"kind":"code","text":"`Promise`"},{"kind":"text","text":" which fulfills with a ["},{"kind":"code","text":"`Battery.BatteryState`"},{"kind":"text","text":"](#batterystate) enum\nvalue for whether the device is any of the four states."}]},{"tag":"@example","content":[{"kind":"code","text":"```ts\nawait Battery.getBatteryStateAsync();\n// BatteryState.CHARGING\n```"}]}]},"type":{"type":"reference","typeArguments":[{"type":"reference","name":"BatteryState"}],"name":"Promise","qualifiedName":"Promise","package":"typescript"}}]},{"name":"getPowerStateAsync","kind":64,"signatures":[{"name":"getPowerStateAsync","kind":4096,"comment":{"summary":[{"kind":"text","text":"Gets the power state of the device including the battery level, whether it is plugged in, and if\nthe system is currently operating in Low Power Mode (iOS) or Power Saver Mode (Android). This\nmethod re-throws any errors that occur when retrieving any of the power-state information."}],"blockTags":[{"tag":"@returns","content":[{"kind":"text","text":"Returns a "},{"kind":"code","text":"`Promise`"},{"kind":"text","text":" which fulfills with ["},{"kind":"code","text":"`PowerState`"},{"kind":"text","text":"](#powerstate) object."}]},{"tag":"@example","content":[{"kind":"code","text":"```ts\nawait Battery.getPowerStateAsync();\n// {\n// batteryLevel: 0.759999,\n// batteryState: BatteryState.UNPLUGGED,\n// lowPowerMode: true,\n// }\n```"}]}]},"type":{"type":"reference","typeArguments":[{"type":"reference","name":"PowerState"}],"name":"Promise","qualifiedName":"Promise","package":"typescript"}}]},{"name":"isAvailableAsync","kind":64,"signatures":[{"name":"isAvailableAsync","kind":4096,"comment":{"summary":[{"kind":"text","text":"Resolves with whether the battery API is available on the current device. The value of this\nproperty is "},{"kind":"code","text":"`true`"},{"kind":"text","text":" on Android and physical iOS devices and "},{"kind":"code","text":"`false`"},{"kind":"text","text":" on iOS simulators. On web,\nit depends on whether the browser supports the web battery API."}]},"type":{"type":"reference","typeArguments":[{"type":"intrinsic","name":"boolean"}],"name":"Promise","qualifiedName":"Promise","package":"typescript"}}]},{"name":"isBatteryOptimizationEnabledAsync","kind":64,"signatures":[{"name":"isBatteryOptimizationEnabledAsync","kind":4096,"comment":{"summary":[{"kind":"text","text":"Checks whether battery optimization is enabled for your application.\nIf battery optimization is enabled for your app, background tasks might be affected\nwhen your app goes into doze mode state. (only on Android 6.0 or later)"}],"blockTags":[{"tag":"@returns","content":[{"kind":"text","text":"Returns a "},{"kind":"code","text":"`Promise`"},{"kind":"text","text":" which fulfills with a "},{"kind":"code","text":"`boolean`"},{"kind":"text","text":" value of either "},{"kind":"code","text":"`true`"},{"kind":"text","text":" or "},{"kind":"code","text":"`false`"},{"kind":"text","text":",\nindicating whether the battery optimization is enabled or disabled, respectively. (Android only)"}]},{"tag":"@example","content":[{"kind":"code","text":"```ts\nawait Battery.isBatteryOptimizationEnabledAsync();\n// true\n```"}]}]},"type":{"type":"reference","typeArguments":[{"type":"intrinsic","name":"boolean"}],"name":"Promise","qualifiedName":"Promise","package":"typescript"}}]},{"name":"isLowPowerModeEnabledAsync","kind":64,"signatures":[{"name":"isLowPowerModeEnabledAsync","kind":4096,"comment":{"summary":[{"kind":"text","text":"Gets the current status of Low Power mode on iOS and Power Saver mode on Android. If a platform\ndoesn't support Low Power mode reporting (like web, older Android devices), the reported low-power\nstate is always "},{"kind":"code","text":"`false`"},{"kind":"text","text":", even if the device is actually in low-power mode."}],"blockTags":[{"tag":"@returns","content":[{"kind":"text","text":"Returns a "},{"kind":"code","text":"`Promise`"},{"kind":"text","text":" which fulfills with a "},{"kind":"code","text":"`boolean`"},{"kind":"text","text":" value of either "},{"kind":"code","text":"`true`"},{"kind":"text","text":" or "},{"kind":"code","text":"`false`"},{"kind":"text","text":",\nindicating whether low power mode is enabled or disabled, respectively."}]},{"tag":"@example","content":[{"kind":"text","text":"Low Power Mode (iOS) or Power Saver Mode (Android) are enabled.\n"},{"kind":"code","text":"```ts\nawait Battery.isLowPowerModeEnabledAsync();\n// true\n```"}]}]},"type":{"type":"reference","typeArguments":[{"type":"intrinsic","name":"boolean"}],"name":"Promise","qualifiedName":"Promise","package":"typescript"}}]}]}
\ No newline at end of file
+{"name":"expo-battery","kind":1,"children":[{"name":"BatteryState","kind":8,"children":[{"name":"CHARGING","kind":16,"comment":{"summary":[{"kind":"text","text":"if battery is charging."}]},"type":{"type":"literal","value":2}},{"name":"FULL","kind":16,"comment":{"summary":[{"kind":"text","text":"if the battery level is full."}]},"type":{"type":"literal","value":3}},{"name":"UNKNOWN","kind":16,"comment":{"summary":[{"kind":"text","text":"if the battery state is unknown or inaccessible."}]},"type":{"type":"literal","value":0}},{"name":"UNPLUGGED","kind":16,"comment":{"summary":[{"kind":"text","text":"if battery is not charging or discharging."}]},"type":{"type":"literal","value":1}}]},{"name":"BatteryLevelEvent","kind":4194304,"type":{"type":"reflection","declaration":{"name":"__type","kind":65536,"children":[{"name":"batteryLevel","kind":1024,"comment":{"summary":[{"kind":"text","text":"A number between "},{"kind":"code","text":"`0`"},{"kind":"text","text":" and "},{"kind":"code","text":"`1`"},{"kind":"text","text":", inclusive, or "},{"kind":"code","text":"`-1`"},{"kind":"text","text":" if the battery level is unknown."}]},"type":{"type":"intrinsic","name":"number"}}]}}},{"name":"BatteryStateEvent","kind":4194304,"type":{"type":"reflection","declaration":{"name":"__type","kind":65536,"children":[{"name":"batteryState","kind":1024,"comment":{"summary":[{"kind":"text","text":"An enum value representing the battery state."}]},"type":{"type":"reference","name":"BatteryState"}}]}}},{"name":"PowerModeEvent","kind":4194304,"type":{"type":"reflection","declaration":{"name":"__type","kind":65536,"children":[{"name":"lowPowerMode","kind":1024,"comment":{"summary":[{"kind":"text","text":"A boolean value, "},{"kind":"code","text":"`true`"},{"kind":"text","text":" if lowPowerMode is on, "},{"kind":"code","text":"`false`"},{"kind":"text","text":" if lowPowerMode is off"}]},"type":{"type":"intrinsic","name":"boolean"}}]}}},{"name":"PowerState","kind":4194304,"type":{"type":"reflection","declaration":{"name":"__type","kind":65536,"children":[{"name":"batteryLevel","kind":1024,"comment":{"summary":[{"kind":"text","text":"A number between "},{"kind":"code","text":"`0`"},{"kind":"text","text":" and "},{"kind":"code","text":"`1`"},{"kind":"text","text":", inclusive, or "},{"kind":"code","text":"`-1`"},{"kind":"text","text":" if the battery level is unknown."}]},"type":{"type":"intrinsic","name":"number"}},{"name":"batteryState","kind":1024,"comment":{"summary":[{"kind":"text","text":"An enum value representing the battery state."}]},"type":{"type":"reference","name":"BatteryState"}},{"name":"lowPowerMode","kind":1024,"comment":{"summary":[{"kind":"text","text":"A boolean value, "},{"kind":"code","text":"`true`"},{"kind":"text","text":" if lowPowerMode is on, "},{"kind":"code","text":"`false`"},{"kind":"text","text":" if lowPowerMode is off"}]},"type":{"type":"intrinsic","name":"boolean"}}]}}},{"name":"Subscription","kind":4194304,"type":{"type":"reflection","declaration":{"name":"__type","kind":65536,"children":[{"name":"remove","kind":1024,"type":{"type":"reflection","declaration":{"name":"__type","kind":65536,"signatures":[{"name":"__type","kind":4096,"comment":{"summary":[{"kind":"text","text":"A method to unsubscribe the listener."}]},"type":{"type":"intrinsic","name":"void"}}]}}}]}}},{"name":"addBatteryLevelListener","kind":64,"signatures":[{"name":"addBatteryLevelListener","kind":4096,"comment":{"summary":[{"kind":"text","text":"Subscribe to the battery level change updates.\n\nOn iOS devices, the event fires when the battery level drops one percent or more, but is only\nfired once per minute at maximum.\n\nOn Android devices, the event fires only when significant changes happens, which is when the\nbattery level drops below ["},{"kind":"code","text":"`\"android.intent.action.BATTERY_LOW\"`"},{"kind":"text","text":"](https://developer.android.com/reference/android/content/Intent#ACTION_BATTERY_LOW)\nor rises above ["},{"kind":"code","text":"`\"android.intent.action.BATTERY_OKAY\"`"},{"kind":"text","text":"](https://developer.android.com/reference/android/content/Intent#ACTION_BATTERY_OKAY)\nfrom a low battery level. See [here](https://developer.android.com/training/monitoring-device-state/battery-monitoring)\nto read more from the Android docs.\n\nOn web, the event never fires."}],"blockTags":[{"tag":"@returns","content":[{"kind":"text","text":"A "},{"kind":"code","text":"`Subscription`"},{"kind":"text","text":" object on which you can call "},{"kind":"code","text":"`remove()`"},{"kind":"text","text":" to unsubscribe from the listener.s"}]}]},"parameters":[{"name":"listener","kind":32768,"comment":{"summary":[{"kind":"text","text":"A callback that is invoked when battery level changes. The callback is provided a\nsingle argument that is an object with a "},{"kind":"code","text":"`batteryLevel`"},{"kind":"text","text":" key."}]},"type":{"type":"reflection","declaration":{"name":"__type","kind":65536,"signatures":[{"name":"__type","kind":4096,"parameters":[{"name":"event","kind":32768,"type":{"type":"reference","name":"BatteryLevelEvent"}}],"type":{"type":"intrinsic","name":"void"}}]}}}],"type":{"type":"reference","name":"Subscription"}}]},{"name":"addBatteryStateListener","kind":64,"signatures":[{"name":"addBatteryStateListener","kind":4096,"comment":{"summary":[{"kind":"text","text":"Subscribe to the battery state change updates to receive an object with a ["},{"kind":"code","text":"`Battery.BatteryState`"},{"kind":"text","text":"](#batterystate)\nenum value for whether the device is any of the four states.\n\nOn web, the event never fires."}],"blockTags":[{"tag":"@returns","content":[{"kind":"text","text":"A "},{"kind":"code","text":"`Subscription`"},{"kind":"text","text":" object on which you can call "},{"kind":"code","text":"`remove()`"},{"kind":"text","text":" to unsubscribe from the listener."}]}]},"parameters":[{"name":"listener","kind":32768,"comment":{"summary":[{"kind":"text","text":"A callback that is invoked when battery state changes. The callback is provided a\nsingle argument that is an object with a "},{"kind":"code","text":"`batteryState`"},{"kind":"text","text":" key."}]},"type":{"type":"reflection","declaration":{"name":"__type","kind":65536,"signatures":[{"name":"__type","kind":4096,"parameters":[{"name":"event","kind":32768,"type":{"type":"reference","name":"BatteryStateEvent"}}],"type":{"type":"intrinsic","name":"void"}}]}}}],"type":{"type":"reference","name":"Subscription"}}]},{"name":"addLowPowerModeListener","kind":64,"signatures":[{"name":"addLowPowerModeListener","kind":4096,"comment":{"summary":[{"kind":"text","text":"Subscribe to Low Power Mode (iOS) or Power Saver Mode (Android) updates. The event fires whenever\nthe power mode is toggled.\n\nOn web, the event never fires."}],"blockTags":[{"tag":"@returns","content":[{"kind":"text","text":"A "},{"kind":"code","text":"`Subscription`"},{"kind":"text","text":" object on which you can call "},{"kind":"code","text":"`remove()`"},{"kind":"text","text":" to unsubscribe from the listener."}]}]},"parameters":[{"name":"listener","kind":32768,"comment":{"summary":[{"kind":"text","text":"A callback that is invoked when Low Power Mode (iOS) or Power Saver Mode (Android)\nchanges. The callback is provided a single argument that is an object with a "},{"kind":"code","text":"`lowPowerMode`"},{"kind":"text","text":" key."}]},"type":{"type":"reflection","declaration":{"name":"__type","kind":65536,"signatures":[{"name":"__type","kind":4096,"parameters":[{"name":"event","kind":32768,"type":{"type":"reference","name":"PowerModeEvent"}}],"type":{"type":"intrinsic","name":"void"}}]}}}],"type":{"type":"reference","name":"Subscription"}}]},{"name":"getBatteryLevelAsync","kind":64,"signatures":[{"name":"getBatteryLevelAsync","kind":4096,"comment":{"summary":[{"kind":"text","text":"Gets the battery level of the device as a number between "},{"kind":"code","text":"`0`"},{"kind":"text","text":" and "},{"kind":"code","text":"`1`"},{"kind":"text","text":", inclusive. If the device\ndoes not support retrieving the battery level, this method returns "},{"kind":"code","text":"`-1`"},{"kind":"text","text":". On web, this method\nalways returns "},{"kind":"code","text":"`-1`"},{"kind":"text","text":"."}],"blockTags":[{"tag":"@returns","content":[{"kind":"text","text":"A "},{"kind":"code","text":"`Promise`"},{"kind":"text","text":" that fulfils with a number between "},{"kind":"code","text":"`0`"},{"kind":"text","text":" and "},{"kind":"code","text":"`1`"},{"kind":"text","text":" representing the battery level,\nor "},{"kind":"code","text":"`-1`"},{"kind":"text","text":" if the device does not provide it."}]},{"tag":"@example","content":[{"kind":"code","text":"```ts\nawait Battery.getBatteryLevelAsync();\n// 0.759999\n```"}]}]},"type":{"type":"reference","typeArguments":[{"type":"intrinsic","name":"number"}],"name":"Promise","qualifiedName":"Promise","package":"typescript"}}]},{"name":"getBatteryStateAsync","kind":64,"signatures":[{"name":"getBatteryStateAsync","kind":4096,"comment":{"summary":[{"kind":"text","text":"Tells the battery's current state. On web, this always returns "},{"kind":"code","text":"`BatteryState.UNKNOWN`"},{"kind":"text","text":"."}],"blockTags":[{"tag":"@returns","content":[{"kind":"text","text":"Returns a "},{"kind":"code","text":"`Promise`"},{"kind":"text","text":" which fulfills with a ["},{"kind":"code","text":"`Battery.BatteryState`"},{"kind":"text","text":"](#batterystate) enum\nvalue for whether the device is any of the four states."}]},{"tag":"@example","content":[{"kind":"code","text":"```ts\nawait Battery.getBatteryStateAsync();\n// BatteryState.CHARGING\n```"}]}]},"type":{"type":"reference","typeArguments":[{"type":"reference","name":"BatteryState"}],"name":"Promise","qualifiedName":"Promise","package":"typescript"}}]},{"name":"getPowerStateAsync","kind":64,"signatures":[{"name":"getPowerStateAsync","kind":4096,"comment":{"summary":[{"kind":"text","text":"Gets the power state of the device including the battery level, whether it is plugged in, and if\nthe system is currently operating in Low Power Mode (iOS) or Power Saver Mode (Android). This\nmethod re-throws any errors that occur when retrieving any of the power-state information."}],"blockTags":[{"tag":"@returns","content":[{"kind":"text","text":"Returns a "},{"kind":"code","text":"`Promise`"},{"kind":"text","text":" which fulfills with ["},{"kind":"code","text":"`PowerState`"},{"kind":"text","text":"](#powerstate) object."}]},{"tag":"@example","content":[{"kind":"code","text":"```ts\nawait Battery.getPowerStateAsync();\n// {\n// batteryLevel: 0.759999,\n// batteryState: BatteryState.UNPLUGGED,\n// lowPowerMode: true,\n// }\n```"}]}]},"type":{"type":"reference","typeArguments":[{"type":"reference","name":"PowerState"}],"name":"Promise","qualifiedName":"Promise","package":"typescript"}}]},{"name":"isAvailableAsync","kind":64,"signatures":[{"name":"isAvailableAsync","kind":4096,"comment":{"summary":[{"kind":"text","text":"Resolves with whether the battery API is available on the current device. The value of this\nproperty is "},{"kind":"code","text":"`true`"},{"kind":"text","text":" on Android and physical iOS devices and "},{"kind":"code","text":"`false`"},{"kind":"text","text":" on iOS simulators. On web,\nit depends on whether the browser supports the web battery API."}]},"type":{"type":"reference","typeArguments":[{"type":"intrinsic","name":"boolean"}],"name":"Promise","qualifiedName":"Promise","package":"typescript"}}]},{"name":"isBatteryOptimizationEnabledAsync","kind":64,"signatures":[{"name":"isBatteryOptimizationEnabledAsync","kind":4096,"comment":{"summary":[{"kind":"text","text":"Checks whether battery optimization is enabled for your application.\nIf battery optimization is enabled for your app, background tasks might be affected\nwhen your app goes into doze mode state. (only on Android 6.0 or later)"}],"blockTags":[{"tag":"@returns","content":[{"kind":"text","text":"Returns a "},{"kind":"code","text":"`Promise`"},{"kind":"text","text":" which fulfills with a "},{"kind":"code","text":"`boolean`"},{"kind":"text","text":" value of either "},{"kind":"code","text":"`true`"},{"kind":"text","text":" or "},{"kind":"code","text":"`false`"},{"kind":"text","text":",\nindicating whether the battery optimization is enabled or disabled, respectively. (Android only)"}]},{"tag":"@example","content":[{"kind":"code","text":"```ts\nawait Battery.isBatteryOptimizationEnabledAsync();\n// true\n```"}]}]},"type":{"type":"reference","typeArguments":[{"type":"intrinsic","name":"boolean"}],"name":"Promise","qualifiedName":"Promise","package":"typescript"}}]},{"name":"isLowPowerModeEnabledAsync","kind":64,"signatures":[{"name":"isLowPowerModeEnabledAsync","kind":4096,"comment":{"summary":[{"kind":"text","text":"Gets the current status of Low Power mode on iOS and Power Saver mode on Android. If a platform\ndoesn't support Low Power mode reporting (like web, older Android devices), the reported low-power\nstate is always "},{"kind":"code","text":"`false`"},{"kind":"text","text":", even if the device is actually in low-power mode."}],"blockTags":[{"tag":"@returns","content":[{"kind":"text","text":"Returns a "},{"kind":"code","text":"`Promise`"},{"kind":"text","text":" which fulfills with a "},{"kind":"code","text":"`boolean`"},{"kind":"text","text":" value of either "},{"kind":"code","text":"`true`"},{"kind":"text","text":" or "},{"kind":"code","text":"`false`"},{"kind":"text","text":",\nindicating whether low power mode is enabled or disabled, respectively."}]},{"tag":"@example","content":[{"kind":"text","text":"Low Power Mode (iOS) or Power Saver Mode (Android) are enabled.\n"},{"kind":"code","text":"```ts\nawait Battery.isLowPowerModeEnabledAsync();\n// true\n```"}]}]},"type":{"type":"reference","typeArguments":[{"type":"intrinsic","name":"boolean"}],"name":"Promise","qualifiedName":"Promise","package":"typescript"}}]},{"name":"useBatteryLevel","kind":64,"signatures":[{"name":"useBatteryLevel","kind":4096,"comment":{"summary":[{"kind":"text","text":"Gets the device's battery level, as in ["},{"kind":"code","text":"`getBatteryLevelAsync`"},{"kind":"text","text":"](#getbatterylevelasync)."}],"blockTags":[{"tag":"@example","content":[{"kind":"code","text":"```ts\nconst batteryLevel = useBatteryLevel();\n```"}]},{"tag":"@returns","content":[{"kind":"text","text":"The battery level of the device"}]}]},"type":{"type":"intrinsic","name":"number"}}]},{"name":"useBatteryState","kind":64,"signatures":[{"name":"useBatteryState","kind":4096,"comment":{"summary":[{"kind":"text","text":"Gets the device's battery state, as in ["},{"kind":"code","text":"`getBatteryStateAsync`"},{"kind":"text","text":"](#getbatterystateasync)."}],"blockTags":[{"tag":"@example","content":[{"kind":"code","text":"```ts\nconst batteryState = useBatteryState();\n```"}]},{"tag":"@returns","content":[{"kind":"text","text":"The battery state of the device"}]}]},"type":{"type":"reference","name":"BatteryState"}}]},{"name":"useLowPowerMode","kind":64,"signatures":[{"name":"useLowPowerMode","kind":4096,"comment":{"summary":[{"kind":"text","text":"Boolean that indicates if the device is in low power or power saver mode, as in ["},{"kind":"code","text":"`isLowPowerModeEnabledAsync`"},{"kind":"text","text":"](#islowpowermodeenabledasync)."}],"blockTags":[{"tag":"@example","content":[{"kind":"code","text":"```ts\nconst lowPowerMode = useLowPowerMode();\n```"}]},{"tag":"@returns","content":[{"kind":"text","text":"boolean indicating if the device is in low power mode"}]}]},"type":{"type":"intrinsic","name":"boolean"}}]},{"name":"usePowerState","kind":64,"signatures":[{"name":"usePowerState","kind":4096,"comment":{"summary":[{"kind":"text","text":"Gets the device's power state information, as in ["},{"kind":"code","text":"`getPowerStateAsync`"},{"kind":"text","text":"](#getpowerstateasync)."}],"blockTags":[{"tag":"@example","content":[{"kind":"code","text":"```ts\nconst { lowPowerMode, batteryLevel, batteryState } = usePowerState();\n```"}]},{"tag":"@returns","content":[{"kind":"text","text":"power state information"}]}]},"type":{"type":"reference","name":"PowerState"}}]}]}
\ No newline at end of file
diff --git a/docs/public/static/data/unversioned/expo-camera.json b/docs/public/static/data/unversioned/expo-camera.json
index de2e3927e7a2b..fa31ffc90cbb9 100644
--- a/docs/public/static/data/unversioned/expo-camera.json
+++ b/docs/public/static/data/unversioned/expo-camera.json
@@ -1 +1 @@
-{"name":"expo-camera","kind":1,"children":[{"name":"AutoFocus","kind":8,"children":[{"name":"auto","kind":16,"comment":{"summary":[],"blockTags":[{"tag":"@platform","content":[{"kind":"text","text":"web"}]}]},"type":{"type":"literal","value":"auto"}},{"name":"off","kind":16,"type":{"type":"literal","value":"off"}},{"name":"on","kind":16,"type":{"type":"literal","value":"on"}},{"name":"singleShot","kind":16,"comment":{"summary":[],"blockTags":[{"tag":"@platform","content":[{"kind":"text","text":"web"}]}]},"type":{"type":"literal","value":"singleShot"}}]},{"name":"CameraType","kind":8,"children":[{"name":"back","kind":16,"type":{"type":"literal","value":"back"}},{"name":"front","kind":16,"type":{"type":"literal","value":"front"}}]},{"name":"FlashMode","kind":8,"children":[{"name":"auto","kind":16,"type":{"type":"literal","value":"auto"}},{"name":"off","kind":16,"type":{"type":"literal","value":"off"}},{"name":"on","kind":16,"type":{"type":"literal","value":"on"}},{"name":"torch","kind":16,"type":{"type":"literal","value":"torch"}}]},{"name":"ImageType","kind":8,"children":[{"name":"jpg","kind":16,"type":{"type":"literal","value":"jpg"}},{"name":"png","kind":16,"type":{"type":"literal","value":"png"}}]},{"name":"PermissionStatus","kind":8,"children":[{"name":"DENIED","kind":16,"comment":{"summary":[{"kind":"text","text":"User has denied the permission."}]},"type":{"type":"literal","value":"denied"}},{"name":"GRANTED","kind":16,"comment":{"summary":[{"kind":"text","text":"User has granted the permission."}]},"type":{"type":"literal","value":"granted"}},{"name":"UNDETERMINED","kind":16,"comment":{"summary":[{"kind":"text","text":"User hasn't granted or denied the permission yet."}]},"type":{"type":"literal","value":"undetermined"}}]},{"name":"VideoCodec","kind":8,"comment":{"summary":[{"kind":"text","text":"This option specifies what codec to use when recording a video."}],"blockTags":[{"tag":"@platform","content":[{"kind":"text","text":"ios"}]}]},"children":[{"name":"AppleProRes422","kind":16,"type":{"type":"literal","value":"apcn"}},{"name":"AppleProRes4444","kind":16,"type":{"type":"literal","value":"ap4h"}},{"name":"H264","kind":16,"type":{"type":"literal","value":"avc1"}},{"name":"HEVC","kind":16,"type":{"type":"literal","value":"hvc1"}},{"name":"JPEG","kind":16,"type":{"type":"literal","value":"jpeg"}}]},{"name":"VideoQuality","kind":8,"children":[{"name":"1080p","kind":16,"type":{"type":"literal","value":"1080p"}},{"name":"2160p","kind":16,"type":{"type":"literal","value":"2160p"}},{"name":"480p","kind":16,"type":{"type":"literal","value":"480p"}},{"name":"4:3","kind":16,"type":{"type":"literal","value":"4:3"}},{"name":"720p","kind":16,"type":{"type":"literal","value":"720p"}}]},{"name":"VideoStabilization","kind":8,"comment":{"summary":[{"kind":"text","text":"This option specifies the stabilization mode to use when recording a video."}],"blockTags":[{"tag":"@platform","content":[{"kind":"text","text":"ios"}]}]},"children":[{"name":"auto","kind":16,"type":{"type":"literal","value":"auto"}},{"name":"cinematic","kind":16,"type":{"type":"literal","value":"cinematic"}},{"name":"off","kind":16,"type":{"type":"literal","value":"off"}},{"name":"standard","kind":16,"type":{"type":"literal","value":"standard"}}]},{"name":"WhiteBalance","kind":8,"children":[{"name":"auto","kind":16,"type":{"type":"literal","value":"auto"}},{"name":"cloudy","kind":16,"comment":{"summary":[],"blockTags":[{"tag":"@platform","content":[{"kind":"text","text":"android"}]},{"tag":"@platform","content":[{"kind":"text","text":"ios"}]}]},"type":{"type":"literal","value":"cloudy"}},{"name":"continuous","kind":16,"comment":{"summary":[],"blockTags":[{"tag":"@platform","content":[{"kind":"text","text":"web"}]}]},"type":{"type":"literal","value":"continuous"}},{"name":"fluorescent","kind":16,"comment":{"summary":[],"blockTags":[{"tag":"@platform","content":[{"kind":"text","text":"android"}]},{"tag":"@platform","content":[{"kind":"text","text":"ios"}]}]},"type":{"type":"literal","value":"fluorescent"}},{"name":"incandescent","kind":16,"comment":{"summary":[],"blockTags":[{"tag":"@platform","content":[{"kind":"text","text":"android"}]},{"tag":"@platform","content":[{"kind":"text","text":"ios"}]}]},"type":{"type":"literal","value":"incandescent"}},{"name":"manual","kind":16,"comment":{"summary":[],"blockTags":[{"tag":"@platform","content":[{"kind":"text","text":"web"}]}]},"type":{"type":"literal","value":"manual"}},{"name":"shadow","kind":16,"comment":{"summary":[],"blockTags":[{"tag":"@platform","content":[{"kind":"text","text":"android"}]},{"tag":"@platform","content":[{"kind":"text","text":"ios"}]}]},"type":{"type":"literal","value":"shadow"}},{"name":"sunny","kind":16,"comment":{"summary":[],"blockTags":[{"tag":"@platform","content":[{"kind":"text","text":"android"}]},{"tag":"@platform","content":[{"kind":"text","text":"ios"}]}]},"type":{"type":"literal","value":"sunny"}}]},{"name":"Camera","kind":128,"children":[{"name":"constructor","kind":512,"flags":{"isExternal":true},"signatures":[{"name":"new Camera","kind":16384,"flags":{"isExternal":true},"parameters":[{"name":"props","kind":32768,"flags":{"isExternal":true},"type":{"type":"union","types":[{"type":"reference","name":"CameraProps"},{"type":"reference","typeArguments":[{"type":"reference","name":"CameraProps"}],"name":"Readonly","qualifiedName":"Readonly","package":"typescript"}]}}],"type":{"type":"reference","name":"default"},"inheritedFrom":{"type":"reference","name":"React.Component.constructor"}},{"name":"new Camera","kind":16384,"flags":{"isExternal":true},"comment":{"summary":[],"blockTags":[{"tag":"@deprecated","content":[]},{"tag":"@see","content":[{"kind":"text","text":"https://reactjs.org/docs/legacy-context.html"}]}]},"parameters":[{"name":"props","kind":32768,"flags":{"isExternal":true},"type":{"type":"reference","name":"CameraProps"}},{"name":"context","kind":32768,"flags":{"isExternal":true},"type":{"type":"intrinsic","name":"any"}}],"type":{"type":"reference","name":"default"},"inheritedFrom":{"type":"reference","name":"React.Component.constructor"}}],"inheritedFrom":{"type":"reference","name":"React.Component.constructor"}},{"name":"_cameraHandle","kind":1024,"flags":{"isOptional":true},"type":{"type":"union","types":[{"type":"literal","value":null},{"type":"intrinsic","name":"number"}]}},{"name":"_cameraRef","kind":1024,"flags":{"isOptional":true},"type":{"type":"union","types":[{"type":"literal","value":null},{"type":"reference","typeArguments":[{"type":"reflection","declaration":{"name":"__type","kind":65536}},{"type":"reflection","declaration":{"name":"__type","kind":65536}},{"type":"intrinsic","name":"any"}],"name":"Component","qualifiedName":"React.Component","package":"@types/react"}]}},{"name":"_lastEvents","kind":1024,"type":{"type":"reflection","declaration":{"name":"__type","kind":65536,"indexSignature":{"name":"__index","kind":8192,"parameters":[{"name":"eventName","kind":32768,"type":{"type":"intrinsic","name":"string"}}],"type":{"type":"intrinsic","name":"string"}}}},"defaultValue":"{}"},{"name":"_lastEventsTimes","kind":1024,"type":{"type":"reflection","declaration":{"name":"__type","kind":65536,"indexSignature":{"name":"__index","kind":8192,"parameters":[{"name":"eventName","kind":32768,"type":{"type":"intrinsic","name":"string"}}],"type":{"type":"reference","name":"Date","qualifiedName":"Date","package":"typescript"}}}},"defaultValue":"{}"},{"name":"Constants","kind":1024,"flags":{"isStatic":true},"type":{"type":"reference","name":"ConstantsType"},"defaultValue":"..."},{"name":"ConversionTables","kind":1024,"flags":{"isStatic":true},"type":{"type":"reflection","declaration":{"name":"__type","kind":65536,"children":[{"name":"autoFocus","kind":1024,"type":{"type":"reference","typeArguments":[{"type":"union","types":[{"type":"literal","value":"on"},{"type":"literal","value":"off"},{"type":"literal","value":"auto"},{"type":"literal","value":"singleShot"}]},{"type":"union","types":[{"type":"intrinsic","name":"undefined"},{"type":"intrinsic","name":"string"},{"type":"intrinsic","name":"number"},{"type":"intrinsic","name":"boolean"}]}],"name":"Record","qualifiedName":"Record","package":"typescript"}},{"name":"flashMode","kind":1024,"type":{"type":"reference","typeArguments":[{"type":"union","types":[{"type":"literal","value":"on"},{"type":"literal","value":"off"},{"type":"literal","value":"auto"},{"type":"literal","value":"torch"}]},{"type":"union","types":[{"type":"intrinsic","name":"undefined"},{"type":"intrinsic","name":"string"},{"type":"intrinsic","name":"number"}]}],"name":"Record","qualifiedName":"Record","package":"typescript"}},{"name":"type","kind":1024,"type":{"type":"reference","typeArguments":[{"type":"union","types":[{"type":"literal","value":"front"},{"type":"literal","value":"back"}]},{"type":"union","types":[{"type":"intrinsic","name":"undefined"},{"type":"intrinsic","name":"string"},{"type":"intrinsic","name":"number"}]}],"name":"Record","qualifiedName":"Record","package":"typescript"}},{"name":"whiteBalance","kind":1024,"type":{"type":"reference","typeArguments":[{"type":"union","types":[{"type":"literal","value":"auto"},{"type":"literal","value":"sunny"},{"type":"literal","value":"cloudy"},{"type":"literal","value":"shadow"},{"type":"literal","value":"incandescent"},{"type":"literal","value":"fluorescent"},{"type":"literal","value":"continuous"},{"type":"literal","value":"manual"}]},{"type":"union","types":[{"type":"intrinsic","name":"undefined"},{"type":"intrinsic","name":"string"},{"type":"intrinsic","name":"number"}]}],"name":"Record","qualifiedName":"Record","package":"typescript"}}]}},"defaultValue":"ConversionTables"},{"name":"defaultProps","kind":1024,"flags":{"isStatic":true},"type":{"type":"reference","name":"CameraProps"},"defaultValue":"..."},{"name":"useCameraPermissions","kind":1024,"flags":{"isStatic":true},"type":{"type":"reflection","declaration":{"name":"__type","kind":65536,"signatures":[{"name":"__type","kind":4096,"comment":{"summary":[{"kind":"text","text":"Check or request permissions to access the camera.\nThis uses both "},{"kind":"code","text":"`requestCameraPermissionsAsync`"},{"kind":"text","text":" and "},{"kind":"code","text":"`getCameraPermissionsAsync`"},{"kind":"text","text":" to interact with the permissions."}],"blockTags":[{"tag":"@example","content":[{"kind":"code","text":"```ts\nconst [status, requestPermission] = Camera.useCameraPermissions();\n```"}]}]},"parameters":[{"name":"options","kind":32768,"flags":{"isOptional":true},"type":{"type":"reference","typeArguments":[{"type":"intrinsic","name":"object"}],"name":"PermissionHookOptions"}}],"type":{"type":"tuple","elements":[{"type":"union","types":[{"type":"literal","value":null},{"type":"reference","name":"PermissionResponse"}]},{"type":"reference","typeArguments":[{"type":"reference","name":"PermissionResponse"}],"name":"RequestPermissionMethod"},{"type":"reference","typeArguments":[{"type":"reference","name":"PermissionResponse"}],"name":"GetPermissionMethod"}]}}]}},"defaultValue":"..."},{"name":"useMicrophonePermissions","kind":1024,"flags":{"isStatic":true},"type":{"type":"reflection","declaration":{"name":"__type","kind":65536,"signatures":[{"name":"__type","kind":4096,"comment":{"summary":[{"kind":"text","text":"Check or request permissions to access the microphone.\nThis uses both "},{"kind":"code","text":"`requestMicrophonePermissionsAsync`"},{"kind":"text","text":" and "},{"kind":"code","text":"`getMicrophonePermissionsAsync`"},{"kind":"text","text":" to interact with the permissions."}],"blockTags":[{"tag":"@example","content":[{"kind":"code","text":"```ts\nconst [status, requestPermission] = Camera.useMicrophonePermissions();\n```"}]}]},"parameters":[{"name":"options","kind":32768,"flags":{"isOptional":true},"type":{"type":"reference","typeArguments":[{"type":"intrinsic","name":"object"}],"name":"PermissionHookOptions"}}],"type":{"type":"tuple","elements":[{"type":"union","types":[{"type":"literal","value":null},{"type":"reference","name":"PermissionResponse"}]},{"type":"reference","typeArguments":[{"type":"reference","name":"PermissionResponse"}],"name":"RequestPermissionMethod"},{"type":"reference","typeArguments":[{"type":"reference","name":"PermissionResponse"}],"name":"GetPermissionMethod"}]}}]}},"defaultValue":"..."},{"name":"_onCameraReady","kind":2048,"signatures":[{"name":"_onCameraReady","kind":4096,"type":{"type":"intrinsic","name":"void"}}]},{"name":"_onMountError","kind":2048,"signatures":[{"name":"_onMountError","kind":4096,"parameters":[{"name":"__namedParameters","kind":32768,"type":{"type":"reflection","declaration":{"name":"__type","kind":65536,"children":[{"name":"nativeEvent","kind":1024,"type":{"type":"reflection","declaration":{"name":"__type","kind":65536,"children":[{"name":"message","kind":1024,"type":{"type":"intrinsic","name":"string"}}]}}}]}}}],"type":{"type":"intrinsic","name":"void"}}]},{"name":"_onObjectDetected","kind":2048,"signatures":[{"name":"_onObjectDetected","kind":4096,"parameters":[{"name":"callback","kind":32768,"flags":{"isOptional":true},"type":{"type":"reference","name":"Function","qualifiedName":"Function","package":"typescript"}}],"type":{"type":"reflection","declaration":{"name":"__type","kind":65536,"signatures":[{"name":"__type","kind":4096,"parameters":[{"name":"__namedParameters","kind":32768,"type":{"type":"reflection","declaration":{"name":"__type","kind":65536,"children":[{"name":"nativeEvent","kind":1024,"type":{"type":"intrinsic","name":"any"}}]}}}],"type":{"type":"intrinsic","name":"void"}}]}}}]},{"name":"_setReference","kind":2048,"signatures":[{"name":"_setReference","kind":4096,"parameters":[{"name":"ref","kind":32768,"flags":{"isOptional":true},"type":{"type":"reference","typeArguments":[{"type":"reflection","declaration":{"name":"__type","kind":65536}},{"type":"reflection","declaration":{"name":"__type","kind":65536}},{"type":"intrinsic","name":"any"}],"name":"Component","qualifiedName":"React.Component","package":"@types/react"}}],"type":{"type":"intrinsic","name":"void"}}]},{"name":"getAvailablePictureSizesAsync","kind":2048,"signatures":[{"name":"getAvailablePictureSizesAsync","kind":4096,"comment":{"summary":[{"kind":"text","text":"Get picture sizes that are supported by the device for given "},{"kind":"code","text":"`ratio`"},{"kind":"text","text":"."}],"blockTags":[{"tag":"@returns","content":[{"kind":"text","text":"Returns a Promise that resolves to an array of strings representing picture sizes that can be passed to "},{"kind":"code","text":"`pictureSize`"},{"kind":"text","text":" prop.\nThe list varies across Android devices but is the same for every iOS."}]}]},"parameters":[{"name":"ratio","kind":32768,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"A string representing aspect ratio of sizes to be returned."}]},"type":{"type":"intrinsic","name":"string"}}],"type":{"type":"reference","typeArguments":[{"type":"array","elementType":{"type":"intrinsic","name":"string"}}],"name":"Promise","qualifiedName":"Promise","package":"typescript"}}]},{"name":"getSupportedRatiosAsync","kind":2048,"signatures":[{"name":"getSupportedRatiosAsync","kind":4096,"comment":{"summary":[{"kind":"text","text":"Get aspect ratios that are supported by the device and can be passed via "},{"kind":"code","text":"`ratio`"},{"kind":"text","text":" prop."}],"blockTags":[{"tag":"@returns","content":[{"kind":"text","text":"Returns a Promise that resolves to an array of strings representing ratios, eg. "},{"kind":"code","text":"`['4:3', '1:1']`"},{"kind":"text","text":"."}]},{"tag":"@platform","content":[{"kind":"text","text":"android"}]}]},"type":{"type":"reference","typeArguments":[{"type":"array","elementType":{"type":"intrinsic","name":"string"}}],"name":"Promise","qualifiedName":"Promise","package":"typescript"}}]},{"name":"pausePreview","kind":2048,"signatures":[{"name":"pausePreview","kind":4096,"comment":{"summary":[{"kind":"text","text":"Pauses the camera preview. It is not recommended to use "},{"kind":"code","text":"`takePictureAsync`"},{"kind":"text","text":" when preview is paused."}]},"type":{"type":"intrinsic","name":"void"}}]},{"name":"recordAsync","kind":2048,"signatures":[{"name":"recordAsync","kind":4096,"comment":{"summary":[{"kind":"text","text":"Starts recording a video that will be saved to cache directory. Videos are rotated to match device's orientation.\nFlipping camera during a recording results in stopping it."}],"blockTags":[{"tag":"@returns","content":[{"kind":"text","text":"Returns a Promise that resolves to an object containing video file "},{"kind":"code","text":"`uri`"},{"kind":"text","text":" property and a "},{"kind":"code","text":"`codec`"},{"kind":"text","text":" property on iOS.\nThe Promise is returned if "},{"kind":"code","text":"`stopRecording`"},{"kind":"text","text":" was invoked, one of "},{"kind":"code","text":"`maxDuration`"},{"kind":"text","text":" and "},{"kind":"code","text":"`maxFileSize`"},{"kind":"text","text":" is reached or camera preview is stopped."}]},{"tag":"@platform","content":[{"kind":"text","text":"android"}]},{"tag":"@platform","content":[{"kind":"text","text":"ios"}]}]},"parameters":[{"name":"options","kind":32768,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"A map of "},{"kind":"code","text":"`CameraRecordingOptions`"},{"kind":"text","text":" type."}]},"type":{"type":"reference","name":"CameraRecordingOptions"}}],"type":{"type":"reference","typeArguments":[{"type":"reflection","declaration":{"name":"__type","kind":65536,"children":[{"name":"uri","kind":1024,"type":{"type":"intrinsic","name":"string"}}]}}],"name":"Promise","qualifiedName":"Promise","package":"typescript"}}]},{"name":"render","kind":2048,"signatures":[{"name":"render","kind":4096,"type":{"type":"reference","name":"Element","qualifiedName":"global.JSX.Element","package":"@types/react"},"overwrites":{"type":"reference","name":"React.Component.render"}}],"overwrites":{"type":"reference","name":"React.Component.render"}},{"name":"resumePreview","kind":2048,"signatures":[{"name":"resumePreview","kind":4096,"comment":{"summary":[{"kind":"text","text":"Resumes the camera preview."}]},"type":{"type":"intrinsic","name":"void"}}]},{"name":"stopRecording","kind":2048,"signatures":[{"name":"stopRecording","kind":4096,"comment":{"summary":[{"kind":"text","text":"Stops recording if any is in progress."}]},"type":{"type":"intrinsic","name":"void"}}]},{"name":"takePictureAsync","kind":2048,"signatures":[{"name":"takePictureAsync","kind":4096,"comment":{"summary":[{"kind":"text","text":"Takes a picture and saves it to app's cache directory. Photos are rotated to match device's orientation\n(if "},{"kind":"code","text":"`options.skipProcessing`"},{"kind":"text","text":" flag is not enabled) and scaled to match the preview. Anyway on Android it is essential\nto set ratio prop to get a picture with correct dimensions.\n> **Note**: Make sure to wait for the ["},{"kind":"code","text":"`onCameraReady`"},{"kind":"text","text":"](#oncameraready) callback before calling this method."}],"blockTags":[{"tag":"@returns","content":[{"kind":"text","text":"Returns a Promise that resolves to "},{"kind":"code","text":"`CameraCapturedPicture`"},{"kind":"text","text":" object, where "},{"kind":"code","text":"`uri`"},{"kind":"text","text":" is a URI to the local image file on iOS,\nAndroid, and a base64 string on web (usable as the source for an "},{"kind":"code","text":"`Image`"},{"kind":"text","text":" element). The "},{"kind":"code","text":"`width`"},{"kind":"text","text":" and "},{"kind":"code","text":"`height`"},{"kind":"text","text":" properties specify\nthe dimensions of the image. "},{"kind":"code","text":"`base64`"},{"kind":"text","text":" is included if the "},{"kind":"code","text":"`base64`"},{"kind":"text","text":" option was truthy, and is a string containing the JPEG data\nof the image in Base64--prepend that with "},{"kind":"code","text":"`'data:image/jpg;base64,'`"},{"kind":"text","text":" to get a data URI, which you can use as the source\nfor an "},{"kind":"code","text":"`Image`"},{"kind":"text","text":" element for example. "},{"kind":"code","text":"`exif`"},{"kind":"text","text":" is included if the "},{"kind":"code","text":"`exif`"},{"kind":"text","text":" option was truthy, and is an object containing EXIF\ndata for the image--the names of its properties are EXIF tags and their values are the values for those tags.\n\n> On native platforms, the local image URI is temporary. Use ["},{"kind":"code","text":"`FileSystem.copyAsync`"},{"kind":"text","text":"](filesystem.md#filesystemcopyasyncoptions)\n> to make a permanent copy of the image."}]}]},"parameters":[{"name":"options","kind":32768,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"An object in form of "},{"kind":"code","text":"`CameraPictureOptions`"},{"kind":"text","text":" type."}]},"type":{"type":"reference","name":"CameraPictureOptions"}}],"type":{"type":"reference","typeArguments":[{"type":"reference","name":"CameraCapturedPicture"}],"name":"Promise","qualifiedName":"Promise","package":"typescript"}}]},{"name":"getAvailableCameraTypesAsync","kind":2048,"flags":{"isStatic":true},"signatures":[{"name":"getAvailableCameraTypesAsync","kind":4096,"comment":{"summary":[{"kind":"text","text":"Returns a list of camera types "},{"kind":"code","text":"`['front', 'back']`"},{"kind":"text","text":". This is useful for desktop browsers which only have front-facing cameras."}],"blockTags":[{"tag":"@platform","content":[{"kind":"text","text":"web"}]}]},"type":{"type":"reference","typeArguments":[{"type":"array","elementType":{"type":"reference","name":"CameraType"}}],"name":"Promise","qualifiedName":"Promise","package":"typescript"}}]},{"name":"getAvailableVideoCodecsAsync","kind":2048,"flags":{"isStatic":true},"signatures":[{"name":"getAvailableVideoCodecsAsync","kind":4096,"comment":{"summary":[{"kind":"text","text":"Queries the device for the available video codecs that can be used in video recording."}],"blockTags":[{"tag":"@returns","content":[{"kind":"text","text":"A promise that resolves to a list of strings that represents available codecs."}]},{"tag":"@platform","content":[{"kind":"text","text":"ios"}]}]},"type":{"type":"reference","typeArguments":[{"type":"array","elementType":{"type":"reference","name":"VideoCodec"}}],"name":"Promise","qualifiedName":"Promise","package":"typescript"}}]},{"name":"getCameraPermissionsAsync","kind":2048,"flags":{"isStatic":true},"signatures":[{"name":"getCameraPermissionsAsync","kind":4096,"comment":{"summary":[{"kind":"text","text":"Checks user's permissions for accessing camera."}],"blockTags":[{"tag":"@returns","content":[{"kind":"text","text":"A promise that resolves to an object of type [PermissionResponse](#permissionresponse)."}]}]},"type":{"type":"reference","typeArguments":[{"type":"reference","name":"PermissionResponse"}],"name":"Promise","qualifiedName":"Promise","package":"typescript"}}]},{"name":"getMicrophonePermissionsAsync","kind":2048,"flags":{"isStatic":true},"signatures":[{"name":"getMicrophonePermissionsAsync","kind":4096,"comment":{"summary":[{"kind":"text","text":"Checks user's permissions for accessing microphone."}],"blockTags":[{"tag":"@returns","content":[{"kind":"text","text":"A promise that resolves to an object of type [PermissionResponse](#permissionresponse)."}]}]},"type":{"type":"reference","typeArguments":[{"type":"reference","name":"PermissionResponse"}],"name":"Promise","qualifiedName":"Promise","package":"typescript"}}]},{"name":"getPermissionsAsync","kind":2048,"flags":{"isStatic":true},"signatures":[{"name":"getPermissionsAsync","kind":4096,"comment":{"summary":[],"blockTags":[{"tag":"@deprecated","content":[{"kind":"text","text":"Use "},{"kind":"code","text":"`getCameraPermissionsAsync`"},{"kind":"text","text":" or "},{"kind":"code","text":"`getMicrophonePermissionsAsync`"},{"kind":"text","text":" instead.\nChecks user's permissions for accessing camera."}]}]},"type":{"type":"reference","typeArguments":[{"type":"reference","name":"PermissionResponse"}],"name":"Promise","qualifiedName":"Promise","package":"typescript"}}]},{"name":"isAvailableAsync","kind":2048,"flags":{"isStatic":true},"signatures":[{"name":"isAvailableAsync","kind":4096,"comment":{"summary":[{"kind":"text","text":"Check whether the current device has a camera. This is useful for web and simulators cases.\nThis isn't influenced by the Permissions API (all platforms), or HTTP usage (in the browser).\nYou will still need to check if the native permission has been accepted."}],"blockTags":[{"tag":"@platform","content":[{"kind":"text","text":"web"}]}]},"type":{"type":"reference","typeArguments":[{"type":"intrinsic","name":"boolean"}],"name":"Promise","qualifiedName":"Promise","package":"typescript"}}]},{"name":"requestCameraPermissionsAsync","kind":2048,"flags":{"isStatic":true},"signatures":[{"name":"requestCameraPermissionsAsync","kind":4096,"comment":{"summary":[{"kind":"text","text":"Asks the user to grant permissions for accessing camera.\nOn iOS this will require apps to specify an "},{"kind":"code","text":"`NSCameraUsageDescription`"},{"kind":"text","text":" entry in the **Info.plist**."}],"blockTags":[{"tag":"@returns","content":[{"kind":"text","text":"A promise that resolves to an object of type [PermissionResponse](#permissionresponse)."}]}]},"type":{"type":"reference","typeArguments":[{"type":"reference","name":"PermissionResponse"}],"name":"Promise","qualifiedName":"Promise","package":"typescript"}}]},{"name":"requestMicrophonePermissionsAsync","kind":2048,"flags":{"isStatic":true},"signatures":[{"name":"requestMicrophonePermissionsAsync","kind":4096,"comment":{"summary":[{"kind":"text","text":"Asks the user to grant permissions for accessing the microphone.\nOn iOS this will require apps to specify an "},{"kind":"code","text":"`NSMicrophoneUsageDescription`"},{"kind":"text","text":" entry in the **Info.plist**."}],"blockTags":[{"tag":"@returns","content":[{"kind":"text","text":"A promise that resolves to an object of type [PermissionResponse](#permissionresponse)."}]}]},"type":{"type":"reference","typeArguments":[{"type":"reference","name":"PermissionResponse"}],"name":"Promise","qualifiedName":"Promise","package":"typescript"}}]},{"name":"requestPermissionsAsync","kind":2048,"flags":{"isStatic":true},"signatures":[{"name":"requestPermissionsAsync","kind":4096,"comment":{"summary":[{"kind":"text","text":"Asks the user to grant permissions for accessing camera.\nOn iOS this will require apps to specify both "},{"kind":"code","text":"`NSCameraUsageDescription`"},{"kind":"text","text":" and "},{"kind":"code","text":"`NSMicrophoneUsageDescription`"},{"kind":"text","text":" entries in the **Info.plist**."}],"blockTags":[{"tag":"@returns","content":[{"kind":"text","text":"A promise that resolves to an object of type [PermissionResponse](#permissionresponse)."}]},{"tag":"@deprecated","content":[{"kind":"text","text":"Use "},{"kind":"code","text":"`requestCameraPermissionsAsync`"},{"kind":"text","text":" or "},{"kind":"code","text":"`requestMicrophonePermissionsAsync`"},{"kind":"text","text":" instead."}]}]},"type":{"type":"reference","typeArguments":[{"type":"reference","name":"PermissionResponse"}],"name":"Promise","qualifiedName":"Promise","package":"typescript"}}]}],"extendedTypes":[{"type":"reference","typeArguments":[{"type":"reference","name":"CameraProps"}],"name":"Component","qualifiedName":"React.Component","package":"@types/react"}]},{"name":"PermissionResponse","kind":256,"comment":{"summary":[{"kind":"text","text":"An object obtained by permissions get and request functions."}]},"children":[{"name":"canAskAgain","kind":1024,"comment":{"summary":[{"kind":"text","text":"Indicates if user can be asked again for specific permission.\nIf not, one should be directed to the Settings app\nin order to enable/disable the permission."}]},"type":{"type":"intrinsic","name":"boolean"}},{"name":"expires","kind":1024,"comment":{"summary":[{"kind":"text","text":"Determines time when the permission expires."}]},"type":{"type":"reference","name":"PermissionExpiration"}},{"name":"granted","kind":1024,"comment":{"summary":[{"kind":"text","text":"A convenience boolean that indicates if the permission is granted."}]},"type":{"type":"intrinsic","name":"boolean"}},{"name":"status","kind":1024,"comment":{"summary":[{"kind":"text","text":"Determines the status of the permission."}]},"type":{"type":"reference","name":"PermissionStatus"}}]},{"name":"BarCodeBounds","kind":4194304,"type":{"type":"reflection","declaration":{"name":"__type","kind":65536,"children":[{"name":"origin","kind":1024,"comment":{"summary":[{"kind":"text","text":"The origin point of the bounding box."}]},"type":{"type":"reference","name":"BarCodePoint"}},{"name":"size","kind":1024,"comment":{"summary":[{"kind":"text","text":"The size of the bounding box."}]},"type":{"type":"reference","name":"BarCodeSize"}}]}}},{"name":"BarCodePoint","kind":4194304,"comment":{"summary":[{"kind":"text","text":"These coordinates are represented in the coordinate space of the camera source (e.g. when you\nare using the camera view, these values are adjusted to the dimensions of the view)."}]},"type":{"type":"reference","name":"Point"}},{"name":"BarCodeScanningResult","kind":4194304,"type":{"type":"reflection","declaration":{"name":"__type","kind":65536,"children":[{"name":"bounds","kind":1024,"comment":{"summary":[{"kind":"text","text":"The [BarCodeBounds](#barcodebounds) object.\n"},{"kind":"code","text":"`bounds`"},{"kind":"text","text":" in some case will be representing an empty rectangle.\nMoreover, "},{"kind":"code","text":"`bounds`"},{"kind":"text","text":" doesn't have to bound the whole barcode.\nFor some types, they will represent the area used by the scanner."}]},"type":{"type":"reference","name":"BarCodeBounds"}},{"name":"cornerPoints","kind":1024,"comment":{"summary":[{"kind":"text","text":"Corner points of the bounding box.\n"},{"kind":"code","text":"`cornerPoints`"},{"kind":"text","text":" is not always available and may be empty. On iOS, for "},{"kind":"code","text":"`code39`"},{"kind":"text","text":" and "},{"kind":"code","text":"`pdf417`"},{"kind":"text","text":"\nyou don't get this value."}]},"type":{"type":"array","elementType":{"type":"reference","name":"BarCodePoint"}}},{"name":"data","kind":1024,"comment":{"summary":[{"kind":"text","text":"The information encoded in the bar code."}]},"type":{"type":"intrinsic","name":"string"}},{"name":"type","kind":1024,"comment":{"summary":[{"kind":"text","text":"The barcode type."}]},"type":{"type":"intrinsic","name":"string"}}]}}},{"name":"BarCodeSettings","kind":4194304,"type":{"type":"reflection","declaration":{"name":"__type","kind":65536,"children":[{"name":"barCodeTypes","kind":1024,"type":{"type":"array","elementType":{"type":"intrinsic","name":"string"}}},{"name":"interval","kind":1024,"flags":{"isOptional":true},"type":{"type":"intrinsic","name":"number"}}]}}},{"name":"BarCodeSize","kind":4194304,"type":{"type":"reflection","declaration":{"name":"__type","kind":65536,"children":[{"name":"height","kind":1024,"comment":{"summary":[{"kind":"text","text":"The height value."}]},"type":{"type":"intrinsic","name":"number"}},{"name":"width","kind":1024,"comment":{"summary":[{"kind":"text","text":"The width value."}]},"type":{"type":"intrinsic","name":"number"}}]}}},{"name":"CameraCapturedPicture","kind":4194304,"type":{"type":"reflection","declaration":{"name":"__type","kind":65536,"children":[{"name":"base64","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"A Base64 representation of the image."}]},"type":{"type":"intrinsic","name":"string"}},{"name":"exif","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"On Android and iOS this object may include various fields based on the device and operating system.\nOn web, it is a partial representation of the ["},{"kind":"code","text":"`MediaTrackSettings`"},{"kind":"text","text":"](https://developer.mozilla.org/en-US/docs/Web/API/MediaTrackSettings) dictionary."}]},"type":{"type":"union","types":[{"type":"reference","typeArguments":[{"type":"reference","name":"MediaTrackSettings","qualifiedName":"MediaTrackSettings","package":"typescript"}],"name":"Partial","qualifiedName":"Partial","package":"typescript"},{"type":"intrinsic","name":"any"}]}},{"name":"height","kind":1024,"comment":{"summary":[{"kind":"text","text":"Captured image height."}]},"type":{"type":"intrinsic","name":"number"}},{"name":"uri","kind":1024,"comment":{"summary":[{"kind":"text","text":"On web, the value of "},{"kind":"code","text":"`uri`"},{"kind":"text","text":" is the same as "},{"kind":"code","text":"`base64`"},{"kind":"text","text":" because file system URLs are not supported in the browser."}]},"type":{"type":"intrinsic","name":"string"}},{"name":"width","kind":1024,"comment":{"summary":[{"kind":"text","text":"Captured image width."}]},"type":{"type":"intrinsic","name":"number"}}]}}},{"name":"CameraMountError","kind":4194304,"type":{"type":"reflection","declaration":{"name":"__type","kind":65536,"children":[{"name":"message","kind":1024,"type":{"type":"intrinsic","name":"string"}}]}}},{"name":"CameraPictureOptions","kind":4194304,"type":{"type":"reflection","declaration":{"name":"__type","kind":65536,"children":[{"name":"additionalExif","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"Additional EXIF data to be included for the image. Only useful when "},{"kind":"code","text":"`exif`"},{"kind":"text","text":" option is set to "},{"kind":"code","text":"`true`"},{"kind":"text","text":"."}],"blockTags":[{"tag":"@platform","content":[{"kind":"text","text":"android"}]},{"tag":"@platform","content":[{"kind":"text","text":"ios"}]}]},"type":{"type":"reflection","declaration":{"name":"__type","kind":65536,"indexSignature":{"name":"__index","kind":8192,"parameters":[{"name":"name","kind":32768,"type":{"type":"intrinsic","name":"string"}}],"type":{"type":"intrinsic","name":"any"}}}}},{"name":"base64","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"Whether to also include the image data in Base64 format."}]},"type":{"type":"intrinsic","name":"boolean"}},{"name":"exif","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"Whether to also include the EXIF data for the image."}]},"type":{"type":"intrinsic","name":"boolean"}},{"name":"imageType","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[],"blockTags":[{"tag":"@platform","content":[{"kind":"text","text":"web"}]}]},"type":{"type":"reference","name":"ImageType"}},{"name":"isImageMirror","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[],"blockTags":[{"tag":"@platform","content":[{"kind":"text","text":"web"}]}]},"type":{"type":"intrinsic","name":"boolean"}},{"name":"onPictureSaved","kind":1024,"flags":{"isOptional":true},"type":{"type":"reflection","declaration":{"name":"__type","kind":65536,"signatures":[{"name":"__type","kind":4096,"comment":{"summary":[{"kind":"text","text":"A callback invoked when picture is saved. If set, the promise of this method will resolve immediately with no data after picture is captured.\nThe data that it should contain will be passed to this callback. If displaying or processing a captured photo right after taking it\nis not your case, this callback lets you skip waiting for it to be saved."}]},"parameters":[{"name":"picture","kind":32768,"type":{"type":"reference","name":"CameraCapturedPicture"}}],"type":{"type":"intrinsic","name":"void"}}]}}},{"name":"quality","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"Specify the quality of compression, from 0 to 1. 0 means compress for small size, 1 means compress for maximum quality."}]},"type":{"type":"intrinsic","name":"number"}},{"name":"scale","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[],"blockTags":[{"tag":"@platform","content":[{"kind":"text","text":"web"}]}]},"type":{"type":"intrinsic","name":"number"}},{"name":"skipProcessing","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"If set to "},{"kind":"code","text":"`true`"},{"kind":"text","text":", camera skips orientation adjustment and returns an image straight from the device's camera.\nIf enabled, "},{"kind":"code","text":"`quality`"},{"kind":"text","text":" option is discarded (processing pipeline is skipped as a whole).\nAlthough enabling this option reduces image delivery time significantly, it may cause the image to appear in a wrong orientation\nin the "},{"kind":"code","text":"`Image`"},{"kind":"text","text":" component (at the time of writing, it does not respect EXIF orientation of the images).\n> **Note**: Enabling "},{"kind":"code","text":"`skipProcessing`"},{"kind":"text","text":" would cause orientation uncertainty. "},{"kind":"code","text":"`Image`"},{"kind":"text","text":" component does not respect EXIF\n> stored orientation information, that means obtained image would be displayed wrongly (rotated by 90°, 180° or 270°).\n> Different devices provide different orientations. For example some Sony Xperia or Samsung devices don't provide\n> correctly oriented images by default. To always obtain correctly oriented image disable "},{"kind":"code","text":"`skipProcessing`"},{"kind":"text","text":" option."}]},"type":{"type":"intrinsic","name":"boolean"}}]}}},{"name":"CameraProps","kind":4194304,"type":{"type":"intersection","types":[{"type":"reference","name":"ViewProps","qualifiedName":"ViewProps","package":"react-native"},{"type":"reflection","declaration":{"name":"__type","kind":65536,"children":[{"name":"autoFocus","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"State of camera auto focus. Use one of ["},{"kind":"code","text":"`AutoFocus.`"},{"kind":"text","text":"](#autofocus-1). When "},{"kind":"code","text":"`AutoFocus.on`"},{"kind":"text","text":",\nauto focus will be enabled, when "},{"kind":"code","text":"`AutoFocus.off`"},{"kind":"text","text":", it won't and focus will lock as it was in the moment of change,\nbut it can be adjusted on some devices via "},{"kind":"code","text":"`focusDepth`"},{"kind":"text","text":" prop."}],"blockTags":[{"tag":"@default","content":[{"kind":"text","text":"AutoFocus.on"}]}]},"type":{"type":"union","types":[{"type":"intrinsic","name":"boolean"},{"type":"intrinsic","name":"number"},{"type":"reference","name":"AutoFocus"}]}},{"name":"barCodeScannerSettings","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"Settings exposed by ["},{"kind":"code","text":"`BarCodeScanner`"},{"kind":"text","text":"](bar-code-scanner) module. Supported settings: **barCodeTypes**."}],"blockTags":[{"tag":"@example","content":[{"kind":"code","text":"```tsx\n \n```"}]}]},"type":{"type":"reference","name":"BarCodeSettings"}},{"name":"faceDetectorSettings","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"A settings object passed directly to an underlying module providing face detection features.\nSee ["},{"kind":"code","text":"`DetectionOptions`"},{"kind":"text","text":"](facedetector/#detectionoptions) in FaceDetector documentation for details."}]},"type":{"type":"intrinsic","name":"object"}},{"name":"flashMode","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"Camera flash mode. Use one of ["},{"kind":"code","text":"`FlashMode.`"},{"kind":"text","text":"](#flashmode-1). When "},{"kind":"code","text":"`FlashMode.on`"},{"kind":"text","text":", the flash on your device will\nturn on when taking a picture, when "},{"kind":"code","text":"`FlashMode.off`"},{"kind":"text","text":", it won't. Setting to "},{"kind":"code","text":"`FlashMode.auto`"},{"kind":"text","text":" will fire flash if required,\n"},{"kind":"code","text":"`FlashMode.torch`"},{"kind":"text","text":" turns on flash during the preview."}],"blockTags":[{"tag":"@default","content":[{"kind":"text","text":"FlashMode.off"}]}]},"type":{"type":"union","types":[{"type":"intrinsic","name":"number"},{"type":"reference","name":"FlashMode"}]}},{"name":"focusDepth","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"Distance to plane of the sharpest focus. A value between "},{"kind":"code","text":"`0`"},{"kind":"text","text":" and "},{"kind":"code","text":"`1`"},{"kind":"text","text":" where: "},{"kind":"code","text":"`0`"},{"kind":"text","text":" - infinity focus, "},{"kind":"code","text":"`1`"},{"kind":"text","text":" - focus as close as possible.\nFor Android this is available only for some devices and when "},{"kind":"code","text":"`useCamera2Api`"},{"kind":"text","text":" is set to "},{"kind":"code","text":"`true`"},{"kind":"text","text":"."}],"blockTags":[{"tag":"@default","content":[{"kind":"text","text":"0"}]}]},"type":{"type":"intrinsic","name":"number"}},{"name":"onBarCodeScanned","kind":1024,"flags":{"isOptional":true},"type":{"type":"reflection","declaration":{"name":"__type","kind":65536,"signatures":[{"name":"__type","kind":4096,"comment":{"summary":[{"kind":"text","text":"Callback that is invoked when a bar code has been successfully scanned. The callback is provided with\nan object of the ["},{"kind":"code","text":"`BarCodeScanningResult`"},{"kind":"text","text":"](#barcodescanningresult) shape, where the "},{"kind":"code","text":"`type`"},{"kind":"text","text":"\nrefers to the bar code type that was scanned and the "},{"kind":"code","text":"`data`"},{"kind":"text","text":" is the information encoded in the bar code\n(in this case of QR codes, this is often a URL). See ["},{"kind":"code","text":"`BarCodeScanner.Constants.BarCodeType`"},{"kind":"text","text":"](bar-code-scanner#supported-formats)\nfor supported values."}]},"parameters":[{"name":"scanningResult","kind":32768,"type":{"type":"reference","name":"BarCodeScanningResult"}}],"type":{"type":"intrinsic","name":"void"}}]}}},{"name":"onCameraReady","kind":1024,"flags":{"isOptional":true},"type":{"type":"reflection","declaration":{"name":"__type","kind":65536,"signatures":[{"name":"__type","kind":4096,"comment":{"summary":[{"kind":"text","text":"Callback invoked when camera preview has been set."}]},"type":{"type":"intrinsic","name":"void"}}]}}},{"name":"onFacesDetected","kind":1024,"flags":{"isOptional":true},"type":{"type":"reflection","declaration":{"name":"__type","kind":65536,"signatures":[{"name":"__type","kind":4096,"comment":{"summary":[{"kind":"text","text":"Callback invoked with results of face detection on the preview.\nSee ["},{"kind":"code","text":"`DetectionResult`"},{"kind":"text","text":"](facedetector/#detectionresult) in FaceDetector documentation for more details."}]},"parameters":[{"name":"faces","kind":32768,"type":{"type":"reference","name":"FaceDetectionResult"}}],"type":{"type":"intrinsic","name":"void"}}]}}},{"name":"onMountError","kind":1024,"flags":{"isOptional":true},"type":{"type":"reflection","declaration":{"name":"__type","kind":65536,"signatures":[{"name":"__type","kind":4096,"comment":{"summary":[{"kind":"text","text":"Callback invoked when camera preview could not been started."}]},"parameters":[{"name":"event","kind":32768,"comment":{"summary":[{"kind":"text","text":"Error object that contains a "},{"kind":"code","text":"`message`"},{"kind":"text","text":"."}]},"type":{"type":"reference","name":"CameraMountError"}}],"type":{"type":"intrinsic","name":"void"}}]}}},{"name":"pictureSize","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"A string representing the size of pictures ["},{"kind":"code","text":"`takePictureAsync`"},{"kind":"text","text":"](#takepictureasync) will take.\nAvailable sizes can be fetched with ["},{"kind":"code","text":"`getAvailablePictureSizesAsync`"},{"kind":"text","text":"](#getavailablepicturesizesasync)."}]},"type":{"type":"intrinsic","name":"string"}},{"name":"poster","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"A URL for an image to be shown while the camera is loading."}],"blockTags":[{"tag":"@platform","content":[{"kind":"text","text":"web"}]}]},"type":{"type":"intrinsic","name":"string"}},{"name":"ratio","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"A string representing aspect ratio of the preview, eg. "},{"kind":"code","text":"`4:3`"},{"kind":"text","text":", "},{"kind":"code","text":"`16:9`"},{"kind":"text","text":", "},{"kind":"code","text":"`1:1`"},{"kind":"text","text":". To check if a ratio is supported\nby the device use ["},{"kind":"code","text":"`getSupportedRatiosAsync`"},{"kind":"text","text":"](#getsupportedratiosasync)."}],"blockTags":[{"tag":"@default","content":[{"kind":"text","text":"4:3"}]},{"tag":"@platform","content":[{"kind":"text","text":"android"}]}]},"type":{"type":"intrinsic","name":"string"}},{"name":"type","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"Camera facing. Use one of "},{"kind":"code","text":"`CameraType`"},{"kind":"text","text":". When "},{"kind":"code","text":"`CameraType.front`"},{"kind":"text","text":", use the front-facing camera.\nWhen "},{"kind":"code","text":"`CameraType.back`"},{"kind":"text","text":", use the back-facing camera."}],"blockTags":[{"tag":"@default","content":[{"kind":"text","text":"CameraType.back"}]}]},"type":{"type":"union","types":[{"type":"intrinsic","name":"number"},{"type":"reference","name":"CameraType"}]}},{"name":"useCamera2Api","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"Whether to use Android's Camera2 API. See "},{"kind":"code","text":"`Note`"},{"kind":"text","text":" at the top of this page."}],"blockTags":[{"tag":"@platform","content":[{"kind":"text","text":"android"}]}]},"type":{"type":"intrinsic","name":"boolean"}},{"name":"videoStabilizationMode","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"The video stabilization mode used for a video recording. Use one of ["},{"kind":"code","text":"`VideoStabilization.`"},{"kind":"text","text":"](#videostabilization).\nYou can read more about each stabilization type in [Apple Documentation](https://developer.apple.com/documentation/avfoundation/avcapturevideostabilizationmode)."}],"blockTags":[{"tag":"@platform","content":[{"kind":"text","text":"ios"}]}]},"type":{"type":"reference","name":"VideoStabilization"}},{"name":"whiteBalance","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"Camera white balance. Use one of ["},{"kind":"code","text":"`WhiteBalance.`"},{"kind":"text","text":"](#whitebalance). If a device does not support any of these values previous one is used."}],"blockTags":[{"tag":"@default","content":[{"kind":"text","text":"WhiteBalance.auto"}]}]},"type":{"type":"union","types":[{"type":"intrinsic","name":"number"},{"type":"reference","name":"WhiteBalance"}]}},{"name":"zoom","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"A value between "},{"kind":"code","text":"`0`"},{"kind":"text","text":" and "},{"kind":"code","text":"`1`"},{"kind":"text","text":" being a percentage of device's max zoom. "},{"kind":"code","text":"`0`"},{"kind":"text","text":" - not zoomed, "},{"kind":"code","text":"`1`"},{"kind":"text","text":" - maximum zoom."}],"blockTags":[{"tag":"@default","content":[{"kind":"text","text":"0"}]}]},"type":{"type":"intrinsic","name":"number"}}]}}]}},{"name":"CameraRecordingOptions","kind":4194304,"type":{"type":"reflection","declaration":{"name":"__type","kind":65536,"children":[{"name":"codec","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"This option specifies what codec to use when recording the video. See ["},{"kind":"code","text":"`VideoCodec`"},{"kind":"text","text":"](#videocodec) for the possible values."}],"blockTags":[{"tag":"@platform","content":[{"kind":"text","text":"ios"}]}]},"type":{"type":"reference","name":"VideoCodec"}},{"name":"maxDuration","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"Maximum video duration in seconds."}]},"type":{"type":"intrinsic","name":"number"}},{"name":"maxFileSize","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"Maximum video file size in bytes."}]},"type":{"type":"intrinsic","name":"number"}},{"name":"mirror","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"If "},{"kind":"code","text":"`true`"},{"kind":"text","text":", the recorded video will be flipped along the vertical axis. iOS flips videos recorded with the front camera by default,\nbut you can reverse that back by setting this to "},{"kind":"code","text":"`true`"},{"kind":"text","text":". On Android, this is handled in the user's device settings."}],"blockTags":[{"tag":"@platform","content":[{"kind":"text","text":"ios"}]}]},"type":{"type":"intrinsic","name":"boolean"}},{"name":"mute","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"If present, video will be recorded with no sound."}]},"type":{"type":"intrinsic","name":"boolean"}},{"name":"quality","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"Specify the quality of recorded video. Use one of ["},{"kind":"code","text":"`VideoQuality.`"},{"kind":"text","text":"](#videoquality).\nPossible values: for 16:9 resolution "},{"kind":"code","text":"`2160p`"},{"kind":"text","text":", "},{"kind":"code","text":"`1080p`"},{"kind":"text","text":", "},{"kind":"code","text":"`720p`"},{"kind":"text","text":", "},{"kind":"code","text":"`480p`"},{"kind":"text","text":" : "},{"kind":"code","text":"`Android only`"},{"kind":"text","text":" and for 4:3 "},{"kind":"code","text":"`4:3`"},{"kind":"text","text":" (the size is 640x480).\nIf the chosen quality is not available for a device, the highest available is chosen."}]},"type":{"type":"union","types":[{"type":"intrinsic","name":"number"},{"type":"intrinsic","name":"string"}]}},{"name":"videoBitrate","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"Only works if "},{"kind":"code","text":"`useCamera2Api`"},{"kind":"text","text":" is set to "},{"kind":"code","text":"`true`"},{"kind":"text","text":". This option specifies a desired video bitrate. For example, "},{"kind":"code","text":"`5*1000*1000`"},{"kind":"text","text":" would be 5Mbps."}],"blockTags":[{"tag":"@platform","content":[{"kind":"text","text":"android"}]}]},"type":{"type":"intrinsic","name":"number"}}]}}},{"name":"FaceDetectionResult","kind":4194304,"type":{"type":"reflection","declaration":{"name":"__type","kind":65536,"children":[{"name":"faces","kind":1024,"comment":{"summary":[{"kind":"text","text":"Array of objects representing results of face detection.\nSee ["},{"kind":"code","text":"`FaceFeature`"},{"kind":"text","text":"](facedetector/#facefeature) in FaceDetector documentation for more details."}]},"type":{"type":"array","elementType":{"type":"intrinsic","name":"object"}}}]}}},{"name":"PermissionExpiration","kind":4194304,"comment":{"summary":[{"kind":"text","text":"Permission expiration time. Currently, all permissions are granted permanently."}]},"type":{"type":"union","types":[{"type":"literal","value":"never"},{"type":"intrinsic","name":"number"}]}},{"name":"PermissionHookOptions","kind":4194304,"typeParameters":[{"name":"Options","kind":131072,"type":{"type":"intrinsic","name":"object"}}],"type":{"type":"intersection","types":[{"type":"reference","name":"PermissionHookBehavior"},{"type":"reference","name":"Options"}]}},{"name":"Point","kind":4194304,"type":{"type":"reflection","declaration":{"name":"__type","kind":65536,"children":[{"name":"x","kind":1024,"type":{"type":"intrinsic","name":"number"}},{"name":"y","kind":1024,"type":{"type":"intrinsic","name":"number"}}]}}},{"name":"Constants","kind":32,"type":{"type":"reference","name":"ConstantsType"}},{"name":"getCameraPermissionsAsync","kind":64,"signatures":[{"name":"getCameraPermissionsAsync","kind":4096,"comment":{"summary":[{"kind":"text","text":"Checks user's permissions for accessing camera."}],"blockTags":[{"tag":"@returns","content":[{"kind":"text","text":"A promise that resolves to an object of type [PermissionResponse](#permissionresponse)."}]}]},"type":{"type":"reference","typeArguments":[{"type":"reference","name":"PermissionResponse"}],"name":"Promise","qualifiedName":"Promise","package":"typescript"}}]},{"name":"getMicrophonePermissionsAsync","kind":64,"signatures":[{"name":"getMicrophonePermissionsAsync","kind":4096,"comment":{"summary":[{"kind":"text","text":"Checks user's permissions for accessing microphone."}],"blockTags":[{"tag":"@returns","content":[{"kind":"text","text":"A promise that resolves to an object of type [PermissionResponse](#permissionresponse)."}]}]},"type":{"type":"reference","typeArguments":[{"type":"reference","name":"PermissionResponse"}],"name":"Promise","qualifiedName":"Promise","package":"typescript"}}]},{"name":"getPermissionsAsync","kind":64,"signatures":[{"name":"getPermissionsAsync","kind":4096,"comment":{"summary":[],"blockTags":[{"tag":"@deprecated","content":[{"kind":"text","text":"Use "},{"kind":"code","text":"`getCameraPermissionsAsync`"},{"kind":"text","text":" or "},{"kind":"code","text":"`getMicrophonePermissionsAsync`"},{"kind":"text","text":" instead.\nChecks user's permissions for accessing camera."}]}]},"type":{"type":"reference","typeArguments":[{"type":"reference","name":"PermissionResponse"}],"name":"Promise","qualifiedName":"Promise","package":"typescript"}}]},{"name":"requestCameraPermissionsAsync","kind":64,"signatures":[{"name":"requestCameraPermissionsAsync","kind":4096,"comment":{"summary":[{"kind":"text","text":"Asks the user to grant permissions for accessing camera.\nOn iOS this will require apps to specify an "},{"kind":"code","text":"`NSCameraUsageDescription`"},{"kind":"text","text":" entry in the **Info.plist**."}],"blockTags":[{"tag":"@returns","content":[{"kind":"text","text":"A promise that resolves to an object of type [PermissionResponse](#permissionresponse)."}]}]},"type":{"type":"reference","typeArguments":[{"type":"reference","name":"PermissionResponse"}],"name":"Promise","qualifiedName":"Promise","package":"typescript"}}]},{"name":"requestMicrophonePermissionsAsync","kind":64,"signatures":[{"name":"requestMicrophonePermissionsAsync","kind":4096,"comment":{"summary":[{"kind":"text","text":"Asks the user to grant permissions for accessing the microphone.\nOn iOS this will require apps to specify an "},{"kind":"code","text":"`NSMicrophoneUsageDescription`"},{"kind":"text","text":" entry in the **Info.plist**."}],"blockTags":[{"tag":"@returns","content":[{"kind":"text","text":"A promise that resolves to an object of type [PermissionResponse](#permissionresponse)."}]}]},"type":{"type":"reference","typeArguments":[{"type":"reference","name":"PermissionResponse"}],"name":"Promise","qualifiedName":"Promise","package":"typescript"}}]},{"name":"requestPermissionsAsync","kind":64,"signatures":[{"name":"requestPermissionsAsync","kind":4096,"comment":{"summary":[{"kind":"text","text":"Asks the user to grant permissions for accessing camera.\nOn iOS this will require apps to specify both "},{"kind":"code","text":"`NSCameraUsageDescription`"},{"kind":"text","text":" and "},{"kind":"code","text":"`NSMicrophoneUsageDescription`"},{"kind":"text","text":" entries in the **Info.plist**."}],"blockTags":[{"tag":"@returns","content":[{"kind":"text","text":"A promise that resolves to an object of type [PermissionResponse](#permissionresponse)."}]},{"tag":"@deprecated","content":[{"kind":"text","text":"Use "},{"kind":"code","text":"`requestCameraPermissionsAsync`"},{"kind":"text","text":" or "},{"kind":"code","text":"`requestMicrophonePermissionsAsync`"},{"kind":"text","text":" instead."}]}]},"type":{"type":"reference","typeArguments":[{"type":"reference","name":"PermissionResponse"}],"name":"Promise","qualifiedName":"Promise","package":"typescript"}}]}]}
\ No newline at end of file
+{"name":"expo-camera","kind":1,"children":[{"name":"AutoFocus","kind":8,"children":[{"name":"auto","kind":16,"comment":{"summary":[],"blockTags":[{"tag":"@platform","content":[{"kind":"text","text":"web"}]}]},"type":{"type":"literal","value":"auto"}},{"name":"off","kind":16,"type":{"type":"literal","value":"off"}},{"name":"on","kind":16,"type":{"type":"literal","value":"on"}},{"name":"singleShot","kind":16,"comment":{"summary":[],"blockTags":[{"tag":"@platform","content":[{"kind":"text","text":"web"}]}]},"type":{"type":"literal","value":"singleShot"}}]},{"name":"CameraOrientation","kind":8,"children":[{"name":"landscapeLeft","kind":16,"type":{"type":"literal","value":3}},{"name":"landscapeRight","kind":16,"type":{"type":"literal","value":4}},{"name":"portrait","kind":16,"type":{"type":"literal","value":1}},{"name":"portraitUpsideDown","kind":16,"type":{"type":"literal","value":2}}]},{"name":"CameraType","kind":8,"children":[{"name":"back","kind":16,"type":{"type":"literal","value":"back"}},{"name":"front","kind":16,"type":{"type":"literal","value":"front"}}]},{"name":"FlashMode","kind":8,"children":[{"name":"auto","kind":16,"type":{"type":"literal","value":"auto"}},{"name":"off","kind":16,"type":{"type":"literal","value":"off"}},{"name":"on","kind":16,"type":{"type":"literal","value":"on"}},{"name":"torch","kind":16,"type":{"type":"literal","value":"torch"}}]},{"name":"ImageType","kind":8,"children":[{"name":"jpg","kind":16,"type":{"type":"literal","value":"jpg"}},{"name":"png","kind":16,"type":{"type":"literal","value":"png"}}]},{"name":"PermissionStatus","kind":8,"children":[{"name":"DENIED","kind":16,"comment":{"summary":[{"kind":"text","text":"User has denied the permission."}]},"type":{"type":"literal","value":"denied"}},{"name":"GRANTED","kind":16,"comment":{"summary":[{"kind":"text","text":"User has granted the permission."}]},"type":{"type":"literal","value":"granted"}},{"name":"UNDETERMINED","kind":16,"comment":{"summary":[{"kind":"text","text":"User hasn't granted or denied the permission yet."}]},"type":{"type":"literal","value":"undetermined"}}]},{"name":"VideoCodec","kind":8,"comment":{"summary":[{"kind":"text","text":"This option specifies what codec to use when recording a video."}],"blockTags":[{"tag":"@platform","content":[{"kind":"text","text":"ios"}]}]},"children":[{"name":"AppleProRes422","kind":16,"type":{"type":"literal","value":"apcn"}},{"name":"AppleProRes4444","kind":16,"type":{"type":"literal","value":"ap4h"}},{"name":"H264","kind":16,"type":{"type":"literal","value":"avc1"}},{"name":"HEVC","kind":16,"type":{"type":"literal","value":"hvc1"}},{"name":"JPEG","kind":16,"type":{"type":"literal","value":"jpeg"}}]},{"name":"VideoQuality","kind":8,"children":[{"name":"1080p","kind":16,"type":{"type":"literal","value":"1080p"}},{"name":"2160p","kind":16,"type":{"type":"literal","value":"2160p"}},{"name":"480p","kind":16,"type":{"type":"literal","value":"480p"}},{"name":"4:3","kind":16,"type":{"type":"literal","value":"4:3"}},{"name":"720p","kind":16,"type":{"type":"literal","value":"720p"}}]},{"name":"VideoStabilization","kind":8,"comment":{"summary":[{"kind":"text","text":"This option specifies the stabilization mode to use when recording a video."}],"blockTags":[{"tag":"@platform","content":[{"kind":"text","text":"ios"}]}]},"children":[{"name":"auto","kind":16,"type":{"type":"literal","value":"auto"}},{"name":"cinematic","kind":16,"type":{"type":"literal","value":"cinematic"}},{"name":"off","kind":16,"type":{"type":"literal","value":"off"}},{"name":"standard","kind":16,"type":{"type":"literal","value":"standard"}}]},{"name":"WhiteBalance","kind":8,"children":[{"name":"auto","kind":16,"type":{"type":"literal","value":"auto"}},{"name":"cloudy","kind":16,"comment":{"summary":[],"blockTags":[{"tag":"@platform","content":[{"kind":"text","text":"android"}]},{"tag":"@platform","content":[{"kind":"text","text":"ios"}]}]},"type":{"type":"literal","value":"cloudy"}},{"name":"continuous","kind":16,"comment":{"summary":[],"blockTags":[{"tag":"@platform","content":[{"kind":"text","text":"web"}]}]},"type":{"type":"literal","value":"continuous"}},{"name":"fluorescent","kind":16,"comment":{"summary":[],"blockTags":[{"tag":"@platform","content":[{"kind":"text","text":"android"}]},{"tag":"@platform","content":[{"kind":"text","text":"ios"}]}]},"type":{"type":"literal","value":"fluorescent"}},{"name":"incandescent","kind":16,"comment":{"summary":[],"blockTags":[{"tag":"@platform","content":[{"kind":"text","text":"android"}]},{"tag":"@platform","content":[{"kind":"text","text":"ios"}]}]},"type":{"type":"literal","value":"incandescent"}},{"name":"manual","kind":16,"comment":{"summary":[],"blockTags":[{"tag":"@platform","content":[{"kind":"text","text":"web"}]}]},"type":{"type":"literal","value":"manual"}},{"name":"shadow","kind":16,"comment":{"summary":[],"blockTags":[{"tag":"@platform","content":[{"kind":"text","text":"android"}]},{"tag":"@platform","content":[{"kind":"text","text":"ios"}]}]},"type":{"type":"literal","value":"shadow"}},{"name":"sunny","kind":16,"comment":{"summary":[],"blockTags":[{"tag":"@platform","content":[{"kind":"text","text":"android"}]},{"tag":"@platform","content":[{"kind":"text","text":"ios"}]}]},"type":{"type":"literal","value":"sunny"}}]},{"name":"Camera","kind":128,"children":[{"name":"constructor","kind":512,"flags":{"isExternal":true},"signatures":[{"name":"new Camera","kind":16384,"flags":{"isExternal":true},"parameters":[{"name":"props","kind":32768,"flags":{"isExternal":true},"type":{"type":"union","types":[{"type":"reference","name":"CameraProps"},{"type":"reference","typeArguments":[{"type":"reference","name":"CameraProps"}],"name":"Readonly","qualifiedName":"Readonly","package":"typescript"}]}}],"type":{"type":"reference","name":"default"},"inheritedFrom":{"type":"reference","name":"React.Component.constructor"}},{"name":"new Camera","kind":16384,"flags":{"isExternal":true},"comment":{"summary":[],"blockTags":[{"tag":"@deprecated","content":[]},{"tag":"@see","content":[{"kind":"text","text":"https://reactjs.org/docs/legacy-context.html"}]}]},"parameters":[{"name":"props","kind":32768,"flags":{"isExternal":true},"type":{"type":"reference","name":"CameraProps"}},{"name":"context","kind":32768,"flags":{"isExternal":true},"type":{"type":"intrinsic","name":"any"}}],"type":{"type":"reference","name":"default"},"inheritedFrom":{"type":"reference","name":"React.Component.constructor"}}],"inheritedFrom":{"type":"reference","name":"React.Component.constructor"}},{"name":"_cameraHandle","kind":1024,"flags":{"isOptional":true},"type":{"type":"union","types":[{"type":"literal","value":null},{"type":"intrinsic","name":"number"}]}},{"name":"_cameraRef","kind":1024,"flags":{"isOptional":true},"type":{"type":"union","types":[{"type":"literal","value":null},{"type":"reference","typeArguments":[{"type":"reflection","declaration":{"name":"__type","kind":65536}},{"type":"reflection","declaration":{"name":"__type","kind":65536}},{"type":"intrinsic","name":"any"}],"name":"Component","qualifiedName":"React.Component","package":"@types/react"}]}},{"name":"_lastEvents","kind":1024,"type":{"type":"reflection","declaration":{"name":"__type","kind":65536,"indexSignature":{"name":"__index","kind":8192,"parameters":[{"name":"eventName","kind":32768,"type":{"type":"intrinsic","name":"string"}}],"type":{"type":"intrinsic","name":"string"}}}},"defaultValue":"{}"},{"name":"_lastEventsTimes","kind":1024,"type":{"type":"reflection","declaration":{"name":"__type","kind":65536,"indexSignature":{"name":"__index","kind":8192,"parameters":[{"name":"eventName","kind":32768,"type":{"type":"intrinsic","name":"string"}}],"type":{"type":"reference","name":"Date","qualifiedName":"Date","package":"typescript"}}}},"defaultValue":"{}"},{"name":"Constants","kind":1024,"flags":{"isStatic":true},"type":{"type":"reference","name":"ConstantsType"},"defaultValue":"..."},{"name":"ConversionTables","kind":1024,"flags":{"isStatic":true},"type":{"type":"reflection","declaration":{"name":"__type","kind":65536,"children":[{"name":"autoFocus","kind":1024,"type":{"type":"reference","typeArguments":[{"type":"union","types":[{"type":"literal","value":"on"},{"type":"literal","value":"off"},{"type":"literal","value":"auto"},{"type":"literal","value":"singleShot"}]},{"type":"union","types":[{"type":"intrinsic","name":"undefined"},{"type":"intrinsic","name":"string"},{"type":"intrinsic","name":"number"},{"type":"intrinsic","name":"boolean"}]}],"name":"Record","qualifiedName":"Record","package":"typescript"}},{"name":"flashMode","kind":1024,"type":{"type":"reference","typeArguments":[{"type":"union","types":[{"type":"literal","value":"on"},{"type":"literal","value":"off"},{"type":"literal","value":"auto"},{"type":"literal","value":"torch"}]},{"type":"union","types":[{"type":"intrinsic","name":"undefined"},{"type":"intrinsic","name":"string"},{"type":"intrinsic","name":"number"}]}],"name":"Record","qualifiedName":"Record","package":"typescript"}},{"name":"type","kind":1024,"type":{"type":"reference","typeArguments":[{"type":"union","types":[{"type":"literal","value":"front"},{"type":"literal","value":"back"}]},{"type":"union","types":[{"type":"intrinsic","name":"undefined"},{"type":"intrinsic","name":"string"},{"type":"intrinsic","name":"number"}]}],"name":"Record","qualifiedName":"Record","package":"typescript"}},{"name":"whiteBalance","kind":1024,"type":{"type":"reference","typeArguments":[{"type":"union","types":[{"type":"literal","value":"auto"},{"type":"literal","value":"sunny"},{"type":"literal","value":"cloudy"},{"type":"literal","value":"shadow"},{"type":"literal","value":"incandescent"},{"type":"literal","value":"fluorescent"},{"type":"literal","value":"continuous"},{"type":"literal","value":"manual"}]},{"type":"union","types":[{"type":"intrinsic","name":"undefined"},{"type":"intrinsic","name":"string"},{"type":"intrinsic","name":"number"}]}],"name":"Record","qualifiedName":"Record","package":"typescript"}}]}},"defaultValue":"ConversionTables"},{"name":"defaultProps","kind":1024,"flags":{"isStatic":true},"type":{"type":"reference","name":"CameraProps"},"defaultValue":"..."},{"name":"useCameraPermissions","kind":1024,"flags":{"isStatic":true},"type":{"type":"reflection","declaration":{"name":"__type","kind":65536,"signatures":[{"name":"__type","kind":4096,"comment":{"summary":[{"kind":"text","text":"Check or request permissions to access the camera.\nThis uses both "},{"kind":"code","text":"`requestCameraPermissionsAsync`"},{"kind":"text","text":" and "},{"kind":"code","text":"`getCameraPermissionsAsync`"},{"kind":"text","text":" to interact with the permissions."}],"blockTags":[{"tag":"@example","content":[{"kind":"code","text":"```ts\nconst [status, requestPermission] = Camera.useCameraPermissions();\n```"}]}]},"parameters":[{"name":"options","kind":32768,"flags":{"isOptional":true},"type":{"type":"reference","typeArguments":[{"type":"intrinsic","name":"object"}],"name":"PermissionHookOptions"}}],"type":{"type":"tuple","elements":[{"type":"union","types":[{"type":"literal","value":null},{"type":"reference","name":"PermissionResponse"}]},{"type":"reference","typeArguments":[{"type":"reference","name":"PermissionResponse"}],"name":"RequestPermissionMethod"},{"type":"reference","typeArguments":[{"type":"reference","name":"PermissionResponse"}],"name":"GetPermissionMethod"}]}}]}},"defaultValue":"..."},{"name":"useMicrophonePermissions","kind":1024,"flags":{"isStatic":true},"type":{"type":"reflection","declaration":{"name":"__type","kind":65536,"signatures":[{"name":"__type","kind":4096,"comment":{"summary":[{"kind":"text","text":"Check or request permissions to access the microphone.\nThis uses both "},{"kind":"code","text":"`requestMicrophonePermissionsAsync`"},{"kind":"text","text":" and "},{"kind":"code","text":"`getMicrophonePermissionsAsync`"},{"kind":"text","text":" to interact with the permissions."}],"blockTags":[{"tag":"@example","content":[{"kind":"code","text":"```ts\nconst [status, requestPermission] = Camera.useMicrophonePermissions();\n```"}]}]},"parameters":[{"name":"options","kind":32768,"flags":{"isOptional":true},"type":{"type":"reference","typeArguments":[{"type":"intrinsic","name":"object"}],"name":"PermissionHookOptions"}}],"type":{"type":"tuple","elements":[{"type":"union","types":[{"type":"literal","value":null},{"type":"reference","name":"PermissionResponse"}]},{"type":"reference","typeArguments":[{"type":"reference","name":"PermissionResponse"}],"name":"RequestPermissionMethod"},{"type":"reference","typeArguments":[{"type":"reference","name":"PermissionResponse"}],"name":"GetPermissionMethod"}]}}]}},"defaultValue":"..."},{"name":"_onCameraReady","kind":2048,"signatures":[{"name":"_onCameraReady","kind":4096,"type":{"type":"intrinsic","name":"void"}}]},{"name":"_onMountError","kind":2048,"signatures":[{"name":"_onMountError","kind":4096,"parameters":[{"name":"__namedParameters","kind":32768,"type":{"type":"reflection","declaration":{"name":"__type","kind":65536,"children":[{"name":"nativeEvent","kind":1024,"type":{"type":"reflection","declaration":{"name":"__type","kind":65536,"children":[{"name":"message","kind":1024,"type":{"type":"intrinsic","name":"string"}}]}}}]}}}],"type":{"type":"intrinsic","name":"void"}}]},{"name":"_onObjectDetected","kind":2048,"signatures":[{"name":"_onObjectDetected","kind":4096,"parameters":[{"name":"callback","kind":32768,"flags":{"isOptional":true},"type":{"type":"reference","name":"Function","qualifiedName":"Function","package":"typescript"}}],"type":{"type":"reflection","declaration":{"name":"__type","kind":65536,"signatures":[{"name":"__type","kind":4096,"parameters":[{"name":"__namedParameters","kind":32768,"type":{"type":"reflection","declaration":{"name":"__type","kind":65536,"children":[{"name":"nativeEvent","kind":1024,"type":{"type":"intrinsic","name":"any"}}]}}}],"type":{"type":"intrinsic","name":"void"}}]}}}]},{"name":"_onResponsiveOrientationChanged","kind":2048,"signatures":[{"name":"_onResponsiveOrientationChanged","kind":4096,"parameters":[{"name":"__namedParameters","kind":32768,"type":{"type":"reflection","declaration":{"name":"__type","kind":65536,"children":[{"name":"nativeEvent","kind":1024,"type":{"type":"reflection","declaration":{"name":"__type","kind":65536,"children":[{"name":"orientation","kind":1024,"type":{"type":"reference","name":"CameraOrientation"}}]}}}]}}}],"type":{"type":"intrinsic","name":"void"}}]},{"name":"_setReference","kind":2048,"signatures":[{"name":"_setReference","kind":4096,"parameters":[{"name":"ref","kind":32768,"flags":{"isOptional":true},"type":{"type":"reference","typeArguments":[{"type":"reflection","declaration":{"name":"__type","kind":65536}},{"type":"reflection","declaration":{"name":"__type","kind":65536}},{"type":"intrinsic","name":"any"}],"name":"Component","qualifiedName":"React.Component","package":"@types/react"}}],"type":{"type":"intrinsic","name":"void"}}]},{"name":"getAvailablePictureSizesAsync","kind":2048,"signatures":[{"name":"getAvailablePictureSizesAsync","kind":4096,"comment":{"summary":[{"kind":"text","text":"Get picture sizes that are supported by the device for given "},{"kind":"code","text":"`ratio`"},{"kind":"text","text":"."}],"blockTags":[{"tag":"@returns","content":[{"kind":"text","text":"Returns a Promise that resolves to an array of strings representing picture sizes that can be passed to "},{"kind":"code","text":"`pictureSize`"},{"kind":"text","text":" prop.\nThe list varies across Android devices but is the same for every iOS."}]}]},"parameters":[{"name":"ratio","kind":32768,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"A string representing aspect ratio of sizes to be returned."}]},"type":{"type":"intrinsic","name":"string"}}],"type":{"type":"reference","typeArguments":[{"type":"array","elementType":{"type":"intrinsic","name":"string"}}],"name":"Promise","qualifiedName":"Promise","package":"typescript"}}]},{"name":"getSupportedRatiosAsync","kind":2048,"signatures":[{"name":"getSupportedRatiosAsync","kind":4096,"comment":{"summary":[{"kind":"text","text":"Get aspect ratios that are supported by the device and can be passed via "},{"kind":"code","text":"`ratio`"},{"kind":"text","text":" prop."}],"blockTags":[{"tag":"@returns","content":[{"kind":"text","text":"Returns a Promise that resolves to an array of strings representing ratios, eg. "},{"kind":"code","text":"`['4:3', '1:1']`"},{"kind":"text","text":"."}]},{"tag":"@platform","content":[{"kind":"text","text":"android"}]}]},"type":{"type":"reference","typeArguments":[{"type":"array","elementType":{"type":"intrinsic","name":"string"}}],"name":"Promise","qualifiedName":"Promise","package":"typescript"}}]},{"name":"pausePreview","kind":2048,"signatures":[{"name":"pausePreview","kind":4096,"comment":{"summary":[{"kind":"text","text":"Pauses the camera preview. It is not recommended to use "},{"kind":"code","text":"`takePictureAsync`"},{"kind":"text","text":" when preview is paused."}]},"type":{"type":"intrinsic","name":"void"}}]},{"name":"recordAsync","kind":2048,"signatures":[{"name":"recordAsync","kind":4096,"comment":{"summary":[{"kind":"text","text":"Starts recording a video that will be saved to cache directory. Videos are rotated to match device's orientation.\nFlipping camera during a recording results in stopping it."}],"blockTags":[{"tag":"@returns","content":[{"kind":"text","text":"Returns a Promise that resolves to an object containing video file "},{"kind":"code","text":"`uri`"},{"kind":"text","text":" property and a "},{"kind":"code","text":"`codec`"},{"kind":"text","text":" property on iOS.\nThe Promise is returned if "},{"kind":"code","text":"`stopRecording`"},{"kind":"text","text":" was invoked, one of "},{"kind":"code","text":"`maxDuration`"},{"kind":"text","text":" and "},{"kind":"code","text":"`maxFileSize`"},{"kind":"text","text":" is reached or camera preview is stopped."}]},{"tag":"@platform","content":[{"kind":"text","text":"android"}]},{"tag":"@platform","content":[{"kind":"text","text":"ios"}]}]},"parameters":[{"name":"options","kind":32768,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"A map of "},{"kind":"code","text":"`CameraRecordingOptions`"},{"kind":"text","text":" type."}]},"type":{"type":"reference","name":"CameraRecordingOptions"}}],"type":{"type":"reference","typeArguments":[{"type":"reflection","declaration":{"name":"__type","kind":65536,"children":[{"name":"uri","kind":1024,"type":{"type":"intrinsic","name":"string"}}]}}],"name":"Promise","qualifiedName":"Promise","package":"typescript"}}]},{"name":"render","kind":2048,"signatures":[{"name":"render","kind":4096,"type":{"type":"reference","name":"Element","qualifiedName":"global.JSX.Element","package":"@types/react"},"overwrites":{"type":"reference","name":"React.Component.render"}}],"overwrites":{"type":"reference","name":"React.Component.render"}},{"name":"resumePreview","kind":2048,"signatures":[{"name":"resumePreview","kind":4096,"comment":{"summary":[{"kind":"text","text":"Resumes the camera preview."}]},"type":{"type":"intrinsic","name":"void"}}]},{"name":"stopRecording","kind":2048,"signatures":[{"name":"stopRecording","kind":4096,"comment":{"summary":[{"kind":"text","text":"Stops recording if any is in progress."}]},"type":{"type":"intrinsic","name":"void"}}]},{"name":"takePictureAsync","kind":2048,"signatures":[{"name":"takePictureAsync","kind":4096,"comment":{"summary":[{"kind":"text","text":"Takes a picture and saves it to app's cache directory. Photos are rotated to match device's orientation\n(if "},{"kind":"code","text":"`options.skipProcessing`"},{"kind":"text","text":" flag is not enabled) and scaled to match the preview. Anyway on Android it is essential\nto set ratio prop to get a picture with correct dimensions.\n> **Note**: Make sure to wait for the ["},{"kind":"code","text":"`onCameraReady`"},{"kind":"text","text":"](#oncameraready) callback before calling this method."}],"blockTags":[{"tag":"@returns","content":[{"kind":"text","text":"Returns a Promise that resolves to "},{"kind":"code","text":"`CameraCapturedPicture`"},{"kind":"text","text":" object, where "},{"kind":"code","text":"`uri`"},{"kind":"text","text":" is a URI to the local image file on iOS,\nAndroid, and a base64 string on web (usable as the source for an "},{"kind":"code","text":"`Image`"},{"kind":"text","text":" element). The "},{"kind":"code","text":"`width`"},{"kind":"text","text":" and "},{"kind":"code","text":"`height`"},{"kind":"text","text":" properties specify\nthe dimensions of the image. "},{"kind":"code","text":"`base64`"},{"kind":"text","text":" is included if the "},{"kind":"code","text":"`base64`"},{"kind":"text","text":" option was truthy, and is a string containing the JPEG data\nof the image in Base64--prepend that with "},{"kind":"code","text":"`'data:image/jpg;base64,'`"},{"kind":"text","text":" to get a data URI, which you can use as the source\nfor an "},{"kind":"code","text":"`Image`"},{"kind":"text","text":" element for example. "},{"kind":"code","text":"`exif`"},{"kind":"text","text":" is included if the "},{"kind":"code","text":"`exif`"},{"kind":"text","text":" option was truthy, and is an object containing EXIF\ndata for the image--the names of its properties are EXIF tags and their values are the values for those tags.\n\n> On native platforms, the local image URI is temporary. Use ["},{"kind":"code","text":"`FileSystem.copyAsync`"},{"kind":"text","text":"](filesystem.md#filesystemcopyasyncoptions)\n> to make a permanent copy of the image."}]}]},"parameters":[{"name":"options","kind":32768,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"An object in form of "},{"kind":"code","text":"`CameraPictureOptions`"},{"kind":"text","text":" type."}]},"type":{"type":"reference","name":"CameraPictureOptions"}}],"type":{"type":"reference","typeArguments":[{"type":"reference","name":"CameraCapturedPicture"}],"name":"Promise","qualifiedName":"Promise","package":"typescript"}}]},{"name":"getAvailableCameraTypesAsync","kind":2048,"flags":{"isStatic":true},"signatures":[{"name":"getAvailableCameraTypesAsync","kind":4096,"comment":{"summary":[{"kind":"text","text":"Returns a list of camera types "},{"kind":"code","text":"`['front', 'back']`"},{"kind":"text","text":". This is useful for desktop browsers which only have front-facing cameras."}],"blockTags":[{"tag":"@platform","content":[{"kind":"text","text":"web"}]}]},"type":{"type":"reference","typeArguments":[{"type":"array","elementType":{"type":"reference","name":"CameraType"}}],"name":"Promise","qualifiedName":"Promise","package":"typescript"}}]},{"name":"getAvailableVideoCodecsAsync","kind":2048,"flags":{"isStatic":true},"signatures":[{"name":"getAvailableVideoCodecsAsync","kind":4096,"comment":{"summary":[{"kind":"text","text":"Queries the device for the available video codecs that can be used in video recording."}],"blockTags":[{"tag":"@returns","content":[{"kind":"text","text":"A promise that resolves to a list of strings that represents available codecs."}]},{"tag":"@platform","content":[{"kind":"text","text":"ios"}]}]},"type":{"type":"reference","typeArguments":[{"type":"array","elementType":{"type":"reference","name":"VideoCodec"}}],"name":"Promise","qualifiedName":"Promise","package":"typescript"}}]},{"name":"getCameraPermissionsAsync","kind":2048,"flags":{"isStatic":true},"signatures":[{"name":"getCameraPermissionsAsync","kind":4096,"comment":{"summary":[{"kind":"text","text":"Checks user's permissions for accessing camera."}],"blockTags":[{"tag":"@returns","content":[{"kind":"text","text":"A promise that resolves to an object of type [PermissionResponse](#permissionresponse)."}]}]},"type":{"type":"reference","typeArguments":[{"type":"reference","name":"PermissionResponse"}],"name":"Promise","qualifiedName":"Promise","package":"typescript"}}]},{"name":"getMicrophonePermissionsAsync","kind":2048,"flags":{"isStatic":true},"signatures":[{"name":"getMicrophonePermissionsAsync","kind":4096,"comment":{"summary":[{"kind":"text","text":"Checks user's permissions for accessing microphone."}],"blockTags":[{"tag":"@returns","content":[{"kind":"text","text":"A promise that resolves to an object of type [PermissionResponse](#permissionresponse)."}]}]},"type":{"type":"reference","typeArguments":[{"type":"reference","name":"PermissionResponse"}],"name":"Promise","qualifiedName":"Promise","package":"typescript"}}]},{"name":"getPermissionsAsync","kind":2048,"flags":{"isStatic":true},"signatures":[{"name":"getPermissionsAsync","kind":4096,"comment":{"summary":[],"blockTags":[{"tag":"@deprecated","content":[{"kind":"text","text":"Use "},{"kind":"code","text":"`getCameraPermissionsAsync`"},{"kind":"text","text":" or "},{"kind":"code","text":"`getMicrophonePermissionsAsync`"},{"kind":"text","text":" instead.\nChecks user's permissions for accessing camera."}]}]},"type":{"type":"reference","typeArguments":[{"type":"reference","name":"PermissionResponse"}],"name":"Promise","qualifiedName":"Promise","package":"typescript"}}]},{"name":"isAvailableAsync","kind":2048,"flags":{"isStatic":true},"signatures":[{"name":"isAvailableAsync","kind":4096,"comment":{"summary":[{"kind":"text","text":"Check whether the current device has a camera. This is useful for web and simulators cases.\nThis isn't influenced by the Permissions API (all platforms), or HTTP usage (in the browser).\nYou will still need to check if the native permission has been accepted."}],"blockTags":[{"tag":"@platform","content":[{"kind":"text","text":"web"}]}]},"type":{"type":"reference","typeArguments":[{"type":"intrinsic","name":"boolean"}],"name":"Promise","qualifiedName":"Promise","package":"typescript"}}]},{"name":"requestCameraPermissionsAsync","kind":2048,"flags":{"isStatic":true},"signatures":[{"name":"requestCameraPermissionsAsync","kind":4096,"comment":{"summary":[{"kind":"text","text":"Asks the user to grant permissions for accessing camera.\nOn iOS this will require apps to specify an "},{"kind":"code","text":"`NSCameraUsageDescription`"},{"kind":"text","text":" entry in the **Info.plist**."}],"blockTags":[{"tag":"@returns","content":[{"kind":"text","text":"A promise that resolves to an object of type [PermissionResponse](#permissionresponse)."}]}]},"type":{"type":"reference","typeArguments":[{"type":"reference","name":"PermissionResponse"}],"name":"Promise","qualifiedName":"Promise","package":"typescript"}}]},{"name":"requestMicrophonePermissionsAsync","kind":2048,"flags":{"isStatic":true},"signatures":[{"name":"requestMicrophonePermissionsAsync","kind":4096,"comment":{"summary":[{"kind":"text","text":"Asks the user to grant permissions for accessing the microphone.\nOn iOS this will require apps to specify an "},{"kind":"code","text":"`NSMicrophoneUsageDescription`"},{"kind":"text","text":" entry in the **Info.plist**."}],"blockTags":[{"tag":"@returns","content":[{"kind":"text","text":"A promise that resolves to an object of type [PermissionResponse](#permissionresponse)."}]}]},"type":{"type":"reference","typeArguments":[{"type":"reference","name":"PermissionResponse"}],"name":"Promise","qualifiedName":"Promise","package":"typescript"}}]},{"name":"requestPermissionsAsync","kind":2048,"flags":{"isStatic":true},"signatures":[{"name":"requestPermissionsAsync","kind":4096,"comment":{"summary":[{"kind":"text","text":"Asks the user to grant permissions for accessing camera.\nOn iOS this will require apps to specify both "},{"kind":"code","text":"`NSCameraUsageDescription`"},{"kind":"text","text":" and "},{"kind":"code","text":"`NSMicrophoneUsageDescription`"},{"kind":"text","text":" entries in the **Info.plist**."}],"blockTags":[{"tag":"@returns","content":[{"kind":"text","text":"A promise that resolves to an object of type [PermissionResponse](#permissionresponse)."}]},{"tag":"@deprecated","content":[{"kind":"text","text":"Use "},{"kind":"code","text":"`requestCameraPermissionsAsync`"},{"kind":"text","text":" or "},{"kind":"code","text":"`requestMicrophonePermissionsAsync`"},{"kind":"text","text":" instead."}]}]},"type":{"type":"reference","typeArguments":[{"type":"reference","name":"PermissionResponse"}],"name":"Promise","qualifiedName":"Promise","package":"typescript"}}]}],"extendedTypes":[{"type":"reference","typeArguments":[{"type":"reference","name":"CameraProps"}],"name":"Component","qualifiedName":"React.Component","package":"@types/react"}]},{"name":"PermissionResponse","kind":256,"comment":{"summary":[{"kind":"text","text":"An object obtained by permissions get and request functions."}]},"children":[{"name":"canAskAgain","kind":1024,"comment":{"summary":[{"kind":"text","text":"Indicates if user can be asked again for specific permission.\nIf not, one should be directed to the Settings app\nin order to enable/disable the permission."}]},"type":{"type":"intrinsic","name":"boolean"}},{"name":"expires","kind":1024,"comment":{"summary":[{"kind":"text","text":"Determines time when the permission expires."}]},"type":{"type":"reference","name":"PermissionExpiration"}},{"name":"granted","kind":1024,"comment":{"summary":[{"kind":"text","text":"A convenience boolean that indicates if the permission is granted."}]},"type":{"type":"intrinsic","name":"boolean"}},{"name":"status","kind":1024,"comment":{"summary":[{"kind":"text","text":"Determines the status of the permission."}]},"type":{"type":"reference","name":"PermissionStatus"}}]},{"name":"BarCodeBounds","kind":4194304,"type":{"type":"reflection","declaration":{"name":"__type","kind":65536,"children":[{"name":"origin","kind":1024,"comment":{"summary":[{"kind":"text","text":"The origin point of the bounding box."}]},"type":{"type":"reference","name":"BarCodePoint"}},{"name":"size","kind":1024,"comment":{"summary":[{"kind":"text","text":"The size of the bounding box."}]},"type":{"type":"reference","name":"BarCodeSize"}}]}}},{"name":"BarCodePoint","kind":4194304,"comment":{"summary":[{"kind":"text","text":"These coordinates are represented in the coordinate space of the camera source (e.g. when you\nare using the camera view, these values are adjusted to the dimensions of the view)."}]},"type":{"type":"reference","name":"Point"}},{"name":"BarCodeScanningResult","kind":4194304,"type":{"type":"reflection","declaration":{"name":"__type","kind":65536,"children":[{"name":"bounds","kind":1024,"comment":{"summary":[{"kind":"text","text":"The [BarCodeBounds](#barcodebounds) object.\n"},{"kind":"code","text":"`bounds`"},{"kind":"text","text":" in some case will be representing an empty rectangle.\nMoreover, "},{"kind":"code","text":"`bounds`"},{"kind":"text","text":" doesn't have to bound the whole barcode.\nFor some types, they will represent the area used by the scanner."}]},"type":{"type":"reference","name":"BarCodeBounds"}},{"name":"cornerPoints","kind":1024,"comment":{"summary":[{"kind":"text","text":"Corner points of the bounding box.\n"},{"kind":"code","text":"`cornerPoints`"},{"kind":"text","text":" is not always available and may be empty. On iOS, for "},{"kind":"code","text":"`code39`"},{"kind":"text","text":" and "},{"kind":"code","text":"`pdf417`"},{"kind":"text","text":"\nyou don't get this value."}]},"type":{"type":"array","elementType":{"type":"reference","name":"BarCodePoint"}}},{"name":"data","kind":1024,"comment":{"summary":[{"kind":"text","text":"The information encoded in the bar code."}]},"type":{"type":"intrinsic","name":"string"}},{"name":"type","kind":1024,"comment":{"summary":[{"kind":"text","text":"The barcode type."}]},"type":{"type":"intrinsic","name":"string"}}]}}},{"name":"BarCodeSettings","kind":4194304,"type":{"type":"reflection","declaration":{"name":"__type","kind":65536,"children":[{"name":"barCodeTypes","kind":1024,"type":{"type":"array","elementType":{"type":"intrinsic","name":"string"}}},{"name":"interval","kind":1024,"flags":{"isOptional":true},"type":{"type":"intrinsic","name":"number"}}]}}},{"name":"BarCodeSize","kind":4194304,"type":{"type":"reflection","declaration":{"name":"__type","kind":65536,"children":[{"name":"height","kind":1024,"comment":{"summary":[{"kind":"text","text":"The height value."}]},"type":{"type":"intrinsic","name":"number"}},{"name":"width","kind":1024,"comment":{"summary":[{"kind":"text","text":"The width value."}]},"type":{"type":"intrinsic","name":"number"}}]}}},{"name":"CameraCapturedPicture","kind":4194304,"type":{"type":"reflection","declaration":{"name":"__type","kind":65536,"children":[{"name":"base64","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"A Base64 representation of the image."}]},"type":{"type":"intrinsic","name":"string"}},{"name":"exif","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"On Android and iOS this object may include various fields based on the device and operating system.\nOn web, it is a partial representation of the ["},{"kind":"code","text":"`MediaTrackSettings`"},{"kind":"text","text":"](https://developer.mozilla.org/en-US/docs/Web/API/MediaTrackSettings) dictionary."}]},"type":{"type":"union","types":[{"type":"reference","typeArguments":[{"type":"reference","name":"MediaTrackSettings","qualifiedName":"MediaTrackSettings","package":"typescript"}],"name":"Partial","qualifiedName":"Partial","package":"typescript"},{"type":"intrinsic","name":"any"}]}},{"name":"height","kind":1024,"comment":{"summary":[{"kind":"text","text":"Captured image height."}]},"type":{"type":"intrinsic","name":"number"}},{"name":"uri","kind":1024,"comment":{"summary":[{"kind":"text","text":"On web, the value of "},{"kind":"code","text":"`uri`"},{"kind":"text","text":" is the same as "},{"kind":"code","text":"`base64`"},{"kind":"text","text":" because file system URLs are not supported in the browser."}]},"type":{"type":"intrinsic","name":"string"}},{"name":"width","kind":1024,"comment":{"summary":[{"kind":"text","text":"Captured image width."}]},"type":{"type":"intrinsic","name":"number"}}]}}},{"name":"CameraMountError","kind":4194304,"type":{"type":"reflection","declaration":{"name":"__type","kind":65536,"children":[{"name":"message","kind":1024,"type":{"type":"intrinsic","name":"string"}}]}}},{"name":"CameraPictureOptions","kind":4194304,"type":{"type":"reflection","declaration":{"name":"__type","kind":65536,"children":[{"name":"additionalExif","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"Additional EXIF data to be included for the image. Only useful when "},{"kind":"code","text":"`exif`"},{"kind":"text","text":" option is set to "},{"kind":"code","text":"`true`"},{"kind":"text","text":"."}],"blockTags":[{"tag":"@platform","content":[{"kind":"text","text":"android"}]},{"tag":"@platform","content":[{"kind":"text","text":"ios"}]}]},"type":{"type":"reflection","declaration":{"name":"__type","kind":65536,"indexSignature":{"name":"__index","kind":8192,"parameters":[{"name":"name","kind":32768,"type":{"type":"intrinsic","name":"string"}}],"type":{"type":"intrinsic","name":"any"}}}}},{"name":"base64","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"Whether to also include the image data in Base64 format."}]},"type":{"type":"intrinsic","name":"boolean"}},{"name":"exif","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"Whether to also include the EXIF data for the image."}]},"type":{"type":"intrinsic","name":"boolean"}},{"name":"imageType","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[],"blockTags":[{"tag":"@platform","content":[{"kind":"text","text":"web"}]}]},"type":{"type":"reference","name":"ImageType"}},{"name":"isImageMirror","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[],"blockTags":[{"tag":"@platform","content":[{"kind":"text","text":"web"}]}]},"type":{"type":"intrinsic","name":"boolean"}},{"name":"onPictureSaved","kind":1024,"flags":{"isOptional":true},"type":{"type":"reflection","declaration":{"name":"__type","kind":65536,"signatures":[{"name":"__type","kind":4096,"comment":{"summary":[{"kind":"text","text":"A callback invoked when picture is saved. If set, the promise of this method will resolve immediately with no data after picture is captured.\nThe data that it should contain will be passed to this callback. If displaying or processing a captured photo right after taking it\nis not your case, this callback lets you skip waiting for it to be saved."}]},"parameters":[{"name":"picture","kind":32768,"type":{"type":"reference","name":"CameraCapturedPicture"}}],"type":{"type":"intrinsic","name":"void"}}]}}},{"name":"quality","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"Specify the quality of compression, from 0 to 1. 0 means compress for small size, 1 means compress for maximum quality."}]},"type":{"type":"intrinsic","name":"number"}},{"name":"scale","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[],"blockTags":[{"tag":"@platform","content":[{"kind":"text","text":"web"}]}]},"type":{"type":"intrinsic","name":"number"}},{"name":"skipProcessing","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"If set to "},{"kind":"code","text":"`true`"},{"kind":"text","text":", camera skips orientation adjustment and returns an image straight from the device's camera.\nIf enabled, "},{"kind":"code","text":"`quality`"},{"kind":"text","text":" option is discarded (processing pipeline is skipped as a whole).\nAlthough enabling this option reduces image delivery time significantly, it may cause the image to appear in a wrong orientation\nin the "},{"kind":"code","text":"`Image`"},{"kind":"text","text":" component (at the time of writing, it does not respect EXIF orientation of the images).\n> **Note**: Enabling "},{"kind":"code","text":"`skipProcessing`"},{"kind":"text","text":" would cause orientation uncertainty. "},{"kind":"code","text":"`Image`"},{"kind":"text","text":" component does not respect EXIF\n> stored orientation information, that means obtained image would be displayed wrongly (rotated by 90°, 180° or 270°).\n> Different devices provide different orientations. For example some Sony Xperia or Samsung devices don't provide\n> correctly oriented images by default. To always obtain correctly oriented image disable "},{"kind":"code","text":"`skipProcessing`"},{"kind":"text","text":" option."}]},"type":{"type":"intrinsic","name":"boolean"}}]}}},{"name":"CameraProps","kind":4194304,"type":{"type":"intersection","types":[{"type":"reference","name":"ViewProps","qualifiedName":"ViewProps","package":"react-native"},{"type":"reflection","declaration":{"name":"__type","kind":65536,"children":[{"name":"autoFocus","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"State of camera auto focus. Use one of ["},{"kind":"code","text":"`AutoFocus.`"},{"kind":"text","text":"](#autofocus-1). When "},{"kind":"code","text":"`AutoFocus.on`"},{"kind":"text","text":",\nauto focus will be enabled, when "},{"kind":"code","text":"`AutoFocus.off`"},{"kind":"text","text":", it won't and focus will lock as it was in the moment of change,\nbut it can be adjusted on some devices via "},{"kind":"code","text":"`focusDepth`"},{"kind":"text","text":" prop."}],"blockTags":[{"tag":"@default","content":[{"kind":"text","text":"AutoFocus.on"}]}]},"type":{"type":"union","types":[{"type":"intrinsic","name":"boolean"},{"type":"intrinsic","name":"number"},{"type":"reference","name":"AutoFocus"}]}},{"name":"barCodeScannerSettings","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"Settings exposed by ["},{"kind":"code","text":"`BarCodeScanner`"},{"kind":"text","text":"](bar-code-scanner) module. Supported settings: **barCodeTypes**."}],"blockTags":[{"tag":"@example","content":[{"kind":"code","text":"```tsx\n \n```"}]}]},"type":{"type":"reference","name":"BarCodeSettings"}},{"name":"faceDetectorSettings","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"A settings object passed directly to an underlying module providing face detection features.\nSee ["},{"kind":"code","text":"`DetectionOptions`"},{"kind":"text","text":"](facedetector/#detectionoptions) in FaceDetector documentation for details."}]},"type":{"type":"intrinsic","name":"object"}},{"name":"flashMode","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"Camera flash mode. Use one of ["},{"kind":"code","text":"`FlashMode.`"},{"kind":"text","text":"](#flashmode-1). When "},{"kind":"code","text":"`FlashMode.on`"},{"kind":"text","text":", the flash on your device will\nturn on when taking a picture, when "},{"kind":"code","text":"`FlashMode.off`"},{"kind":"text","text":", it won't. Setting to "},{"kind":"code","text":"`FlashMode.auto`"},{"kind":"text","text":" will fire flash if required,\n"},{"kind":"code","text":"`FlashMode.torch`"},{"kind":"text","text":" turns on flash during the preview."}],"blockTags":[{"tag":"@default","content":[{"kind":"text","text":"FlashMode.off"}]}]},"type":{"type":"union","types":[{"type":"intrinsic","name":"number"},{"type":"reference","name":"FlashMode"}]}},{"name":"focusDepth","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"Distance to plane of the sharpest focus. A value between "},{"kind":"code","text":"`0`"},{"kind":"text","text":" and "},{"kind":"code","text":"`1`"},{"kind":"text","text":" where: "},{"kind":"code","text":"`0`"},{"kind":"text","text":" - infinity focus, "},{"kind":"code","text":"`1`"},{"kind":"text","text":" - focus as close as possible.\nFor Android this is available only for some devices and when "},{"kind":"code","text":"`useCamera2Api`"},{"kind":"text","text":" is set to "},{"kind":"code","text":"`true`"},{"kind":"text","text":"."}],"blockTags":[{"tag":"@default","content":[{"kind":"text","text":"0"}]}]},"type":{"type":"intrinsic","name":"number"}},{"name":"onBarCodeScanned","kind":1024,"flags":{"isOptional":true},"type":{"type":"reflection","declaration":{"name":"__type","kind":65536,"signatures":[{"name":"__type","kind":4096,"comment":{"summary":[{"kind":"text","text":"Callback that is invoked when a bar code has been successfully scanned. The callback is provided with\nan object of the ["},{"kind":"code","text":"`BarCodeScanningResult`"},{"kind":"text","text":"](#barcodescanningresult) shape, where the "},{"kind":"code","text":"`type`"},{"kind":"text","text":"\nrefers to the bar code type that was scanned and the "},{"kind":"code","text":"`data`"},{"kind":"text","text":" is the information encoded in the bar code\n(in this case of QR codes, this is often a URL). See ["},{"kind":"code","text":"`BarCodeScanner.Constants.BarCodeType`"},{"kind":"text","text":"](bar-code-scanner#supported-formats)\nfor supported values."}]},"parameters":[{"name":"scanningResult","kind":32768,"type":{"type":"reference","name":"BarCodeScanningResult"}}],"type":{"type":"intrinsic","name":"void"}}]}}},{"name":"onCameraReady","kind":1024,"flags":{"isOptional":true},"type":{"type":"reflection","declaration":{"name":"__type","kind":65536,"signatures":[{"name":"__type","kind":4096,"comment":{"summary":[{"kind":"text","text":"Callback invoked when camera preview has been set."}]},"type":{"type":"intrinsic","name":"void"}}]}}},{"name":"onFacesDetected","kind":1024,"flags":{"isOptional":true},"type":{"type":"reflection","declaration":{"name":"__type","kind":65536,"signatures":[{"name":"__type","kind":4096,"comment":{"summary":[{"kind":"text","text":"Callback invoked with results of face detection on the preview.\nSee ["},{"kind":"code","text":"`DetectionResult`"},{"kind":"text","text":"](facedetector/#detectionresult) in FaceDetector documentation for more details."}]},"parameters":[{"name":"faces","kind":32768,"type":{"type":"reference","name":"FaceDetectionResult"}}],"type":{"type":"intrinsic","name":"void"}}]}}},{"name":"onMountError","kind":1024,"flags":{"isOptional":true},"type":{"type":"reflection","declaration":{"name":"__type","kind":65536,"signatures":[{"name":"__type","kind":4096,"comment":{"summary":[{"kind":"text","text":"Callback invoked when camera preview could not been started."}]},"parameters":[{"name":"event","kind":32768,"comment":{"summary":[{"kind":"text","text":"Error object that contains a "},{"kind":"code","text":"`message`"},{"kind":"text","text":"."}]},"type":{"type":"reference","name":"CameraMountError"}}],"type":{"type":"intrinsic","name":"void"}}]}}},{"name":"onResponsiveOrientationChanged","kind":1024,"flags":{"isOptional":true},"type":{"type":"reflection","declaration":{"name":"__type","kind":65536,"signatures":[{"name":"__type","kind":4096,"comment":{"summary":[{"kind":"text","text":"Callback invoked when responsive orientation changes. Only applicable if "},{"kind":"code","text":"`responsiveOrientationWhenOrientationLocked`"},{"kind":"text","text":" is "},{"kind":"code","text":"`true`"}],"blockTags":[{"tag":"@platform","content":[{"kind":"text","text":"ios"}]}]},"parameters":[{"name":"event","kind":32768,"comment":{"summary":[{"kind":"text","text":"result object that contains updated orientation of camera"}]},"type":{"type":"reference","name":"ResponsiveOrientationChanged"}}],"type":{"type":"intrinsic","name":"void"}}]}}},{"name":"pictureSize","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"A string representing the size of pictures ["},{"kind":"code","text":"`takePictureAsync`"},{"kind":"text","text":"](#takepictureasync) will take.\nAvailable sizes can be fetched with ["},{"kind":"code","text":"`getAvailablePictureSizesAsync`"},{"kind":"text","text":"](#getavailablepicturesizesasync)."}]},"type":{"type":"intrinsic","name":"string"}},{"name":"poster","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"A URL for an image to be shown while the camera is loading."}],"blockTags":[{"tag":"@platform","content":[{"kind":"text","text":"web"}]}]},"type":{"type":"intrinsic","name":"string"}},{"name":"ratio","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"A string representing aspect ratio of the preview, eg. "},{"kind":"code","text":"`4:3`"},{"kind":"text","text":", "},{"kind":"code","text":"`16:9`"},{"kind":"text","text":", "},{"kind":"code","text":"`1:1`"},{"kind":"text","text":". To check if a ratio is supported\nby the device use ["},{"kind":"code","text":"`getSupportedRatiosAsync`"},{"kind":"text","text":"](#getsupportedratiosasync)."}],"blockTags":[{"tag":"@default","content":[{"kind":"text","text":"4:3"}]},{"tag":"@platform","content":[{"kind":"text","text":"android"}]}]},"type":{"type":"intrinsic","name":"string"}},{"name":"responsiveOrientationWhenOrientationLocked","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"Whether to allow responsive orientation of the camera when the screen orientation is locked (i.e. when set to "},{"kind":"code","text":"`true`"},{"kind":"text","text":"\nlandscape photos will be taken if the device is turned that way, even if the app or device orientation is locked to portrait)"}],"blockTags":[{"tag":"@platform","content":[{"kind":"text","text":"ios"}]}]},"type":{"type":"intrinsic","name":"boolean"}},{"name":"type","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"Camera facing. Use one of "},{"kind":"code","text":"`CameraType`"},{"kind":"text","text":". When "},{"kind":"code","text":"`CameraType.front`"},{"kind":"text","text":", use the front-facing camera.\nWhen "},{"kind":"code","text":"`CameraType.back`"},{"kind":"text","text":", use the back-facing camera."}],"blockTags":[{"tag":"@default","content":[{"kind":"text","text":"CameraType.back"}]}]},"type":{"type":"union","types":[{"type":"intrinsic","name":"number"},{"type":"reference","name":"CameraType"}]}},{"name":"useCamera2Api","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"Whether to use Android's Camera2 API. See "},{"kind":"code","text":"`Note`"},{"kind":"text","text":" at the top of this page."}],"blockTags":[{"tag":"@platform","content":[{"kind":"text","text":"android"}]}]},"type":{"type":"intrinsic","name":"boolean"}},{"name":"videoStabilizationMode","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"The video stabilization mode used for a video recording. Use one of ["},{"kind":"code","text":"`VideoStabilization.`"},{"kind":"text","text":"](#videostabilization).\nYou can read more about each stabilization type in [Apple Documentation](https://developer.apple.com/documentation/avfoundation/avcapturevideostabilizationmode)."}],"blockTags":[{"tag":"@platform","content":[{"kind":"text","text":"ios"}]}]},"type":{"type":"reference","name":"VideoStabilization"}},{"name":"whiteBalance","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"Camera white balance. Use one of ["},{"kind":"code","text":"`WhiteBalance.`"},{"kind":"text","text":"](#whitebalance). If a device does not support any of these values previous one is used."}],"blockTags":[{"tag":"@default","content":[{"kind":"text","text":"WhiteBalance.auto"}]}]},"type":{"type":"union","types":[{"type":"intrinsic","name":"number"},{"type":"reference","name":"WhiteBalance"}]}},{"name":"zoom","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"A value between "},{"kind":"code","text":"`0`"},{"kind":"text","text":" and "},{"kind":"code","text":"`1`"},{"kind":"text","text":" being a percentage of device's max zoom. "},{"kind":"code","text":"`0`"},{"kind":"text","text":" - not zoomed, "},{"kind":"code","text":"`1`"},{"kind":"text","text":" - maximum zoom."}],"blockTags":[{"tag":"@default","content":[{"kind":"text","text":"0"}]}]},"type":{"type":"intrinsic","name":"number"}}]}}]}},{"name":"CameraRecordingOptions","kind":4194304,"type":{"type":"reflection","declaration":{"name":"__type","kind":65536,"children":[{"name":"codec","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"This option specifies what codec to use when recording the video. See ["},{"kind":"code","text":"`VideoCodec`"},{"kind":"text","text":"](#videocodec) for the possible values."}],"blockTags":[{"tag":"@platform","content":[{"kind":"text","text":"ios"}]}]},"type":{"type":"reference","name":"VideoCodec"}},{"name":"maxDuration","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"Maximum video duration in seconds."}]},"type":{"type":"intrinsic","name":"number"}},{"name":"maxFileSize","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"Maximum video file size in bytes."}]},"type":{"type":"intrinsic","name":"number"}},{"name":"mirror","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"If "},{"kind":"code","text":"`true`"},{"kind":"text","text":", the recorded video will be flipped along the vertical axis. iOS flips videos recorded with the front camera by default,\nbut you can reverse that back by setting this to "},{"kind":"code","text":"`true`"},{"kind":"text","text":". On Android, this is handled in the user's device settings."}],"blockTags":[{"tag":"@platform","content":[{"kind":"text","text":"ios"}]}]},"type":{"type":"intrinsic","name":"boolean"}},{"name":"mute","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"If present, video will be recorded with no sound."}]},"type":{"type":"intrinsic","name":"boolean"}},{"name":"quality","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"Specify the quality of recorded video. Use one of ["},{"kind":"code","text":"`VideoQuality.`"},{"kind":"text","text":"](#videoquality).\nPossible values: for 16:9 resolution "},{"kind":"code","text":"`2160p`"},{"kind":"text","text":", "},{"kind":"code","text":"`1080p`"},{"kind":"text","text":", "},{"kind":"code","text":"`720p`"},{"kind":"text","text":", "},{"kind":"code","text":"`480p`"},{"kind":"text","text":" : "},{"kind":"code","text":"`Android only`"},{"kind":"text","text":" and for 4:3 "},{"kind":"code","text":"`4:3`"},{"kind":"text","text":" (the size is 640x480).\nIf the chosen quality is not available for a device, the highest available is chosen."}]},"type":{"type":"union","types":[{"type":"intrinsic","name":"number"},{"type":"intrinsic","name":"string"}]}},{"name":"videoBitrate","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"Only works if "},{"kind":"code","text":"`useCamera2Api`"},{"kind":"text","text":" is set to "},{"kind":"code","text":"`true`"},{"kind":"text","text":". This option specifies a desired video bitrate. For example, "},{"kind":"code","text":"`5*1000*1000`"},{"kind":"text","text":" would be 5Mbps."}],"blockTags":[{"tag":"@platform","content":[{"kind":"text","text":"android"}]}]},"type":{"type":"intrinsic","name":"number"}}]}}},{"name":"FaceDetectionResult","kind":4194304,"type":{"type":"reflection","declaration":{"name":"__type","kind":65536,"children":[{"name":"faces","kind":1024,"comment":{"summary":[{"kind":"text","text":"Array of objects representing results of face detection.\nSee ["},{"kind":"code","text":"`FaceFeature`"},{"kind":"text","text":"](facedetector/#facefeature) in FaceDetector documentation for more details."}]},"type":{"type":"array","elementType":{"type":"intrinsic","name":"object"}}}]}}},{"name":"PermissionExpiration","kind":4194304,"comment":{"summary":[{"kind":"text","text":"Permission expiration time. Currently, all permissions are granted permanently."}]},"type":{"type":"union","types":[{"type":"literal","value":"never"},{"type":"intrinsic","name":"number"}]}},{"name":"PermissionHookOptions","kind":4194304,"typeParameters":[{"name":"Options","kind":131072,"type":{"type":"intrinsic","name":"object"}}],"type":{"type":"intersection","types":[{"type":"reference","name":"PermissionHookBehavior"},{"type":"reference","name":"Options"}]}},{"name":"Point","kind":4194304,"type":{"type":"reflection","declaration":{"name":"__type","kind":65536,"children":[{"name":"x","kind":1024,"type":{"type":"intrinsic","name":"number"}},{"name":"y","kind":1024,"type":{"type":"intrinsic","name":"number"}}]}}},{"name":"ResponsiveOrientationChanged","kind":4194304,"type":{"type":"reflection","declaration":{"name":"__type","kind":65536,"children":[{"name":"orientation","kind":1024,"type":{"type":"reference","name":"CameraOrientation"}}]}}},{"name":"Constants","kind":32,"type":{"type":"reference","name":"ConstantsType"}},{"name":"getCameraPermissionsAsync","kind":64,"signatures":[{"name":"getCameraPermissionsAsync","kind":4096,"comment":{"summary":[{"kind":"text","text":"Checks user's permissions for accessing camera."}],"blockTags":[{"tag":"@returns","content":[{"kind":"text","text":"A promise that resolves to an object of type [PermissionResponse](#permissionresponse)."}]}]},"type":{"type":"reference","typeArguments":[{"type":"reference","name":"PermissionResponse"}],"name":"Promise","qualifiedName":"Promise","package":"typescript"}}]},{"name":"getMicrophonePermissionsAsync","kind":64,"signatures":[{"name":"getMicrophonePermissionsAsync","kind":4096,"comment":{"summary":[{"kind":"text","text":"Checks user's permissions for accessing microphone."}],"blockTags":[{"tag":"@returns","content":[{"kind":"text","text":"A promise that resolves to an object of type [PermissionResponse](#permissionresponse)."}]}]},"type":{"type":"reference","typeArguments":[{"type":"reference","name":"PermissionResponse"}],"name":"Promise","qualifiedName":"Promise","package":"typescript"}}]},{"name":"getPermissionsAsync","kind":64,"signatures":[{"name":"getPermissionsAsync","kind":4096,"comment":{"summary":[],"blockTags":[{"tag":"@deprecated","content":[{"kind":"text","text":"Use "},{"kind":"code","text":"`getCameraPermissionsAsync`"},{"kind":"text","text":" or "},{"kind":"code","text":"`getMicrophonePermissionsAsync`"},{"kind":"text","text":" instead.\nChecks user's permissions for accessing camera."}]}]},"type":{"type":"reference","typeArguments":[{"type":"reference","name":"PermissionResponse"}],"name":"Promise","qualifiedName":"Promise","package":"typescript"}}]},{"name":"requestCameraPermissionsAsync","kind":64,"signatures":[{"name":"requestCameraPermissionsAsync","kind":4096,"comment":{"summary":[{"kind":"text","text":"Asks the user to grant permissions for accessing camera.\nOn iOS this will require apps to specify an "},{"kind":"code","text":"`NSCameraUsageDescription`"},{"kind":"text","text":" entry in the **Info.plist**."}],"blockTags":[{"tag":"@returns","content":[{"kind":"text","text":"A promise that resolves to an object of type [PermissionResponse](#permissionresponse)."}]}]},"type":{"type":"reference","typeArguments":[{"type":"reference","name":"PermissionResponse"}],"name":"Promise","qualifiedName":"Promise","package":"typescript"}}]},{"name":"requestMicrophonePermissionsAsync","kind":64,"signatures":[{"name":"requestMicrophonePermissionsAsync","kind":4096,"comment":{"summary":[{"kind":"text","text":"Asks the user to grant permissions for accessing the microphone.\nOn iOS this will require apps to specify an "},{"kind":"code","text":"`NSMicrophoneUsageDescription`"},{"kind":"text","text":" entry in the **Info.plist**."}],"blockTags":[{"tag":"@returns","content":[{"kind":"text","text":"A promise that resolves to an object of type [PermissionResponse](#permissionresponse)."}]}]},"type":{"type":"reference","typeArguments":[{"type":"reference","name":"PermissionResponse"}],"name":"Promise","qualifiedName":"Promise","package":"typescript"}}]},{"name":"requestPermissionsAsync","kind":64,"signatures":[{"name":"requestPermissionsAsync","kind":4096,"comment":{"summary":[{"kind":"text","text":"Asks the user to grant permissions for accessing camera.\nOn iOS this will require apps to specify both "},{"kind":"code","text":"`NSCameraUsageDescription`"},{"kind":"text","text":" and "},{"kind":"code","text":"`NSMicrophoneUsageDescription`"},{"kind":"text","text":" entries in the **Info.plist**."}],"blockTags":[{"tag":"@returns","content":[{"kind":"text","text":"A promise that resolves to an object of type [PermissionResponse](#permissionresponse)."}]},{"tag":"@deprecated","content":[{"kind":"text","text":"Use "},{"kind":"code","text":"`requestCameraPermissionsAsync`"},{"kind":"text","text":" or "},{"kind":"code","text":"`requestMicrophonePermissionsAsync`"},{"kind":"text","text":" instead."}]}]},"type":{"type":"reference","typeArguments":[{"type":"reference","name":"PermissionResponse"}],"name":"Promise","qualifiedName":"Promise","package":"typescript"}}]}]}
\ No newline at end of file
diff --git a/docs/public/static/data/unversioned/expo-clipboard.json b/docs/public/static/data/unversioned/expo-clipboard.json
index e001a1795de06..f14f5f7d5c14a 100644
--- a/docs/public/static/data/unversioned/expo-clipboard.json
+++ b/docs/public/static/data/unversioned/expo-clipboard.json
@@ -1 +1 @@
-{"name":"expo-clipboard","kind":1,"children":[{"name":"addClipboardListener","kind":64,"signatures":[{"name":"addClipboardListener","kind":4096,"comment":{"summary":[{"kind":"text","text":"Adds a listener that will fire whenever the content of the user's clipboard changes. This method\nis a no-op on Web."}],"blockTags":[{"tag":"@example","content":[{"kind":"code","text":"```typescript\nClipboard.addClipboardListener(({ contentTypes }: ClipboardEvent) => {\n if (contentTypes.includes(Clipboard.ContentType.PLAIN_TEXT)) {\n Clipboard.getStringAsync().then(content => {\n alert('Copy pasta! Here\\'s the string that was copied: ' + content)\n });\n } else if (contentTypes.includes(Clipboard.ContentType.IMAGE)) {\n alert('Yay! Clipboard contains an image');\n }\n});\n```"}]}]},"parameters":[{"name":"listener","kind":32768,"comment":{"summary":[{"kind":"text","text":"Callback to execute when listener is triggered. The callback is provided a\nsingle argument that is an object containing information about clipboard contents."}]},"type":{"type":"reflection","declaration":{"name":"__type","kind":65536,"signatures":[{"name":"__type","kind":4096,"parameters":[{"name":"event","kind":32768,"type":{"type":"reference","name":"ClipboardEvent"}}],"type":{"type":"intrinsic","name":"void"}}]}}}],"type":{"type":"reference","name":"Subscription"}}]},{"name":"ClipboardEvent","kind":4194304,"type":{"type":"reflection","declaration":{"name":"__type","kind":65536,"children":[{"name":"content","kind":1024,"comment":{"summary":[],"blockTags":[{"tag":"@deprecated","content":[{"kind":"text","text":"Returns empty string. Use ["},{"kind":"code","text":"`getStringAsync()`"},{"kind":"text","text":"](#getstringasyncoptions) instead to retrieve clipboard content."}]}]},"type":{"type":"intrinsic","name":"string"}},{"name":"contentTypes","kind":1024,"comment":{"summary":[{"kind":"text","text":"An array of content types that are available on the clipboard."}]},"type":{"type":"array","elementType":{"type":"reference","name":"ContentType"}}}]}}},{"name":"ClipboardImage","kind":8388608},{"name":"ClipboardImage","kind":256,"children":[{"name":"data","kind":1024,"comment":{"summary":[{"kind":"text","text":"A Base64-encoded string of the image data.\nIts format is dependent on the "},{"kind":"code","text":"`format`"},{"kind":"text","text":" option.\n\n> **NOTE:** The string is already prepended with "},{"kind":"code","text":"`data:image/png;base64,`"},{"kind":"text","text":" or "},{"kind":"code","text":"`data:image/jpeg;base64,`"},{"kind":"text","text":" prefix.\n\nYou can use it directly as the source of an "},{"kind":"code","text":"`Image`"},{"kind":"text","text":" element."}],"blockTags":[{"tag":"@example","content":[{"kind":"code","text":"```ts\n \n```"}]}]},"type":{"type":"intrinsic","name":"string"}},{"name":"size","kind":1024,"comment":{"summary":[{"kind":"text","text":"Dimensions ("},{"kind":"code","text":"`width`"},{"kind":"text","text":" and "},{"kind":"code","text":"`height`"},{"kind":"text","text":") of the image pasted from clipboard."}]},"type":{"type":"reflection","declaration":{"name":"__type","kind":65536,"children":[{"name":"height","kind":1024,"type":{"type":"intrinsic","name":"number"}},{"name":"width","kind":1024,"type":{"type":"intrinsic","name":"number"}}]}}}]},{"name":"ContentType","kind":8388608},{"name":"ContentType","kind":8,"comment":{"summary":[{"kind":"text","text":"Type used to define what type of data is stored in the clipboard."}]},"children":[{"name":"HTML","kind":16,"type":{"type":"literal","value":"html"}},{"name":"IMAGE","kind":16,"type":{"type":"literal","value":"image"}},{"name":"PLAIN_TEXT","kind":16,"type":{"type":"literal","value":"plain-text"}},{"name":"URL","kind":16,"comment":{"summary":[],"blockTags":[{"tag":"@platform","content":[{"kind":"text","text":"iOS"}]}]},"type":{"type":"literal","value":"url"}}]},{"name":"getImageAsync","kind":64,"signatures":[{"name":"getImageAsync","kind":4096,"comment":{"summary":[{"kind":"text","text":"Gets the image from the user's clipboard and returns it in the specified format. Please note that calling\nthis method on web will prompt the user to grant your app permission to \"see text and images copied to the clipboard.\""}],"blockTags":[{"tag":"@returns","content":[{"kind":"text","text":"If there was an image in the clipboard, the promise resolves to\na ["},{"kind":"code","text":"`ClipboardImage`"},{"kind":"text","text":"](#clipboardimage) object containing the base64 string and metadata of the image.\nOtherwise, it resolves to "},{"kind":"code","text":"`null`"},{"kind":"text","text":"."}]},{"tag":"@example","content":[{"kind":"code","text":"```tsx\nconst img = await Clipboard.getImageAsync({ format: 'png' });\n// ...\n \n```"}]}]},"parameters":[{"name":"options","kind":32768,"comment":{"summary":[{"kind":"text","text":"A "},{"kind":"code","text":"`GetImageOptions`"},{"kind":"text","text":" object to specify the desired format of the image."}]},"type":{"type":"reference","name":"GetImageOptions"}}],"type":{"type":"reference","typeArguments":[{"type":"union","types":[{"type":"reference","name":"ClipboardImage"},{"type":"literal","value":null}]}],"name":"Promise","qualifiedName":"Promise","package":"typescript"}}]},{"name":"GetImageOptions","kind":8388608},{"name":"GetImageOptions","kind":256,"children":[{"name":"format","kind":1024,"comment":{"summary":[{"kind":"text","text":"The format of the clipboard image to be converted to."}]},"type":{"type":"union","types":[{"type":"literal","value":"png"},{"type":"literal","value":"jpeg"}]}},{"name":"jpegQuality","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"Specify the quality of the returned image, between "},{"kind":"code","text":"`0`"},{"kind":"text","text":" and "},{"kind":"code","text":"`1`"},{"kind":"text","text":". Defaults to "},{"kind":"code","text":"`1`"},{"kind":"text","text":" (highest quality).\nApplicable only when "},{"kind":"code","text":"`format`"},{"kind":"text","text":" is set to "},{"kind":"code","text":"`jpeg`"},{"kind":"text","text":", ignored otherwise."}],"blockTags":[{"tag":"@default","content":[{"kind":"text","text":"1"}]}]},"type":{"type":"intrinsic","name":"number"}}]},{"name":"getStringAsync","kind":64,"signatures":[{"name":"getStringAsync","kind":4096,"comment":{"summary":[{"kind":"text","text":"Gets the content of the user's clipboard. Please note that calling this method on web will prompt\nthe user to grant your app permission to \"see text and images copied to the clipboard.\""}],"blockTags":[{"tag":"@returns","content":[{"kind":"text","text":"A promise that resolves to the content of the clipboard."}]}]},"parameters":[{"name":"options","kind":32768,"comment":{"summary":[{"kind":"text","text":"Options for the clipboard content to be retrieved."}]},"type":{"type":"reference","name":"GetStringOptions"},"defaultValue":"{}"}],"type":{"type":"reference","typeArguments":[{"type":"intrinsic","name":"string"}],"name":"Promise","qualifiedName":"Promise","package":"typescript"}}]},{"name":"GetStringOptions","kind":8388608},{"name":"GetStringOptions","kind":256,"children":[{"name":"preferredFormat","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"The target format of the clipboard string to be converted to, if possible."}],"blockTags":[{"tag":"@default","content":[{"kind":"text","text":"StringFormat.PLAIN_TEXT"}]}]},"type":{"type":"reference","name":"StringFormat"}}]},{"name":"getUrlAsync","kind":64,"signatures":[{"name":"getUrlAsync","kind":4096,"comment":{"summary":[{"kind":"text","text":"Gets the URL from the user's clipboard."}],"blockTags":[{"tag":"@returns","content":[{"kind":"text","text":"A promise that fulfills to the URL in the clipboard."}]},{"tag":"@platform","content":[{"kind":"text","text":"ios"}]}]},"type":{"type":"reference","typeArguments":[{"type":"union","types":[{"type":"intrinsic","name":"string"},{"type":"literal","value":null}]}],"name":"Promise","qualifiedName":"Promise","package":"typescript"}}]},{"name":"hasImageAsync","kind":64,"signatures":[{"name":"hasImageAsync","kind":4096,"comment":{"summary":[{"kind":"text","text":"Returns whether the clipboard has an image content.\n\nOn web, this requires the user to grant your app permission to _\"see text and images copied to the clipboard\"_."}],"blockTags":[{"tag":"@returns","content":[{"kind":"text","text":"A promise that fulfills to "},{"kind":"code","text":"`true`"},{"kind":"text","text":" if clipboard has image content, resolves to "},{"kind":"code","text":"`false`"},{"kind":"text","text":" otherwise."}]}]},"type":{"type":"reference","typeArguments":[{"type":"intrinsic","name":"boolean"}],"name":"Promise","qualifiedName":"Promise","package":"typescript"}}]},{"name":"hasStringAsync","kind":64,"signatures":[{"name":"hasStringAsync","kind":4096,"comment":{"summary":[{"kind":"text","text":"Returns whether the clipboard has text content. Returns true for both plain text and rich text (e.g. HTML).\n\nOn web, this requires the user to grant your app permission to _\"see text and images copied to the clipboard\"_."}],"blockTags":[{"tag":"@returns","content":[{"kind":"text","text":"A promise that fulfills to "},{"kind":"code","text":"`true`"},{"kind":"text","text":" if clipboard has text content, resolves to "},{"kind":"code","text":"`false`"},{"kind":"text","text":" otherwise."}]}]},"type":{"type":"reference","typeArguments":[{"type":"intrinsic","name":"boolean"}],"name":"Promise","qualifiedName":"Promise","package":"typescript"}}]},{"name":"hasUrlAsync","kind":64,"signatures":[{"name":"hasUrlAsync","kind":4096,"comment":{"summary":[{"kind":"text","text":"Returns whether the clipboard has a URL content."}],"blockTags":[{"tag":"@returns","content":[{"kind":"text","text":"A promise that fulfills to "},{"kind":"code","text":"`true`"},{"kind":"text","text":" if clipboard has URL content, resolves to "},{"kind":"code","text":"`false`"},{"kind":"text","text":" otherwise."}]},{"tag":"@platform","content":[{"kind":"text","text":"ios"}]}]},"type":{"type":"reference","typeArguments":[{"type":"intrinsic","name":"boolean"}],"name":"Promise","qualifiedName":"Promise","package":"typescript"}}]},{"name":"removeClipboardListener","kind":64,"signatures":[{"name":"removeClipboardListener","kind":4096,"comment":{"summary":[{"kind":"text","text":"Removes the listener added by addClipboardListener. This method is a no-op on Web."}],"blockTags":[{"tag":"@example","content":[{"kind":"code","text":"```typescript\nconst subscription = addClipboardListener(() => {\n alert('Copy pasta!');\n});\nremoveClipboardListener(subscription);\n```"}]}]},"parameters":[{"name":"subscription","kind":32768,"comment":{"summary":[{"kind":"text","text":"The subscription to remove (created by addClipboardListener)."}]},"type":{"type":"reference","name":"Subscription"}}],"type":{"type":"intrinsic","name":"void"}}]},{"name":"setImageAsync","kind":64,"signatures":[{"name":"setImageAsync","kind":4096,"comment":{"summary":[{"kind":"text","text":"Sets an image in the user's clipboard."}],"blockTags":[{"tag":"@example","content":[{"kind":"code","text":"```tsx\nconst result = await ImagePicker.launchImageLibraryAsync({\n mediaTypes: ImagePicker.MediaTypeOptions.Images,\n base64: true,\n});\nawait Clipboard.setImageAsync(result.base64);\n```"}]}]},"parameters":[{"name":"base64Image","kind":32768,"comment":{"summary":[{"kind":"text","text":"Image encoded as a base64 string, without MIME type."}]},"type":{"type":"intrinsic","name":"string"}}],"type":{"type":"reference","typeArguments":[{"type":"intrinsic","name":"void"}],"name":"Promise","qualifiedName":"Promise","package":"typescript"}}]},{"name":"setString","kind":64,"signatures":[{"name":"setString","kind":4096,"comment":{"summary":[{"kind":"text","text":"Sets the content of the user's clipboard."}],"blockTags":[{"tag":"@deprecated","content":[{"kind":"text","text":"Use ["},{"kind":"code","text":"`setStringAsync()`"},{"kind":"text","text":"](#setstringasynctext-options) instead."}]},{"tag":"@returns","content":[{"kind":"text","text":"On web, this returns a boolean value indicating whether or not the string was saved to\nthe user's clipboard. On iOS and Android, nothing is returned."}]}]},"parameters":[{"name":"text","kind":32768,"type":{"type":"intrinsic","name":"string"}}],"type":{"type":"intrinsic","name":"void"}}]},{"name":"setStringAsync","kind":64,"signatures":[{"name":"setStringAsync","kind":4096,"comment":{"summary":[{"kind":"text","text":"Sets the content of the user's clipboard."}],"blockTags":[{"tag":"@returns","content":[{"kind":"text","text":"On web, this returns a promise that fulfills to a boolean value indicating whether or not\nthe string was saved to the user's clipboard. On iOS and Android, the promise always resolves to "},{"kind":"code","text":"`true`"},{"kind":"text","text":"."}]}]},"parameters":[{"name":"text","kind":32768,"comment":{"summary":[{"kind":"text","text":"The string to save to the clipboard."}]},"type":{"type":"intrinsic","name":"string"}},{"name":"options","kind":32768,"comment":{"summary":[{"kind":"text","text":"Options for the clipboard content to be set."}]},"type":{"type":"reference","name":"SetStringOptions"},"defaultValue":"{}"}],"type":{"type":"reference","typeArguments":[{"type":"intrinsic","name":"boolean"}],"name":"Promise","qualifiedName":"Promise","package":"typescript"}}]},{"name":"SetStringOptions","kind":8388608},{"name":"SetStringOptions","kind":256,"children":[{"name":"inputFormat","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"The input format of the provided string.\nAdjusting this option can help other applications interpret copied string properly."}],"blockTags":[{"tag":"@default","content":[{"kind":"text","text":"StringFormat.PLAIN_TEXT"}]}]},"type":{"type":"reference","name":"StringFormat"}}]},{"name":"setUrlAsync","kind":64,"signatures":[{"name":"setUrlAsync","kind":4096,"comment":{"summary":[{"kind":"text","text":"Sets a URL in the user's clipboard.\n\nThis function behaves the same as ["},{"kind":"code","text":"`setStringAsync()`"},{"kind":"text","text":"](#setstringasynctext-options), except that\nit sets the clipboard content type to be a URL. It lets your app or other apps know that the\nclipboard contains a URL and behave accordingly."}],"blockTags":[{"tag":"@platform","content":[{"kind":"text","text":"ios"}]}]},"parameters":[{"name":"url","kind":32768,"comment":{"summary":[{"kind":"text","text":"The URL to save to the clipboard."}]},"type":{"type":"intrinsic","name":"string"}}],"type":{"type":"reference","typeArguments":[{"type":"intrinsic","name":"void"}],"name":"Promise","qualifiedName":"Promise","package":"typescript"}}]},{"name":"StringFormat","kind":8388608},{"name":"StringFormat","kind":8,"comment":{"summary":[{"kind":"text","text":"Type used to determine string format stored in the clipboard."}]},"children":[{"name":"HTML","kind":16,"type":{"type":"literal","value":"html"}},{"name":"PLAIN_TEXT","kind":16,"type":{"type":"literal","value":"plainText"}}]},{"name":"Subscription","kind":4194304,"type":{"type":"reflection","declaration":{"name":"__type","kind":65536,"children":[{"name":"remove","kind":1024,"type":{"type":"reflection","declaration":{"name":"__type","kind":65536,"signatures":[{"name":"__type","kind":4096,"comment":{"summary":[{"kind":"text","text":"A method to unsubscribe the listener."}]},"type":{"type":"intrinsic","name":"void"}}]}}}]}}}]}
\ No newline at end of file
+{"name":"expo-clipboard","kind":1,"children":[{"name":"addClipboardListener","kind":64,"signatures":[{"name":"addClipboardListener","kind":4096,"comment":{"summary":[{"kind":"text","text":"Adds a listener that will fire whenever the content of the user's clipboard changes. This method\nis a no-op on Web."}],"blockTags":[{"tag":"@example","content":[{"kind":"code","text":"```typescript\nClipboard.addClipboardListener(({ contentTypes }: ClipboardEvent) => {\n if (contentTypes.includes(Clipboard.ContentType.PLAIN_TEXT)) {\n Clipboard.getStringAsync().then(content => {\n alert('Copy pasta! Here\\'s the string that was copied: ' + content)\n });\n } else if (contentTypes.includes(Clipboard.ContentType.IMAGE)) {\n alert('Yay! Clipboard contains an image');\n }\n});\n```"}]}]},"parameters":[{"name":"listener","kind":32768,"comment":{"summary":[{"kind":"text","text":"Callback to execute when listener is triggered. The callback is provided a\nsingle argument that is an object containing information about clipboard contents."}]},"type":{"type":"reflection","declaration":{"name":"__type","kind":65536,"signatures":[{"name":"__type","kind":4096,"parameters":[{"name":"event","kind":32768,"type":{"type":"reference","name":"ClipboardEvent"}}],"type":{"type":"intrinsic","name":"void"}}]}}}],"type":{"type":"reference","name":"Subscription"}}]},{"name":"ClipboardEvent","kind":4194304,"type":{"type":"reflection","declaration":{"name":"__type","kind":65536,"children":[{"name":"content","kind":1024,"comment":{"summary":[],"blockTags":[{"tag":"@deprecated","content":[{"kind":"text","text":"Returns empty string. Use ["},{"kind":"code","text":"`getStringAsync()`"},{"kind":"text","text":"](#getstringasyncoptions) instead to retrieve clipboard content."}]}]},"type":{"type":"intrinsic","name":"string"}},{"name":"contentTypes","kind":1024,"comment":{"summary":[{"kind":"text","text":"An array of content types that are available on the clipboard."}]},"type":{"type":"array","elementType":{"type":"reference","name":"ContentType"}}}]}}},{"name":"ClipboardImage","kind":8388608},{"name":"ClipboardImage","kind":256,"children":[{"name":"data","kind":1024,"comment":{"summary":[{"kind":"text","text":"A Base64-encoded string of the image data.\nIts format is dependent on the "},{"kind":"code","text":"`format`"},{"kind":"text","text":" option.\n\n> **NOTE:** The string is already prepended with "},{"kind":"code","text":"`data:image/png;base64,`"},{"kind":"text","text":" or "},{"kind":"code","text":"`data:image/jpeg;base64,`"},{"kind":"text","text":" prefix.\n\nYou can use it directly as the source of an "},{"kind":"code","text":"`Image`"},{"kind":"text","text":" element."}],"blockTags":[{"tag":"@example","content":[{"kind":"code","text":"```ts\n \n```"}]}]},"type":{"type":"intrinsic","name":"string"}},{"name":"size","kind":1024,"comment":{"summary":[{"kind":"text","text":"Dimensions ("},{"kind":"code","text":"`width`"},{"kind":"text","text":" and "},{"kind":"code","text":"`height`"},{"kind":"text","text":") of the image pasted from clipboard."}]},"type":{"type":"reflection","declaration":{"name":"__type","kind":65536,"children":[{"name":"height","kind":1024,"type":{"type":"intrinsic","name":"number"}},{"name":"width","kind":1024,"type":{"type":"intrinsic","name":"number"}}]}}}],"extendedBy":[{"type":"reference","name":"ImagePasteEvent"}]},{"name":"ClipboardPasteButton","kind":64,"signatures":[{"name":"ClipboardPasteButton","kind":4096,"comment":{"summary":[{"kind":"text","text":"This component displays the "},{"kind":"code","text":"`UIPasteControl`"},{"kind":"text","text":" button on your screen. This allows pasting from the clipboard without requesting permission from the user.\n\nYou should only attempt to render this if ["},{"kind":"code","text":"`Clipboard.pasteButtonIsAvailable()`"},{"kind":"text","text":"](#pasteButtonIsAvailable)\nreturns "},{"kind":"code","text":"`true`"},{"kind":"text","text":". This component will render nothing if it is not available, and you will get\na warning in development mode ("},{"kind":"code","text":"`__DEV__ === true`"},{"kind":"text","text":").\n\nThe properties of this component extend from "},{"kind":"code","text":"`View`"},{"kind":"text","text":"; however, you should not attempt to set\n"},{"kind":"code","text":"`backgroundColor`"},{"kind":"text","text":", "},{"kind":"code","text":"`color`"},{"kind":"text","text":" or "},{"kind":"code","text":"`borderRadius`"},{"kind":"text","text":" with the "},{"kind":"code","text":"`style`"},{"kind":"text","text":" property. Apple restricts customisation of this view.\nInstead, you should use the backgroundColor and foregroundColor properties to set the colors of the button, the cornerStyle property to change the border radius,\nand the displayMode property to change the appearance of the icon and label. The word \"Paste\" is not editable and neither is the icon.\n\nMake sure to attach height and width via the style props as without these styles, the button will\nnot appear on the screen."}],"blockTags":[{"tag":"@see","content":[{"kind":"text","text":"[Apple Documentation](https://developer.apple.com/documentation/uikit/uipastecontrol) for more details."}]}]},"parameters":[{"name":"__namedParameters","kind":32768,"type":{"type":"reference","name":"ClipboardPasteButtonProps"}}],"type":{"type":"union","types":[{"type":"literal","value":null},{"type":"reference","name":"Element","qualifiedName":"global.JSX.Element","package":"@types/react"}]}}]},{"name":"ClipboardPasteButtonProps","kind":8388608},{"name":"ClipboardPasteButtonProps","kind":256,"children":[{"name":"acceptedContentTypes","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"An array of the content types that will cause the button to become active"}],"blockTags":[{"tag":"@note","content":[{"kind":"text","text":"do not include "},{"kind":"code","text":"`plain-text`"},{"kind":"text","text":" and "},{"kind":"code","text":"`html`"},{"kind":"text","text":" at the same time as this will cause all text to be treated as "},{"kind":"code","text":"`html`"}]},{"tag":"@default","content":[{"kind":"text","text":"['plain-text', 'image']"}]}]},"type":{"type":"array","elementType":{"type":"reference","name":"AcceptedContentType"}}},{"name":"backgroundColor","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"The backgroundColor of the button.\nLeaving this as the default allows the color to adjust to the system theme settings."}]},"type":{"type":"union","types":[{"type":"literal","value":null},{"type":"intrinsic","name":"string"}]}},{"name":"cornerStyle","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"The cornerStyle of the button."}],"blockTags":[{"tag":"@default","content":[{"kind":"text","text":"capsule"}]},{"tag":"@see","content":[{"kind":"text","text":"[Apple Documentation](https://developer.apple.com/documentation/uikit/uibutton/configuration/cornerstyle) for more details."}]}]},"type":{"type":"union","types":[{"type":"literal","value":null},{"type":"reference","name":"CornerStyle"}]}},{"name":"displayMode","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"The displayMode of the button."}],"blockTags":[{"tag":"@default","content":[{"kind":"code","text":"`iconAndLabel`"}]},{"tag":"@see","content":[{"kind":"text","text":"[Apple Documentation](https://developer.apple.com/documentation/uikit/uipastecontrol/displaymode) for more details."}]}]},"type":{"type":"union","types":[{"type":"literal","value":null},{"type":"reference","name":"DisplayMode"}]}},{"name":"foregroundColor","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"The foregroundColor of the button."}],"blockTags":[{"tag":"@default","content":[{"kind":"text","text":"white"}]}]},"type":{"type":"union","types":[{"type":"literal","value":null},{"type":"intrinsic","name":"string"}]}},{"name":"imageOptions","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"The options to use when pasting an image from the clipboard."}]},"type":{"type":"union","types":[{"type":"literal","value":null},{"type":"reference","name":"GetImageOptions"}]}},{"name":"onPress","kind":1024,"type":{"type":"reflection","declaration":{"name":"__type","kind":65536,"signatures":[{"name":"__type","kind":4096,"comment":{"summary":[{"kind":"text","text":"A callback that is called with the result of the paste action.\nInspect the "},{"kind":"code","text":"`type`"},{"kind":"text","text":" property to determine the type of the pasted data.\n\nCan be one of "},{"kind":"code","text":"`text`"},{"kind":"text","text":" or "},{"kind":"code","text":"`image`"},{"kind":"text","text":"."}],"blockTags":[{"tag":"@example","content":[{"kind":"code","text":"```ts\n onPress={(data) => {\n if (data.type === 'image') {\n setImageData(data);\n } else {\n setTextData(data);\n }\n }}\n```"}]}]},"parameters":[{"name":"data","kind":32768,"type":{"type":"reference","name":"PasteEventPayload"}}],"type":{"type":"intrinsic","name":"void"}}]}}},{"name":"style","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"The custom style to apply to the button. Should not include "},{"kind":"code","text":"`backgroundColor`"},{"kind":"text","text":", "},{"kind":"code","text":"`borderRadius`"},{"kind":"text","text":" or "},{"kind":"code","text":"`color`"},{"kind":"text","text":"\nproperties."}]},"type":{"type":"reference","typeArguments":[{"type":"reference","typeArguments":[{"type":"reference","name":"ViewStyle","qualifiedName":"ViewStyle","package":"react-native"},{"type":"union","types":[{"type":"literal","value":"backgroundColor"},{"type":"literal","value":"borderRadius"},{"type":"literal","value":"color"}]}],"name":"Omit","qualifiedName":"Omit","package":"typescript"}],"name":"StyleProp","qualifiedName":"StyleProp","package":"react-native"},"overwrites":{"type":"reference","name":"ViewProps.style"}}],"extendedTypes":[{"type":"reference","name":"ViewProps","qualifiedName":"ViewProps","package":"react-native"}]},{"name":"ContentType","kind":8388608},{"name":"ContentType","kind":8,"comment":{"summary":[{"kind":"text","text":"Type used to define what type of data is stored in the clipboard."}]},"children":[{"name":"HTML","kind":16,"type":{"type":"literal","value":"html"}},{"name":"IMAGE","kind":16,"type":{"type":"literal","value":"image"}},{"name":"PLAIN_TEXT","kind":16,"type":{"type":"literal","value":"plain-text"}},{"name":"URL","kind":16,"comment":{"summary":[],"blockTags":[{"tag":"@platform","content":[{"kind":"text","text":"iOS"}]}]},"type":{"type":"literal","value":"url"}}]},{"name":"getImageAsync","kind":64,"signatures":[{"name":"getImageAsync","kind":4096,"comment":{"summary":[{"kind":"text","text":"Gets the image from the user's clipboard and returns it in the specified format. Please note that calling\nthis method on web will prompt the user to grant your app permission to \"see text and images copied to the clipboard.\""}],"blockTags":[{"tag":"@returns","content":[{"kind":"text","text":"If there was an image in the clipboard, the promise resolves to\na ["},{"kind":"code","text":"`ClipboardImage`"},{"kind":"text","text":"](#clipboardimage) object containing the base64 string and metadata of the image.\nOtherwise, it resolves to "},{"kind":"code","text":"`null`"},{"kind":"text","text":"."}]},{"tag":"@example","content":[{"kind":"code","text":"```tsx\nconst img = await Clipboard.getImageAsync({ format: 'png' });\n// ...\n \n```"}]}]},"parameters":[{"name":"options","kind":32768,"comment":{"summary":[{"kind":"text","text":"A "},{"kind":"code","text":"`GetImageOptions`"},{"kind":"text","text":" object to specify the desired format of the image."}]},"type":{"type":"reference","name":"GetImageOptions"}}],"type":{"type":"reference","typeArguments":[{"type":"union","types":[{"type":"reference","name":"ClipboardImage"},{"type":"literal","value":null}]}],"name":"Promise","qualifiedName":"Promise","package":"typescript"}}]},{"name":"GetImageOptions","kind":8388608},{"name":"GetImageOptions","kind":256,"children":[{"name":"format","kind":1024,"comment":{"summary":[{"kind":"text","text":"The format of the clipboard image to be converted to."}]},"type":{"type":"union","types":[{"type":"literal","value":"png"},{"type":"literal","value":"jpeg"}]}},{"name":"jpegQuality","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"Specify the quality of the returned image, between "},{"kind":"code","text":"`0`"},{"kind":"text","text":" and "},{"kind":"code","text":"`1`"},{"kind":"text","text":". Defaults to "},{"kind":"code","text":"`1`"},{"kind":"text","text":" (highest quality).\nApplicable only when "},{"kind":"code","text":"`format`"},{"kind":"text","text":" is set to "},{"kind":"code","text":"`jpeg`"},{"kind":"text","text":", ignored otherwise."}],"blockTags":[{"tag":"@default","content":[{"kind":"text","text":"1"}]}]},"type":{"type":"intrinsic","name":"number"}}]},{"name":"getStringAsync","kind":64,"signatures":[{"name":"getStringAsync","kind":4096,"comment":{"summary":[{"kind":"text","text":"Gets the content of the user's clipboard. Please note that calling this method on web will prompt\nthe user to grant your app permission to \"see text and images copied to the clipboard.\""}],"blockTags":[{"tag":"@returns","content":[{"kind":"text","text":"A promise that resolves to the content of the clipboard."}]}]},"parameters":[{"name":"options","kind":32768,"comment":{"summary":[{"kind":"text","text":"Options for the clipboard content to be retrieved."}]},"type":{"type":"reference","name":"GetStringOptions"},"defaultValue":"{}"}],"type":{"type":"reference","typeArguments":[{"type":"intrinsic","name":"string"}],"name":"Promise","qualifiedName":"Promise","package":"typescript"}}]},{"name":"GetStringOptions","kind":8388608},{"name":"GetStringOptions","kind":256,"children":[{"name":"preferredFormat","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"The target format of the clipboard string to be converted to, if possible."}],"blockTags":[{"tag":"@default","content":[{"kind":"text","text":"StringFormat.PLAIN_TEXT"}]}]},"type":{"type":"reference","name":"StringFormat"}}]},{"name":"getUrlAsync","kind":64,"signatures":[{"name":"getUrlAsync","kind":4096,"comment":{"summary":[{"kind":"text","text":"Gets the URL from the user's clipboard."}],"blockTags":[{"tag":"@returns","content":[{"kind":"text","text":"A promise that fulfills to the URL in the clipboard."}]},{"tag":"@platform","content":[{"kind":"text","text":"ios"}]}]},"type":{"type":"reference","typeArguments":[{"type":"union","types":[{"type":"intrinsic","name":"string"},{"type":"literal","value":null}]}],"name":"Promise","qualifiedName":"Promise","package":"typescript"}}]},{"name":"hasImageAsync","kind":64,"signatures":[{"name":"hasImageAsync","kind":4096,"comment":{"summary":[{"kind":"text","text":"Returns whether the clipboard has an image content.\n\nOn web, this requires the user to grant your app permission to _\"see text and images copied to the clipboard\"_."}],"blockTags":[{"tag":"@returns","content":[{"kind":"text","text":"A promise that fulfills to "},{"kind":"code","text":"`true`"},{"kind":"text","text":" if clipboard has image content, resolves to "},{"kind":"code","text":"`false`"},{"kind":"text","text":" otherwise."}]}]},"type":{"type":"reference","typeArguments":[{"type":"intrinsic","name":"boolean"}],"name":"Promise","qualifiedName":"Promise","package":"typescript"}}]},{"name":"hasStringAsync","kind":64,"signatures":[{"name":"hasStringAsync","kind":4096,"comment":{"summary":[{"kind":"text","text":"Returns whether the clipboard has text content. Returns true for both plain text and rich text (e.g. HTML).\n\nOn web, this requires the user to grant your app permission to _\"see text and images copied to the clipboard\"_."}],"blockTags":[{"tag":"@returns","content":[{"kind":"text","text":"A promise that fulfills to "},{"kind":"code","text":"`true`"},{"kind":"text","text":" if clipboard has text content, resolves to "},{"kind":"code","text":"`false`"},{"kind":"text","text":" otherwise."}]}]},"type":{"type":"reference","typeArguments":[{"type":"intrinsic","name":"boolean"}],"name":"Promise","qualifiedName":"Promise","package":"typescript"}}]},{"name":"hasUrlAsync","kind":64,"signatures":[{"name":"hasUrlAsync","kind":4096,"comment":{"summary":[{"kind":"text","text":"Returns whether the clipboard has a URL content."}],"blockTags":[{"tag":"@returns","content":[{"kind":"text","text":"A promise that fulfills to "},{"kind":"code","text":"`true`"},{"kind":"text","text":" if clipboard has URL content, resolves to "},{"kind":"code","text":"`false`"},{"kind":"text","text":" otherwise."}]},{"tag":"@platform","content":[{"kind":"text","text":"ios"}]}]},"type":{"type":"reference","typeArguments":[{"type":"intrinsic","name":"boolean"}],"name":"Promise","qualifiedName":"Promise","package":"typescript"}}]},{"name":"ImagePasteEvent","kind":8388608},{"name":"ImagePasteEvent","kind":256,"children":[{"name":"data","kind":1024,"comment":{"summary":[{"kind":"text","text":"A Base64-encoded string of the image data.\nIts format is dependent on the "},{"kind":"code","text":"`format`"},{"kind":"text","text":" option.\n\n> **NOTE:** The string is already prepended with "},{"kind":"code","text":"`data:image/png;base64,`"},{"kind":"text","text":" or "},{"kind":"code","text":"`data:image/jpeg;base64,`"},{"kind":"text","text":" prefix.\n\nYou can use it directly as the source of an "},{"kind":"code","text":"`Image`"},{"kind":"text","text":" element."}],"blockTags":[{"tag":"@example","content":[{"kind":"code","text":"```ts\n \n```"}]}]},"type":{"type":"intrinsic","name":"string"},"inheritedFrom":{"type":"reference","name":"ClipboardImage.data"}},{"name":"size","kind":1024,"comment":{"summary":[{"kind":"text","text":"Dimensions ("},{"kind":"code","text":"`width`"},{"kind":"text","text":" and "},{"kind":"code","text":"`height`"},{"kind":"text","text":") of the image pasted from clipboard."}]},"type":{"type":"reflection","declaration":{"name":"__type","kind":65536,"children":[{"name":"height","kind":1024,"type":{"type":"intrinsic","name":"number"}},{"name":"width","kind":1024,"type":{"type":"intrinsic","name":"number"}}]}},"inheritedFrom":{"type":"reference","name":"ClipboardImage.size"}},{"name":"type","kind":1024,"type":{"type":"literal","value":"image"}}],"extendedTypes":[{"type":"reference","name":"ClipboardImage"}]},{"name":"isPasteButtonAvailable","kind":32,"flags":{"isConst":true},"comment":{"summary":[{"kind":"text","text":"Property that determines if the "},{"kind":"code","text":"`ClipboardPasteButton`"},{"kind":"text","text":" is available.\n\nThis requires the users device to be using at least iOS 16.\n\n"},{"kind":"code","text":"`true`"},{"kind":"text","text":" if the component is available, and "},{"kind":"code","text":"`false`"},{"kind":"text","text":" otherwise."}]},"type":{"type":"intrinsic","name":"boolean"},"defaultValue":"..."},{"name":"PasteEventPayload","kind":8388608},{"name":"PasteEventPayload","kind":4194304,"type":{"type":"union","types":[{"type":"reference","name":"TextPasteEvent"},{"type":"reference","name":"ImagePasteEvent"}]}},{"name":"removeClipboardListener","kind":64,"signatures":[{"name":"removeClipboardListener","kind":4096,"comment":{"summary":[{"kind":"text","text":"Removes the listener added by addClipboardListener. This method is a no-op on Web."}],"blockTags":[{"tag":"@example","content":[{"kind":"code","text":"```typescript\nconst subscription = addClipboardListener(() => {\n alert('Copy pasta!');\n});\nremoveClipboardListener(subscription);\n```"}]}]},"parameters":[{"name":"subscription","kind":32768,"comment":{"summary":[{"kind":"text","text":"The subscription to remove (created by addClipboardListener)."}]},"type":{"type":"reference","name":"Subscription"}}],"type":{"type":"intrinsic","name":"void"}}]},{"name":"setImageAsync","kind":64,"signatures":[{"name":"setImageAsync","kind":4096,"comment":{"summary":[{"kind":"text","text":"Sets an image in the user's clipboard."}],"blockTags":[{"tag":"@example","content":[{"kind":"code","text":"```tsx\nconst result = await ImagePicker.launchImageLibraryAsync({\n mediaTypes: ImagePicker.MediaTypeOptions.Images,\n base64: true,\n});\nawait Clipboard.setImageAsync(result.base64);\n```"}]}]},"parameters":[{"name":"base64Image","kind":32768,"comment":{"summary":[{"kind":"text","text":"Image encoded as a base64 string, without MIME type."}]},"type":{"type":"intrinsic","name":"string"}}],"type":{"type":"reference","typeArguments":[{"type":"intrinsic","name":"void"}],"name":"Promise","qualifiedName":"Promise","package":"typescript"}}]},{"name":"setString","kind":64,"signatures":[{"name":"setString","kind":4096,"comment":{"summary":[{"kind":"text","text":"Sets the content of the user's clipboard."}],"blockTags":[{"tag":"@deprecated","content":[{"kind":"text","text":"Use ["},{"kind":"code","text":"`setStringAsync()`"},{"kind":"text","text":"](#setstringasynctext-options) instead."}]},{"tag":"@returns","content":[{"kind":"text","text":"On web, this returns a boolean value indicating whether or not the string was saved to\nthe user's clipboard. On iOS and Android, nothing is returned."}]}]},"parameters":[{"name":"text","kind":32768,"type":{"type":"intrinsic","name":"string"}}],"type":{"type":"intrinsic","name":"void"}}]},{"name":"setStringAsync","kind":64,"signatures":[{"name":"setStringAsync","kind":4096,"comment":{"summary":[{"kind":"text","text":"Sets the content of the user's clipboard."}],"blockTags":[{"tag":"@returns","content":[{"kind":"text","text":"On web, this returns a promise that fulfills to a boolean value indicating whether or not\nthe string was saved to the user's clipboard. On iOS and Android, the promise always resolves to "},{"kind":"code","text":"`true`"},{"kind":"text","text":"."}]}]},"parameters":[{"name":"text","kind":32768,"comment":{"summary":[{"kind":"text","text":"The string to save to the clipboard."}]},"type":{"type":"intrinsic","name":"string"}},{"name":"options","kind":32768,"comment":{"summary":[{"kind":"text","text":"Options for the clipboard content to be set."}]},"type":{"type":"reference","name":"SetStringOptions"},"defaultValue":"{}"}],"type":{"type":"reference","typeArguments":[{"type":"intrinsic","name":"boolean"}],"name":"Promise","qualifiedName":"Promise","package":"typescript"}}]},{"name":"SetStringOptions","kind":8388608},{"name":"SetStringOptions","kind":256,"children":[{"name":"inputFormat","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"The input format of the provided string.\nAdjusting this option can help other applications interpret copied string properly."}],"blockTags":[{"tag":"@default","content":[{"kind":"text","text":"StringFormat.PLAIN_TEXT"}]}]},"type":{"type":"reference","name":"StringFormat"}}]},{"name":"setUrlAsync","kind":64,"signatures":[{"name":"setUrlAsync","kind":4096,"comment":{"summary":[{"kind":"text","text":"Sets a URL in the user's clipboard.\n\nThis function behaves the same as ["},{"kind":"code","text":"`setStringAsync()`"},{"kind":"text","text":"](#setstringasynctext-options), except that\nit sets the clipboard content type to be a URL. It lets your app or other apps know that the\nclipboard contains a URL and behave accordingly."}],"blockTags":[{"tag":"@platform","content":[{"kind":"text","text":"ios"}]}]},"parameters":[{"name":"url","kind":32768,"comment":{"summary":[{"kind":"text","text":"The URL to save to the clipboard."}]},"type":{"type":"intrinsic","name":"string"}}],"type":{"type":"reference","typeArguments":[{"type":"intrinsic","name":"void"}],"name":"Promise","qualifiedName":"Promise","package":"typescript"}}]},{"name":"StringFormat","kind":8388608},{"name":"StringFormat","kind":8,"comment":{"summary":[{"kind":"text","text":"Type used to determine string format stored in the clipboard."}]},"children":[{"name":"HTML","kind":16,"type":{"type":"literal","value":"html"}},{"name":"PLAIN_TEXT","kind":16,"type":{"type":"literal","value":"plainText"}}]},{"name":"Subscription","kind":4194304,"type":{"type":"reflection","declaration":{"name":"__type","kind":65536,"children":[{"name":"remove","kind":1024,"type":{"type":"reflection","declaration":{"name":"__type","kind":65536,"signatures":[{"name":"__type","kind":4096,"comment":{"summary":[{"kind":"text","text":"A method to unsubscribe the listener."}]},"type":{"type":"intrinsic","name":"void"}}]}}}]}}},{"name":"TextPasteEvent","kind":8388608},{"name":"TextPasteEvent","kind":256,"children":[{"name":"text","kind":1024,"type":{"type":"intrinsic","name":"string"}},{"name":"type","kind":1024,"type":{"type":"literal","value":"text"}}]}]}
\ No newline at end of file
diff --git a/docs/public/static/data/unversioned/expo-device.json b/docs/public/static/data/unversioned/expo-device.json
index 8afc8c43ea1be..b503359136872 100644
--- a/docs/public/static/data/unversioned/expo-device.json
+++ b/docs/public/static/data/unversioned/expo-device.json
@@ -1 +1 @@
-{"name":"expo-device","kind":1,"children":[{"name":"DeviceType","kind":8,"comment":{"summary":[{"kind":"text","text":"An enum representing the different types of devices supported by Expo."}]},"children":[{"name":"DESKTOP","kind":16,"comment":{"summary":[{"kind":"text","text":"Desktop or laptop computers, typically with a keyboard and mouse."}]},"type":{"type":"literal","value":3}},{"name":"PHONE","kind":16,"comment":{"summary":[{"kind":"text","text":"Mobile phone handsets, typically with a touch screen and held in one hand."}]},"type":{"type":"literal","value":1}},{"name":"TABLET","kind":16,"comment":{"summary":[{"kind":"text","text":"Tablet computers, typically with a touch screen that is larger than a usual phone."}]},"type":{"type":"literal","value":2}},{"name":"TV","kind":16,"comment":{"summary":[{"kind":"text","text":"Device with TV-based interfaces."}]},"type":{"type":"literal","value":4}},{"name":"UNKNOWN","kind":16,"comment":{"summary":[{"kind":"text","text":"An unrecognized device type."}]},"type":{"type":"literal","value":0}}]},{"name":"brand","kind":32,"flags":{"isConst":true},"comment":{"summary":[{"kind":"text","text":"The device brand. The consumer-visible brand of the product/hardware. On web, this value is always "},{"kind":"code","text":"`null`"},{"kind":"text","text":"."}],"blockTags":[{"tag":"@example","content":[{"kind":"code","text":"```js\nDevice.brand; // Android: \"google\", \"xiaomi\"; iOS: \"Apple\"; web: null\n```"}]},{"tag":"@platform","content":[{"kind":"text","text":"android"}]},{"tag":"@platform","content":[{"kind":"text","text":"ios"}]}]},"type":{"type":"union","types":[{"type":"intrinsic","name":"string"},{"type":"literal","value":null}]},"defaultValue":"..."},{"name":"designName","kind":32,"flags":{"isConst":true},"comment":{"summary":[{"kind":"text","text":"The specific configuration or name of the industrial design. It represents the device's name when it was designed during manufacturing into mass production.\nOn Android, it corresponds to ["},{"kind":"code","text":"`Build.DEVICE`"},{"kind":"text","text":"](https://developer.android.com/reference/android/os/Build#DEVICE). On web and iOS, this value is always "},{"kind":"code","text":"`null`"},{"kind":"text","text":"."}],"blockTags":[{"tag":"@example","content":[{"kind":"code","text":"```js\nDevice.designName; // Android: \"kminilte\"; iOS: null; web: null\n```"}]},{"tag":"@platform","content":[{"kind":"text","text":"android"}]}]},"type":{"type":"union","types":[{"type":"intrinsic","name":"string"},{"type":"literal","value":null}]},"defaultValue":"..."},{"name":"deviceName","kind":32,"flags":{"isConst":true},"comment":{"summary":[{"kind":"text","text":"The human-readable name of the device, which may be set by the device's user. If the device name is unavailable, particularly on web, this value is "},{"kind":"code","text":"`null`"},{"kind":"text","text":".\n\n> On iOS 16 and newer, this value will be set to generic \"iPhone\" until you add the correct entitlement, see [iOS Capabilities page](/build-reference/ios-capabilities)\n> to learn how to add one and check out [Apple documentation](https://developer.apple.com/documentation/uikit/uidevice/1620015-name#discussion)\n> for more details on this change."}],"blockTags":[{"tag":"@example","content":[{"kind":"code","text":"```js\nDevice.deviceName; // \"Vivian's iPhone XS\"\n```"}]}]},"type":{"type":"union","types":[{"type":"intrinsic","name":"string"},{"type":"literal","value":null}]},"defaultValue":"..."},{"name":"deviceYearClass","kind":32,"flags":{"isConst":true},"comment":{"summary":[{"kind":"text","text":"The [device year class](https://github.com/facebook/device-year-class) of this device. On web, this value is always "},{"kind":"code","text":"`null`"},{"kind":"text","text":"."}]},"type":{"type":"union","types":[{"type":"intrinsic","name":"number"},{"type":"literal","value":null}]},"defaultValue":"..."},{"name":"isDevice","kind":32,"flags":{"isConst":true},"comment":{"summary":[{"kind":"code","text":"`true`"},{"kind":"text","text":" if the app is running on a real device and "},{"kind":"code","text":"`false`"},{"kind":"text","text":" if running in a simulator or emulator.\nOn web, this is always set to "},{"kind":"code","text":"`true`"},{"kind":"text","text":"."}]},"type":{"type":"intrinsic","name":"boolean"},"defaultValue":"..."},{"name":"manufacturer","kind":32,"flags":{"isConst":true},"comment":{"summary":[{"kind":"text","text":"The actual device manufacturer of the product or hardware. This value of this field may be "},{"kind":"code","text":"`null`"},{"kind":"text","text":" if it cannot be determined.\n\nTo view difference between "},{"kind":"code","text":"`brand`"},{"kind":"text","text":" and "},{"kind":"code","text":"`manufacturer`"},{"kind":"text","text":" on Android see [official documentation](https://developer.android.com/reference/android/os/Build)."}],"blockTags":[{"tag":"@example","content":[{"kind":"code","text":"```js\nDevice.manufacturer; // Android: \"Google\", \"xiaomi\"; iOS: \"Apple\"; web: \"Google\", null\n```"}]}]},"type":{"type":"union","types":[{"type":"intrinsic","name":"string"},{"type":"literal","value":null}]},"defaultValue":"..."},{"name":"modelId","kind":32,"flags":{"isConst":true},"comment":{"summary":[{"kind":"text","text":"The internal model ID of the device. This is useful for programmatically identifying the type of device and is not a human-friendly string.\nOn web and Android, this value is always "},{"kind":"code","text":"`null`"},{"kind":"text","text":"."}],"blockTags":[{"tag":"@example","content":[{"kind":"code","text":"```js\nDevice.modelId; // iOS: \"iPhone7,2\"; Android: null; web: null\n```"}]},{"tag":"@platform","content":[{"kind":"text","text":"ios"}]}]},"type":{"type":"intrinsic","name":"any"},"defaultValue":"..."},{"name":"modelName","kind":32,"flags":{"isConst":true},"comment":{"summary":[{"kind":"text","text":"The human-friendly name of the device model. This is the name that people would typically use to refer to the device rather than a programmatic model identifier.\nThis value of this field may be "},{"kind":"code","text":"`null`"},{"kind":"text","text":" if it cannot be determined."}],"blockTags":[{"tag":"@example","content":[{"kind":"code","text":"```js\nDevice.modelName; // Android: \"Pixel 2\"; iOS: \"iPhone XS Max\"; web: \"iPhone\", null\n```"}]}]},"type":{"type":"union","types":[{"type":"intrinsic","name":"string"},{"type":"literal","value":null}]},"defaultValue":"..."},{"name":"osBuildFingerprint","kind":32,"flags":{"isConst":true},"comment":{"summary":[{"kind":"text","text":"A string that uniquely identifies the build of the currently running system OS. On Android, it follows this template:\n- "},{"kind":"code","text":"`$(BRAND)/$(PRODUCT)/$(DEVICE)/$(BOARD):$(VERSION.RELEASE)/$(ID)/$(VERSION.INCREMENTAL):$(TYPE)/\\$(TAGS)`"},{"kind":"text","text":"\nOn web and iOS, this value is always "},{"kind":"code","text":"`null`"},{"kind":"text","text":"."}],"blockTags":[{"tag":"@example","content":[{"kind":"code","text":"```js\nDevice.osBuildFingerprint;\n// Android: \"google/sdk_gphone_x86/generic_x86:9/PSR1.180720.075/5124027:user/release-keys\";\n// iOS: null; web: null\n```"}]},{"tag":"@platform","content":[{"kind":"text","text":"android"}]}]},"type":{"type":"union","types":[{"type":"intrinsic","name":"string"},{"type":"literal","value":null}]},"defaultValue":"..."},{"name":"osBuildId","kind":32,"flags":{"isConst":true},"comment":{"summary":[{"kind":"text","text":"The build ID of the OS that more precisely identifies the version of the OS. On Android, this corresponds to "},{"kind":"code","text":"`Build.DISPLAY`"},{"kind":"text","text":" (not "},{"kind":"code","text":"`Build.ID`"},{"kind":"text","text":")\nand currently is a string as described [here](https://source.android.com/setup/start/build-numbers). On iOS, this corresponds to "},{"kind":"code","text":"`kern.osversion`"},{"kind":"text","text":"\nand is the detailed OS version sometimes displayed next to the more human-readable version. On web, this value is always "},{"kind":"code","text":"`null`"},{"kind":"text","text":"."}],"blockTags":[{"tag":"@example","content":[{"kind":"code","text":"```js\nDevice.osBuildId; // Android: \"PSR1.180720.075\"; iOS: \"16F203\"; web: null\n```"}]}]},"type":{"type":"union","types":[{"type":"intrinsic","name":"string"},{"type":"literal","value":null}]},"defaultValue":"..."},{"name":"osInternalBuildId","kind":32,"flags":{"isConst":true},"comment":{"summary":[{"kind":"text","text":"The internal build ID of the OS running on the device. On Android, this corresponds to "},{"kind":"code","text":"`Build.ID`"},{"kind":"text","text":".\nOn iOS, this is the same value as ["},{"kind":"code","text":"`Device.osBuildId`"},{"kind":"text","text":"](#deviceosbuildid). On web, this value is always "},{"kind":"code","text":"`null`"},{"kind":"text","text":"."}],"blockTags":[{"tag":"@example","content":[{"kind":"code","text":"```js\nDevice.osInternalBuildId; // Android: \"MMB29K\"; iOS: \"16F203\"; web: null,\n```"}]}]},"type":{"type":"union","types":[{"type":"intrinsic","name":"string"},{"type":"literal","value":null}]},"defaultValue":"..."},{"name":"osName","kind":32,"flags":{"isConst":true},"comment":{"summary":[{"kind":"text","text":"The name of the OS running on the device."}],"blockTags":[{"tag":"@example","content":[{"kind":"code","text":"```js\nDevice.osName; // Android: \"Android\"; iOS: \"iOS\" or \"iPadOS\"; web: \"iOS\", \"Android\", \"Windows\"\n```"}]}]},"type":{"type":"union","types":[{"type":"intrinsic","name":"string"},{"type":"literal","value":null}]},"defaultValue":"..."},{"name":"osVersion","kind":32,"flags":{"isConst":true},"comment":{"summary":[{"kind":"text","text":"The human-readable OS version string. Note that the version string may not always contain three numbers separated by dots."}],"blockTags":[{"tag":"@example","content":[{"kind":"code","text":"```js\nDevice.osVersion; // Android: \"4.0.3\"; iOS: \"12.3.1\"; web: \"11.0\", \"8.1.0\"\n```"}]}]},"type":{"type":"union","types":[{"type":"intrinsic","name":"string"},{"type":"literal","value":null}]},"defaultValue":"..."},{"name":"platformApiLevel","kind":32,"flags":{"isConst":true},"comment":{"summary":[{"kind":"text","text":"The Android SDK version of the software currently running on this hardware device. This value never changes while a device is booted,\nbut it may increase when the hardware manufacturer provides an OS update. See [here](https://developer.android.com/reference/android/os/Build.VERSION_CODES.html)\nto see all possible version codes and corresponding versions. On iOS and web, this value is always "},{"kind":"code","text":"`null`"},{"kind":"text","text":"."}],"blockTags":[{"tag":"@example","content":[{"kind":"code","text":"```js\nDevice.platformApiLevel; // Android: 19; iOS: null; web: null\n```"}]},{"tag":"@platform","content":[{"kind":"text","text":"android"}]}]},"type":{"type":"union","types":[{"type":"intrinsic","name":"number"},{"type":"literal","value":null}]},"defaultValue":"..."},{"name":"productName","kind":32,"flags":{"isConst":true},"comment":{"summary":[{"kind":"text","text":"The device's overall product name chosen by the device implementer containing the development name or code name of the device.\nCorresponds to ["},{"kind":"code","text":"`Build.PRODUCT`"},{"kind":"text","text":"](https://developer.android.com/reference/android/os/Build#PRODUCT). On web and iOS, this value is always "},{"kind":"code","text":"`null`"},{"kind":"text","text":"."}],"blockTags":[{"tag":"@example","content":[{"kind":"code","text":"```js\nDevice.productName; // Android: \"kminiltexx\"; iOS: null; web: null\n```"}]},{"tag":"@platform","content":[{"kind":"text","text":"android"}]}]},"type":{"type":"union","types":[{"type":"intrinsic","name":"string"},{"type":"literal","value":null}]},"defaultValue":"..."},{"name":"supportedCpuArchitectures","kind":32,"flags":{"isConst":true},"comment":{"summary":[{"kind":"text","text":"A list of supported processor architecture versions. The device expects the binaries it runs to be compiled for one of these architectures.\nThis value is "},{"kind":"code","text":"`null`"},{"kind":"text","text":" if the supported architectures could not be determined, particularly on web."}],"blockTags":[{"tag":"@example","content":[{"kind":"code","text":"```js\nDevice.supportedCpuArchitectures; // ['arm64 v8', 'Intel x86-64h Haswell', 'arm64-v8a', 'armeabi-v7a\", 'armeabi']\n```"}]}]},"type":{"type":"union","types":[{"type":"array","elementType":{"type":"intrinsic","name":"string"}},{"type":"literal","value":null}]},"defaultValue":"..."},{"name":"totalMemory","kind":32,"flags":{"isConst":true},"comment":{"summary":[{"kind":"text","text":"The device's total memory, in bytes. This is the total memory accessible to the kernel, but not necessarily to a single app.\nThis is basically the amount of RAM the device has, not including below-kernel fixed allocations like DMA buffers, RAM for the baseband CPU, etc…\nOn web, this value is always "},{"kind":"code","text":"`null`"},{"kind":"text","text":"."}],"blockTags":[{"tag":"@example","content":[{"kind":"code","text":"```js\nDevice.totalMemory; // 17179869184\n```"}]}]},"type":{"type":"union","types":[{"type":"intrinsic","name":"number"},{"type":"literal","value":null}]},"defaultValue":"..."},{"name":"getDeviceTypeAsync","kind":64,"signatures":[{"name":"getDeviceTypeAsync","kind":4096,"comment":{"summary":[{"kind":"text","text":"Checks the type of the device as a ["},{"kind":"code","text":"`DeviceType`"},{"kind":"text","text":"](#devicetype) enum value.\n\nOn Android, for devices other than TVs, the device type is determined by the screen resolution (screen diagonal size), so the result may not be completely accurate.\nIf the screen diagonal length is between 3\" and 6.9\", the method returns "},{"kind":"code","text":"`DeviceType.PHONE`"},{"kind":"text","text":". For lengths between 7\" and 18\", the method returns "},{"kind":"code","text":"`DeviceType.TABLET`"},{"kind":"text","text":".\nOtherwise, the method returns "},{"kind":"code","text":"`DeviceType.UNKNOWN`"},{"kind":"text","text":"."}],"blockTags":[{"tag":"@returns","content":[{"kind":"text","text":"Returns a promise that resolves to a ["},{"kind":"code","text":"`DeviceType`"},{"kind":"text","text":"](#devicetype) enum value."}]},{"tag":"@example","content":[{"kind":"code","text":"```js\nawait Device.getDeviceTypeAsync();\n// DeviceType.PHONE\n```"}]}]},"type":{"type":"reference","typeArguments":[{"type":"reference","name":"DeviceType"}],"name":"Promise","qualifiedName":"Promise","package":"typescript"}}]},{"name":"getMaxMemoryAsync","kind":64,"signatures":[{"name":"getMaxMemoryAsync","kind":4096,"comment":{"summary":[{"kind":"text","text":"Returns the maximum amount of memory that the Java VM will attempt to use. If there is no inherent limit then "},{"kind":"code","text":"`Number.MAX_SAFE_INTEGER`"},{"kind":"text","text":" is returned."}],"blockTags":[{"tag":"@returns","content":[{"kind":"text","text":"Returns a promise that resolves to the maximum available memory that the Java VM will use, in bytes."}]},{"tag":"@example","content":[{"kind":"code","text":"```js\nawait Device.getMaxMemoryAsync();\n// 402653184\n```"}]},{"tag":"@platform","content":[{"kind":"text","text":"android"}]}]},"type":{"type":"reference","typeArguments":[{"type":"intrinsic","name":"number"}],"name":"Promise","qualifiedName":"Promise","package":"typescript"}}]},{"name":"getPlatformFeaturesAsync","kind":64,"signatures":[{"name":"getPlatformFeaturesAsync","kind":4096,"comment":{"summary":[{"kind":"text","text":"Gets a list of features that are available on the system. The feature names are platform-specific.\nSee [Android documentation]()\nto learn more about this implementation."}],"blockTags":[{"tag":"@returns","content":[{"kind":"text","text":"Returns a promise that resolves to an array of strings, each of which is a platform-specific name of a feature available on the current device.\nOn iOS and web, the promise always resolves to an empty array."}]},{"tag":"@example","content":[{"kind":"code","text":"```js\nawait Device.getPlatformFeaturesAsync();\n// [\n// 'android.software.adoptable_storage',\n// 'android.software.backup',\n// 'android.hardware.sensor.accelerometer',\n// 'android.hardware.touchscreen',\n// ]\n```"}]},{"tag":"@platform","content":[{"kind":"text","text":"android"}]}]},"type":{"type":"reference","typeArguments":[{"type":"array","elementType":{"type":"intrinsic","name":"string"}}],"name":"Promise","qualifiedName":"Promise","package":"typescript"}}]},{"name":"getUptimeAsync","kind":64,"signatures":[{"name":"getUptimeAsync","kind":4096,"comment":{"summary":[{"kind":"text","text":"Gets the uptime since the last reboot of the device, in milliseconds. Android devices do not count time spent in deep sleep."}],"blockTags":[{"tag":"@returns","content":[{"kind":"text","text":"Returns a promise that resolves to a "},{"kind":"code","text":"`number`"},{"kind":"text","text":" that represents the milliseconds since last reboot."}]},{"tag":"@example","content":[{"kind":"code","text":"```js\nawait Device.getUptimeAsync();\n// 4371054\n```"}]},{"tag":"@platform","content":[{"kind":"text","text":"android"}]},{"tag":"@platform","content":[{"kind":"text","text":"ios"}]}]},"type":{"type":"reference","typeArguments":[{"type":"intrinsic","name":"number"}],"name":"Promise","qualifiedName":"Promise","package":"typescript"}}]},{"name":"hasPlatformFeatureAsync","kind":64,"signatures":[{"name":"hasPlatformFeatureAsync","kind":4096,"comment":{"summary":[{"kind":"text","text":"Tells if the device has a specific system feature."}],"blockTags":[{"tag":"@returns","content":[{"kind":"text","text":"Returns a promise that resolves to a boolean value indicating whether the device has the specified system feature.\nOn iOS and web, the promise always resolves to "},{"kind":"code","text":"`false`"},{"kind":"text","text":"."}]},{"tag":"@example","content":[{"kind":"code","text":"```js\nawait Device.hasPlatformFeatureAsync('amazon.hardware.fire_tv');\n// true or false\n```"}]},{"tag":"@platform","content":[{"kind":"text","text":"android"}]}]},"parameters":[{"name":"feature","kind":32768,"comment":{"summary":[{"kind":"text","text":"The platform-specific name of the feature to check for on the device. You can get all available system features with "},{"kind":"code","text":"`Device.getSystemFeatureAsync()`"},{"kind":"text","text":".\nSee [Android documentation]() to view acceptable feature strings."}]},"type":{"type":"intrinsic","name":"string"}}],"type":{"type":"reference","typeArguments":[{"type":"intrinsic","name":"boolean"}],"name":"Promise","qualifiedName":"Promise","package":"typescript"}}]},{"name":"isRootedExperimentalAsync","kind":64,"signatures":[{"name":"isRootedExperimentalAsync","kind":4096,"comment":{"summary":[{"kind":"text","text":"> **warning** This method is experimental and is not completely reliable. See description below.\n\nChecks whether the device has been rooted (Android) or jailbroken (iOS). This is not completely reliable because there exist solutions to bypass root-detection\non both [iOS](https://www.theiphonewiki.com/wiki/XCon) and [Android](https://tweakerlinks.com/how-to-bypass-apps-root-detection-in-android-device/).\nFurther, many root-detection checks can be bypassed via reverse engineering.\n- On Android, it's implemented in a way to find all possible files paths that contain the "},{"kind":"code","text":"`\"su\"`"},{"kind":"text","text":" executable but some devices that are not rooted may also have this executable. Therefore, there's no guarantee that this method will always return correctly.\n- On iOS, [these jailbreak checks](https://www.theiphonewiki.com/wiki/Bypassing_Jailbreak_Detection) are used to detect if a device is rooted/jailbroken. However, since there are closed-sourced solutions such as [xCon](https://www.theiphonewiki.com/wiki/XCon) that aim to hook every known method and function responsible for informing an application of a jailbroken device, this method may not reliably detect devices that have xCon or similar packages installed.\n- On web, this always resolves to "},{"kind":"code","text":"`false`"},{"kind":"text","text":" even if the device is rooted."}],"blockTags":[{"tag":"@returns","content":[{"kind":"text","text":"Returns a promise that resolves to a "},{"kind":"code","text":"`boolean`"},{"kind":"text","text":" that specifies whether this device is rooted."}]},{"tag":"@example","content":[{"kind":"code","text":"```js\nawait Device.isRootedExperimentalAsync();\n// true or false\n```"}]}]},"type":{"type":"reference","typeArguments":[{"type":"intrinsic","name":"boolean"}],"name":"Promise","qualifiedName":"Promise","package":"typescript"}}]},{"name":"isSideLoadingEnabledAsync","kind":64,"signatures":[{"name":"isSideLoadingEnabledAsync","kind":4096,"comment":{"summary":[{"kind":"text","text":"**Using this method requires you to [add the "},{"kind":"code","text":"`REQUEST_INSTALL_PACKAGES`"},{"kind":"text","text":" permission](/config/app#permissions).**\nReturns whether applications can be installed for this user via the system's [Intent#ACTION_INSTALL_PACKAGE](https://developer.android.com/reference/android/content/Intent.html#ACTION_INSTALL_PACKAGE)\nmechanism rather than through the OS's default app store, like Google Play."}],"blockTags":[{"tag":"@returns","content":[{"kind":"text","text":"Returns a promise that resolves to a "},{"kind":"code","text":"`boolean`"},{"kind":"text","text":" that represents whether the calling package is allowed to request package installation."}]},{"tag":"@example","content":[{"kind":"code","text":"```js\nawait Device.isSideLoadingEnabledAsync();\n// true or false\n```"}]},{"tag":"@platform","content":[{"kind":"text","text":"android"}]}]},"type":{"type":"reference","typeArguments":[{"type":"intrinsic","name":"boolean"}],"name":"Promise","qualifiedName":"Promise","package":"typescript"}}]}]}
\ No newline at end of file
+{"name":"expo-device","kind":1,"children":[{"name":"DeviceType","kind":8,"comment":{"summary":[{"kind":"text","text":"An enum representing the different types of devices supported by Expo."}]},"children":[{"name":"DESKTOP","kind":16,"comment":{"summary":[{"kind":"text","text":"Desktop or laptop computers, typically with a keyboard and mouse."}]},"type":{"type":"literal","value":3}},{"name":"PHONE","kind":16,"comment":{"summary":[{"kind":"text","text":"Mobile phone handsets, typically with a touch screen and held in one hand."}]},"type":{"type":"literal","value":1}},{"name":"TABLET","kind":16,"comment":{"summary":[{"kind":"text","text":"Tablet computers, typically with a touch screen that is larger than a usual phone."}]},"type":{"type":"literal","value":2}},{"name":"TV","kind":16,"comment":{"summary":[{"kind":"text","text":"Device with TV-based interfaces."}]},"type":{"type":"literal","value":4}},{"name":"UNKNOWN","kind":16,"comment":{"summary":[{"kind":"text","text":"An unrecognized device type."}]},"type":{"type":"literal","value":0}}]},{"name":"brand","kind":32,"flags":{"isConst":true},"comment":{"summary":[{"kind":"text","text":"The device brand. The consumer-visible brand of the product/hardware. On web, this value is always "},{"kind":"code","text":"`null`"},{"kind":"text","text":"."}],"blockTags":[{"tag":"@example","content":[{"kind":"code","text":"```js\nDevice.brand; // Android: \"google\", \"xiaomi\"; iOS: \"Apple\"; web: null\n```"}]},{"tag":"@platform","content":[{"kind":"text","text":"android"}]},{"tag":"@platform","content":[{"kind":"text","text":"ios"}]}]},"type":{"type":"union","types":[{"type":"intrinsic","name":"string"},{"type":"literal","value":null}]},"defaultValue":"..."},{"name":"designName","kind":32,"flags":{"isConst":true},"comment":{"summary":[{"kind":"text","text":"The specific configuration or name of the industrial design. It represents the device's name when it was designed during manufacturing into mass production.\nOn Android, it corresponds to ["},{"kind":"code","text":"`Build.DEVICE`"},{"kind":"text","text":"](https://developer.android.com/reference/android/os/Build#DEVICE). On web and iOS, this value is always "},{"kind":"code","text":"`null`"},{"kind":"text","text":"."}],"blockTags":[{"tag":"@example","content":[{"kind":"code","text":"```js\nDevice.designName; // Android: \"kminilte\"; iOS: null; web: null\n```"}]},{"tag":"@platform","content":[{"kind":"text","text":"android"}]}]},"type":{"type":"union","types":[{"type":"intrinsic","name":"string"},{"type":"literal","value":null}]},"defaultValue":"..."},{"name":"deviceName","kind":32,"flags":{"isConst":true},"comment":{"summary":[{"kind":"text","text":"The human-readable name of the device, which may be set by the device's user. If the device name is unavailable, particularly on web, this value is "},{"kind":"code","text":"`null`"},{"kind":"text","text":".\n\n> On iOS 16 and newer, this value will be set to generic \"iPhone\" until you add the correct entitlement, see [iOS Capabilities page](/build-reference/ios-capabilities)\n> to learn how to add one and check out [Apple documentation](https://developer.apple.com/documentation/uikit/uidevice/1620015-name#discussion)\n> for more details on this change."}],"blockTags":[{"tag":"@example","content":[{"kind":"code","text":"```js\nDevice.deviceName; // \"Vivian's iPhone XS\"\n```"}]}]},"type":{"type":"union","types":[{"type":"intrinsic","name":"string"},{"type":"literal","value":null}]},"defaultValue":"..."},{"name":"deviceType","kind":32,"flags":{"isConst":true},"comment":{"summary":[{"kind":"text","text":"The type of the device as a ["},{"kind":"code","text":"`DeviceType`"},{"kind":"text","text":"](#devicetype) enum value.\n\nOn Android, for devices other than TVs, the device type is determined by the screen resolution (screen diagonal size), so the result may not be completely accurate.\nIf the screen diagonal length is between 3\" and 6.9\", the method returns "},{"kind":"code","text":"`DeviceType.PHONE`"},{"kind":"text","text":". For lengths between 7\" and 18\", the method returns "},{"kind":"code","text":"`DeviceType.TABLET`"},{"kind":"text","text":".\nOtherwise, the method returns "},{"kind":"code","text":"`DeviceType.UNKNOWN`"},{"kind":"text","text":"."}],"blockTags":[{"tag":"@example","content":[{"kind":"code","text":"```js\nDevice.deviceType; // UNKNOWN, PHONE, TABLET, TV, DESKTOP\n```"}]}]},"type":{"type":"union","types":[{"type":"reference","name":"DeviceType"},{"type":"literal","value":null}]},"defaultValue":"..."},{"name":"deviceYearClass","kind":32,"flags":{"isConst":true},"comment":{"summary":[{"kind":"text","text":"The [device year class](https://github.com/facebook/device-year-class) of this device. On web, this value is always "},{"kind":"code","text":"`null`"},{"kind":"text","text":"."}]},"type":{"type":"union","types":[{"type":"intrinsic","name":"number"},{"type":"literal","value":null}]},"defaultValue":"..."},{"name":"isDevice","kind":32,"flags":{"isConst":true},"comment":{"summary":[{"kind":"code","text":"`true`"},{"kind":"text","text":" if the app is running on a real device and "},{"kind":"code","text":"`false`"},{"kind":"text","text":" if running in a simulator or emulator.\nOn web, this is always set to "},{"kind":"code","text":"`true`"},{"kind":"text","text":"."}]},"type":{"type":"intrinsic","name":"boolean"},"defaultValue":"..."},{"name":"manufacturer","kind":32,"flags":{"isConst":true},"comment":{"summary":[{"kind":"text","text":"The actual device manufacturer of the product or hardware. This value of this field may be "},{"kind":"code","text":"`null`"},{"kind":"text","text":" if it cannot be determined.\n\nTo view difference between "},{"kind":"code","text":"`brand`"},{"kind":"text","text":" and "},{"kind":"code","text":"`manufacturer`"},{"kind":"text","text":" on Android see [official documentation](https://developer.android.com/reference/android/os/Build)."}],"blockTags":[{"tag":"@example","content":[{"kind":"code","text":"```js\nDevice.manufacturer; // Android: \"Google\", \"xiaomi\"; iOS: \"Apple\"; web: \"Google\", null\n```"}]}]},"type":{"type":"union","types":[{"type":"intrinsic","name":"string"},{"type":"literal","value":null}]},"defaultValue":"..."},{"name":"modelId","kind":32,"flags":{"isConst":true},"comment":{"summary":[{"kind":"text","text":"The internal model ID of the device. This is useful for programmatically identifying the type of device and is not a human-friendly string.\nOn web and Android, this value is always "},{"kind":"code","text":"`null`"},{"kind":"text","text":"."}],"blockTags":[{"tag":"@example","content":[{"kind":"code","text":"```js\nDevice.modelId; // iOS: \"iPhone7,2\"; Android: null; web: null\n```"}]},{"tag":"@platform","content":[{"kind":"text","text":"ios"}]}]},"type":{"type":"intrinsic","name":"any"},"defaultValue":"..."},{"name":"modelName","kind":32,"flags":{"isConst":true},"comment":{"summary":[{"kind":"text","text":"The human-friendly name of the device model. This is the name that people would typically use to refer to the device rather than a programmatic model identifier.\nThis value of this field may be "},{"kind":"code","text":"`null`"},{"kind":"text","text":" if it cannot be determined."}],"blockTags":[{"tag":"@example","content":[{"kind":"code","text":"```js\nDevice.modelName; // Android: \"Pixel 2\"; iOS: \"iPhone XS Max\"; web: \"iPhone\", null\n```"}]}]},"type":{"type":"union","types":[{"type":"intrinsic","name":"string"},{"type":"literal","value":null}]},"defaultValue":"..."},{"name":"osBuildFingerprint","kind":32,"flags":{"isConst":true},"comment":{"summary":[{"kind":"text","text":"A string that uniquely identifies the build of the currently running system OS. On Android, it follows this template:\n- "},{"kind":"code","text":"`$(BRAND)/$(PRODUCT)/$(DEVICE)/$(BOARD):$(VERSION.RELEASE)/$(ID)/$(VERSION.INCREMENTAL):$(TYPE)/\\$(TAGS)`"},{"kind":"text","text":"\nOn web and iOS, this value is always "},{"kind":"code","text":"`null`"},{"kind":"text","text":"."}],"blockTags":[{"tag":"@example","content":[{"kind":"code","text":"```js\nDevice.osBuildFingerprint;\n// Android: \"google/sdk_gphone_x86/generic_x86:9/PSR1.180720.075/5124027:user/release-keys\";\n// iOS: null; web: null\n```"}]},{"tag":"@platform","content":[{"kind":"text","text":"android"}]}]},"type":{"type":"union","types":[{"type":"intrinsic","name":"string"},{"type":"literal","value":null}]},"defaultValue":"..."},{"name":"osBuildId","kind":32,"flags":{"isConst":true},"comment":{"summary":[{"kind":"text","text":"The build ID of the OS that more precisely identifies the version of the OS. On Android, this corresponds to "},{"kind":"code","text":"`Build.DISPLAY`"},{"kind":"text","text":" (not "},{"kind":"code","text":"`Build.ID`"},{"kind":"text","text":")\nand currently is a string as described [here](https://source.android.com/setup/start/build-numbers). On iOS, this corresponds to "},{"kind":"code","text":"`kern.osversion`"},{"kind":"text","text":"\nand is the detailed OS version sometimes displayed next to the more human-readable version. On web, this value is always "},{"kind":"code","text":"`null`"},{"kind":"text","text":"."}],"blockTags":[{"tag":"@example","content":[{"kind":"code","text":"```js\nDevice.osBuildId; // Android: \"PSR1.180720.075\"; iOS: \"16F203\"; web: null\n```"}]}]},"type":{"type":"union","types":[{"type":"intrinsic","name":"string"},{"type":"literal","value":null}]},"defaultValue":"..."},{"name":"osInternalBuildId","kind":32,"flags":{"isConst":true},"comment":{"summary":[{"kind":"text","text":"The internal build ID of the OS running on the device. On Android, this corresponds to "},{"kind":"code","text":"`Build.ID`"},{"kind":"text","text":".\nOn iOS, this is the same value as ["},{"kind":"code","text":"`Device.osBuildId`"},{"kind":"text","text":"](#deviceosbuildid). On web, this value is always "},{"kind":"code","text":"`null`"},{"kind":"text","text":"."}],"blockTags":[{"tag":"@example","content":[{"kind":"code","text":"```js\nDevice.osInternalBuildId; // Android: \"MMB29K\"; iOS: \"16F203\"; web: null,\n```"}]}]},"type":{"type":"union","types":[{"type":"intrinsic","name":"string"},{"type":"literal","value":null}]},"defaultValue":"..."},{"name":"osName","kind":32,"flags":{"isConst":true},"comment":{"summary":[{"kind":"text","text":"The name of the OS running on the device."}],"blockTags":[{"tag":"@example","content":[{"kind":"code","text":"```js\nDevice.osName; // Android: \"Android\"; iOS: \"iOS\" or \"iPadOS\"; web: \"iOS\", \"Android\", \"Windows\"\n```"}]}]},"type":{"type":"union","types":[{"type":"intrinsic","name":"string"},{"type":"literal","value":null}]},"defaultValue":"..."},{"name":"osVersion","kind":32,"flags":{"isConst":true},"comment":{"summary":[{"kind":"text","text":"The human-readable OS version string. Note that the version string may not always contain three numbers separated by dots."}],"blockTags":[{"tag":"@example","content":[{"kind":"code","text":"```js\nDevice.osVersion; // Android: \"4.0.3\"; iOS: \"12.3.1\"; web: \"11.0\", \"8.1.0\"\n```"}]}]},"type":{"type":"union","types":[{"type":"intrinsic","name":"string"},{"type":"literal","value":null}]},"defaultValue":"..."},{"name":"platformApiLevel","kind":32,"flags":{"isConst":true},"comment":{"summary":[{"kind":"text","text":"The Android SDK version of the software currently running on this hardware device. This value never changes while a device is booted,\nbut it may increase when the hardware manufacturer provides an OS update. See [here](https://developer.android.com/reference/android/os/Build.VERSION_CODES.html)\nto see all possible version codes and corresponding versions. On iOS and web, this value is always "},{"kind":"code","text":"`null`"},{"kind":"text","text":"."}],"blockTags":[{"tag":"@example","content":[{"kind":"code","text":"```js\nDevice.platformApiLevel; // Android: 19; iOS: null; web: null\n```"}]},{"tag":"@platform","content":[{"kind":"text","text":"android"}]}]},"type":{"type":"union","types":[{"type":"intrinsic","name":"number"},{"type":"literal","value":null}]},"defaultValue":"..."},{"name":"productName","kind":32,"flags":{"isConst":true},"comment":{"summary":[{"kind":"text","text":"The device's overall product name chosen by the device implementer containing the development name or code name of the device.\nCorresponds to ["},{"kind":"code","text":"`Build.PRODUCT`"},{"kind":"text","text":"](https://developer.android.com/reference/android/os/Build#PRODUCT). On web and iOS, this value is always "},{"kind":"code","text":"`null`"},{"kind":"text","text":"."}],"blockTags":[{"tag":"@example","content":[{"kind":"code","text":"```js\nDevice.productName; // Android: \"kminiltexx\"; iOS: null; web: null\n```"}]},{"tag":"@platform","content":[{"kind":"text","text":"android"}]}]},"type":{"type":"union","types":[{"type":"intrinsic","name":"string"},{"type":"literal","value":null}]},"defaultValue":"..."},{"name":"supportedCpuArchitectures","kind":32,"flags":{"isConst":true},"comment":{"summary":[{"kind":"text","text":"A list of supported processor architecture versions. The device expects the binaries it runs to be compiled for one of these architectures.\nThis value is "},{"kind":"code","text":"`null`"},{"kind":"text","text":" if the supported architectures could not be determined, particularly on web."}],"blockTags":[{"tag":"@example","content":[{"kind":"code","text":"```js\nDevice.supportedCpuArchitectures; // ['arm64 v8', 'Intel x86-64h Haswell', 'arm64-v8a', 'armeabi-v7a\", 'armeabi']\n```"}]}]},"type":{"type":"union","types":[{"type":"array","elementType":{"type":"intrinsic","name":"string"}},{"type":"literal","value":null}]},"defaultValue":"..."},{"name":"totalMemory","kind":32,"flags":{"isConst":true},"comment":{"summary":[{"kind":"text","text":"The device's total memory, in bytes. This is the total memory accessible to the kernel, but not necessarily to a single app.\nThis is basically the amount of RAM the device has, not including below-kernel fixed allocations like DMA buffers, RAM for the baseband CPU, etc…\nOn web, this value is always "},{"kind":"code","text":"`null`"},{"kind":"text","text":"."}],"blockTags":[{"tag":"@example","content":[{"kind":"code","text":"```js\nDevice.totalMemory; // 17179869184\n```"}]}]},"type":{"type":"union","types":[{"type":"intrinsic","name":"number"},{"type":"literal","value":null}]},"defaultValue":"..."},{"name":"getDeviceTypeAsync","kind":64,"signatures":[{"name":"getDeviceTypeAsync","kind":4096,"comment":{"summary":[{"kind":"text","text":"Checks the type of the device as a ["},{"kind":"code","text":"`DeviceType`"},{"kind":"text","text":"](#devicetype) enum value.\n\nOn Android, for devices other than TVs, the device type is determined by the screen resolution (screen diagonal size), so the result may not be completely accurate.\nIf the screen diagonal length is between 3\" and 6.9\", the method returns "},{"kind":"code","text":"`DeviceType.PHONE`"},{"kind":"text","text":". For lengths between 7\" and 18\", the method returns "},{"kind":"code","text":"`DeviceType.TABLET`"},{"kind":"text","text":".\nOtherwise, the method returns "},{"kind":"code","text":"`DeviceType.UNKNOWN`"},{"kind":"text","text":"."}],"blockTags":[{"tag":"@returns","content":[{"kind":"text","text":"Returns a promise that resolves to a ["},{"kind":"code","text":"`DeviceType`"},{"kind":"text","text":"](#devicetype) enum value."}]},{"tag":"@example","content":[{"kind":"code","text":"```js\nawait Device.getDeviceTypeAsync();\n// DeviceType.PHONE\n```"}]}]},"type":{"type":"reference","typeArguments":[{"type":"reference","name":"DeviceType"}],"name":"Promise","qualifiedName":"Promise","package":"typescript"}}]},{"name":"getMaxMemoryAsync","kind":64,"signatures":[{"name":"getMaxMemoryAsync","kind":4096,"comment":{"summary":[{"kind":"text","text":"Returns the maximum amount of memory that the Java VM will attempt to use. If there is no inherent limit then "},{"kind":"code","text":"`Number.MAX_SAFE_INTEGER`"},{"kind":"text","text":" is returned."}],"blockTags":[{"tag":"@returns","content":[{"kind":"text","text":"Returns a promise that resolves to the maximum available memory that the Java VM will use, in bytes."}]},{"tag":"@example","content":[{"kind":"code","text":"```js\nawait Device.getMaxMemoryAsync();\n// 402653184\n```"}]},{"tag":"@platform","content":[{"kind":"text","text":"android"}]}]},"type":{"type":"reference","typeArguments":[{"type":"intrinsic","name":"number"}],"name":"Promise","qualifiedName":"Promise","package":"typescript"}}]},{"name":"getPlatformFeaturesAsync","kind":64,"signatures":[{"name":"getPlatformFeaturesAsync","kind":4096,"comment":{"summary":[{"kind":"text","text":"Gets a list of features that are available on the system. The feature names are platform-specific.\nSee [Android documentation]()\nto learn more about this implementation."}],"blockTags":[{"tag":"@returns","content":[{"kind":"text","text":"Returns a promise that resolves to an array of strings, each of which is a platform-specific name of a feature available on the current device.\nOn iOS and web, the promise always resolves to an empty array."}]},{"tag":"@example","content":[{"kind":"code","text":"```js\nawait Device.getPlatformFeaturesAsync();\n// [\n// 'android.software.adoptable_storage',\n// 'android.software.backup',\n// 'android.hardware.sensor.accelerometer',\n// 'android.hardware.touchscreen',\n// ]\n```"}]},{"tag":"@platform","content":[{"kind":"text","text":"android"}]}]},"type":{"type":"reference","typeArguments":[{"type":"array","elementType":{"type":"intrinsic","name":"string"}}],"name":"Promise","qualifiedName":"Promise","package":"typescript"}}]},{"name":"getUptimeAsync","kind":64,"signatures":[{"name":"getUptimeAsync","kind":4096,"comment":{"summary":[{"kind":"text","text":"Gets the uptime since the last reboot of the device, in milliseconds. Android devices do not count time spent in deep sleep."}],"blockTags":[{"tag":"@returns","content":[{"kind":"text","text":"Returns a promise that resolves to a "},{"kind":"code","text":"`number`"},{"kind":"text","text":" that represents the milliseconds since last reboot."}]},{"tag":"@example","content":[{"kind":"code","text":"```js\nawait Device.getUptimeAsync();\n// 4371054\n```"}]},{"tag":"@platform","content":[{"kind":"text","text":"android"}]},{"tag":"@platform","content":[{"kind":"text","text":"ios"}]}]},"type":{"type":"reference","typeArguments":[{"type":"intrinsic","name":"number"}],"name":"Promise","qualifiedName":"Promise","package":"typescript"}}]},{"name":"hasPlatformFeatureAsync","kind":64,"signatures":[{"name":"hasPlatformFeatureAsync","kind":4096,"comment":{"summary":[{"kind":"text","text":"Tells if the device has a specific system feature."}],"blockTags":[{"tag":"@returns","content":[{"kind":"text","text":"Returns a promise that resolves to a boolean value indicating whether the device has the specified system feature.\nOn iOS and web, the promise always resolves to "},{"kind":"code","text":"`false`"},{"kind":"text","text":"."}]},{"tag":"@example","content":[{"kind":"code","text":"```js\nawait Device.hasPlatformFeatureAsync('amazon.hardware.fire_tv');\n// true or false\n```"}]},{"tag":"@platform","content":[{"kind":"text","text":"android"}]}]},"parameters":[{"name":"feature","kind":32768,"comment":{"summary":[{"kind":"text","text":"The platform-specific name of the feature to check for on the device. You can get all available system features with "},{"kind":"code","text":"`Device.getSystemFeatureAsync()`"},{"kind":"text","text":".\nSee [Android documentation]() to view acceptable feature strings."}]},"type":{"type":"intrinsic","name":"string"}}],"type":{"type":"reference","typeArguments":[{"type":"intrinsic","name":"boolean"}],"name":"Promise","qualifiedName":"Promise","package":"typescript"}}]},{"name":"isRootedExperimentalAsync","kind":64,"signatures":[{"name":"isRootedExperimentalAsync","kind":4096,"comment":{"summary":[{"kind":"text","text":"> **warning** This method is experimental and is not completely reliable. See description below.\n\nChecks whether the device has been rooted (Android) or jailbroken (iOS). This is not completely reliable because there exist solutions to bypass root-detection\non both [iOS](https://www.theiphonewiki.com/wiki/XCon) and [Android](https://tweakerlinks.com/how-to-bypass-apps-root-detection-in-android-device/).\nFurther, many root-detection checks can be bypassed via reverse engineering.\n- On Android, it's implemented in a way to find all possible files paths that contain the "},{"kind":"code","text":"`\"su\"`"},{"kind":"text","text":" executable but some devices that are not rooted may also have this executable. Therefore, there's no guarantee that this method will always return correctly.\n- On iOS, [these jailbreak checks](https://www.theiphonewiki.com/wiki/Bypassing_Jailbreak_Detection) are used to detect if a device is rooted/jailbroken. However, since there are closed-sourced solutions such as [xCon](https://www.theiphonewiki.com/wiki/XCon) that aim to hook every known method and function responsible for informing an application of a jailbroken device, this method may not reliably detect devices that have xCon or similar packages installed.\n- On web, this always resolves to "},{"kind":"code","text":"`false`"},{"kind":"text","text":" even if the device is rooted."}],"blockTags":[{"tag":"@returns","content":[{"kind":"text","text":"Returns a promise that resolves to a "},{"kind":"code","text":"`boolean`"},{"kind":"text","text":" that specifies whether this device is rooted."}]},{"tag":"@example","content":[{"kind":"code","text":"```js\nawait Device.isRootedExperimentalAsync();\n// true or false\n```"}]}]},"type":{"type":"reference","typeArguments":[{"type":"intrinsic","name":"boolean"}],"name":"Promise","qualifiedName":"Promise","package":"typescript"}}]},{"name":"isSideLoadingEnabledAsync","kind":64,"signatures":[{"name":"isSideLoadingEnabledAsync","kind":4096,"comment":{"summary":[{"kind":"text","text":"**Using this method requires you to [add the "},{"kind":"code","text":"`REQUEST_INSTALL_PACKAGES`"},{"kind":"text","text":" permission](/config/app#permissions).**\nReturns whether applications can be installed for this user via the system's [Intent#ACTION_INSTALL_PACKAGE](https://developer.android.com/reference/android/content/Intent.html#ACTION_INSTALL_PACKAGE)\nmechanism rather than through the OS's default app store, like Google Play."}],"blockTags":[{"tag":"@returns","content":[{"kind":"text","text":"Returns a promise that resolves to a "},{"kind":"code","text":"`boolean`"},{"kind":"text","text":" that represents whether the calling package is allowed to request package installation."}]},{"tag":"@example","content":[{"kind":"code","text":"```js\nawait Device.isSideLoadingEnabledAsync();\n// true or false\n```"}]},{"tag":"@platform","content":[{"kind":"text","text":"android"}]}]},"type":{"type":"reference","typeArguments":[{"type":"intrinsic","name":"boolean"}],"name":"Promise","qualifiedName":"Promise","package":"typescript"}}]}]}
\ No newline at end of file
diff --git a/docs/public/static/data/unversioned/expo-document-picker.json b/docs/public/static/data/unversioned/expo-document-picker.json
index 2aa8f42d61532..ad295d193a47b 100644
--- a/docs/public/static/data/unversioned/expo-document-picker.json
+++ b/docs/public/static/data/unversioned/expo-document-picker.json
@@ -1 +1 @@
-{"name":"expo-document-picker","kind":1,"children":[{"name":"DocumentPickerOptions","kind":4194304,"type":{"type":"reflection","declaration":{"name":"__type","kind":65536,"children":[{"name":"copyToCacheDirectory","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"If "},{"kind":"code","text":"`true`"},{"kind":"text","text":", the picked file is copied to ["},{"kind":"code","text":"`FileSystem.CacheDirectory`"},{"kind":"text","text":"](./filesystem#filesystemcachedirectory),\nwhich allows other Expo APIs to read the file immediately. This may impact performance for\nlarge files, so you should consider setting this to "},{"kind":"code","text":"`false`"},{"kind":"text","text":" if you expect users to pick\nparticularly large files and your app does not need immediate read access."}],"blockTags":[{"tag":"@default","content":[{"kind":"text","text":"true"}]}]},"type":{"type":"intrinsic","name":"boolean"}},{"name":"multiple","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"Allows multiple files to be selected from the system UI."}],"blockTags":[{"tag":"@default","content":[{"kind":"text","text":"false"}]},{"tag":"@platform","content":[{"kind":"text","text":"web"}]}]},"type":{"type":"intrinsic","name":"boolean"}},{"name":"type","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"The [MIME type(s)](https://en.wikipedia.org/wiki/Media_type) of the documents that are available\nto be picked. It also supports wildcards like "},{"kind":"code","text":"`'image/*'`"},{"kind":"text","text":" to choose any image. To allow any type\nof document you can use "},{"kind":"code","text":"`'*/*'`"},{"kind":"text","text":"."}],"blockTags":[{"tag":"@default","content":[{"kind":"text","text":"'*/*'"}]}]},"type":{"type":"union","types":[{"type":"intrinsic","name":"string"},{"type":"array","elementType":{"type":"intrinsic","name":"string"}}]}}]}}},{"name":"DocumentResult","kind":4194304,"comment":{"summary":[{"kind":"text","text":"First object represents the result when the document pick has been cancelled.\nThe second one represents the successful document pick result."}]},"type":{"type":"union","types":[{"type":"reflection","declaration":{"name":"__type","kind":65536,"children":[{"name":"type","kind":1024,"comment":{"summary":[{"kind":"text","text":"Field indicating that the document pick has been cancelled."}]},"type":{"type":"literal","value":"cancel"}}]}},{"type":"reflection","declaration":{"name":"__type","kind":65536,"children":[{"name":"file","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"code","text":"`File`"},{"kind":"text","text":" object for the parity with web File API."}],"blockTags":[{"tag":"@platform","content":[{"kind":"text","text":"web"}]}]},"type":{"type":"reference","name":"File","qualifiedName":"File","package":"typescript"}},{"name":"lastModified","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"Timestamp of last document modification."}]},"type":{"type":"intrinsic","name":"number"}},{"name":"mimeType","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"Document MIME type."}]},"type":{"type":"intrinsic","name":"string"}},{"name":"name","kind":1024,"comment":{"summary":[{"kind":"text","text":"Document original name."}]},"type":{"type":"intrinsic","name":"string"}},{"name":"output","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"code","text":"`FileList`"},{"kind":"text","text":" object for the parity with web File API."}],"blockTags":[{"tag":"@platform","content":[{"kind":"text","text":"web"}]}]},"type":{"type":"union","types":[{"type":"reference","name":"FileList","qualifiedName":"FileList","package":"typescript"},{"type":"literal","value":null}]}},{"name":"size","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"Document size in bytes."}]},"type":{"type":"intrinsic","name":"number"}},{"name":"type","kind":1024,"comment":{"summary":[{"kind":"text","text":"Field indicating that the document pick has been successful."}]},"type":{"type":"literal","value":"success"}},{"name":"uri","kind":1024,"comment":{"summary":[{"kind":"text","text":"An URI to the local document file."}]},"type":{"type":"intrinsic","name":"string"}}]}}]}},{"name":"getDocumentAsync","kind":64,"signatures":[{"name":"getDocumentAsync","kind":4096,"comment":{"summary":[{"kind":"text","text":"Display the system UI for choosing a document. By default, the chosen file is copied to [the app's internal cache directory](filesystem.md#filesystemcachedirectory).\n> **Notes for Web:** The system UI can only be shown after user activation (e.g. a "},{"kind":"code","text":"`Button`"},{"kind":"text","text":" press).\n> Therefore, calling "},{"kind":"code","text":"`getDocumentAsync`"},{"kind":"text","text":" in "},{"kind":"code","text":"`componentDidMount`"},{"kind":"text","text":", for example, will **not** work as\n> intended. The "},{"kind":"code","text":"`cancel`"},{"kind":"text","text":" event will not be returned in the browser due to platform restrictions and\n> inconsistencies across browsers."}],"blockTags":[{"tag":"@returns","content":[{"kind":"text","text":"On success returns a promise that fulfils with ["},{"kind":"code","text":"`DocumentResult`"},{"kind":"text","text":"](#documentresult) object.\n\nIf the user cancelled the document picking, the promise resolves to "},{"kind":"code","text":"`{ type: 'cancel' }`"},{"kind":"text","text":"."}]}]},"parameters":[{"name":"__namedParameters","kind":32768,"type":{"type":"reference","name":"DocumentPickerOptions"},"defaultValue":"{}"}],"type":{"type":"reference","typeArguments":[{"type":"reference","name":"DocumentResult"}],"name":"Promise","qualifiedName":"Promise","package":"typescript"}}]}]}
\ No newline at end of file
+{"name":"expo-document-picker","kind":1,"children":[{"name":"DocumentPickerAsset","kind":4194304,"type":{"type":"reflection","declaration":{"name":"__type","kind":65536,"children":[{"name":"file","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"code","text":"`File`"},{"kind":"text","text":" object for the parity with web File API."}],"blockTags":[{"tag":"@platform","content":[{"kind":"text","text":"web"}]}]},"type":{"type":"reference","name":"File","qualifiedName":"File","package":"typescript"}},{"name":"lastModified","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"Timestamp of last document modification."}]},"type":{"type":"intrinsic","name":"number"}},{"name":"mimeType","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"Document MIME type."}]},"type":{"type":"intrinsic","name":"string"}},{"name":"name","kind":1024,"comment":{"summary":[{"kind":"text","text":"Document original name."}]},"type":{"type":"intrinsic","name":"string"}},{"name":"output","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"code","text":"`FileList`"},{"kind":"text","text":" object for the parity with web File API."}],"blockTags":[{"tag":"@platform","content":[{"kind":"text","text":"web"}]}]},"type":{"type":"union","types":[{"type":"reference","name":"FileList","qualifiedName":"FileList","package":"typescript"},{"type":"literal","value":null}]}},{"name":"size","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"Document size in bytes."}]},"type":{"type":"intrinsic","name":"number"}},{"name":"uri","kind":1024,"comment":{"summary":[{"kind":"text","text":"An URI to the local document file."}]},"type":{"type":"intrinsic","name":"string"}}]}}},{"name":"DocumentPickerOptions","kind":4194304,"type":{"type":"reflection","declaration":{"name":"__type","kind":65536,"children":[{"name":"copyToCacheDirectory","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"If "},{"kind":"code","text":"`true`"},{"kind":"text","text":", the picked file is copied to ["},{"kind":"code","text":"`FileSystem.CacheDirectory`"},{"kind":"text","text":"](./filesystem#filesystemcachedirectory),\nwhich allows other Expo APIs to read the file immediately. This may impact performance for\nlarge files, so you should consider setting this to "},{"kind":"code","text":"`false`"},{"kind":"text","text":" if you expect users to pick\nparticularly large files and your app does not need immediate read access."}],"blockTags":[{"tag":"@default","content":[{"kind":"text","text":"true"}]}]},"type":{"type":"intrinsic","name":"boolean"}},{"name":"multiple","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"Allows multiple files to be selected from the system UI."}],"blockTags":[{"tag":"@default","content":[{"kind":"text","text":"false"}]}]},"type":{"type":"intrinsic","name":"boolean"}},{"name":"type","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"The [MIME type(s)](https://en.wikipedia.org/wiki/Media_type) of the documents that are available\nto be picked. It also supports wildcards like "},{"kind":"code","text":"`'image/*'`"},{"kind":"text","text":" to choose any image. To allow any type\nof document you can use "},{"kind":"code","text":"`'*/*'`"},{"kind":"text","text":"."}],"blockTags":[{"tag":"@default","content":[{"kind":"text","text":"'*/*'"}]}]},"type":{"type":"union","types":[{"type":"intrinsic","name":"string"},{"type":"array","elementType":{"type":"intrinsic","name":"string"}}]}}]}}},{"name":"DocumentPickerResult","kind":4194304,"type":{"type":"intersection","types":[{"type":"reflection","declaration":{"name":"__type","kind":65536,"children":[{"name":"assets","kind":1024,"comment":{"summary":[{"kind":"text","text":"An array of picked assets or "},{"kind":"code","text":"`null`"},{"kind":"text","text":" when the request was canceled."}]},"type":{"type":"union","types":[{"type":"array","elementType":{"type":"reference","name":"DocumentPickerAsset"}},{"type":"literal","value":null}]}},{"name":"canceled","kind":1024,"comment":{"summary":[{"kind":"text","text":"Boolean flag which shows if request was canceled. If asset data have been returned this should\nalways be "},{"kind":"code","text":"`false`"},{"kind":"text","text":"."}]},"type":{"type":"intrinsic","name":"boolean"}},{"name":"file","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"code","text":"`File`"},{"kind":"text","text":" object for the parity with web File API."}],"blockTags":[{"tag":"@platform","content":[{"kind":"text","text":"web"}]}]},"type":{"type":"reference","name":"File","qualifiedName":"File","package":"typescript"}},{"name":"lastModified","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"Timestamp of last document modification."}]},"type":{"type":"intrinsic","name":"number"}},{"name":"mimeType","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"Document MIME type."}]},"type":{"type":"intrinsic","name":"string"}},{"name":"name","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"Document original name."}]},"type":{"type":"intrinsic","name":"string"}},{"name":"output","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"code","text":"`FileList`"},{"kind":"text","text":" object for the parity with web File API."}],"blockTags":[{"tag":"@platform","content":[{"kind":"text","text":"web"}]}]},"type":{"type":"union","types":[{"type":"reference","name":"FileList","qualifiedName":"FileList","package":"typescript"},{"type":"literal","value":null}]}},{"name":"size","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"Document size in bytes."}]},"type":{"type":"intrinsic","name":"number"}},{"name":"type","kind":1024,"flags":{"isOptional":true},"type":{"type":"intrinsic","name":"string"}},{"name":"uri","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"An URI to the local document file."}]},"type":{"type":"intrinsic","name":"string"}}]}},{"type":"union","types":[{"type":"reference","name":"DocumentPickerSuccessResult"},{"type":"reference","name":"DocumentPickerCanceledResult"}]}]}},{"name":"getDocumentAsync","kind":64,"signatures":[{"name":"getDocumentAsync","kind":4096,"comment":{"summary":[{"kind":"text","text":"Display the system UI for choosing a document. By default, the chosen file is copied to [the app's internal cache directory](filesystem.md#filesystemcachedirectory).\n> **Notes for Web:** The system UI can only be shown after user activation (e.g. a "},{"kind":"code","text":"`Button`"},{"kind":"text","text":" press).\n> Therefore, calling "},{"kind":"code","text":"`getDocumentAsync`"},{"kind":"text","text":" in "},{"kind":"code","text":"`componentDidMount`"},{"kind":"text","text":", for example, will **not** work as\n> intended. The "},{"kind":"code","text":"`cancel`"},{"kind":"text","text":" event will not be returned in the browser due to platform restrictions and\n> inconsistencies across browsers."}],"blockTags":[{"tag":"@returns","content":[{"kind":"text","text":"On success returns a promise that fulfils with ["},{"kind":"code","text":"`DocumentResult`"},{"kind":"text","text":"](#documentresult) object.\n\nIf the user cancelled the document picking, the promise resolves to "},{"kind":"code","text":"`{ type: 'cancel' }`"},{"kind":"text","text":"."}]}]},"parameters":[{"name":"__namedParameters","kind":32768,"type":{"type":"reference","name":"DocumentPickerOptions"},"defaultValue":"{}"}],"type":{"type":"reference","typeArguments":[{"type":"reference","name":"DocumentPickerResult"}],"name":"Promise","qualifiedName":"Promise","package":"typescript"}}]}]}
\ No newline at end of file
diff --git a/docs/public/static/data/unversioned/expo-file-system.json b/docs/public/static/data/unversioned/expo-file-system.json
index 6da0d060f784e..787d25bc15108 100644
--- a/docs/public/static/data/unversioned/expo-file-system.json
+++ b/docs/public/static/data/unversioned/expo-file-system.json
@@ -1 +1 @@
-{"name":"expo-file-system","kind":1,"children":[{"name":"StorageAccessFramework","kind":4,"comment":{"summary":[{"kind":"text","text":"The "},{"kind":"code","text":"`StorageAccessFramework`"},{"kind":"text","text":" is a namespace inside of the "},{"kind":"code","text":"`expo-file-system`"},{"kind":"text","text":" module, which encapsulates all functions which can be used with [SAF URIs](#saf-uri).\nYou can read more about SAF in the [Android documentation](https://developer.android.com/guide/topics/providers/document-provider)."}],"blockTags":[{"tag":"@example","content":[{"kind":"text","text":"# Basic Usage\n\n"},{"kind":"code","text":"```ts\nimport { StorageAccessFramework } from 'expo-file-system';\n\n// Requests permissions for external directory\nconst permissions = await StorageAccessFramework.requestDirectoryPermissionsAsync();\n\nif (permissions.granted) {\n // Gets SAF URI from response\n const uri = permissions.directoryUri;\n\n // Gets all files inside of selected directory\n const files = await StorageAccessFramework.readDirectoryAsync(uri);\n alert(`Files inside ${uri}:\\n\\n${JSON.stringify(files)}`);\n}\n```"},{"kind":"text","text":"\n\n# Migrating an album\n\n"},{"kind":"code","text":"```ts\nimport * as MediaLibrary from 'expo-media-library';\nimport * as FileSystem from 'expo-file-system';\nconst { StorageAccessFramework } = FileSystem;\n\nasync function migrateAlbum(albumName: string) {\n // Gets SAF URI to the album\n const albumUri = StorageAccessFramework.getUriForDirectoryInRoot(albumName);\n\n // Requests permissions\n const permissions = await StorageAccessFramework.requestDirectoryPermissionsAsync(albumUri);\n if (!permissions.granted) {\n return;\n }\n\n const permittedUri = permissions.directoryUri;\n // Checks if users selected the correct folder\n if (!permittedUri.includes(albumName)) {\n return;\n }\n\n const mediaLibraryPermissions = await MediaLibrary.requestPermissionsAsync();\n if (!mediaLibraryPermissions.granted) {\n return;\n }\n\n // Moves files from external storage to internal storage\n await StorageAccessFramework.moveAsync({\n from: permittedUri,\n to: FileSystem.documentDirectory!,\n });\n\n const outputDir = FileSystem.documentDirectory! + albumName;\n const migratedFiles = await FileSystem.readDirectoryAsync(outputDir);\n\n // Creates assets from local files\n const [newAlbumCreator, ...assets] = await Promise.all(\n migratedFiles.map>(\n async fileName => await MediaLibrary.createAssetAsync(outputDir + '/' + fileName)\n )\n );\n\n // Album was empty\n if (!newAlbumCreator) {\n return;\n }\n\n // Creates a new album in the scoped directory\n const newAlbum = await MediaLibrary.createAlbumAsync(albumName, newAlbumCreator, false);\n if (assets.length) {\n await MediaLibrary.addAssetsToAlbumAsync(assets, newAlbum, false);\n }\n}\n```"}]},{"tag":"@platform","content":[{"kind":"text","text":"Android"}]}]},"children":[{"name":"copyAsync","kind":64,"signatures":[{"name":"copyAsync","kind":4096,"comment":{"summary":[{"kind":"text","text":"Alias fro ["},{"kind":"code","text":"`copyAsync`"},{"kind":"text","text":"](#filesystemcopyasyncoptions) method."}]},"parameters":[{"name":"options","kind":32768,"type":{"type":"reference","name":"RelocatingOptions"}}],"type":{"type":"reference","typeArguments":[{"type":"intrinsic","name":"void"}],"name":"Promise","qualifiedName":"Promise","package":"typescript"}}]},{"name":"createFileAsync","kind":64,"signatures":[{"name":"createFileAsync","kind":4096,"comment":{"summary":[{"kind":"text","text":"Creates a new empty file."}],"blockTags":[{"tag":"@returns","content":[{"kind":"text","text":"A Promise that resolves to a [SAF URI](#saf-uri) to the created file."}]}]},"parameters":[{"name":"parentUri","kind":32768,"comment":{"summary":[{"kind":"text","text":"The [SAF](#saf-uri) URI to the parent directory."}]},"type":{"type":"intrinsic","name":"string"}},{"name":"fileName","kind":32768,"comment":{"summary":[{"kind":"text","text":"The name of new file **without the extension**."}]},"type":{"type":"intrinsic","name":"string"}},{"name":"mimeType","kind":32768,"comment":{"summary":[{"kind":"text","text":"The MIME type of new file."}]},"type":{"type":"intrinsic","name":"string"}}],"type":{"type":"reference","typeArguments":[{"type":"intrinsic","name":"string"}],"name":"Promise","qualifiedName":"Promise","package":"typescript"}}]},{"name":"deleteAsync","kind":64,"signatures":[{"name":"deleteAsync","kind":4096,"comment":{"summary":[{"kind":"text","text":"Alias for ["},{"kind":"code","text":"`deleteAsync`"},{"kind":"text","text":"](#filesystemdeleteasyncfileuri-options) method."}]},"parameters":[{"name":"fileUri","kind":32768,"type":{"type":"intrinsic","name":"string"}},{"name":"options","kind":32768,"type":{"type":"reference","name":"DeletingOptions"},"defaultValue":"{}"}],"type":{"type":"reference","typeArguments":[{"type":"intrinsic","name":"void"}],"name":"Promise","qualifiedName":"Promise","package":"typescript"}}]},{"name":"getUriForDirectoryInRoot","kind":64,"signatures":[{"name":"getUriForDirectoryInRoot","kind":4096,"comment":{"summary":[{"kind":"text","text":"Gets a [SAF URI](#saf-uri) pointing to a folder in the Android root directory. You can use this function to get URI for\n"},{"kind":"code","text":"`StorageAccessFramework.requestDirectoryPermissionsAsync()`"},{"kind":"text","text":" when you trying to migrate an album. In that case, the name of the album is the folder name."}],"blockTags":[{"tag":"@returns","content":[{"kind":"text","text":"Returns a [SAF URI](#saf-uri) to a folder."}]}]},"parameters":[{"name":"folderName","kind":32768,"comment":{"summary":[{"kind":"text","text":"The name of the folder which is located in the Android root directory."}]},"type":{"type":"intrinsic","name":"string"}}],"type":{"type":"intrinsic","name":"string"}}]},{"name":"makeDirectoryAsync","kind":64,"signatures":[{"name":"makeDirectoryAsync","kind":4096,"comment":{"summary":[{"kind":"text","text":"Creates a new empty directory."}],"blockTags":[{"tag":"@returns","content":[{"kind":"text","text":"A Promise that resolves to a [SAF URI](#saf-uri) to the created directory."}]}]},"parameters":[{"name":"parentUri","kind":32768,"comment":{"summary":[{"kind":"text","text":"The [SAF](#saf-uri) URI to the parent directory."}]},"type":{"type":"intrinsic","name":"string"}},{"name":"dirName","kind":32768,"comment":{"summary":[{"kind":"text","text":"The name of new directory."}]},"type":{"type":"intrinsic","name":"string"}}],"type":{"type":"reference","typeArguments":[{"type":"intrinsic","name":"string"}],"name":"Promise","qualifiedName":"Promise","package":"typescript"}}]},{"name":"moveAsync","kind":64,"signatures":[{"name":"moveAsync","kind":4096,"comment":{"summary":[{"kind":"text","text":"Alias for ["},{"kind":"code","text":"`moveAsync`"},{"kind":"text","text":"](#filesystemmoveasyncoptions) method."}]},"parameters":[{"name":"options","kind":32768,"type":{"type":"reference","name":"RelocatingOptions"}}],"type":{"type":"reference","typeArguments":[{"type":"intrinsic","name":"void"}],"name":"Promise","qualifiedName":"Promise","package":"typescript"}}]},{"name":"readAsStringAsync","kind":64,"signatures":[{"name":"readAsStringAsync","kind":4096,"comment":{"summary":[{"kind":"text","text":"Alias for ["},{"kind":"code","text":"`readAsStringAsync`"},{"kind":"text","text":"](#filesystemreadasstringasyncfileuri-options) method."}]},"parameters":[{"name":"fileUri","kind":32768,"type":{"type":"intrinsic","name":"string"}},{"name":"options","kind":32768,"type":{"type":"reference","name":"ReadingOptions"},"defaultValue":"{}"}],"type":{"type":"reference","typeArguments":[{"type":"intrinsic","name":"string"}],"name":"Promise","qualifiedName":"Promise","package":"typescript"}}]},{"name":"readDirectoryAsync","kind":64,"signatures":[{"name":"readDirectoryAsync","kind":4096,"comment":{"summary":[{"kind":"text","text":"Enumerate the contents of a directory."}],"blockTags":[{"tag":"@returns","content":[{"kind":"text","text":"A Promise that resolves to an array of strings, each containing the full [SAF URI](#saf-uri) of a file or directory contained in the directory at "},{"kind":"code","text":"`fileUri`"},{"kind":"text","text":"."}]}]},"parameters":[{"name":"dirUri","kind":32768,"comment":{"summary":[{"kind":"text","text":"[SAF](#saf-uri) URI to the directory."}]},"type":{"type":"intrinsic","name":"string"}}],"type":{"type":"reference","typeArguments":[{"type":"array","elementType":{"type":"intrinsic","name":"string"}}],"name":"Promise","qualifiedName":"Promise","package":"typescript"}}]},{"name":"requestDirectoryPermissionsAsync","kind":64,"signatures":[{"name":"requestDirectoryPermissionsAsync","kind":4096,"comment":{"summary":[{"kind":"text","text":"Allows users to select a specific directory, granting your app access to all of the files and sub-directories within that directory."}],"blockTags":[{"tag":"@platform","content":[{"kind":"text","text":"android 11+"}]},{"tag":"@returns","content":[{"kind":"text","text":"Returns a Promise that resolves to "},{"kind":"code","text":"`FileSystemRequestDirectoryPermissionsResult`"},{"kind":"text","text":" object."}]}]},"parameters":[{"name":"initialFileUrl","kind":32768,"comment":{"summary":[{"kind":"text","text":"The [SAF URI](#saf-uri) of the directory that the file picker should display when it first loads.\nIf URI is incorrect or points to a non-existing folder, it's ignored."}]},"type":{"type":"union","types":[{"type":"literal","value":null},{"type":"intrinsic","name":"string"}]},"defaultValue":"null"}],"type":{"type":"reference","typeArguments":[{"type":"reference","name":"FileSystemRequestDirectoryPermissionsResult"}],"name":"Promise","qualifiedName":"Promise","package":"typescript"}}]},{"name":"writeAsStringAsync","kind":64,"signatures":[{"name":"writeAsStringAsync","kind":4096,"comment":{"summary":[{"kind":"text","text":"Alias for ["},{"kind":"code","text":"`writeAsStringAsync`"},{"kind":"text","text":"](#filesystemwriteasstringasyncfileuri-contents-options) method."}]},"parameters":[{"name":"fileUri","kind":32768,"type":{"type":"intrinsic","name":"string"}},{"name":"contents","kind":32768,"type":{"type":"intrinsic","name":"string"}},{"name":"options","kind":32768,"type":{"type":"reference","name":"WritingOptions"},"defaultValue":"{}"}],"type":{"type":"reference","typeArguments":[{"type":"intrinsic","name":"void"}],"name":"Promise","qualifiedName":"Promise","package":"typescript"}}]}]},{"name":"EncodingType","kind":8,"comment":{"summary":[{"kind":"text","text":"These values can be used to define how file system data is read / written."}]},"children":[{"name":"Base64","kind":16,"comment":{"summary":[{"kind":"text","text":"Binary, radix-64 representation."}]},"type":{"type":"literal","value":"base64"}},{"name":"UTF8","kind":16,"comment":{"summary":[{"kind":"text","text":"Standard encoding format."}]},"type":{"type":"literal","value":"utf8"}}]},{"name":"FileSystemSessionType","kind":8,"comment":{"summary":[{"kind":"text","text":"These values can be used to define how sessions work on iOS."}],"blockTags":[{"tag":"@platform","content":[{"kind":"text","text":"ios"}]}]},"children":[{"name":"BACKGROUND","kind":16,"comment":{"summary":[{"kind":"text","text":"Using this mode means that the downloading/uploading session on the native side will work even if the application is moved to background.\nIf the task completes while the application is in background, the Promise will be either resolved immediately or (if the application execution has already been stopped) once the app is moved to foreground again.\n> Note: The background session doesn't fail if the server or your connection is down. Rather, it continues retrying until the task succeeds or is canceled manually."}]},"type":{"type":"literal","value":0}},{"name":"FOREGROUND","kind":16,"comment":{"summary":[{"kind":"text","text":"Using this mode means that downloading/uploading session on the native side will be terminated once the application becomes inactive (e.g. when it goes to background).\nBringing the application to foreground again would trigger Promise rejection."}]},"type":{"type":"literal","value":1}}]},{"name":"FileSystemUploadType","kind":8,"children":[{"name":"BINARY_CONTENT","kind":16,"comment":{"summary":[{"kind":"text","text":"The file will be sent as a request's body. The request can't contain additional data."}]},"type":{"type":"literal","value":0}},{"name":"MULTIPART","kind":16,"comment":{"summary":[{"kind":"text","text":"An [RFC 2387-compliant](https://www.ietf.org/rfc/rfc2387.txt) request body. The provided file will be encoded into HTTP request.\nThis request can contain additional data represented by ["},{"kind":"code","text":"`UploadOptionsMultipart`"},{"kind":"text","text":"](#uploadoptionsmultipart) type."}]},"type":{"type":"literal","value":1}}]},{"name":"DownloadResumable","kind":128,"children":[{"name":"constructor","kind":512,"signatures":[{"name":"new DownloadResumable","kind":16384,"parameters":[{"name":"url","kind":32768,"type":{"type":"intrinsic","name":"string"}},{"name":"_fileUri","kind":32768,"type":{"type":"intrinsic","name":"string"}},{"name":"options","kind":32768,"type":{"type":"reference","name":"DownloadOptions"},"defaultValue":"{}"},{"name":"callback","kind":32768,"flags":{"isOptional":true},"type":{"type":"reference","typeArguments":[{"type":"reference","name":"DownloadProgressData"}],"name":"FileSystemNetworkTaskProgressCallback"}},{"name":"resumeData","kind":32768,"flags":{"isOptional":true},"type":{"type":"intrinsic","name":"string"}}],"type":{"type":"reference","name":"DownloadResumable"},"overwrites":{"type":"reference","name":"FileSystemCancellableNetworkTask.constructor"}}],"overwrites":{"type":"reference","name":"FileSystemCancellableNetworkTask.constructor"}},{"name":"fileUri","kind":262144,"flags":{"isPublic":true},"getSignature":{"name":"fileUri","kind":524288,"type":{"type":"intrinsic","name":"string"}}},{"name":"cancelAsync","kind":2048,"flags":{"isPublic":true},"signatures":[{"name":"cancelAsync","kind":4096,"type":{"type":"reference","typeArguments":[{"type":"intrinsic","name":"void"}],"name":"Promise","qualifiedName":"Promise","package":"typescript"},"inheritedFrom":{"type":"reference","name":"FileSystemCancellableNetworkTask.cancelAsync"}}],"inheritedFrom":{"type":"reference","name":"FileSystemCancellableNetworkTask.cancelAsync"}},{"name":"downloadAsync","kind":2048,"signatures":[{"name":"downloadAsync","kind":4096,"comment":{"summary":[{"kind":"text","text":"Download the contents at a remote URI to a file in the app's file system."}],"blockTags":[{"tag":"@returns","content":[{"kind":"text","text":"Returns a Promise that resolves to "},{"kind":"code","text":"`FileSystemDownloadResult`"},{"kind":"text","text":" object, or to "},{"kind":"code","text":"`undefined`"},{"kind":"text","text":" when task was cancelled."}]}]},"type":{"type":"reference","typeArguments":[{"type":"union","types":[{"type":"intrinsic","name":"undefined"},{"type":"reference","name":"FileSystemDownloadResult"}]}],"name":"Promise","qualifiedName":"Promise","package":"typescript"}}]},{"name":"pauseAsync","kind":2048,"signatures":[{"name":"pauseAsync","kind":4096,"comment":{"summary":[{"kind":"text","text":"Pause the current download operation. "},{"kind":"code","text":"`resumeData`"},{"kind":"text","text":" is added to the "},{"kind":"code","text":"`DownloadResumable`"},{"kind":"text","text":" object after a successful pause operation.\nReturns an object that can be saved with "},{"kind":"code","text":"`AsyncStorage`"},{"kind":"text","text":" for future retrieval (the same object that is returned from calling "},{"kind":"code","text":"`FileSystem.DownloadResumable.savable()`"},{"kind":"text","text":")."}],"blockTags":[{"tag":"@returns","content":[{"kind":"text","text":"Returns a Promise that resolves to "},{"kind":"code","text":"`DownloadPauseState`"},{"kind":"text","text":" object."}]}]},"type":{"type":"reference","typeArguments":[{"type":"reference","name":"DownloadPauseState"}],"name":"Promise","qualifiedName":"Promise","package":"typescript"}}]},{"name":"resumeAsync","kind":2048,"signatures":[{"name":"resumeAsync","kind":4096,"comment":{"summary":[{"kind":"text","text":"Resume a paused download operation."}],"blockTags":[{"tag":"@returns","content":[{"kind":"text","text":"Returns a Promise that resolves to "},{"kind":"code","text":"`FileSystemDownloadResult`"},{"kind":"text","text":" object, or to "},{"kind":"code","text":"`undefined`"},{"kind":"text","text":" when task was cancelled."}]}]},"type":{"type":"reference","typeArguments":[{"type":"union","types":[{"type":"intrinsic","name":"undefined"},{"type":"reference","name":"FileSystemDownloadResult"}]}],"name":"Promise","qualifiedName":"Promise","package":"typescript"}}]},{"name":"savable","kind":2048,"signatures":[{"name":"savable","kind":4096,"comment":{"summary":[{"kind":"text","text":"Method to get the object which can be saved with "},{"kind":"code","text":"`AsyncStorage`"},{"kind":"text","text":" for future retrieval."}],"blockTags":[{"tag":"@returns","content":[{"kind":"text","text":"Returns object in shape of "},{"kind":"code","text":"`DownloadPauseState`"},{"kind":"text","text":" type."}]}]},"type":{"type":"reference","name":"DownloadPauseState"}}]}],"extendedTypes":[{"type":"reference","typeArguments":[{"type":"reference","name":"DownloadProgressData"}],"name":"FileSystemCancellableNetworkTask"}]},{"name":"FileSystemCancellableNetworkTask","kind":128,"flags":{"isAbstract":true},"children":[{"name":"constructor","kind":512,"signatures":[{"name":"new FileSystemCancellableNetworkTask","kind":16384,"typeParameter":[{"name":"T","kind":131072,"type":{"type":"union","types":[{"type":"reference","name":"DownloadProgressData"},{"type":"reference","name":"UploadProgressData"}]}}],"type":{"type":"reference","typeArguments":[{"type":"reference","name":"T"}],"name":"FileSystemCancellableNetworkTask"}}]},{"name":"cancelAsync","kind":2048,"flags":{"isPublic":true},"signatures":[{"name":"cancelAsync","kind":4096,"type":{"type":"reference","typeArguments":[{"type":"intrinsic","name":"void"}],"name":"Promise","qualifiedName":"Promise","package":"typescript"}}]}],"typeParameters":[{"name":"T","kind":131072,"type":{"type":"union","types":[{"type":"reference","name":"DownloadProgressData"},{"type":"reference","name":"UploadProgressData"}]}}],"extendedBy":[{"type":"reference","name":"UploadTask"},{"type":"reference","name":"DownloadResumable"}]},{"name":"UploadTask","kind":128,"children":[{"name":"constructor","kind":512,"signatures":[{"name":"new UploadTask","kind":16384,"parameters":[{"name":"url","kind":32768,"type":{"type":"intrinsic","name":"string"}},{"name":"fileUri","kind":32768,"type":{"type":"intrinsic","name":"string"}},{"name":"options","kind":32768,"flags":{"isOptional":true},"type":{"type":"reference","name":"FileSystemUploadOptions"}},{"name":"callback","kind":32768,"flags":{"isOptional":true},"type":{"type":"reference","typeArguments":[{"type":"reference","name":"UploadProgressData"}],"name":"FileSystemNetworkTaskProgressCallback"}}],"type":{"type":"reference","name":"UploadTask"},"overwrites":{"type":"reference","name":"FileSystemCancellableNetworkTask.constructor"}}],"overwrites":{"type":"reference","name":"FileSystemCancellableNetworkTask.constructor"}},{"name":"cancelAsync","kind":2048,"flags":{"isPublic":true},"signatures":[{"name":"cancelAsync","kind":4096,"type":{"type":"reference","typeArguments":[{"type":"intrinsic","name":"void"}],"name":"Promise","qualifiedName":"Promise","package":"typescript"},"inheritedFrom":{"type":"reference","name":"FileSystemCancellableNetworkTask.cancelAsync"}}],"inheritedFrom":{"type":"reference","name":"FileSystemCancellableNetworkTask.cancelAsync"}},{"name":"uploadAsync","kind":2048,"flags":{"isPublic":true},"signatures":[{"name":"uploadAsync","kind":4096,"type":{"type":"reference","typeArguments":[{"type":"union","types":[{"type":"intrinsic","name":"undefined"},{"type":"reference","name":"FileSystemUploadResult"}]}],"name":"Promise","qualifiedName":"Promise","package":"typescript"}}]}],"extendedTypes":[{"type":"reference","typeArguments":[{"type":"reference","name":"UploadProgressData"}],"name":"FileSystemCancellableNetworkTask"}]},{"name":"DeletingOptions","kind":4194304,"type":{"type":"reflection","declaration":{"name":"__type","kind":65536,"children":[{"name":"idempotent","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"If "},{"kind":"code","text":"`true`"},{"kind":"text","text":", don't throw an error if there is no file or directory at this URI."}],"blockTags":[{"tag":"@default","content":[{"kind":"text","text":"false"}]}]},"type":{"type":"intrinsic","name":"boolean"}}]}}},{"name":"DownloadOptions","kind":4194304,"type":{"type":"reflection","declaration":{"name":"__type","kind":65536,"children":[{"name":"cache","kind":1024,"flags":{"isOptional":true},"type":{"type":"intrinsic","name":"boolean"}},{"name":"headers","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"An object containing all the HTTP header fields and their values for the download network request. The keys and values of the object are the header names and values respectively."}]},"type":{"type":"reference","typeArguments":[{"type":"intrinsic","name":"string"},{"type":"intrinsic","name":"string"}],"name":"Record","qualifiedName":"Record","package":"typescript"}},{"name":"md5","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"If "},{"kind":"code","text":"`true`"},{"kind":"text","text":", include the MD5 hash of the file in the returned object. Provided for convenience since it is common to check the integrity of a file immediately after downloading."}],"blockTags":[{"tag":"@default","content":[{"kind":"text","text":"false"}]}]},"type":{"type":"intrinsic","name":"boolean"}},{"name":"sessionType","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"A session type. Determines if tasks can be handled in the background. On Android, sessions always work in the background and you can't change it."}],"blockTags":[{"tag":"@default","content":[{"kind":"text","text":"FileSystemSessionType.BACKGROUND"}]},{"tag":"@platform","content":[{"kind":"text","text":"ios"}]}]},"type":{"type":"reference","name":"FileSystemSessionType"}}]}}},{"name":"DownloadPauseState","kind":4194304,"type":{"type":"reflection","declaration":{"name":"__type","kind":65536,"children":[{"name":"fileUri","kind":1024,"comment":{"summary":[{"kind":"text","text":"The local URI of the file to download to. If there is no file at this URI, a new one is created. If there is a file at this URI, its contents are replaced."}]},"type":{"type":"intrinsic","name":"string"}},{"name":"options","kind":1024,"comment":{"summary":[{"kind":"text","text":"Object representing the file download options."}]},"type":{"type":"reference","name":"DownloadOptions"}},{"name":"resumeData","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"The string which allows the API to resume a paused download."}]},"type":{"type":"intrinsic","name":"string"}},{"name":"url","kind":1024,"comment":{"summary":[{"kind":"text","text":"The remote URI to download from."}]},"type":{"type":"intrinsic","name":"string"}}]}}},{"name":"DownloadProgressCallback","kind":4194304,"comment":{"summary":[],"blockTags":[{"tag":"@deprecated","content":[{"kind":"text","text":"use "},{"kind":"code","text":"`FileSystemNetworkTaskProgressCallback`"},{"kind":"text","text":" instead."}]}]},"type":{"type":"reference","typeArguments":[{"type":"reference","name":"DownloadProgressData"}],"name":"FileSystemNetworkTaskProgressCallback"}},{"name":"DownloadProgressData","kind":4194304,"type":{"type":"reflection","declaration":{"name":"__type","kind":65536,"children":[{"name":"totalBytesExpectedToWrite","kind":1024,"comment":{"summary":[{"kind":"text","text":"The total bytes expected to be written by the download operation. A value of "},{"kind":"code","text":"`-1`"},{"kind":"text","text":" means that the server did not return the "},{"kind":"code","text":"`Content-Length`"},{"kind":"text","text":" header\nand the total size is unknown. Without this header, you won't be able to track the download progress."}]},"type":{"type":"intrinsic","name":"number"}},{"name":"totalBytesWritten","kind":1024,"comment":{"summary":[{"kind":"text","text":"The total bytes written by the download operation."}]},"type":{"type":"intrinsic","name":"number"}}]}}},{"name":"DownloadResult","kind":4194304,"comment":{"summary":[],"blockTags":[{"tag":"@deprecated","content":[{"kind":"text","text":"Use "},{"kind":"code","text":"`FileSystemDownloadResult`"},{"kind":"text","text":" instead."}]}]},"type":{"type":"reference","name":"FileSystemDownloadResult"}},{"name":"FileInfo","kind":4194304,"type":{"type":"union","types":[{"type":"reflection","declaration":{"name":"__type","kind":65536,"children":[{"name":"exists","kind":1024,"comment":{"summary":[{"kind":"text","text":"Signifies that the requested file exist."}]},"type":{"type":"literal","value":true}},{"name":"isDirectory","kind":1024,"comment":{"summary":[{"kind":"text","text":"Boolean set to "},{"kind":"code","text":"`true`"},{"kind":"text","text":" if this is a directory and "},{"kind":"code","text":"`false`"},{"kind":"text","text":" if it is a file."}]},"type":{"type":"intrinsic","name":"boolean"}},{"name":"md5","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"Present if the "},{"kind":"code","text":"`md5`"},{"kind":"text","text":" option was truthy. Contains the MD5 hash of the file."}]},"type":{"type":"intrinsic","name":"string"}},{"name":"modificationTime","kind":1024,"comment":{"summary":[{"kind":"text","text":"The last modification time of the file expressed in seconds since epoch."}]},"type":{"type":"intrinsic","name":"number"}},{"name":"size","kind":1024,"comment":{"summary":[{"kind":"text","text":"The size of the file in bytes. If operating on a source such as an iCloud file, only present if the "},{"kind":"code","text":"`size`"},{"kind":"text","text":" option was truthy."}]},"type":{"type":"intrinsic","name":"number"}},{"name":"uri","kind":1024,"comment":{"summary":[{"kind":"text","text":"A "},{"kind":"code","text":"`file://`"},{"kind":"text","text":" URI pointing to the file. This is the same as the "},{"kind":"code","text":"`fileUri`"},{"kind":"text","text":" input parameter."}]},"type":{"type":"intrinsic","name":"string"}}]}},{"type":"reflection","declaration":{"name":"__type","kind":65536,"children":[{"name":"exists","kind":1024,"type":{"type":"literal","value":false}},{"name":"isDirectory","kind":1024,"type":{"type":"literal","value":false}},{"name":"uri","kind":1024,"type":{"type":"intrinsic","name":"string"}}]}}]}},{"name":"FileSystemAcceptedUploadHttpMethod","kind":4194304,"type":{"type":"union","types":[{"type":"literal","value":"POST"},{"type":"literal","value":"PUT"},{"type":"literal","value":"PATCH"}]}},{"name":"FileSystemDownloadResult","kind":4194304,"type":{"type":"intersection","types":[{"type":"reference","name":"FileSystemHttpResult"},{"type":"reflection","declaration":{"name":"__type","kind":65536,"children":[{"name":"md5","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"Present if the "},{"kind":"code","text":"`md5`"},{"kind":"text","text":" option was truthy. Contains the MD5 hash of the file."}]},"type":{"type":"intrinsic","name":"string"}},{"name":"uri","kind":1024,"comment":{"summary":[{"kind":"text","text":"A "},{"kind":"code","text":"`file://`"},{"kind":"text","text":" URI pointing to the file. This is the same as the "},{"kind":"code","text":"`fileUri`"},{"kind":"text","text":" input parameter."}]},"type":{"type":"intrinsic","name":"string"}}]}}]}},{"name":"FileSystemHttpResult","kind":4194304,"type":{"type":"reflection","declaration":{"name":"__type","kind":65536,"children":[{"name":"headers","kind":1024,"comment":{"summary":[{"kind":"text","text":"An object containing all the HTTP response header fields and their values for the download network request.\nThe keys and values of the object are the header names and values respectively."}]},"type":{"type":"reference","typeArguments":[{"type":"intrinsic","name":"string"},{"type":"intrinsic","name":"string"}],"name":"Record","qualifiedName":"Record","package":"typescript"}},{"name":"mimeType","kind":1024,"type":{"type":"union","types":[{"type":"intrinsic","name":"string"},{"type":"literal","value":null}]}},{"name":"status","kind":1024,"comment":{"summary":[{"kind":"text","text":"The HTTP response status code for the download network request."}]},"type":{"type":"intrinsic","name":"number"}}]}}},{"name":"FileSystemNetworkTaskProgressCallback","kind":4194304,"typeParameters":[{"name":"T","kind":131072,"type":{"type":"union","types":[{"type":"reference","name":"DownloadProgressData"},{"type":"reference","name":"UploadProgressData"}]}}],"type":{"type":"reflection","declaration":{"name":"__type","kind":65536,"signatures":[{"name":"__type","kind":4096,"parameters":[{"name":"data","kind":32768,"type":{"type":"reference","name":"T"}}],"type":{"type":"intrinsic","name":"void"}}]}}},{"name":"FileSystemRequestDirectoryPermissionsResult","kind":4194304,"type":{"type":"union","types":[{"type":"reflection","declaration":{"name":"__type","kind":65536,"children":[{"name":"granted","kind":1024,"type":{"type":"literal","value":false}}]}},{"type":"reflection","declaration":{"name":"__type","kind":65536,"children":[{"name":"directoryUri","kind":1024,"comment":{"summary":[{"kind":"text","text":"The [SAF URI](#saf-uri) to the user's selected directory. Available only if permissions were granted."}]},"type":{"type":"intrinsic","name":"string"}},{"name":"granted","kind":1024,"type":{"type":"literal","value":true}}]}}]}},{"name":"FileSystemUploadOptions","kind":4194304,"type":{"type":"intersection","types":[{"type":"union","types":[{"type":"reference","name":"UploadOptionsBinary"},{"type":"reference","name":"UploadOptionsMultipart"}]},{"type":"reflection","declaration":{"name":"__type","kind":65536,"children":[{"name":"headers","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"An object containing all the HTTP header fields and their values for the upload network request.\nThe keys and values of the object are the header names and values respectively."}]},"type":{"type":"reference","typeArguments":[{"type":"intrinsic","name":"string"},{"type":"intrinsic","name":"string"}],"name":"Record","qualifiedName":"Record","package":"typescript"}},{"name":"httpMethod","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"The request method."}],"blockTags":[{"tag":"@default","content":[{"kind":"text","text":"FileSystemAcceptedUploadHttpMethod.POST"}]}]},"type":{"type":"reference","name":"FileSystemAcceptedUploadHttpMethod"}},{"name":"sessionType","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"A session type. Determines if tasks can be handled in the background. On Android, sessions always work in the background and you can't change it."}],"blockTags":[{"tag":"@default","content":[{"kind":"text","text":"FileSystemSessionType.BACKGROUND"}]},{"tag":"@platform","content":[{"kind":"text","text":"ios"}]}]},"type":{"type":"reference","name":"FileSystemSessionType"}}]}}]}},{"name":"FileSystemUploadResult","kind":4194304,"type":{"type":"intersection","types":[{"type":"reference","name":"FileSystemHttpResult"},{"type":"reflection","declaration":{"name":"__type","kind":65536,"children":[{"name":"body","kind":1024,"comment":{"summary":[{"kind":"text","text":"The body of the server response."}]},"type":{"type":"intrinsic","name":"string"}}]}}]}},{"name":"InfoOptions","kind":4194304,"type":{"type":"reflection","declaration":{"name":"__type","kind":65536,"children":[{"name":"md5","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"Whether to return the MD5 hash of the file."}],"blockTags":[{"tag":"@default","content":[{"kind":"text","text":"false"}]}]},"type":{"type":"intrinsic","name":"boolean"}},{"name":"size","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"Explicitly specify that the file size should be included. For example, skipping this can prevent downloading the file if it's stored in iCloud.\nThe size is always returned for "},{"kind":"code","text":"`file://`"},{"kind":"text","text":" locations."}]},"type":{"type":"intrinsic","name":"boolean"}}]}}},{"name":"MakeDirectoryOptions","kind":4194304,"type":{"type":"reflection","declaration":{"name":"__type","kind":65536,"children":[{"name":"intermediates","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"If "},{"kind":"code","text":"`true`"},{"kind":"text","text":", don't throw an error if there is no file or directory at this URI."}],"blockTags":[{"tag":"@default","content":[{"kind":"text","text":"false"}]}]},"type":{"type":"intrinsic","name":"boolean"}}]}}},{"name":"ProgressEvent","kind":4194304,"typeParameters":[{"name":"T","kind":131072}],"type":{"type":"reflection","declaration":{"name":"__type","kind":65536,"children":[{"name":"data","kind":1024,"type":{"type":"reference","name":"T"}},{"name":"uuid","kind":1024,"type":{"type":"intrinsic","name":"string"}}]}}},{"name":"ReadingOptions","kind":4194304,"type":{"type":"reflection","declaration":{"name":"__type","kind":65536,"children":[{"name":"encoding","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"The encoding format to use when reading the file."}],"blockTags":[{"tag":"@default","content":[{"kind":"text","text":"EncodingType.UTF8"}]}]},"type":{"type":"union","types":[{"type":"reference","name":"EncodingType"},{"type":"literal","value":"utf8"},{"type":"literal","value":"base64"}]}},{"name":"length","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"Optional number of bytes to read. This option is only used when "},{"kind":"code","text":"`encoding: FileSystem.EncodingType.Base64`"},{"kind":"text","text":" and "},{"kind":"code","text":"`position`"},{"kind":"text","text":" is defined."}]},"type":{"type":"intrinsic","name":"number"}},{"name":"position","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"Optional number of bytes to skip. This option is only used when "},{"kind":"code","text":"`encoding: FileSystem.EncodingType.Base64`"},{"kind":"text","text":" and "},{"kind":"code","text":"`length`"},{"kind":"text","text":" is defined."}]},"type":{"type":"intrinsic","name":"number"}}]}}},{"name":"RelocatingOptions","kind":4194304,"type":{"type":"reflection","declaration":{"name":"__type","kind":65536,"children":[{"name":"from","kind":1024,"comment":{"summary":[{"kind":"text","text":"URI or [SAF](#saf-uri) URI to the asset, file, or directory. See [supported URI schemes](#supported-uri-schemes-1)."}]},"type":{"type":"intrinsic","name":"string"}},{"name":"to","kind":1024,"comment":{"summary":[{"kind":"code","text":"`file://`"},{"kind":"text","text":" URI to the file or directory which should be its new location."}]},"type":{"type":"intrinsic","name":"string"}}]}}},{"name":"UploadOptionsBinary","kind":4194304,"comment":{"summary":[{"kind":"text","text":"Upload options when upload type is set to binary."}]},"type":{"type":"reflection","declaration":{"name":"__type","kind":65536,"children":[{"name":"uploadType","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"Upload type determines how the file will be sent to the server.\nValue will be "},{"kind":"code","text":"`FileSystemUploadType.BINARY_CONTENT`"},{"kind":"text","text":"."}]},"type":{"type":"reference","name":"FileSystemUploadType"}}]}}},{"name":"UploadOptionsMultipart","kind":4194304,"comment":{"summary":[{"kind":"text","text":"Upload options when upload type is set to multipart."}]},"type":{"type":"reflection","declaration":{"name":"__type","kind":65536,"children":[{"name":"fieldName","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"The name of the field which will hold uploaded file. Defaults to the file name without an extension."}]},"type":{"type":"intrinsic","name":"string"}},{"name":"mimeType","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"The MIME type of the provided file. If not provided, the module will try to guess it based on the extension."}]},"type":{"type":"intrinsic","name":"string"}},{"name":"parameters","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"Additional form properties. They will be located in the request body."}]},"type":{"type":"reference","typeArguments":[{"type":"intrinsic","name":"string"},{"type":"intrinsic","name":"string"}],"name":"Record","qualifiedName":"Record","package":"typescript"}},{"name":"uploadType","kind":1024,"comment":{"summary":[{"kind":"text","text":"Upload type determines how the file will be sent to the server.\nValue will be "},{"kind":"code","text":"`FileSystemUploadType.MULTIPART`"},{"kind":"text","text":"."}]},"type":{"type":"reference","name":"FileSystemUploadType"}}]}}},{"name":"UploadProgressData","kind":4194304,"type":{"type":"reflection","declaration":{"name":"__type","kind":65536,"children":[{"name":"totalBytesExpectedToSend","kind":1024,"comment":{"summary":[{"kind":"text","text":"The total bytes expected to be sent by the upload operation."}]},"type":{"type":"intrinsic","name":"number"}},{"name":"totalBytesSent","kind":1024,"comment":{"summary":[{"kind":"text","text":"The total bytes sent by the upload operation."}]},"type":{"type":"intrinsic","name":"number"}}]}}},{"name":"WritingOptions","kind":4194304,"type":{"type":"reflection","declaration":{"name":"__type","kind":65536,"children":[{"name":"encoding","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"The encoding format to use when writing the file."}],"blockTags":[{"tag":"@default","content":[{"kind":"text","text":"FileSystem.EncodingType.UTF8"}]}]},"type":{"type":"union","types":[{"type":"reference","name":"EncodingType"},{"type":"literal","value":"utf8"},{"type":"literal","value":"base64"}]}}]}}},{"name":"bundleDirectory","kind":32,"type":{"type":"union","types":[{"type":"literal","value":null},{"type":"intrinsic","name":"string"}]}},{"name":"bundledAssets","kind":32,"type":{"type":"union","types":[{"type":"literal","value":null},{"type":"intrinsic","name":"string"}]}},{"name":"cacheDirectory","kind":32,"flags":{"isConst":true},"comment":{"summary":[{"kind":"code","text":"`file://`"},{"kind":"text","text":" URI pointing to the directory where temporary files used by this app will be stored.\nFiles stored here may be automatically deleted by the system when low on storage.\nExample uses are for downloaded or generated files that the app just needs for one-time usage."}]},"type":{"type":"union","types":[{"type":"literal","value":null},{"type":"intrinsic","name":"string"}]},"defaultValue":"..."},{"name":"documentDirectory","kind":32,"flags":{"isConst":true},"comment":{"summary":[{"kind":"code","text":"`file://`"},{"kind":"text","text":" URI pointing to the directory where user documents for this app will be stored.\nFiles stored here will remain until explicitly deleted by the app. Ends with a trailing "},{"kind":"code","text":"`/`"},{"kind":"text","text":".\nExample uses are for files the user saves that they expect to see again."}]},"type":{"type":"union","types":[{"type":"literal","value":null},{"type":"intrinsic","name":"string"}]},"defaultValue":"..."},{"name":"copyAsync","kind":64,"signatures":[{"name":"copyAsync","kind":4096,"comment":{"summary":[{"kind":"text","text":"Create a copy of a file or directory. Directories are recursively copied with all of their contents.\nIt can be also used to copy content shared by other apps to local filesystem."}]},"parameters":[{"name":"options","kind":32768,"comment":{"summary":[{"kind":"text","text":"A map of move options represented by ["},{"kind":"code","text":"`RelocatingOptions`"},{"kind":"text","text":"](#relocatingoptions) type."}]},"type":{"type":"reference","name":"RelocatingOptions"}}],"type":{"type":"reference","typeArguments":[{"type":"intrinsic","name":"void"}],"name":"Promise","qualifiedName":"Promise","package":"typescript"}}]},{"name":"createDownloadResumable","kind":64,"signatures":[{"name":"createDownloadResumable","kind":4096,"comment":{"summary":[{"kind":"text","text":"Create a "},{"kind":"code","text":"`DownloadResumable`"},{"kind":"text","text":" object which can start, pause, and resume a download of contents at a remote URI to a file in the app's file system.\n> Note: You need to call "},{"kind":"code","text":"`downloadAsync()`"},{"kind":"text","text":", on a "},{"kind":"code","text":"`DownloadResumable`"},{"kind":"text","text":" instance to initiate the download.\nThe "},{"kind":"code","text":"`DownloadResumable`"},{"kind":"text","text":" object has a callback that provides download progress updates.\nDownloads can be resumed across app restarts by using "},{"kind":"code","text":"`AsyncStorage`"},{"kind":"text","text":" to store the "},{"kind":"code","text":"`DownloadResumable.savable()`"},{"kind":"text","text":" object for later retrieval.\nThe "},{"kind":"code","text":"`savable`"},{"kind":"text","text":" object contains the arguments required to initialize a new "},{"kind":"code","text":"`DownloadResumable`"},{"kind":"text","text":" object to resume the download after an app restart.\nThe directory for a local file uri must exist prior to calling this function."}]},"parameters":[{"name":"uri","kind":32768,"comment":{"summary":[{"kind":"text","text":"The remote URI to download from."}]},"type":{"type":"intrinsic","name":"string"}},{"name":"fileUri","kind":32768,"comment":{"summary":[{"kind":"text","text":"The local URI of the file to download to. If there is no file at this URI, a new one is created.\nIf there is a file at this URI, its contents are replaced. The directory for the file must exist."}]},"type":{"type":"intrinsic","name":"string"}},{"name":"options","kind":32768,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"A map of download options represented by ["},{"kind":"code","text":"`DownloadOptions`"},{"kind":"text","text":"](#downloadoptions) type."}]},"type":{"type":"reference","name":"DownloadOptions"}},{"name":"callback","kind":32768,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"This function is called on each data write to update the download progress.\n> **Note**: When the app has been moved to the background, this callback won't be fired until it's moved to the foreground."}]},"type":{"type":"reference","typeArguments":[{"type":"reference","name":"DownloadProgressData"}],"name":"FileSystemNetworkTaskProgressCallback"}},{"name":"resumeData","kind":32768,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"The string which allows the api to resume a paused download. This is set on the "},{"kind":"code","text":"`DownloadResumable`"},{"kind":"text","text":" object automatically when a download is paused.\nWhen initializing a new "},{"kind":"code","text":"`DownloadResumable`"},{"kind":"text","text":" this should be "},{"kind":"code","text":"`null`"},{"kind":"text","text":"."}]},"type":{"type":"intrinsic","name":"string"}}],"type":{"type":"reference","name":"DownloadResumable"}}]},{"name":"createUploadTask","kind":64,"signatures":[{"name":"createUploadTask","kind":4096,"parameters":[{"name":"url","kind":32768,"type":{"type":"intrinsic","name":"string"}},{"name":"fileUri","kind":32768,"type":{"type":"intrinsic","name":"string"}},{"name":"options","kind":32768,"flags":{"isOptional":true},"type":{"type":"reference","name":"FileSystemUploadOptions"}},{"name":"callback","kind":32768,"flags":{"isOptional":true},"type":{"type":"reference","typeArguments":[{"type":"reference","name":"UploadProgressData"}],"name":"FileSystemNetworkTaskProgressCallback"}}],"type":{"type":"reference","name":"UploadTask"}}]},{"name":"deleteAsync","kind":64,"signatures":[{"name":"deleteAsync","kind":4096,"comment":{"summary":[{"kind":"text","text":"Delete a file or directory. If the URI points to a directory, the directory and all its contents are recursively deleted."}]},"parameters":[{"name":"fileUri","kind":32768,"comment":{"summary":[{"kind":"code","text":"`file://`"},{"kind":"text","text":" or [SAF](#saf-uri) URI to the file or directory."}]},"type":{"type":"intrinsic","name":"string"}},{"name":"options","kind":32768,"comment":{"summary":[{"kind":"text","text":"A map of write options represented by ["},{"kind":"code","text":"`DeletingOptions`"},{"kind":"text","text":"](#deletingoptions) type."}]},"type":{"type":"reference","name":"DeletingOptions"},"defaultValue":"{}"}],"type":{"type":"reference","typeArguments":[{"type":"intrinsic","name":"void"}],"name":"Promise","qualifiedName":"Promise","package":"typescript"}}]},{"name":"deleteLegacyDocumentDirectoryAndroid","kind":64,"signatures":[{"name":"deleteLegacyDocumentDirectoryAndroid","kind":4096,"type":{"type":"reference","typeArguments":[{"type":"intrinsic","name":"void"}],"name":"Promise","qualifiedName":"Promise","package":"typescript"}}]},{"name":"downloadAsync","kind":64,"signatures":[{"name":"downloadAsync","kind":4096,"comment":{"summary":[{"kind":"text","text":"Download the contents at a remote URI to a file in the app's file system. The directory for a local file uri must exist prior to calling this function."}],"blockTags":[{"tag":"@example","content":[{"kind":"code","text":"```js\nFileSystem.downloadAsync(\n 'http://techslides.com/demos/sample-videos/small.mp4',\n FileSystem.documentDirectory + 'small.mp4'\n)\n .then(({ uri }) => {\n console.log('Finished downloading to ', uri);\n })\n .catch(error => {\n console.error(error);\n });\n```"}]},{"tag":"@returns","content":[{"kind":"text","text":"Returns a Promise that resolves to a "},{"kind":"code","text":"`FileSystemDownloadResult`"},{"kind":"text","text":" object."}]}]},"parameters":[{"name":"uri","kind":32768,"comment":{"summary":[{"kind":"text","text":"The remote URI to download from."}]},"type":{"type":"intrinsic","name":"string"}},{"name":"fileUri","kind":32768,"comment":{"summary":[{"kind":"text","text":"The local URI of the file to download to. If there is no file at this URI, a new one is created.\nIf there is a file at this URI, its contents are replaced. The directory for the file must exist."}]},"type":{"type":"intrinsic","name":"string"}},{"name":"options","kind":32768,"comment":{"summary":[{"kind":"text","text":"A map of download options represented by ["},{"kind":"code","text":"`DownloadOptions`"},{"kind":"text","text":"](#downloadoptions) type."}]},"type":{"type":"reference","name":"DownloadOptions"},"defaultValue":"{}"}],"type":{"type":"reference","typeArguments":[{"type":"reference","name":"FileSystemDownloadResult"}],"name":"Promise","qualifiedName":"Promise","package":"typescript"}}]},{"name":"getContentUriAsync","kind":64,"signatures":[{"name":"getContentUriAsync","kind":4096,"comment":{"summary":[{"kind":"text","text":"Takes a "},{"kind":"code","text":"`file://`"},{"kind":"text","text":" URI and converts it into content URI ("},{"kind":"code","text":"`content://`"},{"kind":"text","text":") so that it can be accessed by other applications outside of Expo."}],"blockTags":[{"tag":"@example","content":[{"kind":"code","text":"```js\nFileSystem.getContentUriAsync(uri).then(cUri => {\n console.log(cUri);\n IntentLauncher.startActivityAsync('android.intent.action.VIEW', {\n data: cUri,\n flags: 1,\n });\n});\n```"}]},{"tag":"@returns","content":[{"kind":"text","text":"Returns a Promise that resolves to a "},{"kind":"code","text":"`string`"},{"kind":"text","text":" containing a "},{"kind":"code","text":"`content://`"},{"kind":"text","text":" URI pointing to the file.\nThe URI is the same as the "},{"kind":"code","text":"`fileUri`"},{"kind":"text","text":" input parameter but in a different format."}]},{"tag":"@platform","content":[{"kind":"text","text":"android"}]}]},"parameters":[{"name":"fileUri","kind":32768,"comment":{"summary":[{"kind":"text","text":"The local URI of the file. If there is no file at this URI, an exception will be thrown."}]},"type":{"type":"intrinsic","name":"string"}}],"type":{"type":"reference","typeArguments":[{"type":"intrinsic","name":"string"}],"name":"Promise","qualifiedName":"Promise","package":"typescript"}}]},{"name":"getFreeDiskStorageAsync","kind":64,"signatures":[{"name":"getFreeDiskStorageAsync","kind":4096,"comment":{"summary":[{"kind":"text","text":"Gets the available internal disk storage size, in bytes. This returns the free space on the data partition that hosts all of the internal storage for all apps on the device."}],"blockTags":[{"tag":"@returns","content":[{"kind":"text","text":"Returns a Promise that resolves to the number of bytes available on the internal disk, or JavaScript's ["},{"kind":"code","text":"`MAX_SAFE_INTEGER`"},{"kind":"text","text":"](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Number/MAX_SAFE_INTEGER)\nif the capacity is greater than 253 - 1 bytes."}]}]},"type":{"type":"reference","typeArguments":[{"type":"intrinsic","name":"number"}],"name":"Promise","qualifiedName":"Promise","package":"typescript"}}]},{"name":"getInfoAsync","kind":64,"signatures":[{"name":"getInfoAsync","kind":4096,"comment":{"summary":[{"kind":"text","text":"Get metadata information about a file, directory or external content/asset."}],"blockTags":[{"tag":"@returns","content":[{"kind":"text","text":"A Promise that resolves to a "},{"kind":"code","text":"`FileInfo`"},{"kind":"text","text":" object. If no item exists at this URI,\nthe returned Promise resolves to "},{"kind":"code","text":"`FileInfo`"},{"kind":"text","text":" object in form of "},{"kind":"code","text":"`{ exists: false, isDirectory: false }`"},{"kind":"text","text":"."}]}]},"parameters":[{"name":"fileUri","kind":32768,"comment":{"summary":[{"kind":"text","text":"URI to the file or directory. See [supported URI schemes](#supported-uri-schemes)."}]},"type":{"type":"intrinsic","name":"string"}},{"name":"options","kind":32768,"comment":{"summary":[{"kind":"text","text":"A map of options represented by ["},{"kind":"code","text":"`GetInfoAsyncOptions`"},{"kind":"text","text":"](#getinfoasyncoptions) type."}]},"type":{"type":"reference","name":"InfoOptions"},"defaultValue":"{}"}],"type":{"type":"reference","typeArguments":[{"type":"reference","name":"FileInfo"}],"name":"Promise","qualifiedName":"Promise","package":"typescript"}}]},{"name":"getTotalDiskCapacityAsync","kind":64,"signatures":[{"name":"getTotalDiskCapacityAsync","kind":4096,"comment":{"summary":[{"kind":"text","text":"Gets total internal disk storage size, in bytes. This is the total capacity of the data partition that hosts all the internal storage for all apps on the device."}],"blockTags":[{"tag":"@returns","content":[{"kind":"text","text":"Returns a Promise that resolves to a number that specifies the total internal disk storage capacity in bytes, or JavaScript's ["},{"kind":"code","text":"`MAX_SAFE_INTEGER`"},{"kind":"text","text":"](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Number/MAX_SAFE_INTEGER)\nif the capacity is greater than 253 - 1 bytes."}]}]},"type":{"type":"reference","typeArguments":[{"type":"intrinsic","name":"number"}],"name":"Promise","qualifiedName":"Promise","package":"typescript"}}]},{"name":"makeDirectoryAsync","kind":64,"signatures":[{"name":"makeDirectoryAsync","kind":4096,"comment":{"summary":[{"kind":"text","text":"Create a new empty directory."}]},"parameters":[{"name":"fileUri","kind":32768,"comment":{"summary":[{"kind":"code","text":"`file://`"},{"kind":"text","text":" URI to the new directory to create."}]},"type":{"type":"intrinsic","name":"string"}},{"name":"options","kind":32768,"comment":{"summary":[{"kind":"text","text":"A map of create directory options represented by ["},{"kind":"code","text":"`MakeDirectoryOptions`"},{"kind":"text","text":"](#makedirectoryoptions) type."}]},"type":{"type":"reference","name":"MakeDirectoryOptions"},"defaultValue":"{}"}],"type":{"type":"reference","typeArguments":[{"type":"intrinsic","name":"void"}],"name":"Promise","qualifiedName":"Promise","package":"typescript"}}]},{"name":"moveAsync","kind":64,"signatures":[{"name":"moveAsync","kind":4096,"comment":{"summary":[{"kind":"text","text":"Move a file or directory to a new location."}]},"parameters":[{"name":"options","kind":32768,"comment":{"summary":[{"kind":"text","text":"A map of move options represented by ["},{"kind":"code","text":"`RelocatingOptions`"},{"kind":"text","text":"](#relocatingoptions) type."}]},"type":{"type":"reference","name":"RelocatingOptions"}}],"type":{"type":"reference","typeArguments":[{"type":"intrinsic","name":"void"}],"name":"Promise","qualifiedName":"Promise","package":"typescript"}}]},{"name":"readAsStringAsync","kind":64,"signatures":[{"name":"readAsStringAsync","kind":4096,"comment":{"summary":[{"kind":"text","text":"Read the entire contents of a file as a string. Binary will be returned in raw format, you will need to append "},{"kind":"code","text":"`data:image/png;base64,`"},{"kind":"text","text":" to use it as Base64."}],"blockTags":[{"tag":"@returns","content":[{"kind":"text","text":"A Promise that resolves to a string containing the entire contents of the file."}]}]},"parameters":[{"name":"fileUri","kind":32768,"comment":{"summary":[{"kind":"code","text":"`file://`"},{"kind":"text","text":" or [SAF](#saf-uri) URI to the file or directory."}]},"type":{"type":"intrinsic","name":"string"}},{"name":"options","kind":32768,"comment":{"summary":[{"kind":"text","text":"A map of read options represented by ["},{"kind":"code","text":"`ReadingOptions`"},{"kind":"text","text":"](#readingoptions) type."}]},"type":{"type":"reference","name":"ReadingOptions"},"defaultValue":"{}"}],"type":{"type":"reference","typeArguments":[{"type":"intrinsic","name":"string"}],"name":"Promise","qualifiedName":"Promise","package":"typescript"}}]},{"name":"readDirectoryAsync","kind":64,"signatures":[{"name":"readDirectoryAsync","kind":4096,"comment":{"summary":[{"kind":"text","text":"Enumerate the contents of a directory."}],"blockTags":[{"tag":"@returns","content":[{"kind":"text","text":"A Promise that resolves to an array of strings, each containing the name of a file or directory contained in the directory at "},{"kind":"code","text":"`fileUri`"},{"kind":"text","text":"."}]}]},"parameters":[{"name":"fileUri","kind":32768,"comment":{"summary":[{"kind":"code","text":"`file://`"},{"kind":"text","text":" URI to the directory."}]},"type":{"type":"intrinsic","name":"string"}}],"type":{"type":"reference","typeArguments":[{"type":"array","elementType":{"type":"intrinsic","name":"string"}}],"name":"Promise","qualifiedName":"Promise","package":"typescript"}}]},{"name":"uploadAsync","kind":64,"signatures":[{"name":"uploadAsync","kind":4096,"comment":{"summary":[{"kind":"text","text":"Upload the contents of the file pointed by "},{"kind":"code","text":"`fileUri`"},{"kind":"text","text":" to the remote url."}],"blockTags":[{"tag":"@example","content":[{"kind":"text","text":"**Client**\n\n"},{"kind":"code","text":"```js\nimport * as FileSystem from 'expo-file-system';\n\ntry {\n const response = await FileSystem.uploadAsync(`http://192.168.0.1:1234/binary-upload`, fileUri, {\n fieldName: 'file',\n httpMethod: 'PATCH',\n uploadType: FileSystem.FileSystemUploadType.BINARY_CONTENT,\n });\n console.log(JSON.stringify(response, null, 4));\n} catch (error) {\n console.log(error);\n}\n```"},{"kind":"text","text":"\n\n**Server**\n\nPlease refer to the \"[Server: Handling multipart requests](#server-handling-multipart-requests)\" example - there is code for a simple Node.js server."}]},{"tag":"@returns","content":[{"kind":"text","text":"Returns a Promise that resolves to "},{"kind":"code","text":"`FileSystemUploadResult`"},{"kind":"text","text":" object."}]}]},"parameters":[{"name":"url","kind":32768,"comment":{"summary":[{"kind":"text","text":"The remote URL, where the file will be sent."}]},"type":{"type":"intrinsic","name":"string"}},{"name":"fileUri","kind":32768,"comment":{"summary":[{"kind":"text","text":"The local URI of the file to send. The file must exist."}]},"type":{"type":"intrinsic","name":"string"}},{"name":"options","kind":32768,"comment":{"summary":[{"kind":"text","text":"A map of download options represented by ["},{"kind":"code","text":"`FileSystemUploadOptions`"},{"kind":"text","text":"](#filesystemuploadoptions) type."}]},"type":{"type":"reference","name":"FileSystemUploadOptions"},"defaultValue":"{}"}],"type":{"type":"reference","typeArguments":[{"type":"reference","name":"FileSystemUploadResult"}],"name":"Promise","qualifiedName":"Promise","package":"typescript"}}]},{"name":"writeAsStringAsync","kind":64,"signatures":[{"name":"writeAsStringAsync","kind":4096,"comment":{"summary":[{"kind":"text","text":"Write the entire contents of a file as a string."}]},"parameters":[{"name":"fileUri","kind":32768,"comment":{"summary":[{"kind":"code","text":"`file://`"},{"kind":"text","text":" or [SAF](#saf-uri) URI to the file or directory.\n> Note: when you're using SAF URI the file needs to exist. You can't create a new file."}]},"type":{"type":"intrinsic","name":"string"}},{"name":"contents","kind":32768,"comment":{"summary":[{"kind":"text","text":"The string to replace the contents of the file with."}]},"type":{"type":"intrinsic","name":"string"}},{"name":"options","kind":32768,"comment":{"summary":[{"kind":"text","text":"A map of write options represented by ["},{"kind":"code","text":"`WritingOptions`"},{"kind":"text","text":"](#writingoptions) type."}]},"type":{"type":"reference","name":"WritingOptions"},"defaultValue":"{}"}],"type":{"type":"reference","typeArguments":[{"type":"intrinsic","name":"void"}],"name":"Promise","qualifiedName":"Promise","package":"typescript"}}]}]}
\ No newline at end of file
+{"name":"expo-file-system","kind":1,"children":[{"name":"StorageAccessFramework","kind":4,"comment":{"summary":[{"kind":"text","text":"The "},{"kind":"code","text":"`StorageAccessFramework`"},{"kind":"text","text":" is a namespace inside of the "},{"kind":"code","text":"`expo-file-system`"},{"kind":"text","text":" module, which encapsulates all functions which can be used with [SAF URIs](#saf-uri).\nYou can read more about SAF in the [Android documentation](https://developer.android.com/guide/topics/providers/document-provider)."}],"blockTags":[{"tag":"@example","content":[{"kind":"text","text":"# Basic Usage\n\n"},{"kind":"code","text":"```ts\nimport { StorageAccessFramework } from 'expo-file-system';\n\n// Requests permissions for external directory\nconst permissions = await StorageAccessFramework.requestDirectoryPermissionsAsync();\n\nif (permissions.granted) {\n // Gets SAF URI from response\n const uri = permissions.directoryUri;\n\n // Gets all files inside of selected directory\n const files = await StorageAccessFramework.readDirectoryAsync(uri);\n alert(`Files inside ${uri}:\\n\\n${JSON.stringify(files)}`);\n}\n```"},{"kind":"text","text":"\n\n# Migrating an album\n\n"},{"kind":"code","text":"```ts\nimport * as MediaLibrary from 'expo-media-library';\nimport * as FileSystem from 'expo-file-system';\nconst { StorageAccessFramework } = FileSystem;\n\nasync function migrateAlbum(albumName: string) {\n // Gets SAF URI to the album\n const albumUri = StorageAccessFramework.getUriForDirectoryInRoot(albumName);\n\n // Requests permissions\n const permissions = await StorageAccessFramework.requestDirectoryPermissionsAsync(albumUri);\n if (!permissions.granted) {\n return;\n }\n\n const permittedUri = permissions.directoryUri;\n // Checks if users selected the correct folder\n if (!permittedUri.includes(albumName)) {\n return;\n }\n\n const mediaLibraryPermissions = await MediaLibrary.requestPermissionsAsync();\n if (!mediaLibraryPermissions.granted) {\n return;\n }\n\n // Moves files from external storage to internal storage\n await StorageAccessFramework.moveAsync({\n from: permittedUri,\n to: FileSystem.documentDirectory!,\n });\n\n const outputDir = FileSystem.documentDirectory! + albumName;\n const migratedFiles = await FileSystem.readDirectoryAsync(outputDir);\n\n // Creates assets from local files\n const [newAlbumCreator, ...assets] = await Promise.all(\n migratedFiles.map>(\n async fileName => await MediaLibrary.createAssetAsync(outputDir + '/' + fileName)\n )\n );\n\n // Album was empty\n if (!newAlbumCreator) {\n return;\n }\n\n // Creates a new album in the scoped directory\n const newAlbum = await MediaLibrary.createAlbumAsync(albumName, newAlbumCreator, false);\n if (assets.length) {\n await MediaLibrary.addAssetsToAlbumAsync(assets, newAlbum, false);\n }\n}\n```"}]},{"tag":"@platform","content":[{"kind":"text","text":"Android"}]}]},"children":[{"name":"copyAsync","kind":64,"signatures":[{"name":"copyAsync","kind":4096,"comment":{"summary":[{"kind":"text","text":"Alias for ["},{"kind":"code","text":"`copyAsync`"},{"kind":"text","text":"](#filesystemcopyasyncoptions) method."}]},"parameters":[{"name":"options","kind":32768,"type":{"type":"reference","name":"RelocatingOptions"}}],"type":{"type":"reference","typeArguments":[{"type":"intrinsic","name":"void"}],"name":"Promise","qualifiedName":"Promise","package":"typescript"}}]},{"name":"createFileAsync","kind":64,"signatures":[{"name":"createFileAsync","kind":4096,"comment":{"summary":[{"kind":"text","text":"Creates a new empty file."}],"blockTags":[{"tag":"@returns","content":[{"kind":"text","text":"A Promise that resolves to a [SAF URI](#saf-uri) to the created file."}]}]},"parameters":[{"name":"parentUri","kind":32768,"comment":{"summary":[{"kind":"text","text":"The [SAF](#saf-uri) URI to the parent directory."}]},"type":{"type":"intrinsic","name":"string"}},{"name":"fileName","kind":32768,"comment":{"summary":[{"kind":"text","text":"The name of new file **without the extension**."}]},"type":{"type":"intrinsic","name":"string"}},{"name":"mimeType","kind":32768,"comment":{"summary":[{"kind":"text","text":"The MIME type of new file."}]},"type":{"type":"intrinsic","name":"string"}}],"type":{"type":"reference","typeArguments":[{"type":"intrinsic","name":"string"}],"name":"Promise","qualifiedName":"Promise","package":"typescript"}}]},{"name":"deleteAsync","kind":64,"signatures":[{"name":"deleteAsync","kind":4096,"comment":{"summary":[{"kind":"text","text":"Alias for ["},{"kind":"code","text":"`deleteAsync`"},{"kind":"text","text":"](#filesystemdeleteasyncfileuri-options) method."}]},"parameters":[{"name":"fileUri","kind":32768,"type":{"type":"intrinsic","name":"string"}},{"name":"options","kind":32768,"type":{"type":"reference","name":"DeletingOptions"},"defaultValue":"{}"}],"type":{"type":"reference","typeArguments":[{"type":"intrinsic","name":"void"}],"name":"Promise","qualifiedName":"Promise","package":"typescript"}}]},{"name":"getUriForDirectoryInRoot","kind":64,"signatures":[{"name":"getUriForDirectoryInRoot","kind":4096,"comment":{"summary":[{"kind":"text","text":"Gets a [SAF URI](#saf-uri) pointing to a folder in the Android root directory. You can use this function to get URI for\n"},{"kind":"code","text":"`StorageAccessFramework.requestDirectoryPermissionsAsync()`"},{"kind":"text","text":" when you trying to migrate an album. In that case, the name of the album is the folder name."}],"blockTags":[{"tag":"@returns","content":[{"kind":"text","text":"Returns a [SAF URI](#saf-uri) to a folder."}]}]},"parameters":[{"name":"folderName","kind":32768,"comment":{"summary":[{"kind":"text","text":"The name of the folder which is located in the Android root directory."}]},"type":{"type":"intrinsic","name":"string"}}],"type":{"type":"intrinsic","name":"string"}}]},{"name":"makeDirectoryAsync","kind":64,"signatures":[{"name":"makeDirectoryAsync","kind":4096,"comment":{"summary":[{"kind":"text","text":"Creates a new empty directory."}],"blockTags":[{"tag":"@returns","content":[{"kind":"text","text":"A Promise that resolves to a [SAF URI](#saf-uri) to the created directory."}]}]},"parameters":[{"name":"parentUri","kind":32768,"comment":{"summary":[{"kind":"text","text":"The [SAF](#saf-uri) URI to the parent directory."}]},"type":{"type":"intrinsic","name":"string"}},{"name":"dirName","kind":32768,"comment":{"summary":[{"kind":"text","text":"The name of new directory."}]},"type":{"type":"intrinsic","name":"string"}}],"type":{"type":"reference","typeArguments":[{"type":"intrinsic","name":"string"}],"name":"Promise","qualifiedName":"Promise","package":"typescript"}}]},{"name":"moveAsync","kind":64,"signatures":[{"name":"moveAsync","kind":4096,"comment":{"summary":[{"kind":"text","text":"Alias for ["},{"kind":"code","text":"`moveAsync`"},{"kind":"text","text":"](#filesystemmoveasyncoptions) method."}]},"parameters":[{"name":"options","kind":32768,"type":{"type":"reference","name":"RelocatingOptions"}}],"type":{"type":"reference","typeArguments":[{"type":"intrinsic","name":"void"}],"name":"Promise","qualifiedName":"Promise","package":"typescript"}}]},{"name":"readAsStringAsync","kind":64,"signatures":[{"name":"readAsStringAsync","kind":4096,"comment":{"summary":[{"kind":"text","text":"Alias for ["},{"kind":"code","text":"`readAsStringAsync`"},{"kind":"text","text":"](#filesystemreadasstringasyncfileuri-options) method."}]},"parameters":[{"name":"fileUri","kind":32768,"type":{"type":"intrinsic","name":"string"}},{"name":"options","kind":32768,"type":{"type":"reference","name":"ReadingOptions"},"defaultValue":"{}"}],"type":{"type":"reference","typeArguments":[{"type":"intrinsic","name":"string"}],"name":"Promise","qualifiedName":"Promise","package":"typescript"}}]},{"name":"readDirectoryAsync","kind":64,"signatures":[{"name":"readDirectoryAsync","kind":4096,"comment":{"summary":[{"kind":"text","text":"Enumerate the contents of a directory."}],"blockTags":[{"tag":"@returns","content":[{"kind":"text","text":"A Promise that resolves to an array of strings, each containing the full [SAF URI](#saf-uri) of a file or directory contained in the directory at "},{"kind":"code","text":"`fileUri`"},{"kind":"text","text":"."}]}]},"parameters":[{"name":"dirUri","kind":32768,"comment":{"summary":[{"kind":"text","text":"[SAF](#saf-uri) URI to the directory."}]},"type":{"type":"intrinsic","name":"string"}}],"type":{"type":"reference","typeArguments":[{"type":"array","elementType":{"type":"intrinsic","name":"string"}}],"name":"Promise","qualifiedName":"Promise","package":"typescript"}}]},{"name":"requestDirectoryPermissionsAsync","kind":64,"signatures":[{"name":"requestDirectoryPermissionsAsync","kind":4096,"comment":{"summary":[{"kind":"text","text":"Allows users to select a specific directory, granting your app access to all of the files and sub-directories within that directory."}],"blockTags":[{"tag":"@platform","content":[{"kind":"text","text":"android 11+"}]},{"tag":"@returns","content":[{"kind":"text","text":"Returns a Promise that resolves to "},{"kind":"code","text":"`FileSystemRequestDirectoryPermissionsResult`"},{"kind":"text","text":" object."}]}]},"parameters":[{"name":"initialFileUrl","kind":32768,"comment":{"summary":[{"kind":"text","text":"The [SAF URI](#saf-uri) of the directory that the file picker should display when it first loads.\nIf URI is incorrect or points to a non-existing folder, it's ignored."}]},"type":{"type":"union","types":[{"type":"literal","value":null},{"type":"intrinsic","name":"string"}]},"defaultValue":"null"}],"type":{"type":"reference","typeArguments":[{"type":"reference","name":"FileSystemRequestDirectoryPermissionsResult"}],"name":"Promise","qualifiedName":"Promise","package":"typescript"}}]},{"name":"writeAsStringAsync","kind":64,"signatures":[{"name":"writeAsStringAsync","kind":4096,"comment":{"summary":[{"kind":"text","text":"Alias for ["},{"kind":"code","text":"`writeAsStringAsync`"},{"kind":"text","text":"](#filesystemwriteasstringasyncfileuri-contents-options) method."}]},"parameters":[{"name":"fileUri","kind":32768,"type":{"type":"intrinsic","name":"string"}},{"name":"contents","kind":32768,"type":{"type":"intrinsic","name":"string"}},{"name":"options","kind":32768,"type":{"type":"reference","name":"WritingOptions"},"defaultValue":"{}"}],"type":{"type":"reference","typeArguments":[{"type":"intrinsic","name":"void"}],"name":"Promise","qualifiedName":"Promise","package":"typescript"}}]}]},{"name":"EncodingType","kind":8,"comment":{"summary":[{"kind":"text","text":"These values can be used to define how file system data is read / written."}]},"children":[{"name":"Base64","kind":16,"comment":{"summary":[{"kind":"text","text":"Binary, radix-64 representation."}]},"type":{"type":"literal","value":"base64"}},{"name":"UTF8","kind":16,"comment":{"summary":[{"kind":"text","text":"Standard encoding format."}]},"type":{"type":"literal","value":"utf8"}}]},{"name":"FileSystemSessionType","kind":8,"comment":{"summary":[{"kind":"text","text":"These values can be used to define how sessions work on iOS."}],"blockTags":[{"tag":"@platform","content":[{"kind":"text","text":"ios"}]}]},"children":[{"name":"BACKGROUND","kind":16,"comment":{"summary":[{"kind":"text","text":"Using this mode means that the downloading/uploading session on the native side will work even if the application is moved to background.\nIf the task completes while the application is in background, the Promise will be either resolved immediately or (if the application execution has already been stopped) once the app is moved to foreground again.\n> Note: The background session doesn't fail if the server or your connection is down. Rather, it continues retrying until the task succeeds or is canceled manually."}]},"type":{"type":"literal","value":0}},{"name":"FOREGROUND","kind":16,"comment":{"summary":[{"kind":"text","text":"Using this mode means that downloading/uploading session on the native side will be terminated once the application becomes inactive (e.g. when it goes to background).\nBringing the application to foreground again would trigger Promise rejection."}]},"type":{"type":"literal","value":1}}]},{"name":"FileSystemUploadType","kind":8,"children":[{"name":"BINARY_CONTENT","kind":16,"comment":{"summary":[{"kind":"text","text":"The file will be sent as a request's body. The request can't contain additional data."}]},"type":{"type":"literal","value":0}},{"name":"MULTIPART","kind":16,"comment":{"summary":[{"kind":"text","text":"An [RFC 2387-compliant](https://www.ietf.org/rfc/rfc2387.txt) request body. The provided file will be encoded into HTTP request.\nThis request can contain additional data represented by ["},{"kind":"code","text":"`UploadOptionsMultipart`"},{"kind":"text","text":"](#uploadoptionsmultipart) type."}]},"type":{"type":"literal","value":1}}]},{"name":"DownloadResumable","kind":128,"children":[{"name":"constructor","kind":512,"signatures":[{"name":"new DownloadResumable","kind":16384,"parameters":[{"name":"url","kind":32768,"type":{"type":"intrinsic","name":"string"}},{"name":"_fileUri","kind":32768,"type":{"type":"intrinsic","name":"string"}},{"name":"options","kind":32768,"type":{"type":"reference","name":"DownloadOptions"},"defaultValue":"{}"},{"name":"callback","kind":32768,"flags":{"isOptional":true},"type":{"type":"reference","typeArguments":[{"type":"reference","name":"DownloadProgressData"}],"name":"FileSystemNetworkTaskProgressCallback"}},{"name":"resumeData","kind":32768,"flags":{"isOptional":true},"type":{"type":"intrinsic","name":"string"}}],"type":{"type":"reference","name":"DownloadResumable"},"overwrites":{"type":"reference","name":"FileSystemCancellableNetworkTask.constructor"}}],"overwrites":{"type":"reference","name":"FileSystemCancellableNetworkTask.constructor"}},{"name":"fileUri","kind":262144,"flags":{"isPublic":true},"getSignature":{"name":"fileUri","kind":524288,"type":{"type":"intrinsic","name":"string"}}},{"name":"cancelAsync","kind":2048,"flags":{"isPublic":true},"signatures":[{"name":"cancelAsync","kind":4096,"type":{"type":"reference","typeArguments":[{"type":"intrinsic","name":"void"}],"name":"Promise","qualifiedName":"Promise","package":"typescript"},"inheritedFrom":{"type":"reference","name":"FileSystemCancellableNetworkTask.cancelAsync"}}],"inheritedFrom":{"type":"reference","name":"FileSystemCancellableNetworkTask.cancelAsync"}},{"name":"downloadAsync","kind":2048,"signatures":[{"name":"downloadAsync","kind":4096,"comment":{"summary":[{"kind":"text","text":"Download the contents at a remote URI to a file in the app's file system."}],"blockTags":[{"tag":"@returns","content":[{"kind":"text","text":"Returns a Promise that resolves to "},{"kind":"code","text":"`FileSystemDownloadResult`"},{"kind":"text","text":" object, or to "},{"kind":"code","text":"`undefined`"},{"kind":"text","text":" when task was cancelled."}]}]},"type":{"type":"reference","typeArguments":[{"type":"union","types":[{"type":"intrinsic","name":"undefined"},{"type":"reference","name":"FileSystemDownloadResult"}]}],"name":"Promise","qualifiedName":"Promise","package":"typescript"}}]},{"name":"pauseAsync","kind":2048,"signatures":[{"name":"pauseAsync","kind":4096,"comment":{"summary":[{"kind":"text","text":"Pause the current download operation. "},{"kind":"code","text":"`resumeData`"},{"kind":"text","text":" is added to the "},{"kind":"code","text":"`DownloadResumable`"},{"kind":"text","text":" object after a successful pause operation.\nReturns an object that can be saved with "},{"kind":"code","text":"`AsyncStorage`"},{"kind":"text","text":" for future retrieval (the same object that is returned from calling "},{"kind":"code","text":"`FileSystem.DownloadResumable.savable()`"},{"kind":"text","text":")."}],"blockTags":[{"tag":"@returns","content":[{"kind":"text","text":"Returns a Promise that resolves to "},{"kind":"code","text":"`DownloadPauseState`"},{"kind":"text","text":" object."}]}]},"type":{"type":"reference","typeArguments":[{"type":"reference","name":"DownloadPauseState"}],"name":"Promise","qualifiedName":"Promise","package":"typescript"}}]},{"name":"resumeAsync","kind":2048,"signatures":[{"name":"resumeAsync","kind":4096,"comment":{"summary":[{"kind":"text","text":"Resume a paused download operation."}],"blockTags":[{"tag":"@returns","content":[{"kind":"text","text":"Returns a Promise that resolves to "},{"kind":"code","text":"`FileSystemDownloadResult`"},{"kind":"text","text":" object, or to "},{"kind":"code","text":"`undefined`"},{"kind":"text","text":" when task was cancelled."}]}]},"type":{"type":"reference","typeArguments":[{"type":"union","types":[{"type":"intrinsic","name":"undefined"},{"type":"reference","name":"FileSystemDownloadResult"}]}],"name":"Promise","qualifiedName":"Promise","package":"typescript"}}]},{"name":"savable","kind":2048,"signatures":[{"name":"savable","kind":4096,"comment":{"summary":[{"kind":"text","text":"Method to get the object which can be saved with "},{"kind":"code","text":"`AsyncStorage`"},{"kind":"text","text":" for future retrieval."}],"blockTags":[{"tag":"@returns","content":[{"kind":"text","text":"Returns object in shape of "},{"kind":"code","text":"`DownloadPauseState`"},{"kind":"text","text":" type."}]}]},"type":{"type":"reference","name":"DownloadPauseState"}}]}],"extendedTypes":[{"type":"reference","typeArguments":[{"type":"reference","name":"DownloadProgressData"}],"name":"FileSystemCancellableNetworkTask"}]},{"name":"FileSystemCancellableNetworkTask","kind":128,"flags":{"isAbstract":true},"children":[{"name":"constructor","kind":512,"signatures":[{"name":"new FileSystemCancellableNetworkTask","kind":16384,"typeParameter":[{"name":"T","kind":131072,"type":{"type":"union","types":[{"type":"reference","name":"DownloadProgressData"},{"type":"reference","name":"UploadProgressData"}]}}],"type":{"type":"reference","typeArguments":[{"type":"reference","name":"T"}],"name":"FileSystemCancellableNetworkTask"}}]},{"name":"cancelAsync","kind":2048,"flags":{"isPublic":true},"signatures":[{"name":"cancelAsync","kind":4096,"type":{"type":"reference","typeArguments":[{"type":"intrinsic","name":"void"}],"name":"Promise","qualifiedName":"Promise","package":"typescript"}}]}],"typeParameters":[{"name":"T","kind":131072,"type":{"type":"union","types":[{"type":"reference","name":"DownloadProgressData"},{"type":"reference","name":"UploadProgressData"}]}}],"extendedBy":[{"type":"reference","name":"UploadTask"},{"type":"reference","name":"DownloadResumable"}]},{"name":"UploadTask","kind":128,"children":[{"name":"constructor","kind":512,"signatures":[{"name":"new UploadTask","kind":16384,"parameters":[{"name":"url","kind":32768,"type":{"type":"intrinsic","name":"string"}},{"name":"fileUri","kind":32768,"type":{"type":"intrinsic","name":"string"}},{"name":"options","kind":32768,"flags":{"isOptional":true},"type":{"type":"reference","name":"FileSystemUploadOptions"}},{"name":"callback","kind":32768,"flags":{"isOptional":true},"type":{"type":"reference","typeArguments":[{"type":"reference","name":"UploadProgressData"}],"name":"FileSystemNetworkTaskProgressCallback"}}],"type":{"type":"reference","name":"UploadTask"},"overwrites":{"type":"reference","name":"FileSystemCancellableNetworkTask.constructor"}}],"overwrites":{"type":"reference","name":"FileSystemCancellableNetworkTask.constructor"}},{"name":"cancelAsync","kind":2048,"flags":{"isPublic":true},"signatures":[{"name":"cancelAsync","kind":4096,"type":{"type":"reference","typeArguments":[{"type":"intrinsic","name":"void"}],"name":"Promise","qualifiedName":"Promise","package":"typescript"},"inheritedFrom":{"type":"reference","name":"FileSystemCancellableNetworkTask.cancelAsync"}}],"inheritedFrom":{"type":"reference","name":"FileSystemCancellableNetworkTask.cancelAsync"}},{"name":"uploadAsync","kind":2048,"flags":{"isPublic":true},"signatures":[{"name":"uploadAsync","kind":4096,"type":{"type":"reference","typeArguments":[{"type":"union","types":[{"type":"intrinsic","name":"undefined"},{"type":"reference","name":"FileSystemUploadResult"}]}],"name":"Promise","qualifiedName":"Promise","package":"typescript"}}]}],"extendedTypes":[{"type":"reference","typeArguments":[{"type":"reference","name":"UploadProgressData"}],"name":"FileSystemCancellableNetworkTask"}]},{"name":"DeletingOptions","kind":4194304,"type":{"type":"reflection","declaration":{"name":"__type","kind":65536,"children":[{"name":"idempotent","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"If "},{"kind":"code","text":"`true`"},{"kind":"text","text":", don't throw an error if there is no file or directory at this URI."}],"blockTags":[{"tag":"@default","content":[{"kind":"text","text":"false"}]}]},"type":{"type":"intrinsic","name":"boolean"}}]}}},{"name":"DownloadOptions","kind":4194304,"type":{"type":"reflection","declaration":{"name":"__type","kind":65536,"children":[{"name":"cache","kind":1024,"flags":{"isOptional":true},"type":{"type":"intrinsic","name":"boolean"}},{"name":"headers","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"An object containing all the HTTP header fields and their values for the download network request. The keys and values of the object are the header names and values respectively."}]},"type":{"type":"reference","typeArguments":[{"type":"intrinsic","name":"string"},{"type":"intrinsic","name":"string"}],"name":"Record","qualifiedName":"Record","package":"typescript"}},{"name":"md5","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"If "},{"kind":"code","text":"`true`"},{"kind":"text","text":", include the MD5 hash of the file in the returned object. Provided for convenience since it is common to check the integrity of a file immediately after downloading."}],"blockTags":[{"tag":"@default","content":[{"kind":"text","text":"false"}]}]},"type":{"type":"intrinsic","name":"boolean"}},{"name":"sessionType","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"A session type. Determines if tasks can be handled in the background. On Android, sessions always work in the background and you can't change it."}],"blockTags":[{"tag":"@default","content":[{"kind":"text","text":"FileSystemSessionType.BACKGROUND"}]},{"tag":"@platform","content":[{"kind":"text","text":"ios"}]}]},"type":{"type":"reference","name":"FileSystemSessionType"}}]}}},{"name":"DownloadPauseState","kind":4194304,"type":{"type":"reflection","declaration":{"name":"__type","kind":65536,"children":[{"name":"fileUri","kind":1024,"comment":{"summary":[{"kind":"text","text":"The local URI of the file to download to. If there is no file at this URI, a new one is created. If there is a file at this URI, its contents are replaced."}]},"type":{"type":"intrinsic","name":"string"}},{"name":"options","kind":1024,"comment":{"summary":[{"kind":"text","text":"Object representing the file download options."}]},"type":{"type":"reference","name":"DownloadOptions"}},{"name":"resumeData","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"The string which allows the API to resume a paused download."}]},"type":{"type":"intrinsic","name":"string"}},{"name":"url","kind":1024,"comment":{"summary":[{"kind":"text","text":"The remote URI to download from."}]},"type":{"type":"intrinsic","name":"string"}}]}}},{"name":"DownloadProgressCallback","kind":4194304,"comment":{"summary":[],"blockTags":[{"tag":"@deprecated","content":[{"kind":"text","text":"use "},{"kind":"code","text":"`FileSystemNetworkTaskProgressCallback`"},{"kind":"text","text":" instead."}]}]},"type":{"type":"reference","typeArguments":[{"type":"reference","name":"DownloadProgressData"}],"name":"FileSystemNetworkTaskProgressCallback"}},{"name":"DownloadProgressData","kind":4194304,"type":{"type":"reflection","declaration":{"name":"__type","kind":65536,"children":[{"name":"totalBytesExpectedToWrite","kind":1024,"comment":{"summary":[{"kind":"text","text":"The total bytes expected to be written by the download operation. A value of "},{"kind":"code","text":"`-1`"},{"kind":"text","text":" means that the server did not return the "},{"kind":"code","text":"`Content-Length`"},{"kind":"text","text":" header\nand the total size is unknown. Without this header, you won't be able to track the download progress."}]},"type":{"type":"intrinsic","name":"number"}},{"name":"totalBytesWritten","kind":1024,"comment":{"summary":[{"kind":"text","text":"The total bytes written by the download operation."}]},"type":{"type":"intrinsic","name":"number"}}]}}},{"name":"DownloadResult","kind":4194304,"comment":{"summary":[],"blockTags":[{"tag":"@deprecated","content":[{"kind":"text","text":"Use "},{"kind":"code","text":"`FileSystemDownloadResult`"},{"kind":"text","text":" instead."}]}]},"type":{"type":"reference","name":"FileSystemDownloadResult"}},{"name":"FileInfo","kind":4194304,"type":{"type":"union","types":[{"type":"reflection","declaration":{"name":"__type","kind":65536,"children":[{"name":"exists","kind":1024,"comment":{"summary":[{"kind":"text","text":"Signifies that the requested file exist."}]},"type":{"type":"literal","value":true}},{"name":"isDirectory","kind":1024,"comment":{"summary":[{"kind":"text","text":"Boolean set to "},{"kind":"code","text":"`true`"},{"kind":"text","text":" if this is a directory and "},{"kind":"code","text":"`false`"},{"kind":"text","text":" if it is a file."}]},"type":{"type":"intrinsic","name":"boolean"}},{"name":"md5","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"Present if the "},{"kind":"code","text":"`md5`"},{"kind":"text","text":" option was truthy. Contains the MD5 hash of the file."}]},"type":{"type":"intrinsic","name":"string"}},{"name":"modificationTime","kind":1024,"comment":{"summary":[{"kind":"text","text":"The last modification time of the file expressed in seconds since epoch."}]},"type":{"type":"intrinsic","name":"number"}},{"name":"size","kind":1024,"comment":{"summary":[{"kind":"text","text":"The size of the file in bytes. If operating on a source such as an iCloud file, only present if the "},{"kind":"code","text":"`size`"},{"kind":"text","text":" option was truthy."}]},"type":{"type":"intrinsic","name":"number"}},{"name":"uri","kind":1024,"comment":{"summary":[{"kind":"text","text":"A "},{"kind":"code","text":"`file://`"},{"kind":"text","text":" URI pointing to the file. This is the same as the "},{"kind":"code","text":"`fileUri`"},{"kind":"text","text":" input parameter."}]},"type":{"type":"intrinsic","name":"string"}}]}},{"type":"reflection","declaration":{"name":"__type","kind":65536,"children":[{"name":"exists","kind":1024,"type":{"type":"literal","value":false}},{"name":"isDirectory","kind":1024,"type":{"type":"literal","value":false}},{"name":"uri","kind":1024,"type":{"type":"intrinsic","name":"string"}}]}}]}},{"name":"FileSystemAcceptedUploadHttpMethod","kind":4194304,"type":{"type":"union","types":[{"type":"literal","value":"POST"},{"type":"literal","value":"PUT"},{"type":"literal","value":"PATCH"}]}},{"name":"FileSystemDownloadResult","kind":4194304,"type":{"type":"intersection","types":[{"type":"reference","name":"FileSystemHttpResult"},{"type":"reflection","declaration":{"name":"__type","kind":65536,"children":[{"name":"md5","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"Present if the "},{"kind":"code","text":"`md5`"},{"kind":"text","text":" option was truthy. Contains the MD5 hash of the file."}]},"type":{"type":"intrinsic","name":"string"}},{"name":"uri","kind":1024,"comment":{"summary":[{"kind":"text","text":"A "},{"kind":"code","text":"`file://`"},{"kind":"text","text":" URI pointing to the file. This is the same as the "},{"kind":"code","text":"`fileUri`"},{"kind":"text","text":" input parameter."}]},"type":{"type":"intrinsic","name":"string"}}]}}]}},{"name":"FileSystemHttpResult","kind":4194304,"type":{"type":"reflection","declaration":{"name":"__type","kind":65536,"children":[{"name":"headers","kind":1024,"comment":{"summary":[{"kind":"text","text":"An object containing all the HTTP response header fields and their values for the download network request.\nThe keys and values of the object are the header names and values respectively."}]},"type":{"type":"reference","typeArguments":[{"type":"intrinsic","name":"string"},{"type":"intrinsic","name":"string"}],"name":"Record","qualifiedName":"Record","package":"typescript"}},{"name":"mimeType","kind":1024,"type":{"type":"union","types":[{"type":"intrinsic","name":"string"},{"type":"literal","value":null}]}},{"name":"status","kind":1024,"comment":{"summary":[{"kind":"text","text":"The HTTP response status code for the download network request."}]},"type":{"type":"intrinsic","name":"number"}}]}}},{"name":"FileSystemNetworkTaskProgressCallback","kind":4194304,"typeParameters":[{"name":"T","kind":131072,"type":{"type":"union","types":[{"type":"reference","name":"DownloadProgressData"},{"type":"reference","name":"UploadProgressData"}]}}],"type":{"type":"reflection","declaration":{"name":"__type","kind":65536,"signatures":[{"name":"__type","kind":4096,"parameters":[{"name":"data","kind":32768,"type":{"type":"reference","name":"T"}}],"type":{"type":"intrinsic","name":"void"}}]}}},{"name":"FileSystemRequestDirectoryPermissionsResult","kind":4194304,"type":{"type":"union","types":[{"type":"reflection","declaration":{"name":"__type","kind":65536,"children":[{"name":"granted","kind":1024,"type":{"type":"literal","value":false}}]}},{"type":"reflection","declaration":{"name":"__type","kind":65536,"children":[{"name":"directoryUri","kind":1024,"comment":{"summary":[{"kind":"text","text":"The [SAF URI](#saf-uri) to the user's selected directory. Available only if permissions were granted."}]},"type":{"type":"intrinsic","name":"string"}},{"name":"granted","kind":1024,"type":{"type":"literal","value":true}}]}}]}},{"name":"FileSystemUploadOptions","kind":4194304,"type":{"type":"intersection","types":[{"type":"union","types":[{"type":"reference","name":"UploadOptionsBinary"},{"type":"reference","name":"UploadOptionsMultipart"}]},{"type":"reflection","declaration":{"name":"__type","kind":65536,"children":[{"name":"headers","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"An object containing all the HTTP header fields and their values for the upload network request.\nThe keys and values of the object are the header names and values respectively."}]},"type":{"type":"reference","typeArguments":[{"type":"intrinsic","name":"string"},{"type":"intrinsic","name":"string"}],"name":"Record","qualifiedName":"Record","package":"typescript"}},{"name":"httpMethod","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"The request method."}],"blockTags":[{"tag":"@default","content":[{"kind":"text","text":"FileSystemAcceptedUploadHttpMethod.POST"}]}]},"type":{"type":"reference","name":"FileSystemAcceptedUploadHttpMethod"}},{"name":"sessionType","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"A session type. Determines if tasks can be handled in the background. On Android, sessions always work in the background and you can't change it."}],"blockTags":[{"tag":"@default","content":[{"kind":"text","text":"FileSystemSessionType.BACKGROUND"}]},{"tag":"@platform","content":[{"kind":"text","text":"ios"}]}]},"type":{"type":"reference","name":"FileSystemSessionType"}}]}}]}},{"name":"FileSystemUploadResult","kind":4194304,"type":{"type":"intersection","types":[{"type":"reference","name":"FileSystemHttpResult"},{"type":"reflection","declaration":{"name":"__type","kind":65536,"children":[{"name":"body","kind":1024,"comment":{"summary":[{"kind":"text","text":"The body of the server response."}]},"type":{"type":"intrinsic","name":"string"}}]}}]}},{"name":"InfoOptions","kind":4194304,"type":{"type":"reflection","declaration":{"name":"__type","kind":65536,"children":[{"name":"md5","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"Whether to return the MD5 hash of the file."}],"blockTags":[{"tag":"@default","content":[{"kind":"text","text":"false"}]}]},"type":{"type":"intrinsic","name":"boolean"}},{"name":"size","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"Explicitly specify that the file size should be included. For example, skipping this can prevent downloading the file if it's stored in iCloud.\nThe size is always returned for "},{"kind":"code","text":"`file://`"},{"kind":"text","text":" locations."}]},"type":{"type":"intrinsic","name":"boolean"}}]}}},{"name":"MakeDirectoryOptions","kind":4194304,"type":{"type":"reflection","declaration":{"name":"__type","kind":65536,"children":[{"name":"intermediates","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"If "},{"kind":"code","text":"`true`"},{"kind":"text","text":", don't throw an error if there is no file or directory at this URI."}],"blockTags":[{"tag":"@default","content":[{"kind":"text","text":"false"}]}]},"type":{"type":"intrinsic","name":"boolean"}}]}}},{"name":"ProgressEvent","kind":4194304,"typeParameters":[{"name":"T","kind":131072}],"type":{"type":"reflection","declaration":{"name":"__type","kind":65536,"children":[{"name":"data","kind":1024,"type":{"type":"reference","name":"T"}},{"name":"uuid","kind":1024,"type":{"type":"intrinsic","name":"string"}}]}}},{"name":"ReadingOptions","kind":4194304,"type":{"type":"reflection","declaration":{"name":"__type","kind":65536,"children":[{"name":"encoding","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"The encoding format to use when reading the file."}],"blockTags":[{"tag":"@default","content":[{"kind":"text","text":"EncodingType.UTF8"}]}]},"type":{"type":"union","types":[{"type":"reference","name":"EncodingType"},{"type":"literal","value":"utf8"},{"type":"literal","value":"base64"}]}},{"name":"length","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"Optional number of bytes to read. This option is only used when "},{"kind":"code","text":"`encoding: FileSystem.EncodingType.Base64`"},{"kind":"text","text":" and "},{"kind":"code","text":"`position`"},{"kind":"text","text":" is defined."}]},"type":{"type":"intrinsic","name":"number"}},{"name":"position","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"Optional number of bytes to skip. This option is only used when "},{"kind":"code","text":"`encoding: FileSystem.EncodingType.Base64`"},{"kind":"text","text":" and "},{"kind":"code","text":"`length`"},{"kind":"text","text":" is defined."}]},"type":{"type":"intrinsic","name":"number"}}]}}},{"name":"RelocatingOptions","kind":4194304,"type":{"type":"reflection","declaration":{"name":"__type","kind":65536,"children":[{"name":"from","kind":1024,"comment":{"summary":[{"kind":"text","text":"URI or [SAF](#saf-uri) URI to the asset, file, or directory. See [supported URI schemes](#supported-uri-schemes-1)."}]},"type":{"type":"intrinsic","name":"string"}},{"name":"to","kind":1024,"comment":{"summary":[{"kind":"code","text":"`file://`"},{"kind":"text","text":" URI to the file or directory which should be its new location."}]},"type":{"type":"intrinsic","name":"string"}}]}}},{"name":"UploadOptionsBinary","kind":4194304,"comment":{"summary":[{"kind":"text","text":"Upload options when upload type is set to binary."}]},"type":{"type":"reflection","declaration":{"name":"__type","kind":65536,"children":[{"name":"uploadType","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"Upload type determines how the file will be sent to the server.\nValue will be "},{"kind":"code","text":"`FileSystemUploadType.BINARY_CONTENT`"},{"kind":"text","text":"."}]},"type":{"type":"reference","name":"FileSystemUploadType"}}]}}},{"name":"UploadOptionsMultipart","kind":4194304,"comment":{"summary":[{"kind":"text","text":"Upload options when upload type is set to multipart."}]},"type":{"type":"reflection","declaration":{"name":"__type","kind":65536,"children":[{"name":"fieldName","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"The name of the field which will hold uploaded file. Defaults to the file name without an extension."}]},"type":{"type":"intrinsic","name":"string"}},{"name":"mimeType","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"The MIME type of the provided file. If not provided, the module will try to guess it based on the extension."}]},"type":{"type":"intrinsic","name":"string"}},{"name":"parameters","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"Additional form properties. They will be located in the request body."}]},"type":{"type":"reference","typeArguments":[{"type":"intrinsic","name":"string"},{"type":"intrinsic","name":"string"}],"name":"Record","qualifiedName":"Record","package":"typescript"}},{"name":"uploadType","kind":1024,"comment":{"summary":[{"kind":"text","text":"Upload type determines how the file will be sent to the server.\nValue will be "},{"kind":"code","text":"`FileSystemUploadType.MULTIPART`"},{"kind":"text","text":"."}]},"type":{"type":"reference","name":"FileSystemUploadType"}}]}}},{"name":"UploadProgressData","kind":4194304,"type":{"type":"reflection","declaration":{"name":"__type","kind":65536,"children":[{"name":"totalBytesExpectedToSend","kind":1024,"comment":{"summary":[{"kind":"text","text":"The total bytes expected to be sent by the upload operation."}]},"type":{"type":"intrinsic","name":"number"}},{"name":"totalBytesSent","kind":1024,"comment":{"summary":[{"kind":"text","text":"The total bytes sent by the upload operation."}]},"type":{"type":"intrinsic","name":"number"}}]}}},{"name":"WritingOptions","kind":4194304,"type":{"type":"reflection","declaration":{"name":"__type","kind":65536,"children":[{"name":"encoding","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"The encoding format to use when writing the file."}],"blockTags":[{"tag":"@default","content":[{"kind":"text","text":"FileSystem.EncodingType.UTF8"}]}]},"type":{"type":"union","types":[{"type":"reference","name":"EncodingType"},{"type":"literal","value":"utf8"},{"type":"literal","value":"base64"}]}}]}}},{"name":"bundleDirectory","kind":32,"type":{"type":"union","types":[{"type":"literal","value":null},{"type":"intrinsic","name":"string"}]}},{"name":"bundledAssets","kind":32,"type":{"type":"union","types":[{"type":"literal","value":null},{"type":"intrinsic","name":"string"}]}},{"name":"cacheDirectory","kind":32,"flags":{"isConst":true},"comment":{"summary":[{"kind":"code","text":"`file://`"},{"kind":"text","text":" URI pointing to the directory where temporary files used by this app will be stored.\nFiles stored here may be automatically deleted by the system when low on storage.\nExample uses are for downloaded or generated files that the app just needs for one-time usage."}]},"type":{"type":"union","types":[{"type":"literal","value":null},{"type":"intrinsic","name":"string"}]},"defaultValue":"..."},{"name":"documentDirectory","kind":32,"flags":{"isConst":true},"comment":{"summary":[{"kind":"code","text":"`file://`"},{"kind":"text","text":" URI pointing to the directory where user documents for this app will be stored.\nFiles stored here will remain until explicitly deleted by the app. Ends with a trailing "},{"kind":"code","text":"`/`"},{"kind":"text","text":".\nExample uses are for files the user saves that they expect to see again."}]},"type":{"type":"union","types":[{"type":"literal","value":null},{"type":"intrinsic","name":"string"}]},"defaultValue":"..."},{"name":"copyAsync","kind":64,"signatures":[{"name":"copyAsync","kind":4096,"comment":{"summary":[{"kind":"text","text":"Create a copy of a file or directory. Directories are recursively copied with all of their contents.\nIt can be also used to copy content shared by other apps to local filesystem."}]},"parameters":[{"name":"options","kind":32768,"comment":{"summary":[{"kind":"text","text":"A map of move options represented by ["},{"kind":"code","text":"`RelocatingOptions`"},{"kind":"text","text":"](#relocatingoptions) type."}]},"type":{"type":"reference","name":"RelocatingOptions"}}],"type":{"type":"reference","typeArguments":[{"type":"intrinsic","name":"void"}],"name":"Promise","qualifiedName":"Promise","package":"typescript"}}]},{"name":"createDownloadResumable","kind":64,"signatures":[{"name":"createDownloadResumable","kind":4096,"comment":{"summary":[{"kind":"text","text":"Create a "},{"kind":"code","text":"`DownloadResumable`"},{"kind":"text","text":" object which can start, pause, and resume a download of contents at a remote URI to a file in the app's file system.\n> Note: You need to call "},{"kind":"code","text":"`downloadAsync()`"},{"kind":"text","text":", on a "},{"kind":"code","text":"`DownloadResumable`"},{"kind":"text","text":" instance to initiate the download.\nThe "},{"kind":"code","text":"`DownloadResumable`"},{"kind":"text","text":" object has a callback that provides download progress updates.\nDownloads can be resumed across app restarts by using "},{"kind":"code","text":"`AsyncStorage`"},{"kind":"text","text":" to store the "},{"kind":"code","text":"`DownloadResumable.savable()`"},{"kind":"text","text":" object for later retrieval.\nThe "},{"kind":"code","text":"`savable`"},{"kind":"text","text":" object contains the arguments required to initialize a new "},{"kind":"code","text":"`DownloadResumable`"},{"kind":"text","text":" object to resume the download after an app restart.\nThe directory for a local file uri must exist prior to calling this function."}]},"parameters":[{"name":"uri","kind":32768,"comment":{"summary":[{"kind":"text","text":"The remote URI to download from."}]},"type":{"type":"intrinsic","name":"string"}},{"name":"fileUri","kind":32768,"comment":{"summary":[{"kind":"text","text":"The local URI of the file to download to. If there is no file at this URI, a new one is created.\nIf there is a file at this URI, its contents are replaced. The directory for the file must exist."}]},"type":{"type":"intrinsic","name":"string"}},{"name":"options","kind":32768,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"A map of download options represented by ["},{"kind":"code","text":"`DownloadOptions`"},{"kind":"text","text":"](#downloadoptions) type."}]},"type":{"type":"reference","name":"DownloadOptions"}},{"name":"callback","kind":32768,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"This function is called on each data write to update the download progress.\n> **Note**: When the app has been moved to the background, this callback won't be fired until it's moved to the foreground."}]},"type":{"type":"reference","typeArguments":[{"type":"reference","name":"DownloadProgressData"}],"name":"FileSystemNetworkTaskProgressCallback"}},{"name":"resumeData","kind":32768,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"The string which allows the api to resume a paused download. This is set on the "},{"kind":"code","text":"`DownloadResumable`"},{"kind":"text","text":" object automatically when a download is paused.\nWhen initializing a new "},{"kind":"code","text":"`DownloadResumable`"},{"kind":"text","text":" this should be "},{"kind":"code","text":"`null`"},{"kind":"text","text":"."}]},"type":{"type":"intrinsic","name":"string"}}],"type":{"type":"reference","name":"DownloadResumable"}}]},{"name":"createUploadTask","kind":64,"signatures":[{"name":"createUploadTask","kind":4096,"parameters":[{"name":"url","kind":32768,"type":{"type":"intrinsic","name":"string"}},{"name":"fileUri","kind":32768,"type":{"type":"intrinsic","name":"string"}},{"name":"options","kind":32768,"flags":{"isOptional":true},"type":{"type":"reference","name":"FileSystemUploadOptions"}},{"name":"callback","kind":32768,"flags":{"isOptional":true},"type":{"type":"reference","typeArguments":[{"type":"reference","name":"UploadProgressData"}],"name":"FileSystemNetworkTaskProgressCallback"}}],"type":{"type":"reference","name":"UploadTask"}}]},{"name":"deleteAsync","kind":64,"signatures":[{"name":"deleteAsync","kind":4096,"comment":{"summary":[{"kind":"text","text":"Delete a file or directory. If the URI points to a directory, the directory and all its contents are recursively deleted."}]},"parameters":[{"name":"fileUri","kind":32768,"comment":{"summary":[{"kind":"code","text":"`file://`"},{"kind":"text","text":" or [SAF](#saf-uri) URI to the file or directory."}]},"type":{"type":"intrinsic","name":"string"}},{"name":"options","kind":32768,"comment":{"summary":[{"kind":"text","text":"A map of write options represented by ["},{"kind":"code","text":"`DeletingOptions`"},{"kind":"text","text":"](#deletingoptions) type."}]},"type":{"type":"reference","name":"DeletingOptions"},"defaultValue":"{}"}],"type":{"type":"reference","typeArguments":[{"type":"intrinsic","name":"void"}],"name":"Promise","qualifiedName":"Promise","package":"typescript"}}]},{"name":"deleteLegacyDocumentDirectoryAndroid","kind":64,"signatures":[{"name":"deleteLegacyDocumentDirectoryAndroid","kind":4096,"type":{"type":"reference","typeArguments":[{"type":"intrinsic","name":"void"}],"name":"Promise","qualifiedName":"Promise","package":"typescript"}}]},{"name":"downloadAsync","kind":64,"signatures":[{"name":"downloadAsync","kind":4096,"comment":{"summary":[{"kind":"text","text":"Download the contents at a remote URI to a file in the app's file system. The directory for a local file uri must exist prior to calling this function."}],"blockTags":[{"tag":"@example","content":[{"kind":"code","text":"```js\nFileSystem.downloadAsync(\n 'http://techslides.com/demos/sample-videos/small.mp4',\n FileSystem.documentDirectory + 'small.mp4'\n)\n .then(({ uri }) => {\n console.log('Finished downloading to ', uri);\n })\n .catch(error => {\n console.error(error);\n });\n```"}]},{"tag":"@returns","content":[{"kind":"text","text":"Returns a Promise that resolves to a "},{"kind":"code","text":"`FileSystemDownloadResult`"},{"kind":"text","text":" object."}]}]},"parameters":[{"name":"uri","kind":32768,"comment":{"summary":[{"kind":"text","text":"The remote URI to download from."}]},"type":{"type":"intrinsic","name":"string"}},{"name":"fileUri","kind":32768,"comment":{"summary":[{"kind":"text","text":"The local URI of the file to download to. If there is no file at this URI, a new one is created.\nIf there is a file at this URI, its contents are replaced. The directory for the file must exist."}]},"type":{"type":"intrinsic","name":"string"}},{"name":"options","kind":32768,"comment":{"summary":[{"kind":"text","text":"A map of download options represented by ["},{"kind":"code","text":"`DownloadOptions`"},{"kind":"text","text":"](#downloadoptions) type."}]},"type":{"type":"reference","name":"DownloadOptions"},"defaultValue":"{}"}],"type":{"type":"reference","typeArguments":[{"type":"reference","name":"FileSystemDownloadResult"}],"name":"Promise","qualifiedName":"Promise","package":"typescript"}}]},{"name":"getContentUriAsync","kind":64,"signatures":[{"name":"getContentUriAsync","kind":4096,"comment":{"summary":[{"kind":"text","text":"Takes a "},{"kind":"code","text":"`file://`"},{"kind":"text","text":" URI and converts it into content URI ("},{"kind":"code","text":"`content://`"},{"kind":"text","text":") so that it can be accessed by other applications outside of Expo."}],"blockTags":[{"tag":"@example","content":[{"kind":"code","text":"```js\nFileSystem.getContentUriAsync(uri).then(cUri => {\n console.log(cUri);\n IntentLauncher.startActivityAsync('android.intent.action.VIEW', {\n data: cUri,\n flags: 1,\n });\n});\n```"}]},{"tag":"@returns","content":[{"kind":"text","text":"Returns a Promise that resolves to a "},{"kind":"code","text":"`string`"},{"kind":"text","text":" containing a "},{"kind":"code","text":"`content://`"},{"kind":"text","text":" URI pointing to the file.\nThe URI is the same as the "},{"kind":"code","text":"`fileUri`"},{"kind":"text","text":" input parameter but in a different format."}]},{"tag":"@platform","content":[{"kind":"text","text":"android"}]}]},"parameters":[{"name":"fileUri","kind":32768,"comment":{"summary":[{"kind":"text","text":"The local URI of the file. If there is no file at this URI, an exception will be thrown."}]},"type":{"type":"intrinsic","name":"string"}}],"type":{"type":"reference","typeArguments":[{"type":"intrinsic","name":"string"}],"name":"Promise","qualifiedName":"Promise","package":"typescript"}}]},{"name":"getFreeDiskStorageAsync","kind":64,"signatures":[{"name":"getFreeDiskStorageAsync","kind":4096,"comment":{"summary":[{"kind":"text","text":"Gets the available internal disk storage size, in bytes. This returns the free space on the data partition that hosts all of the internal storage for all apps on the device."}],"blockTags":[{"tag":"@returns","content":[{"kind":"text","text":"Returns a Promise that resolves to the number of bytes available on the internal disk, or JavaScript's ["},{"kind":"code","text":"`MAX_SAFE_INTEGER`"},{"kind":"text","text":"](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Number/MAX_SAFE_INTEGER)\nif the capacity is greater than 253 - 1 bytes."}]}]},"type":{"type":"reference","typeArguments":[{"type":"intrinsic","name":"number"}],"name":"Promise","qualifiedName":"Promise","package":"typescript"}}]},{"name":"getInfoAsync","kind":64,"signatures":[{"name":"getInfoAsync","kind":4096,"comment":{"summary":[{"kind":"text","text":"Get metadata information about a file, directory or external content/asset."}],"blockTags":[{"tag":"@returns","content":[{"kind":"text","text":"A Promise that resolves to a "},{"kind":"code","text":"`FileInfo`"},{"kind":"text","text":" object. If no item exists at this URI,\nthe returned Promise resolves to "},{"kind":"code","text":"`FileInfo`"},{"kind":"text","text":" object in form of "},{"kind":"code","text":"`{ exists: false, isDirectory: false }`"},{"kind":"text","text":"."}]}]},"parameters":[{"name":"fileUri","kind":32768,"comment":{"summary":[{"kind":"text","text":"URI to the file or directory. See [supported URI schemes](#supported-uri-schemes)."}]},"type":{"type":"intrinsic","name":"string"}},{"name":"options","kind":32768,"comment":{"summary":[{"kind":"text","text":"A map of options represented by ["},{"kind":"code","text":"`GetInfoAsyncOptions`"},{"kind":"text","text":"](#getinfoasyncoptions) type."}]},"type":{"type":"reference","name":"InfoOptions"},"defaultValue":"{}"}],"type":{"type":"reference","typeArguments":[{"type":"reference","name":"FileInfo"}],"name":"Promise","qualifiedName":"Promise","package":"typescript"}}]},{"name":"getTotalDiskCapacityAsync","kind":64,"signatures":[{"name":"getTotalDiskCapacityAsync","kind":4096,"comment":{"summary":[{"kind":"text","text":"Gets total internal disk storage size, in bytes. This is the total capacity of the data partition that hosts all the internal storage for all apps on the device."}],"blockTags":[{"tag":"@returns","content":[{"kind":"text","text":"Returns a Promise that resolves to a number that specifies the total internal disk storage capacity in bytes, or JavaScript's ["},{"kind":"code","text":"`MAX_SAFE_INTEGER`"},{"kind":"text","text":"](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Number/MAX_SAFE_INTEGER)\nif the capacity is greater than 253 - 1 bytes."}]}]},"type":{"type":"reference","typeArguments":[{"type":"intrinsic","name":"number"}],"name":"Promise","qualifiedName":"Promise","package":"typescript"}}]},{"name":"makeDirectoryAsync","kind":64,"signatures":[{"name":"makeDirectoryAsync","kind":4096,"comment":{"summary":[{"kind":"text","text":"Create a new empty directory."}]},"parameters":[{"name":"fileUri","kind":32768,"comment":{"summary":[{"kind":"code","text":"`file://`"},{"kind":"text","text":" URI to the new directory to create."}]},"type":{"type":"intrinsic","name":"string"}},{"name":"options","kind":32768,"comment":{"summary":[{"kind":"text","text":"A map of create directory options represented by ["},{"kind":"code","text":"`MakeDirectoryOptions`"},{"kind":"text","text":"](#makedirectoryoptions) type."}]},"type":{"type":"reference","name":"MakeDirectoryOptions"},"defaultValue":"{}"}],"type":{"type":"reference","typeArguments":[{"type":"intrinsic","name":"void"}],"name":"Promise","qualifiedName":"Promise","package":"typescript"}}]},{"name":"moveAsync","kind":64,"signatures":[{"name":"moveAsync","kind":4096,"comment":{"summary":[{"kind":"text","text":"Move a file or directory to a new location."}]},"parameters":[{"name":"options","kind":32768,"comment":{"summary":[{"kind":"text","text":"A map of move options represented by ["},{"kind":"code","text":"`RelocatingOptions`"},{"kind":"text","text":"](#relocatingoptions) type."}]},"type":{"type":"reference","name":"RelocatingOptions"}}],"type":{"type":"reference","typeArguments":[{"type":"intrinsic","name":"void"}],"name":"Promise","qualifiedName":"Promise","package":"typescript"}}]},{"name":"readAsStringAsync","kind":64,"signatures":[{"name":"readAsStringAsync","kind":4096,"comment":{"summary":[{"kind":"text","text":"Read the entire contents of a file as a string. Binary will be returned in raw format, you will need to append "},{"kind":"code","text":"`data:image/png;base64,`"},{"kind":"text","text":" to use it as Base64."}],"blockTags":[{"tag":"@returns","content":[{"kind":"text","text":"A Promise that resolves to a string containing the entire contents of the file."}]}]},"parameters":[{"name":"fileUri","kind":32768,"comment":{"summary":[{"kind":"code","text":"`file://`"},{"kind":"text","text":" or [SAF](#saf-uri) URI to the file or directory."}]},"type":{"type":"intrinsic","name":"string"}},{"name":"options","kind":32768,"comment":{"summary":[{"kind":"text","text":"A map of read options represented by ["},{"kind":"code","text":"`ReadingOptions`"},{"kind":"text","text":"](#readingoptions) type."}]},"type":{"type":"reference","name":"ReadingOptions"},"defaultValue":"{}"}],"type":{"type":"reference","typeArguments":[{"type":"intrinsic","name":"string"}],"name":"Promise","qualifiedName":"Promise","package":"typescript"}}]},{"name":"readDirectoryAsync","kind":64,"signatures":[{"name":"readDirectoryAsync","kind":4096,"comment":{"summary":[{"kind":"text","text":"Enumerate the contents of a directory."}],"blockTags":[{"tag":"@returns","content":[{"kind":"text","text":"A Promise that resolves to an array of strings, each containing the name of a file or directory contained in the directory at "},{"kind":"code","text":"`fileUri`"},{"kind":"text","text":"."}]}]},"parameters":[{"name":"fileUri","kind":32768,"comment":{"summary":[{"kind":"code","text":"`file://`"},{"kind":"text","text":" URI to the directory."}]},"type":{"type":"intrinsic","name":"string"}}],"type":{"type":"reference","typeArguments":[{"type":"array","elementType":{"type":"intrinsic","name":"string"}}],"name":"Promise","qualifiedName":"Promise","package":"typescript"}}]},{"name":"uploadAsync","kind":64,"signatures":[{"name":"uploadAsync","kind":4096,"comment":{"summary":[{"kind":"text","text":"Upload the contents of the file pointed by "},{"kind":"code","text":"`fileUri`"},{"kind":"text","text":" to the remote url."}],"blockTags":[{"tag":"@example","content":[{"kind":"text","text":"**Client**\n\n"},{"kind":"code","text":"```js\nimport * as FileSystem from 'expo-file-system';\n\ntry {\n const response = await FileSystem.uploadAsync(`http://192.168.0.1:1234/binary-upload`, fileUri, {\n fieldName: 'file',\n httpMethod: 'PATCH',\n uploadType: FileSystem.FileSystemUploadType.BINARY_CONTENT,\n });\n console.log(JSON.stringify(response, null, 4));\n} catch (error) {\n console.log(error);\n}\n```"},{"kind":"text","text":"\n\n**Server**\n\nPlease refer to the \"[Server: Handling multipart requests](#server-handling-multipart-requests)\" example - there is code for a simple Node.js server."}]},{"tag":"@returns","content":[{"kind":"text","text":"Returns a Promise that resolves to "},{"kind":"code","text":"`FileSystemUploadResult`"},{"kind":"text","text":" object."}]}]},"parameters":[{"name":"url","kind":32768,"comment":{"summary":[{"kind":"text","text":"The remote URL, where the file will be sent."}]},"type":{"type":"intrinsic","name":"string"}},{"name":"fileUri","kind":32768,"comment":{"summary":[{"kind":"text","text":"The local URI of the file to send. The file must exist."}]},"type":{"type":"intrinsic","name":"string"}},{"name":"options","kind":32768,"comment":{"summary":[{"kind":"text","text":"A map of download options represented by ["},{"kind":"code","text":"`FileSystemUploadOptions`"},{"kind":"text","text":"](#filesystemuploadoptions) type."}]},"type":{"type":"reference","name":"FileSystemUploadOptions"},"defaultValue":"{}"}],"type":{"type":"reference","typeArguments":[{"type":"reference","name":"FileSystemUploadResult"}],"name":"Promise","qualifiedName":"Promise","package":"typescript"}}]},{"name":"writeAsStringAsync","kind":64,"signatures":[{"name":"writeAsStringAsync","kind":4096,"comment":{"summary":[{"kind":"text","text":"Write the entire contents of a file as a string."}]},"parameters":[{"name":"fileUri","kind":32768,"comment":{"summary":[{"kind":"code","text":"`file://`"},{"kind":"text","text":" or [SAF](#saf-uri) URI to the file or directory.\n> Note: when you're using SAF URI the file needs to exist. You can't create a new file."}]},"type":{"type":"intrinsic","name":"string"}},{"name":"contents","kind":32768,"comment":{"summary":[{"kind":"text","text":"The string to replace the contents of the file with."}]},"type":{"type":"intrinsic","name":"string"}},{"name":"options","kind":32768,"comment":{"summary":[{"kind":"text","text":"A map of write options represented by ["},{"kind":"code","text":"`WritingOptions`"},{"kind":"text","text":"](#writingoptions) type."}]},"type":{"type":"reference","name":"WritingOptions"},"defaultValue":"{}"}],"type":{"type":"reference","typeArguments":[{"type":"intrinsic","name":"void"}],"name":"Promise","qualifiedName":"Promise","package":"typescript"}}]}]}
\ No newline at end of file
diff --git a/docs/public/static/data/unversioned/expo-image.json b/docs/public/static/data/unversioned/expo-image.json
index 2eecfeee48965..6ccd1f2352c1e 100644
--- a/docs/public/static/data/unversioned/expo-image.json
+++ b/docs/public/static/data/unversioned/expo-image.json
@@ -1 +1 @@
-{"name":"expo-image","kind":1,"children":[{"name":"Image","kind":128,"children":[{"name":"constructor","kind":512,"flags":{"isExternal":true},"signatures":[{"name":"new Image","kind":16384,"flags":{"isExternal":true},"parameters":[{"name":"props","kind":32768,"flags":{"isExternal":true},"type":{"type":"union","types":[{"type":"reference","name":"ImageProps"},{"type":"reference","typeArguments":[{"type":"reference","name":"ImageProps"}],"name":"Readonly","qualifiedName":"Readonly","package":"typescript"}]}}],"type":{"type":"reference","name":"Image"},"inheritedFrom":{"type":"reference","name":"React.PureComponent.constructor"}},{"name":"new Image","kind":16384,"flags":{"isExternal":true},"comment":{"summary":[],"blockTags":[{"tag":"@deprecated","content":[]},{"tag":"@see","content":[{"kind":"text","text":"https://reactjs.org/docs/legacy-context.html"}]}]},"parameters":[{"name":"props","kind":32768,"flags":{"isExternal":true},"type":{"type":"reference","name":"ImageProps"}},{"name":"context","kind":32768,"flags":{"isExternal":true},"type":{"type":"intrinsic","name":"any"}}],"type":{"type":"reference","name":"Image"},"inheritedFrom":{"type":"reference","name":"React.PureComponent.constructor"}}],"inheritedFrom":{"type":"reference","name":"React.PureComponent.constructor"}},{"name":"render","kind":2048,"signatures":[{"name":"render","kind":4096,"type":{"type":"reference","name":"Element","qualifiedName":"global.JSX.Element","package":"@types/react"},"overwrites":{"type":"reference","name":"React.PureComponent.render"}}],"overwrites":{"type":"reference","name":"React.PureComponent.render"}},{"name":"clearDiskCache","kind":2048,"flags":{"isStatic":true},"signatures":[{"name":"clearDiskCache","kind":4096,"comment":{"summary":[{"kind":"text","text":"Asynchronously clears all images from the disk cache."}],"blockTags":[{"tag":"@returns","content":[{"kind":"text","text":"A promise resolving to "},{"kind":"code","text":"`true`"},{"kind":"text","text":" when the operation succeeds.\nIt may resolve to "},{"kind":"code","text":"`false`"},{"kind":"text","text":" on Android when the activity is no longer available."}]}]},"type":{"type":"reference","typeArguments":[{"type":"intrinsic","name":"boolean"}],"name":"Promise","qualifiedName":"Promise","package":"typescript"}}]},{"name":"clearMemoryCache","kind":2048,"flags":{"isStatic":true},"signatures":[{"name":"clearMemoryCache","kind":4096,"comment":{"summary":[{"kind":"text","text":"Asynchronously clears all images stored in memory."}],"blockTags":[{"tag":"@returns","content":[{"kind":"text","text":"A promise resolving to "},{"kind":"code","text":"`true`"},{"kind":"text","text":" when the operation succeeds.\nIt may resolve to "},{"kind":"code","text":"`false`"},{"kind":"text","text":" on Android when the activity is no longer available."}]}]},"type":{"type":"reference","typeArguments":[{"type":"intrinsic","name":"boolean"}],"name":"Promise","qualifiedName":"Promise","package":"typescript"}}]},{"name":"prefetch","kind":2048,"flags":{"isStatic":true},"signatures":[{"name":"prefetch","kind":4096,"comment":{"summary":[{"kind":"text","text":"Preloads images at the given urls that can be later used in the image view.\nPreloaded images are always cached on the disk, so make sure to use\n"},{"kind":"code","text":"`disk`"},{"kind":"text","text":" (default) or "},{"kind":"code","text":"`memory-disk`"},{"kind":"text","text":" cache policy."}]},"parameters":[{"name":"urls","kind":32768,"type":{"type":"union","types":[{"type":"intrinsic","name":"string"},{"type":"array","elementType":{"type":"intrinsic","name":"string"}}]}}],"type":{"type":"intrinsic","name":"void"}}]}],"extendedTypes":[{"type":"reference","typeArguments":[{"type":"reference","name":"ImageProps"}],"name":"PureComponent","qualifiedName":"React.PureComponent","package":"@types/react"}]},{"name":"ImageContentPosition","kind":4194304,"comment":{"summary":[{"kind":"text","text":"Specifies the position of the image inside its container. One value controls the x-axis and the second value controls the y-axis.\n\nAdditionally, it supports stringified shorthand form that specifies the edges to which to align the image content:\\\n"},{"kind":"code","text":"`'center'`"},{"kind":"text","text":", "},{"kind":"code","text":"`'top'`"},{"kind":"text","text":", "},{"kind":"code","text":"`'right'`"},{"kind":"text","text":", "},{"kind":"code","text":"`'bottom'`"},{"kind":"text","text":", "},{"kind":"code","text":"`'left'`"},{"kind":"text","text":", "},{"kind":"code","text":"`'top center'`"},{"kind":"text","text":", "},{"kind":"code","text":"`'top right'`"},{"kind":"text","text":", "},{"kind":"code","text":"`'top left'`"},{"kind":"text","text":", "},{"kind":"code","text":"`'right center'`"},{"kind":"text","text":", "},{"kind":"code","text":"`'right top'`"},{"kind":"text","text":",\n"},{"kind":"code","text":"`'right bottom'`"},{"kind":"text","text":", "},{"kind":"code","text":"`'bottom center'`"},{"kind":"text","text":", "},{"kind":"code","text":"`'bottom right'`"},{"kind":"text","text":", "},{"kind":"code","text":"`'bottom left'`"},{"kind":"text","text":", "},{"kind":"code","text":"`'left center'`"},{"kind":"text","text":", "},{"kind":"code","text":"`'left top'`"},{"kind":"text","text":", "},{"kind":"code","text":"`'left bottom'`"},{"kind":"text","text":".\\\nIf only one keyword is provided, then the other dimension is set to "},{"kind":"code","text":"`'center'`"},{"kind":"text","text":" ("},{"kind":"code","text":"`'50%'`"},{"kind":"text","text":"), so the image is placed in the middle of the specified edge.\\\nAs an example, "},{"kind":"code","text":"`'top right'`"},{"kind":"text","text":" is the same as "},{"kind":"code","text":"`{ top: 0, right: 0 }`"},{"kind":"text","text":" and "},{"kind":"code","text":"`'bottom'`"},{"kind":"text","text":" is the same as "},{"kind":"code","text":"`{ bottom: 0, left: '50%' }`"},{"kind":"text","text":"."}]},"type":{"type":"union","types":[{"type":"reflection","declaration":{"name":"__type","kind":65536,"children":[{"name":"right","kind":1024,"flags":{"isOptional":true},"type":{"type":"reference","name":"ImageContentPositionValue"}},{"name":"top","kind":1024,"flags":{"isOptional":true},"type":{"type":"reference","name":"ImageContentPositionValue"}}]}},{"type":"reflection","declaration":{"name":"__type","kind":65536,"children":[{"name":"left","kind":1024,"flags":{"isOptional":true},"type":{"type":"reference","name":"ImageContentPositionValue"}},{"name":"top","kind":1024,"flags":{"isOptional":true},"type":{"type":"reference","name":"ImageContentPositionValue"}}]}},{"type":"reflection","declaration":{"name":"__type","kind":65536,"children":[{"name":"bottom","kind":1024,"flags":{"isOptional":true},"type":{"type":"reference","name":"ImageContentPositionValue"}},{"name":"right","kind":1024,"flags":{"isOptional":true},"type":{"type":"reference","name":"ImageContentPositionValue"}}]}},{"type":"reflection","declaration":{"name":"__type","kind":65536,"children":[{"name":"bottom","kind":1024,"flags":{"isOptional":true},"type":{"type":"reference","name":"ImageContentPositionValue"}},{"name":"left","kind":1024,"flags":{"isOptional":true},"type":{"type":"reference","name":"ImageContentPositionValue"}}]}},{"type":"reference","name":"ImageContentPositionString"}]}},{"name":"ImageContentPositionValue","kind":4194304,"comment":{"summary":[{"kind":"text","text":"A value that represents the relative position of a single axis.\n\nIf "},{"kind":"code","text":"`number`"},{"kind":"text","text":", it is a distance in points (logical pixels) from the respective edge.\\\nIf "},{"kind":"code","text":"`string`"},{"kind":"text","text":", it must be a percentage value where "},{"kind":"code","text":"`'100%'`"},{"kind":"text","text":" is the difference in size between the container and the image along the respective axis,\nor "},{"kind":"code","text":"`'center'`"},{"kind":"text","text":" which is an alias for "},{"kind":"code","text":"`'50%'`"},{"kind":"text","text":" that is the default value. You can read more regarding percentages on the MDN docs for\n["},{"kind":"code","text":"`background-position`"},{"kind":"text","text":"](https://developer.mozilla.org/en-US/docs/Web/CSS/background-position#regarding_percentages) that describes this concept well."}]},"type":{"type":"union","types":[{"type":"intrinsic","name":"number"},{"type":"intrinsic","name":"string"},{"type":"template-literal","head":"","tail":[[{"type":"intrinsic","name":"number"},"%"]]},{"type":"template-literal","head":"","tail":[[{"type":"intrinsic","name":"number"},""]]},{"type":"literal","value":"center"}]}},{"name":"ImageErrorEventData","kind":4194304,"type":{"type":"reflection","declaration":{"name":"__type","kind":65536,"children":[{"name":"error","kind":1024,"type":{"type":"intrinsic","name":"string"}}]}}},{"name":"ImageLoadEventData","kind":4194304,"type":{"type":"reflection","declaration":{"name":"__type","kind":65536,"children":[{"name":"cacheType","kind":1024,"type":{"type":"union","types":[{"type":"literal","value":"none"},{"type":"literal","value":"disk"},{"type":"literal","value":"memory"}]}},{"name":"source","kind":1024,"type":{"type":"reflection","declaration":{"name":"__type","kind":65536,"children":[{"name":"height","kind":1024,"type":{"type":"intrinsic","name":"number"}},{"name":"mediaType","kind":1024,"type":{"type":"union","types":[{"type":"intrinsic","name":"string"},{"type":"literal","value":null}]}},{"name":"url","kind":1024,"type":{"type":"intrinsic","name":"string"}},{"name":"width","kind":1024,"type":{"type":"intrinsic","name":"number"}}]}}}]}}},{"name":"ImageProgressEventData","kind":4194304,"type":{"type":"reflection","declaration":{"name":"__type","kind":65536,"children":[{"name":"loaded","kind":1024,"type":{"type":"intrinsic","name":"number"}},{"name":"total","kind":1024,"type":{"type":"intrinsic","name":"number"}}]}}},{"name":"ImageProps","kind":256,"comment":{"summary":[{"kind":"text","text":"Some props are from React Native Image that Expo Image supports (more or less) for easier migration,\nbut all of them are deprecated and might be removed in the future."}]},"children":[{"name":"accessibilityLabel","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"The text that's read by the screen reader when the user interacts with the image. Sets the the "},{"kind":"code","text":"`alt`"},{"kind":"text","text":" tag on web which is used for web crawlers and link traversal."}],"blockTags":[{"tag":"@default","content":[{"kind":"text","text":"undefined"}]},{"tag":"@platform","content":[{"kind":"text","text":"android"}]},{"tag":"@platform","content":[{"kind":"text","text":"ios"}]},{"tag":"@platform","content":[{"kind":"text","text":"web"}]}]},"type":{"type":"intrinsic","name":"string"},"overwrites":{"type":"reference","name":"ViewProps.accessibilityLabel"}},{"name":"accessible","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"When true, indicates that the view is an accessibility element.\nWhen a view is an accessibility element, it groups its children into a single selectable component.\n\nOn Android, the "},{"kind":"code","text":"`accessible`"},{"kind":"text","text":" property will be translated into the native "},{"kind":"code","text":"`isScreenReaderFocusable`"},{"kind":"text","text":",\nso it's only affecting the screen readers behaviour."}],"blockTags":[{"tag":"@default","content":[{"kind":"text","text":"false"}]},{"tag":"@platform","content":[{"kind":"text","text":"android"}]},{"tag":"@platform","content":[{"kind":"text","text":"ios"}]}]},"type":{"type":"intrinsic","name":"boolean"},"overwrites":{"type":"reference","name":"ViewProps.accessible"}},{"name":"allowDownscaling","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"Whether the image should be downscaled to match the size of the view container.\nTurning off this functionality could negatively impact the application's performance, particularly when working with large assets.\nHowever, it would result in smoother image resizing, and end-users would always have access to the highest possible asset quality.\n\nDownscaling is never used when the "},{"kind":"code","text":"`contentFit`"},{"kind":"text","text":" prop is set to "},{"kind":"code","text":"`none`"},{"kind":"text","text":" or "},{"kind":"code","text":"`fill`"},{"kind":"text","text":"."}],"blockTags":[{"tag":"@default","content":[{"kind":"text","text":"true"}]},{"tag":"@platform","content":[{"kind":"text","text":"android"}]}]},"type":{"type":"intrinsic","name":"boolean"}},{"name":"alt","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"The text that's read by the screen reader when the user interacts with the image. Sets the the "},{"kind":"code","text":"`alt`"},{"kind":"text","text":" tag on web which is used for web crawlers and link traversal. Is an alias for "},{"kind":"code","text":"`accessibilityLabel`"},{"kind":"text","text":"."}],"blockTags":[{"tag":"@alias","content":[{"kind":"text","text":"accessibilityLabel"}]},{"tag":"@default","content":[{"kind":"text","text":"undefined"}]},{"tag":"@platform","content":[{"kind":"text","text":"android"}]},{"tag":"@platform","content":[{"kind":"text","text":"ios"}]},{"tag":"@platform","content":[{"kind":"text","text":"web"}]}]},"type":{"type":"intrinsic","name":"string"}},{"name":"blurRadius","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"The radius of the blur in points, "},{"kind":"code","text":"`0`"},{"kind":"text","text":" means no blur effect.\nThis effect is not applied to placeholders."}],"blockTags":[{"tag":"@default","content":[{"kind":"text","text":"0"}]}]},"type":{"type":"intrinsic","name":"number"}},{"name":"cachePolicy","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"Determines whether to cache the image and where: on the disk, in the memory or both.\n\n- "},{"kind":"code","text":"`'none'`"},{"kind":"text","text":" - Image is not cached at all.\n\n- "},{"kind":"code","text":"`'disk'`"},{"kind":"text","text":" - Image is queried from the disk cache if exists, otherwise it's downloaded and then stored on the disk.\n\n- "},{"kind":"code","text":"`'memory'`"},{"kind":"text","text":" - Image is cached in memory. Might be useful when you render a high-resolution picture many times.\nMemory cache may be purged very quickly to prevent high memory usage and the risk of out of memory exceptions.\n\n- "},{"kind":"code","text":"`'memory-disk'`"},{"kind":"text","text":" - Image is cached in memory, but with a fallback to the disk cache."}],"blockTags":[{"tag":"@default","content":[{"kind":"text","text":"'disk'"}]}]},"type":{"type":"union","types":[{"type":"literal","value":null},{"type":"literal","value":"none"},{"type":"literal","value":"disk"},{"type":"literal","value":"memory"},{"type":"literal","value":"memory-disk"}]}},{"name":"contentFit","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"Determines how the image should be resized to fit its container. This property tells the image to fill the container\nin a variety of ways; such as \"preserve that aspect ratio\" or \"stretch up and take up as much space as possible\".\nIt mirrors the CSS ["},{"kind":"code","text":"`object-fit`"},{"kind":"text","text":"](https://developer.mozilla.org/en-US/docs/Web/CSS/object-fit) property.\n\n- "},{"kind":"code","text":"`'cover'`"},{"kind":"text","text":" - The image is sized to maintain its aspect ratio while filling the container box.\nIf the image's aspect ratio does not match the aspect ratio of its box, then the object will be clipped to fit.\n\n- "},{"kind":"code","text":"`'contain'`"},{"kind":"text","text":" - The image is scaled down or up to maintain its aspect ratio while fitting within the container box.\n\n- "},{"kind":"code","text":"`'fill'`"},{"kind":"text","text":" - The image is sized to entirely fill the container box. If necessary, the image will be stretched or squished to fit.\n\n- "},{"kind":"code","text":"`'none'`"},{"kind":"text","text":" - The image is not resized and is centered by default.\nWhen specified, the exact position can be controlled with ["},{"kind":"code","text":"`contentPosition`"},{"kind":"text","text":"](#contentposition) prop.\n\n- "},{"kind":"code","text":"`'scale-down'`"},{"kind":"text","text":" - The image is sized as if "},{"kind":"code","text":"`none`"},{"kind":"text","text":" or "},{"kind":"code","text":"`contain`"},{"kind":"text","text":" were specified, whichever would result in a smaller concrete image size."}],"blockTags":[{"tag":"@default","content":[{"kind":"text","text":"'cover'"}]}]},"type":{"type":"reference","name":"ImageContentFit"}},{"name":"contentPosition","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"It is used together with ["},{"kind":"code","text":"`contentFit`"},{"kind":"text","text":"](#contentfit) to specify how the image should be positioned with x/y coordinates inside its own container.\nAn equivalent of the CSS ["},{"kind":"code","text":"`object-position`"},{"kind":"text","text":"](https://developer.mozilla.org/en-US/docs/Web/CSS/object-position) property."}],"blockTags":[{"tag":"@default","content":[{"kind":"text","text":"'center'"}]}]},"type":{"type":"reference","name":"ImageContentPosition"}},{"name":"defaultSource","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[],"blockTags":[{"tag":"@deprecated","content":[{"kind":"text","text":"Provides compatibility for ["},{"kind":"code","text":"`defaultSource`"},{"kind":"text","text":" from React Native Image](https://reactnative.dev/docs/image#defaultsource).\nUse ["},{"kind":"code","text":"`placeholder`"},{"kind":"text","text":"](#placeholder) prop instead."}]}]},"type":{"type":"union","types":[{"type":"literal","value":null},{"type":"reference","name":"ImageSource"}]}},{"name":"enableLiveTextInteraction","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"Enables Live Text interaction with the image. Check official [Apple documentation](https://developer.apple.com/documentation/visionkit/enabling_live_text_interactions_with_images) for more details."}],"blockTags":[{"tag":"@default","content":[{"kind":"text","text":"false"}]},{"tag":"@platform","content":[{"kind":"text","text":"ios 16.0+"}]}]},"type":{"type":"intrinsic","name":"boolean"}},{"name":"fadeDuration","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[],"blockTags":[{"tag":"@deprecated","content":[{"kind":"text","text":"Provides compatibility for ["},{"kind":"code","text":"`fadeDuration`"},{"kind":"text","text":" from React Native Image](https://reactnative.dev/docs/image#fadeduration-android).\nInstead use ["},{"kind":"code","text":"`transition`"},{"kind":"text","text":"](#transition) with the provided duration."}]}]},"type":{"type":"intrinsic","name":"number"}},{"name":"focusable","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"Whether this View should be focusable with a non-touch input device and receive focus with a hardware keyboard."}],"blockTags":[{"tag":"@default","content":[{"kind":"text","text":"false"}]},{"tag":"@platform","content":[{"kind":"text","text":"android"}]}]},"type":{"type":"intrinsic","name":"boolean"},"overwrites":{"type":"reference","name":"ViewProps.focusable"}},{"name":"loadingIndicatorSource","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[],"blockTags":[{"tag":"@deprecated","content":[{"kind":"text","text":"Provides compatibility for ["},{"kind":"code","text":"`loadingIndicatorSource`"},{"kind":"text","text":" from React Native Image](https://reactnative.dev/docs/image#loadingindicatorsource).\nUse ["},{"kind":"code","text":"`placeholder`"},{"kind":"text","text":"](#placeholder) prop instead."}]}]},"type":{"type":"union","types":[{"type":"literal","value":null},{"type":"reference","name":"ImageSource"}]}},{"name":"onError","kind":1024,"flags":{"isOptional":true},"type":{"type":"reflection","declaration":{"name":"__type","kind":65536,"signatures":[{"name":"__type","kind":4096,"comment":{"summary":[{"kind":"text","text":"Called on an image fetching error."}]},"parameters":[{"name":"event","kind":32768,"type":{"type":"reference","name":"ImageErrorEventData"}}],"type":{"type":"intrinsic","name":"void"}}]}}},{"name":"onLoad","kind":1024,"flags":{"isOptional":true},"type":{"type":"reflection","declaration":{"name":"__type","kind":65536,"signatures":[{"name":"__type","kind":4096,"comment":{"summary":[{"kind":"text","text":"Called when the image load completes successfully."}]},"parameters":[{"name":"event","kind":32768,"type":{"type":"reference","name":"ImageLoadEventData"}}],"type":{"type":"intrinsic","name":"void"}}]}}},{"name":"onLoadEnd","kind":1024,"flags":{"isOptional":true},"type":{"type":"reflection","declaration":{"name":"__type","kind":65536,"signatures":[{"name":"__type","kind":4096,"comment":{"summary":[{"kind":"text","text":"Called when the image load either succeeds or fails."}]},"type":{"type":"intrinsic","name":"void"}}]}}},{"name":"onLoadStart","kind":1024,"flags":{"isOptional":true},"type":{"type":"reflection","declaration":{"name":"__type","kind":65536,"signatures":[{"name":"__type","kind":4096,"comment":{"summary":[{"kind":"text","text":"Called when the image starts to load."}]},"type":{"type":"intrinsic","name":"void"}}]}}},{"name":"onProgress","kind":1024,"flags":{"isOptional":true},"type":{"type":"reflection","declaration":{"name":"__type","kind":65536,"signatures":[{"name":"__type","kind":4096,"comment":{"summary":[{"kind":"text","text":"Called when the image is loading. Can be called multiple times before the image has finished loading.\nThe event object provides details on how many bytes were loaded so far and what's the expected total size."}]},"parameters":[{"name":"event","kind":32768,"type":{"type":"reference","name":"ImageProgressEventData"}}],"type":{"type":"intrinsic","name":"void"}}]}}},{"name":"placeholder","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"An image to display while loading the proper image and no image has been displayed yet or the source is unset."}]},"type":{"type":"union","types":[{"type":"literal","value":null},{"type":"intrinsic","name":"string"},{"type":"intrinsic","name":"number"},{"type":"array","elementType":{"type":"intrinsic","name":"string"}},{"type":"reference","name":"ImageSource"},{"type":"array","elementType":{"type":"reference","name":"ImageSource"}}]}},{"name":"priority","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"Priorities for completing loads. If more than one load is queued at a time,\nthe load with the higher priority will be started first.\nPriorities are considered best effort, there are no guarantees about the order in which loads will start or finish."}],"blockTags":[{"tag":"@default","content":[{"kind":"text","text":"'normal'"}]}]},"type":{"type":"union","types":[{"type":"literal","value":null},{"type":"literal","value":"low"},{"type":"literal","value":"normal"},{"type":"literal","value":"high"}]}},{"name":"recyclingKey","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"Changing this prop resets the image view content to blank or a placeholder before loading and rendering the final image.\nThis is especially useful for any kinds of recycling views like [FlashList](https://github.com/shopify/flash-list)\nto prevent showing the previous source before the new one fully loads."}],"blockTags":[{"tag":"@default","content":[{"kind":"text","text":"null"}]},{"tag":"@platform","content":[{"kind":"text","text":"android"}]},{"tag":"@platform","content":[{"kind":"text","text":"ios"}]}]},"type":{"type":"union","types":[{"type":"literal","value":null},{"type":"intrinsic","name":"string"}]}},{"name":"resizeMode","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[],"blockTags":[{"tag":"@deprecated","content":[{"kind":"text","text":"Provides compatibility for ["},{"kind":"code","text":"`resizeMode`"},{"kind":"text","text":" from React Native Image](https://reactnative.dev/docs/image#resizemode).\nNote that "},{"kind":"code","text":"`\"repeat\"`"},{"kind":"text","text":" option is not supported at all.\nUse the more powerful ["},{"kind":"code","text":"`contentFit`"},{"kind":"text","text":"](#contentfit) and ["},{"kind":"code","text":"`contentPosition`"},{"kind":"text","text":"](#contentposition) props instead."}]}]},"type":{"type":"union","types":[{"type":"literal","value":"cover"},{"type":"literal","value":"contain"},{"type":"literal","value":"center"},{"type":"literal","value":"stretch"},{"type":"literal","value":"repeat"}]}},{"name":"responsivePolicy","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"Determines whether to choose image source based on container size only on mount or on every resize.\nUse "},{"kind":"code","text":"`initial`"},{"kind":"text","text":" to improve performance."}],"blockTags":[{"tag":"@default","content":[{"kind":"text","text":"\"live\""}]},{"tag":"@platform","content":[{"kind":"text","text":"web"}]}]},"type":{"type":"union","types":[{"type":"literal","value":"live"},{"type":"literal","value":"initial"}]}},{"name":"source","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"The image source, either a remote URL, a local file resource or a number that is the result of the "},{"kind":"code","text":"`require()`"},{"kind":"text","text":" function.\nWhen provided as an array of sources, the source that fits best into the container size and is closest to the screen scale\nwill be chosen. In this case it is important to provide "},{"kind":"code","text":"`width`"},{"kind":"text","text":", "},{"kind":"code","text":"`height`"},{"kind":"text","text":" and "},{"kind":"code","text":"`scale`"},{"kind":"text","text":" properties."}]},"type":{"type":"union","types":[{"type":"literal","value":null},{"type":"intrinsic","name":"string"},{"type":"intrinsic","name":"number"},{"type":"array","elementType":{"type":"intrinsic","name":"string"}},{"type":"reference","name":"ImageSource"},{"type":"array","elementType":{"type":"reference","name":"ImageSource"}}]}},{"name":"tintColor","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"A color used to tint template images (a bitmap image where only the opacity matters).\nThe color is applied to every non-transparent pixel, causing the image’s shape to adopt that color.\nThis effect is not applied to placeholders."}],"blockTags":[{"tag":"@default","content":[{"kind":"text","text":"null"}]},{"tag":"@platform","content":[{"kind":"text","text":"android"}]},{"tag":"@platform","content":[{"kind":"text","text":"ios"}]}]},"type":{"type":"union","types":[{"type":"literal","value":null},{"type":"intrinsic","name":"string"}]}},{"name":"transition","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"Describes how the image view should transition the contents when switching the image source.\\\nIf provided as a number, it is the duration in milliseconds of the "},{"kind":"code","text":"`'cross-dissolve'`"},{"kind":"text","text":" effect."}]},"type":{"type":"union","types":[{"type":"literal","value":null},{"type":"intrinsic","name":"number"},{"type":"reference","name":"ImageTransition"}]}}],"extendedTypes":[{"type":"reference","name":"ViewProps","qualifiedName":"ViewProps","package":"react-native"}]},{"name":"ImageSource","kind":4194304,"type":{"type":"reflection","declaration":{"name":"__type","kind":65536,"children":[{"name":"blurhash","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"The blurhash string to use to generate the image. You can read more about the blurhash\non ["},{"kind":"code","text":"`woltapp/blurhash`"},{"kind":"text","text":"](https://github.com/woltapp/blurhash) repo. Ignored when "},{"kind":"code","text":"`uri`"},{"kind":"text","text":" is provided.\nWhen using the blurhash, you should also provide "},{"kind":"code","text":"`width`"},{"kind":"text","text":" and "},{"kind":"code","text":"`height`"},{"kind":"text","text":" (higher values reduce performance),\notherwise their default value is "},{"kind":"code","text":"`16`"},{"kind":"text","text":"."}]},"type":{"type":"intrinsic","name":"string"}},{"name":"cacheKey","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"The cache key used to query and store this specific image.\nIf not provided, the "},{"kind":"code","text":"`uri`"},{"kind":"text","text":" is used also as the cache key."}]},"type":{"type":"intrinsic","name":"string"}},{"name":"headers","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"An object representing the HTTP headers to send along with the request for a remote image."}],"blockTags":[{"tag":"@platform","content":[{"kind":"text","text":"android"}]},{"tag":"@platform","content":[{"kind":"text","text":"ios"}]}]},"type":{"type":"reference","typeArguments":[{"type":"intrinsic","name":"string"},{"type":"intrinsic","name":"string"}],"name":"Record","qualifiedName":"Record","package":"typescript"}},{"name":"height","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"Can be specified if known at build time, in which case the value\nwill be used to set the default "},{"kind":"code","text":"` `"},{"kind":"text","text":" component dimension"}]},"type":{"type":"intrinsic","name":"number"}},{"name":"thumbhash","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"The thumbhash string to use to generate the image placeholder. You can read more about thumbhash\non the ["},{"kind":"code","text":"`thumbhash website`"},{"kind":"text","text":"](https://evanw.github.io/thumbhash/). Ignored when "},{"kind":"code","text":"`uri`"},{"kind":"text","text":" is provided."}]},"type":{"type":"intrinsic","name":"string"}},{"name":"uri","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"A string representing the resource identifier for the image,\nwhich could be an http address, a local file path, or the name of a static image resource."}]},"type":{"type":"intrinsic","name":"string"}},{"name":"width","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"Can be specified if known at build time, in which case the value\nwill be used to set the default "},{"kind":"code","text":"` `"},{"kind":"text","text":" component dimension"}]},"type":{"type":"intrinsic","name":"number"}}]}}},{"name":"ImageTransition","kind":4194304,"comment":{"summary":[{"kind":"text","text":"An object that describes the smooth transition when switching the image source."}]},"type":{"type":"reflection","declaration":{"name":"__type","kind":65536,"children":[{"name":"duration","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"The duration of the transition in milliseconds."}],"blockTags":[{"tag":"@default","content":[{"kind":"text","text":"0"}]}]},"type":{"type":"intrinsic","name":"number"}},{"name":"effect","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"An animation effect used for transition."}],"blockTags":[{"tag":"@default","content":[{"kind":"text","text":"'cross-dissolve'\n\nOn Android, only "},{"kind":"code","text":"`'cross-dissolve'`"},{"kind":"text","text":" is supported.\nOn Web, "},{"kind":"code","text":"`'curl-up'`"},{"kind":"text","text":" and "},{"kind":"code","text":"`'curl-down'`"},{"kind":"text","text":" effects are not supported."}]}]},"type":{"type":"union","types":[{"type":"literal","value":"cross-dissolve"},{"type":"literal","value":"flip-from-top"},{"type":"literal","value":"flip-from-right"},{"type":"literal","value":"flip-from-bottom"},{"type":"literal","value":"flip-from-left"},{"type":"literal","value":"curl-up"},{"type":"literal","value":"curl-down"},{"type":"literal","value":null}]}},{"name":"timing","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"Specifies the speed curve of the transition effect and how intermediate values are calculated."}],"blockTags":[{"tag":"@default","content":[{"kind":"text","text":"'ease-in-out'"}]}]},"type":{"type":"union","types":[{"type":"literal","value":"ease-in-out"},{"type":"literal","value":"ease-in"},{"type":"literal","value":"ease-out"},{"type":"literal","value":"linear"}]}}]}}}]}
\ No newline at end of file
+{"name":"expo-image","kind":1,"children":[{"name":"Image","kind":128,"children":[{"name":"constructor","kind":512,"flags":{"isExternal":true},"signatures":[{"name":"new Image","kind":16384,"flags":{"isExternal":true},"parameters":[{"name":"props","kind":32768,"flags":{"isExternal":true},"type":{"type":"union","types":[{"type":"reference","name":"ImageProps"},{"type":"reference","typeArguments":[{"type":"reference","name":"ImageProps"}],"name":"Readonly","qualifiedName":"Readonly","package":"typescript"}]}}],"type":{"type":"reference","name":"Image"},"inheritedFrom":{"type":"reference","name":"React.PureComponent.constructor"}},{"name":"new Image","kind":16384,"flags":{"isExternal":true},"comment":{"summary":[],"blockTags":[{"tag":"@deprecated","content":[]},{"tag":"@see","content":[{"kind":"text","text":"https://reactjs.org/docs/legacy-context.html"}]}]},"parameters":[{"name":"props","kind":32768,"flags":{"isExternal":true},"type":{"type":"reference","name":"ImageProps"}},{"name":"context","kind":32768,"flags":{"isExternal":true},"type":{"type":"intrinsic","name":"any"}}],"type":{"type":"reference","name":"Image"},"inheritedFrom":{"type":"reference","name":"React.PureComponent.constructor"}}],"inheritedFrom":{"type":"reference","name":"React.PureComponent.constructor"}},{"name":"render","kind":2048,"signatures":[{"name":"render","kind":4096,"type":{"type":"reference","name":"Element","qualifiedName":"global.JSX.Element","package":"@types/react"},"overwrites":{"type":"reference","name":"React.PureComponent.render"}}],"overwrites":{"type":"reference","name":"React.PureComponent.render"}},{"name":"clearDiskCache","kind":2048,"flags":{"isStatic":true},"signatures":[{"name":"clearDiskCache","kind":4096,"comment":{"summary":[{"kind":"text","text":"Asynchronously clears all images from the disk cache."}],"blockTags":[{"tag":"@platform","content":[{"kind":"text","text":"android"}]},{"tag":"@platform","content":[{"kind":"text","text":"ios"}]},{"tag":"@returns","content":[{"kind":"text","text":"A promise resolving to "},{"kind":"code","text":"`true`"},{"kind":"text","text":" when the operation succeeds.\nIt may resolve to "},{"kind":"code","text":"`false`"},{"kind":"text","text":" on Android when the activity is no longer available.\nResolves to "},{"kind":"code","text":"`false`"},{"kind":"text","text":" on Web."}]}]},"type":{"type":"reference","typeArguments":[{"type":"intrinsic","name":"boolean"}],"name":"Promise","qualifiedName":"Promise","package":"typescript"}}]},{"name":"clearMemoryCache","kind":2048,"flags":{"isStatic":true},"signatures":[{"name":"clearMemoryCache","kind":4096,"comment":{"summary":[{"kind":"text","text":"Asynchronously clears all images stored in memory."}],"blockTags":[{"tag":"@platform","content":[{"kind":"text","text":"android"}]},{"tag":"@platform","content":[{"kind":"text","text":"ios"}]},{"tag":"@returns","content":[{"kind":"text","text":"A promise resolving to "},{"kind":"code","text":"`true`"},{"kind":"text","text":" when the operation succeeds.\nIt may resolve to "},{"kind":"code","text":"`false`"},{"kind":"text","text":" on Android when the activity is no longer available.\nResolves to "},{"kind":"code","text":"`false`"},{"kind":"text","text":" on Web."}]}]},"type":{"type":"reference","typeArguments":[{"type":"intrinsic","name":"boolean"}],"name":"Promise","qualifiedName":"Promise","package":"typescript"}}]},{"name":"prefetch","kind":2048,"flags":{"isStatic":true},"signatures":[{"name":"prefetch","kind":4096,"comment":{"summary":[{"kind":"text","text":"Preloads images at the given urls that can be later used in the image view.\nPreloaded images are always cached on the disk, so make sure to use\n"},{"kind":"code","text":"`disk`"},{"kind":"text","text":" (default) or "},{"kind":"code","text":"`memory-disk`"},{"kind":"text","text":" cache policy."}]},"parameters":[{"name":"urls","kind":32768,"type":{"type":"union","types":[{"type":"intrinsic","name":"string"},{"type":"array","elementType":{"type":"intrinsic","name":"string"}}]}}],"type":{"type":"intrinsic","name":"void"}}]}],"extendedTypes":[{"type":"reference","typeArguments":[{"type":"reference","name":"ImageProps"}],"name":"PureComponent","qualifiedName":"React.PureComponent","package":"@types/react"}]},{"name":"ImageBackgroundProps","kind":256,"children":[{"name":"accessibilityLabel","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"The text that's read by the screen reader when the user interacts with the image. Sets the the "},{"kind":"code","text":"`alt`"},{"kind":"text","text":" tag on web which is used for web crawlers and link traversal."}],"blockTags":[{"tag":"@default","content":[{"kind":"text","text":"undefined"}]}]},"type":{"type":"intrinsic","name":"string"},"inheritedFrom":{"type":"reference","name":"Omit.accessibilityLabel"}},{"name":"accessible","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"When true, indicates that the view is an accessibility element.\nWhen a view is an accessibility element, it groups its children into a single selectable component.\n\nOn Android, the "},{"kind":"code","text":"`accessible`"},{"kind":"text","text":" property will be translated into the native "},{"kind":"code","text":"`isScreenReaderFocusable`"},{"kind":"text","text":",\nso it's only affecting the screen readers behaviour."}],"blockTags":[{"tag":"@default","content":[{"kind":"text","text":"false"}]},{"tag":"@platform","content":[{"kind":"text","text":"android"}]},{"tag":"@platform","content":[{"kind":"text","text":"ios"}]}]},"type":{"type":"intrinsic","name":"boolean"},"inheritedFrom":{"type":"reference","name":"Omit.accessible"}},{"name":"allowDownscaling","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"Whether the image should be downscaled to match the size of the view container.\nTurning off this functionality could negatively impact the application's performance, particularly when working with large assets.\nHowever, it would result in smoother image resizing, and end-users would always have access to the highest possible asset quality.\n\nDownscaling is never used when the "},{"kind":"code","text":"`contentFit`"},{"kind":"text","text":" prop is set to "},{"kind":"code","text":"`none`"},{"kind":"text","text":" or "},{"kind":"code","text":"`fill`"},{"kind":"text","text":"."}],"blockTags":[{"tag":"@default","content":[{"kind":"text","text":"true"}]},{"tag":"@platform","content":[{"kind":"text","text":"android"}]}]},"type":{"type":"intrinsic","name":"boolean"},"inheritedFrom":{"type":"reference","name":"Omit.allowDownscaling"}},{"name":"alt","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"The text that's read by the screen reader when the user interacts with the image. Sets the the "},{"kind":"code","text":"`alt`"},{"kind":"text","text":" tag on web which is used for web crawlers and link traversal. Is an alias for "},{"kind":"code","text":"`accessibilityLabel`"},{"kind":"text","text":"."}],"blockTags":[{"tag":"@alias","content":[{"kind":"text","text":"accessibilityLabel"}]},{"tag":"@default","content":[{"kind":"text","text":"undefined"}]}]},"type":{"type":"intrinsic","name":"string"},"inheritedFrom":{"type":"reference","name":"Omit.alt"}},{"name":"blurRadius","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"The radius of the blur in points, "},{"kind":"code","text":"`0`"},{"kind":"text","text":" means no blur effect.\nThis effect is not applied to placeholders."}],"blockTags":[{"tag":"@default","content":[{"kind":"text","text":"0"}]}]},"type":{"type":"intrinsic","name":"number"},"inheritedFrom":{"type":"reference","name":"Omit.blurRadius"}},{"name":"cachePolicy","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"Determines whether to cache the image and where: on the disk, in the memory or both.\n\n- "},{"kind":"code","text":"`'none'`"},{"kind":"text","text":" - Image is not cached at all.\n\n- "},{"kind":"code","text":"`'disk'`"},{"kind":"text","text":" - Image is queried from the disk cache if exists, otherwise it's downloaded and then stored on the disk.\n\n- "},{"kind":"code","text":"`'memory'`"},{"kind":"text","text":" - Image is cached in memory. Might be useful when you render a high-resolution picture many times.\nMemory cache may be purged very quickly to prevent high memory usage and the risk of out of memory exceptions.\n\n- "},{"kind":"code","text":"`'memory-disk'`"},{"kind":"text","text":" - Image is cached in memory, but with a fallback to the disk cache."}],"blockTags":[{"tag":"@default","content":[{"kind":"text","text":"'disk'"}]}]},"type":{"type":"union","types":[{"type":"literal","value":null},{"type":"literal","value":"none"},{"type":"literal","value":"disk"},{"type":"literal","value":"memory"},{"type":"literal","value":"memory-disk"}]},"inheritedFrom":{"type":"reference","name":"Omit.cachePolicy"}},{"name":"contentFit","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"Determines how the image should be resized to fit its container. This property tells the image to fill the container\nin a variety of ways; such as \"preserve that aspect ratio\" or \"stretch up and take up as much space as possible\".\nIt mirrors the CSS ["},{"kind":"code","text":"`object-fit`"},{"kind":"text","text":"](https://developer.mozilla.org/en-US/docs/Web/CSS/object-fit) property.\n\n- "},{"kind":"code","text":"`'cover'`"},{"kind":"text","text":" - The image is sized to maintain its aspect ratio while filling the container box.\nIf the image's aspect ratio does not match the aspect ratio of its box, then the object will be clipped to fit.\n\n- "},{"kind":"code","text":"`'contain'`"},{"kind":"text","text":" - The image is scaled down or up to maintain its aspect ratio while fitting within the container box.\n\n- "},{"kind":"code","text":"`'fill'`"},{"kind":"text","text":" - The image is sized to entirely fill the container box. If necessary, the image will be stretched or squished to fit.\n\n- "},{"kind":"code","text":"`'none'`"},{"kind":"text","text":" - The image is not resized and is centered by default.\nWhen specified, the exact position can be controlled with ["},{"kind":"code","text":"`contentPosition`"},{"kind":"text","text":"](#contentposition) prop.\n\n- "},{"kind":"code","text":"`'scale-down'`"},{"kind":"text","text":" - The image is sized as if "},{"kind":"code","text":"`none`"},{"kind":"text","text":" or "},{"kind":"code","text":"`contain`"},{"kind":"text","text":" were specified, whichever would result in a smaller concrete image size."}],"blockTags":[{"tag":"@default","content":[{"kind":"text","text":"'cover'"}]}]},"type":{"type":"reference","name":"ImageContentFit"},"inheritedFrom":{"type":"reference","name":"Omit.contentFit"}},{"name":"contentPosition","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"It is used together with ["},{"kind":"code","text":"`contentFit`"},{"kind":"text","text":"](#contentfit) to specify how the image should be positioned with x/y coordinates inside its own container.\nAn equivalent of the CSS ["},{"kind":"code","text":"`object-position`"},{"kind":"text","text":"](https://developer.mozilla.org/en-US/docs/Web/CSS/object-position) property."}],"blockTags":[{"tag":"@default","content":[{"kind":"text","text":"'center'"}]}]},"type":{"type":"reference","name":"ImageContentPosition"},"inheritedFrom":{"type":"reference","name":"Omit.contentPosition"}},{"name":"defaultSource","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[],"blockTags":[{"tag":"@deprecated","content":[{"kind":"text","text":"Provides compatibility for ["},{"kind":"code","text":"`defaultSource`"},{"kind":"text","text":" from React Native Image](https://reactnative.dev/docs/image#defaultsource).\nUse ["},{"kind":"code","text":"`placeholder`"},{"kind":"text","text":"](#placeholder) prop instead."}]}]},"type":{"type":"union","types":[{"type":"literal","value":null},{"type":"reference","name":"ImageSource"}]},"inheritedFrom":{"type":"reference","name":"Omit.defaultSource"}},{"name":"enableLiveTextInteraction","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"Enables Live Text interaction with the image. Check official [Apple documentation](https://developer.apple.com/documentation/visionkit/enabling_live_text_interactions_with_images) for more details."}],"blockTags":[{"tag":"@default","content":[{"kind":"text","text":"false"}]},{"tag":"@platform","content":[{"kind":"text","text":"ios 16.0+"}]}]},"type":{"type":"intrinsic","name":"boolean"},"inheritedFrom":{"type":"reference","name":"Omit.enableLiveTextInteraction"}},{"name":"fadeDuration","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[],"blockTags":[{"tag":"@deprecated","content":[{"kind":"text","text":"Provides compatibility for ["},{"kind":"code","text":"`fadeDuration`"},{"kind":"text","text":" from React Native Image](https://reactnative.dev/docs/image#fadeduration-android).\nInstead use ["},{"kind":"code","text":"`transition`"},{"kind":"text","text":"](#transition) with the provided duration."}]}]},"type":{"type":"intrinsic","name":"number"},"inheritedFrom":{"type":"reference","name":"Omit.fadeDuration"}},{"name":"focusable","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"Whether this View should be focusable with a non-touch input device and receive focus with a hardware keyboard."}],"blockTags":[{"tag":"@default","content":[{"kind":"text","text":"false"}]},{"tag":"@platform","content":[{"kind":"text","text":"android"}]}]},"type":{"type":"intrinsic","name":"boolean"},"inheritedFrom":{"type":"reference","name":"Omit.focusable"}},{"name":"imageStyle","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"Style object for the image"}]},"type":{"type":"reference","typeArguments":[{"type":"reference","name":"ImageStyle","qualifiedName":"ImageStyle","package":"react-native"}],"name":"StyleProp","qualifiedName":"StyleProp","package":"react-native"}},{"name":"loadingIndicatorSource","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[],"blockTags":[{"tag":"@deprecated","content":[{"kind":"text","text":"Provides compatibility for ["},{"kind":"code","text":"`loadingIndicatorSource`"},{"kind":"text","text":" from React Native Image](https://reactnative.dev/docs/image#loadingindicatorsource).\nUse ["},{"kind":"code","text":"`placeholder`"},{"kind":"text","text":"](#placeholder) prop instead."}]}]},"type":{"type":"union","types":[{"type":"literal","value":null},{"type":"reference","name":"ImageSource"}]},"inheritedFrom":{"type":"reference","name":"Omit.loadingIndicatorSource"}},{"name":"onError","kind":1024,"flags":{"isOptional":true},"type":{"type":"reflection","declaration":{"name":"__type","kind":65536,"signatures":[{"name":"__type","kind":4096,"comment":{"summary":[{"kind":"text","text":"Called on an image fetching error."}]},"parameters":[{"name":"event","kind":32768,"type":{"type":"reference","name":"ImageErrorEventData"}}],"type":{"type":"intrinsic","name":"void"}}]}},"inheritedFrom":{"type":"reference","name":"Omit.onError"}},{"name":"onLoad","kind":1024,"flags":{"isOptional":true},"type":{"type":"reflection","declaration":{"name":"__type","kind":65536,"signatures":[{"name":"__type","kind":4096,"comment":{"summary":[{"kind":"text","text":"Called when the image load completes successfully."}]},"parameters":[{"name":"event","kind":32768,"type":{"type":"reference","name":"ImageLoadEventData"}}],"type":{"type":"intrinsic","name":"void"}}]}},"inheritedFrom":{"type":"reference","name":"Omit.onLoad"}},{"name":"onLoadEnd","kind":1024,"flags":{"isOptional":true},"type":{"type":"reflection","declaration":{"name":"__type","kind":65536,"signatures":[{"name":"__type","kind":4096,"comment":{"summary":[{"kind":"text","text":"Called when the image load either succeeds or fails."}]},"type":{"type":"intrinsic","name":"void"}}]}},"inheritedFrom":{"type":"reference","name":"Omit.onLoadEnd"}},{"name":"onLoadStart","kind":1024,"flags":{"isOptional":true},"type":{"type":"reflection","declaration":{"name":"__type","kind":65536,"signatures":[{"name":"__type","kind":4096,"comment":{"summary":[{"kind":"text","text":"Called when the image starts to load."}]},"type":{"type":"intrinsic","name":"void"}}]}},"inheritedFrom":{"type":"reference","name":"Omit.onLoadStart"}},{"name":"onProgress","kind":1024,"flags":{"isOptional":true},"type":{"type":"reflection","declaration":{"name":"__type","kind":65536,"signatures":[{"name":"__type","kind":4096,"comment":{"summary":[{"kind":"text","text":"Called when the image is loading. Can be called multiple times before the image has finished loading.\nThe event object provides details on how many bytes were loaded so far and what's the expected total size."}]},"parameters":[{"name":"event","kind":32768,"type":{"type":"reference","name":"ImageProgressEventData"}}],"type":{"type":"intrinsic","name":"void"}}]}},"inheritedFrom":{"type":"reference","name":"Omit.onProgress"}},{"name":"placeholder","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"An image to display while loading the proper image and no image has been displayed yet or the source is unset."}]},"type":{"type":"union","types":[{"type":"literal","value":null},{"type":"intrinsic","name":"string"},{"type":"intrinsic","name":"number"},{"type":"array","elementType":{"type":"intrinsic","name":"string"}},{"type":"reference","name":"ImageSource"},{"type":"array","elementType":{"type":"reference","name":"ImageSource"}}]},"inheritedFrom":{"type":"reference","name":"Omit.placeholder"}},{"name":"priority","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"Priorities for completing loads. If more than one load is queued at a time,\nthe load with the higher priority will be started first.\nPriorities are considered best effort, there are no guarantees about the order in which loads will start or finish."}],"blockTags":[{"tag":"@default","content":[{"kind":"text","text":"'normal'"}]}]},"type":{"type":"union","types":[{"type":"literal","value":null},{"type":"literal","value":"low"},{"type":"literal","value":"normal"},{"type":"literal","value":"high"}]},"inheritedFrom":{"type":"reference","name":"Omit.priority"}},{"name":"recyclingKey","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"Changing this prop resets the image view content to blank or a placeholder before loading and rendering the final image.\nThis is especially useful for any kinds of recycling views like [FlashList](https://github.com/shopify/flash-list)\nto prevent showing the previous source before the new one fully loads."}],"blockTags":[{"tag":"@default","content":[{"kind":"text","text":"null"}]},{"tag":"@platform","content":[{"kind":"text","text":"android"}]},{"tag":"@platform","content":[{"kind":"text","text":"ios"}]}]},"type":{"type":"union","types":[{"type":"literal","value":null},{"type":"intrinsic","name":"string"}]},"inheritedFrom":{"type":"reference","name":"Omit.recyclingKey"}},{"name":"resizeMode","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[],"blockTags":[{"tag":"@deprecated","content":[{"kind":"text","text":"Provides compatibility for ["},{"kind":"code","text":"`resizeMode`"},{"kind":"text","text":" from React Native Image](https://reactnative.dev/docs/image#resizemode).\nNote that "},{"kind":"code","text":"`\"repeat\"`"},{"kind":"text","text":" option is not supported at all.\nUse the more powerful ["},{"kind":"code","text":"`contentFit`"},{"kind":"text","text":"](#contentfit) and ["},{"kind":"code","text":"`contentPosition`"},{"kind":"text","text":"](#contentposition) props instead."}]}]},"type":{"type":"union","types":[{"type":"literal","value":"cover"},{"type":"literal","value":"contain"},{"type":"literal","value":"center"},{"type":"literal","value":"stretch"},{"type":"literal","value":"repeat"}]},"inheritedFrom":{"type":"reference","name":"Omit.resizeMode"}},{"name":"responsivePolicy","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"Determines whether to choose image source based on container size only on mount or on every resize.\nUse "},{"kind":"code","text":"`initial`"},{"kind":"text","text":" to improve performance."}],"blockTags":[{"tag":"@default","content":[{"kind":"text","text":"\"live\""}]},{"tag":"@platform","content":[{"kind":"text","text":"web"}]}]},"type":{"type":"union","types":[{"type":"literal","value":"live"},{"type":"literal","value":"initial"}]},"inheritedFrom":{"type":"reference","name":"Omit.responsivePolicy"}},{"name":"source","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"The image source, either a remote URL, a local file resource or a number that is the result of the "},{"kind":"code","text":"`require()`"},{"kind":"text","text":" function.\nWhen provided as an array of sources, the source that fits best into the container size and is closest to the screen scale\nwill be chosen. In this case it is important to provide "},{"kind":"code","text":"`width`"},{"kind":"text","text":", "},{"kind":"code","text":"`height`"},{"kind":"text","text":" and "},{"kind":"code","text":"`scale`"},{"kind":"text","text":" properties."}]},"type":{"type":"union","types":[{"type":"literal","value":null},{"type":"intrinsic","name":"string"},{"type":"intrinsic","name":"number"},{"type":"array","elementType":{"type":"intrinsic","name":"string"}},{"type":"reference","name":"ImageSource"},{"type":"array","elementType":{"type":"reference","name":"ImageSource"}}]},"inheritedFrom":{"type":"reference","name":"Omit.source"}},{"name":"style","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"The style of the image container"}]},"type":{"type":"reference","typeArguments":[{"type":"reference","name":"ViewStyle","qualifiedName":"ViewStyle","package":"react-native"}],"name":"StyleProp","qualifiedName":"StyleProp","package":"react-native"}},{"name":"tintColor","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"A color used to tint template images (a bitmap image where only the opacity matters).\nThe color is applied to every non-transparent pixel, causing the image’s shape to adopt that color.\nThis effect is not applied to placeholders."}],"blockTags":[{"tag":"@default","content":[{"kind":"text","text":"null"}]},{"tag":"@platform","content":[{"kind":"text","text":"android"}]},{"tag":"@platform","content":[{"kind":"text","text":"ios"}]}]},"type":{"type":"union","types":[{"type":"literal","value":null},{"type":"intrinsic","name":"string"}]},"inheritedFrom":{"type":"reference","name":"Omit.tintColor"}},{"name":"transition","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"Describes how the image view should transition the contents when switching the image source.\\\nIf provided as a number, it is the duration in milliseconds of the "},{"kind":"code","text":"`'cross-dissolve'`"},{"kind":"text","text":" effect."}]},"type":{"type":"union","types":[{"type":"literal","value":null},{"type":"intrinsic","name":"number"},{"type":"reference","name":"ImageTransition"}]},"inheritedFrom":{"type":"reference","name":"Omit.transition"}}],"extendedTypes":[{"type":"reference","typeArguments":[{"type":"reference","name":"ImageProps"},{"type":"literal","value":"style"}],"name":"Omit","qualifiedName":"Omit","package":"typescript"}]},{"name":"ImageContentPosition","kind":4194304,"comment":{"summary":[{"kind":"text","text":"Specifies the position of the image inside its container. One value controls the x-axis and the second value controls the y-axis.\n\nAdditionally, it supports stringified shorthand form that specifies the edges to which to align the image content:\\\n"},{"kind":"code","text":"`'center'`"},{"kind":"text","text":", "},{"kind":"code","text":"`'top'`"},{"kind":"text","text":", "},{"kind":"code","text":"`'right'`"},{"kind":"text","text":", "},{"kind":"code","text":"`'bottom'`"},{"kind":"text","text":", "},{"kind":"code","text":"`'left'`"},{"kind":"text","text":", "},{"kind":"code","text":"`'top center'`"},{"kind":"text","text":", "},{"kind":"code","text":"`'top right'`"},{"kind":"text","text":", "},{"kind":"code","text":"`'top left'`"},{"kind":"text","text":", "},{"kind":"code","text":"`'right center'`"},{"kind":"text","text":", "},{"kind":"code","text":"`'right top'`"},{"kind":"text","text":",\n"},{"kind":"code","text":"`'right bottom'`"},{"kind":"text","text":", "},{"kind":"code","text":"`'bottom center'`"},{"kind":"text","text":", "},{"kind":"code","text":"`'bottom right'`"},{"kind":"text","text":", "},{"kind":"code","text":"`'bottom left'`"},{"kind":"text","text":", "},{"kind":"code","text":"`'left center'`"},{"kind":"text","text":", "},{"kind":"code","text":"`'left top'`"},{"kind":"text","text":", "},{"kind":"code","text":"`'left bottom'`"},{"kind":"text","text":".\\\nIf only one keyword is provided, then the other dimension is set to "},{"kind":"code","text":"`'center'`"},{"kind":"text","text":" ("},{"kind":"code","text":"`'50%'`"},{"kind":"text","text":"), so the image is placed in the middle of the specified edge.\\\nAs an example, "},{"kind":"code","text":"`'top right'`"},{"kind":"text","text":" is the same as "},{"kind":"code","text":"`{ top: 0, right: 0 }`"},{"kind":"text","text":" and "},{"kind":"code","text":"`'bottom'`"},{"kind":"text","text":" is the same as "},{"kind":"code","text":"`{ bottom: 0, left: '50%' }`"},{"kind":"text","text":"."}]},"type":{"type":"union","types":[{"type":"reflection","declaration":{"name":"__type","kind":65536,"children":[{"name":"right","kind":1024,"flags":{"isOptional":true},"type":{"type":"reference","name":"ImageContentPositionValue"}},{"name":"top","kind":1024,"flags":{"isOptional":true},"type":{"type":"reference","name":"ImageContentPositionValue"}}]}},{"type":"reflection","declaration":{"name":"__type","kind":65536,"children":[{"name":"left","kind":1024,"flags":{"isOptional":true},"type":{"type":"reference","name":"ImageContentPositionValue"}},{"name":"top","kind":1024,"flags":{"isOptional":true},"type":{"type":"reference","name":"ImageContentPositionValue"}}]}},{"type":"reflection","declaration":{"name":"__type","kind":65536,"children":[{"name":"bottom","kind":1024,"flags":{"isOptional":true},"type":{"type":"reference","name":"ImageContentPositionValue"}},{"name":"right","kind":1024,"flags":{"isOptional":true},"type":{"type":"reference","name":"ImageContentPositionValue"}}]}},{"type":"reflection","declaration":{"name":"__type","kind":65536,"children":[{"name":"bottom","kind":1024,"flags":{"isOptional":true},"type":{"type":"reference","name":"ImageContentPositionValue"}},{"name":"left","kind":1024,"flags":{"isOptional":true},"type":{"type":"reference","name":"ImageContentPositionValue"}}]}},{"type":"reference","name":"ImageContentPositionString"}]}},{"name":"ImageContentPositionValue","kind":4194304,"comment":{"summary":[{"kind":"text","text":"A value that represents the relative position of a single axis.\n\nIf "},{"kind":"code","text":"`number`"},{"kind":"text","text":", it is a distance in points (logical pixels) from the respective edge.\\\nIf "},{"kind":"code","text":"`string`"},{"kind":"text","text":", it must be a percentage value where "},{"kind":"code","text":"`'100%'`"},{"kind":"text","text":" is the difference in size between the container and the image along the respective axis,\nor "},{"kind":"code","text":"`'center'`"},{"kind":"text","text":" which is an alias for "},{"kind":"code","text":"`'50%'`"},{"kind":"text","text":" that is the default value. You can read more regarding percentages on the MDN docs for\n["},{"kind":"code","text":"`background-position`"},{"kind":"text","text":"](https://developer.mozilla.org/en-US/docs/Web/CSS/background-position#regarding_percentages) that describes this concept well."}]},"type":{"type":"union","types":[{"type":"intrinsic","name":"number"},{"type":"intrinsic","name":"string"},{"type":"template-literal","head":"","tail":[[{"type":"intrinsic","name":"number"},"%"]]},{"type":"template-literal","head":"","tail":[[{"type":"intrinsic","name":"number"},""]]},{"type":"literal","value":"center"}]}},{"name":"ImageErrorEventData","kind":4194304,"type":{"type":"reflection","declaration":{"name":"__type","kind":65536,"children":[{"name":"error","kind":1024,"type":{"type":"intrinsic","name":"string"}}]}}},{"name":"ImageLoadEventData","kind":4194304,"type":{"type":"reflection","declaration":{"name":"__type","kind":65536,"children":[{"name":"cacheType","kind":1024,"type":{"type":"union","types":[{"type":"literal","value":"none"},{"type":"literal","value":"disk"},{"type":"literal","value":"memory"}]}},{"name":"source","kind":1024,"type":{"type":"reflection","declaration":{"name":"__type","kind":65536,"children":[{"name":"height","kind":1024,"type":{"type":"intrinsic","name":"number"}},{"name":"mediaType","kind":1024,"type":{"type":"union","types":[{"type":"intrinsic","name":"string"},{"type":"literal","value":null}]}},{"name":"url","kind":1024,"type":{"type":"intrinsic","name":"string"}},{"name":"width","kind":1024,"type":{"type":"intrinsic","name":"number"}}]}}}]}}},{"name":"ImageProgressEventData","kind":4194304,"type":{"type":"reflection","declaration":{"name":"__type","kind":65536,"children":[{"name":"loaded","kind":1024,"type":{"type":"intrinsic","name":"number"}},{"name":"total","kind":1024,"type":{"type":"intrinsic","name":"number"}}]}}},{"name":"ImageProps","kind":256,"comment":{"summary":[{"kind":"text","text":"Some props are from React Native Image that Expo Image supports (more or less) for easier migration,\nbut all of them are deprecated and might be removed in the future."}]},"children":[{"name":"accessibilityLabel","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"The text that's read by the screen reader when the user interacts with the image. Sets the the "},{"kind":"code","text":"`alt`"},{"kind":"text","text":" tag on web which is used for web crawlers and link traversal."}],"blockTags":[{"tag":"@default","content":[{"kind":"text","text":"undefined"}]}]},"type":{"type":"intrinsic","name":"string"},"overwrites":{"type":"reference","name":"ViewProps.accessibilityLabel"}},{"name":"accessible","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"When true, indicates that the view is an accessibility element.\nWhen a view is an accessibility element, it groups its children into a single selectable component.\n\nOn Android, the "},{"kind":"code","text":"`accessible`"},{"kind":"text","text":" property will be translated into the native "},{"kind":"code","text":"`isScreenReaderFocusable`"},{"kind":"text","text":",\nso it's only affecting the screen readers behaviour."}],"blockTags":[{"tag":"@default","content":[{"kind":"text","text":"false"}]},{"tag":"@platform","content":[{"kind":"text","text":"android"}]},{"tag":"@platform","content":[{"kind":"text","text":"ios"}]}]},"type":{"type":"intrinsic","name":"boolean"},"overwrites":{"type":"reference","name":"ViewProps.accessible"}},{"name":"allowDownscaling","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"Whether the image should be downscaled to match the size of the view container.\nTurning off this functionality could negatively impact the application's performance, particularly when working with large assets.\nHowever, it would result in smoother image resizing, and end-users would always have access to the highest possible asset quality.\n\nDownscaling is never used when the "},{"kind":"code","text":"`contentFit`"},{"kind":"text","text":" prop is set to "},{"kind":"code","text":"`none`"},{"kind":"text","text":" or "},{"kind":"code","text":"`fill`"},{"kind":"text","text":"."}],"blockTags":[{"tag":"@default","content":[{"kind":"text","text":"true"}]},{"tag":"@platform","content":[{"kind":"text","text":"android"}]}]},"type":{"type":"intrinsic","name":"boolean"}},{"name":"alt","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"The text that's read by the screen reader when the user interacts with the image. Sets the the "},{"kind":"code","text":"`alt`"},{"kind":"text","text":" tag on web which is used for web crawlers and link traversal. Is an alias for "},{"kind":"code","text":"`accessibilityLabel`"},{"kind":"text","text":"."}],"blockTags":[{"tag":"@alias","content":[{"kind":"text","text":"accessibilityLabel"}]},{"tag":"@default","content":[{"kind":"text","text":"undefined"}]}]},"type":{"type":"intrinsic","name":"string"}},{"name":"blurRadius","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"The radius of the blur in points, "},{"kind":"code","text":"`0`"},{"kind":"text","text":" means no blur effect.\nThis effect is not applied to placeholders."}],"blockTags":[{"tag":"@default","content":[{"kind":"text","text":"0"}]}]},"type":{"type":"intrinsic","name":"number"}},{"name":"cachePolicy","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"Determines whether to cache the image and where: on the disk, in the memory or both.\n\n- "},{"kind":"code","text":"`'none'`"},{"kind":"text","text":" - Image is not cached at all.\n\n- "},{"kind":"code","text":"`'disk'`"},{"kind":"text","text":" - Image is queried from the disk cache if exists, otherwise it's downloaded and then stored on the disk.\n\n- "},{"kind":"code","text":"`'memory'`"},{"kind":"text","text":" - Image is cached in memory. Might be useful when you render a high-resolution picture many times.\nMemory cache may be purged very quickly to prevent high memory usage and the risk of out of memory exceptions.\n\n- "},{"kind":"code","text":"`'memory-disk'`"},{"kind":"text","text":" - Image is cached in memory, but with a fallback to the disk cache."}],"blockTags":[{"tag":"@default","content":[{"kind":"text","text":"'disk'"}]}]},"type":{"type":"union","types":[{"type":"literal","value":null},{"type":"literal","value":"none"},{"type":"literal","value":"disk"},{"type":"literal","value":"memory"},{"type":"literal","value":"memory-disk"}]}},{"name":"contentFit","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"Determines how the image should be resized to fit its container. This property tells the image to fill the container\nin a variety of ways; such as \"preserve that aspect ratio\" or \"stretch up and take up as much space as possible\".\nIt mirrors the CSS ["},{"kind":"code","text":"`object-fit`"},{"kind":"text","text":"](https://developer.mozilla.org/en-US/docs/Web/CSS/object-fit) property.\n\n- "},{"kind":"code","text":"`'cover'`"},{"kind":"text","text":" - The image is sized to maintain its aspect ratio while filling the container box.\nIf the image's aspect ratio does not match the aspect ratio of its box, then the object will be clipped to fit.\n\n- "},{"kind":"code","text":"`'contain'`"},{"kind":"text","text":" - The image is scaled down or up to maintain its aspect ratio while fitting within the container box.\n\n- "},{"kind":"code","text":"`'fill'`"},{"kind":"text","text":" - The image is sized to entirely fill the container box. If necessary, the image will be stretched or squished to fit.\n\n- "},{"kind":"code","text":"`'none'`"},{"kind":"text","text":" - The image is not resized and is centered by default.\nWhen specified, the exact position can be controlled with ["},{"kind":"code","text":"`contentPosition`"},{"kind":"text","text":"](#contentposition) prop.\n\n- "},{"kind":"code","text":"`'scale-down'`"},{"kind":"text","text":" - The image is sized as if "},{"kind":"code","text":"`none`"},{"kind":"text","text":" or "},{"kind":"code","text":"`contain`"},{"kind":"text","text":" were specified, whichever would result in a smaller concrete image size."}],"blockTags":[{"tag":"@default","content":[{"kind":"text","text":"'cover'"}]}]},"type":{"type":"reference","name":"ImageContentFit"}},{"name":"contentPosition","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"It is used together with ["},{"kind":"code","text":"`contentFit`"},{"kind":"text","text":"](#contentfit) to specify how the image should be positioned with x/y coordinates inside its own container.\nAn equivalent of the CSS ["},{"kind":"code","text":"`object-position`"},{"kind":"text","text":"](https://developer.mozilla.org/en-US/docs/Web/CSS/object-position) property."}],"blockTags":[{"tag":"@default","content":[{"kind":"text","text":"'center'"}]}]},"type":{"type":"reference","name":"ImageContentPosition"}},{"name":"defaultSource","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[],"blockTags":[{"tag":"@deprecated","content":[{"kind":"text","text":"Provides compatibility for ["},{"kind":"code","text":"`defaultSource`"},{"kind":"text","text":" from React Native Image](https://reactnative.dev/docs/image#defaultsource).\nUse ["},{"kind":"code","text":"`placeholder`"},{"kind":"text","text":"](#placeholder) prop instead."}]}]},"type":{"type":"union","types":[{"type":"literal","value":null},{"type":"reference","name":"ImageSource"}]}},{"name":"enableLiveTextInteraction","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"Enables Live Text interaction with the image. Check official [Apple documentation](https://developer.apple.com/documentation/visionkit/enabling_live_text_interactions_with_images) for more details."}],"blockTags":[{"tag":"@default","content":[{"kind":"text","text":"false"}]},{"tag":"@platform","content":[{"kind":"text","text":"ios 16.0+"}]}]},"type":{"type":"intrinsic","name":"boolean"}},{"name":"fadeDuration","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[],"blockTags":[{"tag":"@deprecated","content":[{"kind":"text","text":"Provides compatibility for ["},{"kind":"code","text":"`fadeDuration`"},{"kind":"text","text":" from React Native Image](https://reactnative.dev/docs/image#fadeduration-android).\nInstead use ["},{"kind":"code","text":"`transition`"},{"kind":"text","text":"](#transition) with the provided duration."}]}]},"type":{"type":"intrinsic","name":"number"}},{"name":"focusable","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"Whether this View should be focusable with a non-touch input device and receive focus with a hardware keyboard."}],"blockTags":[{"tag":"@default","content":[{"kind":"text","text":"false"}]},{"tag":"@platform","content":[{"kind":"text","text":"android"}]}]},"type":{"type":"intrinsic","name":"boolean"},"overwrites":{"type":"reference","name":"ViewProps.focusable"}},{"name":"loadingIndicatorSource","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[],"blockTags":[{"tag":"@deprecated","content":[{"kind":"text","text":"Provides compatibility for ["},{"kind":"code","text":"`loadingIndicatorSource`"},{"kind":"text","text":" from React Native Image](https://reactnative.dev/docs/image#loadingindicatorsource).\nUse ["},{"kind":"code","text":"`placeholder`"},{"kind":"text","text":"](#placeholder) prop instead."}]}]},"type":{"type":"union","types":[{"type":"literal","value":null},{"type":"reference","name":"ImageSource"}]}},{"name":"onError","kind":1024,"flags":{"isOptional":true},"type":{"type":"reflection","declaration":{"name":"__type","kind":65536,"signatures":[{"name":"__type","kind":4096,"comment":{"summary":[{"kind":"text","text":"Called on an image fetching error."}]},"parameters":[{"name":"event","kind":32768,"type":{"type":"reference","name":"ImageErrorEventData"}}],"type":{"type":"intrinsic","name":"void"}}]}}},{"name":"onLoad","kind":1024,"flags":{"isOptional":true},"type":{"type":"reflection","declaration":{"name":"__type","kind":65536,"signatures":[{"name":"__type","kind":4096,"comment":{"summary":[{"kind":"text","text":"Called when the image load completes successfully."}]},"parameters":[{"name":"event","kind":32768,"type":{"type":"reference","name":"ImageLoadEventData"}}],"type":{"type":"intrinsic","name":"void"}}]}}},{"name":"onLoadEnd","kind":1024,"flags":{"isOptional":true},"type":{"type":"reflection","declaration":{"name":"__type","kind":65536,"signatures":[{"name":"__type","kind":4096,"comment":{"summary":[{"kind":"text","text":"Called when the image load either succeeds or fails."}]},"type":{"type":"intrinsic","name":"void"}}]}}},{"name":"onLoadStart","kind":1024,"flags":{"isOptional":true},"type":{"type":"reflection","declaration":{"name":"__type","kind":65536,"signatures":[{"name":"__type","kind":4096,"comment":{"summary":[{"kind":"text","text":"Called when the image starts to load."}]},"type":{"type":"intrinsic","name":"void"}}]}}},{"name":"onProgress","kind":1024,"flags":{"isOptional":true},"type":{"type":"reflection","declaration":{"name":"__type","kind":65536,"signatures":[{"name":"__type","kind":4096,"comment":{"summary":[{"kind":"text","text":"Called when the image is loading. Can be called multiple times before the image has finished loading.\nThe event object provides details on how many bytes were loaded so far and what's the expected total size."}]},"parameters":[{"name":"event","kind":32768,"type":{"type":"reference","name":"ImageProgressEventData"}}],"type":{"type":"intrinsic","name":"void"}}]}}},{"name":"placeholder","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"An image to display while loading the proper image and no image has been displayed yet or the source is unset."}]},"type":{"type":"union","types":[{"type":"literal","value":null},{"type":"intrinsic","name":"string"},{"type":"intrinsic","name":"number"},{"type":"array","elementType":{"type":"intrinsic","name":"string"}},{"type":"reference","name":"ImageSource"},{"type":"array","elementType":{"type":"reference","name":"ImageSource"}}]}},{"name":"priority","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"Priorities for completing loads. If more than one load is queued at a time,\nthe load with the higher priority will be started first.\nPriorities are considered best effort, there are no guarantees about the order in which loads will start or finish."}],"blockTags":[{"tag":"@default","content":[{"kind":"text","text":"'normal'"}]}]},"type":{"type":"union","types":[{"type":"literal","value":null},{"type":"literal","value":"low"},{"type":"literal","value":"normal"},{"type":"literal","value":"high"}]}},{"name":"recyclingKey","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"Changing this prop resets the image view content to blank or a placeholder before loading and rendering the final image.\nThis is especially useful for any kinds of recycling views like [FlashList](https://github.com/shopify/flash-list)\nto prevent showing the previous source before the new one fully loads."}],"blockTags":[{"tag":"@default","content":[{"kind":"text","text":"null"}]},{"tag":"@platform","content":[{"kind":"text","text":"android"}]},{"tag":"@platform","content":[{"kind":"text","text":"ios"}]}]},"type":{"type":"union","types":[{"type":"literal","value":null},{"type":"intrinsic","name":"string"}]}},{"name":"resizeMode","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[],"blockTags":[{"tag":"@deprecated","content":[{"kind":"text","text":"Provides compatibility for ["},{"kind":"code","text":"`resizeMode`"},{"kind":"text","text":" from React Native Image](https://reactnative.dev/docs/image#resizemode).\nNote that "},{"kind":"code","text":"`\"repeat\"`"},{"kind":"text","text":" option is not supported at all.\nUse the more powerful ["},{"kind":"code","text":"`contentFit`"},{"kind":"text","text":"](#contentfit) and ["},{"kind":"code","text":"`contentPosition`"},{"kind":"text","text":"](#contentposition) props instead."}]}]},"type":{"type":"union","types":[{"type":"literal","value":"cover"},{"type":"literal","value":"contain"},{"type":"literal","value":"center"},{"type":"literal","value":"stretch"},{"type":"literal","value":"repeat"}]}},{"name":"responsivePolicy","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"Determines whether to choose image source based on container size only on mount or on every resize.\nUse "},{"kind":"code","text":"`initial`"},{"kind":"text","text":" to improve performance."}],"blockTags":[{"tag":"@default","content":[{"kind":"text","text":"\"live\""}]},{"tag":"@platform","content":[{"kind":"text","text":"web"}]}]},"type":{"type":"union","types":[{"type":"literal","value":"live"},{"type":"literal","value":"initial"}]}},{"name":"source","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"The image source, either a remote URL, a local file resource or a number that is the result of the "},{"kind":"code","text":"`require()`"},{"kind":"text","text":" function.\nWhen provided as an array of sources, the source that fits best into the container size and is closest to the screen scale\nwill be chosen. In this case it is important to provide "},{"kind":"code","text":"`width`"},{"kind":"text","text":", "},{"kind":"code","text":"`height`"},{"kind":"text","text":" and "},{"kind":"code","text":"`scale`"},{"kind":"text","text":" properties."}]},"type":{"type":"union","types":[{"type":"literal","value":null},{"type":"intrinsic","name":"string"},{"type":"intrinsic","name":"number"},{"type":"array","elementType":{"type":"intrinsic","name":"string"}},{"type":"reference","name":"ImageSource"},{"type":"array","elementType":{"type":"reference","name":"ImageSource"}}]}},{"name":"tintColor","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"A color used to tint template images (a bitmap image where only the opacity matters).\nThe color is applied to every non-transparent pixel, causing the image’s shape to adopt that color.\nThis effect is not applied to placeholders."}],"blockTags":[{"tag":"@default","content":[{"kind":"text","text":"null"}]},{"tag":"@platform","content":[{"kind":"text","text":"android"}]},{"tag":"@platform","content":[{"kind":"text","text":"ios"}]}]},"type":{"type":"union","types":[{"type":"literal","value":null},{"type":"intrinsic","name":"string"}]}},{"name":"transition","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"Describes how the image view should transition the contents when switching the image source.\\\nIf provided as a number, it is the duration in milliseconds of the "},{"kind":"code","text":"`'cross-dissolve'`"},{"kind":"text","text":" effect."}]},"type":{"type":"union","types":[{"type":"literal","value":null},{"type":"intrinsic","name":"number"},{"type":"reference","name":"ImageTransition"}]}}],"extendedTypes":[{"type":"reference","name":"ViewProps","qualifiedName":"ViewProps","package":"react-native"}]},{"name":"ImageSource","kind":4194304,"type":{"type":"reflection","declaration":{"name":"__type","kind":65536,"children":[{"name":"blurhash","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"The blurhash string to use to generate the image. You can read more about the blurhash\non ["},{"kind":"code","text":"`woltapp/blurhash`"},{"kind":"text","text":"](https://github.com/woltapp/blurhash) repo. Ignored when "},{"kind":"code","text":"`uri`"},{"kind":"text","text":" is provided.\nWhen using the blurhash, you should also provide "},{"kind":"code","text":"`width`"},{"kind":"text","text":" and "},{"kind":"code","text":"`height`"},{"kind":"text","text":" (higher values reduce performance),\notherwise their default value is "},{"kind":"code","text":"`16`"},{"kind":"text","text":"."}]},"type":{"type":"intrinsic","name":"string"}},{"name":"cacheKey","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"The cache key used to query and store this specific image.\nIf not provided, the "},{"kind":"code","text":"`uri`"},{"kind":"text","text":" is used also as the cache key."}]},"type":{"type":"intrinsic","name":"string"}},{"name":"headers","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"An object representing the HTTP headers to send along with the request for a remote image."}],"blockTags":[{"tag":"@platform","content":[{"kind":"text","text":"android"}]},{"tag":"@platform","content":[{"kind":"text","text":"ios"}]}]},"type":{"type":"reference","typeArguments":[{"type":"intrinsic","name":"string"},{"type":"intrinsic","name":"string"}],"name":"Record","qualifiedName":"Record","package":"typescript"}},{"name":"height","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"Can be specified if known at build time, in which case the value\nwill be used to set the default "},{"kind":"code","text":"` `"},{"kind":"text","text":" component dimension"}]},"type":{"type":"intrinsic","name":"number"}},{"name":"thumbhash","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"The thumbhash string to use to generate the image placeholder. You can read more about thumbhash\non the ["},{"kind":"code","text":"`thumbhash website`"},{"kind":"text","text":"](https://evanw.github.io/thumbhash/). Ignored when "},{"kind":"code","text":"`uri`"},{"kind":"text","text":" is provided."}]},"type":{"type":"intrinsic","name":"string"}},{"name":"uri","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"A string representing the resource identifier for the image,\nwhich could be an http address, a local file path, or the name of a static image resource."}]},"type":{"type":"intrinsic","name":"string"}},{"name":"width","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"Can be specified if known at build time, in which case the value\nwill be used to set the default "},{"kind":"code","text":"` `"},{"kind":"text","text":" component dimension"}]},"type":{"type":"intrinsic","name":"number"}}]}}},{"name":"ImageTransition","kind":4194304,"comment":{"summary":[{"kind":"text","text":"An object that describes the smooth transition when switching the image source."}]},"type":{"type":"reflection","declaration":{"name":"__type","kind":65536,"children":[{"name":"duration","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"The duration of the transition in milliseconds."}],"blockTags":[{"tag":"@default","content":[{"kind":"text","text":"0"}]}]},"type":{"type":"intrinsic","name":"number"}},{"name":"effect","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"An animation effect used for transition."}],"blockTags":[{"tag":"@default","content":[{"kind":"text","text":"'cross-dissolve'\n\nOn Android, only "},{"kind":"code","text":"`'cross-dissolve'`"},{"kind":"text","text":" is supported.\nOn Web, "},{"kind":"code","text":"`'curl-up'`"},{"kind":"text","text":" and "},{"kind":"code","text":"`'curl-down'`"},{"kind":"text","text":" effects are not supported."}]}]},"type":{"type":"union","types":[{"type":"literal","value":"cross-dissolve"},{"type":"literal","value":"flip-from-top"},{"type":"literal","value":"flip-from-right"},{"type":"literal","value":"flip-from-bottom"},{"type":"literal","value":"flip-from-left"},{"type":"literal","value":"curl-up"},{"type":"literal","value":"curl-down"},{"type":"literal","value":null}]}},{"name":"timing","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"Specifies the speed curve of the transition effect and how intermediate values are calculated."}],"blockTags":[{"tag":"@default","content":[{"kind":"text","text":"'ease-in-out'"}]}]},"type":{"type":"union","types":[{"type":"literal","value":"ease-in-out"},{"type":"literal","value":"ease-in"},{"type":"literal","value":"ease-out"},{"type":"literal","value":"linear"}]}}]}}}]}
\ No newline at end of file
diff --git a/docs/public/static/data/unversioned/expo-linking.json b/docs/public/static/data/unversioned/expo-linking.json
index d19ecf1dac93f..9cb2787684959 100644
--- a/docs/public/static/data/unversioned/expo-linking.json
+++ b/docs/public/static/data/unversioned/expo-linking.json
@@ -1 +1 @@
-{"name":"expo-linking","kind":1,"children":[{"name":"CreateURLOptions","kind":4194304,"type":{"type":"reflection","declaration":{"name":"__type","kind":65536,"children":[{"name":"isTripleSlashed","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"Should the URI be triple slashed "},{"kind":"code","text":"`scheme:///path`"},{"kind":"text","text":" or double slashed "},{"kind":"code","text":"`scheme://path`"},{"kind":"text","text":"."}]},"type":{"type":"intrinsic","name":"boolean"}},{"name":"queryParams","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"An object of parameters that will be converted into a query string."}]},"type":{"type":"reference","name":"QueryParams"}},{"name":"scheme","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"URI protocol "},{"kind":"code","text":"`://`"},{"kind":"text","text":" that must be built into your native app."}]},"type":{"type":"intrinsic","name":"string"}}]}}},{"name":"EventType","kind":4194304,"type":{"type":"reflection","declaration":{"name":"__type","kind":65536,"children":[{"name":"nativeEvent","kind":1024,"flags":{"isOptional":true},"type":{"type":"reference","name":"MessageEvent","qualifiedName":"MessageEvent","package":"typescript"}},{"name":"url","kind":1024,"type":{"type":"intrinsic","name":"string"}}]}}},{"name":"NativeURLListener","kind":4194304,"type":{"type":"reflection","declaration":{"name":"__type","kind":65536,"signatures":[{"name":"__type","kind":4096,"parameters":[{"name":"nativeEvent","kind":32768,"type":{"type":"reference","name":"MessageEvent","qualifiedName":"MessageEvent","package":"typescript"}}],"type":{"type":"intrinsic","name":"void"}}]}}},{"name":"ParsedURL","kind":4194304,"type":{"type":"reflection","declaration":{"name":"__type","kind":65536,"children":[{"name":"hostname","kind":1024,"type":{"type":"union","types":[{"type":"intrinsic","name":"string"},{"type":"literal","value":null}]}},{"name":"path","kind":1024,"comment":{"summary":[{"kind":"text","text":"The path into the app specified by the URL."}]},"type":{"type":"union","types":[{"type":"intrinsic","name":"string"},{"type":"literal","value":null}]}},{"name":"queryParams","kind":1024,"comment":{"summary":[{"kind":"text","text":"The set of query parameters specified by the query string of the url used to open the app."}]},"type":{"type":"union","types":[{"type":"reference","name":"QueryParams"},{"type":"literal","value":null}]}},{"name":"scheme","kind":1024,"type":{"type":"union","types":[{"type":"intrinsic","name":"string"},{"type":"literal","value":null}]}}]}}},{"name":"QueryParams","kind":4194304,"type":{"type":"reference","name":"ParsedQs","qualifiedName":"QueryString.ParsedQs","package":"@types/qs"}},{"name":"SendIntentExtras","kind":4194304,"type":{"type":"reflection","declaration":{"name":"__type","kind":65536,"children":[{"name":"key","kind":1024,"type":{"type":"intrinsic","name":"string"}},{"name":"value","kind":1024,"type":{"type":"union","types":[{"type":"intrinsic","name":"string"},{"type":"intrinsic","name":"number"},{"type":"intrinsic","name":"boolean"}]}}]}}},{"name":"URLListener","kind":4194304,"type":{"type":"reflection","declaration":{"name":"__type","kind":65536,"signatures":[{"name":"__type","kind":4096,"parameters":[{"name":"event","kind":32768,"type":{"type":"reference","name":"EventType"}}],"type":{"type":"intrinsic","name":"void"}}]}}},{"name":"addEventListener","kind":64,"signatures":[{"name":"addEventListener","kind":4096,"comment":{"summary":[{"kind":"text","text":"Add a handler to "},{"kind":"code","text":"`Linking`"},{"kind":"text","text":" changes by listening to the "},{"kind":"code","text":"`url`"},{"kind":"text","text":" event type and providing the handler.\nIt is recommended to use the ["},{"kind":"code","text":"`useURL()`"},{"kind":"text","text":"](#useurl) hook instead."}],"blockTags":[{"tag":"@returns","content":[{"kind":"text","text":"An EmitterSubscription that has the remove method from EventSubscription"}]},{"tag":"@see","content":[{"kind":"text","text":"[React Native Docs Linking page](https://reactnative.dev/docs/linking#addeventlistener)."}]}]},"parameters":[{"name":"type","kind":32768,"comment":{"summary":[{"kind":"text","text":"The only valid type is "},{"kind":"code","text":"`'url'`"},{"kind":"text","text":"."}]},"type":{"type":"literal","value":"url"}},{"name":"handler","kind":32768,"comment":{"summary":[{"kind":"text","text":"An ["},{"kind":"code","text":"`URLListener`"},{"kind":"text","text":"](#urllistener) function that takes an "},{"kind":"code","text":"`event`"},{"kind":"text","text":" object of the type\n["},{"kind":"code","text":"`EventType`"},{"kind":"text","text":"](#eventype)."}]},"type":{"type":"reference","name":"URLListener"}}],"type":{"type":"reference","name":"EmitterSubscription","qualifiedName":"EmitterSubscription","package":"react-native"}}]},{"name":"canOpenURL","kind":64,"signatures":[{"name":"canOpenURL","kind":4096,"comment":{"summary":[{"kind":"text","text":"Determine whether or not an installed app can handle a given URL.\nOn web this always returns "},{"kind":"code","text":"`true`"},{"kind":"text","text":" because there is no API for detecting what URLs can be opened."}],"blockTags":[{"tag":"@returns","content":[{"kind":"text","text":"A "},{"kind":"code","text":"`Promise`"},{"kind":"text","text":" object that is fulfilled with "},{"kind":"code","text":"`true`"},{"kind":"text","text":" if the URL can be handled, otherwise it\n"},{"kind":"code","text":"`false`"},{"kind":"text","text":" if not.\n\nThe "},{"kind":"code","text":"`Promise`"},{"kind":"text","text":" will reject on Android if it was impossible to check if the URL can be opened, and\non iOS if you didn't [add the specific scheme in the "},{"kind":"code","text":"`LSApplicationQueriesSchemes`"},{"kind":"text","text":" key inside **Info.plist**](/guides/linking#linking-from-your-app)."}]}]},"parameters":[{"name":"url","kind":32768,"comment":{"summary":[{"kind":"text","text":"The URL that you want to test can be opened."}]},"type":{"type":"intrinsic","name":"string"}}],"type":{"type":"reference","typeArguments":[{"type":"intrinsic","name":"boolean"}],"name":"Promise","qualifiedName":"Promise","package":"typescript"}}]},{"name":"collectManifestSchemes","kind":64,"signatures":[{"name":"collectManifestSchemes","kind":4096,"comment":{"summary":[{"kind":"text","text":"Collect a list of platform schemes from the manifest.\n\nThis method is based on the "},{"kind":"code","text":"`Scheme`"},{"kind":"text","text":" modules from "},{"kind":"code","text":"`@expo/config-plugins`"},{"kind":"text","text":"\nwhich are used for collecting the schemes before prebuilding a native app.\n\n- iOS: scheme -> ios.scheme -> ios.bundleIdentifier\n- Android: scheme -> android.scheme -> android.package"}]},"type":{"type":"array","elementType":{"type":"intrinsic","name":"string"}}}]},{"name":"createURL","kind":64,"signatures":[{"name":"createURL","kind":4096,"comment":{"summary":[{"kind":"text","text":"Helper method for constructing a deep link into your app, given an optional path and set of query\nparameters. Creates a URI scheme with two slashes by default.\n\nThe scheme in bare and standalone must be defined in the Expo config ("},{"kind":"code","text":"`app.config.js`"},{"kind":"text","text":" or "},{"kind":"code","text":"`app.json`"},{"kind":"text","text":")\nunder "},{"kind":"code","text":"`expo.scheme`"},{"kind":"text","text":".\n\n# Examples\n- Bare: "},{"kind":"code","text":"`://path`"},{"kind":"text","text":" - uses provided scheme or scheme from Expo config "},{"kind":"code","text":"`scheme`"},{"kind":"text","text":".\n- Standalone, Custom: "},{"kind":"code","text":"`yourscheme://path`"},{"kind":"text","text":"\n- Web (dev): "},{"kind":"code","text":"`https://localhost:19006/path`"},{"kind":"text","text":"\n- Web (prod): "},{"kind":"code","text":"`https://myapp.com/path`"},{"kind":"text","text":"\n- Expo Client (dev): "},{"kind":"code","text":"`exp://128.0.0.1:19000/--/path`"},{"kind":"text","text":"\n- Expo Client (prod): "},{"kind":"code","text":"`exp://exp.host/@yourname/your-app/--/path`"}],"blockTags":[{"tag":"@returns","content":[{"kind":"text","text":"A URL string which points to your app with the given deep link information."}]}]},"parameters":[{"name":"path","kind":32768,"comment":{"summary":[{"kind":"text","text":"Addition path components to append to the base URL."}]},"type":{"type":"intrinsic","name":"string"}},{"name":"namedParameters","kind":32768,"comment":{"summary":[{"kind":"text","text":"Additional options object."}]},"type":{"type":"reference","name":"CreateURLOptions"},"defaultValue":"{}"}],"type":{"type":"intrinsic","name":"string"}}]},{"name":"getInitialURL","kind":64,"signatures":[{"name":"getInitialURL","kind":4096,"comment":{"summary":[{"kind":"text","text":"Get the URL that was used to launch the app if it was launched by a link."}],"blockTags":[{"tag":"@returns","content":[{"kind":"text","text":"The URL string that launched your app, or "},{"kind":"code","text":"`null`"},{"kind":"text","text":"."}]}]},"type":{"type":"reference","typeArguments":[{"type":"union","types":[{"type":"intrinsic","name":"string"},{"type":"literal","value":null}]}],"name":"Promise","qualifiedName":"Promise","package":"typescript"}}]},{"name":"hasConstantsManifest","kind":64,"signatures":[{"name":"hasConstantsManifest","kind":4096,"comment":{"summary":[{"kind":"text","text":"Ensure the user has linked the expo-constants manifest in bare workflow."}]},"type":{"type":"intrinsic","name":"boolean"}}]},{"name":"hasCustomScheme","kind":64,"signatures":[{"name":"hasCustomScheme","kind":4096,"type":{"type":"intrinsic","name":"boolean"}}]},{"name":"makeUrl","kind":64,"signatures":[{"name":"makeUrl","kind":4096,"comment":{"summary":[{"kind":"text","text":"Create a URL that works for the environment the app is currently running in.\nThe scheme in bare and standalone must be defined in the app.json under "},{"kind":"code","text":"`expo.scheme`"},{"kind":"text","text":".\n\n# Examples\n- Bare: empty string\n- Standalone, Custom: "},{"kind":"code","text":"`yourscheme:///path`"},{"kind":"text","text":"\n- Web (dev): "},{"kind":"code","text":"`https://localhost:19006/path`"},{"kind":"text","text":"\n- Web (prod): "},{"kind":"code","text":"`https://myapp.com/path`"},{"kind":"text","text":"\n- Expo Client (dev): "},{"kind":"code","text":"`exp://128.0.0.1:19000/--/path`"},{"kind":"text","text":"\n- Expo Client (prod): "},{"kind":"code","text":"`exp://exp.host/@yourname/your-app/--/path`"}],"blockTags":[{"tag":"@returns","content":[{"kind":"text","text":"A URL string which points to your app with the given deep link information."}]},{"tag":"@deprecated","content":[{"kind":"text","text":"An alias for ["},{"kind":"code","text":"`createURL()`"},{"kind":"text","text":"](#linkingcreateurlpath-namedparameters). This method is\ndeprecated and will be removed in a future SDK version."}]}]},"parameters":[{"name":"path","kind":32768,"comment":{"summary":[{"kind":"text","text":"addition path components to append to the base URL."}]},"type":{"type":"intrinsic","name":"string"},"defaultValue":"''"},{"name":"queryParams","kind":32768,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"An object with a set of query parameters. These will be merged with any\nExpo-specific parameters that are needed (e.g. release channel) and then appended to the URL\nas a query string."}]},"type":{"type":"reference","name":"ParsedQs","qualifiedName":"QueryString.ParsedQs","package":"@types/qs"}},{"name":"scheme","kind":32768,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"Optional URI protocol to use in the URL "},{"kind":"code","text":"`:///`"},{"kind":"text","text":", when "},{"kind":"code","text":"`undefined`"},{"kind":"text","text":" the scheme\nwill be chosen from the Expo config ("},{"kind":"code","text":"`app.config.js`"},{"kind":"text","text":" or "},{"kind":"code","text":"`app.json`"},{"kind":"text","text":")."}]},"type":{"type":"intrinsic","name":"string"}}],"type":{"type":"intrinsic","name":"string"}}]},{"name":"openSettings","kind":64,"signatures":[{"name":"openSettings","kind":4096,"comment":{"summary":[{"kind":"text","text":"Open the operating system settings app and displays the app’s custom settings, if it has any."}]},"type":{"type":"reference","typeArguments":[{"type":"intrinsic","name":"void"}],"name":"Promise","qualifiedName":"Promise","package":"typescript"}}]},{"name":"openURL","kind":64,"signatures":[{"name":"openURL","kind":4096,"comment":{"summary":[{"kind":"text","text":"Attempt to open the given URL with an installed app. See the [Linking guide](/guides/linking)\nfor more information."}],"blockTags":[{"tag":"@returns","content":[{"kind":"text","text":"A "},{"kind":"code","text":"`Promise`"},{"kind":"text","text":" that is fulfilled with "},{"kind":"code","text":"`true`"},{"kind":"text","text":" if the link is opened operating system\nautomatically or the user confirms the prompt to open the link. The "},{"kind":"code","text":"`Promise`"},{"kind":"text","text":" rejects if there\nare no applications registered for the URL or the user cancels the dialog."}]}]},"parameters":[{"name":"url","kind":32768,"comment":{"summary":[{"kind":"text","text":"A URL for the operating system to open, eg: "},{"kind":"code","text":"`tel:5555555`"},{"kind":"text","text":", "},{"kind":"code","text":"`exp://`"},{"kind":"text","text":"."}]},"type":{"type":"intrinsic","name":"string"}}],"type":{"type":"reference","typeArguments":[{"type":"literal","value":true}],"name":"Promise","qualifiedName":"Promise","package":"typescript"}}]},{"name":"parse","kind":64,"signatures":[{"name":"parse","kind":4096,"comment":{"summary":[{"kind":"text","text":"Helper method for parsing out deep link information from a URL."}],"blockTags":[{"tag":"@returns","content":[{"kind":"text","text":"A "},{"kind":"code","text":"`ParsedURL`"},{"kind":"text","text":" object."}]}]},"parameters":[{"name":"url","kind":32768,"comment":{"summary":[{"kind":"text","text":"A URL that points to the currently running experience (e.g. an output of "},{"kind":"code","text":"`Linking.createURL()`"},{"kind":"text","text":")."}]},"type":{"type":"intrinsic","name":"string"}}],"type":{"type":"reference","name":"ParsedURL"}}]},{"name":"parseInitialURLAsync","kind":64,"signatures":[{"name":"parseInitialURLAsync","kind":4096,"comment":{"summary":[{"kind":"text","text":"Helper method which wraps React Native's "},{"kind":"code","text":"`Linking.getInitialURL()`"},{"kind":"text","text":" in "},{"kind":"code","text":"`Linking.parse()`"},{"kind":"text","text":".\nParses the deep link information out of the URL used to open the experience initially.\nIf no link opened the app, all the fields will be "},{"kind":"code","text":"`null`"},{"kind":"text","text":".\n> On the web it parses the current window URL."}],"blockTags":[{"tag":"@returns","content":[{"kind":"text","text":"A promise that resolves with "},{"kind":"code","text":"`ParsedURL`"},{"kind":"text","text":" object."}]}]},"type":{"type":"reference","typeArguments":[{"type":"reference","name":"ParsedURL"}],"name":"Promise","qualifiedName":"Promise","package":"typescript"}}]},{"name":"resolveScheme","kind":64,"signatures":[{"name":"resolveScheme","kind":4096,"parameters":[{"name":"options","kind":32768,"type":{"type":"reflection","declaration":{"name":"__type","kind":65536,"children":[{"name":"isSilent","kind":1024,"flags":{"isOptional":true},"type":{"type":"intrinsic","name":"boolean"}},{"name":"scheme","kind":1024,"flags":{"isOptional":true},"type":{"type":"intrinsic","name":"string"}}]}}}],"type":{"type":"intrinsic","name":"string"}}]},{"name":"sendIntent","kind":64,"signatures":[{"name":"sendIntent","kind":4096,"comment":{"summary":[{"kind":"text","text":"Launch an Android intent with extras.\n> Use [IntentLauncher](./intent-launcher) instead, "},{"kind":"code","text":"`sendIntent`"},{"kind":"text","text":" is only included in\n> "},{"kind":"code","text":"`Linking`"},{"kind":"text","text":" for API compatibility with React Native's Linking API."}],"blockTags":[{"tag":"@platform","content":[{"kind":"text","text":"android"}]}]},"parameters":[{"name":"action","kind":32768,"type":{"type":"intrinsic","name":"string"}},{"name":"extras","kind":32768,"flags":{"isOptional":true},"type":{"type":"array","elementType":{"type":"reference","name":"SendIntentExtras"}}}],"type":{"type":"reference","typeArguments":[{"type":"intrinsic","name":"void"}],"name":"Promise","qualifiedName":"Promise","package":"typescript"}}]},{"name":"useURL","kind":64,"signatures":[{"name":"useURL","kind":4096,"comment":{"summary":[{"kind":"text","text":"Returns the initial URL followed by any subsequent changes to the URL."}],"blockTags":[{"tag":"@returns","content":[{"kind":"text","text":"Returns the initial URL or "},{"kind":"code","text":"`null`"},{"kind":"text","text":"."}]}]},"type":{"type":"union","types":[{"type":"intrinsic","name":"string"},{"type":"literal","value":null}]}}]}]}
\ No newline at end of file
+{"name":"expo-linking","kind":1,"children":[{"name":"CreateURLOptions","kind":4194304,"type":{"type":"reflection","declaration":{"name":"__type","kind":65536,"children":[{"name":"isTripleSlashed","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"Should the URI be triple slashed "},{"kind":"code","text":"`scheme:///path`"},{"kind":"text","text":" or double slashed "},{"kind":"code","text":"`scheme://path`"},{"kind":"text","text":"."}]},"type":{"type":"intrinsic","name":"boolean"}},{"name":"queryParams","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"An object of parameters that will be converted into a query string."}]},"type":{"type":"reference","name":"QueryParams"}},{"name":"scheme","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"URI protocol "},{"kind":"code","text":"`://`"},{"kind":"text","text":" that must be built into your native app."}]},"type":{"type":"intrinsic","name":"string"}}]}}},{"name":"EventType","kind":4194304,"type":{"type":"reflection","declaration":{"name":"__type","kind":65536,"children":[{"name":"nativeEvent","kind":1024,"flags":{"isOptional":true},"type":{"type":"reference","name":"MessageEvent","qualifiedName":"MessageEvent","package":"typescript"}},{"name":"url","kind":1024,"type":{"type":"intrinsic","name":"string"}}]}}},{"name":"NativeURLListener","kind":4194304,"type":{"type":"reflection","declaration":{"name":"__type","kind":65536,"signatures":[{"name":"__type","kind":4096,"parameters":[{"name":"nativeEvent","kind":32768,"type":{"type":"reference","name":"MessageEvent","qualifiedName":"MessageEvent","package":"typescript"}}],"type":{"type":"intrinsic","name":"void"}}]}}},{"name":"ParsedURL","kind":4194304,"type":{"type":"reflection","declaration":{"name":"__type","kind":65536,"children":[{"name":"hostname","kind":1024,"type":{"type":"union","types":[{"type":"intrinsic","name":"string"},{"type":"literal","value":null}]}},{"name":"path","kind":1024,"comment":{"summary":[{"kind":"text","text":"The path into the app specified by the URL."}]},"type":{"type":"union","types":[{"type":"intrinsic","name":"string"},{"type":"literal","value":null}]}},{"name":"queryParams","kind":1024,"comment":{"summary":[{"kind":"text","text":"The set of query parameters specified by the query string of the url used to open the app."}]},"type":{"type":"union","types":[{"type":"reference","name":"QueryParams"},{"type":"literal","value":null}]}},{"name":"scheme","kind":1024,"type":{"type":"union","types":[{"type":"intrinsic","name":"string"},{"type":"literal","value":null}]}}]}}},{"name":"QueryParams","kind":4194304,"type":{"type":"reference","name":"ParsedQs","qualifiedName":"QueryString.ParsedQs","package":"@types/qs"}},{"name":"SendIntentExtras","kind":4194304,"type":{"type":"reflection","declaration":{"name":"__type","kind":65536,"children":[{"name":"key","kind":1024,"type":{"type":"intrinsic","name":"string"}},{"name":"value","kind":1024,"type":{"type":"union","types":[{"type":"intrinsic","name":"string"},{"type":"intrinsic","name":"number"},{"type":"intrinsic","name":"boolean"}]}}]}}},{"name":"URLListener","kind":4194304,"type":{"type":"reflection","declaration":{"name":"__type","kind":65536,"signatures":[{"name":"__type","kind":4096,"parameters":[{"name":"event","kind":32768,"type":{"type":"reference","name":"EventType"}}],"type":{"type":"intrinsic","name":"void"}}]}}},{"name":"addEventListener","kind":64,"signatures":[{"name":"addEventListener","kind":4096,"comment":{"summary":[{"kind":"text","text":"Add a handler to "},{"kind":"code","text":"`Linking`"},{"kind":"text","text":" changes by listening to the "},{"kind":"code","text":"`url`"},{"kind":"text","text":" event type and providing the handler.\nIt is recommended to use the ["},{"kind":"code","text":"`useURL()`"},{"kind":"text","text":"](#useurl) hook instead."}],"blockTags":[{"tag":"@returns","content":[{"kind":"text","text":"An EmitterSubscription that has the remove method from EventSubscription"}]},{"tag":"@see","content":[{"kind":"text","text":"[React Native Docs Linking page](https://reactnative.dev/docs/linking#addeventlistener)."}]}]},"parameters":[{"name":"type","kind":32768,"comment":{"summary":[{"kind":"text","text":"The only valid type is "},{"kind":"code","text":"`'url'`"},{"kind":"text","text":"."}]},"type":{"type":"literal","value":"url"}},{"name":"handler","kind":32768,"comment":{"summary":[{"kind":"text","text":"An ["},{"kind":"code","text":"`URLListener`"},{"kind":"text","text":"](#urllistener) function that takes an "},{"kind":"code","text":"`event`"},{"kind":"text","text":" object of the type\n["},{"kind":"code","text":"`EventType`"},{"kind":"text","text":"](#eventype)."}]},"type":{"type":"reference","name":"URLListener"}}],"type":{"type":"reference","name":"EmitterSubscription","qualifiedName":"EmitterSubscription","package":"react-native"}}]},{"name":"canOpenURL","kind":64,"signatures":[{"name":"canOpenURL","kind":4096,"comment":{"summary":[{"kind":"text","text":"Determine whether or not an installed app can handle a given URL.\nOn web this always returns "},{"kind":"code","text":"`true`"},{"kind":"text","text":" because there is no API for detecting what URLs can be opened."}],"blockTags":[{"tag":"@returns","content":[{"kind":"text","text":"A "},{"kind":"code","text":"`Promise`"},{"kind":"text","text":" object that is fulfilled with "},{"kind":"code","text":"`true`"},{"kind":"text","text":" if the URL can be handled, otherwise it\n"},{"kind":"code","text":"`false`"},{"kind":"text","text":" if not.\n\nThe "},{"kind":"code","text":"`Promise`"},{"kind":"text","text":" will reject on Android if it was impossible to check if the URL can be opened, and\non iOS if you didn't [add the specific scheme in the "},{"kind":"code","text":"`LSApplicationQueriesSchemes`"},{"kind":"text","text":" key inside **Info.plist**](/guides/linking#linking-from-your-app)."}]}]},"parameters":[{"name":"url","kind":32768,"comment":{"summary":[{"kind":"text","text":"The URL that you want to test can be opened."}]},"type":{"type":"intrinsic","name":"string"}}],"type":{"type":"reference","typeArguments":[{"type":"intrinsic","name":"boolean"}],"name":"Promise","qualifiedName":"Promise","package":"typescript"}}]},{"name":"collectManifestSchemes","kind":64,"signatures":[{"name":"collectManifestSchemes","kind":4096,"comment":{"summary":[{"kind":"text","text":"Collect a list of platform schemes from the manifest.\n\nThis method is based on the "},{"kind":"code","text":"`Scheme`"},{"kind":"text","text":" modules from "},{"kind":"code","text":"`@expo/config-plugins`"},{"kind":"text","text":"\nwhich are used for collecting the schemes before prebuilding a native app.\n\n- iOS: scheme -> ios.scheme -> ios.bundleIdentifier\n- Android: scheme -> android.scheme -> android.package"}]},"type":{"type":"array","elementType":{"type":"intrinsic","name":"string"}}}]},{"name":"createURL","kind":64,"signatures":[{"name":"createURL","kind":4096,"comment":{"summary":[{"kind":"text","text":"Helper method for constructing a deep link into your app, given an optional path and set of query\nparameters. Creates a URI scheme with two slashes by default.\n\nThe scheme in bare and standalone must be defined in the Expo config ("},{"kind":"code","text":"`app.config.js`"},{"kind":"text","text":" or "},{"kind":"code","text":"`app.json`"},{"kind":"text","text":")\nunder "},{"kind":"code","text":"`expo.scheme`"},{"kind":"text","text":".\n\n# Examples\n- Bare: "},{"kind":"code","text":"`://path`"},{"kind":"text","text":" - uses provided scheme or scheme from Expo config "},{"kind":"code","text":"`scheme`"},{"kind":"text","text":".\n- Standalone, Custom: "},{"kind":"code","text":"`yourscheme://path`"},{"kind":"text","text":"\n- Web (dev): "},{"kind":"code","text":"`https://localhost:19006/path`"},{"kind":"text","text":"\n- Web (prod): "},{"kind":"code","text":"`https://myapp.com/path`"},{"kind":"text","text":"\n- Expo Client (dev): "},{"kind":"code","text":"`exp://128.0.0.1:8081/--/path`"},{"kind":"text","text":"\n- Expo Client (prod): "},{"kind":"code","text":"`exp://exp.host/@yourname/your-app/--/path`"}],"blockTags":[{"tag":"@returns","content":[{"kind":"text","text":"A URL string which points to your app with the given deep link information."}]}]},"parameters":[{"name":"path","kind":32768,"comment":{"summary":[{"kind":"text","text":"Addition path components to append to the base URL."}]},"type":{"type":"intrinsic","name":"string"}},{"name":"namedParameters","kind":32768,"comment":{"summary":[{"kind":"text","text":"Additional options object."}]},"type":{"type":"reference","name":"CreateURLOptions"},"defaultValue":"{}"}],"type":{"type":"intrinsic","name":"string"}}]},{"name":"getInitialURL","kind":64,"signatures":[{"name":"getInitialURL","kind":4096,"comment":{"summary":[{"kind":"text","text":"Get the URL that was used to launch the app if it was launched by a link."}],"blockTags":[{"tag":"@returns","content":[{"kind":"text","text":"The URL string that launched your app, or "},{"kind":"code","text":"`null`"},{"kind":"text","text":"."}]}]},"type":{"type":"reference","typeArguments":[{"type":"union","types":[{"type":"intrinsic","name":"string"},{"type":"literal","value":null}]}],"name":"Promise","qualifiedName":"Promise","package":"typescript"}}]},{"name":"hasConstantsManifest","kind":64,"signatures":[{"name":"hasConstantsManifest","kind":4096,"comment":{"summary":[{"kind":"text","text":"Ensure the user has linked the expo-constants manifest in bare workflow."}]},"type":{"type":"intrinsic","name":"boolean"}}]},{"name":"hasCustomScheme","kind":64,"signatures":[{"name":"hasCustomScheme","kind":4096,"type":{"type":"intrinsic","name":"boolean"}}]},{"name":"makeUrl","kind":64,"signatures":[{"name":"makeUrl","kind":4096,"comment":{"summary":[{"kind":"text","text":"Create a URL that works for the environment the app is currently running in.\nThe scheme in bare and standalone must be defined in the app.json under "},{"kind":"code","text":"`expo.scheme`"},{"kind":"text","text":".\n\n# Examples\n- Bare: empty string\n- Standalone, Custom: "},{"kind":"code","text":"`yourscheme:///path`"},{"kind":"text","text":"\n- Web (dev): "},{"kind":"code","text":"`https://localhost:19006/path`"},{"kind":"text","text":"\n- Web (prod): "},{"kind":"code","text":"`https://myapp.com/path`"},{"kind":"text","text":"\n- Expo Client (dev): "},{"kind":"code","text":"`exp://128.0.0.1:8081/--/path`"},{"kind":"text","text":"\n- Expo Client (prod): "},{"kind":"code","text":"`exp://exp.host/@yourname/your-app/--/path`"}],"blockTags":[{"tag":"@returns","content":[{"kind":"text","text":"A URL string which points to your app with the given deep link information."}]},{"tag":"@deprecated","content":[{"kind":"text","text":"An alias for ["},{"kind":"code","text":"`createURL()`"},{"kind":"text","text":"](#linkingcreateurlpath-namedparameters). This method is\ndeprecated and will be removed in a future SDK version."}]}]},"parameters":[{"name":"path","kind":32768,"comment":{"summary":[{"kind":"text","text":"addition path components to append to the base URL."}]},"type":{"type":"intrinsic","name":"string"},"defaultValue":"''"},{"name":"queryParams","kind":32768,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"An object with a set of query parameters. These will be merged with any\nExpo-specific parameters that are needed (e.g. release channel) and then appended to the URL\nas a query string."}]},"type":{"type":"reference","name":"ParsedQs","qualifiedName":"QueryString.ParsedQs","package":"@types/qs"}},{"name":"scheme","kind":32768,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"Optional URI protocol to use in the URL "},{"kind":"code","text":"`:///`"},{"kind":"text","text":", when "},{"kind":"code","text":"`undefined`"},{"kind":"text","text":" the scheme\nwill be chosen from the Expo config ("},{"kind":"code","text":"`app.config.js`"},{"kind":"text","text":" or "},{"kind":"code","text":"`app.json`"},{"kind":"text","text":")."}]},"type":{"type":"intrinsic","name":"string"}}],"type":{"type":"intrinsic","name":"string"}}]},{"name":"openSettings","kind":64,"signatures":[{"name":"openSettings","kind":4096,"comment":{"summary":[{"kind":"text","text":"Open the operating system settings app and displays the app’s custom settings, if it has any."}]},"type":{"type":"reference","typeArguments":[{"type":"intrinsic","name":"void"}],"name":"Promise","qualifiedName":"Promise","package":"typescript"}}]},{"name":"openURL","kind":64,"signatures":[{"name":"openURL","kind":4096,"comment":{"summary":[{"kind":"text","text":"Attempt to open the given URL with an installed app. See the [Linking guide](/guides/linking)\nfor more information."}],"blockTags":[{"tag":"@returns","content":[{"kind":"text","text":"A "},{"kind":"code","text":"`Promise`"},{"kind":"text","text":" that is fulfilled with "},{"kind":"code","text":"`true`"},{"kind":"text","text":" if the link is opened operating system\nautomatically or the user confirms the prompt to open the link. The "},{"kind":"code","text":"`Promise`"},{"kind":"text","text":" rejects if there\nare no applications registered for the URL or the user cancels the dialog."}]}]},"parameters":[{"name":"url","kind":32768,"comment":{"summary":[{"kind":"text","text":"A URL for the operating system to open, eg: "},{"kind":"code","text":"`tel:5555555`"},{"kind":"text","text":", "},{"kind":"code","text":"`exp://`"},{"kind":"text","text":"."}]},"type":{"type":"intrinsic","name":"string"}}],"type":{"type":"reference","typeArguments":[{"type":"literal","value":true}],"name":"Promise","qualifiedName":"Promise","package":"typescript"}}]},{"name":"parse","kind":64,"signatures":[{"name":"parse","kind":4096,"comment":{"summary":[{"kind":"text","text":"Helper method for parsing out deep link information from a URL."}],"blockTags":[{"tag":"@returns","content":[{"kind":"text","text":"A "},{"kind":"code","text":"`ParsedURL`"},{"kind":"text","text":" object."}]}]},"parameters":[{"name":"url","kind":32768,"comment":{"summary":[{"kind":"text","text":"A URL that points to the currently running experience (e.g. an output of "},{"kind":"code","text":"`Linking.createURL()`"},{"kind":"text","text":")."}]},"type":{"type":"intrinsic","name":"string"}}],"type":{"type":"reference","name":"ParsedURL"}}]},{"name":"parseInitialURLAsync","kind":64,"signatures":[{"name":"parseInitialURLAsync","kind":4096,"comment":{"summary":[{"kind":"text","text":"Helper method which wraps React Native's "},{"kind":"code","text":"`Linking.getInitialURL()`"},{"kind":"text","text":" in "},{"kind":"code","text":"`Linking.parse()`"},{"kind":"text","text":".\nParses the deep link information out of the URL used to open the experience initially.\nIf no link opened the app, all the fields will be "},{"kind":"code","text":"`null`"},{"kind":"text","text":".\n> On the web it parses the current window URL."}],"blockTags":[{"tag":"@returns","content":[{"kind":"text","text":"A promise that resolves with "},{"kind":"code","text":"`ParsedURL`"},{"kind":"text","text":" object."}]}]},"type":{"type":"reference","typeArguments":[{"type":"reference","name":"ParsedURL"}],"name":"Promise","qualifiedName":"Promise","package":"typescript"}}]},{"name":"resolveScheme","kind":64,"signatures":[{"name":"resolveScheme","kind":4096,"parameters":[{"name":"options","kind":32768,"type":{"type":"reflection","declaration":{"name":"__type","kind":65536,"children":[{"name":"isSilent","kind":1024,"flags":{"isOptional":true},"type":{"type":"intrinsic","name":"boolean"}},{"name":"scheme","kind":1024,"flags":{"isOptional":true},"type":{"type":"intrinsic","name":"string"}}]}}}],"type":{"type":"intrinsic","name":"string"}}]},{"name":"sendIntent","kind":64,"signatures":[{"name":"sendIntent","kind":4096,"comment":{"summary":[{"kind":"text","text":"Launch an Android intent with extras.\n> Use [IntentLauncher](./intent-launcher) instead, "},{"kind":"code","text":"`sendIntent`"},{"kind":"text","text":" is only included in\n> "},{"kind":"code","text":"`Linking`"},{"kind":"text","text":" for API compatibility with React Native's Linking API."}],"blockTags":[{"tag":"@platform","content":[{"kind":"text","text":"android"}]}]},"parameters":[{"name":"action","kind":32768,"type":{"type":"intrinsic","name":"string"}},{"name":"extras","kind":32768,"flags":{"isOptional":true},"type":{"type":"array","elementType":{"type":"reference","name":"SendIntentExtras"}}}],"type":{"type":"reference","typeArguments":[{"type":"intrinsic","name":"void"}],"name":"Promise","qualifiedName":"Promise","package":"typescript"}}]},{"name":"useURL","kind":64,"signatures":[{"name":"useURL","kind":4096,"comment":{"summary":[{"kind":"text","text":"Returns the initial URL followed by any subsequent changes to the URL."}],"blockTags":[{"tag":"@returns","content":[{"kind":"text","text":"Returns the initial URL or "},{"kind":"code","text":"`null`"},{"kind":"text","text":"."}]}]},"type":{"type":"union","types":[{"type":"intrinsic","name":"string"},{"type":"literal","value":null}]}}]}]}
\ No newline at end of file
diff --git a/docs/public/static/data/unversioned/expo-localization.json b/docs/public/static/data/unversioned/expo-localization.json
index a7dbdc012f9ee..5651c378983c7 100644
--- a/docs/public/static/data/unversioned/expo-localization.json
+++ b/docs/public/static/data/unversioned/expo-localization.json
@@ -1 +1 @@
-{"name":"expo-localization","kind":1,"children":[{"name":"CalendarIdentifier","kind":8,"comment":{"summary":[{"kind":"text","text":"The calendar identifier, one of [Unicode calendar types](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Intl/Locale/calendar).\nGregorian calendar is aliased and can be referred to as both "},{"kind":"code","text":"`CalendarIdentifier.GREGORIAN`"},{"kind":"text","text":" and "},{"kind":"code","text":"`CalendarIdentifier.GREGORY`"},{"kind":"text","text":"."}]},"children":[{"name":"BUDDHIST","kind":16,"comment":{"summary":[{"kind":"text","text":"Thai Buddhist calendar"}]},"type":{"type":"literal","value":"buddhist"}},{"name":"CHINESE","kind":16,"comment":{"summary":[{"kind":"text","text":"Traditional Chinese calendar"}]},"type":{"type":"literal","value":"chinese"}},{"name":"COPTIC","kind":16,"comment":{"summary":[{"kind":"text","text":"Coptic calendar"}]},"type":{"type":"literal","value":"coptic"}},{"name":"DANGI","kind":16,"comment":{"summary":[{"kind":"text","text":"Traditional Korean calendar"}]},"type":{"type":"literal","value":"dangi"}},{"name":"ETHIOAA","kind":16,"comment":{"summary":[{"kind":"text","text":"Ethiopic calendar, Amete Alem (epoch approx. 5493 B.C.E)"}]},"type":{"type":"literal","value":"ethioaa"}},{"name":"ETHIOPIC","kind":16,"comment":{"summary":[{"kind":"text","text":"Ethiopic calendar, Amete Mihret (epoch approx, 8 C.E.)"}]},"type":{"type":"literal","value":"ethiopic"}},{"name":"GREGORIAN","kind":16,"comment":{"summary":[{"kind":"text","text":"Gregorian calendar (alias)"}]},"type":{"type":"literal","value":"gregory"}},{"name":"GREGORY","kind":16,"comment":{"summary":[{"kind":"text","text":"Gregorian calendar"}]},"type":{"type":"literal","value":"gregory"}},{"name":"HEBREW","kind":16,"comment":{"summary":[{"kind":"text","text":"Traditional Hebrew calendar"}]},"type":{"type":"literal","value":"hebrew"}},{"name":"INDIAN","kind":16,"comment":{"summary":[{"kind":"text","text":"Indian calendar"}]},"type":{"type":"literal","value":"indian"}},{"name":"ISLAMIC","kind":16,"comment":{"summary":[{"kind":"text","text":"Islamic calendar"}]},"type":{"type":"literal","value":"islamic"}},{"name":"ISLAMIC_CIVIL","kind":16,"comment":{"summary":[{"kind":"text","text":"Islamic calendar, tabular (intercalary years [2,5,7,10,13,16,18,21,24,26,29] - civil epoch)"}]},"type":{"type":"literal","value":"islamic-civil"}},{"name":"ISLAMIC_RGSA","kind":16,"comment":{"summary":[{"kind":"text","text":"Islamic calendar, Saudi Arabia sighting"}]},"type":{"type":"literal","value":"islamic-rgsa"}},{"name":"ISLAMIC_TBLA","kind":16,"comment":{"summary":[{"kind":"text","text":"Islamic calendar, tabular (intercalary years [2,5,7,10,13,16,18,21,24,26,29] - astronomical epoch)"}]},"type":{"type":"literal","value":"islamic-tbla"}},{"name":"ISLAMIC_UMALQURA","kind":16,"comment":{"summary":[{"kind":"text","text":"Islamic calendar, Umm al-Qura"}]},"type":{"type":"literal","value":"islamic-umalqura"}},{"name":"ISO8601","kind":16,"comment":{"summary":[{"kind":"text","text":"ISO calendar (Gregorian calendar using the ISO 8601 calendar week rules)"}]},"type":{"type":"literal","value":"iso8601"}},{"name":"JAPANESE","kind":16,"comment":{"summary":[{"kind":"text","text":"Japanese imperial calendar"}]},"type":{"type":"literal","value":"japanese"}},{"name":"PERSIAN","kind":16,"comment":{"summary":[{"kind":"text","text":"Persian calendar"}]},"type":{"type":"literal","value":"persian"}},{"name":"ROC","kind":16,"comment":{"summary":[{"kind":"text","text":"Civil (algorithmic) Arabic calendar"}]},"type":{"type":"literal","value":"roc"}}]},{"name":"Weekday","kind":8,"comment":{"summary":[{"kind":"text","text":"An enum mapping days of the week in Gregorian calendar to their index as returned by the "},{"kind":"code","text":"`firstWeekday`"},{"kind":"text","text":" property."}]},"children":[{"name":"FRIDAY","kind":16,"type":{"type":"literal","value":6}},{"name":"MONDAY","kind":16,"type":{"type":"literal","value":2}},{"name":"SATURDAY","kind":16,"type":{"type":"literal","value":7}},{"name":"SUNDAY","kind":16,"type":{"type":"literal","value":1}},{"name":"THURSDAY","kind":16,"type":{"type":"literal","value":5}},{"name":"TUESDAY","kind":16,"type":{"type":"literal","value":3}},{"name":"WEDNESDAY","kind":16,"type":{"type":"literal","value":4}}]},{"name":"Calendar","kind":4194304,"type":{"type":"reflection","declaration":{"name":"__type","kind":65536,"children":[{"name":"calendar","kind":1024,"comment":{"summary":[{"kind":"text","text":"The calendar identifier, one of [Unicode calendar types](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Intl/Locale/calendar).\n\nOn Android is limited to one of device's [available calendar types](https://developer.android.com/reference/java/util/Calendar#getAvailableCalendarTypes()).\n\nOn iOS uses [calendar identifiers](https://developer.apple.com/documentation/foundation/calendar/identifier), but maps them to the corresponding Unicode types, will also never contain "},{"kind":"code","text":"`'dangi'`"},{"kind":"text","text":" or "},{"kind":"code","text":"`'islamic-rgsa'`"},{"kind":"text","text":" due to it not being implemented on iOS."}]},"type":{"type":"union","types":[{"type":"reference","name":"CalendarIdentifier"},{"type":"literal","value":null}]}},{"name":"firstWeekday","kind":1024,"comment":{"summary":[{"kind":"text","text":"The first day of the week. For most calendars Sunday is numbered "},{"kind":"code","text":"`1`"},{"kind":"text","text":", with Saturday being number "},{"kind":"code","text":"`7`"},{"kind":"text","text":".\nCan be null on some browsers that don't support the [weekInfo](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Intl/Locale/weekInfo) property in [Intl](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Intl) API."}],"blockTags":[{"tag":"@example","content":[{"kind":"code","text":"`1`"},{"kind":"text","text":", "},{"kind":"code","text":"`7`"},{"kind":"text","text":"."}]}]},"type":{"type":"union","types":[{"type":"reference","name":"Weekday"},{"type":"literal","value":null}]}},{"name":"timeZone","kind":1024,"comment":{"summary":[{"kind":"text","text":"Time zone for the calendar. Can be "},{"kind":"code","text":"`null`"},{"kind":"text","text":" on Web."}],"blockTags":[{"tag":"@example","content":[{"kind":"code","text":"`'America/Los_Angeles'`"},{"kind":"text","text":", "},{"kind":"code","text":"`'Europe/Warsaw'`"},{"kind":"text","text":", "},{"kind":"code","text":"`'GMT+1'`"},{"kind":"text","text":"."}]}]},"type":{"type":"union","types":[{"type":"intrinsic","name":"string"},{"type":"literal","value":null}]}},{"name":"uses24hourClock","kind":1024,"comment":{"summary":[{"kind":"text","text":"True when current device settings use 24 hour time format.\nCan be null on some browsers that don't support the [hourCycle](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Intl/Locale/hourCycle) property in [Intl](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Intl) API."}]},"type":{"type":"union","types":[{"type":"intrinsic","name":"boolean"},{"type":"literal","value":null}]}}]}}},{"name":"Locale","kind":4194304,"type":{"type":"reflection","declaration":{"name":"__type","kind":65536,"children":[{"name":"currencyCode","kind":1024,"comment":{"summary":[{"kind":"text","text":"Currency code for the locale.\nIs "},{"kind":"code","text":"`null`"},{"kind":"text","text":" on Web, use a table lookup based on region instead."}],"blockTags":[{"tag":"@example","content":[{"kind":"code","text":"`'USD'`"},{"kind":"text","text":", "},{"kind":"code","text":"`'EUR'`"},{"kind":"text","text":", "},{"kind":"code","text":"`'PLN'`"},{"kind":"text","text":"."}]}]},"type":{"type":"union","types":[{"type":"intrinsic","name":"string"},{"type":"literal","value":null}]}},{"name":"currencySymbol","kind":1024,"comment":{"summary":[{"kind":"text","text":"Currency symbol for the locale.\nIs "},{"kind":"code","text":"`null`"},{"kind":"text","text":" on Web, use a table lookup based on region (if available) instead."}],"blockTags":[{"tag":"@example","content":[{"kind":"code","text":"`'$'`"},{"kind":"text","text":", "},{"kind":"code","text":"`'€'`"},{"kind":"text","text":", "},{"kind":"code","text":"`'zł'`"},{"kind":"text","text":"."}]}]},"type":{"type":"union","types":[{"type":"intrinsic","name":"string"},{"type":"literal","value":null}]}},{"name":"decimalSeparator","kind":1024,"comment":{"summary":[{"kind":"text","text":"Decimal separator used for formatting numbers with fractional parts."}],"blockTags":[{"tag":"@example","content":[{"kind":"code","text":"`'.'`"},{"kind":"text","text":", "},{"kind":"code","text":"`','`"},{"kind":"text","text":"."}]}]},"type":{"type":"union","types":[{"type":"intrinsic","name":"string"},{"type":"literal","value":null}]}},{"name":"digitGroupingSeparator","kind":1024,"comment":{"summary":[{"kind":"text","text":"Digit grouping separator used for formatting large numbers."}],"blockTags":[{"tag":"@example","content":[{"kind":"code","text":"`'.'`"},{"kind":"text","text":", "},{"kind":"code","text":"`','`"},{"kind":"text","text":"."}]}]},"type":{"type":"union","types":[{"type":"intrinsic","name":"string"},{"type":"literal","value":null}]}},{"name":"languageCode","kind":1024,"comment":{"summary":[{"kind":"text","text":"An [IETF BCP 47 language tag](https://en.wikipedia.org/wiki/IETF_language_tag) without the region code."}],"blockTags":[{"tag":"@example","content":[{"kind":"code","text":"`'en'`"},{"kind":"text","text":", "},{"kind":"code","text":"`'es'`"},{"kind":"text","text":", "},{"kind":"code","text":"`'pl'`"},{"kind":"text","text":"."}]}]},"type":{"type":"intrinsic","name":"string"}},{"name":"languageTag","kind":1024,"comment":{"summary":[{"kind":"text","text":"An [IETF BCP 47 language tag](https://en.wikipedia.org/wiki/IETF_language_tag) with a region code."}],"blockTags":[{"tag":"@example","content":[{"kind":"code","text":"`'en-US'`"},{"kind":"text","text":", "},{"kind":"code","text":"`'es-419'`"},{"kind":"text","text":", "},{"kind":"code","text":"`'pl-PL'`"},{"kind":"text","text":"."}]}]},"type":{"type":"intrinsic","name":"string"}},{"name":"measurementSystem","kind":1024,"comment":{"summary":[{"kind":"text","text":"The measurement system used in the locale.\nOn iOS is one of "},{"kind":"code","text":"`'metric'`"},{"kind":"text","text":", "},{"kind":"code","text":"`'us'`"},{"kind":"text","text":". On Android is one of "},{"kind":"code","text":"`'metric'`"},{"kind":"text","text":", "},{"kind":"code","text":"`'us'`"},{"kind":"text","text":", "},{"kind":"code","text":"`'uk'`"},{"kind":"text","text":".\n\nIs "},{"kind":"code","text":"`null`"},{"kind":"text","text":" on Web, as user chosen measurement system is not exposed on the web and using locale to determine measurement systems is unreliable.\nAsk for user preferences if possible."}]},"type":{"type":"union","types":[{"type":"literal","value":"metric"},{"type":"literal","value":"us"},{"type":"literal","value":"uk"},{"type":"literal","value":null}]}},{"name":"regionCode","kind":1024,"comment":{"summary":[{"kind":"text","text":"The region code for your device that comes from the Region setting under Language & Region on iOS, Region settings on Android and is parsed from locale on Web (can be "},{"kind":"code","text":"`null`"},{"kind":"text","text":" on Web)."}]},"type":{"type":"union","types":[{"type":"intrinsic","name":"string"},{"type":"literal","value":null}]}},{"name":"textDirection","kind":1024,"comment":{"summary":[{"kind":"text","text":"Text direction for the locale. One of: "},{"kind":"code","text":"`'ltr'`"},{"kind":"text","text":", "},{"kind":"code","text":"`'rtl'`"},{"kind":"text","text":", but can also be "},{"kind":"code","text":"`null`"},{"kind":"text","text":" on some browsers without support for the [textInfo](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Intl/Locale/textInfo) property in [Intl](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Intl) API."}]},"type":{"type":"union","types":[{"type":"literal","value":"ltr"},{"type":"literal","value":"rtl"},{"type":"literal","value":null}]}}]}}},{"name":"Localization","kind":4194304,"type":{"type":"reflection","declaration":{"name":"__type","kind":65536,"children":[{"name":"currency","kind":1024,"comment":{"summary":[{"kind":"text","text":"Three-character ISO 4217 currency code. Returns "},{"kind":"code","text":"`null`"},{"kind":"text","text":" on web."}],"blockTags":[{"tag":"@example","content":[{"kind":"code","text":"`'USD'`"},{"kind":"text","text":", "},{"kind":"code","text":"`'EUR'`"},{"kind":"text","text":", "},{"kind":"code","text":"`'CNY'`"},{"kind":"text","text":", "},{"kind":"code","text":"`null`"}]}]},"type":{"type":"union","types":[{"type":"intrinsic","name":"string"},{"type":"literal","value":null}]}},{"name":"decimalSeparator","kind":1024,"comment":{"summary":[{"kind":"text","text":"Decimal separator used for formatting numbers."}],"blockTags":[{"tag":"@example","content":[{"kind":"code","text":"`','`"},{"kind":"text","text":", "},{"kind":"code","text":"`'.'`"}]}]},"type":{"type":"intrinsic","name":"string"}},{"name":"digitGroupingSeparator","kind":1024,"comment":{"summary":[{"kind":"text","text":"Digit grouping separator used when formatting numbers larger than 1000."}],"blockTags":[{"tag":"@example","content":[{"kind":"code","text":"`'.'`"},{"kind":"text","text":", "},{"kind":"code","text":"`''`"},{"kind":"text","text":", "},{"kind":"code","text":"`','`"}]}]},"type":{"type":"intrinsic","name":"string"}},{"name":"isMetric","kind":1024,"comment":{"summary":[{"kind":"text","text":"Boolean value that indicates whether the system uses the metric system.\nOn Android and web, this is inferred from the current region."}]},"type":{"type":"intrinsic","name":"boolean"}},{"name":"isRTL","kind":1024,"comment":{"summary":[{"kind":"text","text":"Returns if the system's language is written from Right-to-Left.\nThis can be used to build features like [bidirectional icons](https://material.io/design/usability/bidirectionality.html).\n\nReturns "},{"kind":"code","text":"`false`"},{"kind":"text","text":" in Server Side Rendering (SSR) environments."}]},"type":{"type":"intrinsic","name":"boolean"}},{"name":"isoCurrencyCodes","kind":1024,"comment":{"summary":[{"kind":"text","text":"A list of all the supported language ISO codes."}]},"type":{"type":"array","elementType":{"type":"intrinsic","name":"string"}}},{"name":"locale","kind":1024,"comment":{"summary":[{"kind":"text","text":"An [IETF BCP 47 language tag](https://en.wikipedia.org/wiki/IETF_language_tag),\nconsisting of a two-character language code and optional script, region and variant codes."}],"blockTags":[{"tag":"@example","content":[{"kind":"code","text":"`'en'`"},{"kind":"text","text":", "},{"kind":"code","text":"`'en-US'`"},{"kind":"text","text":", "},{"kind":"code","text":"`'zh-Hans'`"},{"kind":"text","text":", "},{"kind":"code","text":"`'zh-Hans-CN'`"},{"kind":"text","text":", "},{"kind":"code","text":"`'en-emodeng'`"}]}]},"type":{"type":"intrinsic","name":"string"}},{"name":"locales","kind":1024,"comment":{"summary":[{"kind":"text","text":"List of all the native languages provided by the user settings.\nThese are returned in the order that the user defined in the device settings."}],"blockTags":[{"tag":"@example","content":[{"kind":"code","text":"`['en', 'en-US', 'zh-Hans', 'zh-Hans-CN', 'en-emodeng']`"}]}]},"type":{"type":"array","elementType":{"type":"intrinsic","name":"string"}}},{"name":"region","kind":1024,"comment":{"summary":[{"kind":"text","text":"The region code for your device that comes from the Region setting under Language & Region on iOS.\nThis value is always available on iOS, but might return "},{"kind":"code","text":"`null`"},{"kind":"text","text":" on Android or web."}],"blockTags":[{"tag":"@example","content":[{"kind":"code","text":"`'US'`"},{"kind":"text","text":", "},{"kind":"code","text":"`'NZ'`"},{"kind":"text","text":", "},{"kind":"code","text":"`null`"}]}]},"type":{"type":"union","types":[{"type":"intrinsic","name":"string"},{"type":"literal","value":null}]}},{"name":"timezone","kind":1024,"comment":{"summary":[{"kind":"text","text":"The current time zone in display format.\nOn Web time zone is calculated with Intl.DateTimeFormat().resolvedOptions().timeZone. For a\nbetter estimation you could use the moment-timezone package but it will add significant bloat to\nyour website's bundle size."}],"blockTags":[{"tag":"@example","content":[{"kind":"code","text":"`'America/Los_Angeles'`"}]}]},"type":{"type":"intrinsic","name":"string"}}]}}},{"name":"currency","kind":32,"flags":{"isConst":true},"comment":{"summary":[],"blockTags":[{"tag":"@deprecated","content":[{"kind":"text","text":"Use Localization.getLocales() instead.\nThree-character ISO 4217 currency code. Returns "},{"kind":"code","text":"`null`"},{"kind":"text","text":" on web."}]},{"tag":"@example","content":[{"kind":"code","text":"`'USD'`"},{"kind":"text","text":", "},{"kind":"code","text":"`'EUR'`"},{"kind":"text","text":", "},{"kind":"code","text":"`'CNY'`"},{"kind":"text","text":", "},{"kind":"code","text":"`null`"}]}]},"type":{"type":"union","types":[{"type":"literal","value":null},{"type":"intrinsic","name":"string"}]},"defaultValue":"ExpoLocalization.currency"},{"name":"decimalSeparator","kind":32,"flags":{"isConst":true},"comment":{"summary":[],"blockTags":[{"tag":"@deprecated","content":[{"kind":"text","text":"Use Localization.getLocales() instead.\nDecimal separator used for formatting numbers."}]},{"tag":"@example","content":[{"kind":"code","text":"`','`"},{"kind":"text","text":", "},{"kind":"code","text":"`'.'`"}]}]},"type":{"type":"intrinsic","name":"string"},"defaultValue":"ExpoLocalization.decimalSeparator"},{"name":"digitGroupingSeparator","kind":32,"flags":{"isConst":true},"comment":{"summary":[],"blockTags":[{"tag":"@deprecated","content":[{"kind":"text","text":"Use Localization.getLocales() instead.\nDigit grouping separator used when formatting numbers larger than 1000."}]},{"tag":"@example","content":[{"kind":"code","text":"`'.'`"},{"kind":"text","text":", "},{"kind":"code","text":"`''`"},{"kind":"text","text":", "},{"kind":"code","text":"`','`"}]}]},"type":{"type":"intrinsic","name":"string"},"defaultValue":"ExpoLocalization.digitGroupingSeparator"},{"name":"isMetric","kind":32,"flags":{"isConst":true},"comment":{"summary":[],"blockTags":[{"tag":"@deprecated","content":[{"kind":"text","text":"Use Localization.getLocales() instead.\nBoolean value that indicates whether the system uses the metric system.\nOn Android and web, this is inferred from the current region."}]}]},"type":{"type":"intrinsic","name":"boolean"},"defaultValue":"ExpoLocalization.isMetric"},{"name":"isRTL","kind":32,"flags":{"isConst":true},"comment":{"summary":[],"blockTags":[{"tag":"@deprecated","content":[{"kind":"text","text":"Use Localization.getLocales() instead.\nReturns if the system's language is written from Right-to-Left.\nThis can be used to build features like [bidirectional icons](https://material.io/design/usability/bidirectionality.html).\n\nReturns "},{"kind":"code","text":"`false`"},{"kind":"text","text":" in Server Side Rendering (SSR) environments."}]}]},"type":{"type":"intrinsic","name":"boolean"},"defaultValue":"ExpoLocalization.isRTL"},{"name":"isoCurrencyCodes","kind":32,"flags":{"isConst":true},"comment":{"summary":[],"blockTags":[{"tag":"@deprecated","content":[{"kind":"text","text":"Use Localization.getLocales() instead.\nA list of all the supported language ISO codes."}]}]},"type":{"type":"array","elementType":{"type":"intrinsic","name":"string"}},"defaultValue":"ExpoLocalization.isoCurrencyCodes"},{"name":"locale","kind":32,"flags":{"isConst":true},"comment":{"summary":[{"kind":"text","text":"Consider using Localization.getLocales() for a list of user preferred locales instead.\nAn [IETF BCP 47 language tag](https://en.wikipedia.org/wiki/IETF_language_tag),\nconsisting of a two-character language code and optional script, region and variant codes."}],"blockTags":[{"tag":"@example","content":[{"kind":"code","text":"`'en'`"},{"kind":"text","text":", "},{"kind":"code","text":"`'en-US'`"},{"kind":"text","text":", "},{"kind":"code","text":"`'zh-Hans'`"},{"kind":"text","text":", "},{"kind":"code","text":"`'zh-Hans-CN'`"},{"kind":"text","text":", "},{"kind":"code","text":"`'en-emodeng'`"}]}]},"type":{"type":"intrinsic","name":"string"},"defaultValue":"ExpoLocalization.locale"},{"name":"locales","kind":32,"flags":{"isConst":true},"comment":{"summary":[],"blockTags":[{"tag":"@deprecated","content":[{"kind":"text","text":"Use Localization.getLocales() instead.\nList of all the native languages provided by the user settings.\nThese are returned in the order the user defines in their device settings."}]},{"tag":"@example","content":[{"kind":"code","text":"`['en', 'en-US', 'zh-Hans', 'zh-Hans-CN', 'en-emodeng']`"}]}]},"type":{"type":"array","elementType":{"type":"intrinsic","name":"string"}},"defaultValue":"ExpoLocalization.locales"},{"name":"region","kind":32,"flags":{"isConst":true},"comment":{"summary":[],"blockTags":[{"tag":"@deprecated","content":[{"kind":"text","text":"Use Localization.getLocales() instead.\nThe region code for your device that comes from the Region setting under Language & Region on iOS.\nThis value is always available on iOS, but might return "},{"kind":"code","text":"`null`"},{"kind":"text","text":" on Android or web."}]},{"tag":"@example","content":[{"kind":"code","text":"`'US'`"},{"kind":"text","text":", "},{"kind":"code","text":"`'NZ'`"},{"kind":"text","text":", "},{"kind":"code","text":"`null`"}]}]},"type":{"type":"union","types":[{"type":"literal","value":null},{"type":"intrinsic","name":"string"}]},"defaultValue":"ExpoLocalization.region"},{"name":"timezone","kind":32,"flags":{"isConst":true},"comment":{"summary":[],"blockTags":[{"tag":"@deprecated","content":[{"kind":"text","text":"Use Localization.getLocales() instead.\nThe current time zone in display format.\nOn Web time zone is calculated with Intl.DateTimeFormat().resolvedOptions().timeZone. For a\nbetter estimation you could use the moment-timezone package but it will add significant bloat to\nyour website's bundle size."}]},{"tag":"@example","content":[{"kind":"code","text":"`'America/Los_Angeles'`"}]}]},"type":{"type":"intrinsic","name":"string"},"defaultValue":"ExpoLocalization.timezone"},{"name":"getCalendars","kind":64,"signatures":[{"name":"getCalendars","kind":4096,"comment":{"summary":[{"kind":"text","text":"List of user's preferred calendars, returned as an array of objects of type "},{"kind":"code","text":"`Calendar`"},{"kind":"text","text":".\nGuaranteed to contain at least 1 element.\nFor now always returns a single element, but it's likely to return a user preference list on some platforms in the future."}],"blockTags":[{"tag":"@example","content":[{"kind":"code","text":"`[\n {\n \"calendar\": \"gregory\",\n \"timeZone\": \"Europe/Warsaw\",\n \"uses24hourClock\": true,\n \"firstWeekday\": 1\n }\n ]`"}]}]},"type":{"type":"array","elementType":{"type":"reference","name":"Calendar"}}}]},{"name":"getLocales","kind":64,"signatures":[{"name":"getLocales","kind":4096,"comment":{"summary":[{"kind":"text","text":"List of user's locales, returned as an array of objects of type "},{"kind":"code","text":"`Locale`"},{"kind":"text","text":".\nGuaranteed to contain at least 1 element.\nThese are returned in the order the user defines in their device settings.\nOn the web currency and measurements systems are not provided, instead returned as null.\nIf needed, you can infer them from the current region using a lookup table."}],"blockTags":[{"tag":"@example","content":[{"kind":"code","text":"`[{\n \"languageTag\": \"pl-PL\",\n \"languageCode\": \"pl\",\n \"textDirection\": \"ltr\",\n \"digitGroupingSeparator\": \" \",\n \"decimalSeparator\": \",\",\n \"measurementSystem\": \"metric\",\n \"currencyCode\": \"PLN\",\n \"currencySymbol\": \"zł\",\n \"regionCode\": \"PL\"\n }]`"}]}]},"type":{"type":"array","elementType":{"type":"reference","name":"Locale"}}}]},{"name":"getLocalizationAsync","kind":64,"signatures":[{"name":"getLocalizationAsync","kind":4096,"comment":{"summary":[{"kind":"text","text":"Get the latest native values from the device. Locale can be changed on some Android devices\nwithout resetting the app.\n> On iOS, changing the locale will cause the device to reset meaning the constants will always be\ncorrect."}],"blockTags":[{"tag":"@example","content":[{"kind":"code","text":"```ts\n// When the app returns from the background on Android...\n\nconst { locale } = await Localization.getLocalizationAsync();\n```"}]},{"tag":"@deprecated","content":[{"kind":"text","text":"Use Localization.getLocales() or Localization.getCalendars() instead."}]}]},"type":{"type":"reference","typeArguments":[{"type":"reference","name":"Localization"}],"name":"Promise","qualifiedName":"Promise","package":"typescript"}}]}]}
\ No newline at end of file
+{"name":"expo-localization","kind":1,"children":[{"name":"CalendarIdentifier","kind":8,"comment":{"summary":[{"kind":"text","text":"The calendar identifier, one of [Unicode calendar types](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Intl/Locale/calendar).\nGregorian calendar is aliased and can be referred to as both "},{"kind":"code","text":"`CalendarIdentifier.GREGORIAN`"},{"kind":"text","text":" and "},{"kind":"code","text":"`CalendarIdentifier.GREGORY`"},{"kind":"text","text":"."}]},"children":[{"name":"BUDDHIST","kind":16,"comment":{"summary":[{"kind":"text","text":"Thai Buddhist calendar"}]},"type":{"type":"literal","value":"buddhist"}},{"name":"CHINESE","kind":16,"comment":{"summary":[{"kind":"text","text":"Traditional Chinese calendar"}]},"type":{"type":"literal","value":"chinese"}},{"name":"COPTIC","kind":16,"comment":{"summary":[{"kind":"text","text":"Coptic calendar"}]},"type":{"type":"literal","value":"coptic"}},{"name":"DANGI","kind":16,"comment":{"summary":[{"kind":"text","text":"Traditional Korean calendar"}]},"type":{"type":"literal","value":"dangi"}},{"name":"ETHIOAA","kind":16,"comment":{"summary":[{"kind":"text","text":"Ethiopic calendar, Amete Alem (epoch approx. 5493 B.C.E)"}]},"type":{"type":"literal","value":"ethioaa"}},{"name":"ETHIOPIC","kind":16,"comment":{"summary":[{"kind":"text","text":"Ethiopic calendar, Amete Mihret (epoch approx, 8 C.E.)"}]},"type":{"type":"literal","value":"ethiopic"}},{"name":"GREGORIAN","kind":16,"comment":{"summary":[{"kind":"text","text":"Gregorian calendar (alias)"}]},"type":{"type":"literal","value":"gregory"}},{"name":"GREGORY","kind":16,"comment":{"summary":[{"kind":"text","text":"Gregorian calendar"}]},"type":{"type":"literal","value":"gregory"}},{"name":"HEBREW","kind":16,"comment":{"summary":[{"kind":"text","text":"Traditional Hebrew calendar"}]},"type":{"type":"literal","value":"hebrew"}},{"name":"INDIAN","kind":16,"comment":{"summary":[{"kind":"text","text":"Indian calendar"}]},"type":{"type":"literal","value":"indian"}},{"name":"ISLAMIC","kind":16,"comment":{"summary":[{"kind":"text","text":"Islamic calendar"}]},"type":{"type":"literal","value":"islamic"}},{"name":"ISLAMIC_CIVIL","kind":16,"comment":{"summary":[{"kind":"text","text":"Islamic calendar, tabular (intercalary years [2,5,7,10,13,16,18,21,24,26,29] - civil epoch)"}]},"type":{"type":"literal","value":"islamic-civil"}},{"name":"ISLAMIC_RGSA","kind":16,"comment":{"summary":[{"kind":"text","text":"Islamic calendar, Saudi Arabia sighting"}]},"type":{"type":"literal","value":"islamic-rgsa"}},{"name":"ISLAMIC_TBLA","kind":16,"comment":{"summary":[{"kind":"text","text":"Islamic calendar, tabular (intercalary years [2,5,7,10,13,16,18,21,24,26,29] - astronomical epoch)"}]},"type":{"type":"literal","value":"islamic-tbla"}},{"name":"ISLAMIC_UMALQURA","kind":16,"comment":{"summary":[{"kind":"text","text":"Islamic calendar, Umm al-Qura"}]},"type":{"type":"literal","value":"islamic-umalqura"}},{"name":"ISO8601","kind":16,"comment":{"summary":[{"kind":"text","text":"ISO calendar (Gregorian calendar using the ISO 8601 calendar week rules)"}]},"type":{"type":"literal","value":"iso8601"}},{"name":"JAPANESE","kind":16,"comment":{"summary":[{"kind":"text","text":"Japanese imperial calendar"}]},"type":{"type":"literal","value":"japanese"}},{"name":"PERSIAN","kind":16,"comment":{"summary":[{"kind":"text","text":"Persian calendar"}]},"type":{"type":"literal","value":"persian"}},{"name":"ROC","kind":16,"comment":{"summary":[{"kind":"text","text":"Civil (algorithmic) Arabic calendar"}]},"type":{"type":"literal","value":"roc"}}]},{"name":"Weekday","kind":8,"comment":{"summary":[{"kind":"text","text":"An enum mapping days of the week in Gregorian calendar to their index as returned by the "},{"kind":"code","text":"`firstWeekday`"},{"kind":"text","text":" property."}]},"children":[{"name":"FRIDAY","kind":16,"type":{"type":"literal","value":6}},{"name":"MONDAY","kind":16,"type":{"type":"literal","value":2}},{"name":"SATURDAY","kind":16,"type":{"type":"literal","value":7}},{"name":"SUNDAY","kind":16,"type":{"type":"literal","value":1}},{"name":"THURSDAY","kind":16,"type":{"type":"literal","value":5}},{"name":"TUESDAY","kind":16,"type":{"type":"literal","value":3}},{"name":"WEDNESDAY","kind":16,"type":{"type":"literal","value":4}}]},{"name":"Calendar","kind":4194304,"type":{"type":"reflection","declaration":{"name":"__type","kind":65536,"children":[{"name":"calendar","kind":1024,"comment":{"summary":[{"kind":"text","text":"The calendar identifier, one of [Unicode calendar types](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Intl/Locale/calendar).\n\nOn Android is limited to one of device's [available calendar types](https://developer.android.com/reference/java/util/Calendar#getAvailableCalendarTypes()).\n\nOn iOS uses [calendar identifiers](https://developer.apple.com/documentation/foundation/calendar/identifier), but maps them to the corresponding Unicode types, will also never contain "},{"kind":"code","text":"`'dangi'`"},{"kind":"text","text":" or "},{"kind":"code","text":"`'islamic-rgsa'`"},{"kind":"text","text":" due to it not being implemented on iOS."}]},"type":{"type":"union","types":[{"type":"reference","name":"CalendarIdentifier"},{"type":"literal","value":null}]}},{"name":"firstWeekday","kind":1024,"comment":{"summary":[{"kind":"text","text":"The first day of the week. For most calendars Sunday is numbered "},{"kind":"code","text":"`1`"},{"kind":"text","text":", with Saturday being number "},{"kind":"code","text":"`7`"},{"kind":"text","text":".\nCan be null on some browsers that don't support the [weekInfo](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Intl/Locale/weekInfo) property in [Intl](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Intl) API."}],"blockTags":[{"tag":"@example","content":[{"kind":"code","text":"`1`"},{"kind":"text","text":", "},{"kind":"code","text":"`7`"},{"kind":"text","text":"."}]}]},"type":{"type":"union","types":[{"type":"reference","name":"Weekday"},{"type":"literal","value":null}]}},{"name":"timeZone","kind":1024,"comment":{"summary":[{"kind":"text","text":"Time zone for the calendar. Can be "},{"kind":"code","text":"`null`"},{"kind":"text","text":" on Web."}],"blockTags":[{"tag":"@example","content":[{"kind":"code","text":"`'America/Los_Angeles'`"},{"kind":"text","text":", "},{"kind":"code","text":"`'Europe/Warsaw'`"},{"kind":"text","text":", "},{"kind":"code","text":"`'GMT+1'`"},{"kind":"text","text":"."}]}]},"type":{"type":"union","types":[{"type":"intrinsic","name":"string"},{"type":"literal","value":null}]}},{"name":"uses24hourClock","kind":1024,"comment":{"summary":[{"kind":"text","text":"True when current device settings use 24 hour time format.\nCan be null on some browsers that don't support the [hourCycle](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Intl/Locale/hourCycle) property in [Intl](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Intl) API."}]},"type":{"type":"union","types":[{"type":"intrinsic","name":"boolean"},{"type":"literal","value":null}]}}]}}},{"name":"Locale","kind":4194304,"type":{"type":"reflection","declaration":{"name":"__type","kind":65536,"children":[{"name":"currencyCode","kind":1024,"comment":{"summary":[{"kind":"text","text":"Currency code for the locale.\nIs "},{"kind":"code","text":"`null`"},{"kind":"text","text":" on Web, use a table lookup based on region instead."}],"blockTags":[{"tag":"@example","content":[{"kind":"code","text":"`'USD'`"},{"kind":"text","text":", "},{"kind":"code","text":"`'EUR'`"},{"kind":"text","text":", "},{"kind":"code","text":"`'PLN'`"},{"kind":"text","text":"."}]}]},"type":{"type":"union","types":[{"type":"intrinsic","name":"string"},{"type":"literal","value":null}]}},{"name":"currencySymbol","kind":1024,"comment":{"summary":[{"kind":"text","text":"Currency symbol for the locale.\nIs "},{"kind":"code","text":"`null`"},{"kind":"text","text":" on Web, use a table lookup based on region (if available) instead."}],"blockTags":[{"tag":"@example","content":[{"kind":"code","text":"`'$'`"},{"kind":"text","text":", "},{"kind":"code","text":"`'€'`"},{"kind":"text","text":", "},{"kind":"code","text":"`'zł'`"},{"kind":"text","text":"."}]}]},"type":{"type":"union","types":[{"type":"intrinsic","name":"string"},{"type":"literal","value":null}]}},{"name":"decimalSeparator","kind":1024,"comment":{"summary":[{"kind":"text","text":"Decimal separator used for formatting numbers with fractional parts."}],"blockTags":[{"tag":"@example","content":[{"kind":"code","text":"`'.'`"},{"kind":"text","text":", "},{"kind":"code","text":"`','`"},{"kind":"text","text":"."}]}]},"type":{"type":"union","types":[{"type":"intrinsic","name":"string"},{"type":"literal","value":null}]}},{"name":"digitGroupingSeparator","kind":1024,"comment":{"summary":[{"kind":"text","text":"Digit grouping separator used for formatting large numbers."}],"blockTags":[{"tag":"@example","content":[{"kind":"code","text":"`'.'`"},{"kind":"text","text":", "},{"kind":"code","text":"`','`"},{"kind":"text","text":"."}]}]},"type":{"type":"union","types":[{"type":"intrinsic","name":"string"},{"type":"literal","value":null}]}},{"name":"languageCode","kind":1024,"comment":{"summary":[{"kind":"text","text":"An [IETF BCP 47 language tag](https://en.wikipedia.org/wiki/IETF_language_tag) without the region code."}],"blockTags":[{"tag":"@example","content":[{"kind":"code","text":"`'en'`"},{"kind":"text","text":", "},{"kind":"code","text":"`'es'`"},{"kind":"text","text":", "},{"kind":"code","text":"`'pl'`"},{"kind":"text","text":"."}]}]},"type":{"type":"intrinsic","name":"string"}},{"name":"languageTag","kind":1024,"comment":{"summary":[{"kind":"text","text":"An [IETF BCP 47 language tag](https://en.wikipedia.org/wiki/IETF_language_tag) with a region code."}],"blockTags":[{"tag":"@example","content":[{"kind":"code","text":"`'en-US'`"},{"kind":"text","text":", "},{"kind":"code","text":"`'es-419'`"},{"kind":"text","text":", "},{"kind":"code","text":"`'pl-PL'`"},{"kind":"text","text":"."}]}]},"type":{"type":"intrinsic","name":"string"}},{"name":"measurementSystem","kind":1024,"comment":{"summary":[{"kind":"text","text":"The measurement system used in the locale.\nIs "},{"kind":"code","text":"`null`"},{"kind":"text","text":" on Web, as user chosen measurement system is not exposed on the web and using locale to determine measurement systems is unreliable.\nAsk for user preferences if possible."}]},"type":{"type":"union","types":[{"type":"literal","value":"metric"},{"type":"literal","value":"us"},{"type":"literal","value":"uk"},{"type":"literal","value":null}]}},{"name":"regionCode","kind":1024,"comment":{"summary":[{"kind":"text","text":"The region code for your device that comes from the Region setting under Language & Region on iOS, Region settings on Android and is parsed from locale on Web (can be "},{"kind":"code","text":"`null`"},{"kind":"text","text":" on Web)."}]},"type":{"type":"union","types":[{"type":"intrinsic","name":"string"},{"type":"literal","value":null}]}},{"name":"textDirection","kind":1024,"comment":{"summary":[{"kind":"text","text":"Text direction for the locale. One of: "},{"kind":"code","text":"`'ltr'`"},{"kind":"text","text":", "},{"kind":"code","text":"`'rtl'`"},{"kind":"text","text":", but can also be "},{"kind":"code","text":"`null`"},{"kind":"text","text":" on some browsers without support for the [textInfo](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Intl/Locale/textInfo) property in [Intl](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Intl) API."}]},"type":{"type":"union","types":[{"type":"literal","value":"ltr"},{"type":"literal","value":"rtl"},{"type":"literal","value":null}]}}]}}},{"name":"Localization","kind":4194304,"type":{"type":"reflection","declaration":{"name":"__type","kind":65536,"children":[{"name":"currency","kind":1024,"comment":{"summary":[{"kind":"text","text":"Three-character ISO 4217 currency code. Returns "},{"kind":"code","text":"`null`"},{"kind":"text","text":" on web."}],"blockTags":[{"tag":"@example","content":[{"kind":"code","text":"`'USD'`"},{"kind":"text","text":", "},{"kind":"code","text":"`'EUR'`"},{"kind":"text","text":", "},{"kind":"code","text":"`'CNY'`"},{"kind":"text","text":", "},{"kind":"code","text":"`null`"}]}]},"type":{"type":"union","types":[{"type":"intrinsic","name":"string"},{"type":"literal","value":null}]}},{"name":"decimalSeparator","kind":1024,"comment":{"summary":[{"kind":"text","text":"Decimal separator used for formatting numbers."}],"blockTags":[{"tag":"@example","content":[{"kind":"code","text":"`','`"},{"kind":"text","text":", "},{"kind":"code","text":"`'.'`"}]}]},"type":{"type":"intrinsic","name":"string"}},{"name":"digitGroupingSeparator","kind":1024,"comment":{"summary":[{"kind":"text","text":"Digit grouping separator used when formatting numbers larger than 1000."}],"blockTags":[{"tag":"@example","content":[{"kind":"code","text":"`'.'`"},{"kind":"text","text":", "},{"kind":"code","text":"`''`"},{"kind":"text","text":", "},{"kind":"code","text":"`','`"}]}]},"type":{"type":"intrinsic","name":"string"}},{"name":"isMetric","kind":1024,"comment":{"summary":[{"kind":"text","text":"Boolean value that indicates whether the system uses the metric system.\nOn Android and web, this is inferred from the current region."}]},"type":{"type":"intrinsic","name":"boolean"}},{"name":"isRTL","kind":1024,"comment":{"summary":[{"kind":"text","text":"Returns if the system's language is written from Right-to-Left.\nThis can be used to build features like [bidirectional icons](https://material.io/design/usability/bidirectionality.html).\n\nReturns "},{"kind":"code","text":"`false`"},{"kind":"text","text":" in Server Side Rendering (SSR) environments."}]},"type":{"type":"intrinsic","name":"boolean"}},{"name":"isoCurrencyCodes","kind":1024,"comment":{"summary":[{"kind":"text","text":"A list of all the supported language ISO codes."}]},"type":{"type":"array","elementType":{"type":"intrinsic","name":"string"}}},{"name":"locale","kind":1024,"comment":{"summary":[{"kind":"text","text":"An [IETF BCP 47 language tag](https://en.wikipedia.org/wiki/IETF_language_tag),\nconsisting of a two-character language code and optional script, region and variant codes."}],"blockTags":[{"tag":"@example","content":[{"kind":"code","text":"`'en'`"},{"kind":"text","text":", "},{"kind":"code","text":"`'en-US'`"},{"kind":"text","text":", "},{"kind":"code","text":"`'zh-Hans'`"},{"kind":"text","text":", "},{"kind":"code","text":"`'zh-Hans-CN'`"},{"kind":"text","text":", "},{"kind":"code","text":"`'en-emodeng'`"}]}]},"type":{"type":"intrinsic","name":"string"}},{"name":"locales","kind":1024,"comment":{"summary":[{"kind":"text","text":"List of all the native languages provided by the user settings.\nThese are returned in the order that the user defined in the device settings."}],"blockTags":[{"tag":"@example","content":[{"kind":"code","text":"`['en', 'en-US', 'zh-Hans', 'zh-Hans-CN', 'en-emodeng']`"}]}]},"type":{"type":"array","elementType":{"type":"intrinsic","name":"string"}}},{"name":"region","kind":1024,"comment":{"summary":[{"kind":"text","text":"The region code for your device that comes from the Region setting under Language & Region on iOS.\nThis value is always available on iOS, but might return "},{"kind":"code","text":"`null`"},{"kind":"text","text":" on Android or web."}],"blockTags":[{"tag":"@example","content":[{"kind":"code","text":"`'US'`"},{"kind":"text","text":", "},{"kind":"code","text":"`'NZ'`"},{"kind":"text","text":", "},{"kind":"code","text":"`null`"}]}]},"type":{"type":"union","types":[{"type":"intrinsic","name":"string"},{"type":"literal","value":null}]}},{"name":"timezone","kind":1024,"comment":{"summary":[{"kind":"text","text":"The current time zone in display format.\nOn Web time zone is calculated with Intl.DateTimeFormat().resolvedOptions().timeZone. For a\nbetter estimation you could use the moment-timezone package but it will add significant bloat to\nyour website's bundle size."}],"blockTags":[{"tag":"@example","content":[{"kind":"code","text":"`'America/Los_Angeles'`"}]}]},"type":{"type":"intrinsic","name":"string"}}]}}},{"name":"currency","kind":32,"flags":{"isConst":true},"comment":{"summary":[],"blockTags":[{"tag":"@deprecated","content":[{"kind":"text","text":"Use Localization.getLocales() instead.\nThree-character ISO 4217 currency code. Returns "},{"kind":"code","text":"`null`"},{"kind":"text","text":" on web."}]},{"tag":"@example","content":[{"kind":"code","text":"`'USD'`"},{"kind":"text","text":", "},{"kind":"code","text":"`'EUR'`"},{"kind":"text","text":", "},{"kind":"code","text":"`'CNY'`"},{"kind":"text","text":", "},{"kind":"code","text":"`null`"}]}]},"type":{"type":"union","types":[{"type":"literal","value":null},{"type":"intrinsic","name":"string"}]},"defaultValue":"ExpoLocalization.currency"},{"name":"decimalSeparator","kind":32,"flags":{"isConst":true},"comment":{"summary":[],"blockTags":[{"tag":"@deprecated","content":[{"kind":"text","text":"Use Localization.getLocales() instead.\nDecimal separator used for formatting numbers."}]},{"tag":"@example","content":[{"kind":"code","text":"`','`"},{"kind":"text","text":", "},{"kind":"code","text":"`'.'`"}]}]},"type":{"type":"intrinsic","name":"string"},"defaultValue":"ExpoLocalization.decimalSeparator"},{"name":"digitGroupingSeparator","kind":32,"flags":{"isConst":true},"comment":{"summary":[],"blockTags":[{"tag":"@deprecated","content":[{"kind":"text","text":"Use Localization.getLocales() instead.\nDigit grouping separator used when formatting numbers larger than 1000."}]},{"tag":"@example","content":[{"kind":"code","text":"`'.'`"},{"kind":"text","text":", "},{"kind":"code","text":"`''`"},{"kind":"text","text":", "},{"kind":"code","text":"`','`"}]}]},"type":{"type":"intrinsic","name":"string"},"defaultValue":"ExpoLocalization.digitGroupingSeparator"},{"name":"isMetric","kind":32,"flags":{"isConst":true},"comment":{"summary":[],"blockTags":[{"tag":"@deprecated","content":[{"kind":"text","text":"Use Localization.getLocales() instead.\nBoolean value that indicates whether the system uses the metric system.\nOn Android and web, this is inferred from the current region."}]}]},"type":{"type":"intrinsic","name":"boolean"},"defaultValue":"ExpoLocalization.isMetric"},{"name":"isRTL","kind":32,"flags":{"isConst":true},"comment":{"summary":[],"blockTags":[{"tag":"@deprecated","content":[{"kind":"text","text":"Use Localization.getLocales() instead.\nReturns if the system's language is written from Right-to-Left.\nThis can be used to build features like [bidirectional icons](https://material.io/design/usability/bidirectionality.html).\n\nReturns "},{"kind":"code","text":"`false`"},{"kind":"text","text":" in Server Side Rendering (SSR) environments."}]}]},"type":{"type":"intrinsic","name":"boolean"},"defaultValue":"ExpoLocalization.isRTL"},{"name":"isoCurrencyCodes","kind":32,"flags":{"isConst":true},"comment":{"summary":[],"blockTags":[{"tag":"@deprecated","content":[{"kind":"text","text":"Use Localization.getLocales() instead.\nA list of all the supported language ISO codes."}]}]},"type":{"type":"array","elementType":{"type":"intrinsic","name":"string"}},"defaultValue":"ExpoLocalization.isoCurrencyCodes"},{"name":"locale","kind":32,"flags":{"isConst":true},"comment":{"summary":[{"kind":"text","text":"Consider using Localization.getLocales() for a list of user preferred locales instead.\nAn [IETF BCP 47 language tag](https://en.wikipedia.org/wiki/IETF_language_tag),\nconsisting of a two-character language code and optional script, region and variant codes."}],"blockTags":[{"tag":"@example","content":[{"kind":"code","text":"`'en'`"},{"kind":"text","text":", "},{"kind":"code","text":"`'en-US'`"},{"kind":"text","text":", "},{"kind":"code","text":"`'zh-Hans'`"},{"kind":"text","text":", "},{"kind":"code","text":"`'zh-Hans-CN'`"},{"kind":"text","text":", "},{"kind":"code","text":"`'en-emodeng'`"}]}]},"type":{"type":"intrinsic","name":"string"},"defaultValue":"ExpoLocalization.locale"},{"name":"locales","kind":32,"flags":{"isConst":true},"comment":{"summary":[],"blockTags":[{"tag":"@deprecated","content":[{"kind":"text","text":"Use Localization.getLocales() instead.\nList of all the native languages provided by the user settings.\nThese are returned in the order the user defines in their device settings."}]},{"tag":"@example","content":[{"kind":"code","text":"`['en', 'en-US', 'zh-Hans', 'zh-Hans-CN', 'en-emodeng']`"}]}]},"type":{"type":"array","elementType":{"type":"intrinsic","name":"string"}},"defaultValue":"ExpoLocalization.locales"},{"name":"region","kind":32,"flags":{"isConst":true},"comment":{"summary":[],"blockTags":[{"tag":"@deprecated","content":[{"kind":"text","text":"Use Localization.getLocales() instead.\nThe region code for your device that comes from the Region setting under Language & Region on iOS.\nThis value is always available on iOS, but might return "},{"kind":"code","text":"`null`"},{"kind":"text","text":" on Android or web."}]},{"tag":"@example","content":[{"kind":"code","text":"`'US'`"},{"kind":"text","text":", "},{"kind":"code","text":"`'NZ'`"},{"kind":"text","text":", "},{"kind":"code","text":"`null`"}]}]},"type":{"type":"union","types":[{"type":"literal","value":null},{"type":"intrinsic","name":"string"}]},"defaultValue":"ExpoLocalization.region"},{"name":"timezone","kind":32,"flags":{"isConst":true},"comment":{"summary":[],"blockTags":[{"tag":"@deprecated","content":[{"kind":"text","text":"Use Localization.getLocales() instead.\nThe current time zone in display format.\nOn Web time zone is calculated with Intl.DateTimeFormat().resolvedOptions().timeZone. For a\nbetter estimation you could use the moment-timezone package but it will add significant bloat to\nyour website's bundle size."}]},{"tag":"@example","content":[{"kind":"code","text":"`'America/Los_Angeles'`"}]}]},"type":{"type":"intrinsic","name":"string"},"defaultValue":"ExpoLocalization.timezone"},{"name":"getCalendars","kind":64,"signatures":[{"name":"getCalendars","kind":4096,"comment":{"summary":[{"kind":"text","text":"List of user's preferred calendars, returned as an array of objects of type "},{"kind":"code","text":"`Calendar`"},{"kind":"text","text":".\nGuaranteed to contain at least 1 element.\nFor now always returns a single element, but it's likely to return a user preference list on some platforms in the future."}],"blockTags":[{"tag":"@example","content":[{"kind":"code","text":"`[\n {\n \"calendar\": \"gregory\",\n \"timeZone\": \"Europe/Warsaw\",\n \"uses24hourClock\": true,\n \"firstWeekday\": 1\n }\n ]`"}]}]},"type":{"type":"array","elementType":{"type":"reference","name":"Calendar"}}}]},{"name":"getLocales","kind":64,"signatures":[{"name":"getLocales","kind":4096,"comment":{"summary":[{"kind":"text","text":"List of user's locales, returned as an array of objects of type "},{"kind":"code","text":"`Locale`"},{"kind":"text","text":".\nGuaranteed to contain at least 1 element.\nThese are returned in the order the user defines in their device settings.\nOn the web currency and measurements systems are not provided, instead returned as null.\nIf needed, you can infer them from the current region using a lookup table."}],"blockTags":[{"tag":"@example","content":[{"kind":"code","text":"`[{\n \"languageTag\": \"pl-PL\",\n \"languageCode\": \"pl\",\n \"textDirection\": \"ltr\",\n \"digitGroupingSeparator\": \" \",\n \"decimalSeparator\": \",\",\n \"measurementSystem\": \"metric\",\n \"currencyCode\": \"PLN\",\n \"currencySymbol\": \"zł\",\n \"regionCode\": \"PL\"\n }]`"}]}]},"type":{"type":"array","elementType":{"type":"reference","name":"Locale"}}}]},{"name":"getLocalizationAsync","kind":64,"signatures":[{"name":"getLocalizationAsync","kind":4096,"comment":{"summary":[{"kind":"text","text":"Get the latest native values from the device. Locale can be changed on some Android devices\nwithout resetting the app.\n> On iOS, changing the locale will cause the device to reset meaning the constants will always be\ncorrect."}],"blockTags":[{"tag":"@example","content":[{"kind":"code","text":"```ts\n// When the app returns from the background on Android...\n\nconst { locale } = await Localization.getLocalizationAsync();\n```"}]},{"tag":"@deprecated","content":[{"kind":"text","text":"Use Localization.getLocales() or Localization.getCalendars() instead."}]}]},"type":{"type":"reference","typeArguments":[{"type":"reference","name":"Localization"}],"name":"Promise","qualifiedName":"Promise","package":"typescript"}}]},{"name":"useCalendars","kind":64,"signatures":[{"name":"useCalendars","kind":4096,"comment":{"summary":[{"kind":"text","text":"A hook providing a list of user's preferred calendars, returned as an array of objects of type "},{"kind":"code","text":"`Calendar`"},{"kind":"text","text":".\nGuaranteed to contain at least 1 element.\nFor now always returns a single element, but it's likely to return a user preference list on some platforms in the future.\nIf the OS settings change, the hook will rerender with a new list of calendars."}],"blockTags":[{"tag":"@example","content":[{"kind":"code","text":"`[\n {\n \"calendar\": \"gregory\",\n \"timeZone\": \"Europe/Warsaw\",\n \"uses24hourClock\": true,\n \"firstWeekday\": 1\n }\n ]`"}]}]},"type":{"type":"array","elementType":{"type":"reference","name":"Calendar"}}}]},{"name":"useLocales","kind":64,"signatures":[{"name":"useLocales","kind":4096,"comment":{"summary":[{"kind":"text","text":"A hook providing a list of user's locales, returned as an array of objects of type "},{"kind":"code","text":"`Locale`"},{"kind":"text","text":".\nGuaranteed to contain at least 1 element.\nThese are returned in the order the user defines in their device settings.\nOn the web currency and measurements systems are not provided, instead returned as null.\nIf needed, you can infer them from the current region using a lookup table.\nIf the OS settings change, the hook will rerender with a new list of locales."}],"blockTags":[{"tag":"@example","content":[{"kind":"code","text":"`[{\n \"languageTag\": \"pl-PL\",\n \"languageCode\": \"pl\",\n \"textDirection\": \"ltr\",\n \"digitGroupingSeparator\": \" \",\n \"decimalSeparator\": \",\",\n \"measurementSystem\": \"metric\",\n \"currencyCode\": \"PLN\",\n \"currencySymbol\": \"zł\",\n \"regionCode\": \"PL\"\n }]`"}]}]},"type":{"type":"array","elementType":{"type":"reference","name":"Locale"}}}]}]}
\ No newline at end of file
diff --git a/docs/public/static/data/unversioned/expo-location.json b/docs/public/static/data/unversioned/expo-location.json
index 90c845c23b3ad..4947b592d35cc 100644
--- a/docs/public/static/data/unversioned/expo-location.json
+++ b/docs/public/static/data/unversioned/expo-location.json
@@ -1 +1 @@
-{"name":"expo-location","kind":1,"children":[{"name":"LocationAccuracy","kind":8388608},{"name":"LocationActivityType","kind":8388608},{"name":"LocationGeofencingEventType","kind":8388608},{"name":"LocationGeofencingRegionState","kind":8388608},{"name":"Accuracy","kind":8,"comment":{"summary":[{"kind":"text","text":"Enum with available location accuracies."}]},"children":[{"name":"Balanced","kind":16,"comment":{"summary":[{"kind":"text","text":"Accurate to within one hundred meters."}]},"type":{"type":"literal","value":3}},{"name":"BestForNavigation","kind":16,"comment":{"summary":[{"kind":"text","text":"The highest possible accuracy that uses additional sensor data to facilitate navigation apps."}]},"type":{"type":"literal","value":6}},{"name":"High","kind":16,"comment":{"summary":[{"kind":"text","text":"Accurate to within ten meters of the desired target."}]},"type":{"type":"literal","value":4}},{"name":"Highest","kind":16,"comment":{"summary":[{"kind":"text","text":"The best level of accuracy available."}]},"type":{"type":"literal","value":5}},{"name":"Low","kind":16,"comment":{"summary":[{"kind":"text","text":"Accurate to the nearest kilometer."}]},"type":{"type":"literal","value":2}},{"name":"Lowest","kind":16,"comment":{"summary":[{"kind":"text","text":"Accurate to the nearest three kilometers."}]},"type":{"type":"literal","value":1}}]},{"name":"ActivityType","kind":8,"comment":{"summary":[{"kind":"text","text":"Enum with available activity types of background location tracking."}]},"children":[{"name":"Airborne","kind":16,"comment":{"summary":[{"kind":"text","text":"Intended for airborne activities. Fall backs to "},{"kind":"code","text":"`ActivityType.Other`"},{"kind":"text","text":" if\nunsupported."}],"blockTags":[{"tag":"@platform","content":[{"kind":"text","text":"ios 12+"}]}]},"type":{"type":"literal","value":5}},{"name":"AutomotiveNavigation","kind":16,"comment":{"summary":[{"kind":"text","text":"Location updates are being used specifically during vehicular navigation to track location\nchanges to the automobile."}]},"type":{"type":"literal","value":2}},{"name":"Fitness","kind":16,"comment":{"summary":[{"kind":"text","text":"Use this activity type if you track fitness activities such as walking, running, cycling,\nand so on."}]},"type":{"type":"literal","value":3}},{"name":"Other","kind":16,"comment":{"summary":[{"kind":"text","text":"Default activity type. Use it if there is no other type that matches the activity you track."}]},"type":{"type":"literal","value":1}},{"name":"OtherNavigation","kind":16,"comment":{"summary":[{"kind":"text","text":"Activity type for movements for other types of vehicular navigation that are not automobile\nrelated."}]},"type":{"type":"literal","value":4}}]},{"name":"GeofencingEventType","kind":8,"comment":{"summary":[{"kind":"text","text":"A type of the event that geofencing task can receive."}]},"children":[{"name":"Enter","kind":16,"comment":{"summary":[{"kind":"text","text":"Emitted when the device entered observed region."}]},"type":{"type":"literal","value":1}},{"name":"Exit","kind":16,"comment":{"summary":[{"kind":"text","text":"Occurs as soon as the device left observed region"}]},"type":{"type":"literal","value":2}}]},{"name":"GeofencingRegionState","kind":8,"comment":{"summary":[{"kind":"text","text":"State of the geofencing region that you receive through the geofencing task."}]},"children":[{"name":"Inside","kind":16,"comment":{"summary":[{"kind":"text","text":"Indicates that the device is inside the region."}]},"type":{"type":"literal","value":1}},{"name":"Outside","kind":16,"comment":{"summary":[{"kind":"text","text":"Inverse of inside state."}]},"type":{"type":"literal","value":2}},{"name":"Unknown","kind":16,"comment":{"summary":[{"kind":"text","text":"Indicates that the device position related to the region is unknown."}]},"type":{"type":"literal","value":0}}]},{"name":"PermissionStatus","kind":8,"children":[{"name":"DENIED","kind":16,"comment":{"summary":[{"kind":"text","text":"User has denied the permission."}]},"type":{"type":"literal","value":"denied"}},{"name":"GRANTED","kind":16,"comment":{"summary":[{"kind":"text","text":"User has granted the permission."}]},"type":{"type":"literal","value":"granted"}},{"name":"UNDETERMINED","kind":16,"comment":{"summary":[{"kind":"text","text":"User hasn't granted or denied the permission yet."}]},"type":{"type":"literal","value":"undetermined"}}]},{"name":"PermissionResponse","kind":256,"comment":{"summary":[{"kind":"text","text":"An object obtained by permissions get and request functions."}]},"children":[{"name":"canAskAgain","kind":1024,"comment":{"summary":[{"kind":"text","text":"Indicates if user can be asked again for specific permission.\nIf not, one should be directed to the Settings app\nin order to enable/disable the permission."}]},"type":{"type":"intrinsic","name":"boolean"}},{"name":"expires","kind":1024,"comment":{"summary":[{"kind":"text","text":"Determines time when the permission expires."}]},"type":{"type":"reference","name":"PermissionExpiration"}},{"name":"granted","kind":1024,"comment":{"summary":[{"kind":"text","text":"A convenience boolean that indicates if the permission is granted."}]},"type":{"type":"intrinsic","name":"boolean"}},{"name":"status","kind":1024,"comment":{"summary":[{"kind":"text","text":"Determines the status of the permission."}]},"type":{"type":"reference","name":"PermissionStatus"}}]},{"name":"LocationCallback","kind":4194304,"type":{"type":"reflection","declaration":{"name":"__type","kind":65536,"signatures":[{"name":"__type","kind":4096,"comment":{"summary":[{"kind":"text","text":"Represents "},{"kind":"code","text":"`watchPositionAsync`"},{"kind":"text","text":" callback."}]},"parameters":[{"name":"location","kind":32768,"type":{"type":"reference","name":"LocationObject"}}],"type":{"type":"intrinsic","name":"any"}}]}}},{"name":"LocationGeocodedAddress","kind":4194304,"comment":{"summary":[{"kind":"text","text":"Type representing a result of "},{"kind":"code","text":"`reverseGeocodeAsync`"},{"kind":"text","text":"."}]},"type":{"type":"reflection","declaration":{"name":"__type","kind":65536,"children":[{"name":"city","kind":1024,"comment":{"summary":[{"kind":"text","text":"City name of the address."}]},"type":{"type":"union","types":[{"type":"intrinsic","name":"string"},{"type":"literal","value":null}]}},{"name":"country","kind":1024,"comment":{"summary":[{"kind":"text","text":"Localized country name of the address."}]},"type":{"type":"union","types":[{"type":"intrinsic","name":"string"},{"type":"literal","value":null}]}},{"name":"district","kind":1024,"comment":{"summary":[{"kind":"text","text":"Additional city-level information like district name."}]},"type":{"type":"union","types":[{"type":"intrinsic","name":"string"},{"type":"literal","value":null}]}},{"name":"isoCountryCode","kind":1024,"comment":{"summary":[{"kind":"text","text":"Localized (ISO) country code of the address, if available."}]},"type":{"type":"union","types":[{"type":"intrinsic","name":"string"},{"type":"literal","value":null}]}},{"name":"name","kind":1024,"comment":{"summary":[{"kind":"text","text":"The name of the placemark, for example, \"Tower Bridge\"."}]},"type":{"type":"union","types":[{"type":"intrinsic","name":"string"},{"type":"literal","value":null}]}},{"name":"postalCode","kind":1024,"comment":{"summary":[{"kind":"text","text":"Postal code of the address."}]},"type":{"type":"union","types":[{"type":"intrinsic","name":"string"},{"type":"literal","value":null}]}},{"name":"region","kind":1024,"comment":{"summary":[{"kind":"text","text":"The state or province associated with the address."}]},"type":{"type":"union","types":[{"type":"intrinsic","name":"string"},{"type":"literal","value":null}]}},{"name":"street","kind":1024,"comment":{"summary":[{"kind":"text","text":"Street name of the address."}]},"type":{"type":"union","types":[{"type":"intrinsic","name":"string"},{"type":"literal","value":null}]}},{"name":"streetNumber","kind":1024,"comment":{"summary":[{"kind":"text","text":"Street number of the address."}]},"type":{"type":"union","types":[{"type":"intrinsic","name":"string"},{"type":"literal","value":null}]}},{"name":"subregion","kind":1024,"comment":{"summary":[{"kind":"text","text":"Additional information about administrative area."}]},"type":{"type":"union","types":[{"type":"intrinsic","name":"string"},{"type":"literal","value":null}]}},{"name":"timezone","kind":1024,"comment":{"summary":[{"kind":"text","text":"The timezone identifier associated with the address."}],"blockTags":[{"tag":"@platform","content":[{"kind":"text","text":"ios"}]}]},"type":{"type":"union","types":[{"type":"intrinsic","name":"string"},{"type":"literal","value":null}]}}]}}},{"name":"LocationGeocodedLocation","kind":4194304,"comment":{"summary":[{"kind":"text","text":"Type representing a result of "},{"kind":"code","text":"`geocodeAsync`"},{"kind":"text","text":"."}]},"type":{"type":"reflection","declaration":{"name":"__type","kind":65536,"children":[{"name":"accuracy","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"The radius of uncertainty for the location, measured in meters."}]},"type":{"type":"intrinsic","name":"number"}},{"name":"altitude","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"The altitude in meters above the WGS 84 reference ellipsoid."}]},"type":{"type":"intrinsic","name":"number"}},{"name":"latitude","kind":1024,"comment":{"summary":[{"kind":"text","text":"The latitude in degrees."}]},"type":{"type":"intrinsic","name":"number"}},{"name":"longitude","kind":1024,"comment":{"summary":[{"kind":"text","text":"The longitude in degrees."}]},"type":{"type":"intrinsic","name":"number"}}]}}},{"name":"LocationGeocodingOptions","kind":4194304,"comment":{"summary":[{"kind":"text","text":"An object of options for forward and reverse geocoding."}]},"type":{"type":"reflection","declaration":{"name":"__type","kind":65536,"children":[{"name":"useGoogleMaps","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"Whether to force using Google Maps API instead of the native implementation.\nUsed by default only on Web platform. Requires providing an API key by "},{"kind":"code","text":"`setGoogleApiKey`"},{"kind":"text","text":"."}]},"type":{"type":"intrinsic","name":"boolean"}}]}}},{"name":"LocationHeadingCallback","kind":4194304,"type":{"type":"reflection","declaration":{"name":"__type","kind":65536,"signatures":[{"name":"__type","kind":4096,"comment":{"summary":[{"kind":"text","text":"Represents "},{"kind":"code","text":"`watchHeadingAsync`"},{"kind":"text","text":" callback."}]},"parameters":[{"name":"location","kind":32768,"type":{"type":"reference","name":"LocationHeadingObject"}}],"type":{"type":"intrinsic","name":"any"}}]}}},{"name":"LocationHeadingObject","kind":4194304,"comment":{"summary":[{"kind":"text","text":"Type of the object containing heading details and provided by "},{"kind":"code","text":"`watchHeadingAsync`"},{"kind":"text","text":" callback."}]},"type":{"type":"reflection","declaration":{"name":"__type","kind":65536,"children":[{"name":"accuracy","kind":1024,"comment":{"summary":[{"kind":"text","text":"Level of calibration of compass.\n- "},{"kind":"code","text":"`3`"},{"kind":"text","text":": high accuracy, "},{"kind":"code","text":"`2`"},{"kind":"text","text":": medium accuracy, "},{"kind":"code","text":"`1`"},{"kind":"text","text":": low accuracy, "},{"kind":"code","text":"`0`"},{"kind":"text","text":": none\nReference for iOS:\n- "},{"kind":"code","text":"`3`"},{"kind":"text","text":": < 20 degrees uncertainty, "},{"kind":"code","text":"`2`"},{"kind":"text","text":": < 35 degrees, "},{"kind":"code","text":"`1`"},{"kind":"text","text":": < 50 degrees, "},{"kind":"code","text":"`0`"},{"kind":"text","text":": > 50 degrees"}]},"type":{"type":"intrinsic","name":"number"}},{"name":"magHeading","kind":1024,"comment":{"summary":[{"kind":"text","text":"Measure of magnetic north in degrees."}]},"type":{"type":"intrinsic","name":"number"}},{"name":"trueHeading","kind":1024,"comment":{"summary":[{"kind":"text","text":"Measure of true north in degrees (needs location permissions, will return "},{"kind":"code","text":"`-1`"},{"kind":"text","text":" if not given)."}]},"type":{"type":"intrinsic","name":"number"}}]}}},{"name":"LocationLastKnownOptions","kind":4194304,"comment":{"summary":[{"kind":"text","text":"Type representing options object that can be passed to "},{"kind":"code","text":"`getLastKnownPositionAsync`"},{"kind":"text","text":"."}]},"type":{"type":"reflection","declaration":{"name":"__type","kind":65536,"children":[{"name":"maxAge","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"A number of milliseconds after which the last known location starts to be invalid and thus\n"},{"kind":"code","text":"`null`"},{"kind":"text","text":" is returned."}]},"type":{"type":"intrinsic","name":"number"}},{"name":"requiredAccuracy","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"The maximum radius of uncertainty for the location, measured in meters. If the last known\nlocation's accuracy radius is bigger (less accurate) then "},{"kind":"code","text":"`null`"},{"kind":"text","text":" is returned."}]},"type":{"type":"intrinsic","name":"number"}}]}}},{"name":"LocationObject","kind":4194304,"comment":{"summary":[{"kind":"text","text":"Type representing the location object."}]},"type":{"type":"reflection","declaration":{"name":"__type","kind":65536,"children":[{"name":"coords","kind":1024,"comment":{"summary":[{"kind":"text","text":"The coordinates of the position."}]},"type":{"type":"reference","name":"LocationObjectCoords"}},{"name":"mocked","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"Whether the location coordinates is mocked or not."}],"blockTags":[{"tag":"@platform","content":[{"kind":"text","text":"android"}]}]},"type":{"type":"intrinsic","name":"boolean"}},{"name":"timestamp","kind":1024,"comment":{"summary":[{"kind":"text","text":"The time at which this position information was obtained, in milliseconds since epoch."}]},"type":{"type":"intrinsic","name":"number"}}]}}},{"name":"LocationObjectCoords","kind":4194304,"comment":{"summary":[{"kind":"text","text":"Type representing the location GPS related data."}]},"type":{"type":"reflection","declaration":{"name":"__type","kind":65536,"children":[{"name":"accuracy","kind":1024,"comment":{"summary":[{"kind":"text","text":"The radius of uncertainty for the location, measured in meters. Can be "},{"kind":"code","text":"`null`"},{"kind":"text","text":" on Web if it's not available."}]},"type":{"type":"union","types":[{"type":"intrinsic","name":"number"},{"type":"literal","value":null}]}},{"name":"altitude","kind":1024,"comment":{"summary":[{"kind":"text","text":"The altitude in meters above the WGS 84 reference ellipsoid. Can be "},{"kind":"code","text":"`null`"},{"kind":"text","text":" on Web if it's not available."}]},"type":{"type":"union","types":[{"type":"intrinsic","name":"number"},{"type":"literal","value":null}]}},{"name":"altitudeAccuracy","kind":1024,"comment":{"summary":[{"kind":"text","text":"The accuracy of the altitude value, in meters. Can be "},{"kind":"code","text":"`null`"},{"kind":"text","text":" on Web if it's not available."}]},"type":{"type":"union","types":[{"type":"intrinsic","name":"number"},{"type":"literal","value":null}]}},{"name":"heading","kind":1024,"comment":{"summary":[{"kind":"text","text":"Horizontal direction of travel of this device, measured in degrees starting at due north and\ncontinuing clockwise around the compass. Thus, north is 0 degrees, east is 90 degrees, south is\n180 degrees, and so on. Can be "},{"kind":"code","text":"`null`"},{"kind":"text","text":" on Web if it's not available."}]},"type":{"type":"union","types":[{"type":"intrinsic","name":"number"},{"type":"literal","value":null}]}},{"name":"latitude","kind":1024,"comment":{"summary":[{"kind":"text","text":"The latitude in degrees."}]},"type":{"type":"intrinsic","name":"number"}},{"name":"longitude","kind":1024,"comment":{"summary":[{"kind":"text","text":"The longitude in degrees."}]},"type":{"type":"intrinsic","name":"number"}},{"name":"speed","kind":1024,"comment":{"summary":[{"kind":"text","text":"The instantaneous speed of the device in meters per second. Can be "},{"kind":"code","text":"`null`"},{"kind":"text","text":" on Web if it's not available."}]},"type":{"type":"union","types":[{"type":"intrinsic","name":"number"},{"type":"literal","value":null}]}}]}}},{"name":"LocationOptions","kind":4194304,"comment":{"summary":[{"kind":"text","text":"Type representing options argument in "},{"kind":"code","text":"`getCurrentPositionAsync`"},{"kind":"text","text":"."}]},"type":{"type":"reflection","declaration":{"name":"__type","kind":65536,"children":[{"name":"accuracy","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"Location manager accuracy. Pass one of "},{"kind":"code","text":"`Accuracy`"},{"kind":"text","text":" enum values.\nFor low-accuracies the implementation can avoid geolocation providers\nthat consume a significant amount of power (such as GPS)."}]},"type":{"type":"reference","name":"LocationAccuracy"}},{"name":"distanceInterval","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"Receive updates only when the location has changed by at least this distance in meters.\nDefault value may depend on "},{"kind":"code","text":"`accuracy`"},{"kind":"text","text":" option."}]},"type":{"type":"intrinsic","name":"number"}},{"name":"mayShowUserSettingsDialog","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"Specifies whether to ask the user to turn on improved accuracy location mode\nwhich uses Wi-Fi, cell networks and GPS sensor."}],"blockTags":[{"tag":"@default","content":[{"kind":"text","text":"true"}]},{"tag":"@platform","content":[{"kind":"text","text":"android"}]}]},"type":{"type":"intrinsic","name":"boolean"}},{"name":"timeInterval","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"Minimum time to wait between each update in milliseconds.\nDefault value may depend on "},{"kind":"code","text":"`accuracy`"},{"kind":"text","text":" option."}],"blockTags":[{"tag":"@platform","content":[{"kind":"text","text":"android"}]}]},"type":{"type":"intrinsic","name":"number"}}]}}},{"name":"LocationPermissionResponse","kind":4194304,"comment":{"summary":[{"kind":"code","text":"`LocationPermissionResponse`"},{"kind":"text","text":" extends [PermissionResponse](#permissionresponse)\ntype exported by "},{"kind":"code","text":"`expo-modules-core`"},{"kind":"text","text":" and contains additional platform-specific fields."}]},"type":{"type":"intersection","types":[{"type":"reference","name":"PermissionResponse"},{"type":"reflection","declaration":{"name":"__type","kind":65536,"children":[{"name":"android","kind":1024,"flags":{"isOptional":true},"type":{"type":"reference","name":"PermissionDetailsLocationAndroid"}},{"name":"ios","kind":1024,"flags":{"isOptional":true},"type":{"type":"reference","name":"PermissionDetailsLocationIOS"}}]}}]}},{"name":"LocationProviderStatus","kind":4194304,"comment":{"summary":[{"kind":"text","text":"Represents the object containing details about location provider."}]},"type":{"type":"reflection","declaration":{"name":"__type","kind":65536,"children":[{"name":"backgroundModeEnabled","kind":1024,"type":{"type":"intrinsic","name":"boolean"}},{"name":"gpsAvailable","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"Whether the GPS provider is available. If "},{"kind":"code","text":"`true`"},{"kind":"text","text":" the location data will come\nfrom GPS, especially for requests with high accuracy."}],"blockTags":[{"tag":"@platform","content":[{"kind":"text","text":"android"}]}]},"type":{"type":"intrinsic","name":"boolean"}},{"name":"locationServicesEnabled","kind":1024,"comment":{"summary":[{"kind":"text","text":"Whether location services are enabled. See [Location.hasServicesEnabledAsync](#locationhasservicesenabledasync)\nfor a more convenient solution to get this value."}]},"type":{"type":"intrinsic","name":"boolean"}},{"name":"networkAvailable","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"Whether the network provider is available. If "},{"kind":"code","text":"`true`"},{"kind":"text","text":" the location data will\ncome from cellular network, especially for requests with low accuracy."}],"blockTags":[{"tag":"@platform","content":[{"kind":"text","text":"android"}]}]},"type":{"type":"intrinsic","name":"boolean"}},{"name":"passiveAvailable","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"Whether the passive provider is available. If "},{"kind":"code","text":"`true`"},{"kind":"text","text":" the location data will\nbe determined passively."}],"blockTags":[{"tag":"@platform","content":[{"kind":"text","text":"android"}]}]},"type":{"type":"intrinsic","name":"boolean"}}]}}},{"name":"LocationRegion","kind":4194304,"comment":{"summary":[{"kind":"text","text":"Type representing geofencing region object."}]},"type":{"type":"reflection","declaration":{"name":"__type","kind":65536,"children":[{"name":"identifier","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"The identifier of the region object. Defaults to auto-generated UUID hash."}]},"type":{"type":"intrinsic","name":"string"}},{"name":"latitude","kind":1024,"comment":{"summary":[{"kind":"text","text":"The latitude in degrees of region's center point."}]},"type":{"type":"intrinsic","name":"number"}},{"name":"longitude","kind":1024,"comment":{"summary":[{"kind":"text","text":"The longitude in degrees of region's center point."}]},"type":{"type":"intrinsic","name":"number"}},{"name":"notifyOnEnter","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"Boolean value whether to call the task if the device enters the region."}],"blockTags":[{"tag":"@default","content":[{"kind":"text","text":"true"}]}]},"type":{"type":"intrinsic","name":"boolean"}},{"name":"notifyOnExit","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"Boolean value whether to call the task if the device exits the region."}],"blockTags":[{"tag":"@default","content":[{"kind":"text","text":"true"}]}]},"type":{"type":"intrinsic","name":"boolean"}},{"name":"radius","kind":1024,"comment":{"summary":[{"kind":"text","text":"The radius measured in meters that defines the region's outer boundary."}]},"type":{"type":"intrinsic","name":"number"}},{"name":"state","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"One of [GeofencingRegionState](#geofencingregionstate) region state. Determines whether the\ndevice is inside or outside a region."}]},"type":{"type":"reference","name":"LocationGeofencingRegionState"}}]}}},{"name":"LocationSubscription","kind":4194304,"comment":{"summary":[{"kind":"text","text":"Represents subscription object returned by methods watching for new locations or headings."}]},"type":{"type":"reflection","declaration":{"name":"__type","kind":65536,"children":[{"name":"remove","kind":1024,"type":{"type":"reflection","declaration":{"name":"__type","kind":65536,"signatures":[{"name":"__type","kind":4096,"comment":{"summary":[{"kind":"text","text":"Call this function with no arguments to remove this subscription. The callback will no longer\nbe called for location updates."}]},"type":{"type":"intrinsic","name":"void"}}]}}}]}}},{"name":"LocationTaskOptions","kind":4194304,"comment":{"summary":[{"kind":"text","text":"Type representing background location task options."}]},"type":{"type":"intersection","types":[{"type":"reference","name":"LocationOptions"},{"type":"reflection","declaration":{"name":"__type","kind":65536,"children":[{"name":"activityType","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"The type of user activity associated with the location updates."}],"blockTags":[{"tag":"@see","content":[{"kind":"text","text":"See [Apple docs](https://developer.apple.com/documentation/corelocation/cllocationmanager/1620567-activitytype) for more details."}]},{"tag":"@default","content":[{"kind":"text","text":"ActivityType.Other"}]},{"tag":"@platform","content":[{"kind":"text","text":"ios"}]}]},"type":{"type":"reference","name":"LocationActivityType"}},{"name":"deferredUpdatesDistance","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"The distance in meters that must occur between last reported location and the current location\nbefore deferred locations are reported."}],"blockTags":[{"tag":"@default","content":[{"kind":"text","text":"0"}]}]},"type":{"type":"intrinsic","name":"number"}},{"name":"deferredUpdatesInterval","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"Minimum time interval in milliseconds that must pass since last reported location before all\nlater locations are reported in a batched update"}],"blockTags":[{"tag":"@default","content":[{"kind":"text","text":"0"}]}]},"type":{"type":"intrinsic","name":"number"}},{"name":"deferredUpdatesTimeout","kind":1024,"flags":{"isOptional":true},"type":{"type":"intrinsic","name":"number"}},{"name":"foregroundService","kind":1024,"flags":{"isOptional":true},"type":{"type":"reference","name":"LocationTaskServiceOptions"}},{"name":"pausesUpdatesAutomatically","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"A boolean value indicating whether the location manager can pause location\nupdates to improve battery life without sacrificing location data. When this option is set to\n"},{"kind":"code","text":"`true`"},{"kind":"text","text":", the location manager pauses updates (and powers down the appropriate hardware) at times\nwhen the location data is unlikely to change. You can help the determination of when to pause\nlocation updates by assigning a value to the "},{"kind":"code","text":"`activityType`"},{"kind":"text","text":" property."}],"blockTags":[{"tag":"@default","content":[{"kind":"text","text":"false"}]},{"tag":"@platform","content":[{"kind":"text","text":"ios"}]}]},"type":{"type":"intrinsic","name":"boolean"}},{"name":"showsBackgroundLocationIndicator","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"A boolean indicating whether the status bar changes its appearance when\nlocation services are used in the background."}],"blockTags":[{"tag":"@default","content":[{"kind":"text","text":"false"}]},{"tag":"@platform","content":[{"kind":"text","text":"ios 11+"}]}]},"type":{"type":"intrinsic","name":"boolean"}}]}}]}},{"name":"LocationTaskServiceOptions","kind":4194304,"type":{"type":"reflection","declaration":{"name":"__type","kind":65536,"children":[{"name":"killServiceOnDestroy","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"Boolean value whether to destroy the foreground service if the app is killed."}]},"type":{"type":"intrinsic","name":"boolean"}},{"name":"notificationBody","kind":1024,"comment":{"summary":[{"kind":"text","text":"Subtitle of the foreground service notification."}]},"type":{"type":"intrinsic","name":"string"}},{"name":"notificationColor","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"Color of the foreground service notification. Accepts "},{"kind":"code","text":"`#RRGGBB`"},{"kind":"text","text":" and "},{"kind":"code","text":"`#AARRGGBB`"},{"kind":"text","text":" hex formats."}]},"type":{"type":"intrinsic","name":"string"}},{"name":"notificationTitle","kind":1024,"comment":{"summary":[{"kind":"text","text":"Title of the foreground service notification."}]},"type":{"type":"intrinsic","name":"string"}}]}}},{"name":"PermissionDetailsLocationAndroid","kind":4194304,"type":{"type":"reflection","declaration":{"name":"__type","kind":65536,"children":[{"name":"accuracy","kind":1024,"comment":{"summary":[{"kind":"text","text":"Indicates the type of location provider."}]},"type":{"type":"union","types":[{"type":"literal","value":"fine"},{"type":"literal","value":"coarse"},{"type":"literal","value":"none"}]}},{"name":"scope","kind":1024,"comment":{"summary":[],"blockTags":[{"tag":"@deprecated","content":[{"kind":"text","text":"Use "},{"kind":"code","text":"`accuracy`"},{"kind":"text","text":" field instead."}]}]},"type":{"type":"union","types":[{"type":"literal","value":"fine"},{"type":"literal","value":"coarse"},{"type":"literal","value":"none"}]}}]}}},{"name":"PermissionDetailsLocationIOS","kind":4194304,"type":{"type":"reflection","declaration":{"name":"__type","kind":65536,"children":[{"name":"scope","kind":1024,"comment":{"summary":[{"kind":"text","text":"The scope of granted permission. Indicates when it's possible to use location."}]},"type":{"type":"union","types":[{"type":"literal","value":"whenInUse"},{"type":"literal","value":"always"},{"type":"literal","value":"none"}]}}]}}},{"name":"PermissionHookOptions","kind":4194304,"typeParameters":[{"name":"Options","kind":131072,"type":{"type":"intrinsic","name":"object"}}],"type":{"type":"intersection","types":[{"type":"reference","name":"PermissionHookBehavior"},{"type":"reference","name":"Options"}]}},{"name":"EventEmitter","kind":32,"flags":{"isConst":true},"type":{"type":"reference","name":"EventEmitter"},"defaultValue":"..."},{"name":"enableNetworkProviderAsync","kind":64,"signatures":[{"name":"enableNetworkProviderAsync","kind":4096,"comment":{"summary":[{"kind":"text","text":"Asks the user to turn on high accuracy location mode which enables network provider that uses\nGoogle Play services to improve location accuracy and location-based services."}],"blockTags":[{"tag":"@returns","content":[{"kind":"text","text":"A promise resolving as soon as the user accepts the dialog. Rejects if denied."}]}]},"type":{"type":"reference","typeArguments":[{"type":"intrinsic","name":"void"}],"name":"Promise","qualifiedName":"Promise","package":"typescript"}}]},{"name":"geocodeAsync","kind":64,"signatures":[{"name":"geocodeAsync","kind":4096,"comment":{"summary":[{"kind":"text","text":"Geocode an address string to latitude-longitude location.\n> **Note**: Geocoding is resource consuming and has to be used reasonably. Creating too many\n> requests at a time can result in an error, so they have to be managed properly.\n> It's also discouraged to use geocoding while the app is in the background and its results won't\n> be shown to the user immediately.\n\n> On Android, you must request a location permission ("},{"kind":"code","text":"`Permissions.LOCATION`"},{"kind":"text","text":") from the user\n> before geocoding can be used."}],"blockTags":[{"tag":"@returns","content":[{"kind":"text","text":"A promise which fulfills with an array (in most cases its size is 1) of ["},{"kind":"code","text":"`LocationGeocodedLocation`"},{"kind":"text","text":"](#locationgeocodedlocation) objects."}]}]},"parameters":[{"name":"address","kind":32768,"comment":{"summary":[{"kind":"text","text":"A string representing address, eg. "},{"kind":"code","text":"`\"Baker Street London\"`"},{"kind":"text","text":"."}]},"type":{"type":"intrinsic","name":"string"}},{"name":"options","kind":32768,"flags":{"isOptional":true},"type":{"type":"reference","name":"LocationGeocodingOptions"}}],"type":{"type":"reference","typeArguments":[{"type":"array","elementType":{"type":"reference","name":"LocationGeocodedLocation"}}],"name":"Promise","qualifiedName":"Promise","package":"typescript"}}]},{"name":"getBackgroundPermissionsAsync","kind":64,"signatures":[{"name":"getBackgroundPermissionsAsync","kind":4096,"comment":{"summary":[{"kind":"text","text":"Checks user's permissions for accessing location while the app is in the background."}],"blockTags":[{"tag":"@returns","content":[{"kind":"text","text":"A promise that fulfills with an object of type [PermissionResponse](#permissionresponse)."}]}]},"type":{"type":"reference","typeArguments":[{"type":"reference","name":"PermissionResponse"}],"name":"Promise","qualifiedName":"Promise","package":"typescript"}}]},{"name":"getCurrentPositionAsync","kind":64,"signatures":[{"name":"getCurrentPositionAsync","kind":4096,"comment":{"summary":[{"kind":"text","text":"Requests for one-time delivery of the user's current location.\nDepending on given "},{"kind":"code","text":"`accuracy`"},{"kind":"text","text":" option it may take some time to resolve,\nespecially when you're inside a building.\n> __Note:__ Calling it causes the location manager to obtain a location fix which may take several\n> seconds. Consider using ["},{"kind":"code","text":"`Location.getLastKnownPositionAsync`"},{"kind":"text","text":"](#locationgetlastknownpositionasyncoptions)\n> if you expect to get a quick response and high accuracy is not required."}],"blockTags":[{"tag":"@returns","content":[{"kind":"text","text":"A promise which fulfills with an object of type ["},{"kind":"code","text":"`LocationObject`"},{"kind":"text","text":"](#locationobject)."}]}]},"parameters":[{"name":"options","kind":32768,"type":{"type":"reference","name":"LocationOptions"},"defaultValue":"{}"}],"type":{"type":"reference","typeArguments":[{"type":"reference","name":"LocationObject"}],"name":"Promise","qualifiedName":"Promise","package":"typescript"}}]},{"name":"getForegroundPermissionsAsync","kind":64,"signatures":[{"name":"getForegroundPermissionsAsync","kind":4096,"comment":{"summary":[{"kind":"text","text":"Checks user's permissions for accessing location while the app is in the foreground."}],"blockTags":[{"tag":"@returns","content":[{"kind":"text","text":"A promise that fulfills with an object of type [PermissionResponse](#permissionresponse)."}]}]},"type":{"type":"reference","typeArguments":[{"type":"reference","name":"LocationPermissionResponse"}],"name":"Promise","qualifiedName":"Promise","package":"typescript"}}]},{"name":"getHeadingAsync","kind":64,"signatures":[{"name":"getHeadingAsync","kind":4096,"comment":{"summary":[{"kind":"text","text":"Gets the current heading information from the device. To simplify, it calls "},{"kind":"code","text":"`watchHeadingAsync`"},{"kind":"text","text":"\nand waits for a couple of updates, and then returns the one that is accurate enough."}],"blockTags":[{"tag":"@returns","content":[{"kind":"text","text":"A promise which fulfills with an object of type [LocationHeadingObject](#locationheadingobject)."}]}]},"type":{"type":"reference","typeArguments":[{"type":"reference","name":"LocationHeadingObject"}],"name":"Promise","qualifiedName":"Promise","package":"typescript"}}]},{"name":"getLastKnownPositionAsync","kind":64,"signatures":[{"name":"getLastKnownPositionAsync","kind":4096,"comment":{"summary":[{"kind":"text","text":"Gets the last known position of the device or "},{"kind":"code","text":"`null`"},{"kind":"text","text":" if it's not available or doesn't match given\nrequirements such as maximum age or required accuracy.\nIt's considered to be faster than "},{"kind":"code","text":"`getCurrentPositionAsync`"},{"kind":"text","text":" as it doesn't request for the current\nlocation, but keep in mind the returned location may not be up-to-date."}],"blockTags":[{"tag":"@returns","content":[{"kind":"text","text":"A promise which fulfills with an object of type [LocationObject](#locationobject) or\n"},{"kind":"code","text":"`null`"},{"kind":"text","text":" if it's not available or doesn't match given requirements such as maximum age or required\naccuracy."}]}]},"parameters":[{"name":"options","kind":32768,"type":{"type":"reference","name":"LocationLastKnownOptions"},"defaultValue":"{}"}],"type":{"type":"reference","typeArguments":[{"type":"union","types":[{"type":"reference","name":"LocationObject"},{"type":"literal","value":null}]}],"name":"Promise","qualifiedName":"Promise","package":"typescript"}}]},{"name":"getPermissionsAsync","kind":64,"signatures":[{"name":"getPermissionsAsync","kind":4096,"comment":{"summary":[{"kind":"text","text":"Checks user's permissions for accessing location."}],"blockTags":[{"tag":"@returns","content":[{"kind":"text","text":"A promise that fulfills with an object of type [LocationPermissionResponse](#locationpermissionresponse)."}]},{"tag":"@deprecated","content":[{"kind":"text","text":"Use ["},{"kind":"code","text":"`getForegroundPermissionsAsync`"},{"kind":"text","text":"](#locationgetforegroundpermissionsasync) or ["},{"kind":"code","text":"`getBackgroundPermissionsAsync`"},{"kind":"text","text":"](#locationgetbackgroundpermissionsasync) instead."}]}]},"type":{"type":"reference","typeArguments":[{"type":"reference","name":"LocationPermissionResponse"}],"name":"Promise","qualifiedName":"Promise","package":"typescript"}}]},{"name":"getProviderStatusAsync","kind":64,"signatures":[{"name":"getProviderStatusAsync","kind":4096,"comment":{"summary":[{"kind":"text","text":"Check status of location providers."}],"blockTags":[{"tag":"@returns","content":[{"kind":"text","text":"A promise which fulfills with an object of type [LocationProviderStatus](#locationproviderstatus)."}]}]},"type":{"type":"reference","typeArguments":[{"type":"reference","name":"LocationProviderStatus"}],"name":"Promise","qualifiedName":"Promise","package":"typescript"}}]},{"name":"hasServicesEnabledAsync","kind":64,"signatures":[{"name":"hasServicesEnabledAsync","kind":4096,"comment":{"summary":[{"kind":"text","text":"Checks whether location services are enabled by the user."}],"blockTags":[{"tag":"@returns","content":[{"kind":"text","text":"A promise which fulfills to "},{"kind":"code","text":"`true`"},{"kind":"text","text":" if location services are enabled on the device,\nor "},{"kind":"code","text":"`false`"},{"kind":"text","text":" if not."}]}]},"type":{"type":"reference","typeArguments":[{"type":"intrinsic","name":"boolean"}],"name":"Promise","qualifiedName":"Promise","package":"typescript"}}]},{"name":"hasStartedGeofencingAsync","kind":64,"signatures":[{"name":"hasStartedGeofencingAsync","kind":4096,"comment":{"summary":[],"blockTags":[{"tag":"@returns","content":[{"kind":"text","text":"A promise which fulfills with boolean value indicating whether the geofencing task is\nstarted or not."}]}]},"parameters":[{"name":"taskName","kind":32768,"comment":{"summary":[{"kind":"text","text":"Name of the geofencing task to check."}]},"type":{"type":"intrinsic","name":"string"}}],"type":{"type":"reference","typeArguments":[{"type":"intrinsic","name":"boolean"}],"name":"Promise","qualifiedName":"Promise","package":"typescript"}}]},{"name":"hasStartedLocationUpdatesAsync","kind":64,"signatures":[{"name":"hasStartedLocationUpdatesAsync","kind":4096,"comment":{"summary":[],"blockTags":[{"tag":"@returns","content":[{"kind":"text","text":"A promise which fulfills with boolean value indicating whether the location task is\nstarted or not."}]}]},"parameters":[{"name":"taskName","kind":32768,"comment":{"summary":[{"kind":"text","text":"Name of the location task to check."}]},"type":{"type":"intrinsic","name":"string"}}],"type":{"type":"reference","typeArguments":[{"type":"intrinsic","name":"boolean"}],"name":"Promise","qualifiedName":"Promise","package":"typescript"}}]},{"name":"installWebGeolocationPolyfill","kind":64,"signatures":[{"name":"installWebGeolocationPolyfill","kind":4096,"comment":{"summary":[{"kind":"text","text":"Polyfills "},{"kind":"code","text":"`navigator.geolocation`"},{"kind":"text","text":" for interop with the core React Native and Web API approach to geolocation."}]},"type":{"type":"intrinsic","name":"void"}}]},{"name":"isBackgroundLocationAvailableAsync","kind":64,"signatures":[{"name":"isBackgroundLocationAvailableAsync","kind":4096,"type":{"type":"reference","typeArguments":[{"type":"intrinsic","name":"boolean"}],"name":"Promise","qualifiedName":"Promise","package":"typescript"}}]},{"name":"requestBackgroundPermissionsAsync","kind":64,"signatures":[{"name":"requestBackgroundPermissionsAsync","kind":4096,"comment":{"summary":[{"kind":"text","text":"Asks the user to grant permissions for location while the app is in the background.\nOn __Android 11 or higher__: this method will open the system settings page - before that happens\nyou should explain to the user why your application needs background location permission.\nFor example, you can use "},{"kind":"code","text":"`Modal`"},{"kind":"text","text":" component from "},{"kind":"code","text":"`react-native`"},{"kind":"text","text":" to do that.\n> __Note__: Foreground permissions should be granted before asking for the background permissions\n(your app can't obtain background permission without foreground permission)."}],"blockTags":[{"tag":"@returns","content":[{"kind":"text","text":"A promise that fulfills with an object of type [PermissionResponse](#permissionresponse)."}]}]},"type":{"type":"reference","typeArguments":[{"type":"reference","name":"PermissionResponse"}],"name":"Promise","qualifiedName":"Promise","package":"typescript"}}]},{"name":"requestForegroundPermissionsAsync","kind":64,"signatures":[{"name":"requestForegroundPermissionsAsync","kind":4096,"comment":{"summary":[{"kind":"text","text":"Asks the user to grant permissions for location while the app is in the foreground."}],"blockTags":[{"tag":"@returns","content":[{"kind":"text","text":"A promise that fulfills with an object of type [PermissionResponse](#permissionresponse)."}]}]},"type":{"type":"reference","typeArguments":[{"type":"reference","name":"LocationPermissionResponse"}],"name":"Promise","qualifiedName":"Promise","package":"typescript"}}]},{"name":"requestPermissionsAsync","kind":64,"signatures":[{"name":"requestPermissionsAsync","kind":4096,"comment":{"summary":[{"kind":"text","text":"Asks the user to grant permissions for location."}],"blockTags":[{"tag":"@returns","content":[{"kind":"text","text":"A promise that fulfills with an object of type [LocationPermissionResponse](#locationpermissionresponse)."}]},{"tag":"@deprecated","content":[{"kind":"text","text":"Use ["},{"kind":"code","text":"`requestForegroundPermissionsAsync`"},{"kind":"text","text":"](#locationrequestforegroundpermissionsasync) or ["},{"kind":"code","text":"`requestBackgroundPermissionsAsync`"},{"kind":"text","text":"](#locationrequestbackgroundpermissionsasync) instead."}]}]},"type":{"type":"reference","typeArguments":[{"type":"reference","name":"LocationPermissionResponse"}],"name":"Promise","qualifiedName":"Promise","package":"typescript"}}]},{"name":"reverseGeocodeAsync","kind":64,"signatures":[{"name":"reverseGeocodeAsync","kind":4096,"comment":{"summary":[{"kind":"text","text":"Reverse geocode a location to postal address.\n> **Note**: Geocoding is resource consuming and has to be used reasonably. Creating too many\n> requests at a time can result in an error, so they have to be managed properly.\n> It's also discouraged to use geocoding while the app is in the background and its results won't\n> be shown to the user immediately.\n\n> On Android, you must request a location permission ("},{"kind":"code","text":"`Permissions.LOCATION`"},{"kind":"text","text":") from the user\n> before geocoding can be used."}],"blockTags":[{"tag":"@returns","content":[{"kind":"text","text":"A promise which fulfills with an array (in most cases its size is 1) of ["},{"kind":"code","text":"`LocationGeocodedAddress`"},{"kind":"text","text":"](#locationgeocodedaddress) objects."}]}]},"parameters":[{"name":"location","kind":32768,"comment":{"summary":[{"kind":"text","text":"An object representing a location."}]},"type":{"type":"reference","typeArguments":[{"type":"reference","name":"LocationGeocodedLocation"},{"type":"union","types":[{"type":"literal","value":"latitude"},{"type":"literal","value":"longitude"}]}],"name":"Pick","qualifiedName":"Pick","package":"typescript"}},{"name":"options","kind":32768,"flags":{"isOptional":true},"type":{"type":"reference","name":"LocationGeocodingOptions"}}],"type":{"type":"reference","typeArguments":[{"type":"array","elementType":{"type":"reference","name":"LocationGeocodedAddress"}}],"name":"Promise","qualifiedName":"Promise","package":"typescript"}}]},{"name":"setGoogleApiKey","kind":64,"signatures":[{"name":"setGoogleApiKey","kind":4096,"comment":{"summary":[{"kind":"text","text":"Sets a Google API Key for using Google Maps Geocoding API which is used by default on Web\nplatform and can be enabled through "},{"kind":"code","text":"`useGoogleMaps`"},{"kind":"text","text":" option of "},{"kind":"code","text":"`geocodeAsync`"},{"kind":"text","text":" and "},{"kind":"code","text":"`reverseGeocodeAsync`"},{"kind":"text","text":"\nmethods. It might be useful for Android devices that do not have Google Play Services, hence no\nGeocoder Service."}]},"parameters":[{"name":"apiKey","kind":32768,"comment":{"summary":[{"kind":"text","text":"Google API key obtained from Google API Console. This API key must have "},{"kind":"code","text":"`Geocoding API`"},{"kind":"text","text":"\nenabled, otherwise your geocoding requests will be denied."}]},"type":{"type":"intrinsic","name":"string"}}],"type":{"type":"intrinsic","name":"void"}}]},{"name":"startGeofencingAsync","kind":64,"signatures":[{"name":"startGeofencingAsync","kind":4096,"comment":{"summary":[{"kind":"text","text":"Starts geofencing for given regions. When the new event comes, the task with specified name will\nbe called with the region that the device enter to or exit from.\nIf you want to add or remove regions from already running geofencing task, you can just call\n"},{"kind":"code","text":"`startGeofencingAsync`"},{"kind":"text","text":" again with the new array of regions.\n\n# Task parameters\n\nGeofencing task will be receiving following data:\n - "},{"kind":"code","text":"`eventType`"},{"kind":"text","text":" - Indicates the reason for calling the task, which can be triggered by entering or exiting the region.\n See [GeofencingEventType](#geofencingeventtype).\n - "},{"kind":"code","text":"`region`"},{"kind":"text","text":" - Object containing details about updated region. See [LocationRegion](#locationregion) for more details."}],"blockTags":[{"tag":"@returns","content":[{"kind":"text","text":"A promise resolving as soon as the task is registered."}]},{"tag":"@example","content":[{"kind":"code","text":"```ts\nimport { GeofencingEventType } from 'expo-location';\nimport * as TaskManager from 'expo-task-manager';\n\n TaskManager.defineTask(YOUR_TASK_NAME, ({ data: { eventType, region }, error }) => {\n if (error) {\n // check `error.message` for more details.\n return;\n }\n if (eventType === GeofencingEventType.Enter) {\n console.log(\"You've entered region:\", region);\n } else if (eventType === GeofencingEventType.Exit) {\n console.log(\"You've left region:\", region);\n }\n});\n```"}]}]},"parameters":[{"name":"taskName","kind":32768,"comment":{"summary":[{"kind":"text","text":"Name of the task that will be called when the device enters or exits from specified regions."}]},"type":{"type":"intrinsic","name":"string"}},{"name":"regions","kind":32768,"comment":{"summary":[{"kind":"text","text":"Array of region objects to be geofenced."}]},"type":{"type":"array","elementType":{"type":"reference","name":"LocationRegion"}},"defaultValue":"[]"}],"type":{"type":"reference","typeArguments":[{"type":"intrinsic","name":"void"}],"name":"Promise","qualifiedName":"Promise","package":"typescript"}}]},{"name":"startLocationUpdatesAsync","kind":64,"signatures":[{"name":"startLocationUpdatesAsync","kind":4096,"comment":{"summary":[{"kind":"text","text":"Registers for receiving location updates that can also come when the app is in the background.\n\n# Task parameters\n\nBackground location task will be receiving following data:\n- "},{"kind":"code","text":"`locations`"},{"kind":"text","text":" - An array of the new locations.\n\n"},{"kind":"code","text":"```ts\nimport * as TaskManager from 'expo-task-manager';\n\nTaskManager.defineTask(YOUR_TASK_NAME, ({ data: { locations }, error }) => {\n if (error) {\n // check `error.message` for more details.\n return;\n }\n console.log('Received new locations', locations);\n});\n```"}],"blockTags":[{"tag":"@returns","content":[{"kind":"text","text":"A promise resolving once the task with location updates is registered."}]}]},"parameters":[{"name":"taskName","kind":32768,"comment":{"summary":[{"kind":"text","text":"Name of the task receiving location updates."}]},"type":{"type":"intrinsic","name":"string"}},{"name":"options","kind":32768,"comment":{"summary":[{"kind":"text","text":"An object of options passed to the location manager."}]},"type":{"type":"reference","name":"LocationTaskOptions"},"defaultValue":"..."}],"type":{"type":"reference","typeArguments":[{"type":"intrinsic","name":"void"}],"name":"Promise","qualifiedName":"Promise","package":"typescript"}}]},{"name":"stopGeofencingAsync","kind":64,"signatures":[{"name":"stopGeofencingAsync","kind":4096,"comment":{"summary":[{"kind":"text","text":"Stops geofencing for specified task. It unregisters the background task so the app will not be\nreceiving any updates, especially in the background."}],"blockTags":[{"tag":"@returns","content":[{"kind":"text","text":"A promise resolving as soon as the task is unregistered."}]}]},"parameters":[{"name":"taskName","kind":32768,"comment":{"summary":[{"kind":"text","text":"Name of the task to unregister."}]},"type":{"type":"intrinsic","name":"string"}}],"type":{"type":"reference","typeArguments":[{"type":"intrinsic","name":"void"}],"name":"Promise","qualifiedName":"Promise","package":"typescript"}}]},{"name":"stopLocationUpdatesAsync","kind":64,"signatures":[{"name":"stopLocationUpdatesAsync","kind":4096,"comment":{"summary":[{"kind":"text","text":"Stops geofencing for specified task."}],"blockTags":[{"tag":"@returns","content":[{"kind":"text","text":"A promise resolving as soon as the task is unregistered."}]}]},"parameters":[{"name":"taskName","kind":32768,"comment":{"summary":[{"kind":"text","text":"Name of the background location task to stop."}]},"type":{"type":"intrinsic","name":"string"}}],"type":{"type":"reference","typeArguments":[{"type":"intrinsic","name":"void"}],"name":"Promise","qualifiedName":"Promise","package":"typescript"}}]},{"name":"useBackgroundPermissions","kind":64,"signatures":[{"name":"useBackgroundPermissions","kind":4096,"comment":{"summary":[{"kind":"text","text":"Check or request permissions for the background location.\nThis uses both "},{"kind":"code","text":"`requestBackgroundPermissionsAsync`"},{"kind":"text","text":" and "},{"kind":"code","text":"`getBackgroundPermissionsAsync`"},{"kind":"text","text":" to\ninteract with the permissions."}],"blockTags":[{"tag":"@example","content":[{"kind":"code","text":"```ts\nconst [status, requestPermission] = Location.useBackgroundPermissions();\n```"}]}]},"parameters":[{"name":"options","kind":32768,"flags":{"isOptional":true},"type":{"type":"reference","typeArguments":[{"type":"intrinsic","name":"object"}],"name":"PermissionHookOptions"}}],"type":{"type":"tuple","elements":[{"type":"union","types":[{"type":"literal","value":null},{"type":"reference","name":"PermissionResponse"}]},{"type":"reference","typeArguments":[{"type":"reference","name":"PermissionResponse"}],"name":"RequestPermissionMethod"},{"type":"reference","typeArguments":[{"type":"reference","name":"PermissionResponse"}],"name":"GetPermissionMethod"}]}}]},{"name":"useForegroundPermissions","kind":64,"signatures":[{"name":"useForegroundPermissions","kind":4096,"comment":{"summary":[{"kind":"text","text":"Check or request permissions for the foreground location.\nThis uses both "},{"kind":"code","text":"`requestForegroundPermissionsAsync`"},{"kind":"text","text":" and "},{"kind":"code","text":"`getForegroundPermissionsAsync`"},{"kind":"text","text":" to interact with the permissions."}],"blockTags":[{"tag":"@example","content":[{"kind":"code","text":"```ts\nconst [status, requestPermission] = Location.useForegroundPermissions();\n```"}]}]},"parameters":[{"name":"options","kind":32768,"flags":{"isOptional":true},"type":{"type":"reference","typeArguments":[{"type":"intrinsic","name":"object"}],"name":"PermissionHookOptions"}}],"type":{"type":"tuple","elements":[{"type":"union","types":[{"type":"literal","value":null},{"type":"reference","name":"LocationPermissionResponse"}]},{"type":"reference","typeArguments":[{"type":"reference","name":"LocationPermissionResponse"}],"name":"RequestPermissionMethod"},{"type":"reference","typeArguments":[{"type":"reference","name":"LocationPermissionResponse"}],"name":"GetPermissionMethod"}]}}]},{"name":"watchHeadingAsync","kind":64,"signatures":[{"name":"watchHeadingAsync","kind":4096,"comment":{"summary":[{"kind":"text","text":"Subscribe to compass updates from the device."}],"blockTags":[{"tag":"@returns","content":[{"kind":"text","text":"A promise which fulfills with a ["},{"kind":"code","text":"`LocationSubscription`"},{"kind":"text","text":"](#locationsubscription) object."}]}]},"parameters":[{"name":"callback","kind":32768,"comment":{"summary":[{"kind":"text","text":"This function is called on each compass update. It receives an object of type\n[LocationHeadingObject](#locationheadingobject) as the first argument."}]},"type":{"type":"reference","name":"LocationHeadingCallback"}}],"type":{"type":"reference","typeArguments":[{"type":"reference","name":"LocationSubscription"}],"name":"Promise","qualifiedName":"Promise","package":"typescript"}}]},{"name":"watchPositionAsync","kind":64,"signatures":[{"name":"watchPositionAsync","kind":4096,"comment":{"summary":[{"kind":"text","text":"Subscribe to location updates from the device. Please note that updates will only occur while the\napplication is in the foreground. To get location updates while in background you'll need to use\n[Location.startLocationUpdatesAsync](#locationstartlocationupdatesasynctaskname-options)."}],"blockTags":[{"tag":"@returns","content":[{"kind":"text","text":"A promise which fulfills with a ["},{"kind":"code","text":"`LocationSubscription`"},{"kind":"text","text":"](#locationsubscription) object."}]}]},"parameters":[{"name":"options","kind":32768,"type":{"type":"reference","name":"LocationOptions"}},{"name":"callback","kind":32768,"comment":{"summary":[{"kind":"text","text":"This function is called on each location update. It receives an object of type\n["},{"kind":"code","text":"`LocationObject`"},{"kind":"text","text":"](#locationobject) as the first argument."}]},"type":{"type":"reference","name":"LocationCallback"}}],"type":{"type":"reference","typeArguments":[{"type":"reference","name":"LocationSubscription"}],"name":"Promise","qualifiedName":"Promise","package":"typescript"}}]}]}
\ No newline at end of file
+{"name":"expo-location","kind":1,"children":[{"name":"LocationAccuracy","kind":8388608},{"name":"LocationActivityType","kind":8388608},{"name":"LocationGeofencingEventType","kind":8388608},{"name":"LocationGeofencingRegionState","kind":8388608},{"name":"Accuracy","kind":8,"comment":{"summary":[{"kind":"text","text":"Enum with available location accuracies."}]},"children":[{"name":"Balanced","kind":16,"comment":{"summary":[{"kind":"text","text":"Accurate to within one hundred meters."}]},"type":{"type":"literal","value":3}},{"name":"BestForNavigation","kind":16,"comment":{"summary":[{"kind":"text","text":"The highest possible accuracy that uses additional sensor data to facilitate navigation apps."}]},"type":{"type":"literal","value":6}},{"name":"High","kind":16,"comment":{"summary":[{"kind":"text","text":"Accurate to within ten meters of the desired target."}]},"type":{"type":"literal","value":4}},{"name":"Highest","kind":16,"comment":{"summary":[{"kind":"text","text":"The best level of accuracy available."}]},"type":{"type":"literal","value":5}},{"name":"Low","kind":16,"comment":{"summary":[{"kind":"text","text":"Accurate to the nearest kilometer."}]},"type":{"type":"literal","value":2}},{"name":"Lowest","kind":16,"comment":{"summary":[{"kind":"text","text":"Accurate to the nearest three kilometers."}]},"type":{"type":"literal","value":1}}]},{"name":"ActivityType","kind":8,"comment":{"summary":[{"kind":"text","text":"Enum with available activity types of background location tracking."}]},"children":[{"name":"Airborne","kind":16,"comment":{"summary":[{"kind":"text","text":"Intended for airborne activities. Fall backs to "},{"kind":"code","text":"`ActivityType.Other`"},{"kind":"text","text":" if\nunsupported."}],"blockTags":[{"tag":"@platform","content":[{"kind":"text","text":"ios 12+"}]}]},"type":{"type":"literal","value":5}},{"name":"AutomotiveNavigation","kind":16,"comment":{"summary":[{"kind":"text","text":"Location updates are being used specifically during vehicular navigation to track location\nchanges to the automobile."}]},"type":{"type":"literal","value":2}},{"name":"Fitness","kind":16,"comment":{"summary":[{"kind":"text","text":"Use this activity type if you track fitness activities such as walking, running, cycling,\nand so on."}]},"type":{"type":"literal","value":3}},{"name":"Other","kind":16,"comment":{"summary":[{"kind":"text","text":"Default activity type. Use it if there is no other type that matches the activity you track."}]},"type":{"type":"literal","value":1}},{"name":"OtherNavigation","kind":16,"comment":{"summary":[{"kind":"text","text":"Activity type for movements for other types of vehicular navigation that are not automobile\nrelated."}]},"type":{"type":"literal","value":4}}]},{"name":"GeofencingEventType","kind":8,"comment":{"summary":[{"kind":"text","text":"A type of the event that geofencing task can receive."}]},"children":[{"name":"Enter","kind":16,"comment":{"summary":[{"kind":"text","text":"Emitted when the device entered observed region."}]},"type":{"type":"literal","value":1}},{"name":"Exit","kind":16,"comment":{"summary":[{"kind":"text","text":"Occurs as soon as the device left observed region"}]},"type":{"type":"literal","value":2}}]},{"name":"GeofencingRegionState","kind":8,"comment":{"summary":[{"kind":"text","text":"State of the geofencing region that you receive through the geofencing task."}]},"children":[{"name":"Inside","kind":16,"comment":{"summary":[{"kind":"text","text":"Indicates that the device is inside the region."}]},"type":{"type":"literal","value":1}},{"name":"Outside","kind":16,"comment":{"summary":[{"kind":"text","text":"Inverse of inside state."}]},"type":{"type":"literal","value":2}},{"name":"Unknown","kind":16,"comment":{"summary":[{"kind":"text","text":"Indicates that the device position related to the region is unknown."}]},"type":{"type":"literal","value":0}}]},{"name":"PermissionStatus","kind":8,"children":[{"name":"DENIED","kind":16,"comment":{"summary":[{"kind":"text","text":"User has denied the permission."}]},"type":{"type":"literal","value":"denied"}},{"name":"GRANTED","kind":16,"comment":{"summary":[{"kind":"text","text":"User has granted the permission."}]},"type":{"type":"literal","value":"granted"}},{"name":"UNDETERMINED","kind":16,"comment":{"summary":[{"kind":"text","text":"User hasn't granted or denied the permission yet."}]},"type":{"type":"literal","value":"undetermined"}}]},{"name":"PermissionResponse","kind":256,"comment":{"summary":[{"kind":"text","text":"An object obtained by permissions get and request functions."}]},"children":[{"name":"canAskAgain","kind":1024,"comment":{"summary":[{"kind":"text","text":"Indicates if user can be asked again for specific permission.\nIf not, one should be directed to the Settings app\nin order to enable/disable the permission."}]},"type":{"type":"intrinsic","name":"boolean"}},{"name":"expires","kind":1024,"comment":{"summary":[{"kind":"text","text":"Determines time when the permission expires."}]},"type":{"type":"reference","name":"PermissionExpiration"}},{"name":"granted","kind":1024,"comment":{"summary":[{"kind":"text","text":"A convenience boolean that indicates if the permission is granted."}]},"type":{"type":"intrinsic","name":"boolean"}},{"name":"status","kind":1024,"comment":{"summary":[{"kind":"text","text":"Determines the status of the permission."}]},"type":{"type":"reference","name":"PermissionStatus"}}]},{"name":"LocationCallback","kind":4194304,"type":{"type":"reflection","declaration":{"name":"__type","kind":65536,"signatures":[{"name":"__type","kind":4096,"comment":{"summary":[{"kind":"text","text":"Represents "},{"kind":"code","text":"`watchPositionAsync`"},{"kind":"text","text":" callback."}]},"parameters":[{"name":"location","kind":32768,"type":{"type":"reference","name":"LocationObject"}}],"type":{"type":"intrinsic","name":"any"}}]}}},{"name":"LocationGeocodedAddress","kind":4194304,"comment":{"summary":[{"kind":"text","text":"Type representing a result of "},{"kind":"code","text":"`reverseGeocodeAsync`"},{"kind":"text","text":"."}]},"type":{"type":"reflection","declaration":{"name":"__type","kind":65536,"children":[{"name":"city","kind":1024,"comment":{"summary":[{"kind":"text","text":"City name of the address."}]},"type":{"type":"union","types":[{"type":"intrinsic","name":"string"},{"type":"literal","value":null}]}},{"name":"country","kind":1024,"comment":{"summary":[{"kind":"text","text":"Localized country name of the address."}]},"type":{"type":"union","types":[{"type":"intrinsic","name":"string"},{"type":"literal","value":null}]}},{"name":"district","kind":1024,"comment":{"summary":[{"kind":"text","text":"Additional city-level information like district name."}]},"type":{"type":"union","types":[{"type":"intrinsic","name":"string"},{"type":"literal","value":null}]}},{"name":"isoCountryCode","kind":1024,"comment":{"summary":[{"kind":"text","text":"Localized (ISO) country code of the address, if available."}]},"type":{"type":"union","types":[{"type":"intrinsic","name":"string"},{"type":"literal","value":null}]}},{"name":"name","kind":1024,"comment":{"summary":[{"kind":"text","text":"The name of the placemark, for example, \"Tower Bridge\"."}]},"type":{"type":"union","types":[{"type":"intrinsic","name":"string"},{"type":"literal","value":null}]}},{"name":"postalCode","kind":1024,"comment":{"summary":[{"kind":"text","text":"Postal code of the address."}]},"type":{"type":"union","types":[{"type":"intrinsic","name":"string"},{"type":"literal","value":null}]}},{"name":"region","kind":1024,"comment":{"summary":[{"kind":"text","text":"The state or province associated with the address."}]},"type":{"type":"union","types":[{"type":"intrinsic","name":"string"},{"type":"literal","value":null}]}},{"name":"street","kind":1024,"comment":{"summary":[{"kind":"text","text":"Street name of the address."}]},"type":{"type":"union","types":[{"type":"intrinsic","name":"string"},{"type":"literal","value":null}]}},{"name":"streetNumber","kind":1024,"comment":{"summary":[{"kind":"text","text":"Street number of the address."}]},"type":{"type":"union","types":[{"type":"intrinsic","name":"string"},{"type":"literal","value":null}]}},{"name":"subregion","kind":1024,"comment":{"summary":[{"kind":"text","text":"Additional information about administrative area."}]},"type":{"type":"union","types":[{"type":"intrinsic","name":"string"},{"type":"literal","value":null}]}},{"name":"timezone","kind":1024,"comment":{"summary":[{"kind":"text","text":"The timezone identifier associated with the address."}],"blockTags":[{"tag":"@platform","content":[{"kind":"text","text":"ios"}]}]},"type":{"type":"union","types":[{"type":"intrinsic","name":"string"},{"type":"literal","value":null}]}}]}}},{"name":"LocationGeocodedLocation","kind":4194304,"comment":{"summary":[{"kind":"text","text":"Type representing a result of "},{"kind":"code","text":"`geocodeAsync`"},{"kind":"text","text":"."}]},"type":{"type":"reflection","declaration":{"name":"__type","kind":65536,"children":[{"name":"accuracy","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"The radius of uncertainty for the location, measured in meters."}]},"type":{"type":"intrinsic","name":"number"}},{"name":"altitude","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"The altitude in meters above the WGS 84 reference ellipsoid."}]},"type":{"type":"intrinsic","name":"number"}},{"name":"latitude","kind":1024,"comment":{"summary":[{"kind":"text","text":"The latitude in degrees."}]},"type":{"type":"intrinsic","name":"number"}},{"name":"longitude","kind":1024,"comment":{"summary":[{"kind":"text","text":"The longitude in degrees."}]},"type":{"type":"intrinsic","name":"number"}}]}}},{"name":"LocationGeocodingOptions","kind":4194304,"comment":{"summary":[{"kind":"text","text":"An object of options for forward and reverse geocoding."}]},"type":{"type":"reflection","declaration":{"name":"__type","kind":65536,"children":[{"name":"useGoogleMaps","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"Whether to force using Google Maps API instead of the native implementation.\nUsed by default only on Web platform. Requires providing an API key by "},{"kind":"code","text":"`setGoogleApiKey`"},{"kind":"text","text":"."}]},"type":{"type":"intrinsic","name":"boolean"}}]}}},{"name":"LocationHeadingCallback","kind":4194304,"type":{"type":"reflection","declaration":{"name":"__type","kind":65536,"signatures":[{"name":"__type","kind":4096,"comment":{"summary":[{"kind":"text","text":"Represents "},{"kind":"code","text":"`watchHeadingAsync`"},{"kind":"text","text":" callback."}]},"parameters":[{"name":"location","kind":32768,"type":{"type":"reference","name":"LocationHeadingObject"}}],"type":{"type":"intrinsic","name":"any"}}]}}},{"name":"LocationHeadingObject","kind":4194304,"comment":{"summary":[{"kind":"text","text":"Type of the object containing heading details and provided by "},{"kind":"code","text":"`watchHeadingAsync`"},{"kind":"text","text":" callback."}]},"type":{"type":"reflection","declaration":{"name":"__type","kind":65536,"children":[{"name":"accuracy","kind":1024,"comment":{"summary":[{"kind":"text","text":"Level of calibration of compass.\n- "},{"kind":"code","text":"`3`"},{"kind":"text","text":": high accuracy, "},{"kind":"code","text":"`2`"},{"kind":"text","text":": medium accuracy, "},{"kind":"code","text":"`1`"},{"kind":"text","text":": low accuracy, "},{"kind":"code","text":"`0`"},{"kind":"text","text":": none\nReference for iOS:\n- "},{"kind":"code","text":"`3`"},{"kind":"text","text":": < 20 degrees uncertainty, "},{"kind":"code","text":"`2`"},{"kind":"text","text":": < 35 degrees, "},{"kind":"code","text":"`1`"},{"kind":"text","text":": < 50 degrees, "},{"kind":"code","text":"`0`"},{"kind":"text","text":": > 50 degrees"}]},"type":{"type":"intrinsic","name":"number"}},{"name":"magHeading","kind":1024,"comment":{"summary":[{"kind":"text","text":"Measure of magnetic north in degrees."}]},"type":{"type":"intrinsic","name":"number"}},{"name":"trueHeading","kind":1024,"comment":{"summary":[{"kind":"text","text":"Measure of true north in degrees (needs location permissions, will return "},{"kind":"code","text":"`-1`"},{"kind":"text","text":" if not given)."}]},"type":{"type":"intrinsic","name":"number"}}]}}},{"name":"LocationLastKnownOptions","kind":4194304,"comment":{"summary":[{"kind":"text","text":"Type representing options object that can be passed to "},{"kind":"code","text":"`getLastKnownPositionAsync`"},{"kind":"text","text":"."}]},"type":{"type":"reflection","declaration":{"name":"__type","kind":65536,"children":[{"name":"maxAge","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"A number of milliseconds after which the last known location starts to be invalid and thus\n"},{"kind":"code","text":"`null`"},{"kind":"text","text":" is returned."}]},"type":{"type":"intrinsic","name":"number"}},{"name":"requiredAccuracy","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"The maximum radius of uncertainty for the location, measured in meters. If the last known\nlocation's accuracy radius is bigger (less accurate) then "},{"kind":"code","text":"`null`"},{"kind":"text","text":" is returned."}]},"type":{"type":"intrinsic","name":"number"}}]}}},{"name":"LocationObject","kind":4194304,"comment":{"summary":[{"kind":"text","text":"Type representing the location object."}]},"type":{"type":"reflection","declaration":{"name":"__type","kind":65536,"children":[{"name":"coords","kind":1024,"comment":{"summary":[{"kind":"text","text":"The coordinates of the position."}]},"type":{"type":"reference","name":"LocationObjectCoords"}},{"name":"mocked","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"Whether the location coordinates is mocked or not."}],"blockTags":[{"tag":"@platform","content":[{"kind":"text","text":"android"}]}]},"type":{"type":"intrinsic","name":"boolean"}},{"name":"timestamp","kind":1024,"comment":{"summary":[{"kind":"text","text":"The time at which this position information was obtained, in milliseconds since epoch."}]},"type":{"type":"intrinsic","name":"number"}}]}}},{"name":"LocationObjectCoords","kind":4194304,"comment":{"summary":[{"kind":"text","text":"Type representing the location GPS related data."}]},"type":{"type":"reflection","declaration":{"name":"__type","kind":65536,"children":[{"name":"accuracy","kind":1024,"comment":{"summary":[{"kind":"text","text":"The radius of uncertainty for the location, measured in meters. Can be "},{"kind":"code","text":"`null`"},{"kind":"text","text":" on Web if it's not available."}]},"type":{"type":"union","types":[{"type":"intrinsic","name":"number"},{"type":"literal","value":null}]}},{"name":"altitude","kind":1024,"comment":{"summary":[{"kind":"text","text":"The altitude in meters above the WGS 84 reference ellipsoid. Can be "},{"kind":"code","text":"`null`"},{"kind":"text","text":" on Web if it's not available."}]},"type":{"type":"union","types":[{"type":"intrinsic","name":"number"},{"type":"literal","value":null}]}},{"name":"altitudeAccuracy","kind":1024,"comment":{"summary":[{"kind":"text","text":"The accuracy of the altitude value, in meters. Can be "},{"kind":"code","text":"`null`"},{"kind":"text","text":" on Web if it's not available."}]},"type":{"type":"union","types":[{"type":"intrinsic","name":"number"},{"type":"literal","value":null}]}},{"name":"heading","kind":1024,"comment":{"summary":[{"kind":"text","text":"Horizontal direction of travel of this device, measured in degrees starting at due north and\ncontinuing clockwise around the compass. Thus, north is 0 degrees, east is 90 degrees, south is\n180 degrees, and so on. Can be "},{"kind":"code","text":"`null`"},{"kind":"text","text":" on Web if it's not available."}]},"type":{"type":"union","types":[{"type":"intrinsic","name":"number"},{"type":"literal","value":null}]}},{"name":"latitude","kind":1024,"comment":{"summary":[{"kind":"text","text":"The latitude in degrees."}]},"type":{"type":"intrinsic","name":"number"}},{"name":"longitude","kind":1024,"comment":{"summary":[{"kind":"text","text":"The longitude in degrees."}]},"type":{"type":"intrinsic","name":"number"}},{"name":"speed","kind":1024,"comment":{"summary":[{"kind":"text","text":"The instantaneous speed of the device in meters per second. Can be "},{"kind":"code","text":"`null`"},{"kind":"text","text":" on Web if it's not available."}]},"type":{"type":"union","types":[{"type":"intrinsic","name":"number"},{"type":"literal","value":null}]}}]}}},{"name":"LocationOptions","kind":4194304,"comment":{"summary":[{"kind":"text","text":"Type representing options argument in "},{"kind":"code","text":"`getCurrentPositionAsync`"},{"kind":"text","text":"."}]},"type":{"type":"reflection","declaration":{"name":"__type","kind":65536,"children":[{"name":"accuracy","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"Location manager accuracy. Pass one of "},{"kind":"code","text":"`Accuracy`"},{"kind":"text","text":" enum values.\nFor low-accuracies the implementation can avoid geolocation providers\nthat consume a significant amount of power (such as GPS)."}]},"type":{"type":"reference","name":"LocationAccuracy"}},{"name":"distanceInterval","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"Receive updates only when the location has changed by at least this distance in meters.\nDefault value may depend on "},{"kind":"code","text":"`accuracy`"},{"kind":"text","text":" option."}]},"type":{"type":"intrinsic","name":"number"}},{"name":"mayShowUserSettingsDialog","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"Specifies whether to ask the user to turn on improved accuracy location mode\nwhich uses Wi-Fi, cell networks and GPS sensor."}],"blockTags":[{"tag":"@default","content":[{"kind":"text","text":"true"}]},{"tag":"@platform","content":[{"kind":"text","text":"android"}]}]},"type":{"type":"intrinsic","name":"boolean"}},{"name":"timeInterval","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"Minimum time to wait between each update in milliseconds.\nDefault value may depend on "},{"kind":"code","text":"`accuracy`"},{"kind":"text","text":" option."}],"blockTags":[{"tag":"@platform","content":[{"kind":"text","text":"android"}]}]},"type":{"type":"intrinsic","name":"number"}}]}}},{"name":"LocationPermissionResponse","kind":4194304,"comment":{"summary":[{"kind":"code","text":"`LocationPermissionResponse`"},{"kind":"text","text":" extends [PermissionResponse](#permissionresponse)\ntype exported by "},{"kind":"code","text":"`expo-modules-core`"},{"kind":"text","text":" and contains additional platform-specific fields."}]},"type":{"type":"intersection","types":[{"type":"reference","name":"PermissionResponse"},{"type":"reflection","declaration":{"name":"__type","kind":65536,"children":[{"name":"android","kind":1024,"flags":{"isOptional":true},"type":{"type":"reference","name":"PermissionDetailsLocationAndroid"}},{"name":"ios","kind":1024,"flags":{"isOptional":true},"type":{"type":"reference","name":"PermissionDetailsLocationIOS"}}]}}]}},{"name":"LocationProviderStatus","kind":4194304,"comment":{"summary":[{"kind":"text","text":"Represents the object containing details about location provider."}]},"type":{"type":"reflection","declaration":{"name":"__type","kind":65536,"children":[{"name":"backgroundModeEnabled","kind":1024,"type":{"type":"intrinsic","name":"boolean"}},{"name":"gpsAvailable","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"Whether the GPS provider is available. If "},{"kind":"code","text":"`true`"},{"kind":"text","text":" the location data will come\nfrom GPS, especially for requests with high accuracy."}],"blockTags":[{"tag":"@platform","content":[{"kind":"text","text":"android"}]}]},"type":{"type":"intrinsic","name":"boolean"}},{"name":"locationServicesEnabled","kind":1024,"comment":{"summary":[{"kind":"text","text":"Whether location services are enabled. See [Location.hasServicesEnabledAsync](#locationhasservicesenabledasync)\nfor a more convenient solution to get this value."}]},"type":{"type":"intrinsic","name":"boolean"}},{"name":"networkAvailable","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"Whether the network provider is available. If "},{"kind":"code","text":"`true`"},{"kind":"text","text":" the location data will\ncome from cellular network, especially for requests with low accuracy."}],"blockTags":[{"tag":"@platform","content":[{"kind":"text","text":"android"}]}]},"type":{"type":"intrinsic","name":"boolean"}},{"name":"passiveAvailable","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"Whether the passive provider is available. If "},{"kind":"code","text":"`true`"},{"kind":"text","text":" the location data will\nbe determined passively."}],"blockTags":[{"tag":"@platform","content":[{"kind":"text","text":"android"}]}]},"type":{"type":"intrinsic","name":"boolean"}}]}}},{"name":"LocationRegion","kind":4194304,"comment":{"summary":[{"kind":"text","text":"Type representing geofencing region object."}]},"type":{"type":"reflection","declaration":{"name":"__type","kind":65536,"children":[{"name":"identifier","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"The identifier of the region object. Defaults to auto-generated UUID hash."}]},"type":{"type":"intrinsic","name":"string"}},{"name":"latitude","kind":1024,"comment":{"summary":[{"kind":"text","text":"The latitude in degrees of region's center point."}]},"type":{"type":"intrinsic","name":"number"}},{"name":"longitude","kind":1024,"comment":{"summary":[{"kind":"text","text":"The longitude in degrees of region's center point."}]},"type":{"type":"intrinsic","name":"number"}},{"name":"notifyOnEnter","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"Boolean value whether to call the task if the device enters the region."}],"blockTags":[{"tag":"@default","content":[{"kind":"text","text":"true"}]}]},"type":{"type":"intrinsic","name":"boolean"}},{"name":"notifyOnExit","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"Boolean value whether to call the task if the device exits the region."}],"blockTags":[{"tag":"@default","content":[{"kind":"text","text":"true"}]}]},"type":{"type":"intrinsic","name":"boolean"}},{"name":"radius","kind":1024,"comment":{"summary":[{"kind":"text","text":"The radius measured in meters that defines the region's outer boundary."}]},"type":{"type":"intrinsic","name":"number"}},{"name":"state","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"One of [GeofencingRegionState](#geofencingregionstate) region state. Determines whether the\ndevice is inside or outside a region."}]},"type":{"type":"reference","name":"LocationGeofencingRegionState"}}]}}},{"name":"LocationSubscription","kind":4194304,"comment":{"summary":[{"kind":"text","text":"Represents subscription object returned by methods watching for new locations or headings."}]},"type":{"type":"reflection","declaration":{"name":"__type","kind":65536,"children":[{"name":"remove","kind":1024,"type":{"type":"reflection","declaration":{"name":"__type","kind":65536,"signatures":[{"name":"__type","kind":4096,"comment":{"summary":[{"kind":"text","text":"Call this function with no arguments to remove this subscription. The callback will no longer\nbe called for location updates."}]},"type":{"type":"intrinsic","name":"void"}}]}}}]}}},{"name":"LocationTaskOptions","kind":4194304,"comment":{"summary":[{"kind":"text","text":"Type representing background location task options."}]},"type":{"type":"intersection","types":[{"type":"reference","name":"LocationOptions"},{"type":"reflection","declaration":{"name":"__type","kind":65536,"children":[{"name":"activityType","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"The type of user activity associated with the location updates."}],"blockTags":[{"tag":"@see","content":[{"kind":"text","text":"See [Apple docs](https://developer.apple.com/documentation/corelocation/cllocationmanager/1620567-activitytype) for more details."}]},{"tag":"@default","content":[{"kind":"text","text":"ActivityType.Other"}]},{"tag":"@platform","content":[{"kind":"text","text":"ios"}]}]},"type":{"type":"reference","name":"LocationActivityType"}},{"name":"deferredUpdatesDistance","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"The distance in meters that must occur between last reported location and the current location\nbefore deferred locations are reported."}],"blockTags":[{"tag":"@default","content":[{"kind":"text","text":"0"}]}]},"type":{"type":"intrinsic","name":"number"}},{"name":"deferredUpdatesInterval","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"Minimum time interval in milliseconds that must pass since last reported location before all\nlater locations are reported in a batched update"}],"blockTags":[{"tag":"@default","content":[{"kind":"text","text":"0"}]}]},"type":{"type":"intrinsic","name":"number"}},{"name":"deferredUpdatesTimeout","kind":1024,"flags":{"isOptional":true},"type":{"type":"intrinsic","name":"number"}},{"name":"foregroundService","kind":1024,"flags":{"isOptional":true},"type":{"type":"reference","name":"LocationTaskServiceOptions"}},{"name":"pausesUpdatesAutomatically","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"A boolean value indicating whether the location manager can pause location\nupdates to improve battery life without sacrificing location data. When this option is set to\n"},{"kind":"code","text":"`true`"},{"kind":"text","text":", the location manager pauses updates (and powers down the appropriate hardware) at times\nwhen the location data is unlikely to change. You can help the determination of when to pause\nlocation updates by assigning a value to the "},{"kind":"code","text":"`activityType`"},{"kind":"text","text":" property."}],"blockTags":[{"tag":"@default","content":[{"kind":"text","text":"false"}]},{"tag":"@platform","content":[{"kind":"text","text":"ios"}]}]},"type":{"type":"intrinsic","name":"boolean"}},{"name":"showsBackgroundLocationIndicator","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"A boolean indicating whether the status bar changes its appearance when\nlocation services are used in the background."}],"blockTags":[{"tag":"@default","content":[{"kind":"text","text":"false"}]},{"tag":"@platform","content":[{"kind":"text","text":"ios 11+"}]}]},"type":{"type":"intrinsic","name":"boolean"}}]}}]}},{"name":"LocationTaskServiceOptions","kind":4194304,"type":{"type":"reflection","declaration":{"name":"__type","kind":65536,"children":[{"name":"killServiceOnDestroy","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"Boolean value whether to destroy the foreground service if the app is killed."}]},"type":{"type":"intrinsic","name":"boolean"}},{"name":"notificationBody","kind":1024,"comment":{"summary":[{"kind":"text","text":"Subtitle of the foreground service notification."}]},"type":{"type":"intrinsic","name":"string"}},{"name":"notificationColor","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"Color of the foreground service notification. Accepts "},{"kind":"code","text":"`#RRGGBB`"},{"kind":"text","text":" and "},{"kind":"code","text":"`#AARRGGBB`"},{"kind":"text","text":" hex formats."}]},"type":{"type":"intrinsic","name":"string"}},{"name":"notificationTitle","kind":1024,"comment":{"summary":[{"kind":"text","text":"Title of the foreground service notification."}]},"type":{"type":"intrinsic","name":"string"}}]}}},{"name":"PermissionDetailsLocationAndroid","kind":4194304,"type":{"type":"reflection","declaration":{"name":"__type","kind":65536,"children":[{"name":"accuracy","kind":1024,"comment":{"summary":[{"kind":"text","text":"Indicates the type of location provider."}]},"type":{"type":"union","types":[{"type":"literal","value":"fine"},{"type":"literal","value":"coarse"},{"type":"literal","value":"none"}]}},{"name":"scope","kind":1024,"comment":{"summary":[],"blockTags":[{"tag":"@deprecated","content":[{"kind":"text","text":"Use "},{"kind":"code","text":"`accuracy`"},{"kind":"text","text":" field instead."}]}]},"type":{"type":"union","types":[{"type":"literal","value":"fine"},{"type":"literal","value":"coarse"},{"type":"literal","value":"none"}]}}]}}},{"name":"PermissionDetailsLocationIOS","kind":4194304,"type":{"type":"reflection","declaration":{"name":"__type","kind":65536,"children":[{"name":"scope","kind":1024,"comment":{"summary":[{"kind":"text","text":"The scope of granted permission. Indicates when it's possible to use location."}]},"type":{"type":"union","types":[{"type":"literal","value":"whenInUse"},{"type":"literal","value":"always"},{"type":"literal","value":"none"}]}}]}}},{"name":"PermissionHookOptions","kind":4194304,"typeParameters":[{"name":"Options","kind":131072,"type":{"type":"intrinsic","name":"object"}}],"type":{"type":"intersection","types":[{"type":"reference","name":"PermissionHookBehavior"},{"type":"reference","name":"Options"}]}},{"name":"EventEmitter","kind":32,"flags":{"isConst":true},"type":{"type":"reference","name":"EventEmitter"},"defaultValue":"..."},{"name":"enableNetworkProviderAsync","kind":64,"signatures":[{"name":"enableNetworkProviderAsync","kind":4096,"comment":{"summary":[{"kind":"text","text":"Asks the user to turn on high accuracy location mode which enables network provider that uses\nGoogle Play services to improve location accuracy and location-based services."}],"blockTags":[{"tag":"@returns","content":[{"kind":"text","text":"A promise resolving as soon as the user accepts the dialog. Rejects if denied."}]}]},"type":{"type":"reference","typeArguments":[{"type":"intrinsic","name":"void"}],"name":"Promise","qualifiedName":"Promise","package":"typescript"}}]},{"name":"geocodeAsync","kind":64,"signatures":[{"name":"geocodeAsync","kind":4096,"comment":{"summary":[{"kind":"text","text":"Geocode an address string to latitude-longitude location.\n> **Note**: Using the Geocoding web api is no longer supported. Use [Place Autocomplete](https://developers.google.com/maps/documentation/places/web-service/autocomplete) instead.\n\n> **Note**: Geocoding is resource consuming and has to be used reasonably. Creating too many\n> requests at a time can result in an error, so they have to be managed properly.\n> It's also discouraged to use geocoding while the app is in the background and its results won't\n> be shown to the user immediately.\n\n> On Android, you must request a location permission ("},{"kind":"code","text":"`Permissions.LOCATION`"},{"kind":"text","text":") from the user\n> before geocoding can be used."}],"blockTags":[{"tag":"@returns","content":[{"kind":"text","text":"A promise which fulfills with an array (in most cases its size is 1) of ["},{"kind":"code","text":"`LocationGeocodedLocation`"},{"kind":"text","text":"](#locationgeocodedlocation) objects."}]}]},"parameters":[{"name":"address","kind":32768,"comment":{"summary":[{"kind":"text","text":"A string representing address, eg. "},{"kind":"code","text":"`\"Baker Street London\"`"},{"kind":"text","text":"."}]},"type":{"type":"intrinsic","name":"string"}},{"name":"options","kind":32768,"flags":{"isOptional":true},"type":{"type":"reference","name":"LocationGeocodingOptions"}}],"type":{"type":"reference","typeArguments":[{"type":"array","elementType":{"type":"reference","name":"LocationGeocodedLocation"}}],"name":"Promise","qualifiedName":"Promise","package":"typescript"}}]},{"name":"getBackgroundPermissionsAsync","kind":64,"signatures":[{"name":"getBackgroundPermissionsAsync","kind":4096,"comment":{"summary":[{"kind":"text","text":"Checks user's permissions for accessing location while the app is in the background."}],"blockTags":[{"tag":"@returns","content":[{"kind":"text","text":"A promise that fulfills with an object of type [PermissionResponse](#permissionresponse)."}]}]},"type":{"type":"reference","typeArguments":[{"type":"reference","name":"PermissionResponse"}],"name":"Promise","qualifiedName":"Promise","package":"typescript"}}]},{"name":"getCurrentPositionAsync","kind":64,"signatures":[{"name":"getCurrentPositionAsync","kind":4096,"comment":{"summary":[{"kind":"text","text":"Requests for one-time delivery of the user's current location.\nDepending on given "},{"kind":"code","text":"`accuracy`"},{"kind":"text","text":" option it may take some time to resolve,\nespecially when you're inside a building.\n> __Note:__ Calling it causes the location manager to obtain a location fix which may take several\n> seconds. Consider using ["},{"kind":"code","text":"`Location.getLastKnownPositionAsync`"},{"kind":"text","text":"](#locationgetlastknownpositionasyncoptions)\n> if you expect to get a quick response and high accuracy is not required."}],"blockTags":[{"tag":"@returns","content":[{"kind":"text","text":"A promise which fulfills with an object of type ["},{"kind":"code","text":"`LocationObject`"},{"kind":"text","text":"](#locationobject)."}]}]},"parameters":[{"name":"options","kind":32768,"type":{"type":"reference","name":"LocationOptions"},"defaultValue":"{}"}],"type":{"type":"reference","typeArguments":[{"type":"reference","name":"LocationObject"}],"name":"Promise","qualifiedName":"Promise","package":"typescript"}}]},{"name":"getForegroundPermissionsAsync","kind":64,"signatures":[{"name":"getForegroundPermissionsAsync","kind":4096,"comment":{"summary":[{"kind":"text","text":"Checks user's permissions for accessing location while the app is in the foreground."}],"blockTags":[{"tag":"@returns","content":[{"kind":"text","text":"A promise that fulfills with an object of type [PermissionResponse](#permissionresponse)."}]}]},"type":{"type":"reference","typeArguments":[{"type":"reference","name":"LocationPermissionResponse"}],"name":"Promise","qualifiedName":"Promise","package":"typescript"}}]},{"name":"getHeadingAsync","kind":64,"signatures":[{"name":"getHeadingAsync","kind":4096,"comment":{"summary":[{"kind":"text","text":"Gets the current heading information from the device. To simplify, it calls "},{"kind":"code","text":"`watchHeadingAsync`"},{"kind":"text","text":"\nand waits for a couple of updates, and then returns the one that is accurate enough."}],"blockTags":[{"tag":"@returns","content":[{"kind":"text","text":"A promise which fulfills with an object of type [LocationHeadingObject](#locationheadingobject)."}]}]},"type":{"type":"reference","typeArguments":[{"type":"reference","name":"LocationHeadingObject"}],"name":"Promise","qualifiedName":"Promise","package":"typescript"}}]},{"name":"getLastKnownPositionAsync","kind":64,"signatures":[{"name":"getLastKnownPositionAsync","kind":4096,"comment":{"summary":[{"kind":"text","text":"Gets the last known position of the device or "},{"kind":"code","text":"`null`"},{"kind":"text","text":" if it's not available or doesn't match given\nrequirements such as maximum age or required accuracy.\nIt's considered to be faster than "},{"kind":"code","text":"`getCurrentPositionAsync`"},{"kind":"text","text":" as it doesn't request for the current\nlocation, but keep in mind the returned location may not be up-to-date."}],"blockTags":[{"tag":"@returns","content":[{"kind":"text","text":"A promise which fulfills with an object of type [LocationObject](#locationobject) or\n"},{"kind":"code","text":"`null`"},{"kind":"text","text":" if it's not available or doesn't match given requirements such as maximum age or required\naccuracy."}]}]},"parameters":[{"name":"options","kind":32768,"type":{"type":"reference","name":"LocationLastKnownOptions"},"defaultValue":"{}"}],"type":{"type":"reference","typeArguments":[{"type":"union","types":[{"type":"reference","name":"LocationObject"},{"type":"literal","value":null}]}],"name":"Promise","qualifiedName":"Promise","package":"typescript"}}]},{"name":"getPermissionsAsync","kind":64,"signatures":[{"name":"getPermissionsAsync","kind":4096,"comment":{"summary":[{"kind":"text","text":"Checks user's permissions for accessing location."}],"blockTags":[{"tag":"@returns","content":[{"kind":"text","text":"A promise that fulfills with an object of type [LocationPermissionResponse](#locationpermissionresponse)."}]},{"tag":"@deprecated","content":[{"kind":"text","text":"Use ["},{"kind":"code","text":"`getForegroundPermissionsAsync`"},{"kind":"text","text":"](#locationgetforegroundpermissionsasync) or ["},{"kind":"code","text":"`getBackgroundPermissionsAsync`"},{"kind":"text","text":"](#locationgetbackgroundpermissionsasync) instead."}]}]},"type":{"type":"reference","typeArguments":[{"type":"reference","name":"LocationPermissionResponse"}],"name":"Promise","qualifiedName":"Promise","package":"typescript"}}]},{"name":"getProviderStatusAsync","kind":64,"signatures":[{"name":"getProviderStatusAsync","kind":4096,"comment":{"summary":[{"kind":"text","text":"Check status of location providers."}],"blockTags":[{"tag":"@returns","content":[{"kind":"text","text":"A promise which fulfills with an object of type [LocationProviderStatus](#locationproviderstatus)."}]}]},"type":{"type":"reference","typeArguments":[{"type":"reference","name":"LocationProviderStatus"}],"name":"Promise","qualifiedName":"Promise","package":"typescript"}}]},{"name":"hasServicesEnabledAsync","kind":64,"signatures":[{"name":"hasServicesEnabledAsync","kind":4096,"comment":{"summary":[{"kind":"text","text":"Checks whether location services are enabled by the user."}],"blockTags":[{"tag":"@returns","content":[{"kind":"text","text":"A promise which fulfills to "},{"kind":"code","text":"`true`"},{"kind":"text","text":" if location services are enabled on the device,\nor "},{"kind":"code","text":"`false`"},{"kind":"text","text":" if not."}]}]},"type":{"type":"reference","typeArguments":[{"type":"intrinsic","name":"boolean"}],"name":"Promise","qualifiedName":"Promise","package":"typescript"}}]},{"name":"hasStartedGeofencingAsync","kind":64,"signatures":[{"name":"hasStartedGeofencingAsync","kind":4096,"comment":{"summary":[],"blockTags":[{"tag":"@returns","content":[{"kind":"text","text":"A promise which fulfills with boolean value indicating whether the geofencing task is\nstarted or not."}]}]},"parameters":[{"name":"taskName","kind":32768,"comment":{"summary":[{"kind":"text","text":"Name of the geofencing task to check."}]},"type":{"type":"intrinsic","name":"string"}}],"type":{"type":"reference","typeArguments":[{"type":"intrinsic","name":"boolean"}],"name":"Promise","qualifiedName":"Promise","package":"typescript"}}]},{"name":"hasStartedLocationUpdatesAsync","kind":64,"signatures":[{"name":"hasStartedLocationUpdatesAsync","kind":4096,"comment":{"summary":[],"blockTags":[{"tag":"@returns","content":[{"kind":"text","text":"A promise which fulfills with boolean value indicating whether the location task is\nstarted or not."}]}]},"parameters":[{"name":"taskName","kind":32768,"comment":{"summary":[{"kind":"text","text":"Name of the location task to check."}]},"type":{"type":"intrinsic","name":"string"}}],"type":{"type":"reference","typeArguments":[{"type":"intrinsic","name":"boolean"}],"name":"Promise","qualifiedName":"Promise","package":"typescript"}}]},{"name":"installWebGeolocationPolyfill","kind":64,"signatures":[{"name":"installWebGeolocationPolyfill","kind":4096,"comment":{"summary":[{"kind":"text","text":"Polyfills "},{"kind":"code","text":"`navigator.geolocation`"},{"kind":"text","text":" for interop with the core React Native and Web API approach to geolocation."}]},"type":{"type":"intrinsic","name":"void"}}]},{"name":"isBackgroundLocationAvailableAsync","kind":64,"signatures":[{"name":"isBackgroundLocationAvailableAsync","kind":4096,"type":{"type":"reference","typeArguments":[{"type":"intrinsic","name":"boolean"}],"name":"Promise","qualifiedName":"Promise","package":"typescript"}}]},{"name":"requestBackgroundPermissionsAsync","kind":64,"signatures":[{"name":"requestBackgroundPermissionsAsync","kind":4096,"comment":{"summary":[{"kind":"text","text":"Asks the user to grant permissions for location while the app is in the background.\nOn __Android 11 or higher__: this method will open the system settings page - before that happens\nyou should explain to the user why your application needs background location permission.\nFor example, you can use "},{"kind":"code","text":"`Modal`"},{"kind":"text","text":" component from "},{"kind":"code","text":"`react-native`"},{"kind":"text","text":" to do that.\n> __Note__: Foreground permissions should be granted before asking for the background permissions\n(your app can't obtain background permission without foreground permission)."}],"blockTags":[{"tag":"@returns","content":[{"kind":"text","text":"A promise that fulfills with an object of type [PermissionResponse](#permissionresponse)."}]}]},"type":{"type":"reference","typeArguments":[{"type":"reference","name":"PermissionResponse"}],"name":"Promise","qualifiedName":"Promise","package":"typescript"}}]},{"name":"requestForegroundPermissionsAsync","kind":64,"signatures":[{"name":"requestForegroundPermissionsAsync","kind":4096,"comment":{"summary":[{"kind":"text","text":"Asks the user to grant permissions for location while the app is in the foreground."}],"blockTags":[{"tag":"@returns","content":[{"kind":"text","text":"A promise that fulfills with an object of type [PermissionResponse](#permissionresponse)."}]}]},"type":{"type":"reference","typeArguments":[{"type":"reference","name":"LocationPermissionResponse"}],"name":"Promise","qualifiedName":"Promise","package":"typescript"}}]},{"name":"requestPermissionsAsync","kind":64,"signatures":[{"name":"requestPermissionsAsync","kind":4096,"comment":{"summary":[{"kind":"text","text":"Asks the user to grant permissions for location."}],"blockTags":[{"tag":"@returns","content":[{"kind":"text","text":"A promise that fulfills with an object of type [LocationPermissionResponse](#locationpermissionresponse)."}]},{"tag":"@deprecated","content":[{"kind":"text","text":"Use ["},{"kind":"code","text":"`requestForegroundPermissionsAsync`"},{"kind":"text","text":"](#locationrequestforegroundpermissionsasync) or ["},{"kind":"code","text":"`requestBackgroundPermissionsAsync`"},{"kind":"text","text":"](#locationrequestbackgroundpermissionsasync) instead."}]}]},"type":{"type":"reference","typeArguments":[{"type":"reference","name":"LocationPermissionResponse"}],"name":"Promise","qualifiedName":"Promise","package":"typescript"}}]},{"name":"reverseGeocodeAsync","kind":64,"signatures":[{"name":"reverseGeocodeAsync","kind":4096,"comment":{"summary":[{"kind":"text","text":"Reverse geocode a location to postal address.\n> **Note**: Using the Geocoding web api is no longer supported. Use [Place Autocomplete](https://developers.google.com/maps/documentation/places/web-service/autocomplete) instead.\n\n> **Note**: Geocoding is resource consuming and has to be used reasonably. Creating too many\n> requests at a time can result in an error, so they have to be managed properly.\n> It's also discouraged to use geocoding while the app is in the background and its results won't\n> be shown to the user immediately.\n\n> On Android, you must request a location permission ("},{"kind":"code","text":"`Permissions.LOCATION`"},{"kind":"text","text":") from the user\n> before geocoding can be used."}],"blockTags":[{"tag":"@returns","content":[{"kind":"text","text":"A promise which fulfills with an array (in most cases its size is 1) of ["},{"kind":"code","text":"`LocationGeocodedAddress`"},{"kind":"text","text":"](#locationgeocodedaddress) objects."}]}]},"parameters":[{"name":"location","kind":32768,"comment":{"summary":[{"kind":"text","text":"An object representing a location."}]},"type":{"type":"reference","typeArguments":[{"type":"reference","name":"LocationGeocodedLocation"},{"type":"union","types":[{"type":"literal","value":"latitude"},{"type":"literal","value":"longitude"}]}],"name":"Pick","qualifiedName":"Pick","package":"typescript"}},{"name":"options","kind":32768,"flags":{"isOptional":true},"type":{"type":"reference","name":"LocationGeocodingOptions"}}],"type":{"type":"reference","typeArguments":[{"type":"array","elementType":{"type":"reference","name":"LocationGeocodedAddress"}}],"name":"Promise","qualifiedName":"Promise","package":"typescript"}}]},{"name":"setGoogleApiKey","kind":64,"signatures":[{"name":"setGoogleApiKey","kind":4096,"comment":{"summary":[],"blockTags":[{"tag":"@deprecated","content":[{"kind":"text","text":"The Geocoding web api is no longer available from SDK 49 onwards. Use [Place Autocomplete](https://developers.google.com/maps/documentation/places/web-service/autocomplete) instead."}]}]},"parameters":[{"name":"_apiKey","kind":32768,"type":{"type":"intrinsic","name":"string"}}],"type":{"type":"intrinsic","name":"void"}}]},{"name":"startGeofencingAsync","kind":64,"signatures":[{"name":"startGeofencingAsync","kind":4096,"comment":{"summary":[{"kind":"text","text":"Starts geofencing for given regions. When the new event comes, the task with specified name will\nbe called with the region that the device enter to or exit from.\nIf you want to add or remove regions from already running geofencing task, you can just call\n"},{"kind":"code","text":"`startGeofencingAsync`"},{"kind":"text","text":" again with the new array of regions.\n\n# Task parameters\n\nGeofencing task will be receiving following data:\n - "},{"kind":"code","text":"`eventType`"},{"kind":"text","text":" - Indicates the reason for calling the task, which can be triggered by entering or exiting the region.\n See [GeofencingEventType](#geofencingeventtype).\n - "},{"kind":"code","text":"`region`"},{"kind":"text","text":" - Object containing details about updated region. See [LocationRegion](#locationregion) for more details."}],"blockTags":[{"tag":"@returns","content":[{"kind":"text","text":"A promise resolving as soon as the task is registered."}]},{"tag":"@example","content":[{"kind":"code","text":"```ts\nimport { GeofencingEventType } from 'expo-location';\nimport * as TaskManager from 'expo-task-manager';\n\n TaskManager.defineTask(YOUR_TASK_NAME, ({ data: { eventType, region }, error }) => {\n if (error) {\n // check `error.message` for more details.\n return;\n }\n if (eventType === GeofencingEventType.Enter) {\n console.log(\"You've entered region:\", region);\n } else if (eventType === GeofencingEventType.Exit) {\n console.log(\"You've left region:\", region);\n }\n});\n```"}]}]},"parameters":[{"name":"taskName","kind":32768,"comment":{"summary":[{"kind":"text","text":"Name of the task that will be called when the device enters or exits from specified regions."}]},"type":{"type":"intrinsic","name":"string"}},{"name":"regions","kind":32768,"comment":{"summary":[{"kind":"text","text":"Array of region objects to be geofenced."}]},"type":{"type":"array","elementType":{"type":"reference","name":"LocationRegion"}},"defaultValue":"[]"}],"type":{"type":"reference","typeArguments":[{"type":"intrinsic","name":"void"}],"name":"Promise","qualifiedName":"Promise","package":"typescript"}}]},{"name":"startLocationUpdatesAsync","kind":64,"signatures":[{"name":"startLocationUpdatesAsync","kind":4096,"comment":{"summary":[{"kind":"text","text":"Registers for receiving location updates that can also come when the app is in the background.\n\n# Task parameters\n\nBackground location task will be receiving following data:\n- "},{"kind":"code","text":"`locations`"},{"kind":"text","text":" - An array of the new locations.\n\n"},{"kind":"code","text":"```ts\nimport * as TaskManager from 'expo-task-manager';\n\nTaskManager.defineTask(YOUR_TASK_NAME, ({ data: { locations }, error }) => {\n if (error) {\n // check `error.message` for more details.\n return;\n }\n console.log('Received new locations', locations);\n});\n```"}],"blockTags":[{"tag":"@returns","content":[{"kind":"text","text":"A promise resolving once the task with location updates is registered."}]}]},"parameters":[{"name":"taskName","kind":32768,"comment":{"summary":[{"kind":"text","text":"Name of the task receiving location updates."}]},"type":{"type":"intrinsic","name":"string"}},{"name":"options","kind":32768,"comment":{"summary":[{"kind":"text","text":"An object of options passed to the location manager."}]},"type":{"type":"reference","name":"LocationTaskOptions"},"defaultValue":"..."}],"type":{"type":"reference","typeArguments":[{"type":"intrinsic","name":"void"}],"name":"Promise","qualifiedName":"Promise","package":"typescript"}}]},{"name":"stopGeofencingAsync","kind":64,"signatures":[{"name":"stopGeofencingAsync","kind":4096,"comment":{"summary":[{"kind":"text","text":"Stops geofencing for specified task. It unregisters the background task so the app will not be\nreceiving any updates, especially in the background."}],"blockTags":[{"tag":"@returns","content":[{"kind":"text","text":"A promise resolving as soon as the task is unregistered."}]}]},"parameters":[{"name":"taskName","kind":32768,"comment":{"summary":[{"kind":"text","text":"Name of the task to unregister."}]},"type":{"type":"intrinsic","name":"string"}}],"type":{"type":"reference","typeArguments":[{"type":"intrinsic","name":"void"}],"name":"Promise","qualifiedName":"Promise","package":"typescript"}}]},{"name":"stopLocationUpdatesAsync","kind":64,"signatures":[{"name":"stopLocationUpdatesAsync","kind":4096,"comment":{"summary":[{"kind":"text","text":"Stops geofencing for specified task."}],"blockTags":[{"tag":"@returns","content":[{"kind":"text","text":"A promise resolving as soon as the task is unregistered."}]}]},"parameters":[{"name":"taskName","kind":32768,"comment":{"summary":[{"kind":"text","text":"Name of the background location task to stop."}]},"type":{"type":"intrinsic","name":"string"}}],"type":{"type":"reference","typeArguments":[{"type":"intrinsic","name":"void"}],"name":"Promise","qualifiedName":"Promise","package":"typescript"}}]},{"name":"useBackgroundPermissions","kind":64,"signatures":[{"name":"useBackgroundPermissions","kind":4096,"comment":{"summary":[{"kind":"text","text":"Check or request permissions for the background location.\nThis uses both "},{"kind":"code","text":"`requestBackgroundPermissionsAsync`"},{"kind":"text","text":" and "},{"kind":"code","text":"`getBackgroundPermissionsAsync`"},{"kind":"text","text":" to\ninteract with the permissions."}],"blockTags":[{"tag":"@example","content":[{"kind":"code","text":"```ts\nconst [status, requestPermission] = Location.useBackgroundPermissions();\n```"}]}]},"parameters":[{"name":"options","kind":32768,"flags":{"isOptional":true},"type":{"type":"reference","typeArguments":[{"type":"intrinsic","name":"object"}],"name":"PermissionHookOptions"}}],"type":{"type":"tuple","elements":[{"type":"union","types":[{"type":"literal","value":null},{"type":"reference","name":"PermissionResponse"}]},{"type":"reference","typeArguments":[{"type":"reference","name":"PermissionResponse"}],"name":"RequestPermissionMethod"},{"type":"reference","typeArguments":[{"type":"reference","name":"PermissionResponse"}],"name":"GetPermissionMethod"}]}}]},{"name":"useForegroundPermissions","kind":64,"signatures":[{"name":"useForegroundPermissions","kind":4096,"comment":{"summary":[{"kind":"text","text":"Check or request permissions for the foreground location.\nThis uses both "},{"kind":"code","text":"`requestForegroundPermissionsAsync`"},{"kind":"text","text":" and "},{"kind":"code","text":"`getForegroundPermissionsAsync`"},{"kind":"text","text":" to interact with the permissions."}],"blockTags":[{"tag":"@example","content":[{"kind":"code","text":"```ts\nconst [status, requestPermission] = Location.useForegroundPermissions();\n```"}]}]},"parameters":[{"name":"options","kind":32768,"flags":{"isOptional":true},"type":{"type":"reference","typeArguments":[{"type":"intrinsic","name":"object"}],"name":"PermissionHookOptions"}}],"type":{"type":"tuple","elements":[{"type":"union","types":[{"type":"literal","value":null},{"type":"reference","name":"LocationPermissionResponse"}]},{"type":"reference","typeArguments":[{"type":"reference","name":"LocationPermissionResponse"}],"name":"RequestPermissionMethod"},{"type":"reference","typeArguments":[{"type":"reference","name":"LocationPermissionResponse"}],"name":"GetPermissionMethod"}]}}]},{"name":"watchHeadingAsync","kind":64,"signatures":[{"name":"watchHeadingAsync","kind":4096,"comment":{"summary":[{"kind":"text","text":"Subscribe to compass updates from the device."}],"blockTags":[{"tag":"@returns","content":[{"kind":"text","text":"A promise which fulfills with a ["},{"kind":"code","text":"`LocationSubscription`"},{"kind":"text","text":"](#locationsubscription) object."}]}]},"parameters":[{"name":"callback","kind":32768,"comment":{"summary":[{"kind":"text","text":"This function is called on each compass update. It receives an object of type\n[LocationHeadingObject](#locationheadingobject) as the first argument."}]},"type":{"type":"reference","name":"LocationHeadingCallback"}}],"type":{"type":"reference","typeArguments":[{"type":"reference","name":"LocationSubscription"}],"name":"Promise","qualifiedName":"Promise","package":"typescript"}}]},{"name":"watchPositionAsync","kind":64,"signatures":[{"name":"watchPositionAsync","kind":4096,"comment":{"summary":[{"kind":"text","text":"Subscribe to location updates from the device. Please note that updates will only occur while the\napplication is in the foreground. To get location updates while in background you'll need to use\n[Location.startLocationUpdatesAsync](#locationstartlocationupdatesasynctaskname-options)."}],"blockTags":[{"tag":"@returns","content":[{"kind":"text","text":"A promise which fulfills with a ["},{"kind":"code","text":"`LocationSubscription`"},{"kind":"text","text":"](#locationsubscription) object."}]}]},"parameters":[{"name":"options","kind":32768,"type":{"type":"reference","name":"LocationOptions"}},{"name":"callback","kind":32768,"comment":{"summary":[{"kind":"text","text":"This function is called on each location update. It receives an object of type\n["},{"kind":"code","text":"`LocationObject`"},{"kind":"text","text":"](#locationobject) as the first argument."}]},"type":{"type":"reference","name":"LocationCallback"}}],"type":{"type":"reference","typeArguments":[{"type":"reference","name":"LocationSubscription"}],"name":"Promise","qualifiedName":"Promise","package":"typescript"}}]}]}
\ No newline at end of file
diff --git a/docs/public/static/data/unversioned/expo-magnetometer.json b/docs/public/static/data/unversioned/expo-magnetometer.json
index a129a21c2aee1..22cc2348106de 100644
--- a/docs/public/static/data/unversioned/expo-magnetometer.json
+++ b/docs/public/static/data/unversioned/expo-magnetometer.json
@@ -1 +1 @@
-{"name":"expo-magnetometer","kind":1,"children":[{"name":"default","kind":128,"comment":{"summary":[{"kind":"text","text":"A base class for subscribable sensors. The events emitted by this class are measurements\nspecified by the parameter type "},{"kind":"code","text":"`Measurement`"},{"kind":"text","text":"."}]},"children":[{"name":"constructor","kind":512,"signatures":[{"name":"new default","kind":16384,"typeParameter":[{"name":"Measurement","kind":131072}],"parameters":[{"name":"nativeSensorModule","kind":32768,"type":{"type":"intrinsic","name":"any"}},{"name":"nativeEventName","kind":32768,"type":{"type":"intrinsic","name":"string"}}],"type":{"type":"reference","typeArguments":[{"type":"reference","name":"Measurement"}],"name":"default"}}]},{"name":"_listenerCount","kind":1024,"type":{"type":"intrinsic","name":"number"}},{"name":"_nativeEmitter","kind":1024,"type":{"type":"reference","name":"EventEmitter"}},{"name":"_nativeEventName","kind":1024,"type":{"type":"intrinsic","name":"string"}},{"name":"_nativeModule","kind":1024,"type":{"type":"intrinsic","name":"any"}},{"name":"addListener","kind":2048,"signatures":[{"name":"addListener","kind":4096,"parameters":[{"name":"listener","kind":32768,"type":{"type":"reference","typeArguments":[{"type":"reference","name":"Measurement"}],"name":"Listener"}}],"type":{"type":"reference","name":"Subscription"}}]},{"name":"getListenerCount","kind":2048,"signatures":[{"name":"getListenerCount","kind":4096,"comment":{"summary":[{"kind":"text","text":"Returns the registered listeners count."}]},"type":{"type":"intrinsic","name":"number"}}]},{"name":"getPermissionsAsync","kind":2048,"signatures":[{"name":"getPermissionsAsync","kind":4096,"comment":{"summary":[{"kind":"text","text":"Checks user's permissions for accessing sensor."}]},"type":{"type":"reference","typeArguments":[{"type":"reference","name":"PermissionResponse"}],"name":"Promise","qualifiedName":"Promise","package":"typescript"}}]},{"name":"hasListeners","kind":2048,"signatures":[{"name":"hasListeners","kind":4096,"comment":{"summary":[{"kind":"text","text":"Returns boolean which signifies if sensor has any listeners registered."}]},"type":{"type":"intrinsic","name":"boolean"}}]},{"name":"isAvailableAsync","kind":2048,"signatures":[{"name":"isAvailableAsync","kind":4096,"comment":{"summary":[{"kind":"text","text":"> **info** You should always check the sensor availability before attempting to use it."}],"blockTags":[{"tag":"@returns","content":[{"kind":"text","text":"A promise that resolves to a "},{"kind":"code","text":"`boolean`"},{"kind":"text","text":" denoting the availability of the sensor."}]}]},"type":{"type":"reference","typeArguments":[{"type":"intrinsic","name":"boolean"}],"name":"Promise","qualifiedName":"Promise","package":"typescript"}}]},{"name":"removeAllListeners","kind":2048,"signatures":[{"name":"removeAllListeners","kind":4096,"comment":{"summary":[{"kind":"text","text":"Removes all registered listeners."}]},"type":{"type":"intrinsic","name":"void"}}]},{"name":"removeSubscription","kind":2048,"signatures":[{"name":"removeSubscription","kind":4096,"comment":{"summary":[{"kind":"text","text":"Removes the given subscription."}]},"parameters":[{"name":"subscription","kind":32768,"comment":{"summary":[{"kind":"text","text":"A subscription to remove."}]},"type":{"type":"reference","name":"Subscription"}}],"type":{"type":"intrinsic","name":"void"}}]},{"name":"requestPermissionsAsync","kind":2048,"signatures":[{"name":"requestPermissionsAsync","kind":4096,"comment":{"summary":[{"kind":"text","text":"Asks the user to grant permissions for accessing sensor."}]},"type":{"type":"reference","typeArguments":[{"type":"reference","name":"PermissionResponse"}],"name":"Promise","qualifiedName":"Promise","package":"typescript"}}]},{"name":"setUpdateInterval","kind":2048,"signatures":[{"name":"setUpdateInterval","kind":4096,"comment":{"summary":[{"kind":"text","text":"Set the sensor update interval."}]},"parameters":[{"name":"intervalMs","kind":32768,"comment":{"summary":[{"kind":"text","text":"Desired interval in milliseconds between sensor updates.\n> Starting from Android 12 (API level 31), the system has a 200ms limit for each sensor updates.\n>\n> If you need an update interval less than 200ms, you should:\n> * add "},{"kind":"code","text":"`android.permission.HIGH_SAMPLING_RATE_SENSORS`"},{"kind":"text","text":" to [**app.json** "},{"kind":"code","text":"`permissions`"},{"kind":"text","text":" field](/versions/latest/config/app/#permissions)\n> * or if you are using bare workflow, add "},{"kind":"code","text":"``"},{"kind":"text","text":" to **AndroidManifest.xml**."}]},"type":{"type":"intrinsic","name":"number"}}],"type":{"type":"intrinsic","name":"void"}}]}],"typeParameters":[{"name":"Measurement","kind":131072}],"extendedBy":[{"type":"reference","name":"MagnetometerSensor"}]},{"name":"default","kind":32,"type":{"type":"reference","name":"MagnetometerSensor"}},{"name":"MagnetometerMeasurement","kind":4194304,"comment":{"summary":[{"kind":"text","text":"Each of these keys represents the strength of magnetic field along that particular axis measured in microteslas ("},{"kind":"code","text":"`μT`"},{"kind":"text","text":")."}]},"type":{"type":"reflection","declaration":{"name":"__type","kind":65536,"children":[{"name":"x","kind":1024,"comment":{"summary":[{"kind":"text","text":"Value representing strength of magnetic field recorded in X axis."}]},"type":{"type":"intrinsic","name":"number"}},{"name":"y","kind":1024,"comment":{"summary":[{"kind":"text","text":"Value representing strength of magnetic field recorded in Y axis."}]},"type":{"type":"intrinsic","name":"number"}},{"name":"z","kind":1024,"comment":{"summary":[{"kind":"text","text":"Value representing strength of magnetic field recorded in Z axis."}]},"type":{"type":"intrinsic","name":"number"}}]}}},{"name":"MagnetometerSensor","kind":128,"comment":{"summary":[],"blockTags":[{"tag":"@platform","content":[{"kind":"text","text":"android"}]},{"tag":"@platform","content":[{"kind":"text","text":"ios"}]}]},"children":[{"name":"constructor","kind":512,"signatures":[{"name":"new MagnetometerSensor","kind":16384,"parameters":[{"name":"nativeSensorModule","kind":32768,"type":{"type":"intrinsic","name":"any"}},{"name":"nativeEventName","kind":32768,"type":{"type":"intrinsic","name":"string"}}],"type":{"type":"reference","name":"MagnetometerSensor"},"inheritedFrom":{"type":"reference","name":"default.constructor"}}],"inheritedFrom":{"type":"reference","name":"default.constructor"}},{"name":"_listenerCount","kind":1024,"type":{"type":"intrinsic","name":"number"},"inheritedFrom":{"type":"reference","name":"default._listenerCount"}},{"name":"_nativeEmitter","kind":1024,"type":{"type":"reference","name":"EventEmitter"},"inheritedFrom":{"type":"reference","name":"default._nativeEmitter"}},{"name":"_nativeEventName","kind":1024,"type":{"type":"intrinsic","name":"string"},"inheritedFrom":{"type":"reference","name":"default._nativeEventName"}},{"name":"_nativeModule","kind":1024,"type":{"type":"intrinsic","name":"any"},"inheritedFrom":{"type":"reference","name":"default._nativeModule"}},{"name":"addListener","kind":2048,"signatures":[{"name":"addListener","kind":4096,"comment":{"summary":[{"kind":"text","text":"Subscribe for updates to the magnetometer."}],"blockTags":[{"tag":"@returns","content":[{"kind":"text","text":"A subscription that you can call "},{"kind":"code","text":"`remove()`"},{"kind":"text","text":" on when you would like to unsubscribe the listener."}]}]},"parameters":[{"name":"listener","kind":32768,"comment":{"summary":[{"kind":"text","text":"A callback that is invoked when a barometer update is available. When invoked, the listener is provided with a single argument that is "},{"kind":"code","text":"`MagnetometerMeasurement`"},{"kind":"text","text":"."}]},"type":{"type":"reference","typeArguments":[{"type":"reference","name":"MagnetometerMeasurement"}],"name":"Listener"}}],"type":{"type":"reference","name":"Subscription"},"overwrites":{"type":"reference","name":"default.addListener"}}],"overwrites":{"type":"reference","name":"default.addListener"}},{"name":"getListenerCount","kind":2048,"signatures":[{"name":"getListenerCount","kind":4096,"comment":{"summary":[{"kind":"text","text":"Returns the registered listeners count."}]},"type":{"type":"intrinsic","name":"number"},"inheritedFrom":{"type":"reference","name":"default.getListenerCount"}}],"inheritedFrom":{"type":"reference","name":"default.getListenerCount"}},{"name":"getPermissionsAsync","kind":2048,"signatures":[{"name":"getPermissionsAsync","kind":4096,"comment":{"summary":[{"kind":"text","text":"Checks user's permissions for accessing sensor."}]},"type":{"type":"reference","typeArguments":[{"type":"reference","name":"PermissionResponse"}],"name":"Promise","qualifiedName":"Promise","package":"typescript"},"inheritedFrom":{"type":"reference","name":"default.getPermissionsAsync"}}],"inheritedFrom":{"type":"reference","name":"default.getPermissionsAsync"}},{"name":"hasListeners","kind":2048,"signatures":[{"name":"hasListeners","kind":4096,"comment":{"summary":[{"kind":"text","text":"Returns boolean which signifies if sensor has any listeners registered."}]},"type":{"type":"intrinsic","name":"boolean"},"inheritedFrom":{"type":"reference","name":"default.hasListeners"}}],"inheritedFrom":{"type":"reference","name":"default.hasListeners"}},{"name":"isAvailableAsync","kind":2048,"signatures":[{"name":"isAvailableAsync","kind":4096,"comment":{"summary":[{"kind":"text","text":"> **info** You should always check the sensor availability before attempting to use it.\n\nCheck the availability of the device barometer. Requires at least Android 2.3 (API Level 9) and iOS 8."}],"blockTags":[{"tag":"@returns","content":[{"kind":"text","text":"A promise that resolves to a "},{"kind":"code","text":"`boolean`"},{"kind":"text","text":" denoting the availability of the sensor."}]}]},"type":{"type":"reference","typeArguments":[{"type":"intrinsic","name":"boolean"}],"name":"Promise","qualifiedName":"Promise","package":"typescript"},"overwrites":{"type":"reference","name":"default.isAvailableAsync"}}],"overwrites":{"type":"reference","name":"default.isAvailableAsync"}},{"name":"removeAllListeners","kind":2048,"signatures":[{"name":"removeAllListeners","kind":4096,"comment":{"summary":[{"kind":"text","text":"Removes all registered listeners."}]},"type":{"type":"intrinsic","name":"void"},"inheritedFrom":{"type":"reference","name":"default.removeAllListeners"}}],"inheritedFrom":{"type":"reference","name":"default.removeAllListeners"}},{"name":"removeSubscription","kind":2048,"signatures":[{"name":"removeSubscription","kind":4096,"comment":{"summary":[{"kind":"text","text":"Removes the given subscription."}]},"parameters":[{"name":"subscription","kind":32768,"comment":{"summary":[{"kind":"text","text":"A subscription to remove."}]},"type":{"type":"reference","name":"Subscription"}}],"type":{"type":"intrinsic","name":"void"},"inheritedFrom":{"type":"reference","name":"default.removeSubscription"}}],"inheritedFrom":{"type":"reference","name":"default.removeSubscription"}},{"name":"requestPermissionsAsync","kind":2048,"signatures":[{"name":"requestPermissionsAsync","kind":4096,"comment":{"summary":[{"kind":"text","text":"Asks the user to grant permissions for accessing sensor."}]},"type":{"type":"reference","typeArguments":[{"type":"reference","name":"PermissionResponse"}],"name":"Promise","qualifiedName":"Promise","package":"typescript"},"inheritedFrom":{"type":"reference","name":"default.requestPermissionsAsync"}}],"inheritedFrom":{"type":"reference","name":"default.requestPermissionsAsync"}},{"name":"setUpdateInterval","kind":2048,"signatures":[{"name":"setUpdateInterval","kind":4096,"comment":{"summary":[{"kind":"text","text":"Set the sensor update interval."}]},"parameters":[{"name":"intervalMs","kind":32768,"comment":{"summary":[{"kind":"text","text":"Desired interval in milliseconds between sensor updates.\n> Starting from Android 12 (API level 31), the system has a 200ms limit for each sensor updates.\n>\n> If you need an update interval less than 200ms, you should:\n> * add "},{"kind":"code","text":"`android.permission.HIGH_SAMPLING_RATE_SENSORS`"},{"kind":"text","text":" to [**app.json** "},{"kind":"code","text":"`permissions`"},{"kind":"text","text":" field](/versions/latest/config/app/#permissions)\n> * or if you are using bare workflow, add "},{"kind":"code","text":"``"},{"kind":"text","text":" to **AndroidManifest.xml**."}]},"type":{"type":"intrinsic","name":"number"}}],"type":{"type":"intrinsic","name":"void"},"inheritedFrom":{"type":"reference","name":"default.setUpdateInterval"}}],"inheritedFrom":{"type":"reference","name":"default.setUpdateInterval"}}],"extendedTypes":[{"type":"reference","typeArguments":[{"type":"reference","name":"MagnetometerMeasurement"}],"name":"default"}]},{"name":"PermissionExpiration","kind":4194304,"comment":{"summary":[{"kind":"text","text":"Permission expiration time. Currently, all permissions are granted permanently."}]},"type":{"type":"union","types":[{"type":"literal","value":"never"},{"type":"intrinsic","name":"number"}]}},{"name":"PermissionResponse","kind":256,"comment":{"summary":[{"kind":"text","text":"An object obtained by permissions get and request functions."}]},"children":[{"name":"canAskAgain","kind":1024,"comment":{"summary":[{"kind":"text","text":"Indicates if user can be asked again for specific permission.\nIf not, one should be directed to the Settings app\nin order to enable/disable the permission."}]},"type":{"type":"intrinsic","name":"boolean"}},{"name":"expires","kind":1024,"comment":{"summary":[{"kind":"text","text":"Determines time when the permission expires."}]},"type":{"type":"reference","name":"PermissionExpiration"}},{"name":"granted","kind":1024,"comment":{"summary":[{"kind":"text","text":"A convenience boolean that indicates if the permission is granted."}]},"type":{"type":"intrinsic","name":"boolean"}},{"name":"status","kind":1024,"comment":{"summary":[{"kind":"text","text":"Determines the status of the permission."}]},"type":{"type":"reference","name":"PermissionStatus"}}]},{"name":"PermissionStatus","kind":8,"children":[{"name":"DENIED","kind":16,"comment":{"summary":[{"kind":"text","text":"User has denied the permission."}]},"type":{"type":"literal","value":"denied"}},{"name":"GRANTED","kind":16,"comment":{"summary":[{"kind":"text","text":"User has granted the permission."}]},"type":{"type":"literal","value":"granted"}},{"name":"UNDETERMINED","kind":16,"comment":{"summary":[{"kind":"text","text":"User hasn't granted or denied the permission yet."}]},"type":{"type":"literal","value":"undetermined"}}]},{"name":"Subscription","kind":4194304,"type":{"type":"reflection","declaration":{"name":"__type","kind":65536,"children":[{"name":"remove","kind":1024,"type":{"type":"reflection","declaration":{"name":"__type","kind":65536,"signatures":[{"name":"__type","kind":4096,"comment":{"summary":[{"kind":"text","text":"A method to unsubscribe the listener."}]},"type":{"type":"intrinsic","name":"void"}}]}}}]}}}]}
\ No newline at end of file
+{"name":"expo-magnetometer","kind":1,"children":[{"name":"default","kind":128,"comment":{"summary":[{"kind":"text","text":"A base class for subscribable sensors. The events emitted by this class are measurements\nspecified by the parameter type "},{"kind":"code","text":"`Measurement`"},{"kind":"text","text":"."}]},"children":[{"name":"constructor","kind":512,"signatures":[{"name":"new default","kind":16384,"typeParameter":[{"name":"Measurement","kind":131072}],"parameters":[{"name":"nativeSensorModule","kind":32768,"type":{"type":"intrinsic","name":"any"}},{"name":"nativeEventName","kind":32768,"type":{"type":"intrinsic","name":"string"}}],"type":{"type":"reference","typeArguments":[{"type":"reference","name":"Measurement"}],"name":"default"}}]},{"name":"_listenerCount","kind":1024,"type":{"type":"intrinsic","name":"number"}},{"name":"_nativeEmitter","kind":1024,"type":{"type":"reference","name":"EventEmitter"}},{"name":"_nativeEventName","kind":1024,"type":{"type":"intrinsic","name":"string"}},{"name":"_nativeModule","kind":1024,"type":{"type":"intrinsic","name":"any"}},{"name":"addListener","kind":2048,"signatures":[{"name":"addListener","kind":4096,"parameters":[{"name":"listener","kind":32768,"type":{"type":"reference","typeArguments":[{"type":"reference","name":"Measurement"}],"name":"Listener"}}],"type":{"type":"reference","name":"Subscription"}}]},{"name":"getListenerCount","kind":2048,"signatures":[{"name":"getListenerCount","kind":4096,"comment":{"summary":[{"kind":"text","text":"Returns the registered listeners count."}]},"type":{"type":"intrinsic","name":"number"}}]},{"name":"getPermissionsAsync","kind":2048,"signatures":[{"name":"getPermissionsAsync","kind":4096,"comment":{"summary":[{"kind":"text","text":"Checks user's permissions for accessing sensor."}]},"type":{"type":"reference","typeArguments":[{"type":"reference","name":"PermissionResponse"}],"name":"Promise","qualifiedName":"Promise","package":"typescript"}}]},{"name":"hasListeners","kind":2048,"signatures":[{"name":"hasListeners","kind":4096,"comment":{"summary":[{"kind":"text","text":"Returns boolean which signifies if sensor has any listeners registered."}]},"type":{"type":"intrinsic","name":"boolean"}}]},{"name":"isAvailableAsync","kind":2048,"signatures":[{"name":"isAvailableAsync","kind":4096,"comment":{"summary":[{"kind":"text","text":"> **info** You should always check the sensor availability before attempting to use it."}],"blockTags":[{"tag":"@returns","content":[{"kind":"text","text":"A promise that resolves to a "},{"kind":"code","text":"`boolean`"},{"kind":"text","text":" denoting the availability of the sensor."}]}]},"type":{"type":"reference","typeArguments":[{"type":"intrinsic","name":"boolean"}],"name":"Promise","qualifiedName":"Promise","package":"typescript"}}]},{"name":"removeAllListeners","kind":2048,"signatures":[{"name":"removeAllListeners","kind":4096,"comment":{"summary":[{"kind":"text","text":"Removes all registered listeners."}]},"type":{"type":"intrinsic","name":"void"}}]},{"name":"removeSubscription","kind":2048,"signatures":[{"name":"removeSubscription","kind":4096,"comment":{"summary":[{"kind":"text","text":"Removes the given subscription."}]},"parameters":[{"name":"subscription","kind":32768,"comment":{"summary":[{"kind":"text","text":"A subscription to remove."}]},"type":{"type":"reference","name":"Subscription"}}],"type":{"type":"intrinsic","name":"void"}}]},{"name":"requestPermissionsAsync","kind":2048,"signatures":[{"name":"requestPermissionsAsync","kind":4096,"comment":{"summary":[{"kind":"text","text":"Asks the user to grant permissions for accessing sensor."}]},"type":{"type":"reference","typeArguments":[{"type":"reference","name":"PermissionResponse"}],"name":"Promise","qualifiedName":"Promise","package":"typescript"}}]},{"name":"setUpdateInterval","kind":2048,"signatures":[{"name":"setUpdateInterval","kind":4096,"comment":{"summary":[{"kind":"text","text":"Set the sensor update interval."}]},"parameters":[{"name":"intervalMs","kind":32768,"comment":{"summary":[{"kind":"text","text":"Desired interval in milliseconds between sensor updates.\n> Starting from Android 12 (API level 31), the system has a 200ms limit for each sensor updates.\n>\n> If you need an update interval less than 200ms, you should:\n> * add "},{"kind":"code","text":"`android.permission.HIGH_SAMPLING_RATE_SENSORS`"},{"kind":"text","text":" to [**app.json** "},{"kind":"code","text":"`permissions`"},{"kind":"text","text":" field](/versions/latest/config/app/#permissions)\n> * or if you are using bare workflow, add "},{"kind":"code","text":"``"},{"kind":"text","text":" to **AndroidManifest.xml**."}]},"type":{"type":"intrinsic","name":"number"}}],"type":{"type":"intrinsic","name":"void"}}]}],"typeParameters":[{"name":"Measurement","kind":131072}],"extendedBy":[{"type":"reference","name":"MagnetometerSensor"}]},{"name":"default","kind":32,"type":{"type":"reference","name":"MagnetometerSensor"}},{"name":"MagnetometerMeasurement","kind":4194304,"comment":{"summary":[{"kind":"text","text":"Each of these keys represents the strength of magnetic field along that particular axis measured in microteslas ("},{"kind":"code","text":"`μT`"},{"kind":"text","text":")."}]},"type":{"type":"reflection","declaration":{"name":"__type","kind":65536,"children":[{"name":"x","kind":1024,"comment":{"summary":[{"kind":"text","text":"Value representing strength of magnetic field recorded in X axis."}]},"type":{"type":"intrinsic","name":"number"}},{"name":"y","kind":1024,"comment":{"summary":[{"kind":"text","text":"Value representing strength of magnetic field recorded in Y axis."}]},"type":{"type":"intrinsic","name":"number"}},{"name":"z","kind":1024,"comment":{"summary":[{"kind":"text","text":"Value representing strength of magnetic field recorded in Z axis."}]},"type":{"type":"intrinsic","name":"number"}}]}}},{"name":"MagnetometerSensor","kind":128,"comment":{"summary":[],"blockTags":[{"tag":"@platform","content":[{"kind":"text","text":"android"}]},{"tag":"@platform","content":[{"kind":"text","text":"ios"}]}]},"children":[{"name":"constructor","kind":512,"signatures":[{"name":"new MagnetometerSensor","kind":16384,"parameters":[{"name":"nativeSensorModule","kind":32768,"type":{"type":"intrinsic","name":"any"}},{"name":"nativeEventName","kind":32768,"type":{"type":"intrinsic","name":"string"}}],"type":{"type":"reference","name":"MagnetometerSensor"},"inheritedFrom":{"type":"reference","name":"default.constructor"}}],"inheritedFrom":{"type":"reference","name":"default.constructor"}},{"name":"_listenerCount","kind":1024,"type":{"type":"intrinsic","name":"number"},"inheritedFrom":{"type":"reference","name":"default._listenerCount"}},{"name":"_nativeEmitter","kind":1024,"type":{"type":"reference","name":"EventEmitter"},"inheritedFrom":{"type":"reference","name":"default._nativeEmitter"}},{"name":"_nativeEventName","kind":1024,"type":{"type":"intrinsic","name":"string"},"inheritedFrom":{"type":"reference","name":"default._nativeEventName"}},{"name":"_nativeModule","kind":1024,"type":{"type":"intrinsic","name":"any"},"inheritedFrom":{"type":"reference","name":"default._nativeModule"}},{"name":"addListener","kind":2048,"signatures":[{"name":"addListener","kind":4096,"comment":{"summary":[{"kind":"text","text":"Subscribe for updates to the magnetometer."}],"blockTags":[{"tag":"@returns","content":[{"kind":"text","text":"A subscription that you can call "},{"kind":"code","text":"`remove()`"},{"kind":"text","text":" on when you would like to unsubscribe the listener."}]}]},"parameters":[{"name":"listener","kind":32768,"comment":{"summary":[{"kind":"text","text":"A callback that is invoked when a barometer update is available. When invoked, the listener is provided with a single argument that is "},{"kind":"code","text":"`MagnetometerMeasurement`"},{"kind":"text","text":"."}]},"type":{"type":"reference","typeArguments":[{"type":"reference","name":"MagnetometerMeasurement"}],"name":"Listener"}}],"type":{"type":"reference","name":"Subscription"},"overwrites":{"type":"reference","name":"default.addListener"}}],"overwrites":{"type":"reference","name":"default.addListener"}},{"name":"getListenerCount","kind":2048,"signatures":[{"name":"getListenerCount","kind":4096,"comment":{"summary":[{"kind":"text","text":"Returns the registered listeners count."}]},"type":{"type":"intrinsic","name":"number"},"inheritedFrom":{"type":"reference","name":"default.getListenerCount"}}],"inheritedFrom":{"type":"reference","name":"default.getListenerCount"}},{"name":"getPermissionsAsync","kind":2048,"signatures":[{"name":"getPermissionsAsync","kind":4096,"comment":{"summary":[{"kind":"text","text":"Checks user's permissions for accessing sensor."}]},"type":{"type":"reference","typeArguments":[{"type":"reference","name":"PermissionResponse"}],"name":"Promise","qualifiedName":"Promise","package":"typescript"},"inheritedFrom":{"type":"reference","name":"default.getPermissionsAsync"}}],"inheritedFrom":{"type":"reference","name":"default.getPermissionsAsync"}},{"name":"hasListeners","kind":2048,"signatures":[{"name":"hasListeners","kind":4096,"comment":{"summary":[{"kind":"text","text":"Returns boolean which signifies if sensor has any listeners registered."}]},"type":{"type":"intrinsic","name":"boolean"},"inheritedFrom":{"type":"reference","name":"default.hasListeners"}}],"inheritedFrom":{"type":"reference","name":"default.hasListeners"}},{"name":"isAvailableAsync","kind":2048,"signatures":[{"name":"isAvailableAsync","kind":4096,"comment":{"summary":[{"kind":"text","text":"> **info** You should always check the sensor availability before attempting to use it.\n\nCheck the availability of the device magnetometer. Requires at least Android 2.3 (API Level 9) and iOS 8."}],"blockTags":[{"tag":"@returns","content":[{"kind":"text","text":"A promise that resolves to a "},{"kind":"code","text":"`boolean`"},{"kind":"text","text":" denoting the availability of the sensor."}]}]},"type":{"type":"reference","typeArguments":[{"type":"intrinsic","name":"boolean"}],"name":"Promise","qualifiedName":"Promise","package":"typescript"},"overwrites":{"type":"reference","name":"default.isAvailableAsync"}}],"overwrites":{"type":"reference","name":"default.isAvailableAsync"}},{"name":"removeAllListeners","kind":2048,"signatures":[{"name":"removeAllListeners","kind":4096,"comment":{"summary":[{"kind":"text","text":"Removes all registered listeners."}]},"type":{"type":"intrinsic","name":"void"},"inheritedFrom":{"type":"reference","name":"default.removeAllListeners"}}],"inheritedFrom":{"type":"reference","name":"default.removeAllListeners"}},{"name":"removeSubscription","kind":2048,"signatures":[{"name":"removeSubscription","kind":4096,"comment":{"summary":[{"kind":"text","text":"Removes the given subscription."}]},"parameters":[{"name":"subscription","kind":32768,"comment":{"summary":[{"kind":"text","text":"A subscription to remove."}]},"type":{"type":"reference","name":"Subscription"}}],"type":{"type":"intrinsic","name":"void"},"inheritedFrom":{"type":"reference","name":"default.removeSubscription"}}],"inheritedFrom":{"type":"reference","name":"default.removeSubscription"}},{"name":"requestPermissionsAsync","kind":2048,"signatures":[{"name":"requestPermissionsAsync","kind":4096,"comment":{"summary":[{"kind":"text","text":"Asks the user to grant permissions for accessing sensor."}]},"type":{"type":"reference","typeArguments":[{"type":"reference","name":"PermissionResponse"}],"name":"Promise","qualifiedName":"Promise","package":"typescript"},"inheritedFrom":{"type":"reference","name":"default.requestPermissionsAsync"}}],"inheritedFrom":{"type":"reference","name":"default.requestPermissionsAsync"}},{"name":"setUpdateInterval","kind":2048,"signatures":[{"name":"setUpdateInterval","kind":4096,"comment":{"summary":[{"kind":"text","text":"Set the sensor update interval."}]},"parameters":[{"name":"intervalMs","kind":32768,"comment":{"summary":[{"kind":"text","text":"Desired interval in milliseconds between sensor updates.\n> Starting from Android 12 (API level 31), the system has a 200ms limit for each sensor updates.\n>\n> If you need an update interval less than 200ms, you should:\n> * add "},{"kind":"code","text":"`android.permission.HIGH_SAMPLING_RATE_SENSORS`"},{"kind":"text","text":" to [**app.json** "},{"kind":"code","text":"`permissions`"},{"kind":"text","text":" field](/versions/latest/config/app/#permissions)\n> * or if you are using bare workflow, add "},{"kind":"code","text":"``"},{"kind":"text","text":" to **AndroidManifest.xml**."}]},"type":{"type":"intrinsic","name":"number"}}],"type":{"type":"intrinsic","name":"void"},"inheritedFrom":{"type":"reference","name":"default.setUpdateInterval"}}],"inheritedFrom":{"type":"reference","name":"default.setUpdateInterval"}}],"extendedTypes":[{"type":"reference","typeArguments":[{"type":"reference","name":"MagnetometerMeasurement"}],"name":"default"}]},{"name":"PermissionExpiration","kind":4194304,"comment":{"summary":[{"kind":"text","text":"Permission expiration time. Currently, all permissions are granted permanently."}]},"type":{"type":"union","types":[{"type":"literal","value":"never"},{"type":"intrinsic","name":"number"}]}},{"name":"PermissionResponse","kind":256,"comment":{"summary":[{"kind":"text","text":"An object obtained by permissions get and request functions."}]},"children":[{"name":"canAskAgain","kind":1024,"comment":{"summary":[{"kind":"text","text":"Indicates if user can be asked again for specific permission.\nIf not, one should be directed to the Settings app\nin order to enable/disable the permission."}]},"type":{"type":"intrinsic","name":"boolean"}},{"name":"expires","kind":1024,"comment":{"summary":[{"kind":"text","text":"Determines time when the permission expires."}]},"type":{"type":"reference","name":"PermissionExpiration"}},{"name":"granted","kind":1024,"comment":{"summary":[{"kind":"text","text":"A convenience boolean that indicates if the permission is granted."}]},"type":{"type":"intrinsic","name":"boolean"}},{"name":"status","kind":1024,"comment":{"summary":[{"kind":"text","text":"Determines the status of the permission."}]},"type":{"type":"reference","name":"PermissionStatus"}}]},{"name":"PermissionStatus","kind":8,"children":[{"name":"DENIED","kind":16,"comment":{"summary":[{"kind":"text","text":"User has denied the permission."}]},"type":{"type":"literal","value":"denied"}},{"name":"GRANTED","kind":16,"comment":{"summary":[{"kind":"text","text":"User has granted the permission."}]},"type":{"type":"literal","value":"granted"}},{"name":"UNDETERMINED","kind":16,"comment":{"summary":[{"kind":"text","text":"User hasn't granted or denied the permission yet."}]},"type":{"type":"literal","value":"undetermined"}}]},{"name":"Subscription","kind":4194304,"type":{"type":"reflection","declaration":{"name":"__type","kind":65536,"children":[{"name":"remove","kind":1024,"type":{"type":"reflection","declaration":{"name":"__type","kind":65536,"signatures":[{"name":"__type","kind":4096,"comment":{"summary":[{"kind":"text","text":"A method to unsubscribe the listener."}]},"type":{"type":"intrinsic","name":"void"}}]}}}]}}}]}
\ No newline at end of file
diff --git a/docs/public/static/data/unversioned/expo-store-review.json b/docs/public/static/data/unversioned/expo-store-review.json
index 157596bdbfe4d..2491d26345734 100644
--- a/docs/public/static/data/unversioned/expo-store-review.json
+++ b/docs/public/static/data/unversioned/expo-store-review.json
@@ -1 +1 @@
-{"name":"expo-store-review","kind":1,"children":[{"name":"hasAction","kind":64,"signatures":[{"name":"hasAction","kind":4096,"comment":{"summary":[],"blockTags":[{"tag":"@returns","content":[{"kind":"text","text":"This returns a promise that fulfills to "},{"kind":"code","text":"`true`"},{"kind":"text","text":" if "},{"kind":"code","text":"`StoreReview.requestReview()`"},{"kind":"text","text":" is capable\ndirecting the user to some kind of store review flow. If the app config ("},{"kind":"code","text":"`app.json`"},{"kind":"text","text":") does not\ncontain store URLs and native store review capabilities are not available then the promise\nwill fulfill to "},{"kind":"code","text":"`false`"},{"kind":"text","text":"."}]},{"tag":"@example","content":[{"kind":"code","text":"```ts\nif (await StoreReview.hasAction()) {\n // you can call StoreReview.requestReview()\n}\n```"}]}]},"type":{"type":"reference","typeArguments":[{"type":"intrinsic","name":"boolean"}],"name":"Promise","qualifiedName":"Promise","package":"typescript"}}]},{"name":"isAvailableAsync","kind":64,"signatures":[{"name":"isAvailableAsync","kind":4096,"comment":{"summary":[{"kind":"text","text":"Determines if the platform has the capabilities to use "},{"kind":"code","text":"`StoreReview.requestReview()`"},{"kind":"text","text":"."}],"blockTags":[{"tag":"@returns","content":[{"kind":"text","text":"This returns a promise fulfills with "},{"kind":"code","text":"`boolean`"},{"kind":"text","text":", depending on the platform:\n- On iOS, it will always resolve to "},{"kind":"code","text":"`true`"},{"kind":"text","text":".\n- On Android, it will resolve to "},{"kind":"code","text":"`true`"},{"kind":"text","text":" if the device is running Android 5.0+.\n- On Web, it will resolve to "},{"kind":"code","text":"`false`"},{"kind":"text","text":"."}]}]},"type":{"type":"reference","typeArguments":[{"type":"intrinsic","name":"boolean"}],"name":"Promise","qualifiedName":"Promise","package":"typescript"}}]},{"name":"requestReview","kind":64,"signatures":[{"name":"requestReview","kind":4096,"comment":{"summary":[{"kind":"text","text":"In ideal circumstances this will open a native modal and allow the user to select a star rating\nthat will then be applied to the App Store, without leaving the app. If the device is running\na version of Android lower than 5.0, this will attempt to get the store URL and link the user to it."}]},"type":{"type":"reference","typeArguments":[{"type":"intrinsic","name":"void"}],"name":"Promise","qualifiedName":"Promise","package":"typescript"}}]},{"name":"storeUrl","kind":64,"signatures":[{"name":"storeUrl","kind":4096,"comment":{"summary":[{"kind":"text","text":"This uses the "},{"kind":"code","text":"`Constants`"},{"kind":"text","text":" API to get the "},{"kind":"code","text":"`Constants.manifest.ios.appStoreUrl`"},{"kind":"text","text":" on iOS, or the\n"},{"kind":"code","text":"`Constants.manifest.android.playStoreUrl`"},{"kind":"text","text":" on Android.\n\nOn Web this will return "},{"kind":"code","text":"`null`"},{"kind":"text","text":"."}]},"type":{"type":"union","types":[{"type":"intrinsic","name":"string"},{"type":"literal","value":null}]}}]}]}
\ No newline at end of file
+{"name":"expo-store-review","kind":1,"children":[{"name":"hasAction","kind":64,"signatures":[{"name":"hasAction","kind":4096,"comment":{"summary":[],"blockTags":[{"tag":"@returns","content":[{"kind":"text","text":"This returns a promise that fulfills to "},{"kind":"code","text":"`true`"},{"kind":"text","text":" if "},{"kind":"code","text":"`StoreReview.requestReview()`"},{"kind":"text","text":" is capable\ndirecting the user to some kind of store review flow. If the app config ("},{"kind":"code","text":"`app.json`"},{"kind":"text","text":") does not\ncontain store URLs and native store review capabilities are not available then the promise\nwill fulfill to "},{"kind":"code","text":"`false`"},{"kind":"text","text":"."}]},{"tag":"@example","content":[{"kind":"code","text":"```ts\nif (await StoreReview.hasAction()) {\n // you can call StoreReview.requestReview()\n}\n```"}]}]},"type":{"type":"reference","typeArguments":[{"type":"intrinsic","name":"boolean"}],"name":"Promise","qualifiedName":"Promise","package":"typescript"}}]},{"name":"isAvailableAsync","kind":64,"signatures":[{"name":"isAvailableAsync","kind":4096,"comment":{"summary":[{"kind":"text","text":"Determines if the platform has the capabilities to use "},{"kind":"code","text":"`StoreReview.requestReview()`"},{"kind":"text","text":"."}],"blockTags":[{"tag":"@returns","content":[{"kind":"text","text":"This returns a promise fulfills with "},{"kind":"code","text":"`boolean`"},{"kind":"text","text":", depending on the platform:\n- On iOS, it will always resolve to "},{"kind":"code","text":"`true`"},{"kind":"text","text":".\n- On Android, it will resolve to "},{"kind":"code","text":"`true`"},{"kind":"text","text":" if the device is running Android 5.0+.\n- On Web, it will resolve to "},{"kind":"code","text":"`false`"},{"kind":"text","text":"."}]}]},"type":{"type":"reference","typeArguments":[{"type":"intrinsic","name":"boolean"}],"name":"Promise","qualifiedName":"Promise","package":"typescript"}}]},{"name":"requestReview","kind":64,"signatures":[{"name":"requestReview","kind":4096,"comment":{"summary":[{"kind":"text","text":"In ideal circumstances this will open a native modal and allow the user to select a star rating\nthat will then be applied to the App Store, without leaving the app. If the device is running\na version of Android lower than 5.0, this will attempt to get the store URL and link the user to it."}]},"type":{"type":"reference","typeArguments":[{"type":"intrinsic","name":"void"}],"name":"Promise","qualifiedName":"Promise","package":"typescript"}}]},{"name":"storeUrl","kind":64,"signatures":[{"name":"storeUrl","kind":4096,"comment":{"summary":[{"kind":"text","text":"This uses the "},{"kind":"code","text":"`Constants`"},{"kind":"text","text":" API to get the "},{"kind":"code","text":"`Constants.expoConfig.ios.appStoreUrl`"},{"kind":"text","text":" on iOS, or the\n"},{"kind":"code","text":"`Constants.expoConfig.android.playStoreUrl`"},{"kind":"text","text":" on Android.\n\nOn Web this will return "},{"kind":"code","text":"`null`"},{"kind":"text","text":"."}]},"type":{"type":"union","types":[{"type":"intrinsic","name":"string"},{"type":"literal","value":null}]}}]}]}
\ No newline at end of file
diff --git a/docs/public/static/data/unversioned/expo-system-ui.json b/docs/public/static/data/unversioned/expo-system-ui.json
index 3884761ac735a..e3bd27a710777 100644
--- a/docs/public/static/data/unversioned/expo-system-ui.json
+++ b/docs/public/static/data/unversioned/expo-system-ui.json
@@ -1 +1 @@
-{"name":"expo-system-ui","kind":1,"children":[{"name":"getBackgroundColorAsync","kind":64,"signatures":[{"name":"getBackgroundColorAsync","kind":4096,"comment":{"summary":[{"kind":"text","text":"Gets the root view background color."}],"blockTags":[{"tag":"@example","content":[{"kind":"code","text":"```ts\nconst color = await SystemUI.getBackgroundColorAsync();\n```"}]},{"tag":"@returns","content":[{"kind":"text","text":"Current root view background color in hex format. Returns "},{"kind":"code","text":"`null`"},{"kind":"text","text":" if the background color is not set."}]}]},"type":{"type":"reference","typeArguments":[{"type":"union","types":[{"type":"reference","name":"ColorValue","qualifiedName":"ColorValue","package":"react-native"},{"type":"literal","value":null}]}],"name":"Promise","qualifiedName":"Promise","package":"typescript"}}]},{"name":"setBackgroundColorAsync","kind":64,"signatures":[{"name":"setBackgroundColorAsync","kind":4096,"comment":{"summary":[{"kind":"text","text":"Changes the root view background color."}],"blockTags":[{"tag":"@example","content":[{"kind":"code","text":"```ts\nSystemUI.setBackgroundColorAsync(\"white\");\n```"}]}]},"parameters":[{"name":"color","kind":32768,"comment":{"summary":[{"kind":"text","text":"Any valid [CSS 3 (SVG) color](http://www.w3.org/TR/css3-color/#svg-color)."}]},"type":{"type":"reference","name":"ColorValue","qualifiedName":"ColorValue","package":"react-native"}}],"type":{"type":"reference","typeArguments":[{"type":"intrinsic","name":"void"}],"name":"Promise","qualifiedName":"Promise","package":"typescript"}}]}]}
\ No newline at end of file
+{"name":"expo-system-ui","kind":1,"children":[{"name":"getBackgroundColorAsync","kind":64,"signatures":[{"name":"getBackgroundColorAsync","kind":4096,"comment":{"summary":[{"kind":"text","text":"Gets the root view background color."}],"blockTags":[{"tag":"@example","content":[{"kind":"code","text":"```ts\nconst color = await SystemUI.getBackgroundColorAsync();\n```"}]},{"tag":"@returns","content":[{"kind":"text","text":"Current root view background color in hex format. Returns "},{"kind":"code","text":"`null`"},{"kind":"text","text":" if the background color is not set."}]}]},"type":{"type":"reference","typeArguments":[{"type":"union","types":[{"type":"reference","name":"ColorValue","qualifiedName":"ColorValue","package":"react-native"},{"type":"literal","value":null}]}],"name":"Promise","qualifiedName":"Promise","package":"typescript"}}]},{"name":"setBackgroundColorAsync","kind":64,"signatures":[{"name":"setBackgroundColorAsync","kind":4096,"comment":{"summary":[{"kind":"text","text":"Changes the root view background color.\nCall this function in the root file outside of you component."}],"blockTags":[{"tag":"@example","content":[{"kind":"code","text":"```ts\nSystemUI.setBackgroundColorAsync(\"black\");\n```"}]}]},"parameters":[{"name":"color","kind":32768,"comment":{"summary":[{"kind":"text","text":"Any valid [CSS 3 (SVG) color](http://www.w3.org/TR/css3-color/#svg-color)."}]},"type":{"type":"union","types":[{"type":"literal","value":null},{"type":"reference","name":"ColorValue","qualifiedName":"ColorValue","package":"react-native"}]}}],"type":{"type":"reference","typeArguments":[{"type":"intrinsic","name":"void"}],"name":"Promise","qualifiedName":"Promise","package":"typescript"}}]}]}
\ No newline at end of file
diff --git a/docs/public/static/data/unversioned/expo-task-manager.json b/docs/public/static/data/unversioned/expo-task-manager.json
index ba4b80b0fa087..5e47445959db9 100644
--- a/docs/public/static/data/unversioned/expo-task-manager.json
+++ b/docs/public/static/data/unversioned/expo-task-manager.json
@@ -1 +1 @@
-{"name":"expo-task-manager","kind":1,"children":[{"name":"TaskManagerError","kind":256,"comment":{"summary":[{"kind":"text","text":"Error object that can be received through ["},{"kind":"code","text":"`TaskManagerTaskBody`"},{"kind":"text","text":"](#taskmanagertaskbody) when the\ntask fails."}]},"children":[{"name":"code","kind":1024,"type":{"type":"union","types":[{"type":"intrinsic","name":"string"},{"type":"intrinsic","name":"number"}]}},{"name":"message","kind":1024,"type":{"type":"intrinsic","name":"string"}}]},{"name":"TaskManagerTask","kind":256,"comment":{"summary":[{"kind":"text","text":"Represents an already registered task."}]},"children":[{"name":"options","kind":1024,"comment":{"summary":[{"kind":"text","text":"Provides "},{"kind":"code","text":"`options`"},{"kind":"text","text":" that the task was registered with."}]},"type":{"type":"intrinsic","name":"any"}},{"name":"taskName","kind":1024,"comment":{"summary":[{"kind":"text","text":"Name that the task is registered with."}]},"type":{"type":"intrinsic","name":"string"}},{"name":"taskType","kind":1024,"comment":{"summary":[{"kind":"text","text":"Type of the task which depends on how the task was registered."}]},"type":{"type":"intrinsic","name":"string"}}]},{"name":"TaskManagerTaskBody","kind":256,"comment":{"summary":[{"kind":"text","text":"Represents the object that is passed to the task executor."}]},"children":[{"name":"data","kind":1024,"comment":{"summary":[{"kind":"text","text":"An object of data passed to the task executor. Its properties depends on the type of the task."}]},"type":{"type":"reference","name":"T"}},{"name":"error","kind":1024,"comment":{"summary":[{"kind":"text","text":"Error object if the task failed or "},{"kind":"code","text":"`null`"},{"kind":"text","text":" otherwise."}]},"type":{"type":"union","types":[{"type":"literal","value":null},{"type":"reference","name":"TaskManagerError"}]}},{"name":"executionInfo","kind":1024,"comment":{"summary":[{"kind":"text","text":"Additional details containing unique ID of task event and name of the task."}]},"type":{"type":"reference","name":"TaskManagerTaskBodyExecutionInfo"}}],"typeParameters":[{"name":"T","kind":131072,"default":{"type":"intrinsic","name":"object"}}]},{"name":"TaskManagerTaskBodyExecutionInfo","kind":256,"comment":{"summary":[{"kind":"text","text":"Additional details about execution provided in "},{"kind":"code","text":"`TaskManagerTaskBody`"},{"kind":"text","text":"."}]},"children":[{"name":"appState","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"State of the application."}],"blockTags":[{"tag":"@platform","content":[{"kind":"text","text":"ios"}]}]},"type":{"type":"union","types":[{"type":"literal","value":"active"},{"type":"literal","value":"background"},{"type":"literal","value":"inactive"}]}},{"name":"eventId","kind":1024,"comment":{"summary":[{"kind":"text","text":"Unique ID of task event."}]},"type":{"type":"intrinsic","name":"string"}},{"name":"taskName","kind":1024,"comment":{"summary":[{"kind":"text","text":"Name of the task."}]},"type":{"type":"intrinsic","name":"string"}}]},{"name":"TaskManagerTaskExecutor","kind":4194304,"type":{"type":"reflection","declaration":{"name":"__type","kind":65536,"signatures":[{"name":"__type","kind":4096,"comment":{"summary":[{"kind":"text","text":"Type of task executor – a function that handles the task."}]},"parameters":[{"name":"body","kind":32768,"type":{"type":"reference","name":"TaskManagerTaskBody"}}],"type":{"type":"intrinsic","name":"void"}}]}}},{"name":"defineTask","kind":64,"signatures":[{"name":"defineTask","kind":4096,"comment":{"summary":[{"kind":"text","text":"Defines task function. It must be called in the global scope of your JavaScript bundle.\nIn particular, it cannot be called in any of React lifecycle methods like "},{"kind":"code","text":"`componentDidMount`"},{"kind":"text","text":".\nThis limitation is due to the fact that when the application is launched in the background,\nwe need to spin up your JavaScript app, run your task and then shut down — no views are mounted\nin this scenario."}]},"parameters":[{"name":"taskName","kind":32768,"comment":{"summary":[{"kind":"text","text":"Name of the task. It must be the same as the name you provided when registering the task."}]},"type":{"type":"intrinsic","name":"string"}},{"name":"taskExecutor","kind":32768,"comment":{"summary":[{"kind":"text","text":"A function that will be invoked when the task with given "},{"kind":"code","text":"`taskName`"},{"kind":"text","text":" is executed."}]},"type":{"type":"reference","name":"TaskManagerTaskExecutor"}}],"type":{"type":"intrinsic","name":"void"}}]},{"name":"getRegisteredTasksAsync","kind":64,"signatures":[{"name":"getRegisteredTasksAsync","kind":4096,"comment":{"summary":[{"kind":"text","text":"Provides information about tasks registered in the app."}],"blockTags":[{"tag":"@returns","content":[{"kind":"text","text":"A promise which fulfills with an array of tasks registered in the app. Example:\n"},{"kind":"code","text":"```json\n[\n {\n taskName: 'location-updates-task-name',\n taskType: 'location',\n options: {\n accuracy: Location.Accuracy.High,\n showsBackgroundLocationIndicator: false,\n },\n },\n {\n taskName: 'geofencing-task-name',\n taskType: 'geofencing',\n options: {\n regions: [...],\n },\n },\n]\n```"}]}]},"type":{"type":"reference","typeArguments":[{"type":"array","elementType":{"type":"reference","name":"TaskManagerTask"}}],"name":"Promise","qualifiedName":"Promise","package":"typescript"}}]},{"name":"getTaskOptionsAsync","kind":64,"signatures":[{"name":"getTaskOptionsAsync","kind":4096,"comment":{"summary":[{"kind":"text","text":"Retrieves "},{"kind":"code","text":"`options`"},{"kind":"text","text":" associated with the task, that were passed to the function registering the task\n(eg. "},{"kind":"code","text":"`Location.startLocationUpdatesAsync`"},{"kind":"text","text":")."}],"blockTags":[{"tag":"@returns","content":[{"kind":"text","text":"A promise which fulfills with the "},{"kind":"code","text":"`options`"},{"kind":"text","text":" object that was passed while registering task\nwith given name or "},{"kind":"code","text":"`null`"},{"kind":"text","text":" if task couldn't be found."}]}]},"typeParameter":[{"name":"TaskOptions","kind":131072}],"parameters":[{"name":"taskName","kind":32768,"comment":{"summary":[{"kind":"text","text":"Name of the task."}]},"type":{"type":"intrinsic","name":"string"}}],"type":{"type":"reference","typeArguments":[{"type":"reference","name":"TaskOptions"}],"name":"Promise","qualifiedName":"Promise","package":"typescript"}}]},{"name":"isAvailableAsync","kind":64,"signatures":[{"name":"isAvailableAsync","kind":4096,"comment":{"summary":[{"kind":"text","text":"Determine if the "},{"kind":"code","text":"`TaskManager`"},{"kind":"text","text":" API can be used in this app."}],"blockTags":[{"tag":"@returns","content":[{"kind":"text","text":"A promise fulfills with "},{"kind":"code","text":"`true`"},{"kind":"text","text":" if the API can be used, and "},{"kind":"code","text":"`false`"},{"kind":"text","text":" otherwise.\nOn the web it always returns "},{"kind":"code","text":"`false`"},{"kind":"text","text":"."}]}]},"type":{"type":"reference","typeArguments":[{"type":"intrinsic","name":"boolean"}],"name":"Promise","qualifiedName":"Promise","package":"typescript"}}]},{"name":"isTaskDefined","kind":64,"signatures":[{"name":"isTaskDefined","kind":4096,"comment":{"summary":[{"kind":"text","text":"Checks whether the task is already defined."}]},"parameters":[{"name":"taskName","kind":32768,"comment":{"summary":[{"kind":"text","text":"Name of the task."}]},"type":{"type":"intrinsic","name":"string"}}],"type":{"type":"intrinsic","name":"boolean"}}]},{"name":"isTaskRegisteredAsync","kind":64,"signatures":[{"name":"isTaskRegisteredAsync","kind":4096,"comment":{"summary":[{"kind":"text","text":"Determine whether the task is registered. Registered tasks are stored in a persistent storage and\npreserved between sessions."}],"blockTags":[{"tag":"@returns","content":[{"kind":"text","text":"A promise which fulfills with a "},{"kind":"code","text":"`boolean`"},{"kind":"text","text":" value whether or not the task with given name\nis already registered."}]}]},"parameters":[{"name":"taskName","kind":32768,"comment":{"summary":[{"kind":"text","text":"Name of the task."}]},"type":{"type":"intrinsic","name":"string"}}],"type":{"type":"reference","typeArguments":[{"type":"intrinsic","name":"boolean"}],"name":"Promise","qualifiedName":"Promise","package":"typescript"}}]},{"name":"unregisterAllTasksAsync","kind":64,"signatures":[{"name":"unregisterAllTasksAsync","kind":4096,"comment":{"summary":[{"kind":"text","text":"Unregisters all tasks registered for the running app. You may want to call this when the user is\nsigning out and you no longer need to track his location or run any other background tasks."}],"blockTags":[{"tag":"@returns","content":[{"kind":"text","text":"A promise which fulfills as soon as all tasks are completely unregistered."}]}]},"type":{"type":"reference","typeArguments":[{"type":"intrinsic","name":"void"}],"name":"Promise","qualifiedName":"Promise","package":"typescript"}}]},{"name":"unregisterTaskAsync","kind":64,"signatures":[{"name":"unregisterTaskAsync","kind":4096,"comment":{"summary":[{"kind":"text","text":"Unregisters task from the app, so the app will not be receiving updates for that task anymore.\n_It is recommended to use methods specialized by modules that registered the task, eg.\n["},{"kind":"code","text":"`Location.stopLocationUpdatesAsync`"},{"kind":"text","text":"](./location/#expolocationstoplocationupdatesasynctaskname)._"}],"blockTags":[{"tag":"@returns","content":[{"kind":"text","text":"A promise which fulfills as soon as the task is unregistered."}]}]},"parameters":[{"name":"taskName","kind":32768,"comment":{"summary":[{"kind":"text","text":"Name of the task to unregister."}]},"type":{"type":"intrinsic","name":"string"}}],"type":{"type":"reference","typeArguments":[{"type":"intrinsic","name":"void"}],"name":"Promise","qualifiedName":"Promise","package":"typescript"}}]}]}
\ No newline at end of file
+{"name":"expo-task-manager","kind":1,"children":[{"name":"TaskManagerError","kind":256,"comment":{"summary":[{"kind":"text","text":"Error object that can be received through ["},{"kind":"code","text":"`TaskManagerTaskBody`"},{"kind":"text","text":"](#taskmanagertaskbody) when the\ntask fails."}]},"children":[{"name":"code","kind":1024,"type":{"type":"union","types":[{"type":"intrinsic","name":"string"},{"type":"intrinsic","name":"number"}]}},{"name":"message","kind":1024,"type":{"type":"intrinsic","name":"string"}}]},{"name":"TaskManagerTask","kind":256,"comment":{"summary":[{"kind":"text","text":"Represents an already registered task."}]},"children":[{"name":"options","kind":1024,"comment":{"summary":[{"kind":"text","text":"Provides "},{"kind":"code","text":"`options`"},{"kind":"text","text":" that the task was registered with."}]},"type":{"type":"intrinsic","name":"any"}},{"name":"taskName","kind":1024,"comment":{"summary":[{"kind":"text","text":"Name that the task is registered with."}]},"type":{"type":"intrinsic","name":"string"}},{"name":"taskType","kind":1024,"comment":{"summary":[{"kind":"text","text":"Type of the task which depends on how the task was registered."}]},"type":{"type":"intrinsic","name":"string"}}]},{"name":"TaskManagerTaskBody","kind":256,"comment":{"summary":[{"kind":"text","text":"Represents the object that is passed to the task executor."}]},"children":[{"name":"data","kind":1024,"comment":{"summary":[{"kind":"text","text":"An object of data passed to the task executor. Its properties depends on the type of the task."}]},"type":{"type":"reference","name":"T"}},{"name":"error","kind":1024,"comment":{"summary":[{"kind":"text","text":"Error object if the task failed or "},{"kind":"code","text":"`null`"},{"kind":"text","text":" otherwise."}]},"type":{"type":"union","types":[{"type":"literal","value":null},{"type":"reference","name":"TaskManagerError"}]}},{"name":"executionInfo","kind":1024,"comment":{"summary":[{"kind":"text","text":"Additional details containing unique ID of task event and name of the task."}]},"type":{"type":"reference","name":"TaskManagerTaskBodyExecutionInfo"}}],"typeParameters":[{"name":"T","kind":131072,"default":{"type":"intrinsic","name":"unknown"}}]},{"name":"TaskManagerTaskBodyExecutionInfo","kind":256,"comment":{"summary":[{"kind":"text","text":"Additional details about execution provided in "},{"kind":"code","text":"`TaskManagerTaskBody`"},{"kind":"text","text":"."}]},"children":[{"name":"appState","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"State of the application."}],"blockTags":[{"tag":"@platform","content":[{"kind":"text","text":"ios"}]}]},"type":{"type":"union","types":[{"type":"literal","value":"active"},{"type":"literal","value":"background"},{"type":"literal","value":"inactive"}]}},{"name":"eventId","kind":1024,"comment":{"summary":[{"kind":"text","text":"Unique ID of task event."}]},"type":{"type":"intrinsic","name":"string"}},{"name":"taskName","kind":1024,"comment":{"summary":[{"kind":"text","text":"Name of the task."}]},"type":{"type":"intrinsic","name":"string"}}]},{"name":"TaskManagerTaskExecutor","kind":4194304,"typeParameters":[{"name":"T","kind":131072,"default":{"type":"intrinsic","name":"unknown"}}],"type":{"type":"reflection","declaration":{"name":"__type","kind":65536,"signatures":[{"name":"__type","kind":4096,"comment":{"summary":[{"kind":"text","text":"Type of task executor – a function that handles the task."}]},"parameters":[{"name":"body","kind":32768,"type":{"type":"reference","typeArguments":[{"type":"reference","name":"T"}],"name":"TaskManagerTaskBody"}}],"type":{"type":"intrinsic","name":"void"}}]}}},{"name":"defineTask","kind":64,"signatures":[{"name":"defineTask","kind":4096,"comment":{"summary":[{"kind":"text","text":"Defines task function. It must be called in the global scope of your JavaScript bundle.\nIn particular, it cannot be called in any of React lifecycle methods like "},{"kind":"code","text":"`componentDidMount`"},{"kind":"text","text":".\nThis limitation is due to the fact that when the application is launched in the background,\nwe need to spin up your JavaScript app, run your task and then shut down — no views are mounted\nin this scenario."}]},"typeParameter":[{"name":"T","kind":131072,"default":{"type":"intrinsic","name":"unknown"}}],"parameters":[{"name":"taskName","kind":32768,"comment":{"summary":[{"kind":"text","text":"Name of the task. It must be the same as the name you provided when registering the task."}]},"type":{"type":"intrinsic","name":"string"}},{"name":"taskExecutor","kind":32768,"comment":{"summary":[{"kind":"text","text":"A function that will be invoked when the task with given "},{"kind":"code","text":"`taskName`"},{"kind":"text","text":" is executed."}]},"type":{"type":"reference","typeArguments":[{"type":"reference","name":"T"}],"name":"TaskManagerTaskExecutor"}}],"type":{"type":"intrinsic","name":"void"}}]},{"name":"getRegisteredTasksAsync","kind":64,"signatures":[{"name":"getRegisteredTasksAsync","kind":4096,"comment":{"summary":[{"kind":"text","text":"Provides information about tasks registered in the app."}],"blockTags":[{"tag":"@returns","content":[{"kind":"text","text":"A promise which fulfills with an array of tasks registered in the app. Example:\n"},{"kind":"code","text":"```json\n[\n {\n taskName: 'location-updates-task-name',\n taskType: 'location',\n options: {\n accuracy: Location.Accuracy.High,\n showsBackgroundLocationIndicator: false,\n },\n },\n {\n taskName: 'geofencing-task-name',\n taskType: 'geofencing',\n options: {\n regions: [...],\n },\n },\n]\n```"}]}]},"type":{"type":"reference","typeArguments":[{"type":"array","elementType":{"type":"reference","name":"TaskManagerTask"}}],"name":"Promise","qualifiedName":"Promise","package":"typescript"}}]},{"name":"getTaskOptionsAsync","kind":64,"signatures":[{"name":"getTaskOptionsAsync","kind":4096,"comment":{"summary":[{"kind":"text","text":"Retrieves "},{"kind":"code","text":"`options`"},{"kind":"text","text":" associated with the task, that were passed to the function registering the task\n(eg. "},{"kind":"code","text":"`Location.startLocationUpdatesAsync`"},{"kind":"text","text":")."}],"blockTags":[{"tag":"@returns","content":[{"kind":"text","text":"A promise which fulfills with the "},{"kind":"code","text":"`options`"},{"kind":"text","text":" object that was passed while registering task\nwith given name or "},{"kind":"code","text":"`null`"},{"kind":"text","text":" if task couldn't be found."}]}]},"typeParameter":[{"name":"TaskOptions","kind":131072}],"parameters":[{"name":"taskName","kind":32768,"comment":{"summary":[{"kind":"text","text":"Name of the task."}]},"type":{"type":"intrinsic","name":"string"}}],"type":{"type":"reference","typeArguments":[{"type":"reference","name":"TaskOptions"}],"name":"Promise","qualifiedName":"Promise","package":"typescript"}}]},{"name":"isAvailableAsync","kind":64,"signatures":[{"name":"isAvailableAsync","kind":4096,"comment":{"summary":[{"kind":"text","text":"Determine if the "},{"kind":"code","text":"`TaskManager`"},{"kind":"text","text":" API can be used in this app."}],"blockTags":[{"tag":"@returns","content":[{"kind":"text","text":"A promise fulfills with "},{"kind":"code","text":"`true`"},{"kind":"text","text":" if the API can be used, and "},{"kind":"code","text":"`false`"},{"kind":"text","text":" otherwise.\nOn the web it always returns "},{"kind":"code","text":"`false`"},{"kind":"text","text":"."}]}]},"type":{"type":"reference","typeArguments":[{"type":"intrinsic","name":"boolean"}],"name":"Promise","qualifiedName":"Promise","package":"typescript"}}]},{"name":"isTaskDefined","kind":64,"signatures":[{"name":"isTaskDefined","kind":4096,"comment":{"summary":[{"kind":"text","text":"Checks whether the task is already defined."}]},"parameters":[{"name":"taskName","kind":32768,"comment":{"summary":[{"kind":"text","text":"Name of the task."}]},"type":{"type":"intrinsic","name":"string"}}],"type":{"type":"intrinsic","name":"boolean"}}]},{"name":"isTaskRegisteredAsync","kind":64,"signatures":[{"name":"isTaskRegisteredAsync","kind":4096,"comment":{"summary":[{"kind":"text","text":"Determine whether the task is registered. Registered tasks are stored in a persistent storage and\npreserved between sessions."}],"blockTags":[{"tag":"@returns","content":[{"kind":"text","text":"A promise which fulfills with a "},{"kind":"code","text":"`boolean`"},{"kind":"text","text":" value whether or not the task with given name\nis already registered."}]}]},"parameters":[{"name":"taskName","kind":32768,"comment":{"summary":[{"kind":"text","text":"Name of the task."}]},"type":{"type":"intrinsic","name":"string"}}],"type":{"type":"reference","typeArguments":[{"type":"intrinsic","name":"boolean"}],"name":"Promise","qualifiedName":"Promise","package":"typescript"}}]},{"name":"unregisterAllTasksAsync","kind":64,"signatures":[{"name":"unregisterAllTasksAsync","kind":4096,"comment":{"summary":[{"kind":"text","text":"Unregisters all tasks registered for the running app. You may want to call this when the user is\nsigning out and you no longer need to track his location or run any other background tasks."}],"blockTags":[{"tag":"@returns","content":[{"kind":"text","text":"A promise which fulfills as soon as all tasks are completely unregistered."}]}]},"type":{"type":"reference","typeArguments":[{"type":"intrinsic","name":"void"}],"name":"Promise","qualifiedName":"Promise","package":"typescript"}}]},{"name":"unregisterTaskAsync","kind":64,"signatures":[{"name":"unregisterTaskAsync","kind":4096,"comment":{"summary":[{"kind":"text","text":"Unregisters task from the app, so the app will not be receiving updates for that task anymore.\n_It is recommended to use methods specialized by modules that registered the task, eg.\n["},{"kind":"code","text":"`Location.stopLocationUpdatesAsync`"},{"kind":"text","text":"](./location/#expolocationstoplocationupdatesasynctaskname)._"}],"blockTags":[{"tag":"@returns","content":[{"kind":"text","text":"A promise which fulfills as soon as the task is unregistered."}]}]},"parameters":[{"name":"taskName","kind":32768,"comment":{"summary":[{"kind":"text","text":"Name of the task to unregister."}]},"type":{"type":"intrinsic","name":"string"}}],"type":{"type":"reference","typeArguments":[{"type":"intrinsic","name":"void"}],"name":"Promise","qualifiedName":"Promise","package":"typescript"}}]}]}
\ No newline at end of file
diff --git a/docs/public/static/data/v49.0.0/expo-accelerometer.json b/docs/public/static/data/v49.0.0/expo-accelerometer.json
new file mode 100644
index 0000000000000..467c7b184e567
--- /dev/null
+++ b/docs/public/static/data/v49.0.0/expo-accelerometer.json
@@ -0,0 +1 @@
+{"name":"expo-accelerometer","kind":1,"children":[{"name":"AccelerometerMeasurement","kind":4194304,"comment":{"summary":[{"kind":"text","text":"Each of these keys represents the acceleration along that particular axis in g-force (measured in "},{"kind":"code","text":"`g`"},{"kind":"text","text":"s).\n\nA "},{"kind":"code","text":"`g`"},{"kind":"text","text":" is a unit of gravitational force equal to that exerted by the earth’s gravitational field ("},{"kind":"code","text":"`9.81 m/s^2`"},{"kind":"text","text":")."}]},"type":{"type":"reflection","declaration":{"name":"__type","kind":65536,"children":[{"name":"x","kind":1024,"comment":{"summary":[{"kind":"text","text":"Value of "},{"kind":"code","text":"`g`"},{"kind":"text","text":"s device reported in X axis."}]},"type":{"type":"intrinsic","name":"number"}},{"name":"y","kind":1024,"comment":{"summary":[{"kind":"text","text":"Value of "},{"kind":"code","text":"`g`"},{"kind":"text","text":"s device reported in Y axis."}]},"type":{"type":"intrinsic","name":"number"}},{"name":"z","kind":1024,"comment":{"summary":[{"kind":"text","text":"Value of "},{"kind":"code","text":"`g`"},{"kind":"text","text":"s device reported in Z axis."}]},"type":{"type":"intrinsic","name":"number"}}]}}},{"name":"AccelerometerSensor","kind":128,"comment":{"summary":[{"kind":"text","text":"A base class for subscribable sensors. The events emitted by this class are measurements\nspecified by the parameter type "},{"kind":"code","text":"`Measurement`"},{"kind":"text","text":"."}]},"children":[{"name":"constructor","kind":512,"signatures":[{"name":"new AccelerometerSensor","kind":16384,"parameters":[{"name":"nativeSensorModule","kind":32768,"type":{"type":"intrinsic","name":"any"}},{"name":"nativeEventName","kind":32768,"type":{"type":"intrinsic","name":"string"}}],"type":{"type":"reference","name":"AccelerometerSensor"},"inheritedFrom":{"type":"reference","name":"default.constructor"}}],"inheritedFrom":{"type":"reference","name":"default.constructor"}},{"name":"_listenerCount","kind":1024,"type":{"type":"intrinsic","name":"number"},"inheritedFrom":{"type":"reference","name":"default._listenerCount"}},{"name":"_nativeEmitter","kind":1024,"type":{"type":"reference","name":"EventEmitter"},"inheritedFrom":{"type":"reference","name":"default._nativeEmitter"}},{"name":"_nativeEventName","kind":1024,"type":{"type":"intrinsic","name":"string"},"inheritedFrom":{"type":"reference","name":"default._nativeEventName"}},{"name":"_nativeModule","kind":1024,"type":{"type":"intrinsic","name":"any"},"inheritedFrom":{"type":"reference","name":"default._nativeModule"}},{"name":"addListener","kind":2048,"signatures":[{"name":"addListener","kind":4096,"comment":{"summary":[{"kind":"text","text":"Subscribe for updates to the accelerometer."}],"blockTags":[{"tag":"@returns","content":[{"kind":"text","text":"A subscription that you can call "},{"kind":"code","text":"`remove()`"},{"kind":"text","text":" on when you would like to unsubscribe the listener."}]}]},"parameters":[{"name":"listener","kind":32768,"comment":{"summary":[{"kind":"text","text":"A callback that is invoked when an accelerometer update is available. When invoked,\nthe listener is provided a single argument that is an "},{"kind":"code","text":"`AccelerometerMeasurement`"},{"kind":"text","text":" object."}]},"type":{"type":"reference","typeArguments":[{"type":"reference","name":"AccelerometerMeasurement"}],"name":"Listener"}}],"type":{"type":"reference","name":"Subscription"},"overwrites":{"type":"reference","name":"default.addListener"}}],"overwrites":{"type":"reference","name":"default.addListener"}},{"name":"getListenerCount","kind":2048,"signatures":[{"name":"getListenerCount","kind":4096,"comment":{"summary":[{"kind":"text","text":"Returns the registered listeners count."}]},"type":{"type":"intrinsic","name":"number"},"inheritedFrom":{"type":"reference","name":"default.getListenerCount"}}],"inheritedFrom":{"type":"reference","name":"default.getListenerCount"}},{"name":"getPermissionsAsync","kind":2048,"signatures":[{"name":"getPermissionsAsync","kind":4096,"comment":{"summary":[{"kind":"text","text":"Checks user's permissions for accessing sensor."}]},"type":{"type":"reference","typeArguments":[{"type":"reference","name":"PermissionResponse"}],"name":"Promise","qualifiedName":"Promise","package":"typescript"},"inheritedFrom":{"type":"reference","name":"default.getPermissionsAsync"}}],"inheritedFrom":{"type":"reference","name":"default.getPermissionsAsync"}},{"name":"hasListeners","kind":2048,"signatures":[{"name":"hasListeners","kind":4096,"comment":{"summary":[{"kind":"text","text":"Returns boolean which signifies if sensor has any listeners registered."}]},"type":{"type":"intrinsic","name":"boolean"},"inheritedFrom":{"type":"reference","name":"default.hasListeners"}}],"inheritedFrom":{"type":"reference","name":"default.hasListeners"}},{"name":"isAvailableAsync","kind":2048,"signatures":[{"name":"isAvailableAsync","kind":4096,"comment":{"summary":[{"kind":"text","text":"> **info** You should always check the sensor availability before attempting to use it.\n\nReturns whether the accelerometer is enabled on the device.\n\nOn mobile web, you must first invoke "},{"kind":"code","text":"`Accelerometer.requestPermissionsAsync()`"},{"kind":"text","text":" in a user interaction (i.e. touch event) before you can use this module.\nIf the "},{"kind":"code","text":"`status`"},{"kind":"text","text":" is not equal to "},{"kind":"code","text":"`granted`"},{"kind":"text","text":" then you should inform the end user that they may have to open settings.\n\nOn **web** this starts a timer and waits to see if an event is fired. This should predict if the iOS device has the **device orientation** API disabled in\n**Settings > Safari > Motion & Orientation Access**. Some devices will also not fire if the site isn't hosted with **HTTPS** as "},{"kind":"code","text":"`DeviceMotion`"},{"kind":"text","text":" is now considered a secure API.\nThere is no formal API for detecting the status of "},{"kind":"code","text":"`DeviceMotion`"},{"kind":"text","text":" so this API can sometimes be unreliable on web."}],"blockTags":[{"tag":"@returns","content":[{"kind":"text","text":"A promise that resolves to a "},{"kind":"code","text":"`boolean`"},{"kind":"text","text":" denoting the availability of the accelerometer."}]}]},"type":{"type":"reference","typeArguments":[{"type":"intrinsic","name":"boolean"}],"name":"Promise","qualifiedName":"Promise","package":"typescript"},"overwrites":{"type":"reference","name":"default.isAvailableAsync"}}],"overwrites":{"type":"reference","name":"default.isAvailableAsync"}},{"name":"removeAllListeners","kind":2048,"signatures":[{"name":"removeAllListeners","kind":4096,"comment":{"summary":[{"kind":"text","text":"Removes all registered listeners."}]},"type":{"type":"intrinsic","name":"void"},"inheritedFrom":{"type":"reference","name":"default.removeAllListeners"}}],"inheritedFrom":{"type":"reference","name":"default.removeAllListeners"}},{"name":"removeSubscription","kind":2048,"signatures":[{"name":"removeSubscription","kind":4096,"comment":{"summary":[{"kind":"text","text":"Removes the given subscription."}]},"parameters":[{"name":"subscription","kind":32768,"comment":{"summary":[{"kind":"text","text":"A subscription to remove."}]},"type":{"type":"reference","name":"Subscription"}}],"type":{"type":"intrinsic","name":"void"},"inheritedFrom":{"type":"reference","name":"default.removeSubscription"}}],"inheritedFrom":{"type":"reference","name":"default.removeSubscription"}},{"name":"requestPermissionsAsync","kind":2048,"signatures":[{"name":"requestPermissionsAsync","kind":4096,"comment":{"summary":[{"kind":"text","text":"Asks the user to grant permissions for accessing sensor."}]},"type":{"type":"reference","typeArguments":[{"type":"reference","name":"PermissionResponse"}],"name":"Promise","qualifiedName":"Promise","package":"typescript"},"inheritedFrom":{"type":"reference","name":"default.requestPermissionsAsync"}}],"inheritedFrom":{"type":"reference","name":"default.requestPermissionsAsync"}},{"name":"setUpdateInterval","kind":2048,"signatures":[{"name":"setUpdateInterval","kind":4096,"comment":{"summary":[{"kind":"text","text":"Set the sensor update interval."}]},"parameters":[{"name":"intervalMs","kind":32768,"comment":{"summary":[{"kind":"text","text":"Desired interval in milliseconds between sensor updates.\n> Starting from Android 12 (API level 31), the system has a 200ms limit for each sensor updates.\n>\n> If you need an update interval less than 200ms, you should:\n> * add "},{"kind":"code","text":"`android.permission.HIGH_SAMPLING_RATE_SENSORS`"},{"kind":"text","text":" to [**app.json** "},{"kind":"code","text":"`permissions`"},{"kind":"text","text":" field](/versions/latest/config/app/#permissions)\n> * or if you are using bare workflow, add "},{"kind":"code","text":"``"},{"kind":"text","text":" to **AndroidManifest.xml**."}]},"type":{"type":"intrinsic","name":"number"}}],"type":{"type":"intrinsic","name":"void"},"inheritedFrom":{"type":"reference","name":"default.setUpdateInterval"}}],"inheritedFrom":{"type":"reference","name":"default.setUpdateInterval"}}],"extendedTypes":[{"type":"reference","typeArguments":[{"type":"reference","name":"AccelerometerMeasurement"}],"name":"default"}]},{"name":"default","kind":32,"type":{"type":"reference","name":"AccelerometerSensor"}},{"name":"default","kind":128,"comment":{"summary":[{"kind":"text","text":"A base class for subscribable sensors. The events emitted by this class are measurements\nspecified by the parameter type "},{"kind":"code","text":"`Measurement`"},{"kind":"text","text":"."}]},"children":[{"name":"constructor","kind":512,"signatures":[{"name":"new default","kind":16384,"typeParameter":[{"name":"Measurement","kind":131072}],"parameters":[{"name":"nativeSensorModule","kind":32768,"type":{"type":"intrinsic","name":"any"}},{"name":"nativeEventName","kind":32768,"type":{"type":"intrinsic","name":"string"}}],"type":{"type":"reference","typeArguments":[{"type":"reference","name":"Measurement"}],"name":"default"}}]},{"name":"_listenerCount","kind":1024,"type":{"type":"intrinsic","name":"number"}},{"name":"_nativeEmitter","kind":1024,"type":{"type":"reference","name":"EventEmitter"}},{"name":"_nativeEventName","kind":1024,"type":{"type":"intrinsic","name":"string"}},{"name":"_nativeModule","kind":1024,"type":{"type":"intrinsic","name":"any"}},{"name":"addListener","kind":2048,"signatures":[{"name":"addListener","kind":4096,"parameters":[{"name":"listener","kind":32768,"type":{"type":"reference","typeArguments":[{"type":"reference","name":"Measurement"}],"name":"Listener"}}],"type":{"type":"reference","name":"Subscription"}}]},{"name":"getListenerCount","kind":2048,"signatures":[{"name":"getListenerCount","kind":4096,"comment":{"summary":[{"kind":"text","text":"Returns the registered listeners count."}]},"type":{"type":"intrinsic","name":"number"}}]},{"name":"getPermissionsAsync","kind":2048,"signatures":[{"name":"getPermissionsAsync","kind":4096,"comment":{"summary":[{"kind":"text","text":"Checks user's permissions for accessing sensor."}]},"type":{"type":"reference","typeArguments":[{"type":"reference","name":"PermissionResponse"}],"name":"Promise","qualifiedName":"Promise","package":"typescript"}}]},{"name":"hasListeners","kind":2048,"signatures":[{"name":"hasListeners","kind":4096,"comment":{"summary":[{"kind":"text","text":"Returns boolean which signifies if sensor has any listeners registered."}]},"type":{"type":"intrinsic","name":"boolean"}}]},{"name":"isAvailableAsync","kind":2048,"signatures":[{"name":"isAvailableAsync","kind":4096,"comment":{"summary":[{"kind":"text","text":"> **info** You should always check the sensor availability before attempting to use it."}],"blockTags":[{"tag":"@returns","content":[{"kind":"text","text":"A promise that resolves to a "},{"kind":"code","text":"`boolean`"},{"kind":"text","text":" denoting the availability of the sensor."}]}]},"type":{"type":"reference","typeArguments":[{"type":"intrinsic","name":"boolean"}],"name":"Promise","qualifiedName":"Promise","package":"typescript"}}]},{"name":"removeAllListeners","kind":2048,"signatures":[{"name":"removeAllListeners","kind":4096,"comment":{"summary":[{"kind":"text","text":"Removes all registered listeners."}]},"type":{"type":"intrinsic","name":"void"}}]},{"name":"removeSubscription","kind":2048,"signatures":[{"name":"removeSubscription","kind":4096,"comment":{"summary":[{"kind":"text","text":"Removes the given subscription."}]},"parameters":[{"name":"subscription","kind":32768,"comment":{"summary":[{"kind":"text","text":"A subscription to remove."}]},"type":{"type":"reference","name":"Subscription"}}],"type":{"type":"intrinsic","name":"void"}}]},{"name":"requestPermissionsAsync","kind":2048,"signatures":[{"name":"requestPermissionsAsync","kind":4096,"comment":{"summary":[{"kind":"text","text":"Asks the user to grant permissions for accessing sensor."}]},"type":{"type":"reference","typeArguments":[{"type":"reference","name":"PermissionResponse"}],"name":"Promise","qualifiedName":"Promise","package":"typescript"}}]},{"name":"setUpdateInterval","kind":2048,"signatures":[{"name":"setUpdateInterval","kind":4096,"comment":{"summary":[{"kind":"text","text":"Set the sensor update interval."}]},"parameters":[{"name":"intervalMs","kind":32768,"comment":{"summary":[{"kind":"text","text":"Desired interval in milliseconds between sensor updates.\n> Starting from Android 12 (API level 31), the system has a 200ms limit for each sensor updates.\n>\n> If you need an update interval less than 200ms, you should:\n> * add "},{"kind":"code","text":"`android.permission.HIGH_SAMPLING_RATE_SENSORS`"},{"kind":"text","text":" to [**app.json** "},{"kind":"code","text":"`permissions`"},{"kind":"text","text":" field](/versions/latest/config/app/#permissions)\n> * or if you are using bare workflow, add "},{"kind":"code","text":"``"},{"kind":"text","text":" to **AndroidManifest.xml**."}]},"type":{"type":"intrinsic","name":"number"}}],"type":{"type":"intrinsic","name":"void"}}]}],"typeParameters":[{"name":"Measurement","kind":131072}],"extendedBy":[{"type":"reference","name":"AccelerometerSensor"}]},{"name":"PermissionExpiration","kind":4194304,"comment":{"summary":[{"kind":"text","text":"Permission expiration time. Currently, all permissions are granted permanently."}]},"type":{"type":"union","types":[{"type":"literal","value":"never"},{"type":"intrinsic","name":"number"}]}},{"name":"PermissionResponse","kind":256,"comment":{"summary":[{"kind":"text","text":"An object obtained by permissions get and request functions."}]},"children":[{"name":"canAskAgain","kind":1024,"comment":{"summary":[{"kind":"text","text":"Indicates if user can be asked again for specific permission.\nIf not, one should be directed to the Settings app\nin order to enable/disable the permission."}]},"type":{"type":"intrinsic","name":"boolean"}},{"name":"expires","kind":1024,"comment":{"summary":[{"kind":"text","text":"Determines time when the permission expires."}]},"type":{"type":"reference","name":"PermissionExpiration"}},{"name":"granted","kind":1024,"comment":{"summary":[{"kind":"text","text":"A convenience boolean that indicates if the permission is granted."}]},"type":{"type":"intrinsic","name":"boolean"}},{"name":"status","kind":1024,"comment":{"summary":[{"kind":"text","text":"Determines the status of the permission."}]},"type":{"type":"reference","name":"PermissionStatus"}}]},{"name":"PermissionStatus","kind":8,"children":[{"name":"DENIED","kind":16,"comment":{"summary":[{"kind":"text","text":"User has denied the permission."}]},"type":{"type":"literal","value":"denied"}},{"name":"GRANTED","kind":16,"comment":{"summary":[{"kind":"text","text":"User has granted the permission."}]},"type":{"type":"literal","value":"granted"}},{"name":"UNDETERMINED","kind":16,"comment":{"summary":[{"kind":"text","text":"User hasn't granted or denied the permission yet."}]},"type":{"type":"literal","value":"undetermined"}}]},{"name":"Subscription","kind":4194304,"type":{"type":"reflection","declaration":{"name":"__type","kind":65536,"children":[{"name":"remove","kind":1024,"type":{"type":"reflection","declaration":{"name":"__type","kind":65536,"signatures":[{"name":"__type","kind":4096,"comment":{"summary":[{"kind":"text","text":"A method to unsubscribe the listener."}]},"type":{"type":"intrinsic","name":"void"}}]}}}]}}}]}
\ No newline at end of file
diff --git a/docs/public/static/data/v49.0.0/expo-apple-authentication.json b/docs/public/static/data/v49.0.0/expo-apple-authentication.json
new file mode 100644
index 0000000000000..380f6e82e755e
--- /dev/null
+++ b/docs/public/static/data/v49.0.0/expo-apple-authentication.json
@@ -0,0 +1 @@
+{"name":"expo-apple-authentication","kind":1,"children":[{"name":"AppleAuthenticationButtonStyle","kind":8,"comment":{"summary":[{"kind":"text","text":"An enum whose values control which pre-defined color scheme to use when rendering an ["},{"kind":"code","text":"`AppleAuthenticationButton`"},{"kind":"text","text":"](#appleauthenticationappleauthenticationbutton)."}]},"children":[{"name":"BLACK","kind":16,"comment":{"summary":[{"kind":"text","text":"Black button with white text."}]},"type":{"type":"literal","value":2}},{"name":"WHITE","kind":16,"comment":{"summary":[{"kind":"text","text":"White button with black text."}]},"type":{"type":"literal","value":0}},{"name":"WHITE_OUTLINE","kind":16,"comment":{"summary":[{"kind":"text","text":"White button with a black outline and black text."}]},"type":{"type":"literal","value":1}}]},{"name":"AppleAuthenticationButtonType","kind":8,"comment":{"summary":[{"kind":"text","text":"An enum whose values control which pre-defined text to use when rendering an ["},{"kind":"code","text":"`AppleAuthenticationButton`"},{"kind":"text","text":"](#appleauthenticationappleauthenticationbutton)."}]},"children":[{"name":"CONTINUE","kind":16,"comment":{"summary":[{"kind":"text","text":"\"Continue with Apple\""}]},"type":{"type":"literal","value":1}},{"name":"SIGN_IN","kind":16,"comment":{"summary":[{"kind":"text","text":"\"Sign in with Apple\""}]},"type":{"type":"literal","value":0}},{"name":"SIGN_UP","kind":16,"comment":{"summary":[{"kind":"text","text":"\"Sign up with Apple\""}],"blockTags":[{"tag":"@platform","content":[{"kind":"text","text":"ios 13.2+"}]}]},"type":{"type":"literal","value":2}}]},{"name":"AppleAuthenticationCredentialState","kind":8,"comment":{"summary":[{"kind":"text","text":"An enum whose values specify state of the credential when checked with ["},{"kind":"code","text":"`AppleAuthentication.getCredentialStateAsync()`"},{"kind":"text","text":"](#appleauthenticationgetcredentialstateasyncuser)."}],"blockTags":[{"tag":"@see","content":[{"kind":"text","text":"[Apple\nDocumentation](https://developer.apple.com/documentation/authenticationservices/asauthorizationappleidprovidercredentialstate)\nfor more details."}]}]},"children":[{"name":"AUTHORIZED","kind":16,"type":{"type":"literal","value":1}},{"name":"NOT_FOUND","kind":16,"type":{"type":"literal","value":2}},{"name":"REVOKED","kind":16,"type":{"type":"literal","value":0}},{"name":"TRANSFERRED","kind":16,"type":{"type":"literal","value":3}}]},{"name":"AppleAuthenticationOperation","kind":8,"children":[{"name":"IMPLICIT","kind":16,"comment":{"summary":[{"kind":"text","text":"An operation that depends on the particular kind of credential provider."}]},"type":{"type":"literal","value":0}},{"name":"LOGIN","kind":16,"type":{"type":"literal","value":1}},{"name":"LOGOUT","kind":16,"type":{"type":"literal","value":3}},{"name":"REFRESH","kind":16,"type":{"type":"literal","value":2}}]},{"name":"AppleAuthenticationScope","kind":8,"comment":{"summary":[{"kind":"text","text":"An enum whose values specify scopes you can request when calling ["},{"kind":"code","text":"`AppleAuthentication.signInAsync()`"},{"kind":"text","text":"](#appleauthenticationsigninasyncoptions).\n\n> Note that it is possible that you will not be granted all of the scopes which you request.\n> You will still need to handle null values for any fields you request."}],"blockTags":[{"tag":"@see","content":[{"kind":"text","text":"[Apple\nDocumentation](https://developer.apple.com/documentation/authenticationservices/asauthorizationscope)\nfor more details."}]}]},"children":[{"name":"EMAIL","kind":16,"type":{"type":"literal","value":1}},{"name":"FULL_NAME","kind":16,"type":{"type":"literal","value":0}}]},{"name":"AppleAuthenticationUserDetectionStatus","kind":8,"comment":{"summary":[{"kind":"text","text":"An enum whose values specify the system's best guess for how likely the current user is a real person."}],"blockTags":[{"tag":"@see","content":[{"kind":"text","text":"[Apple\nDocumentation](https://developer.apple.com/documentation/authenticationservices/asuserdetectionstatus)\nfor more details."}]}]},"children":[{"name":"LIKELY_REAL","kind":16,"comment":{"summary":[{"kind":"text","text":"The user appears to be a real person."}]},"type":{"type":"literal","value":2}},{"name":"UNKNOWN","kind":16,"comment":{"summary":[{"kind":"text","text":"The system has not determined whether the user might be a real person."}]},"type":{"type":"literal","value":1}},{"name":"UNSUPPORTED","kind":16,"comment":{"summary":[{"kind":"text","text":"The system does not support this determination and there is no data."}]},"type":{"type":"literal","value":0}}]},{"name":"AppleAuthenticationButtonProps","kind":4194304,"type":{"type":"intersection","types":[{"type":"reference","name":"ViewProps","qualifiedName":"ViewProps","package":"react-native"},{"type":"reflection","declaration":{"name":"__type","kind":65536,"children":[{"name":"buttonStyle","kind":1024,"comment":{"summary":[{"kind":"text","text":"The Apple-defined color scheme to use to display the button."}]},"type":{"type":"reference","name":"AppleAuthenticationButtonStyle"}},{"name":"buttonType","kind":1024,"comment":{"summary":[{"kind":"text","text":"The type of button text to display (\"Sign In with Apple\" vs. \"Continue with Apple\")."}]},"type":{"type":"reference","name":"AppleAuthenticationButtonType"}},{"name":"cornerRadius","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"The border radius to use when rendering the button. This works similarly to\n"},{"kind":"code","text":"`style.borderRadius`"},{"kind":"text","text":" in other Views."}]},"type":{"type":"intrinsic","name":"number"}},{"name":"onPress","kind":1024,"type":{"type":"reflection","declaration":{"name":"__type","kind":65536,"signatures":[{"name":"__type","kind":4096,"comment":{"summary":[{"kind":"text","text":"The method to call when the user presses the button. You should call ["},{"kind":"code","text":"`AppleAuthentication.signInAsync`"},{"kind":"text","text":"](#isavailableasync)\nin here."}]},"type":{"type":"intrinsic","name":"void"}}]}}},{"name":"style","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"The custom style to apply to the button. Should not include "},{"kind":"code","text":"`backgroundColor`"},{"kind":"text","text":" or "},{"kind":"code","text":"`borderRadius`"},{"kind":"text","text":"\nproperties."}]},"type":{"type":"reference","typeArguments":[{"type":"reference","typeArguments":[{"type":"reference","name":"ViewStyle","qualifiedName":"ViewStyle","package":"react-native"},{"type":"union","types":[{"type":"literal","value":"backgroundColor"},{"type":"literal","value":"borderRadius"}]}],"name":"Omit","qualifiedName":"Omit","package":"typescript"}],"name":"StyleProp","qualifiedName":"StyleProp","package":"react-native"}}]}}]}},{"name":"AppleAuthenticationCredential","kind":4194304,"comment":{"summary":[{"kind":"text","text":"The object type returned from a successful call to ["},{"kind":"code","text":"`AppleAuthentication.signInAsync()`"},{"kind":"text","text":"](#appleauthenticationsigninasyncoptions),\n["},{"kind":"code","text":"`AppleAuthentication.refreshAsync()`"},{"kind":"text","text":"](#appleauthenticationrefreshasyncoptions), or ["},{"kind":"code","text":"`AppleAuthentication.signOutAsync()`"},{"kind":"text","text":"](#appleauthenticationsignoutasyncoptions)\nwhich contains all of the pertinent user and credential information."}],"blockTags":[{"tag":"@see","content":[{"kind":"text","text":"[Apple\nDocumentation](https://developer.apple.com/documentation/authenticationservices/asauthorizationappleidcredential)\nfor more details."}]}]},"type":{"type":"reflection","declaration":{"name":"__type","kind":65536,"children":[{"name":"authorizationCode","kind":1024,"comment":{"summary":[{"kind":"text","text":"A short-lived session token used by your app for proof of authorization when interacting with\nthe app's server counterpart. Unlike "},{"kind":"code","text":"`user`"},{"kind":"text","text":", this is ephemeral and will change each session."}]},"type":{"type":"union","types":[{"type":"intrinsic","name":"string"},{"type":"literal","value":null}]}},{"name":"email","kind":1024,"comment":{"summary":[{"kind":"text","text":"The user's email address. Might not be present if you didn't request the "},{"kind":"code","text":"`EMAIL`"},{"kind":"text","text":" scope. May\nalso be null if this is not the first time the user has signed into your app. If the user chose\nto withhold their email address, this field will instead contain an obscured email address with\nan Apple domain."}]},"type":{"type":"union","types":[{"type":"intrinsic","name":"string"},{"type":"literal","value":null}]}},{"name":"fullName","kind":1024,"comment":{"summary":[{"kind":"text","text":"The user's name. May be "},{"kind":"code","text":"`null`"},{"kind":"text","text":" or contain "},{"kind":"code","text":"`null`"},{"kind":"text","text":" values if you didn't request the "},{"kind":"code","text":"`FULL_NAME`"},{"kind":"text","text":"\nscope, if the user denied access, or if this is not the first time the user has signed into\nyour app."}]},"type":{"type":"union","types":[{"type":"reference","name":"AppleAuthenticationFullName"},{"type":"literal","value":null}]}},{"name":"identityToken","kind":1024,"comment":{"summary":[{"kind":"text","text":"A JSON Web Token (JWT) that securely communicates information about the user to your app."}]},"type":{"type":"union","types":[{"type":"intrinsic","name":"string"},{"type":"literal","value":null}]}},{"name":"realUserStatus","kind":1024,"comment":{"summary":[{"kind":"text","text":"A value that indicates whether the user appears to the system to be a real person."}]},"type":{"type":"reference","name":"AppleAuthenticationUserDetectionStatus"}},{"name":"state","kind":1024,"comment":{"summary":[{"kind":"text","text":"An arbitrary string that your app provided as "},{"kind":"code","text":"`state`"},{"kind":"text","text":" in the request that generated the\ncredential. Used to verify that the response was from the request you made. Can be used to\navoid replay attacks. If you did not provide "},{"kind":"code","text":"`state`"},{"kind":"text","text":" when making the sign-in request, this field\nwill be "},{"kind":"code","text":"`null`"},{"kind":"text","text":"."}]},"type":{"type":"union","types":[{"type":"intrinsic","name":"string"},{"type":"literal","value":null}]}},{"name":"user","kind":1024,"comment":{"summary":[{"kind":"text","text":"An identifier associated with the authenticated user. You can use this to check if the user is\nstill authenticated later. This is stable and can be shared across apps released under the same\ndevelopment team. The same user will have a different identifier for apps released by other\ndevelopers."}]},"type":{"type":"intrinsic","name":"string"}}]}}},{"name":"AppleAuthenticationFullName","kind":4194304,"comment":{"summary":[{"kind":"text","text":"An object representing the tokenized portions of the user's full name. Any of all of the fields\nmay be "},{"kind":"code","text":"`null`"},{"kind":"text","text":". Only applicable fields that the user has allowed your app to access will be nonnull."}]},"type":{"type":"reflection","declaration":{"name":"__type","kind":65536,"children":[{"name":"familyName","kind":1024,"type":{"type":"union","types":[{"type":"intrinsic","name":"string"},{"type":"literal","value":null}]}},{"name":"givenName","kind":1024,"type":{"type":"union","types":[{"type":"intrinsic","name":"string"},{"type":"literal","value":null}]}},{"name":"middleName","kind":1024,"type":{"type":"union","types":[{"type":"intrinsic","name":"string"},{"type":"literal","value":null}]}},{"name":"namePrefix","kind":1024,"type":{"type":"union","types":[{"type":"intrinsic","name":"string"},{"type":"literal","value":null}]}},{"name":"nameSuffix","kind":1024,"type":{"type":"union","types":[{"type":"intrinsic","name":"string"},{"type":"literal","value":null}]}},{"name":"nickname","kind":1024,"type":{"type":"union","types":[{"type":"intrinsic","name":"string"},{"type":"literal","value":null}]}}]}}},{"name":"AppleAuthenticationRefreshOptions","kind":4194304,"comment":{"summary":[{"kind":"text","text":"The options you can supply when making a call to ["},{"kind":"code","text":"`AppleAuthentication.refreshAsync()`"},{"kind":"text","text":"](#appleauthenticationrefreshasyncoptions).\nYou must include the ID string of the user whose credentials you'd like to refresh."}],"blockTags":[{"tag":"@see","content":[{"kind":"text","text":"[Apple\nDocumentation](https://developer.apple.com/documentation/authenticationservices/asauthorizationopenidrequest)\nfor more details."}]}]},"type":{"type":"reflection","declaration":{"name":"__type","kind":65536,"children":[{"name":"requestedScopes","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"Array of user information scopes to which your app is requesting access. Note that the user can\nchoose to deny your app access to any scope at the time of logging in. You will still need to\nhandle "},{"kind":"code","text":"`null`"},{"kind":"text","text":" values for any scopes you request. Additionally, note that the requested scopes\nwill only be provided to you the first time each user signs into your app; in subsequent\nrequests they will be "},{"kind":"code","text":"`null`"},{"kind":"text","text":". Defaults to "},{"kind":"code","text":"`[]`"},{"kind":"text","text":" (no scopes)."}]},"type":{"type":"array","elementType":{"type":"reference","name":"AppleAuthenticationScope"}}},{"name":"state","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"An arbitrary string that is returned unmodified in the corresponding credential after a\nsuccessful authentication. This can be used to verify that the response was from the request\nyou made and avoid replay attacks. More information on this property is available in the\nOAuth 2.0 protocol [RFC6749](https://tools.ietf.org/html/rfc6749#section-10.12)."}]},"type":{"type":"intrinsic","name":"string"}},{"name":"user","kind":1024,"type":{"type":"intrinsic","name":"string"}}]}}},{"name":"AppleAuthenticationSignInOptions","kind":4194304,"comment":{"summary":[{"kind":"text","text":"The options you can supply when making a call to ["},{"kind":"code","text":"`AppleAuthentication.signInAsync()`"},{"kind":"text","text":"](#appleauthenticationsigninasyncoptions).\nNone of these options are required."}],"blockTags":[{"tag":"@see","content":[{"kind":"text","text":"[Apple\nDocumentation](https://developer.apple.com/documentation/authenticationservices/asauthorizationopenidrequest)\nfor more details."}]}]},"type":{"type":"reflection","declaration":{"name":"__type","kind":65536,"children":[{"name":"nonce","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"An arbitrary string that is used to prevent replay attacks. See more information on this in the\n[OpenID Connect specification](https://openid.net/specs/openid-connect-core-1_0.html#CodeFlowSteps)."}]},"type":{"type":"intrinsic","name":"string"}},{"name":"requestedScopes","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"Array of user information scopes to which your app is requesting access. Note that the user can\nchoose to deny your app access to any scope at the time of logging in. You will still need to\nhandle "},{"kind":"code","text":"`null`"},{"kind":"text","text":" values for any scopes you request. Additionally, note that the requested scopes\nwill only be provided to you the first time each user signs into your app; in subsequent\nrequests they will be "},{"kind":"code","text":"`null`"},{"kind":"text","text":". Defaults to "},{"kind":"code","text":"`[]`"},{"kind":"text","text":" (no scopes)."}]},"type":{"type":"array","elementType":{"type":"reference","name":"AppleAuthenticationScope"}}},{"name":"state","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"An arbitrary string that is returned unmodified in the corresponding credential after a\nsuccessful authentication. This can be used to verify that the response was from the request\nyou made and avoid replay attacks. More information on this property is available in the\nOAuth 2.0 protocol [RFC6749](https://tools.ietf.org/html/rfc6749#section-10.12)."}]},"type":{"type":"intrinsic","name":"string"}}]}}},{"name":"AppleAuthenticationSignOutOptions","kind":4194304,"comment":{"summary":[{"kind":"text","text":"The options you can supply when making a call to ["},{"kind":"code","text":"`AppleAuthentication.signOutAsync()`"},{"kind":"text","text":"](#appleauthenticationsignoutasyncoptions).\nYou must include the ID string of the user to sign out."}],"blockTags":[{"tag":"@see","content":[{"kind":"text","text":"[Apple\nDocumentation](https://developer.apple.com/documentation/authenticationservices/asauthorizationopenidrequest)\nfor more details."}]}]},"type":{"type":"reflection","declaration":{"name":"__type","kind":65536,"children":[{"name":"state","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"An arbitrary string that is returned unmodified in the corresponding credential after a\nsuccessful authentication. This can be used to verify that the response was from the request\nyou made and avoid replay attacks. More information on this property is available in the\nOAuth 2.0 protocol [RFC6749](https://tools.ietf.org/html/rfc6749#section-10.12)."}]},"type":{"type":"intrinsic","name":"string"}},{"name":"user","kind":1024,"type":{"type":"intrinsic","name":"string"}}]}}},{"name":"Subscription","kind":4194304,"type":{"type":"reflection","declaration":{"name":"__type","kind":65536,"children":[{"name":"remove","kind":1024,"type":{"type":"reflection","declaration":{"name":"__type","kind":65536,"signatures":[{"name":"__type","kind":4096,"comment":{"summary":[{"kind":"text","text":"A method to unsubscribe the listener."}]},"type":{"type":"intrinsic","name":"void"}}]}}}]}}},{"name":"AppleAuthenticationButton","kind":64,"signatures":[{"name":"AppleAuthenticationButton","kind":4096,"comment":{"summary":[{"kind":"text","text":"This component displays the proprietary \"Sign In with Apple\" / \"Continue with Apple\" button on\nyour screen. The App Store Guidelines require you to use this component to start the\nauthentication process instead of a custom button. Limited customization of the button is\navailable via the provided properties.\n\nYou should only attempt to render this if ["},{"kind":"code","text":"`AppleAuthentication.isAvailableAsync()`"},{"kind":"text","text":"](#isavailableasync)\nresolves to "},{"kind":"code","text":"`true`"},{"kind":"text","text":". This component will render nothing if it is not available, and you will get\na warning in development mode ("},{"kind":"code","text":"`__DEV__ === true`"},{"kind":"text","text":").\n\nThe properties of this component extend from "},{"kind":"code","text":"`View`"},{"kind":"text","text":"; however, you should not attempt to set\n"},{"kind":"code","text":"`backgroundColor`"},{"kind":"text","text":" or "},{"kind":"code","text":"`borderRadius`"},{"kind":"text","text":" with the "},{"kind":"code","text":"`style`"},{"kind":"text","text":" property. This will not work and is against\nthe App Store Guidelines. Instead, you should use the "},{"kind":"code","text":"`buttonStyle`"},{"kind":"text","text":" property to choose one of the\npredefined color styles and the "},{"kind":"code","text":"`cornerRadius`"},{"kind":"text","text":" property to change the border radius of the\nbutton.\n\nMake sure to attach height and width via the style props as without these styles, the button will\nnot appear on the screen."}],"blockTags":[{"tag":"@see","content":[{"kind":"text","text":"[Apple\nDocumentation](https://developer.apple.com/documentation/authenticationservices/asauthorizationappleidbutton)\nfor more details."}]}]},"parameters":[{"name":"__namedParameters","kind":32768,"type":{"type":"reference","name":"AppleAuthenticationButtonProps"}}],"type":{"type":"union","types":[{"type":"literal","value":null},{"type":"reference","name":"Element","qualifiedName":"global.JSX.Element","package":"@types/react"}]}}]},{"name":"addRevokeListener","kind":64,"signatures":[{"name":"addRevokeListener","kind":4096,"parameters":[{"name":"listener","kind":32768,"type":{"type":"reflection","declaration":{"name":"__type","kind":65536,"signatures":[{"name":"__type","kind":4096,"type":{"type":"intrinsic","name":"void"}}]}}}],"type":{"type":"reference","name":"Subscription"}}]},{"name":"getCredentialStateAsync","kind":64,"signatures":[{"name":"getCredentialStateAsync","kind":4096,"comment":{"summary":[{"kind":"text","text":"Queries the current state of a user credential, to determine if it is still valid or if it has been revoked.\n> **Note:** This method must be tested on a real device. On the iOS simulator it always throws an error."}],"blockTags":[{"tag":"@returns","content":[{"kind":"text","text":"A promise that fulfills with an ["},{"kind":"code","text":"`AppleAuthenticationCredentialState`"},{"kind":"text","text":"](#appleauthenticationcredentialstate)\nvalue depending on the state of the credential."}]}]},"parameters":[{"name":"user","kind":32768,"comment":{"summary":[{"kind":"text","text":"The unique identifier for the user whose credential state you'd like to check.\nThis should come from the user field of an ["},{"kind":"code","text":"`AppleAuthenticationCredential`"},{"kind":"text","text":"](#appleauthenticationcredentialstate) object."}]},"type":{"type":"intrinsic","name":"string"}}],"type":{"type":"reference","typeArguments":[{"type":"reference","name":"AppleAuthenticationCredentialState"}],"name":"Promise","qualifiedName":"Promise","package":"typescript"}}]},{"name":"isAvailableAsync","kind":64,"signatures":[{"name":"isAvailableAsync","kind":4096,"comment":{"summary":[{"kind":"text","text":"Determine if the current device's operating system supports Apple authentication."}],"blockTags":[{"tag":"@returns","content":[{"kind":"text","text":"A promise that fulfills with "},{"kind":"code","text":"`true`"},{"kind":"text","text":" if the system supports Apple authentication, and "},{"kind":"code","text":"`false`"},{"kind":"text","text":" otherwise."}]}]},"type":{"type":"reference","typeArguments":[{"type":"intrinsic","name":"boolean"}],"name":"Promise","qualifiedName":"Promise","package":"typescript"}}]},{"name":"refreshAsync","kind":64,"signatures":[{"name":"refreshAsync","kind":4096,"comment":{"summary":[{"kind":"text","text":"An operation that refreshes the logged-in user’s credentials.\nCalling this method will show the sign in modal before actually refreshing the user credentials."}],"blockTags":[{"tag":"@returns","content":[{"kind":"text","text":"A promise that fulfills with an ["},{"kind":"code","text":"`AppleAuthenticationCredential`"},{"kind":"text","text":"](#appleauthenticationcredential)\nobject after a successful authentication, and rejects with "},{"kind":"code","text":"`ERR_REQUEST_CANCELED`"},{"kind":"text","text":" if the user cancels the\nrefresh operation."}]}]},"parameters":[{"name":"options","kind":32768,"comment":{"summary":[{"kind":"text","text":"An ["},{"kind":"code","text":"`AppleAuthenticationRefreshOptions`"},{"kind":"text","text":"](#appleauthenticationrefreshoptions) object"}]},"type":{"type":"reference","name":"AppleAuthenticationRefreshOptions"}}],"type":{"type":"reference","typeArguments":[{"type":"reference","name":"AppleAuthenticationCredential"}],"name":"Promise","qualifiedName":"Promise","package":"typescript"}}]},{"name":"signInAsync","kind":64,"signatures":[{"name":"signInAsync","kind":4096,"comment":{"summary":[{"kind":"text","text":"Sends a request to the operating system to initiate the Apple authentication flow, which will\npresent a modal to the user over your app and allow them to sign in.\n\nYou can request access to the user's full name and email address in this method, which allows you\nto personalize your UI for signed in users. However, users can deny access to either or both\nof these options at runtime.\n\nAdditionally, you will only receive Apple Authentication Credentials the first time users sign\ninto your app, so you must store it for later use. It's best to store this information either\nserver-side, or using [SecureStore](./securestore), so that the data persists across app installs.\nYou can use ["},{"kind":"code","text":"`AppleAuthenticationCredential.user`"},{"kind":"text","text":"](#appleauthenticationcredential) to identify\nthe user, since this remains the same for apps released by the same developer."}],"blockTags":[{"tag":"@returns","content":[{"kind":"text","text":"A promise that fulfills with an ["},{"kind":"code","text":"`AppleAuthenticationCredential`"},{"kind":"text","text":"](#appleauthenticationcredential)\nobject after a successful authentication, and rejects with "},{"kind":"code","text":"`ERR_REQUEST_CANCELED`"},{"kind":"text","text":" if the user cancels the\nsign-in operation."}]}]},"parameters":[{"name":"options","kind":32768,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"An optional ["},{"kind":"code","text":"`AppleAuthenticationSignInOptions`"},{"kind":"text","text":"](#appleauthenticationsigninoptions) object"}]},"type":{"type":"reference","name":"AppleAuthenticationSignInOptions"}}],"type":{"type":"reference","typeArguments":[{"type":"reference","name":"AppleAuthenticationCredential"}],"name":"Promise","qualifiedName":"Promise","package":"typescript"}}]},{"name":"signOutAsync","kind":64,"signatures":[{"name":"signOutAsync","kind":4096,"comment":{"summary":[{"kind":"text","text":"An operation that ends the authenticated session.\nCalling this method will show the sign in modal before actually signing the user out.\n\nIt is not recommended to use this method to sign out the user as it works counterintuitively.\nInstead of using this method it is recommended to simply clear all the user's data collected\nfrom using ["},{"kind":"code","text":"`signInAsync`"},{"kind":"text","text":"](./#signinasync) or ["},{"kind":"code","text":"`refreshAsync`"},{"kind":"text","text":"](./#refreshasync) methods."}],"blockTags":[{"tag":"@returns","content":[{"kind":"text","text":"A promise that fulfills with an ["},{"kind":"code","text":"`AppleAuthenticationCredential`"},{"kind":"text","text":"](#appleauthenticationcredential)\nobject after a successful authentication, and rejects with "},{"kind":"code","text":"`ERR_REQUEST_CANCELED`"},{"kind":"text","text":" if the user cancels the\nsign-out operation."}]}]},"parameters":[{"name":"options","kind":32768,"comment":{"summary":[{"kind":"text","text":"An ["},{"kind":"code","text":"`AppleAuthenticationSignOutOptions`"},{"kind":"text","text":"](#appleauthenticationsignoutoptions) object"}]},"type":{"type":"reference","name":"AppleAuthenticationSignOutOptions"}}],"type":{"type":"reference","typeArguments":[{"type":"reference","name":"AppleAuthenticationCredential"}],"name":"Promise","qualifiedName":"Promise","package":"typescript"}}]}]}
\ No newline at end of file
diff --git a/docs/public/static/data/v49.0.0/expo-application.json b/docs/public/static/data/v49.0.0/expo-application.json
new file mode 100644
index 0000000000000..73d4bb3cbebb8
--- /dev/null
+++ b/docs/public/static/data/v49.0.0/expo-application.json
@@ -0,0 +1 @@
+{"name":"expo-application","kind":1,"children":[{"name":"ApplicationReleaseType","kind":8,"children":[{"name":"AD_HOC","kind":16,"type":{"type":"literal","value":4}},{"name":"APP_STORE","kind":16,"type":{"type":"literal","value":5}},{"name":"DEVELOPMENT","kind":16,"type":{"type":"literal","value":3}},{"name":"ENTERPRISE","kind":16,"type":{"type":"literal","value":2}},{"name":"SIMULATOR","kind":16,"type":{"type":"literal","value":1}},{"name":"UNKNOWN","kind":16,"type":{"type":"literal","value":0}}]},{"name":"PushNotificationServiceEnvironment","kind":4194304,"type":{"type":"union","types":[{"type":"literal","value":"development"},{"type":"literal","value":"production"},{"type":"literal","value":null}]}},{"name":"androidId","kind":32,"flags":{"isConst":true},"comment":{"summary":[{"kind":"text","text":"The value of ["},{"kind":"code","text":"`Settings.Secure.ANDROID_ID`"},{"kind":"text","text":"](https://developer.android.com/reference/android/provider/Settings.Secure.html#ANDROID_ID).\nThis is a hexadecimal "},{"kind":"code","text":"`string`"},{"kind":"text","text":" unique to each combination of app-signing key, user, and device.\nThe value may change if a factory reset is performed on the device or if an APK signing key changes.\nFor more information about how the platform handles "},{"kind":"code","text":"`ANDROID_ID`"},{"kind":"text","text":" in Android 8.0 (API level 26)\nand higher, see [Android 8.0 Behavior Changes](https://developer.android.com/about/versions/oreo/android-8.0-changes.html#privacy-all).\nOn iOS and web, this value is "},{"kind":"code","text":"`null`"},{"kind":"text","text":".\n> In versions of the platform lower than Android 8.0 (API level 26), this value remains constant\n> for the lifetime of the user's device. See the [ANDROID_ID](https://developer.android.com/reference/android/provider/Settings.Secure.html#ANDROID_ID)\n> official docs for more information."}],"blockTags":[{"tag":"@example","content":[{"kind":"code","text":"`\"dd96dec43fb81c97\"`"}]},{"tag":"@platform","content":[{"kind":"text","text":"android"}]}]},"type":{"type":"union","types":[{"type":"intrinsic","name":"string"},{"type":"literal","value":null}]},"defaultValue":"..."},{"name":"applicationId","kind":32,"flags":{"isConst":true},"comment":{"summary":[{"kind":"text","text":"The ID of the application. On Android, this is the application ID. On iOS, this is the bundle ID.\nOn web, this is "},{"kind":"code","text":"`null`"},{"kind":"text","text":"."}],"blockTags":[{"tag":"@example","content":[{"kind":"code","text":"`\"com.cocoacasts.scribbles\"`"},{"kind":"text","text":", "},{"kind":"code","text":"`\"com.apple.Pages\"`"}]}]},"type":{"type":"union","types":[{"type":"intrinsic","name":"string"},{"type":"literal","value":null}]},"defaultValue":"..."},{"name":"applicationName","kind":32,"flags":{"isConst":true},"comment":{"summary":[{"kind":"text","text":"The human-readable name of the application that is displayed with the app's icon on the device's\nhome screen or desktop. On Android and iOS, this value is a "},{"kind":"code","text":"`string`"},{"kind":"text","text":" unless the name could not be\nretrieved, in which case this value will be "},{"kind":"code","text":"`null`"},{"kind":"text","text":". On web this value is "},{"kind":"code","text":"`null`"},{"kind":"text","text":"."}],"blockTags":[{"tag":"@example","content":[{"kind":"code","text":"`\"Expo\"`"},{"kind":"text","text":", "},{"kind":"code","text":"`\"Yelp\"`"},{"kind":"text","text":", "},{"kind":"code","text":"`\"Instagram\"`"}]}]},"type":{"type":"union","types":[{"type":"intrinsic","name":"string"},{"type":"literal","value":null}]},"defaultValue":"..."},{"name":"nativeApplicationVersion","kind":32,"flags":{"isConst":true},"comment":{"summary":[{"kind":"text","text":"The human-readable version of the native application that may be displayed in the app store.\nThis is the "},{"kind":"code","text":"`Info.plist`"},{"kind":"text","text":" value for "},{"kind":"code","text":"`CFBundleShortVersionString`"},{"kind":"text","text":" on iOS and the version name set\nby "},{"kind":"code","text":"`version`"},{"kind":"text","text":" in "},{"kind":"code","text":"`app.json`"},{"kind":"text","text":" on Android at the time the native app was built.\nOn web, this value is "},{"kind":"code","text":"`null`"},{"kind":"text","text":"."}],"blockTags":[{"tag":"@example","content":[{"kind":"code","text":"`\"2.11.0\"`"}]}]},"type":{"type":"union","types":[{"type":"intrinsic","name":"string"},{"type":"literal","value":null}]},"defaultValue":"..."},{"name":"nativeBuildVersion","kind":32,"flags":{"isConst":true},"comment":{"summary":[{"kind":"text","text":"The internal build version of the native application that the app store may use to distinguish\nbetween different binaries. This is the "},{"kind":"code","text":"`Info.plist`"},{"kind":"text","text":" value for "},{"kind":"code","text":"`CFBundleVersion`"},{"kind":"text","text":" on iOS (set with\n"},{"kind":"code","text":"`ios.buildNumber`"},{"kind":"text","text":" value in "},{"kind":"code","text":"`app.json`"},{"kind":"text","text":" in a standalone app) and the version code set by\n"},{"kind":"code","text":"`android.versionCode`"},{"kind":"text","text":" in "},{"kind":"code","text":"`app.json`"},{"kind":"text","text":" on Android at the time the native app was built. On web, this\nvalue is "},{"kind":"code","text":"`null`"},{"kind":"text","text":". The return type on Android and iOS is "},{"kind":"code","text":"`string`"},{"kind":"text","text":"."}],"blockTags":[{"tag":"@example","content":[{"kind":"text","text":"iOS: "},{"kind":"code","text":"`\"2.11.0\"`"},{"kind":"text","text":", Android: "},{"kind":"code","text":"`\"114\"`"}]}]},"type":{"type":"union","types":[{"type":"intrinsic","name":"string"},{"type":"literal","value":null}]},"defaultValue":"..."},{"name":"getInstallReferrerAsync","kind":64,"signatures":[{"name":"getInstallReferrerAsync","kind":4096,"comment":{"summary":[{"kind":"text","text":"Gets the referrer URL of the installed app with the ["},{"kind":"code","text":"`Install Referrer API`"},{"kind":"text","text":"](https://developer.android.com/google/play/installreferrer)\nfrom the Google Play Store. In practice, the referrer URL may not be a complete, absolute URL."}],"blockTags":[{"tag":"@returns","content":[{"kind":"text","text":"A "},{"kind":"code","text":"`Promise`"},{"kind":"text","text":" that fulfills with a "},{"kind":"code","text":"`string`"},{"kind":"text","text":" of the referrer URL of the installed app."}]},{"tag":"@example","content":[{"kind":"code","text":"```ts\nawait Application.getInstallReferrerAsync();\n// \"utm_source=google-play&utm_medium=organic\"\n```"}]},{"tag":"@platform","content":[{"kind":"text","text":"android"}]}]},"type":{"type":"reference","typeArguments":[{"type":"intrinsic","name":"string"}],"name":"Promise","qualifiedName":"Promise","package":"typescript"}}]},{"name":"getInstallationTimeAsync","kind":64,"signatures":[{"name":"getInstallationTimeAsync","kind":4096,"comment":{"summary":[{"kind":"text","text":"Gets the time the app was installed onto the device, not counting subsequent updates. If the app\nis uninstalled and reinstalled, this method returns the time the app was reinstalled.\n- On iOS, this method uses the ["},{"kind":"code","text":"`NSFileCreationDate`"},{"kind":"text","text":"](https://developer.apple.com/documentation/foundation/nsfilecreationdate?language=objc)\nof the app's document root directory.\n- On Android, this method uses ["},{"kind":"code","text":"`PackageInfo.firstInstallTime`"},{"kind":"text","text":"](https://developer.android.com/reference/android/content/pm/PackageInfo.html#firstInstallTime).\n- On web, this method returns "},{"kind":"code","text":"`null`"},{"kind":"text","text":"."}],"blockTags":[{"tag":"@returns","content":[{"kind":"text","text":"Returns a "},{"kind":"code","text":"`Promise`"},{"kind":"text","text":" that fulfills with a "},{"kind":"code","text":"`Date`"},{"kind":"text","text":" object that specifies the time the app\nwas installed on the device."}]},{"tag":"@example","content":[{"kind":"code","text":"```ts\nawait Application.getInstallationTimeAsync();\n// 2019-07-18T18:08:26.121Z\n```"}]}]},"type":{"type":"reference","typeArguments":[{"type":"reference","name":"Date","qualifiedName":"Date","package":"typescript"}],"name":"Promise","qualifiedName":"Promise","package":"typescript"}}]},{"name":"getIosApplicationReleaseTypeAsync","kind":64,"signatures":[{"name":"getIosApplicationReleaseTypeAsync","kind":4096,"comment":{"summary":[{"kind":"text","text":"Gets the iOS application release type."}],"blockTags":[{"tag":"@returns","content":[{"kind":"text","text":"Returns a promise which fulfills with an ["},{"kind":"code","text":"`ApplicationReleaseType`"},{"kind":"text","text":"](#applicationreleasetype)."}]},{"tag":"@platform","content":[{"kind":"text","text":"ios"}]}]},"type":{"type":"reference","typeArguments":[{"type":"reference","name":"ApplicationReleaseType"}],"name":"Promise","qualifiedName":"Promise","package":"typescript"}}]},{"name":"getIosIdForVendorAsync","kind":64,"signatures":[{"name":"getIosIdForVendorAsync","kind":4096,"comment":{"summary":[{"kind":"text","text":"Gets the iOS \"identifier for vendor\" ([IDFV](https://developer.apple.com/documentation/uikit/uidevice/1620059-identifierforvendor))\nvalue, a string ID that uniquely identifies a device to the app’s vendor. This method may\nsometimes return "},{"kind":"code","text":"`nil`"},{"kind":"text","text":", in which case wait and call the method again later. This might happen\nwhen the device has been restarted before the user has unlocked the device.\n\nThe OS will change the vendor identifier if all apps from the current app's vendor have been\nuninstalled."}],"blockTags":[{"tag":"@returns","content":[{"kind":"text","text":"A "},{"kind":"code","text":"`Promise`"},{"kind":"text","text":" that fulfills with a "},{"kind":"code","text":"`string`"},{"kind":"text","text":" specifying the app's vendor ID. Apps from the\nsame vendor will return the same ID. See Apple's documentation for more information about the\nvendor ID's semantics."}]},{"tag":"@example","content":[{"kind":"code","text":"```ts\nawait Application.getIosIdForVendorAsync();\n// \"68753A44-4D6F-1226-9C60-0050E4C00067\"\n```"}]},{"tag":"@platform","content":[{"kind":"text","text":"ios"}]}]},"type":{"type":"reference","typeArguments":[{"type":"union","types":[{"type":"intrinsic","name":"string"},{"type":"literal","value":null}]}],"name":"Promise","qualifiedName":"Promise","package":"typescript"}}]},{"name":"getIosPushNotificationServiceEnvironmentAsync","kind":64,"signatures":[{"name":"getIosPushNotificationServiceEnvironmentAsync","kind":4096,"comment":{"summary":[{"kind":"text","text":"Gets the current [Apple Push Notification (APN)](https://developer.apple.com/documentation/bundleresources/entitlements/aps-environment?language=objc)\nservice environment."}],"blockTags":[{"tag":"@returns","content":[{"kind":"text","text":"Returns a promise fulfilled with the string, either "},{"kind":"code","text":"`'development'`"},{"kind":"text","text":" or "},{"kind":"code","text":"`'production'`"},{"kind":"text","text":",\nbased on the current APN environment, or "},{"kind":"code","text":"`null`"},{"kind":"text","text":" on the simulator as it does not support registering with APNs."}]},{"tag":"@platform","content":[{"kind":"text","text":"ios"}]}]},"type":{"type":"reference","typeArguments":[{"type":"reference","name":"PushNotificationServiceEnvironment"}],"name":"Promise","qualifiedName":"Promise","package":"typescript"}}]},{"name":"getLastUpdateTimeAsync","kind":64,"signatures":[{"name":"getLastUpdateTimeAsync","kind":4096,"comment":{"summary":[{"kind":"text","text":"Gets the last time the app was updated from the Google Play Store."}],"blockTags":[{"tag":"@returns","content":[{"kind":"text","text":"Returns a "},{"kind":"code","text":"`Promise`"},{"kind":"text","text":" that fulfills with a "},{"kind":"code","text":"`Date`"},{"kind":"text","text":" object that specifies the last time\nthe app was updated via the Google Play Store)."}]},{"tag":"@example","content":[{"kind":"code","text":"```ts\nawait Application.getLastUpdateTimeAsync();\n// 2019-07-18T21:20:16.887Z\n```"}]},{"tag":"@platform","content":[{"kind":"text","text":"android"}]}]},"type":{"type":"reference","typeArguments":[{"type":"reference","name":"Date","qualifiedName":"Date","package":"typescript"}],"name":"Promise","qualifiedName":"Promise","package":"typescript"}}]}]}
\ No newline at end of file
diff --git a/docs/public/static/data/v49.0.0/expo-asset.json b/docs/public/static/data/v49.0.0/expo-asset.json
new file mode 100644
index 0000000000000..33c14e407bbc1
--- /dev/null
+++ b/docs/public/static/data/v49.0.0/expo-asset.json
@@ -0,0 +1 @@
+{"name":"expo-asset","kind":1,"children":[{"name":"Asset","kind":128,"comment":{"summary":[{"kind":"text","text":"The "},{"kind":"code","text":"`Asset`"},{"kind":"text","text":" class represents an asset in your app. It gives metadata about the asset (such as its\nname and type) and provides facilities to load the asset data."}]},"children":[{"name":"constructor","kind":512,"signatures":[{"name":"new Asset","kind":16384,"parameters":[{"name":"__namedParameters","kind":32768,"type":{"type":"reference","name":"AssetDescriptor"}}],"type":{"type":"reference","name":"Asset"}}]},{"name":"downloaded","kind":1024,"type":{"type":"intrinsic","name":"boolean"},"defaultValue":"false"},{"name":"downloading","kind":1024,"type":{"type":"intrinsic","name":"boolean"},"defaultValue":"false"},{"name":"hash","kind":1024,"comment":{"summary":[{"kind":"text","text":"The MD5 hash of the asset's data."}]},"type":{"type":"union","types":[{"type":"literal","value":null},{"type":"intrinsic","name":"string"}]},"defaultValue":"null"},{"name":"height","kind":1024,"comment":{"summary":[{"kind":"text","text":"If the asset is an image, the height of the image data divided by the scale factor. The scale factor is the number after "},{"kind":"code","text":"`@`"},{"kind":"text","text":" in the filename, or "},{"kind":"code","text":"`1`"},{"kind":"text","text":" if not present."}]},"type":{"type":"union","types":[{"type":"literal","value":null},{"type":"intrinsic","name":"number"}]},"defaultValue":"null"},{"name":"localUri","kind":1024,"comment":{"summary":[{"kind":"text","text":"If the asset has been downloaded (by calling ["},{"kind":"code","text":"`downloadAsync()`"},{"kind":"text","text":"](#downloadasync)), the\n"},{"kind":"code","text":"`file://`"},{"kind":"text","text":" URI pointing to the local file on the device that contains the asset data."}]},"type":{"type":"union","types":[{"type":"literal","value":null},{"type":"intrinsic","name":"string"}]},"defaultValue":"null"},{"name":"name","kind":1024,"comment":{"summary":[{"kind":"text","text":"The name of the asset file without the extension. Also without the part from "},{"kind":"code","text":"`@`"},{"kind":"text","text":" onward in the\nfilename (used to specify scale factor for images)."}]},"type":{"type":"intrinsic","name":"string"}},{"name":"type","kind":1024,"comment":{"summary":[{"kind":"text","text":"The extension of the asset filename."}]},"type":{"type":"intrinsic","name":"string"}},{"name":"uri","kind":1024,"comment":{"summary":[{"kind":"text","text":"A URI that points to the asset's data on the remote server. When running the published version\nof your app, this refers to the location on Expo's asset server where Expo has stored your\nasset. When running the app from Expo CLI during development, this URI points to Expo CLI's\nserver running on your computer and the asset is served directly from your computer. If you\nare not using Classic Updates (legacy), this field should be ignored as we ensure your assets\nare on device before before running your application logic."}]},"type":{"type":"intrinsic","name":"string"}},{"name":"width","kind":1024,"comment":{"summary":[{"kind":"text","text":"If the asset is an image, the width of the image data divided by the scale factor. The scale\nfactor is the number after "},{"kind":"code","text":"`@`"},{"kind":"text","text":" in the filename, or "},{"kind":"code","text":"`1`"},{"kind":"text","text":" if not present."}]},"type":{"type":"union","types":[{"type":"literal","value":null},{"type":"intrinsic","name":"number"}]},"defaultValue":"null"},{"name":"downloadAsync","kind":2048,"signatures":[{"name":"downloadAsync","kind":4096,"comment":{"summary":[{"kind":"text","text":"Downloads the asset data to a local file in the device's cache directory. Once the returned\npromise is fulfilled without error, the ["},{"kind":"code","text":"`localUri`"},{"kind":"text","text":"](#assetlocaluri) field of this asset points\nto a local file containing the asset data. The asset is only downloaded if an up-to-date local\nfile for the asset isn't already present due to an earlier download. The downloaded "},{"kind":"code","text":"`Asset`"},{"kind":"text","text":"\nwill be returned when the promise is resolved."}],"blockTags":[{"tag":"@returns","content":[{"kind":"text","text":"Returns a Promise which fulfills with an "},{"kind":"code","text":"`Asset`"},{"kind":"text","text":" instance."}]}]},"type":{"type":"reference","typeArguments":[{"type":"reference","name":"Asset"}],"name":"Promise","qualifiedName":"Promise","package":"typescript"}}]},{"name":"fromMetadata","kind":2048,"flags":{"isStatic":true},"signatures":[{"name":"fromMetadata","kind":4096,"parameters":[{"name":"meta","kind":32768,"type":{"type":"reference","name":"AssetMetadata"}}],"type":{"type":"reference","name":"Asset"}}]},{"name":"fromModule","kind":2048,"flags":{"isStatic":true},"signatures":[{"name":"fromModule","kind":4096,"comment":{"summary":[{"kind":"text","text":"Returns the ["},{"kind":"code","text":"`Asset`"},{"kind":"text","text":"](#asset) instance representing an asset given its module or URL."}],"blockTags":[{"tag":"@returns","content":[{"kind":"text","text":"The ["},{"kind":"code","text":"`Asset`"},{"kind":"text","text":"](#asset) instance for the asset."}]}]},"parameters":[{"name":"virtualAssetModule","kind":32768,"comment":{"summary":[{"kind":"text","text":"The value of "},{"kind":"code","text":"`require('path/to/file')`"},{"kind":"text","text":" for the asset or external\nnetwork URL"}]},"type":{"type":"union","types":[{"type":"intrinsic","name":"string"},{"type":"intrinsic","name":"number"}]}}],"type":{"type":"reference","name":"Asset"}}]},{"name":"fromURI","kind":2048,"flags":{"isStatic":true},"signatures":[{"name":"fromURI","kind":4096,"parameters":[{"name":"uri","kind":32768,"type":{"type":"intrinsic","name":"string"}}],"type":{"type":"reference","name":"Asset"}}]},{"name":"loadAsync","kind":2048,"flags":{"isStatic":true},"signatures":[{"name":"loadAsync","kind":4096,"comment":{"summary":[{"kind":"text","text":"A helper that wraps "},{"kind":"code","text":"`Asset.fromModule(module).downloadAsync`"},{"kind":"text","text":" for convenience."}],"blockTags":[{"tag":"@returns","content":[{"kind":"text","text":"Returns a Promise that fulfills with an array of "},{"kind":"code","text":"`Asset`"},{"kind":"text","text":"s when the asset(s) has been\nsaved to disk."}]},{"tag":"@example","content":[{"kind":"code","text":"```ts\nconst [{ localUri }] = await Asset.loadAsync(require('./assets/snack-icon.png'));\n```"}]}]},"parameters":[{"name":"moduleId","kind":32768,"comment":{"summary":[{"kind":"text","text":"An array of "},{"kind":"code","text":"`require('path/to/file')`"},{"kind":"text","text":" or external network URLs. Can also be\njust one module or URL without an Array."}]},"type":{"type":"union","types":[{"type":"intrinsic","name":"string"},{"type":"intrinsic","name":"number"},{"type":"array","elementType":{"type":"intrinsic","name":"number"}},{"type":"array","elementType":{"type":"intrinsic","name":"string"}}]}}],"type":{"type":"reference","typeArguments":[{"type":"array","elementType":{"type":"reference","name":"Asset"}}],"name":"Promise","qualifiedName":"Promise","package":"typescript"}}]}]},{"name":"AssetDescriptor","kind":4194304,"type":{"type":"reflection","declaration":{"name":"__type","kind":65536,"children":[{"name":"hash","kind":1024,"flags":{"isOptional":true},"type":{"type":"union","types":[{"type":"intrinsic","name":"string"},{"type":"literal","value":null}]}},{"name":"height","kind":1024,"flags":{"isOptional":true},"type":{"type":"union","types":[{"type":"intrinsic","name":"number"},{"type":"literal","value":null}]}},{"name":"name","kind":1024,"type":{"type":"intrinsic","name":"string"}},{"name":"type","kind":1024,"type":{"type":"intrinsic","name":"string"}},{"name":"uri","kind":1024,"type":{"type":"intrinsic","name":"string"}},{"name":"width","kind":1024,"flags":{"isOptional":true},"type":{"type":"union","types":[{"type":"intrinsic","name":"number"},{"type":"literal","value":null}]}}]}}},{"name":"AssetMetadata","kind":4194304,"type":{"type":"intersection","types":[{"type":"reference","typeArguments":[{"type":"reference","name":"PackagerAsset"},{"type":"union","types":[{"type":"literal","value":"httpServerLocation"},{"type":"literal","value":"name"},{"type":"literal","value":"hash"},{"type":"literal","value":"type"},{"type":"literal","value":"scales"},{"type":"literal","value":"width"},{"type":"literal","value":"height"}]}],"name":"Pick","qualifiedName":"Pick","package":"typescript"},{"type":"reflection","declaration":{"name":"__type","kind":65536,"children":[{"name":"fileHashes","kind":1024,"flags":{"isOptional":true},"type":{"type":"array","elementType":{"type":"intrinsic","name":"string"}}},{"name":"fileUris","kind":1024,"flags":{"isOptional":true},"type":{"type":"array","elementType":{"type":"intrinsic","name":"string"}}},{"name":"uri","kind":1024,"flags":{"isOptional":true},"type":{"type":"intrinsic","name":"string"}}]}}]}},{"name":"useAssets","kind":64,"signatures":[{"name":"useAssets","kind":4096,"comment":{"summary":[{"kind":"text","text":"Downloads and stores one or more assets locally.\nAfter the assets are loaded, this hook returns a list of asset instances.\nIf something went wrong when loading the assets, an error is returned.\n\n> Note, the assets are not \"reloaded\" when you dynamically change the asset list."}],"blockTags":[{"tag":"@returns","content":[{"kind":"text","text":"Returns an array containing:\n- on the first position, a list of all loaded assets. If they aren't loaded yet, this value is\n "},{"kind":"code","text":"`undefined`"},{"kind":"text","text":".\n- on the second position, an error which encountered when loading the assets. If there was no\n error, this value is "},{"kind":"code","text":"`undefined`"},{"kind":"text","text":"."}]},{"tag":"@example","content":[{"kind":"code","text":"```tsx\nconst [assets, error] = useAssets([require('path/to/asset.jpg'), require('path/to/other.png')]);\n\nreturn assets ? : null;\n```"}]}]},"parameters":[{"name":"moduleIds","kind":32768,"type":{"type":"union","types":[{"type":"intrinsic","name":"number"},{"type":"array","elementType":{"type":"intrinsic","name":"number"}}]}}],"type":{"type":"tuple","elements":[{"type":"union","types":[{"type":"array","elementType":{"type":"reference","name":"Asset"}},{"type":"intrinsic","name":"undefined"}]},{"type":"union","types":[{"type":"reference","name":"Error","qualifiedName":"Error","package":"typescript"},{"type":"intrinsic","name":"undefined"}]}]}}]}]}
\ No newline at end of file
diff --git a/docs/public/static/data/v49.0.0/expo-audio.json b/docs/public/static/data/v49.0.0/expo-audio.json
new file mode 100644
index 0000000000000..c1ae2ae479f22
--- /dev/null
+++ b/docs/public/static/data/v49.0.0/expo-audio.json
@@ -0,0 +1 @@
+{"name":"expo-audio","kind":1,"children":[{"name":"AndroidAudioEncoder","kind":8,"children":[{"name":"AAC","kind":16,"type":{"type":"literal","value":3}},{"name":"AAC_ELD","kind":16,"type":{"type":"literal","value":5}},{"name":"AMR_NB","kind":16,"type":{"type":"literal","value":1}},{"name":"AMR_WB","kind":16,"type":{"type":"literal","value":2}},{"name":"DEFAULT","kind":16,"type":{"type":"literal","value":0}},{"name":"HE_AAC","kind":16,"type":{"type":"literal","value":4}}]},{"name":"AndroidOutputFormat","kind":8,"children":[{"name":"AAC_ADIF","kind":16,"type":{"type":"literal","value":5}},{"name":"AAC_ADTS","kind":16,"type":{"type":"literal","value":6}},{"name":"AMR_NB","kind":16,"type":{"type":"literal","value":3}},{"name":"AMR_WB","kind":16,"type":{"type":"literal","value":4}},{"name":"DEFAULT","kind":16,"type":{"type":"literal","value":0}},{"name":"MPEG2TS","kind":16,"type":{"type":"literal","value":8}},{"name":"MPEG_4","kind":16,"type":{"type":"literal","value":2}},{"name":"RTP_AVP","kind":16,"type":{"type":"literal","value":7}},{"name":"THREE_GPP","kind":16,"type":{"type":"literal","value":1}},{"name":"WEBM","kind":16,"type":{"type":"literal","value":9}}]},{"name":"AudioChannel","kind":4194304,"type":{"type":"reflection","declaration":{"name":"__type","kind":65536,"children":[{"name":"frames","kind":1024,"comment":{"summary":[{"kind":"text","text":"All samples for this specific Audio Channel in PCM Buffer format (-1 to 1)."}]},"type":{"type":"array","elementType":{"type":"intrinsic","name":"number"}}}]}}},{"name":"AudioMode","kind":4194304,"type":{"type":"reflection","declaration":{"name":"__type","kind":65536,"children":[{"name":"allowsRecordingIOS","kind":1024,"comment":{"summary":[{"kind":"text","text":"A boolean selecting if recording is enabled on iOS.\n> When this flag is set to "},{"kind":"code","text":"`true`"},{"kind":"text","text":", playback may be routed to the phone earpiece instead of to the speaker. Set it back to "},{"kind":"code","text":"`false`"},{"kind":"text","text":" after stopping recording to reenable playback through the speaker."}],"blockTags":[{"tag":"@default","content":[{"kind":"text","text":"false"}]}]},"type":{"type":"intrinsic","name":"boolean"}},{"name":"interruptionModeAndroid","kind":1024,"comment":{"summary":[{"kind":"text","text":"An enum selecting how your experience's audio should interact with the audio from other apps on Android."}]},"type":{"type":"reference","name":"InterruptionModeAndroid"}},{"name":"interruptionModeIOS","kind":1024,"comment":{"summary":[{"kind":"text","text":"An enum selecting how your experience's audio should interact with the audio from other apps on iOS."}]},"type":{"type":"reference","name":"InterruptionModeIOS"}},{"name":"playThroughEarpieceAndroid","kind":1024,"comment":{"summary":[{"kind":"text","text":"A boolean selecting if the audio is routed to earpiece on Android."}],"blockTags":[{"tag":"@default","content":[{"kind":"text","text":"false"}]}]},"type":{"type":"intrinsic","name":"boolean"}},{"name":"playsInSilentModeIOS","kind":1024,"comment":{"summary":[{"kind":"text","text":"A boolean selecting if your experience's audio should play in silent mode on iOS."}],"blockTags":[{"tag":"@default","content":[{"kind":"text","text":"false"}]}]},"type":{"type":"intrinsic","name":"boolean"}},{"name":"shouldDuckAndroid","kind":1024,"comment":{"summary":[{"kind":"text","text":"A boolean selecting if your experience's audio should automatically be lowered in volume (\"duck\") if audio from another\napp interrupts your experience. If "},{"kind":"code","text":"`false`"},{"kind":"text","text":", audio from other apps will pause your audio."}],"blockTags":[{"tag":"@default","content":[{"kind":"text","text":"true"}]}]},"type":{"type":"intrinsic","name":"boolean"}},{"name":"staysActiveInBackground","kind":1024,"comment":{"summary":[{"kind":"text","text":"A boolean selecting if the audio session (playback or recording) should stay active even when the app goes into background.\n> This is not available in Expo Go for iOS, it will only work in standalone apps.\n> To enable it for standalone apps, [follow the instructions below](#playing-or-recording-audio-in-background-ios)\n> to add "},{"kind":"code","text":"`UIBackgroundModes`"},{"kind":"text","text":" to your app configuration."}],"blockTags":[{"tag":"@default","content":[{"kind":"text","text":"false"}]}]},"type":{"type":"intrinsic","name":"boolean"}}]}}},{"name":"AudioSample","kind":4194304,"comment":{"summary":[{"kind":"text","text":"Object passed to the "},{"kind":"code","text":"`onAudioSampleReceived`"},{"kind":"text","text":" function. Represents a single sample from an audio source.\nThe sample contains all frames (PCM Buffer values) for each channel of the audio, so if the audio is _stereo_ (interleaved),\nthere will be two channels, one for left and one for right audio."}]},"type":{"type":"reflection","declaration":{"name":"__type","kind":65536,"children":[{"name":"channels","kind":1024,"comment":{"summary":[{"kind":"text","text":"An array representing the data from each channel in PCM Buffer format. Array elements are objects in the following format: "},{"kind":"code","text":"`{ frames: number[] }`"},{"kind":"text","text":",\nwhere each frame is a number in PCM Buffer format ("},{"kind":"code","text":"`-1`"},{"kind":"text","text":" to "},{"kind":"code","text":"`1`"},{"kind":"text","text":" range)."}]},"type":{"type":"array","elementType":{"type":"reference","name":"AudioChannel"}}},{"name":"timestamp","kind":1024,"comment":{"summary":[{"kind":"text","text":"A number representing the timestamp of the current sample in seconds, relative to the audio track's timeline.\n> **Known issue:** When using the "},{"kind":"code","text":"`ExoPlayer`"},{"kind":"text","text":" Android implementation, the timestamp is always "},{"kind":"code","text":"`-1`"},{"kind":"text","text":"."}]},"type":{"type":"intrinsic","name":"number"}}]}}},{"name":"getPermissionsAsync","kind":64,"signatures":[{"name":"getPermissionsAsync","kind":4096,"comment":{"summary":[{"kind":"text","text":"Checks user's permissions for audio recording."}],"blockTags":[{"tag":"@returns","content":[{"kind":"text","text":"A promise that resolves to an object of type "},{"kind":"code","text":"`PermissionResponse`"},{"kind":"text","text":"."}]}]},"type":{"type":"reference","typeArguments":[{"type":"reference","name":"PermissionResponse"}],"name":"Promise","qualifiedName":"Promise","package":"typescript"}}]},{"name":"InterruptionModeAndroid","kind":8,"children":[{"name":"DoNotMix","kind":16,"comment":{"summary":[{"kind":"text","text":"If this option is set, your experience's audio interrupts audio from other apps."}]},"type":{"type":"literal","value":1}},{"name":"DuckOthers","kind":16,"comment":{"summary":[{"kind":"text","text":"**This is the default option.** If this option is set, your experience's audio lowers the volume (\"ducks\") of audio from other apps while your audio plays."}]},"type":{"type":"literal","value":2}}]},{"name":"InterruptionModeIOS","kind":8,"children":[{"name":"DoNotMix","kind":16,"comment":{"summary":[{"kind":"text","text":"If this option is set, your experience's audio interrupts audio from other apps."}]},"type":{"type":"literal","value":1}},{"name":"DuckOthers","kind":16,"comment":{"summary":[{"kind":"text","text":"If this option is set, your experience's audio lowers the volume (\"ducks\") of audio from other apps while your audio plays."}]},"type":{"type":"literal","value":2}},{"name":"MixWithOthers","kind":16,"comment":{"summary":[{"kind":"text","text":"**This is the default option.** If this option is set, your experience's audio is mixed with audio playing in background apps."}]},"type":{"type":"literal","value":0}}]},{"name":"IOSAudioQuality","kind":8,"children":[{"name":"HIGH","kind":16,"type":{"type":"literal","value":96}},{"name":"LOW","kind":16,"type":{"type":"literal","value":32}},{"name":"MAX","kind":16,"type":{"type":"literal","value":127}},{"name":"MEDIUM","kind":16,"type":{"type":"literal","value":64}},{"name":"MIN","kind":16,"type":{"type":"literal","value":0}}]},{"name":"IOSBitRateStrategy","kind":8,"children":[{"name":"CONSTANT","kind":16,"type":{"type":"literal","value":0}},{"name":"LONG_TERM_AVERAGE","kind":16,"type":{"type":"literal","value":1}},{"name":"VARIABLE","kind":16,"type":{"type":"literal","value":3}},{"name":"VARIABLE_CONSTRAINED","kind":16,"type":{"type":"literal","value":2}}]},{"name":"IOSOutputFormat","kind":8,"comment":{"summary":[{"kind":"text","text":"> **Note** Not all of the iOS formats included in this list of constants are currently supported by iOS,\n> in spite of appearing in the Apple source code. For an accurate list of formats supported by iOS, see\n> [Core Audio Codecs](https://developer.apple.com/library/content/documentation/MusicAudio/Conceptual/CoreAudioOverview/CoreAudioEssentials/CoreAudioEssentials.html)\n> and [iPhone Audio File Formats](https://developer.apple.com/library/content/documentation/MusicAudio/Conceptual/CoreAudioOverview/CoreAudioEssentials/CoreAudioEssentials.html)."}]},"children":[{"name":"60958AC3","kind":16,"type":{"type":"literal","value":"cac3"}},{"name":"AC3","kind":16,"type":{"type":"literal","value":"ac-3"}},{"name":"AES3","kind":16,"type":{"type":"literal","value":"aes3"}},{"name":"ALAW","kind":16,"type":{"type":"literal","value":"alaw"}},{"name":"AMR","kind":16,"type":{"type":"literal","value":"samr"}},{"name":"AMR_WB","kind":16,"type":{"type":"literal","value":"sawb"}},{"name":"APPLEIMA4","kind":16,"type":{"type":"literal","value":"ima4"}},{"name":"APPLELOSSLESS","kind":16,"type":{"type":"literal","value":"alac"}},{"name":"AUDIBLE","kind":16,"type":{"type":"literal","value":"AUDB"}},{"name":"DVIINTELIMA","kind":16,"type":{"type":"literal","value":1836253201}},{"name":"ENHANCEDAC3","kind":16,"type":{"type":"literal","value":"ec-3"}},{"name":"ILBC","kind":16,"type":{"type":"literal","value":"ilbc"}},{"name":"LINEARPCM","kind":16,"type":{"type":"literal","value":"lpcm"}},{"name":"MACE3","kind":16,"type":{"type":"literal","value":"MAC3"}},{"name":"MACE6","kind":16,"type":{"type":"literal","value":"MAC6"}},{"name":"MICROSOFTGSM","kind":16,"type":{"type":"literal","value":1836253233}},{"name":"MPEG4AAC","kind":16,"type":{"type":"literal","value":"aac "}},{"name":"MPEG4AAC_ELD","kind":16,"type":{"type":"literal","value":"aace"}},{"name":"MPEG4AAC_ELD_SBR","kind":16,"type":{"type":"literal","value":"aacf"}},{"name":"MPEG4AAC_ELD_V2","kind":16,"type":{"type":"literal","value":"aacg"}},{"name":"MPEG4AAC_HE","kind":16,"type":{"type":"literal","value":"aach"}},{"name":"MPEG4AAC_HE_V2","kind":16,"type":{"type":"literal","value":"aacp"}},{"name":"MPEG4AAC_LD","kind":16,"type":{"type":"literal","value":"aacl"}},{"name":"MPEG4AAC_SPATIAL","kind":16,"type":{"type":"literal","value":"aacs"}},{"name":"MPEG4CELP","kind":16,"type":{"type":"literal","value":"celp"}},{"name":"MPEG4HVXC","kind":16,"type":{"type":"literal","value":"hvxc"}},{"name":"MPEG4TWINVQ","kind":16,"type":{"type":"literal","value":"twvq"}},{"name":"MPEGLAYER1","kind":16,"type":{"type":"literal","value":".mp1"}},{"name":"MPEGLAYER2","kind":16,"type":{"type":"literal","value":".mp2"}},{"name":"MPEGLAYER3","kind":16,"type":{"type":"literal","value":".mp3"}},{"name":"QDESIGN","kind":16,"type":{"type":"literal","value":"QDMC"}},{"name":"QDESIGN2","kind":16,"type":{"type":"literal","value":"QDM2"}},{"name":"QUALCOMM","kind":16,"type":{"type":"literal","value":"Qclp"}},{"name":"ULAW","kind":16,"type":{"type":"literal","value":"ulaw"}}]},{"name":"PermissionHookOptions","kind":4194304,"typeParameters":[{"name":"Options","kind":131072,"type":{"type":"intrinsic","name":"object"}}],"type":{"type":"intersection","types":[{"type":"reference","name":"PermissionHookBehavior"},{"type":"reference","name":"Options"}]}},{"name":"PermissionResponse","kind":256,"comment":{"summary":[{"kind":"text","text":"An object obtained by permissions get and request functions."}]},"children":[{"name":"canAskAgain","kind":1024,"comment":{"summary":[{"kind":"text","text":"Indicates if user can be asked again for specific permission.\nIf not, one should be directed to the Settings app\nin order to enable/disable the permission."}]},"type":{"type":"intrinsic","name":"boolean"}},{"name":"expires","kind":1024,"comment":{"summary":[{"kind":"text","text":"Determines time when the permission expires."}]},"type":{"type":"reference","name":"PermissionExpiration"}},{"name":"granted","kind":1024,"comment":{"summary":[{"kind":"text","text":"A convenience boolean that indicates if the permission is granted."}]},"type":{"type":"intrinsic","name":"boolean"}},{"name":"status","kind":1024,"comment":{"summary":[{"kind":"text","text":"Determines the status of the permission."}]},"type":{"type":"reference","name":"PermissionStatus"}}]},{"name":"PermissionStatus","kind":8,"children":[{"name":"DENIED","kind":16,"comment":{"summary":[{"kind":"text","text":"User has denied the permission."}]},"type":{"type":"literal","value":"denied"}},{"name":"GRANTED","kind":16,"comment":{"summary":[{"kind":"text","text":"User has granted the permission."}]},"type":{"type":"literal","value":"granted"}},{"name":"UNDETERMINED","kind":16,"comment":{"summary":[{"kind":"text","text":"User hasn't granted or denied the permission yet."}]},"type":{"type":"literal","value":"undetermined"}}]},{"name":"PitchCorrectionQuality","kind":8,"comment":{"summary":[{"kind":"text","text":"Check [official Apple documentation](https://developer.apple.com/documentation/avfoundation/avaudiotimepitchalgorithmlowqualityzerolatency) for more information."}]},"children":[{"name":"High","kind":16,"comment":{"summary":[{"kind":"text","text":"Equivalent to "},{"kind":"code","text":"`AVAudioTimePitchAlgorithmSpectral`"},{"kind":"text","text":"."}]},"type":{"type":"intrinsic","name":"number"}},{"name":"Low","kind":16,"comment":{"summary":[{"kind":"text","text":"Equivalent to "},{"kind":"code","text":"`AVAudioTimePitchAlgorithmLowQualityZeroLatency`"},{"kind":"text","text":"."}]},"type":{"type":"intrinsic","name":"number"}},{"name":"Medium","kind":16,"comment":{"summary":[{"kind":"text","text":"Equivalent to "},{"kind":"code","text":"`AVAudioTimePitchAlgorithmTimeDomain`"},{"kind":"text","text":"."}]},"type":{"type":"intrinsic","name":"number"}}]},{"name":"Recording","kind":128,"comment":{"summary":[{"kind":"text","text":"This class represents an audio recording. After creating an instance of this class, "},{"kind":"code","text":"`prepareToRecordAsync`"},{"kind":"text","text":"\nmust be called in order to record audio. Once recording is finished, call "},{"kind":"code","text":"`stopAndUnloadAsync`"},{"kind":"text","text":". Note that\nonly one recorder is allowed to exist in the state between "},{"kind":"code","text":"`prepareToRecordAsync`"},{"kind":"text","text":" and "},{"kind":"code","text":"`stopAndUnloadAsync`"},{"kind":"text","text":"\nat any given time.\n\nNote that your experience must request audio recording permissions in order for recording to function.\nSee the ["},{"kind":"code","text":"`Permissions`"},{"kind":"text","text":" module](/guides/permissions) for more details.\n\nAdditionally, audio recording is [not supported in the iOS Simulator](/workflow/ios-simulator/#limitations)."}],"blockTags":[{"tag":"@example","content":[{"kind":"code","text":"```ts\nconst recording = new Audio.Recording();\ntry {\n await recording.prepareToRecordAsync(Audio.RecordingOptionsPresets.HIGH_QUALITY);\n await recording.startAsync();\n // You are now recording!\n} catch (error) {\n // An error occurred!\n}\n```"}]},{"tag":"@returns","content":[{"kind":"text","text":"A newly constructed instance of "},{"kind":"code","text":"`Audio.Recording`"},{"kind":"text","text":"."}]}]},"children":[{"name":"constructor","kind":512,"signatures":[{"name":"new Recording","kind":16384,"type":{"type":"reference","name":"Recording"}}]},{"name":"_canRecord","kind":1024,"type":{"type":"intrinsic","name":"boolean"},"defaultValue":"false"},{"name":"_finalDurationMillis","kind":1024,"type":{"type":"intrinsic","name":"number"},"defaultValue":"0"},{"name":"_isDoneRecording","kind":1024,"type":{"type":"intrinsic","name":"boolean"},"defaultValue":"false"},{"name":"_onRecordingStatusUpdate","kind":1024,"type":{"type":"union","types":[{"type":"literal","value":null},{"type":"reflection","declaration":{"name":"__type","kind":65536,"signatures":[{"name":"__type","kind":4096,"parameters":[{"name":"status","kind":32768,"type":{"type":"reference","name":"RecordingStatus"}}],"type":{"type":"intrinsic","name":"void"}}]}}]},"defaultValue":"null"},{"name":"_options","kind":1024,"type":{"type":"union","types":[{"type":"literal","value":null},{"type":"reference","name":"RecordingOptions"}]},"defaultValue":"null"},{"name":"_progressUpdateIntervalMillis","kind":1024,"type":{"type":"intrinsic","name":"number"},"defaultValue":"_DEFAULT_PROGRESS_UPDATE_INTERVAL_MILLIS"},{"name":"_progressUpdateTimeoutVariable","kind":1024,"type":{"type":"union","types":[{"type":"literal","value":null},{"type":"intrinsic","name":"number"}]},"defaultValue":"null"},{"name":"_subscription","kind":1024,"type":{"type":"union","types":[{"type":"literal","value":null},{"type":"reference","name":"Subscription"}]},"defaultValue":"null"},{"name":"_uri","kind":1024,"type":{"type":"union","types":[{"type":"literal","value":null},{"type":"intrinsic","name":"string"}]},"defaultValue":"null"},{"name":"_callOnRecordingStatusUpdateForNewStatus","kind":2048,"signatures":[{"name":"_callOnRecordingStatusUpdateForNewStatus","kind":4096,"parameters":[{"name":"status","kind":32768,"type":{"type":"reference","name":"RecordingStatus"}}],"type":{"type":"intrinsic","name":"void"}}]},{"name":"_cleanupForUnloadedRecorder","kind":2048,"signatures":[{"name":"_cleanupForUnloadedRecorder","kind":4096,"parameters":[{"name":"finalStatus","kind":32768,"flags":{"isOptional":true},"type":{"type":"reference","name":"RecordingStatus"}}],"type":{"type":"reference","typeArguments":[{"type":"reference","name":"RecordingStatus"}],"name":"Promise","qualifiedName":"Promise","package":"typescript"}}]},{"name":"_disablePolling","kind":2048,"signatures":[{"name":"_disablePolling","kind":4096,"type":{"type":"intrinsic","name":"void"}}]},{"name":"_enablePollingIfNecessaryAndPossible","kind":2048,"signatures":[{"name":"_enablePollingIfNecessaryAndPossible","kind":4096,"type":{"type":"intrinsic","name":"void"}}]},{"name":"_performOperationAndHandleStatusAsync","kind":2048,"signatures":[{"name":"_performOperationAndHandleStatusAsync","kind":4096,"parameters":[{"name":"operation","kind":32768,"type":{"type":"reflection","declaration":{"name":"__type","kind":65536,"signatures":[{"name":"__type","kind":4096,"type":{"type":"reference","typeArguments":[{"type":"reference","name":"RecordingStatus"}],"name":"Promise","qualifiedName":"Promise","package":"typescript"}}]}}}],"type":{"type":"reference","typeArguments":[{"type":"reference","name":"RecordingStatus"}],"name":"Promise","qualifiedName":"Promise","package":"typescript"}}]},{"name":"_pollingLoop","kind":2048,"signatures":[{"name":"_pollingLoop","kind":4096,"type":{"type":"reference","typeArguments":[{"type":"intrinsic","name":"void"}],"name":"Promise","qualifiedName":"Promise","package":"typescript"}}]},{"name":"createNewLoadedSound","kind":2048,"signatures":[{"name":"createNewLoadedSound","kind":4096,"comment":{"summary":[],"blockTags":[{"tag":"@deprecated","content":[{"kind":"text","text":"Use "},{"kind":"code","text":"`createNewLoadedSoundAsync()`"},{"kind":"text","text":" instead."}]}]},"parameters":[{"name":"initialStatus","kind":32768,"type":{"type":"reference","name":"AVPlaybackStatusToSet"},"defaultValue":"{}"},{"name":"onPlaybackStatusUpdate","kind":32768,"type":{"type":"union","types":[{"type":"literal","value":null},{"type":"reflection","declaration":{"name":"__type","kind":65536,"signatures":[{"name":"__type","kind":4096,"parameters":[{"name":"status","kind":32768,"type":{"type":"reference","name":"AVPlaybackStatus"}}],"type":{"type":"intrinsic","name":"void"}}]}}]},"defaultValue":"null"}],"type":{"type":"reference","typeArguments":[{"type":"reference","name":"SoundObject"}],"name":"Promise","qualifiedName":"Promise","package":"typescript"}}]},{"name":"createNewLoadedSoundAsync","kind":2048,"signatures":[{"name":"createNewLoadedSoundAsync","kind":4096,"comment":{"summary":[{"kind":"text","text":"Creates and loads a new "},{"kind":"code","text":"`Sound`"},{"kind":"text","text":" object to play back the "},{"kind":"code","text":"`Recording`"},{"kind":"text","text":". Note that this will only succeed once the "},{"kind":"code","text":"`Recording`"},{"kind":"text","text":"\nis done recording and "},{"kind":"code","text":"`stopAndUnloadAsync()`"},{"kind":"text","text":" has been called."}],"blockTags":[{"tag":"@returns","content":[{"kind":"text","text":"A "},{"kind":"code","text":"`Promise`"},{"kind":"text","text":" that is rejected if creation failed, or fulfilled with the "},{"kind":"code","text":"`SoundObject`"},{"kind":"text","text":"."}]}]},"parameters":[{"name":"initialStatus","kind":32768,"comment":{"summary":[{"kind":"text","text":"The initial intended "},{"kind":"code","text":"`PlaybackStatusToSet`"},{"kind":"text","text":" of the sound, whose values will override the default initial playback status.\nThis value defaults to "},{"kind":"code","text":"`{}`"},{"kind":"text","text":" if no parameter is passed. See the [AV documentation](/versions/latest/sdk/av) for details on "},{"kind":"code","text":"`PlaybackStatusToSet`"},{"kind":"text","text":"\nand the default initial playback status."}]},"type":{"type":"reference","name":"AVPlaybackStatusToSet"},"defaultValue":"{}"},{"name":"onPlaybackStatusUpdate","kind":32768,"comment":{"summary":[{"kind":"text","text":"A function taking a single parameter "},{"kind":"code","text":"`PlaybackStatus`"},{"kind":"text","text":". This value defaults to "},{"kind":"code","text":"`null`"},{"kind":"text","text":" if no parameter is passed.\nSee the [AV documentation](/versions/latest/sdk/av) for details on the functionality provided by "},{"kind":"code","text":"`onPlaybackStatusUpdate`"}]},"type":{"type":"union","types":[{"type":"literal","value":null},{"type":"reflection","declaration":{"name":"__type","kind":65536,"signatures":[{"name":"__type","kind":4096,"parameters":[{"name":"status","kind":32768,"type":{"type":"reference","name":"AVPlaybackStatus"}}],"type":{"type":"intrinsic","name":"void"}}]}}]},"defaultValue":"null"}],"type":{"type":"reference","typeArguments":[{"type":"reference","name":"SoundObject"}],"name":"Promise","qualifiedName":"Promise","package":"typescript"}}]},{"name":"getAvailableInputs","kind":2048,"signatures":[{"name":"getAvailableInputs","kind":4096,"comment":{"summary":[{"kind":"text","text":"Returns a list of available recording inputs. This method can only be called if the "},{"kind":"code","text":"`Recording`"},{"kind":"text","text":" has been prepared."}],"blockTags":[{"tag":"@returns","content":[{"kind":"text","text":"A "},{"kind":"code","text":"`Promise`"},{"kind":"text","text":" that is fulfilled with an array of "},{"kind":"code","text":"`RecordingInput`"},{"kind":"text","text":" objects."}]}]},"type":{"type":"reference","typeArguments":[{"type":"array","elementType":{"type":"reference","name":"RecordingInput"}}],"name":"Promise","qualifiedName":"Promise","package":"typescript"}}]},{"name":"getCurrentInput","kind":2048,"signatures":[{"name":"getCurrentInput","kind":4096,"comment":{"summary":[{"kind":"text","text":"Returns the currently-selected recording input. This method can only be called if the "},{"kind":"code","text":"`Recording`"},{"kind":"text","text":" has been prepared."}],"blockTags":[{"tag":"@returns","content":[{"kind":"text","text":"A "},{"kind":"code","text":"`Promise`"},{"kind":"text","text":" that is fulfilled with a "},{"kind":"code","text":"`RecordingInput`"},{"kind":"text","text":" object."}]}]},"type":{"type":"reference","typeArguments":[{"type":"reference","name":"RecordingInput"}],"name":"Promise","qualifiedName":"Promise","package":"typescript"}}]},{"name":"getStatusAsync","kind":2048,"signatures":[{"name":"getStatusAsync","kind":4096,"comment":{"summary":[{"kind":"text","text":"Gets the "},{"kind":"code","text":"`status`"},{"kind":"text","text":" of the "},{"kind":"code","text":"`Recording`"},{"kind":"text","text":"."}],"blockTags":[{"tag":"@returns","content":[{"kind":"text","text":"A "},{"kind":"code","text":"`Promise`"},{"kind":"text","text":" that is resolved with the "},{"kind":"code","text":"`RecordingStatus`"},{"kind":"text","text":" object."}]}]},"type":{"type":"reference","typeArguments":[{"type":"reference","name":"RecordingStatus"}],"name":"Promise","qualifiedName":"Promise","package":"typescript"}}]},{"name":"getURI","kind":2048,"signatures":[{"name":"getURI","kind":4096,"comment":{"summary":[{"kind":"text","text":"Gets the local URI of the "},{"kind":"code","text":"`Recording`"},{"kind":"text","text":". Note that this will only succeed once the "},{"kind":"code","text":"`Recording`"},{"kind":"text","text":" is prepared\nto record. On web, this will not return the URI until the recording is finished."}],"blockTags":[{"tag":"@returns","content":[{"kind":"text","text":"A "},{"kind":"code","text":"`string`"},{"kind":"text","text":" with the local URI of the "},{"kind":"code","text":"`Recording`"},{"kind":"text","text":", or "},{"kind":"code","text":"`null`"},{"kind":"text","text":" if the "},{"kind":"code","text":"`Recording`"},{"kind":"text","text":" is not prepared\nto record (or, on Web, if the recording has not finished)."}]}]},"type":{"type":"union","types":[{"type":"literal","value":null},{"type":"intrinsic","name":"string"}]}}]},{"name":"pauseAsync","kind":2048,"signatures":[{"name":"pauseAsync","kind":4096,"comment":{"summary":[{"kind":"text","text":"Pauses recording. This method can only be called if the "},{"kind":"code","text":"`Recording`"},{"kind":"text","text":" has been prepared.\n\n> This is only available on Android API version 24 and later."}],"blockTags":[{"tag":"@returns","content":[{"kind":"text","text":"A "},{"kind":"code","text":"`Promise`"},{"kind":"text","text":" that is fulfilled when recording has paused, or rejects if recording could not be paused.\nIf the Android API version is less than 24, the "},{"kind":"code","text":"`Promise`"},{"kind":"text","text":" will reject. The promise is resolved with the\n"},{"kind":"code","text":"`RecordingStatus`"},{"kind":"text","text":" of the recording."}]}]},"type":{"type":"reference","typeArguments":[{"type":"reference","name":"RecordingStatus"}],"name":"Promise","qualifiedName":"Promise","package":"typescript"}}]},{"name":"prepareToRecordAsync","kind":2048,"signatures":[{"name":"prepareToRecordAsync","kind":4096,"comment":{"summary":[{"kind":"text","text":"Loads the recorder into memory and prepares it for recording. This must be called before calling "},{"kind":"code","text":"`startAsync()`"},{"kind":"text","text":".\nThis method can only be called if the "},{"kind":"code","text":"`Recording`"},{"kind":"text","text":" instance has never yet been prepared."}],"blockTags":[{"tag":"@returns","content":[{"kind":"text","text":"A "},{"kind":"code","text":"`Promise`"},{"kind":"text","text":" that is fulfilled when the recorder is loaded and prepared, or rejects if this failed. If another "},{"kind":"code","text":"`Recording`"},{"kind":"text","text":" exists\nin your experience that is currently prepared to record, the "},{"kind":"code","text":"`Promise`"},{"kind":"text","text":" will reject. If the "},{"kind":"code","text":"`RecordingOptions`"},{"kind":"text","text":" provided are invalid,\nthe "},{"kind":"code","text":"`Promise`"},{"kind":"text","text":" will also reject. The promise is resolved with the "},{"kind":"code","text":"`RecordingStatus`"},{"kind":"text","text":" of the recording."}]}]},"parameters":[{"name":"options","kind":32768,"comment":{"summary":[{"kind":"code","text":"`RecordingOptions`"},{"kind":"text","text":" for the recording, including sample rate, bitrate, channels, format, encoder, and extension.\nIf no options are passed to "},{"kind":"code","text":"`prepareToRecordAsync()`"},{"kind":"text","text":", the recorder will be created with options "},{"kind":"code","text":"`Audio.RecordingOptionsPresets.LOW_QUALITY`"},{"kind":"text","text":"."}]},"type":{"type":"reference","name":"RecordingOptions"},"defaultValue":"RecordingOptionsPresets.LOW_QUALITY"}],"type":{"type":"reference","typeArguments":[{"type":"reference","name":"RecordingStatus"}],"name":"Promise","qualifiedName":"Promise","package":"typescript"}}]},{"name":"setInput","kind":2048,"signatures":[{"name":"setInput","kind":4096,"comment":{"summary":[{"kind":"text","text":"Sets the current recording input."}],"blockTags":[{"tag":"@returns","content":[{"kind":"text","text":"A "},{"kind":"code","text":"`Promise`"},{"kind":"text","text":" that is resolved if successful or rejected if not."}]}]},"parameters":[{"name":"inputUid","kind":32768,"comment":{"summary":[{"kind":"text","text":"The uid of a "},{"kind":"code","text":"`RecordingInput`"},{"kind":"text","text":"."}]},"type":{"type":"intrinsic","name":"string"}}],"type":{"type":"reference","typeArguments":[{"type":"intrinsic","name":"void"}],"name":"Promise","qualifiedName":"Promise","package":"typescript"}}]},{"name":"setOnRecordingStatusUpdate","kind":2048,"signatures":[{"name":"setOnRecordingStatusUpdate","kind":4096,"comment":{"summary":[{"kind":"text","text":"Sets a function to be called regularly with the "},{"kind":"code","text":"`RecordingStatus`"},{"kind":"text","text":" of the "},{"kind":"code","text":"`Recording`"},{"kind":"text","text":".\n\n"},{"kind":"code","text":"`onRecordingStatusUpdate`"},{"kind":"text","text":" will be called when another call to the API for this recording completes (such as "},{"kind":"code","text":"`prepareToRecordAsync()`"},{"kind":"text","text":",\n"},{"kind":"code","text":"`startAsync()`"},{"kind":"text","text":", "},{"kind":"code","text":"`getStatusAsync()`"},{"kind":"text","text":", or "},{"kind":"code","text":"`stopAndUnloadAsync()`"},{"kind":"text","text":"), and will also be called at regular intervals while the recording can record.\nCall "},{"kind":"code","text":"`setProgressUpdateInterval()`"},{"kind":"text","text":" to modify the interval with which "},{"kind":"code","text":"`onRecordingStatusUpdate`"},{"kind":"text","text":" is called while the recording can record."}]},"parameters":[{"name":"onRecordingStatusUpdate","kind":32768,"comment":{"summary":[{"kind":"text","text":"A function taking a single parameter "},{"kind":"code","text":"`RecordingStatus`"},{"kind":"text","text":"."}]},"type":{"type":"union","types":[{"type":"literal","value":null},{"type":"reflection","declaration":{"name":"__type","kind":65536,"signatures":[{"name":"__type","kind":4096,"parameters":[{"name":"status","kind":32768,"type":{"type":"reference","name":"RecordingStatus"}}],"type":{"type":"intrinsic","name":"void"}}]}}]}}],"type":{"type":"intrinsic","name":"void"}}]},{"name":"setProgressUpdateInterval","kind":2048,"signatures":[{"name":"setProgressUpdateInterval","kind":4096,"comment":{"summary":[{"kind":"text","text":"Sets the interval with which "},{"kind":"code","text":"`onRecordingStatusUpdate`"},{"kind":"text","text":" is called while the recording can record.\nSee "},{"kind":"code","text":"`setOnRecordingStatusUpdate`"},{"kind":"text","text":" for details. This value defaults to 500 milliseconds."}]},"parameters":[{"name":"progressUpdateIntervalMillis","kind":32768,"comment":{"summary":[{"kind":"text","text":"The new interval between calls of "},{"kind":"code","text":"`onRecordingStatusUpdate`"},{"kind":"text","text":"."}]},"type":{"type":"intrinsic","name":"number"}}],"type":{"type":"intrinsic","name":"void"}}]},{"name":"startAsync","kind":2048,"signatures":[{"name":"startAsync","kind":4096,"comment":{"summary":[{"kind":"text","text":"Begins recording. This method can only be called if the "},{"kind":"code","text":"`Recording`"},{"kind":"text","text":" has been prepared."}],"blockTags":[{"tag":"@returns","content":[{"kind":"text","text":"A "},{"kind":"code","text":"`Promise`"},{"kind":"text","text":" that is fulfilled when recording has begun, or rejects if recording could not be started.\nThe promise is resolved with the "},{"kind":"code","text":"`RecordingStatus`"},{"kind":"text","text":" of the recording."}]}]},"type":{"type":"reference","typeArguments":[{"type":"reference","name":"RecordingStatus"}],"name":"Promise","qualifiedName":"Promise","package":"typescript"}}]},{"name":"stopAndUnloadAsync","kind":2048,"signatures":[{"name":"stopAndUnloadAsync","kind":4096,"comment":{"summary":[{"kind":"text","text":"Stops the recording and deallocates the recorder from memory. This reverts the "},{"kind":"code","text":"`Recording`"},{"kind":"text","text":" instance\nto an unprepared state, and another "},{"kind":"code","text":"`Recording`"},{"kind":"text","text":" instance must be created in order to record again.\nThis method can only be called if the "},{"kind":"code","text":"`Recording`"},{"kind":"text","text":" has been prepared.\n\n> On Android this method may fail with "},{"kind":"code","text":"`E_AUDIO_NODATA`"},{"kind":"text","text":" when called too soon after "},{"kind":"code","text":"`startAsync`"},{"kind":"text","text":" and\n> no audio data has been recorded yet. In that case the recorded file will be invalid and should be discarded."}],"blockTags":[{"tag":"@returns","content":[{"kind":"text","text":"A "},{"kind":"code","text":"`Promise`"},{"kind":"text","text":" that is fulfilled when recording has stopped, or rejects if recording could not be stopped.\nThe promise is resolved with the "},{"kind":"code","text":"`RecordingStatus`"},{"kind":"text","text":" of the recording."}]}]},"type":{"type":"reference","typeArguments":[{"type":"reference","name":"RecordingStatus"}],"name":"Promise","qualifiedName":"Promise","package":"typescript"}}]},{"name":"createAsync","kind":2048,"flags":{"isStatic":true},"signatures":[{"name":"createAsync","kind":4096,"comment":{"summary":[{"kind":"text","text":"Creates and starts a recording using the given options, with optional "},{"kind":"code","text":"`onRecordingStatusUpdate`"},{"kind":"text","text":" and "},{"kind":"code","text":"`progressUpdateIntervalMillis`"},{"kind":"text","text":".\n\n"},{"kind":"code","text":"```ts\nconst { recording, status } = await Audio.Recording.createAsync(\n options,\n onRecordingStatusUpdate,\n progressUpdateIntervalMillis\n);\n\n// Which is equivalent to the following:\nconst recording = new Audio.Recording();\nawait recording.prepareToRecordAsync(options);\nrecording.setOnRecordingStatusUpdate(onRecordingStatusUpdate);\nawait recording.startAsync();\n```"}],"blockTags":[{"tag":"@example","content":[{"kind":"code","text":"```ts\ntry {\n const { recording: recordingObject, status } = await Audio.Recording.createAsync(\n Audio.RecordingOptionsPresets.HIGH_QUALITY\n );\n // You are now recording!\n} catch (error) {\n // An error occurred!\n}\n```"}]},{"tag":"@returns","content":[{"kind":"text","text":"A "},{"kind":"code","text":"`Promise`"},{"kind":"text","text":" that is rejected if creation failed, or fulfilled with the following dictionary if creation succeeded."}]}]},"parameters":[{"name":"options","kind":32768,"comment":{"summary":[{"kind":"text","text":"Options for the recording, including sample rate, bitrate, channels, format, encoder, and extension. If no options are passed to,\nthe recorder will be created with options "},{"kind":"code","text":"`Audio.RecordingOptionsPresets.LOW_QUALITY`"},{"kind":"text","text":". See below for details on "},{"kind":"code","text":"`RecordingOptions`"},{"kind":"text","text":"."}]},"type":{"type":"reference","name":"RecordingOptions"},"defaultValue":"RecordingOptionsPresets.LOW_QUALITY"},{"name":"onRecordingStatusUpdate","kind":32768,"comment":{"summary":[{"kind":"text","text":"A function taking a single parameter "},{"kind":"code","text":"`status`"},{"kind":"text","text":" (a dictionary, described in "},{"kind":"code","text":"`getStatusAsync`"},{"kind":"text","text":")."}]},"type":{"type":"union","types":[{"type":"literal","value":null},{"type":"reflection","declaration":{"name":"__type","kind":65536,"signatures":[{"name":"__type","kind":4096,"parameters":[{"name":"status","kind":32768,"type":{"type":"reference","name":"RecordingStatus"}}],"type":{"type":"intrinsic","name":"void"}}]}}]},"defaultValue":"null"},{"name":"progressUpdateIntervalMillis","kind":32768,"comment":{"summary":[{"kind":"text","text":"The interval between calls of "},{"kind":"code","text":"`onRecordingStatusUpdate`"},{"kind":"text","text":". This value defaults to 500 milliseconds."}]},"type":{"type":"union","types":[{"type":"literal","value":null},{"type":"intrinsic","name":"number"}]},"defaultValue":"null"}],"type":{"type":"reference","typeArguments":[{"type":"reference","name":"RecordingObject"}],"name":"Promise","qualifiedName":"Promise","package":"typescript"}}]}]},{"name":"RecordingInput","kind":4194304,"type":{"type":"reflection","declaration":{"name":"__type","kind":65536,"children":[{"name":"name","kind":1024,"type":{"type":"intrinsic","name":"string"}},{"name":"type","kind":1024,"type":{"type":"intrinsic","name":"string"}},{"name":"uid","kind":1024,"type":{"type":"intrinsic","name":"string"}}]}}},{"name":"RecordingObject","kind":4194304,"type":{"type":"reflection","declaration":{"name":"__type","kind":65536,"children":[{"name":"recording","kind":1024,"comment":{"summary":[{"kind":"text","text":"The newly created and started "},{"kind":"code","text":"`Recording`"},{"kind":"text","text":" object."}]},"type":{"type":"reference","name":"Recording"}},{"name":"status","kind":1024,"comment":{"summary":[{"kind":"text","text":"The "},{"kind":"code","text":"`RecordingStatus`"},{"kind":"text","text":" of the "},{"kind":"code","text":"`Recording`"},{"kind":"text","text":" object. See the [AV documentation](/versions/latest/sdk/av) for further information."}]},"type":{"type":"reference","name":"RecordingStatus"}}]}}},{"name":"RecordingOptions","kind":4194304,"comment":{"summary":[{"kind":"text","text":"The recording extension, sample rate, bitrate, channels, format, encoder, etc. which can be customized by passing options to "},{"kind":"code","text":"`prepareToRecordAsync()`"},{"kind":"text","text":".\n\nWe provide the following preset options for convenience, as used in the example above. See below for the definitions of these presets.\n- "},{"kind":"code","text":"`Audio.RecordingOptionsPresets.HIGH_QUALITY`"},{"kind":"text","text":"\n- "},{"kind":"code","text":"`Audio.RecordingOptionsPresets.LOW_QUALITY`"},{"kind":"text","text":"\n\nWe also provide the ability to define your own custom recording options, but **we recommend you use the presets,\nas not all combinations of options will allow you to successfully "},{"kind":"code","text":"`prepareToRecordAsync()`"},{"kind":"text","text":".**\nYou will have to test your custom options on iOS and Android to make sure it's working. In the future,\nwe will enumerate all possible valid combinations, but at this time, our goal is to make the basic use-case easy (with presets)\nand the advanced use-case possible (by exposing all the functionality available on all supported platforms)."}]},"type":{"type":"reflection","declaration":{"name":"__type","kind":65536,"children":[{"name":"android","kind":1024,"comment":{"summary":[{"kind":"text","text":"Recording options for the Android platform."}]},"type":{"type":"reference","name":"RecordingOptionsAndroid"}},{"name":"ios","kind":1024,"comment":{"summary":[{"kind":"text","text":"Recording options for the iOS platform."}]},"type":{"type":"reference","name":"RecordingOptionsIOS"}},{"name":"isMeteringEnabled","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"A boolean that determines whether audio level information will be part of the status object under the \"metering\" key."}]},"type":{"type":"intrinsic","name":"boolean"}},{"name":"keepAudioActiveHint","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"A boolean that hints to keep the audio active after "},{"kind":"code","text":"`prepareToRecordAsync`"},{"kind":"text","text":" completes.\nSetting this value can improve the speed at which the recording starts. Only set this value to "},{"kind":"code","text":"`true`"},{"kind":"text","text":" when you call "},{"kind":"code","text":"`startAsync`"},{"kind":"text","text":"\nimmediately after "},{"kind":"code","text":"`prepareToRecordAsync`"},{"kind":"text","text":". This value is automatically set when using "},{"kind":"code","text":"`Audio.recording.createAsync()`"},{"kind":"text","text":"."}]},"type":{"type":"intrinsic","name":"boolean"}},{"name":"web","kind":1024,"comment":{"summary":[{"kind":"text","text":"Recording options for the Web platform."}]},"type":{"type":"reference","name":"RecordingOptionsWeb"}}]}}},{"name":"RecordingOptionsAndroid","kind":4194304,"type":{"type":"reflection","declaration":{"name":"__type","kind":65536,"children":[{"name":"audioEncoder","kind":1024,"comment":{"summary":[{"kind":"text","text":"The desired audio encoder. See the ["},{"kind":"code","text":"`AndroidAudioEncoder`"},{"kind":"text","text":"](#androidaudioencoder) enum for all valid values."}]},"type":{"type":"union","types":[{"type":"reference","name":"AndroidAudioEncoder"},{"type":"intrinsic","name":"number"}]}},{"name":"bitRate","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"The desired bit rate.\n\nNote that "},{"kind":"code","text":"`prepareToRecordAsync()`"},{"kind":"text","text":" may perform additional checks on the parameter to make sure whether the specified\nbit rate is applicable, and sometimes the passed bitRate will be clipped internally to ensure the audio recording\ncan proceed smoothly based on the capabilities of the platform."}],"blockTags":[{"tag":"@example","content":[{"kind":"code","text":"`128000`"}]}]},"type":{"type":"intrinsic","name":"number"}},{"name":"extension","kind":1024,"comment":{"summary":[{"kind":"text","text":"The desired file extension. Example valid values are "},{"kind":"code","text":"`.3gp`"},{"kind":"text","text":" and "},{"kind":"code","text":"`.m4a`"},{"kind":"text","text":".\nFor more information, see the [Android docs](https://developer.android.com/guide/topics/media/media-formats)\nfor supported output formats."}]},"type":{"type":"intrinsic","name":"string"}},{"name":"maxFileSize","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"The desired maximum file size in bytes, after which the recording will stop (but "},{"kind":"code","text":"`stopAndUnloadAsync()`"},{"kind":"text","text":" must still\nbe called after this point)."}],"blockTags":[{"tag":"@example","content":[{"kind":"code","text":"`65536`"}]}]},"type":{"type":"intrinsic","name":"number"}},{"name":"numberOfChannels","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"The desired number of channels.\n\nNote that "},{"kind":"code","text":"`prepareToRecordAsync()`"},{"kind":"text","text":" may perform additional checks on the parameter to make sure whether the specified\nnumber of audio channels are applicable."}],"blockTags":[{"tag":"@example","content":[{"kind":"code","text":"`1`"},{"kind":"text","text":", "},{"kind":"code","text":"`2`"}]}]},"type":{"type":"intrinsic","name":"number"}},{"name":"outputFormat","kind":1024,"comment":{"summary":[{"kind":"text","text":"The desired file format. See the ["},{"kind":"code","text":"`AndroidOutputFormat`"},{"kind":"text","text":"](#androidoutputformat) enum for all valid values."}]},"type":{"type":"union","types":[{"type":"reference","name":"AndroidOutputFormat"},{"type":"intrinsic","name":"number"}]}},{"name":"sampleRate","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"The desired sample rate.\n\nNote that the sampling rate depends on the format for the audio recording, as well as the capabilities of the platform.\nFor instance, the sampling rate supported by AAC audio coding standard ranges from 8 to 96 kHz,\nthe sampling rate supported by AMRNB is 8kHz, and the sampling rate supported by AMRWB is 16kHz.\nPlease consult with the related audio coding standard for the supported audio sampling rate."}],"blockTags":[{"tag":"@example","content":[{"kind":"code","text":"```ts\n44100\n```"}]}]},"type":{"type":"intrinsic","name":"number"}}]}}},{"name":"RecordingOptionsIOS","kind":4194304,"type":{"type":"reflection","declaration":{"name":"__type","kind":65536,"children":[{"name":"audioQuality","kind":1024,"comment":{"summary":[{"kind":"text","text":"The desired audio quality. See the ["},{"kind":"code","text":"`IOSAudioQuality`"},{"kind":"text","text":"](#iosaudioquality) enum for all valid values."}]},"type":{"type":"union","types":[{"type":"reference","name":"IOSAudioQuality"},{"type":"intrinsic","name":"number"}]}},{"name":"bitDepthHint","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"The desired bit depth hint."}],"blockTags":[{"tag":"@example","content":[{"kind":"code","text":"`16`"}]}]},"type":{"type":"intrinsic","name":"number"}},{"name":"bitRate","kind":1024,"comment":{"summary":[{"kind":"text","text":"The desired bit rate."}],"blockTags":[{"tag":"@example","content":[{"kind":"code","text":"`128000`"}]}]},"type":{"type":"intrinsic","name":"number"}},{"name":"bitRateStrategy","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"The desired bit rate strategy. See the next section for an enumeration of all valid values of "},{"kind":"code","text":"`bitRateStrategy`"},{"kind":"text","text":"."}]},"type":{"type":"intrinsic","name":"number"}},{"name":"extension","kind":1024,"comment":{"summary":[{"kind":"text","text":"The desired file extension."}],"blockTags":[{"tag":"@example","content":[{"kind":"code","text":"`'.caf'`"}]}]},"type":{"type":"intrinsic","name":"string"}},{"name":"linearPCMBitDepth","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"The desired PCM bit depth."}],"blockTags":[{"tag":"@example","content":[{"kind":"code","text":"`16`"}]}]},"type":{"type":"intrinsic","name":"number"}},{"name":"linearPCMIsBigEndian","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"A boolean describing if the PCM data should be formatted in big endian."}]},"type":{"type":"intrinsic","name":"boolean"}},{"name":"linearPCMIsFloat","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"A boolean describing if the PCM data should be encoded in floating point or integral values."}]},"type":{"type":"intrinsic","name":"boolean"}},{"name":"numberOfChannels","kind":1024,"comment":{"summary":[{"kind":"text","text":"The desired number of channels."}],"blockTags":[{"tag":"@example","content":[{"kind":"code","text":"`1`"},{"kind":"text","text":", "},{"kind":"code","text":"`2`"}]}]},"type":{"type":"intrinsic","name":"number"}},{"name":"outputFormat","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"The desired file format. See the ["},{"kind":"code","text":"`IOSOutputFormat`"},{"kind":"text","text":"](#iosoutputformat) enum for all valid values."}]},"type":{"type":"union","types":[{"type":"intrinsic","name":"string"},{"type":"reference","name":"IOSOutputFormat"},{"type":"intrinsic","name":"number"}]}},{"name":"sampleRate","kind":1024,"comment":{"summary":[{"kind":"text","text":"The desired sample rate."}],"blockTags":[{"tag":"@example","content":[{"kind":"code","text":"`44100`"}]}]},"type":{"type":"intrinsic","name":"number"}}]}}},{"name":"RecordingOptionsPresets","kind":32,"flags":{"isConst":true},"comment":{"summary":[{"kind":"text","text":"Constant which contains definitions of the two preset examples of "},{"kind":"code","text":"`RecordingOptions`"},{"kind":"text","text":", as implemented in the Audio SDK.\n\n# "},{"kind":"code","text":"`HIGH_QUALITY`"},{"kind":"text","text":"\n"},{"kind":"code","text":"```ts\nRecordingOptionsPresets.HIGH_QUALITY = {\n isMeteringEnabled: true,\n android: {\n extension: '.m4a',\n outputFormat: AndroidOutputFormat.MPEG_4,\n audioEncoder: AndroidAudioEncoder.AAC,\n sampleRate: 44100,\n numberOfChannels: 2,\n bitRate: 128000,\n },\n ios: {\n extension: '.m4a',\n outputFormat: IOSOutputFormat.MPEG4AAC,\n audioQuality: IOSAudioQuality.MAX,\n sampleRate: 44100,\n numberOfChannels: 2,\n bitRate: 128000,\n linearPCMBitDepth: 16,\n linearPCMIsBigEndian: false,\n linearPCMIsFloat: false,\n },\n web: {\n mimeType: 'audio/webm',\n bitsPerSecond: 128000,\n },\n};\n```"},{"kind":"text","text":"\n\n# "},{"kind":"code","text":"`LOW_QUALITY`"},{"kind":"text","text":"\n"},{"kind":"code","text":"```ts\nRecordingOptionsPresets.LOW_QUALITY = {\n isMeteringEnabled: true,\n android: {\n extension: '.3gp',\n outputFormat: AndroidOutputFormat.THREE_GPP,\n audioEncoder: AndroidAudioEncoder.AMR_NB,\n sampleRate: 44100,\n numberOfChannels: 2,\n bitRate: 128000,\n },\n ios: {\n extension: '.caf',\n audioQuality: IOSAudioQuality.MIN,\n sampleRate: 44100,\n numberOfChannels: 2,\n bitRate: 128000,\n linearPCMBitDepth: 16,\n linearPCMIsBigEndian: false,\n linearPCMIsFloat: false,\n },\n web: {\n mimeType: 'audio/webm',\n bitsPerSecond: 128000,\n },\n};\n```"}]},"type":{"type":"reference","typeArguments":[{"type":"intrinsic","name":"string"},{"type":"reference","name":"RecordingOptions"}],"name":"Record","qualifiedName":"Record","package":"typescript"},"defaultValue":"..."},{"name":"RecordingOptionsWeb","kind":4194304,"type":{"type":"reflection","declaration":{"name":"__type","kind":65536,"children":[{"name":"bitsPerSecond","kind":1024,"flags":{"isOptional":true},"type":{"type":"intrinsic","name":"number"}},{"name":"mimeType","kind":1024,"flags":{"isOptional":true},"type":{"type":"intrinsic","name":"string"}}]}}},{"name":"RecordingStatus","kind":4194304,"type":{"type":"reflection","declaration":{"name":"__type","kind":65536,"children":[{"name":"canRecord","kind":1024,"comment":{"summary":[{"kind":"text","text":"A boolean describing if the "},{"kind":"code","text":"`Recording`"},{"kind":"text","text":" can initiate the recording."}]},"type":{"type":"intrinsic","name":"boolean"}},{"name":"durationMillis","kind":1024,"comment":{"summary":[{"kind":"text","text":"The current duration of the recorded audio or the final duration is the recording has been stopped."}]},"type":{"type":"intrinsic","name":"number"}},{"name":"isDoneRecording","kind":1024,"comment":{"summary":[{"kind":"text","text":"A boolean describing if the "},{"kind":"code","text":"`Recording`"},{"kind":"text","text":" has been stopped."}]},"type":{"type":"intrinsic","name":"boolean"}},{"name":"isRecording","kind":1024,"comment":{"summary":[{"kind":"text","text":"A boolean describing if the "},{"kind":"code","text":"`Recording`"},{"kind":"text","text":" is currently recording."}]},"type":{"type":"intrinsic","name":"boolean"}},{"name":"mediaServicesDidReset","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"A boolean indicating whether media services were reset during recording. This may occur if the active input ceases to be available\nduring recording.\n\nFor example: airpods are the active input and they run out of batteries during recording."}],"blockTags":[{"tag":"@platform","content":[{"kind":"text","text":"ios"}]}]},"type":{"type":"intrinsic","name":"boolean"}},{"name":"metering","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"A number that's the most recent reading of the loudness in dB. The value ranges from "},{"kind":"code","text":"`–160`"},{"kind":"text","text":" dBFS, indicating minimum power,\nto "},{"kind":"code","text":"`0`"},{"kind":"text","text":" dBFS, indicating maximum power. Present or not based on Recording options. See "},{"kind":"code","text":"`RecordingOptions`"},{"kind":"text","text":" for more information."}]},"type":{"type":"intrinsic","name":"number"}},{"name":"uri","kind":1024,"flags":{"isOptional":true},"type":{"type":"union","types":[{"type":"intrinsic","name":"string"},{"type":"literal","value":null}]}}]}}},{"name":"requestPermissionsAsync","kind":64,"signatures":[{"name":"requestPermissionsAsync","kind":4096,"comment":{"summary":[{"kind":"text","text":"Asks the user to grant permissions for audio recording."}],"blockTags":[{"tag":"@returns","content":[{"kind":"text","text":"A promise that resolves to an object of type "},{"kind":"code","text":"`PermissionResponse`"},{"kind":"text","text":"."}]}]},"type":{"type":"reference","typeArguments":[{"type":"reference","name":"PermissionResponse"}],"name":"Promise","qualifiedName":"Promise","package":"typescript"}}]},{"name":"setAudioModeAsync","kind":64,"signatures":[{"name":"setAudioModeAsync","kind":4096,"comment":{"summary":[{"kind":"text","text":"We provide this API to customize the audio experience on iOS and Android."}],"blockTags":[{"tag":"@returns","content":[{"kind":"text","text":"A "},{"kind":"code","text":"`Promise`"},{"kind":"text","text":" that will reject if the audio mode could not be enabled for the device."}]}]},"parameters":[{"name":"partialMode","kind":32768,"type":{"type":"reference","typeArguments":[{"type":"reference","name":"AudioMode"}],"name":"Partial","qualifiedName":"Partial","package":"typescript"}}],"type":{"type":"reference","typeArguments":[{"type":"intrinsic","name":"void"}],"name":"Promise","qualifiedName":"Promise","package":"typescript"}}]},{"name":"setIsEnabledAsync","kind":64,"signatures":[{"name":"setIsEnabledAsync","kind":4096,"comment":{"summary":[{"kind":"text","text":"Audio is enabled by default, but if you want to write your own Audio API in a bare workflow app, you might want to disable the Audio API."}],"blockTags":[{"tag":"@returns","content":[{"kind":"text","text":"A "},{"kind":"code","text":"`Promise`"},{"kind":"text","text":" that will reject if audio playback could not be enabled for the device."}]}]},"parameters":[{"name":"value","kind":32768,"comment":{"summary":[{"kind":"code","text":"`true`"},{"kind":"text","text":" enables Audio, and "},{"kind":"code","text":"`false`"},{"kind":"text","text":" disables it."}]},"type":{"type":"intrinsic","name":"boolean"}}],"type":{"type":"reference","typeArguments":[{"type":"intrinsic","name":"void"}],"name":"Promise","qualifiedName":"Promise","package":"typescript"}}]},{"name":"Sound","kind":128,"comment":{"summary":[{"kind":"text","text":"This class represents a sound corresponding to an Asset or URL."}],"blockTags":[{"tag":"@returns","content":[{"kind":"text","text":"A newly constructed instance of "},{"kind":"code","text":"`Audio.Sound`"},{"kind":"text","text":"."}]},{"tag":"@example","content":[{"kind":"code","text":"```ts\nconst sound = new Audio.Sound();\ntry {\n await sound.loadAsync(require('./assets/sounds/hello.mp3'));\n await sound.playAsync();\n // Your sound is playing!\n\n // Don't forget to unload the sound from memory\n // when you are done using the Sound object\n await sound.unloadAsync();\n} catch (error) {\n // An error occurred!\n}\n```"},{"kind":"text","text":"\n\n> Method not described below and the rest of the API for "},{"kind":"code","text":"`Audio.Sound`"},{"kind":"text","text":" is the same as the imperative playback API for "},{"kind":"code","text":"`Video`"},{"kind":"text","text":".\n> See the [AV documentation](/versions/latest/sdk/av) for further information."}]}]},"children":[{"name":"constructor","kind":512,"signatures":[{"name":"new Sound","kind":16384,"type":{"type":"reference","name":"Sound"}}]},{"name":"_coalesceStatusUpdatesInMillis","kind":1024,"type":{"type":"intrinsic","name":"number"},"defaultValue":"100"},{"name":"_eventEmitter","kind":1024,"type":{"type":"reference","name":"EventEmitter"},"defaultValue":"..."},{"name":"_key","kind":1024,"type":{"type":"reference","name":"AudioInstance"},"defaultValue":"null"},{"name":"_lastStatusUpdate","kind":1024,"type":{"type":"union","types":[{"type":"literal","value":null},{"type":"intrinsic","name":"string"}]},"defaultValue":"null"},{"name":"_lastStatusUpdateTime","kind":1024,"type":{"type":"union","types":[{"type":"literal","value":null},{"type":"reference","name":"Date","qualifiedName":"Date","package":"typescript"}]},"defaultValue":"null"},{"name":"_loaded","kind":1024,"type":{"type":"intrinsic","name":"boolean"},"defaultValue":"false"},{"name":"_loading","kind":1024,"type":{"type":"intrinsic","name":"boolean"},"defaultValue":"false"},{"name":"_onAudioSampleReceived","kind":1024,"type":{"type":"reference","name":"AudioSampleCallback"},"defaultValue":"null"},{"name":"_onMetadataUpdate","kind":1024,"type":{"type":"union","types":[{"type":"literal","value":null},{"type":"reflection","declaration":{"name":"__type","kind":65536,"signatures":[{"name":"__type","kind":4096,"parameters":[{"name":"metadata","kind":32768,"type":{"type":"reference","name":"AVMetadata"}}],"type":{"type":"intrinsic","name":"void"}}]}}]},"defaultValue":"null"},{"name":"_onPlaybackStatusUpdate","kind":1024,"type":{"type":"union","types":[{"type":"literal","value":null},{"type":"reflection","declaration":{"name":"__type","kind":65536,"signatures":[{"name":"__type","kind":4096,"parameters":[{"name":"status","kind":32768,"type":{"type":"reference","name":"AVPlaybackStatus"}}],"type":{"type":"intrinsic","name":"void"}}]}}]},"defaultValue":"null"},{"name":"_subscriptions","kind":1024,"type":{"type":"array","elementType":{"type":"reflection","declaration":{"name":"__type","kind":65536,"children":[{"name":"remove","kind":1024,"type":{"type":"reflection","declaration":{"name":"__type","kind":65536,"signatures":[{"name":"__type","kind":4096,"type":{"type":"intrinsic","name":"void"}}]}}}]}}},"defaultValue":"[]"},{"name":"pauseAsync","kind":1024,"type":{"type":"reflection","declaration":{"name":"__type","kind":65536,"signatures":[{"name":"__type","kind":4096,"type":{"type":"reference","typeArguments":[{"type":"reference","name":"AVPlaybackStatus"}],"name":"Promise","qualifiedName":"Promise","package":"typescript"}}]}},"implementationOf":{"type":"reference","name":"Playback.pauseAsync"}},{"name":"playAsync","kind":1024,"type":{"type":"reflection","declaration":{"name":"__type","kind":65536,"signatures":[{"name":"__type","kind":4096,"type":{"type":"reference","typeArguments":[{"type":"reference","name":"AVPlaybackStatus"}],"name":"Promise","qualifiedName":"Promise","package":"typescript"}}]}},"implementationOf":{"type":"reference","name":"Playback.playAsync"}},{"name":"playFromPositionAsync","kind":1024,"type":{"type":"reflection","declaration":{"name":"__type","kind":65536,"signatures":[{"name":"__type","kind":4096,"parameters":[{"name":"positionMillis","kind":32768,"type":{"type":"intrinsic","name":"number"}},{"name":"tolerances","kind":32768,"flags":{"isOptional":true},"type":{"type":"reference","name":"AVPlaybackTolerance"}}],"type":{"type":"reference","typeArguments":[{"type":"reference","name":"AVPlaybackStatus"}],"name":"Promise","qualifiedName":"Promise","package":"typescript"}}]}},"implementationOf":{"type":"reference","name":"Playback.playFromPositionAsync"}},{"name":"setIsLoopingAsync","kind":1024,"type":{"type":"reflection","declaration":{"name":"__type","kind":65536,"signatures":[{"name":"__type","kind":4096,"parameters":[{"name":"isLooping","kind":32768,"type":{"type":"intrinsic","name":"boolean"}}],"type":{"type":"reference","typeArguments":[{"type":"reference","name":"AVPlaybackStatus"}],"name":"Promise","qualifiedName":"Promise","package":"typescript"}}]}},"implementationOf":{"type":"reference","name":"Playback.setIsLoopingAsync"}},{"name":"setIsMutedAsync","kind":1024,"type":{"type":"reflection","declaration":{"name":"__type","kind":65536,"signatures":[{"name":"__type","kind":4096,"parameters":[{"name":"isMuted","kind":32768,"type":{"type":"intrinsic","name":"boolean"}}],"type":{"type":"reference","typeArguments":[{"type":"reference","name":"AVPlaybackStatus"}],"name":"Promise","qualifiedName":"Promise","package":"typescript"}}]}},"implementationOf":{"type":"reference","name":"Playback.setIsMutedAsync"}},{"name":"setPositionAsync","kind":1024,"type":{"type":"reflection","declaration":{"name":"__type","kind":65536,"signatures":[{"name":"__type","kind":4096,"parameters":[{"name":"positionMillis","kind":32768,"type":{"type":"intrinsic","name":"number"}},{"name":"tolerances","kind":32768,"flags":{"isOptional":true},"type":{"type":"reference","name":"AVPlaybackTolerance"}}],"type":{"type":"reference","typeArguments":[{"type":"reference","name":"AVPlaybackStatus"}],"name":"Promise","qualifiedName":"Promise","package":"typescript"}}]}},"implementationOf":{"type":"reference","name":"Playback.setPositionAsync"}},{"name":"setProgressUpdateIntervalAsync","kind":1024,"type":{"type":"reflection","declaration":{"name":"__type","kind":65536,"signatures":[{"name":"__type","kind":4096,"parameters":[{"name":"progressUpdateIntervalMillis","kind":32768,"type":{"type":"intrinsic","name":"number"}}],"type":{"type":"reference","typeArguments":[{"type":"reference","name":"AVPlaybackStatus"}],"name":"Promise","qualifiedName":"Promise","package":"typescript"}}]}},"implementationOf":{"type":"reference","name":"Playback.setProgressUpdateIntervalAsync"}},{"name":"setRateAsync","kind":1024,"type":{"type":"reflection","declaration":{"name":"__type","kind":65536,"signatures":[{"name":"__type","kind":4096,"parameters":[{"name":"rate","kind":32768,"type":{"type":"intrinsic","name":"number"}},{"name":"shouldCorrectPitch","kind":32768,"type":{"type":"intrinsic","name":"boolean"}},{"name":"pitchCorrectionQuality","kind":32768,"flags":{"isOptional":true},"type":{"type":"reference","name":"PitchCorrectionQuality"}}],"type":{"type":"reference","typeArguments":[{"type":"reference","name":"AVPlaybackStatus"}],"name":"Promise","qualifiedName":"Promise","package":"typescript"}}]}},"implementationOf":{"type":"reference","name":"Playback.setRateAsync"}},{"name":"setVolumeAsync","kind":1024,"type":{"type":"reflection","declaration":{"name":"__type","kind":65536,"signatures":[{"name":"__type","kind":4096,"parameters":[{"name":"volume","kind":32768,"type":{"type":"intrinsic","name":"number"}},{"name":"audioPan","kind":32768,"flags":{"isOptional":true},"type":{"type":"intrinsic","name":"number"}}],"type":{"type":"reference","typeArguments":[{"type":"reference","name":"AVPlaybackStatus"}],"name":"Promise","qualifiedName":"Promise","package":"typescript"}}]}},"implementationOf":{"type":"reference","name":"Playback.setVolumeAsync"}},{"name":"stopAsync","kind":1024,"type":{"type":"reflection","declaration":{"name":"__type","kind":65536,"signatures":[{"name":"__type","kind":4096,"type":{"type":"reference","typeArguments":[{"type":"reference","name":"AVPlaybackStatus"}],"name":"Promise","qualifiedName":"Promise","package":"typescript"}}]}},"implementationOf":{"type":"reference","name":"Playback.stopAsync"}},{"name":"_callOnPlaybackStatusUpdateForNewStatus","kind":2048,"signatures":[{"name":"_callOnPlaybackStatusUpdateForNewStatus","kind":4096,"parameters":[{"name":"status","kind":32768,"type":{"type":"reference","name":"AVPlaybackStatus"}}],"type":{"type":"intrinsic","name":"void"}}]},{"name":"_clearSubscriptions","kind":2048,"signatures":[{"name":"_clearSubscriptions","kind":4096,"type":{"type":"intrinsic","name":"void"}}]},{"name":"_errorCallback","kind":2048,"signatures":[{"name":"_errorCallback","kind":4096,"parameters":[{"name":"error","kind":32768,"type":{"type":"intrinsic","name":"string"}}],"type":{"type":"intrinsic","name":"void"}}]},{"name":"_internalErrorCallback","kind":2048,"signatures":[{"name":"_internalErrorCallback","kind":4096,"parameters":[{"name":"__namedParameters","kind":32768,"type":{"type":"reflection","declaration":{"name":"__type","kind":65536,"children":[{"name":"error","kind":1024,"type":{"type":"intrinsic","name":"string"}},{"name":"key","kind":1024,"type":{"type":"reference","name":"AudioInstance"}}]}}}],"type":{"type":"intrinsic","name":"void"}}]},{"name":"_internalMetadataUpdateCallback","kind":2048,"signatures":[{"name":"_internalMetadataUpdateCallback","kind":4096,"parameters":[{"name":"__namedParameters","kind":32768,"type":{"type":"reflection","declaration":{"name":"__type","kind":65536,"children":[{"name":"key","kind":1024,"type":{"type":"reference","name":"AudioInstance"}},{"name":"metadata","kind":1024,"type":{"type":"reference","name":"AVMetadata"}}]}}}],"type":{"type":"intrinsic","name":"void"}}]},{"name":"_internalStatusUpdateCallback","kind":2048,"signatures":[{"name":"_internalStatusUpdateCallback","kind":4096,"parameters":[{"name":"__namedParameters","kind":32768,"type":{"type":"reflection","declaration":{"name":"__type","kind":65536,"children":[{"name":"key","kind":1024,"type":{"type":"reference","name":"AudioInstance"}},{"name":"status","kind":1024,"type":{"type":"reference","name":"AVPlaybackStatus"}}]}}}],"type":{"type":"intrinsic","name":"void"}}]},{"name":"_performOperationAndHandleStatusAsync","kind":2048,"signatures":[{"name":"_performOperationAndHandleStatusAsync","kind":4096,"parameters":[{"name":"operation","kind":32768,"type":{"type":"reflection","declaration":{"name":"__type","kind":65536,"signatures":[{"name":"__type","kind":4096,"type":{"type":"reference","typeArguments":[{"type":"reference","name":"AVPlaybackStatus"}],"name":"Promise","qualifiedName":"Promise","package":"typescript"}}]}}}],"type":{"type":"reference","typeArguments":[{"type":"reference","name":"AVPlaybackStatus"}],"name":"Promise","qualifiedName":"Promise","package":"typescript"}}]},{"name":"_subscribeToNativeEvents","kind":2048,"signatures":[{"name":"_subscribeToNativeEvents","kind":4096,"type":{"type":"intrinsic","name":"void"}}]},{"name":"getStatusAsync","kind":2048,"signatures":[{"name":"getStatusAsync","kind":4096,"type":{"type":"reference","typeArguments":[{"type":"reference","name":"AVPlaybackStatus"}],"name":"Promise","qualifiedName":"Promise","package":"typescript"},"implementationOf":{"type":"reference","name":"Playback.getStatusAsync"}}],"implementationOf":{"type":"reference","name":"Playback.getStatusAsync"}},{"name":"loadAsync","kind":2048,"signatures":[{"name":"loadAsync","kind":4096,"parameters":[{"name":"source","kind":32768,"type":{"type":"reference","name":"AVPlaybackSource"}},{"name":"initialStatus","kind":32768,"type":{"type":"reference","name":"AVPlaybackStatusToSet"},"defaultValue":"{}"},{"name":"downloadFirst","kind":32768,"type":{"type":"intrinsic","name":"boolean"},"defaultValue":"true"}],"type":{"type":"reference","typeArguments":[{"type":"reference","name":"AVPlaybackStatus"}],"name":"Promise","qualifiedName":"Promise","package":"typescript"},"implementationOf":{"type":"reference","name":"Playback.loadAsync"}}],"implementationOf":{"type":"reference","name":"Playback.loadAsync"}},{"name":"replayAsync","kind":2048,"signatures":[{"name":"replayAsync","kind":4096,"parameters":[{"name":"status","kind":32768,"type":{"type":"reference","name":"AVPlaybackStatusToSet"},"defaultValue":"{}"}],"type":{"type":"reference","typeArguments":[{"type":"reference","name":"AVPlaybackStatus"}],"name":"Promise","qualifiedName":"Promise","package":"typescript"},"implementationOf":{"type":"reference","name":"Playback.replayAsync"}}],"implementationOf":{"type":"reference","name":"Playback.replayAsync"}},{"name":"setOnAudioSampleReceived","kind":2048,"signatures":[{"name":"setOnAudioSampleReceived","kind":4096,"comment":{"summary":[{"kind":"text","text":"Sets a function to be called during playback, receiving the audio sample as parameter."}]},"parameters":[{"name":"callback","kind":32768,"comment":{"summary":[{"kind":"text","text":"A function taking the "},{"kind":"code","text":"`AudioSampleCallback`"},{"kind":"text","text":" as parameter."}]},"type":{"type":"reference","name":"AudioSampleCallback"}}],"type":{"type":"intrinsic","name":"void"}}]},{"name":"setOnMetadataUpdate","kind":2048,"signatures":[{"name":"setOnMetadataUpdate","kind":4096,"comment":{"summary":[{"kind":"text","text":"Sets a function to be called whenever the metadata of the sound object changes, if one is set."}],"blockTags":[{"tag":"@platform","content":[{"kind":"text","text":"ios"}]}]},"parameters":[{"name":"onMetadataUpdate","kind":32768,"comment":{"summary":[{"kind":"text","text":"A function taking a single object of type "},{"kind":"code","text":"`AVMetadata`"},{"kind":"text","text":" as a parameter."}]},"type":{"type":"reflection","declaration":{"name":"__type","kind":65536,"signatures":[{"name":"__type","kind":4096,"parameters":[{"name":"metadata","kind":32768,"type":{"type":"reference","name":"AVMetadata"}}],"type":{"type":"intrinsic","name":"void"}}]}}}],"type":{"type":"intrinsic","name":"void"}}]},{"name":"setOnPlaybackStatusUpdate","kind":2048,"signatures":[{"name":"setOnPlaybackStatusUpdate","kind":4096,"comment":{"summary":[{"kind":"text","text":"Sets a function to be called regularly with the "},{"kind":"code","text":"`AVPlaybackStatus`"},{"kind":"text","text":" of the playback object.\n\n"},{"kind":"code","text":"`onPlaybackStatusUpdate`"},{"kind":"text","text":" will be called whenever a call to the API for this playback object completes\n(such as "},{"kind":"code","text":"`setStatusAsync()`"},{"kind":"text","text":", "},{"kind":"code","text":"`getStatusAsync()`"},{"kind":"text","text":", or "},{"kind":"code","text":"`unloadAsync()`"},{"kind":"text","text":"), nd will also be called at regular intervals\nwhile the media is in the loaded state.\n\nSet "},{"kind":"code","text":"`progressUpdateIntervalMillis`"},{"kind":"text","text":" via "},{"kind":"code","text":"`setStatusAsync()`"},{"kind":"text","text":" or "},{"kind":"code","text":"`setProgressUpdateIntervalAsync()`"},{"kind":"text","text":" to modify\nthe interval with which "},{"kind":"code","text":"`onPlaybackStatusUpdate`"},{"kind":"text","text":" is called while loaded."}]},"parameters":[{"name":"onPlaybackStatusUpdate","kind":32768,"comment":{"summary":[{"kind":"text","text":"A function taking a single parameter "},{"kind":"code","text":"`AVPlaybackStatus`"},{"kind":"text","text":"."}]},"type":{"type":"union","types":[{"type":"literal","value":null},{"type":"reflection","declaration":{"name":"__type","kind":65536,"signatures":[{"name":"__type","kind":4096,"parameters":[{"name":"status","kind":32768,"type":{"type":"reference","name":"AVPlaybackStatus"}}],"type":{"type":"intrinsic","name":"void"}}]}}]}}],"type":{"type":"intrinsic","name":"void"}}]},{"name":"setStatusAsync","kind":2048,"signatures":[{"name":"setStatusAsync","kind":4096,"parameters":[{"name":"status","kind":32768,"type":{"type":"reference","name":"AVPlaybackStatusToSet"}}],"type":{"type":"reference","typeArguments":[{"type":"reference","name":"AVPlaybackStatus"}],"name":"Promise","qualifiedName":"Promise","package":"typescript"},"implementationOf":{"type":"reference","name":"Playback.setStatusAsync"}}],"implementationOf":{"type":"reference","name":"Playback.setStatusAsync"}},{"name":"unloadAsync","kind":2048,"signatures":[{"name":"unloadAsync","kind":4096,"type":{"type":"reference","typeArguments":[{"type":"reference","name":"AVPlaybackStatus"}],"name":"Promise","qualifiedName":"Promise","package":"typescript"},"implementationOf":{"type":"reference","name":"Playback.unloadAsync"}}],"implementationOf":{"type":"reference","name":"Playback.unloadAsync"}},{"name":"create","kind":2048,"flags":{"isStatic":true},"signatures":[{"name":"create","kind":4096,"comment":{"summary":[],"blockTags":[{"tag":"@deprecated","content":[{"kind":"text","text":"Use "},{"kind":"code","text":"`Sound.createAsync()`"},{"kind":"text","text":" instead"}]}]},"parameters":[{"name":"source","kind":32768,"type":{"type":"reference","name":"AVPlaybackSource"}},{"name":"initialStatus","kind":32768,"type":{"type":"reference","name":"AVPlaybackStatusToSet"},"defaultValue":"{}"},{"name":"onPlaybackStatusUpdate","kind":32768,"type":{"type":"union","types":[{"type":"literal","value":null},{"type":"reflection","declaration":{"name":"__type","kind":65536,"signatures":[{"name":"__type","kind":4096,"parameters":[{"name":"status","kind":32768,"type":{"type":"reference","name":"AVPlaybackStatus"}}],"type":{"type":"intrinsic","name":"void"}}]}}]},"defaultValue":"null"},{"name":"downloadFirst","kind":32768,"type":{"type":"intrinsic","name":"boolean"},"defaultValue":"true"}],"type":{"type":"reference","typeArguments":[{"type":"reference","name":"SoundObject"}],"name":"Promise","qualifiedName":"Promise","package":"typescript"}}]},{"name":"createAsync","kind":2048,"flags":{"isStatic":true},"signatures":[{"name":"createAsync","kind":4096,"comment":{"summary":[{"kind":"text","text":"Creates and loads a sound from source.\n\n"},{"kind":"code","text":"```ts\nconst { sound } = await Audio.Sound.createAsync(\n source,\n initialStatus,\n onPlaybackStatusUpdate,\n downloadFirst\n);\n\n// Which is equivalent to the following:\nconst sound = new Audio.Sound();\nsound.setOnPlaybackStatusUpdate(onPlaybackStatusUpdate);\nawait sound.loadAsync(source, initialStatus, downloadFirst);\n```"}],"blockTags":[{"tag":"@example","content":[{"kind":"code","text":"```ts\ntry {\n const { sound: soundObject, status } = await Audio.Sound.createAsync(\n require('./assets/sounds/hello.mp3'),\n { shouldPlay: true }\n );\n // Your sound is playing!\n} catch (error) {\n // An error occurred!\n}\n```"}]},{"tag":"@returns","content":[{"kind":"text","text":"A "},{"kind":"code","text":"`Promise`"},{"kind":"text","text":" that is rejected if creation failed, or fulfilled with the "},{"kind":"code","text":"`SoundObject`"},{"kind":"text","text":" if creation succeeded."}]}]},"parameters":[{"name":"source","kind":32768,"comment":{"summary":[{"kind":"text","text":"The source of the sound. See the [AV documentation](/versions/latest/sdk/av/#playback-api) for details on the possible "},{"kind":"code","text":"`source`"},{"kind":"text","text":" values."}]},"type":{"type":"reference","name":"AVPlaybackSource"}},{"name":"initialStatus","kind":32768,"comment":{"summary":[{"kind":"text","text":"The initial intended "},{"kind":"code","text":"`PlaybackStatusToSet`"},{"kind":"text","text":" of the sound, whose values will override the default initial playback status.\nThis value defaults to "},{"kind":"code","text":"`{}`"},{"kind":"text","text":" if no parameter is passed. See the [AV documentation](/versions/latest/sdk/av) for details on "},{"kind":"code","text":"`PlaybackStatusToSet`"},{"kind":"text","text":" and the default\ninitial playback status."}]},"type":{"type":"reference","name":"AVPlaybackStatusToSet"},"defaultValue":"{}"},{"name":"onPlaybackStatusUpdate","kind":32768,"comment":{"summary":[{"kind":"text","text":"A function taking a single parameter "},{"kind":"code","text":"`PlaybackStatus`"},{"kind":"text","text":". This value defaults to "},{"kind":"code","text":"`null`"},{"kind":"text","text":" if no parameter is passed.\nSee the [AV documentation](/versions/latest/sdk/av) for details on the functionality provided by "},{"kind":"code","text":"`onPlaybackStatusUpdate`"}]},"type":{"type":"union","types":[{"type":"literal","value":null},{"type":"reflection","declaration":{"name":"__type","kind":65536,"signatures":[{"name":"__type","kind":4096,"parameters":[{"name":"status","kind":32768,"type":{"type":"reference","name":"AVPlaybackStatus"}}],"type":{"type":"intrinsic","name":"void"}}]}}]},"defaultValue":"null"},{"name":"downloadFirst","kind":32768,"comment":{"summary":[{"kind":"text","text":"If set to true, the system will attempt to download the resource to the device before loading. This value defaults to "},{"kind":"code","text":"`true`"},{"kind":"text","text":".\nNote that at the moment, this will only work for "},{"kind":"code","text":"`source`"},{"kind":"text","text":"s of the form "},{"kind":"code","text":"`require('path/to/file')`"},{"kind":"text","text":" or "},{"kind":"code","text":"`Asset`"},{"kind":"text","text":" objects."}]},"type":{"type":"intrinsic","name":"boolean"},"defaultValue":"true"}],"type":{"type":"reference","typeArguments":[{"type":"reference","name":"SoundObject"}],"name":"Promise","qualifiedName":"Promise","package":"typescript"}}]}],"implementedTypes":[{"type":"reference","name":"Playback"}]},{"name":"SoundObject","kind":4194304,"type":{"type":"reflection","declaration":{"name":"__type","kind":65536,"children":[{"name":"sound","kind":1024,"comment":{"summary":[{"kind":"text","text":"The newly created and loaded "},{"kind":"code","text":"`Sound`"},{"kind":"text","text":" object."}]},"type":{"type":"reference","name":"Sound"}},{"name":"status","kind":1024,"comment":{"summary":[{"kind":"text","text":"The "},{"kind":"code","text":"`PlaybackStatus`"},{"kind":"text","text":" of the "},{"kind":"code","text":"`Sound`"},{"kind":"text","text":" object. See the [AV documentation](/versions/latest/sdk/av) for further information."}]},"type":{"type":"reference","name":"AVPlaybackStatus"}}]}}},{"name":"usePermissions","kind":64,"signatures":[{"name":"usePermissions","kind":4096,"comment":{"summary":[{"kind":"text","text":"Check or request permissions to record audio.\nThis uses both "},{"kind":"code","text":"`requestPermissionAsync`"},{"kind":"text","text":" and "},{"kind":"code","text":"`getPermissionsAsync`"},{"kind":"text","text":" to interact with the permissions."}],"blockTags":[{"tag":"@example","content":[{"kind":"code","text":"```ts\nconst [permissionResponse, requestPermission] = Audio.usePermissions();\n```"}]}]},"parameters":[{"name":"options","kind":32768,"flags":{"isOptional":true},"type":{"type":"reference","typeArguments":[{"type":"intrinsic","name":"object"}],"name":"PermissionHookOptions"}}],"type":{"type":"tuple","elements":[{"type":"union","types":[{"type":"literal","value":null},{"type":"reference","name":"PermissionResponse"}]},{"type":"reference","typeArguments":[{"type":"reference","name":"PermissionResponse"}],"name":"RequestPermissionMethod"},{"type":"reference","typeArguments":[{"type":"reference","name":"PermissionResponse"}],"name":"GetPermissionMethod"}]}}]}]}
\ No newline at end of file
diff --git a/docs/public/static/data/v49.0.0/expo-auth-session.json b/docs/public/static/data/v49.0.0/expo-auth-session.json
new file mode 100644
index 0000000000000..02a3da40b5be6
--- /dev/null
+++ b/docs/public/static/data/v49.0.0/expo-auth-session.json
@@ -0,0 +1 @@
+{"name":"expo-auth-session","kind":1,"children":[{"name":"CodeChallengeMethod","kind":8,"children":[{"name":"Plain","kind":16,"comment":{"summary":[{"kind":"text","text":"This should not be used. When used, the code verifier will be sent to the server as-is."}]},"type":{"type":"literal","value":"plain"}},{"name":"S256","kind":16,"comment":{"summary":[{"kind":"text","text":"The default and recommended method for transforming the code verifier.\n- Convert the code verifier to ASCII.\n- Create a digest of the string using crypto method SHA256.\n- Convert the digest to Base64 and URL encode it."}]},"type":{"type":"literal","value":"S256"}}]},{"name":"GrantType","kind":8,"comment":{"summary":[{"kind":"text","text":"Grant type values used in dynamic client registration and auth requests."}],"blockTags":[{"tag":"@see","content":[{"kind":"text","text":"[Appendix A.10](https://tools.ietf.org/html/rfc6749#appendix-A.10)"}]}]},"children":[{"name":"AuthorizationCode","kind":16,"comment":{"summary":[{"kind":"text","text":"Used for exchanging an authorization code for one or more tokens.\n\n[Section 4.1.3](https://tools.ietf.org/html/rfc6749#section-4.1.3)"}]},"type":{"type":"literal","value":"authorization_code"}},{"name":"ClientCredentials","kind":16,"comment":{"summary":[{"kind":"text","text":"Used for client credentials flow.\n\n[Section 4.4.2](https://tools.ietf.org/html/rfc6749#section-4.4.2)"}]},"type":{"type":"literal","value":"client_credentials"}},{"name":"Implicit","kind":16,"comment":{"summary":[{"kind":"text","text":"Used when obtaining an access token.\n\n[Section 4.2](https://tools.ietf.org/html/rfc6749#section-4.2)"}]},"type":{"type":"literal","value":"implicit"}},{"name":"RefreshToken","kind":16,"comment":{"summary":[{"kind":"text","text":"Used when exchanging a refresh token for a new token.\n\n[Section 6](https://tools.ietf.org/html/rfc6749#section-6)"}]},"type":{"type":"literal","value":"refresh_token"}}]},{"name":"Prompt","kind":8,"comment":{"summary":[{"kind":"text","text":"Informs the server if the user should be prompted to login or consent again.\nThis can be used to present a dialog for switching accounts after the user has already been logged in.\nYou should use this in favor of clearing cookies (which is mostly not possible on iOS)."}],"blockTags":[{"tag":"@see","content":[{"kind":"text","text":"[Section 3.1.2.1](https://openid.net/specs/openid-connect-core-1_0.html#AuthorizationRequest)."}]}]},"children":[{"name":"Consent","kind":16,"comment":{"summary":[{"kind":"text","text":"Server should prompt the user for consent before returning information to the client.\nIf it cannot obtain consent, it must return an error, typically "},{"kind":"code","text":"`consent_required`"},{"kind":"text","text":"."}]},"type":{"type":"literal","value":"consent"}},{"name":"Login","kind":16,"comment":{"summary":[{"kind":"text","text":"The server should prompt the user to reauthenticate.\nIf it cannot reauthenticate the End-User, it must return an error, typically "},{"kind":"code","text":"`login_required`"},{"kind":"text","text":"."}]},"type":{"type":"literal","value":"login"}},{"name":"None","kind":16,"comment":{"summary":[{"kind":"text","text":"Server must not display any auth or consent UI. Can be used to check for existing auth or consent.\nAn error is returned if a user isn't already authenticated or the client doesn't have pre-configured consent for the requested claims, or does not fulfill other conditions for processing the request.\nThe error code will typically be "},{"kind":"code","text":"`login_required`"},{"kind":"text","text":", "},{"kind":"code","text":"`interaction_required`"},{"kind":"text","text":", or another code defined in [Section 3.1.2.6](https://openid.net/specs/openid-connect-core-1_0.html#AuthError)."}]},"type":{"type":"literal","value":"none"}},{"name":"SelectAccount","kind":16,"comment":{"summary":[{"kind":"text","text":"Server should prompt the user to select an account. Can be used to switch accounts.\nIf it can't obtain an account selection choice made by the user, it must return an error, typically "},{"kind":"code","text":"`account_selection_required`"},{"kind":"text","text":"."}]},"type":{"type":"literal","value":"select_account"}}]},{"name":"ResponseType","kind":8,"comment":{"summary":[{"kind":"text","text":"The client informs the authorization server of the desired grant type by using the response type."}],"blockTags":[{"tag":"@see","content":[{"kind":"text","text":"[Section 3.1.1](https://tools.ietf.org/html/rfc6749#section-3.1.1)."}]}]},"children":[{"name":"Code","kind":16,"comment":{"summary":[{"kind":"text","text":"For requesting an authorization code as described by [Section 4.1.1](https://tools.ietf.org/html/rfc6749#section-4.1.1)."}]},"type":{"type":"literal","value":"code"}},{"name":"IdToken","kind":16,"comment":{"summary":[{"kind":"text","text":"A custom registered type for getting an "},{"kind":"code","text":"`id_token`"},{"kind":"text","text":" from Google OAuth."}]},"type":{"type":"literal","value":"id_token"}},{"name":"Token","kind":16,"comment":{"summary":[{"kind":"text","text":"For requesting an access token (implicit grant) as described by [Section 4.2.1](https://tools.ietf.org/html/rfc6749#section-4.2.1)."}]},"type":{"type":"literal","value":"token"}}]},{"name":"TokenTypeHint","kind":8,"comment":{"summary":[{"kind":"text","text":"A hint about the type of the token submitted for revocation. If not included then the server should attempt to deduce the token type."}],"blockTags":[{"tag":"@see","content":[{"kind":"text","text":"[Section 2.1](https://tools.ietf.org/html/rfc7009#section-2.1)"}]}]},"children":[{"name":"AccessToken","kind":16,"comment":{"summary":[{"kind":"text","text":"Access token.\n\n[Section 1.4](https://tools.ietf.org/html/rfc6749#section-1.4)"}]},"type":{"type":"literal","value":"access_token"}},{"name":"RefreshToken","kind":16,"comment":{"summary":[{"kind":"text","text":"Refresh token.\n\n[Section 1.5](https://tools.ietf.org/html/rfc6749#section-1.5)"}]},"type":{"type":"literal","value":"refresh_token"}}]},{"name":"AccessTokenRequest","kind":128,"comment":{"summary":[{"kind":"text","text":"Access token request. Exchange an authorization code for a user access token.\n\n[Section 4.1.3](https://tools.ietf.org/html/rfc6749#section-4.1.3)"}]},"children":[{"name":"constructor","kind":512,"signatures":[{"name":"new AccessTokenRequest","kind":16384,"parameters":[{"name":"options","kind":32768,"type":{"type":"reference","name":"AccessTokenRequestConfig"}}],"type":{"type":"reference","name":"AccessTokenRequest"},"overwrites":{"type":"reference","name":"TokenRequest.constructor"}}],"overwrites":{"type":"reference","name":"TokenRequest.constructor"}},{"name":"clientId","kind":1024,"flags":{"isReadonly":true},"comment":{"summary":[{"kind":"text","text":"A unique string representing the registration information provided by the client.\nThe client identifier is not a secret; it is exposed to the resource owner and shouldn't be used\nalone for client authentication.\n\nThe client identifier is unique to the authorization server.\n\n[Section 2.2](https://tools.ietf.org/html/rfc6749#section-2.2)"}]},"type":{"type":"intrinsic","name":"string"},"inheritedFrom":{"type":"reference","name":"TokenRequest.clientId"},"implementationOf":{"type":"reference","name":"AccessTokenRequestConfig.clientId"}},{"name":"clientSecret","kind":1024,"flags":{"isOptional":true,"isReadonly":true},"comment":{"summary":[{"kind":"text","text":"Client secret supplied by an auth provider.\nThere is no secure way to store this on the client.\n\n[Section 2.3.1](https://tools.ietf.org/html/rfc6749#section-2.3.1)"}]},"type":{"type":"intrinsic","name":"string"},"inheritedFrom":{"type":"reference","name":"TokenRequest.clientSecret"},"implementationOf":{"type":"reference","name":"AccessTokenRequestConfig.clientSecret"}},{"name":"code","kind":1024,"flags":{"isReadonly":true},"comment":{"summary":[{"kind":"text","text":"The authorization code received from the authorization server."}]},"type":{"type":"intrinsic","name":"string"},"implementationOf":{"type":"reference","name":"AccessTokenRequestConfig.code"}},{"name":"extraParams","kind":1024,"flags":{"isOptional":true,"isReadonly":true},"comment":{"summary":[{"kind":"text","text":"Extra query params that'll be added to the query string."}]},"type":{"type":"reference","typeArguments":[{"type":"intrinsic","name":"string"},{"type":"intrinsic","name":"string"}],"name":"Record","qualifiedName":"Record","package":"typescript"},"inheritedFrom":{"type":"reference","name":"TokenRequest.extraParams"},"implementationOf":{"type":"reference","name":"AccessTokenRequestConfig.extraParams"}},{"name":"grantType","kind":1024,"flags":{"isPublic":true},"type":{"type":"reference","name":"GrantType"},"inheritedFrom":{"type":"reference","name":"TokenRequest.grantType"}},{"name":"redirectUri","kind":1024,"flags":{"isReadonly":true},"comment":{"summary":[{"kind":"text","text":"If the "},{"kind":"code","text":"`redirectUri`"},{"kind":"text","text":" parameter was included in the "},{"kind":"code","text":"`AuthRequest`"},{"kind":"text","text":", then it must be supplied here as well.\n\n[Section 3.1.2](https://tools.ietf.org/html/rfc6749#section-3.1.2)"}]},"type":{"type":"intrinsic","name":"string"},"implementationOf":{"type":"reference","name":"AccessTokenRequestConfig.redirectUri"}},{"name":"scopes","kind":1024,"flags":{"isOptional":true,"isReadonly":true},"comment":{"summary":[{"kind":"text","text":"List of strings to request access to.\n\n[Section 3.3](https://tools.ietf.org/html/rfc6749#section-3.3)"}]},"type":{"type":"array","elementType":{"type":"intrinsic","name":"string"}},"inheritedFrom":{"type":"reference","name":"TokenRequest.scopes"},"implementationOf":{"type":"reference","name":"AccessTokenRequestConfig.scopes"}},{"name":"getHeaders","kind":2048,"signatures":[{"name":"getHeaders","kind":4096,"type":{"type":"reference","name":"Headers"},"inheritedFrom":{"type":"reference","name":"TokenRequest.getHeaders"}}],"inheritedFrom":{"type":"reference","name":"TokenRequest.getHeaders"}},{"name":"getQueryBody","kind":2048,"signatures":[{"name":"getQueryBody","kind":4096,"type":{"type":"reference","typeArguments":[{"type":"intrinsic","name":"string"},{"type":"intrinsic","name":"string"}],"name":"Record","qualifiedName":"Record","package":"typescript"},"overwrites":{"type":"reference","name":"TokenRequest.getQueryBody"}}],"overwrites":{"type":"reference","name":"TokenRequest.getQueryBody"}},{"name":"getRequestConfig","kind":2048,"signatures":[{"name":"getRequestConfig","kind":4096,"type":{"type":"reflection","declaration":{"name":"__type","kind":65536,"children":[{"name":"clientId","kind":1024,"type":{"type":"intrinsic","name":"string"},"defaultValue":"..."},{"name":"clientSecret","kind":1024,"type":{"type":"union","types":[{"type":"intrinsic","name":"undefined"},{"type":"intrinsic","name":"string"}]},"defaultValue":"..."},{"name":"code","kind":1024,"type":{"type":"intrinsic","name":"string"},"defaultValue":"..."},{"name":"extraParams","kind":1024,"type":{"type":"union","types":[{"type":"intrinsic","name":"undefined"},{"type":"reference","typeArguments":[{"type":"intrinsic","name":"string"},{"type":"intrinsic","name":"string"}],"name":"Record","qualifiedName":"Record","package":"typescript"}]},"defaultValue":"..."},{"name":"grantType","kind":1024,"type":{"type":"reference","name":"GrantType"},"defaultValue":"..."},{"name":"redirectUri","kind":1024,"type":{"type":"intrinsic","name":"string"},"defaultValue":"..."},{"name":"scopes","kind":1024,"type":{"type":"union","types":[{"type":"intrinsic","name":"undefined"},{"type":"array","elementType":{"type":"intrinsic","name":"string"}}]},"defaultValue":"..."}]}},"overwrites":{"type":"reference","name":"TokenRequest.getRequestConfig"}}],"overwrites":{"type":"reference","name":"TokenRequest.getRequestConfig"}},{"name":"performAsync","kind":2048,"signatures":[{"name":"performAsync","kind":4096,"parameters":[{"name":"discovery","kind":32768,"type":{"type":"reference","typeArguments":[{"type":"reference","name":"DiscoveryDocument"},{"type":"literal","value":"tokenEndpoint"}],"name":"Pick","qualifiedName":"Pick","package":"typescript"}}],"type":{"type":"reference","typeArguments":[{"type":"reference","name":"TokenResponse"}],"name":"Promise","qualifiedName":"Promise","package":"typescript"},"inheritedFrom":{"type":"reference","name":"TokenRequest.performAsync"}}],"inheritedFrom":{"type":"reference","name":"TokenRequest.performAsync"}}],"extendedTypes":[{"type":"reference","typeArguments":[{"type":"reference","name":"AccessTokenRequestConfig"}],"name":"TokenRequest"}],"implementedTypes":[{"type":"reference","name":"AccessTokenRequestConfig"}]},{"name":"AuthError","kind":128,"comment":{"summary":[{"kind":"text","text":"Represents an authorization response error: [Section 5.2](https://tools.ietf.org/html/rfc6749#section-5.2).\nOften times providers will fail to return the proper error message for a given error code.\nThis error method will add the missing description for more context on what went wrong."}]},"children":[{"name":"constructor","kind":512,"signatures":[{"name":"new AuthError","kind":16384,"parameters":[{"name":"response","kind":32768,"type":{"type":"reference","name":"AuthErrorConfig"}}],"type":{"type":"reference","name":"AuthError"},"overwrites":{"type":"reference","name":"ResponseError.constructor"}}],"overwrites":{"type":"reference","name":"ResponseError.constructor"}},{"name":"code","kind":1024,"type":{"type":"intrinsic","name":"string"},"inheritedFrom":{"type":"reference","name":"ResponseError.code"}},{"name":"description","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"Used to assist the client developer in\nunderstanding the error that occurred."}]},"type":{"type":"intrinsic","name":"string"},"inheritedFrom":{"type":"reference","name":"ResponseError.description"}},{"name":"info","kind":1024,"flags":{"isOptional":true},"type":{"type":"intrinsic","name":"any"},"inheritedFrom":{"type":"reference","name":"ResponseError.info"}},{"name":"params","kind":1024,"comment":{"summary":[{"kind":"text","text":"Raw results of the error."}]},"type":{"type":"reference","typeArguments":[{"type":"intrinsic","name":"string"},{"type":"intrinsic","name":"string"}],"name":"Record","qualifiedName":"Record","package":"typescript"},"inheritedFrom":{"type":"reference","name":"ResponseError.params"}},{"name":"state","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"Required only if state is used in the initial request"}]},"type":{"type":"intrinsic","name":"string"}},{"name":"uri","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"A URI identifying a human-readable web page with\ninformation about the error, used to provide the client\ndeveloper with additional information about the error."}]},"type":{"type":"intrinsic","name":"string"},"inheritedFrom":{"type":"reference","name":"ResponseError.uri"}}],"extendedTypes":[{"type":"reference","name":"ResponseError"}]},{"name":"AuthRequest","kind":128,"comment":{"summary":[{"kind":"text","text":"Used to manage an authorization request according to the OAuth spec: [Section 4.1.1](https://tools.ietf.org/html/rfc6749#section-4.1.1).\nYou can use this class directly for more info around the authorization.\n\n**Common use-cases:**\n\n- Parse a URL returned from the authorization server with "},{"kind":"code","text":"`parseReturnUrlAsync()`"},{"kind":"text","text":".\n- Get the built authorization URL with "},{"kind":"code","text":"`makeAuthUrlAsync()`"},{"kind":"text","text":".\n- Get a loaded JSON representation of the auth request with crypto state loaded with "},{"kind":"code","text":"`getAuthRequestConfigAsync()`"},{"kind":"text","text":"."}],"blockTags":[{"tag":"@example","content":[{"kind":"code","text":"```ts\n// Create a request.\nconst request = new AuthRequest({ ... });\n\n// Prompt for an auth code\nconst result = await request.promptAsync(discovery);\n\n// Get the URL to invoke\nconst url = await request.makeAuthUrlAsync(discovery);\n\n// Get the URL to invoke\nconst parsed = await request.parseReturnUrlAsync(\"\");\n```"}]}]},"children":[{"name":"constructor","kind":512,"signatures":[{"name":"new AuthRequest","kind":16384,"parameters":[{"name":"request","kind":32768,"type":{"type":"reference","name":"AuthRequestConfig"}}],"type":{"type":"reference","name":"AuthRequest"}}]},{"name":"clientId","kind":1024,"flags":{"isReadonly":true},"type":{"type":"intrinsic","name":"string"},"implementationOf":{"type":"reference","name":"Omit.clientId"}},{"name":"clientSecret","kind":1024,"flags":{"isOptional":true,"isReadonly":true},"type":{"type":"intrinsic","name":"string"},"implementationOf":{"type":"reference","name":"Omit.clientSecret"}},{"name":"codeChallenge","kind":1024,"flags":{"isPublic":true,"isOptional":true},"type":{"type":"intrinsic","name":"string"},"implementationOf":{"type":"reference","name":"Omit.codeChallenge"}},{"name":"codeChallengeMethod","kind":1024,"flags":{"isReadonly":true},"type":{"type":"reference","name":"CodeChallengeMethod"},"implementationOf":{"type":"reference","name":"Omit.codeChallengeMethod"}},{"name":"codeVerifier","kind":1024,"flags":{"isPublic":true,"isOptional":true},"type":{"type":"intrinsic","name":"string"}},{"name":"extraParams","kind":1024,"flags":{"isReadonly":true},"type":{"type":"reference","typeArguments":[{"type":"intrinsic","name":"string"},{"type":"intrinsic","name":"string"}],"name":"Record","qualifiedName":"Record","package":"typescript"},"implementationOf":{"type":"reference","name":"Omit.extraParams"}},{"name":"prompt","kind":1024,"flags":{"isOptional":true,"isReadonly":true},"type":{"type":"reference","name":"Prompt"},"implementationOf":{"type":"reference","name":"Omit.prompt"}},{"name":"redirectUri","kind":1024,"flags":{"isReadonly":true},"type":{"type":"intrinsic","name":"string"},"implementationOf":{"type":"reference","name":"Omit.redirectUri"}},{"name":"responseType","kind":1024,"flags":{"isReadonly":true},"type":{"type":"intrinsic","name":"string"},"implementationOf":{"type":"reference","name":"Omit.responseType"}},{"name":"scopes","kind":1024,"flags":{"isOptional":true,"isReadonly":true},"type":{"type":"array","elementType":{"type":"intrinsic","name":"string"}},"implementationOf":{"type":"reference","name":"Omit.scopes"}},{"name":"state","kind":1024,"flags":{"isPublic":true},"comment":{"summary":[{"kind":"text","text":"Used for protection against [Cross-Site Request Forgery](https://tools.ietf.org/html/rfc6749#section-10.12)."}]},"type":{"type":"intrinsic","name":"string"}},{"name":"url","kind":1024,"flags":{"isPublic":true},"type":{"type":"union","types":[{"type":"literal","value":null},{"type":"intrinsic","name":"string"}]},"defaultValue":"null"},{"name":"usePKCE","kind":1024,"flags":{"isOptional":true,"isReadonly":true},"type":{"type":"intrinsic","name":"boolean"},"implementationOf":{"type":"reference","name":"Omit.usePKCE"}},{"name":"getAuthRequestConfigAsync","kind":2048,"signatures":[{"name":"getAuthRequestConfigAsync","kind":4096,"comment":{"summary":[{"kind":"text","text":"Load and return a valid auth request based on the input config."}]},"type":{"type":"reference","typeArguments":[{"type":"reference","name":"AuthRequestConfig"}],"name":"Promise","qualifiedName":"Promise","package":"typescript"}}]},{"name":"makeAuthUrlAsync","kind":2048,"signatures":[{"name":"makeAuthUrlAsync","kind":4096,"comment":{"summary":[{"kind":"text","text":"Create the URL for authorization."}]},"parameters":[{"name":"discovery","kind":32768,"type":{"type":"reference","name":"AuthDiscoveryDocument"}}],"type":{"type":"reference","typeArguments":[{"type":"intrinsic","name":"string"}],"name":"Promise","qualifiedName":"Promise","package":"typescript"}}]},{"name":"parseReturnUrl","kind":2048,"signatures":[{"name":"parseReturnUrl","kind":4096,"parameters":[{"name":"url","kind":32768,"type":{"type":"intrinsic","name":"string"}}],"type":{"type":"reference","name":"AuthSessionResult"}}]},{"name":"promptAsync","kind":2048,"signatures":[{"name":"promptAsync","kind":4096,"comment":{"summary":[{"kind":"text","text":"Prompt a user to authorize for a code."}]},"parameters":[{"name":"discovery","kind":32768,"type":{"type":"reference","name":"AuthDiscoveryDocument"}},{"name":"promptOptions","kind":32768,"type":{"type":"reference","name":"AuthRequestPromptOptions"},"defaultValue":"{}"}],"type":{"type":"reference","typeArguments":[{"type":"reference","name":"AuthSessionResult"}],"name":"Promise","qualifiedName":"Promise","package":"typescript"}}]}],"implementedTypes":[{"type":"reference","typeArguments":[{"type":"reference","name":"AuthRequestConfig"},{"type":"literal","value":"state"}],"name":"Omit","qualifiedName":"Omit","package":"typescript"}]},{"name":"RefreshTokenRequest","kind":128,"comment":{"summary":[{"kind":"text","text":"Refresh request.\n\n[Section 6](https://tools.ietf.org/html/rfc6749#section-6)"}]},"children":[{"name":"constructor","kind":512,"signatures":[{"name":"new RefreshTokenRequest","kind":16384,"parameters":[{"name":"options","kind":32768,"type":{"type":"reference","name":"RefreshTokenRequestConfig"}}],"type":{"type":"reference","name":"RefreshTokenRequest"},"overwrites":{"type":"reference","name":"TokenRequest.constructor"}}],"overwrites":{"type":"reference","name":"TokenRequest.constructor"}},{"name":"clientId","kind":1024,"flags":{"isReadonly":true},"comment":{"summary":[{"kind":"text","text":"A unique string representing the registration information provided by the client.\nThe client identifier is not a secret; it is exposed to the resource owner and shouldn't be used\nalone for client authentication.\n\nThe client identifier is unique to the authorization server.\n\n[Section 2.2](https://tools.ietf.org/html/rfc6749#section-2.2)"}]},"type":{"type":"intrinsic","name":"string"},"inheritedFrom":{"type":"reference","name":"TokenRequest.clientId"},"implementationOf":{"type":"reference","name":"RefreshTokenRequestConfig.clientId"}},{"name":"clientSecret","kind":1024,"flags":{"isOptional":true,"isReadonly":true},"comment":{"summary":[{"kind":"text","text":"Client secret supplied by an auth provider.\nThere is no secure way to store this on the client.\n\n[Section 2.3.1](https://tools.ietf.org/html/rfc6749#section-2.3.1)"}]},"type":{"type":"intrinsic","name":"string"},"inheritedFrom":{"type":"reference","name":"TokenRequest.clientSecret"},"implementationOf":{"type":"reference","name":"RefreshTokenRequestConfig.clientSecret"}},{"name":"extraParams","kind":1024,"flags":{"isOptional":true,"isReadonly":true},"comment":{"summary":[{"kind":"text","text":"Extra query params that'll be added to the query string."}]},"type":{"type":"reference","typeArguments":[{"type":"intrinsic","name":"string"},{"type":"intrinsic","name":"string"}],"name":"Record","qualifiedName":"Record","package":"typescript"},"inheritedFrom":{"type":"reference","name":"TokenRequest.extraParams"},"implementationOf":{"type":"reference","name":"RefreshTokenRequestConfig.extraParams"}},{"name":"grantType","kind":1024,"flags":{"isPublic":true},"type":{"type":"reference","name":"GrantType"},"inheritedFrom":{"type":"reference","name":"TokenRequest.grantType"}},{"name":"refreshToken","kind":1024,"flags":{"isOptional":true,"isReadonly":true},"comment":{"summary":[{"kind":"text","text":"The refresh token issued to the client."}]},"type":{"type":"intrinsic","name":"string"},"implementationOf":{"type":"reference","name":"RefreshTokenRequestConfig.refreshToken"}},{"name":"scopes","kind":1024,"flags":{"isOptional":true,"isReadonly":true},"comment":{"summary":[{"kind":"text","text":"List of strings to request access to.\n\n[Section 3.3](https://tools.ietf.org/html/rfc6749#section-3.3)"}]},"type":{"type":"array","elementType":{"type":"intrinsic","name":"string"}},"inheritedFrom":{"type":"reference","name":"TokenRequest.scopes"},"implementationOf":{"type":"reference","name":"RefreshTokenRequestConfig.scopes"}},{"name":"getHeaders","kind":2048,"signatures":[{"name":"getHeaders","kind":4096,"type":{"type":"reference","name":"Headers"},"inheritedFrom":{"type":"reference","name":"TokenRequest.getHeaders"}}],"inheritedFrom":{"type":"reference","name":"TokenRequest.getHeaders"}},{"name":"getQueryBody","kind":2048,"signatures":[{"name":"getQueryBody","kind":4096,"type":{"type":"reference","typeArguments":[{"type":"intrinsic","name":"string"},{"type":"intrinsic","name":"string"}],"name":"Record","qualifiedName":"Record","package":"typescript"},"overwrites":{"type":"reference","name":"TokenRequest.getQueryBody"}}],"overwrites":{"type":"reference","name":"TokenRequest.getQueryBody"}},{"name":"getRequestConfig","kind":2048,"signatures":[{"name":"getRequestConfig","kind":4096,"type":{"type":"reflection","declaration":{"name":"__type","kind":65536,"children":[{"name":"clientId","kind":1024,"type":{"type":"intrinsic","name":"string"},"defaultValue":"..."},{"name":"clientSecret","kind":1024,"type":{"type":"union","types":[{"type":"intrinsic","name":"undefined"},{"type":"intrinsic","name":"string"}]},"defaultValue":"..."},{"name":"extraParams","kind":1024,"type":{"type":"union","types":[{"type":"intrinsic","name":"undefined"},{"type":"reference","typeArguments":[{"type":"intrinsic","name":"string"},{"type":"intrinsic","name":"string"}],"name":"Record","qualifiedName":"Record","package":"typescript"}]},"defaultValue":"..."},{"name":"grantType","kind":1024,"type":{"type":"reference","name":"GrantType"},"defaultValue":"..."},{"name":"refreshToken","kind":1024,"type":{"type":"union","types":[{"type":"intrinsic","name":"undefined"},{"type":"intrinsic","name":"string"}]},"defaultValue":"..."},{"name":"scopes","kind":1024,"type":{"type":"union","types":[{"type":"intrinsic","name":"undefined"},{"type":"array","elementType":{"type":"intrinsic","name":"string"}}]},"defaultValue":"..."}]}},"overwrites":{"type":"reference","name":"TokenRequest.getRequestConfig"}}],"overwrites":{"type":"reference","name":"TokenRequest.getRequestConfig"}},{"name":"performAsync","kind":2048,"signatures":[{"name":"performAsync","kind":4096,"parameters":[{"name":"discovery","kind":32768,"type":{"type":"reference","typeArguments":[{"type":"reference","name":"DiscoveryDocument"},{"type":"literal","value":"tokenEndpoint"}],"name":"Pick","qualifiedName":"Pick","package":"typescript"}}],"type":{"type":"reference","typeArguments":[{"type":"reference","name":"TokenResponse"}],"name":"Promise","qualifiedName":"Promise","package":"typescript"},"inheritedFrom":{"type":"reference","name":"TokenRequest.performAsync"}}],"inheritedFrom":{"type":"reference","name":"TokenRequest.performAsync"}}],"extendedTypes":[{"type":"reference","typeArguments":[{"type":"reference","name":"RefreshTokenRequestConfig"}],"name":"TokenRequest"}],"implementedTypes":[{"type":"reference","name":"RefreshTokenRequestConfig"}]},{"name":"RevokeTokenRequest","kind":128,"comment":{"summary":[{"kind":"text","text":"Revocation request for a given token.\n\n[Section 2.1](https://tools.ietf.org/html/rfc7009#section-2.1)"}]},"children":[{"name":"constructor","kind":512,"signatures":[{"name":"new RevokeTokenRequest","kind":16384,"parameters":[{"name":"request","kind":32768,"type":{"type":"reference","name":"RevokeTokenRequestConfig"}}],"type":{"type":"reference","name":"RevokeTokenRequest"},"overwrites":{"type":"reference","name":"Request.constructor"}}],"overwrites":{"type":"reference","name":"Request.constructor"}},{"name":"clientId","kind":1024,"flags":{"isOptional":true,"isReadonly":true},"comment":{"summary":[{"kind":"text","text":"A unique string representing the registration information provided by the client.\nThe client identifier is not a secret; it is exposed to the resource owner and shouldn't be used\nalone for client authentication.\n\nThe client identifier is unique to the authorization server.\n\n[Section 2.2](https://tools.ietf.org/html/rfc6749#section-2.2)"}]},"type":{"type":"intrinsic","name":"string"},"implementationOf":{"type":"reference","name":"RevokeTokenRequestConfig.clientId"}},{"name":"clientSecret","kind":1024,"flags":{"isOptional":true,"isReadonly":true},"comment":{"summary":[{"kind":"text","text":"Client secret supplied by an auth provider.\nThere is no secure way to store this on the client.\n\n[Section 2.3.1](https://tools.ietf.org/html/rfc6749#section-2.3.1)"}]},"type":{"type":"intrinsic","name":"string"},"implementationOf":{"type":"reference","name":"RevokeTokenRequestConfig.clientSecret"}},{"name":"token","kind":1024,"flags":{"isReadonly":true},"comment":{"summary":[{"kind":"text","text":"The token that the client wants to get revoked.\n\n[Section 3.1](https://tools.ietf.org/html/rfc6749#section-3.1)"}]},"type":{"type":"intrinsic","name":"string"},"implementationOf":{"type":"reference","name":"RevokeTokenRequestConfig.token"}},{"name":"tokenTypeHint","kind":1024,"flags":{"isOptional":true,"isReadonly":true},"comment":{"summary":[{"kind":"text","text":"A hint about the type of the token submitted for revocation.\n\n[Section 3.2](https://tools.ietf.org/html/rfc6749#section-3.2)"}]},"type":{"type":"reference","name":"TokenTypeHint"},"implementationOf":{"type":"reference","name":"RevokeTokenRequestConfig.tokenTypeHint"}},{"name":"getHeaders","kind":2048,"signatures":[{"name":"getHeaders","kind":4096,"type":{"type":"reference","name":"Headers"}}]},{"name":"getQueryBody","kind":2048,"signatures":[{"name":"getQueryBody","kind":4096,"type":{"type":"reference","typeArguments":[{"type":"intrinsic","name":"string"},{"type":"intrinsic","name":"string"}],"name":"Record","qualifiedName":"Record","package":"typescript"},"overwrites":{"type":"reference","name":"Request.getQueryBody"}}],"overwrites":{"type":"reference","name":"Request.getQueryBody"}},{"name":"getRequestConfig","kind":2048,"signatures":[{"name":"getRequestConfig","kind":4096,"type":{"type":"reflection","declaration":{"name":"__type","kind":65536,"children":[{"name":"clientId","kind":1024,"type":{"type":"union","types":[{"type":"intrinsic","name":"undefined"},{"type":"intrinsic","name":"string"}]},"defaultValue":"..."},{"name":"clientSecret","kind":1024,"type":{"type":"union","types":[{"type":"intrinsic","name":"undefined"},{"type":"intrinsic","name":"string"}]},"defaultValue":"..."},{"name":"token","kind":1024,"type":{"type":"intrinsic","name":"string"},"defaultValue":"..."},{"name":"tokenTypeHint","kind":1024,"type":{"type":"union","types":[{"type":"intrinsic","name":"undefined"},{"type":"reference","name":"TokenTypeHint"}]},"defaultValue":"..."}]}},"overwrites":{"type":"reference","name":"Request.getRequestConfig"}}],"overwrites":{"type":"reference","name":"Request.getRequestConfig"}},{"name":"performAsync","kind":2048,"signatures":[{"name":"performAsync","kind":4096,"comment":{"summary":[{"kind":"text","text":"Perform a token revocation request."}]},"parameters":[{"name":"discovery","kind":32768,"comment":{"summary":[{"kind":"text","text":"The "},{"kind":"code","text":"`revocationEndpoint`"},{"kind":"text","text":" for a provider."}]},"type":{"type":"reference","typeArguments":[{"type":"reference","name":"DiscoveryDocument"},{"type":"literal","value":"revocationEndpoint"}],"name":"Pick","qualifiedName":"Pick","package":"typescript"}}],"type":{"type":"reference","typeArguments":[{"type":"intrinsic","name":"boolean"}],"name":"Promise","qualifiedName":"Promise","package":"typescript"},"overwrites":{"type":"reference","name":"Request.performAsync"}}],"overwrites":{"type":"reference","name":"Request.performAsync"}}],"extendedTypes":[{"type":"reference","typeArguments":[{"type":"reference","name":"RevokeTokenRequestConfig"},{"type":"intrinsic","name":"boolean"}],"name":"Request"}],"implementedTypes":[{"type":"reference","name":"RevokeTokenRequestConfig"}]},{"name":"TokenError","kind":128,"comment":{"summary":[{"kind":"text","text":"[Section 4.1.2.1](https://tools.ietf.org/html/rfc6749#section-4.1.2.1)"}]},"children":[{"name":"constructor","kind":512,"signatures":[{"name":"new TokenError","kind":16384,"parameters":[{"name":"response","kind":32768,"type":{"type":"reference","name":"ResponseErrorConfig"}}],"type":{"type":"reference","name":"TokenError"},"overwrites":{"type":"reference","name":"ResponseError.constructor"}}],"overwrites":{"type":"reference","name":"ResponseError.constructor"}},{"name":"code","kind":1024,"type":{"type":"intrinsic","name":"string"},"inheritedFrom":{"type":"reference","name":"ResponseError.code"}},{"name":"description","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"Used to assist the client developer in\nunderstanding the error that occurred."}]},"type":{"type":"intrinsic","name":"string"},"inheritedFrom":{"type":"reference","name":"ResponseError.description"}},{"name":"info","kind":1024,"flags":{"isOptional":true},"type":{"type":"intrinsic","name":"any"},"inheritedFrom":{"type":"reference","name":"ResponseError.info"}},{"name":"params","kind":1024,"comment":{"summary":[{"kind":"text","text":"Raw results of the error."}]},"type":{"type":"reference","typeArguments":[{"type":"intrinsic","name":"string"},{"type":"intrinsic","name":"string"}],"name":"Record","qualifiedName":"Record","package":"typescript"},"inheritedFrom":{"type":"reference","name":"ResponseError.params"}},{"name":"uri","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"A URI identifying a human-readable web page with\ninformation about the error, used to provide the client\ndeveloper with additional information about the error."}]},"type":{"type":"intrinsic","name":"string"},"inheritedFrom":{"type":"reference","name":"ResponseError.uri"}}],"extendedTypes":[{"type":"reference","name":"ResponseError"}]},{"name":"TokenResponse","kind":128,"comment":{"summary":[{"kind":"text","text":"Token Response.\n\n[Section 5.1](https://tools.ietf.org/html/rfc6749#section-5.1)"}]},"children":[{"name":"constructor","kind":512,"signatures":[{"name":"new TokenResponse","kind":16384,"parameters":[{"name":"response","kind":32768,"type":{"type":"reference","name":"TokenResponseConfig"}}],"type":{"type":"reference","name":"TokenResponse"}}]},{"name":"accessToken","kind":1024,"comment":{"summary":[{"kind":"text","text":"The access token issued by the authorization server.\n\n[Section 4.2.2](https://tools.ietf.org/html/rfc6749#section-4.2.2)"}]},"type":{"type":"intrinsic","name":"string"},"implementationOf":{"type":"reference","name":"TokenResponseConfig.accessToken"}},{"name":"expiresIn","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"The lifetime in seconds of the access token.\n\nFor example, the value "},{"kind":"code","text":"`3600`"},{"kind":"text","text":" denotes that the access token will\nexpire in one hour from the time the response was generated.\n\nIf omitted, the authorization server should provide the\nexpiration time via other means or document the default value.\n\n[Section 4.2.2](https://tools.ietf.org/html/rfc6749#section-4.2.2)"}]},"type":{"type":"intrinsic","name":"number"},"implementationOf":{"type":"reference","name":"TokenResponseConfig.expiresIn"}},{"name":"idToken","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"ID Token value associated with the authenticated session.\n\n[TokenResponse](https://openid.net/specs/openid-connect-core-1_0.html#TokenResponse)"}]},"type":{"type":"intrinsic","name":"string"},"implementationOf":{"type":"reference","name":"TokenResponseConfig.idToken"}},{"name":"issuedAt","kind":1024,"comment":{"summary":[{"kind":"text","text":"Time in seconds when the token was received by the client."}]},"type":{"type":"intrinsic","name":"number"},"implementationOf":{"type":"reference","name":"TokenResponseConfig.issuedAt"}},{"name":"refreshToken","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"The refresh token, which can be used to obtain new access tokens using the same authorization grant.\n\n[Section 5.1](https://tools.ietf.org/html/rfc6749#section-5.1)"}]},"type":{"type":"intrinsic","name":"string"},"implementationOf":{"type":"reference","name":"TokenResponseConfig.refreshToken"}},{"name":"scope","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"The scope of the access token. Only required if it's different to the scope that was requested by the client.\n\n[Section 3.3](https://tools.ietf.org/html/rfc6749#section-3.3)"}]},"type":{"type":"intrinsic","name":"string"},"implementationOf":{"type":"reference","name":"TokenResponseConfig.scope"}},{"name":"state","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"Required if the \"state\" parameter was present in the client\nauthorization request. The exact value received from the client.\n\n[Section 4.2.2](https://tools.ietf.org/html/rfc6749#section-4.2.2)"}]},"type":{"type":"intrinsic","name":"string"},"implementationOf":{"type":"reference","name":"TokenResponseConfig.state"}},{"name":"tokenType","kind":1024,"comment":{"summary":[{"kind":"text","text":"The type of the token issued. Value is case insensitive.\n\n[Section 7.1](https://tools.ietf.org/html/rfc6749#section-7.1)"}]},"type":{"type":"reference","name":"TokenType"},"implementationOf":{"type":"reference","name":"TokenResponseConfig.tokenType"}},{"name":"getRequestConfig","kind":2048,"signatures":[{"name":"getRequestConfig","kind":4096,"type":{"type":"reference","name":"TokenResponseConfig"}}]},{"name":"refreshAsync","kind":2048,"signatures":[{"name":"refreshAsync","kind":4096,"parameters":[{"name":"config","kind":32768,"type":{"type":"reference","typeArguments":[{"type":"reference","name":"TokenRequestConfig"},{"type":"union","types":[{"type":"literal","value":"grantType"},{"type":"literal","value":"refreshToken"}]}],"name":"Omit","qualifiedName":"Omit","package":"typescript"}},{"name":"discovery","kind":32768,"type":{"type":"reference","typeArguments":[{"type":"reference","name":"DiscoveryDocument"},{"type":"literal","value":"tokenEndpoint"}],"name":"Pick","qualifiedName":"Pick","package":"typescript"}}],"type":{"type":"reference","typeArguments":[{"type":"reference","name":"TokenResponse"}],"name":"Promise","qualifiedName":"Promise","package":"typescript"}}]},{"name":"shouldRefresh","kind":2048,"signatures":[{"name":"shouldRefresh","kind":4096,"type":{"type":"intrinsic","name":"boolean"}}]},{"name":"fromQueryParams","kind":2048,"flags":{"isStatic":true},"signatures":[{"name":"fromQueryParams","kind":4096,"comment":{"summary":[{"kind":"text","text":"Creates a "},{"kind":"code","text":"`TokenResponse`"},{"kind":"text","text":" from query parameters returned from an "},{"kind":"code","text":"`AuthRequest`"},{"kind":"text","text":"."}]},"parameters":[{"name":"params","kind":32768,"type":{"type":"reference","typeArguments":[{"type":"intrinsic","name":"string"},{"type":"intrinsic","name":"any"}],"name":"Record","qualifiedName":"Record","package":"typescript"}}],"type":{"type":"reference","name":"TokenResponse"}}]},{"name":"isTokenFresh","kind":2048,"flags":{"isStatic":true},"signatures":[{"name":"isTokenFresh","kind":4096,"comment":{"summary":[{"kind":"text","text":"Determines whether a token refresh request must be made to refresh the tokens"}]},"parameters":[{"name":"token","kind":32768,"type":{"type":"reference","typeArguments":[{"type":"reference","name":"TokenResponse"},{"type":"union","types":[{"type":"literal","value":"expiresIn"},{"type":"literal","value":"issuedAt"}]}],"name":"Pick","qualifiedName":"Pick","package":"typescript"}},{"name":"secondsMargin","kind":32768,"type":{"type":"intrinsic","name":"number"},"defaultValue":"..."}],"type":{"type":"intrinsic","name":"boolean"}}]}],"implementedTypes":[{"type":"reference","name":"TokenResponseConfig"}]},{"name":"AccessTokenRequestConfig","kind":256,"comment":{"summary":[{"kind":"text","text":"Config used to exchange an authorization code for an access token."}],"blockTags":[{"tag":"@see","content":[{"kind":"text","text":"[Section 4.1.3](https://tools.ietf.org/html/rfc6749#section-4.1.3)"}]}]},"children":[{"name":"clientId","kind":1024,"comment":{"summary":[{"kind":"text","text":"A unique string representing the registration information provided by the client.\nThe client identifier is not a secret; it is exposed to the resource owner and shouldn't be used\nalone for client authentication.\n\nThe client identifier is unique to the authorization server.\n\n[Section 2.2](https://tools.ietf.org/html/rfc6749#section-2.2)"}]},"type":{"type":"intrinsic","name":"string"},"inheritedFrom":{"type":"reference","name":"TokenRequestConfig.clientId"}},{"name":"clientSecret","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"Client secret supplied by an auth provider.\nThere is no secure way to store this on the client.\n\n[Section 2.3.1](https://tools.ietf.org/html/rfc6749#section-2.3.1)"}]},"type":{"type":"intrinsic","name":"string"},"inheritedFrom":{"type":"reference","name":"TokenRequestConfig.clientSecret"}},{"name":"code","kind":1024,"comment":{"summary":[{"kind":"text","text":"The authorization code received from the authorization server."}]},"type":{"type":"intrinsic","name":"string"}},{"name":"extraParams","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"Extra query params that'll be added to the query string."}]},"type":{"type":"reference","typeArguments":[{"type":"intrinsic","name":"string"},{"type":"intrinsic","name":"string"}],"name":"Record","qualifiedName":"Record","package":"typescript"},"inheritedFrom":{"type":"reference","name":"TokenRequestConfig.extraParams"}},{"name":"redirectUri","kind":1024,"comment":{"summary":[{"kind":"text","text":"If the "},{"kind":"code","text":"`redirectUri`"},{"kind":"text","text":" parameter was included in the "},{"kind":"code","text":"`AuthRequest`"},{"kind":"text","text":", then it must be supplied here as well.\n\n[Section 3.1.2](https://tools.ietf.org/html/rfc6749#section-3.1.2)"}]},"type":{"type":"intrinsic","name":"string"}},{"name":"scopes","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"List of strings to request access to.\n\n[Section 3.3](https://tools.ietf.org/html/rfc6749#section-3.3)"}]},"type":{"type":"array","elementType":{"type":"intrinsic","name":"string"}},"inheritedFrom":{"type":"reference","name":"TokenRequestConfig.scopes"}}],"extendedTypes":[{"type":"reference","name":"TokenRequestConfig"}],"implementedBy":[{"type":"reference","name":"AccessTokenRequest"}]},{"name":"AuthRequestConfig","kind":256,"comment":{"summary":[{"kind":"text","text":"Represents an OAuth authorization request as JSON."}]},"children":[{"name":"clientId","kind":1024,"comment":{"summary":[{"kind":"text","text":"A unique string representing the registration information provided by the client.\nThe client identifier is not a secret; it is exposed to the resource owner and shouldn't be used\nalone for client authentication.\n\nThe client identifier is unique to the authorization server.\n\n[Section 2.2](https://tools.ietf.org/html/rfc6749#section-2.2)"}]},"type":{"type":"intrinsic","name":"string"}},{"name":"clientSecret","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"Client secret supplied by an auth provider.\nThere is no secure way to store this on the client.\n\n[Section 2.3.1](https://tools.ietf.org/html/rfc6749#section-2.3.1)"}]},"type":{"type":"intrinsic","name":"string"}},{"name":"codeChallenge","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"Derived from the code verifier by using the "},{"kind":"code","text":"`CodeChallengeMethod`"},{"kind":"text","text":".\n\n[Section 4.2](https://tools.ietf.org/html/rfc7636#section-4.2)"}]},"type":{"type":"intrinsic","name":"string"}},{"name":"codeChallengeMethod","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"Method used to generate the code challenge. You should never use "},{"kind":"code","text":"`Plain`"},{"kind":"text","text":" as it's not good enough for secure verification."}],"blockTags":[{"tag":"@default","content":[{"kind":"text","text":"CodeChallengeMethod.S256"}]}]},"type":{"type":"reference","name":"CodeChallengeMethod"}},{"name":"extraParams","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"Extra query params that'll be added to the query string."}]},"type":{"type":"reference","typeArguments":[{"type":"intrinsic","name":"string"},{"type":"intrinsic","name":"string"}],"name":"Record","qualifiedName":"Record","package":"typescript"}},{"name":"prompt","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"Informs the server if the user should be prompted to login or consent again.\nThis can be used to present a dialog for switching accounts after the user has already been logged in.\n\n[Section 3.1.2.1](https://openid.net/specs/openid-connect-core-1_0.html#AuthorizationRequest)"}]},"type":{"type":"reference","name":"Prompt"}},{"name":"redirectUri","kind":1024,"comment":{"summary":[{"kind":"text","text":"After completing an interaction with a resource owner the\nserver will redirect to this URI. Learn more about [linking in Expo](/guides/linking/).\n\n[Section 3.1.2](https://tools.ietf.org/html/rfc6749#section-3.1.2)"}]},"type":{"type":"intrinsic","name":"string"}},{"name":"responseType","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"Specifies what is returned from the authorization server.\n\n[Section 3.1.1](https://tools.ietf.org/html/rfc6749#section-3.1.1)"}],"blockTags":[{"tag":"@default","content":[{"kind":"text","text":"ResponseType.Code"}]}]},"type":{"type":"intrinsic","name":"string"}},{"name":"scopes","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"List of strings to request access to.\n\n[Section 3.3](https://tools.ietf.org/html/rfc6749#section-3.3)"}]},"type":{"type":"array","elementType":{"type":"intrinsic","name":"string"}}},{"name":"state","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"Used for protection against [Cross-Site Request Forgery](https://tools.ietf.org/html/rfc6749#section-10.12)."}]},"type":{"type":"intrinsic","name":"string"}},{"name":"usePKCE","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"Should use [Proof Key for Code Exchange](https://oauth.net/2/pkce/)."}],"blockTags":[{"tag":"@default","content":[{"kind":"text","text":"true"}]}]},"type":{"type":"intrinsic","name":"boolean"}}]},{"name":"DiscoveryDocument","kind":256,"children":[{"name":"authorizationEndpoint","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"Used to interact with the resource owner and obtain an authorization grant.\n\n[Section 3.1](https://tools.ietf.org/html/rfc6749#section-3.1)"}]},"type":{"type":"intrinsic","name":"string"}},{"name":"discoveryDocument","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"All metadata about the provider."}]},"type":{"type":"reference","name":"ProviderMetadata"}},{"name":"endSessionEndpoint","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"URL at the OP to which an RP can perform a redirect to request that the End-User be logged out at the OP.\n\n[OPMetadata](https://openid.net/specs/openid-connect-session-1_0-17.html#OPMetadata)"}]},"type":{"type":"intrinsic","name":"string"}},{"name":"registrationEndpoint","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"URL of the OP's [Dynamic Client Registration](https://openid.net/specs/openid-connect-discovery-1_0.html#OpenID.Registration) Endpoint."}]},"type":{"type":"intrinsic","name":"string"}},{"name":"revocationEndpoint","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"Used to revoke a token (generally for signing out). The spec requires a revocation endpoint,\nbut some providers (like Spotify) do not support one.\n\n[Section 2.1](https://tools.ietf.org/html/rfc7009#section-2.1)"}]},"type":{"type":"intrinsic","name":"string"}},{"name":"tokenEndpoint","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"Used by the client to obtain an access token by presenting its authorization grant or refresh token.\nThe token endpoint is used with every authorization grant except for the\nimplicit grant type (since an access token is issued directly).\n\n[Section 3.2](https://tools.ietf.org/html/rfc6749#section-3.2)"}]},"type":{"type":"intrinsic","name":"string"}},{"name":"userInfoEndpoint","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"URL of the OP's UserInfo Endpoint used to return info about the authenticated user.\n\n[UserInfo](https://openid.net/specs/openid-connect-core-1_0.html#UserInfo)"}]},"type":{"type":"intrinsic","name":"string"}}]},{"name":"FacebookAuthRequestConfig","kind":256,"children":[{"name":"androidClientId","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"Android native client ID for use in development builds and bare workflow."}]},"type":{"type":"intrinsic","name":"string"}},{"name":"clientId","kind":1024,"comment":{"summary":[{"kind":"text","text":"A unique string representing the registration information provided by the client.\nThe client identifier is not a secret; it is exposed to the resource owner and shouldn't be used\nalone for client authentication.\n\nThe client identifier is unique to the authorization server.\n\n[Section 2.2](https://tools.ietf.org/html/rfc6749#section-2.2)"}]},"type":{"type":"intrinsic","name":"string"},"inheritedFrom":{"type":"reference","name":"ProviderAuthRequestConfig.clientId"}},{"name":"clientSecret","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"Client secret supplied by an auth provider.\nThere is no secure way to store this on the client.\n\n[Section 2.3.1](https://tools.ietf.org/html/rfc6749#section-2.3.1)"}]},"type":{"type":"intrinsic","name":"string"},"inheritedFrom":{"type":"reference","name":"ProviderAuthRequestConfig.clientSecret"}},{"name":"codeChallenge","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"Derived from the code verifier by using the "},{"kind":"code","text":"`CodeChallengeMethod`"},{"kind":"text","text":".\n\n[Section 4.2](https://tools.ietf.org/html/rfc7636#section-4.2)"}]},"type":{"type":"intrinsic","name":"string"},"inheritedFrom":{"type":"reference","name":"ProviderAuthRequestConfig.codeChallenge"}},{"name":"codeChallengeMethod","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"Method used to generate the code challenge. You should never use "},{"kind":"code","text":"`Plain`"},{"kind":"text","text":" as it's not good enough for secure verification."}],"blockTags":[{"tag":"@default","content":[{"kind":"text","text":"CodeChallengeMethod.S256"}]}]},"type":{"type":"reference","name":"CodeChallengeMethod"},"inheritedFrom":{"type":"reference","name":"ProviderAuthRequestConfig.codeChallengeMethod"}},{"name":"expoClientId","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"Proxy client ID for use when testing with Expo Go on Android and iOS."}]},"type":{"type":"intrinsic","name":"string"}},{"name":"extraParams","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"Extra query params that'll be added to the query string."}]},"type":{"type":"reference","typeArguments":[{"type":"intrinsic","name":"string"},{"type":"intrinsic","name":"string"}],"name":"Record","qualifiedName":"Record","package":"typescript"},"inheritedFrom":{"type":"reference","name":"ProviderAuthRequestConfig.extraParams"}},{"name":"iosClientId","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"iOS native client ID for use in development builds and bare workflow."}]},"type":{"type":"intrinsic","name":"string"}},{"name":"language","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"Language for the sign in UI, in the form of ISO 639-1 language code optionally followed by a dash\nand ISO 3166-1 alpha-2 region code, such as 'it' or 'pt-PT'.\nOnly set this value if it's different from the system default (which you can access via expo-localization)."}]},"type":{"type":"intrinsic","name":"string"},"inheritedFrom":{"type":"reference","name":"ProviderAuthRequestConfig.language"}},{"name":"prompt","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"Informs the server if the user should be prompted to login or consent again.\nThis can be used to present a dialog for switching accounts after the user has already been logged in.\n\n[Section 3.1.2.1](https://openid.net/specs/openid-connect-core-1_0.html#AuthorizationRequest)"}]},"type":{"type":"reference","name":"Prompt"},"inheritedFrom":{"type":"reference","name":"ProviderAuthRequestConfig.prompt"}},{"name":"redirectUri","kind":1024,"comment":{"summary":[{"kind":"text","text":"After completing an interaction with a resource owner the\nserver will redirect to this URI. Learn more about [linking in Expo](/guides/linking/).\n\n[Section 3.1.2](https://tools.ietf.org/html/rfc6749#section-3.1.2)"}]},"type":{"type":"intrinsic","name":"string"},"inheritedFrom":{"type":"reference","name":"ProviderAuthRequestConfig.redirectUri"}},{"name":"responseType","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"Specifies what is returned from the authorization server.\n\n[Section 3.1.1](https://tools.ietf.org/html/rfc6749#section-3.1.1)"}],"blockTags":[{"tag":"@default","content":[{"kind":"text","text":"ResponseType.Code"}]}]},"type":{"type":"intrinsic","name":"string"},"inheritedFrom":{"type":"reference","name":"ProviderAuthRequestConfig.responseType"}},{"name":"scopes","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"List of strings to request access to.\n\n[Section 3.3](https://tools.ietf.org/html/rfc6749#section-3.3)"}]},"type":{"type":"array","elementType":{"type":"intrinsic","name":"string"}},"inheritedFrom":{"type":"reference","name":"ProviderAuthRequestConfig.scopes"}},{"name":"state","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"Used for protection against [Cross-Site Request Forgery](https://tools.ietf.org/html/rfc6749#section-10.12)."}]},"type":{"type":"intrinsic","name":"string"},"inheritedFrom":{"type":"reference","name":"ProviderAuthRequestConfig.state"}},{"name":"usePKCE","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"Should use [Proof Key for Code Exchange](https://oauth.net/2/pkce/)."}],"blockTags":[{"tag":"@default","content":[{"kind":"text","text":"true"}]}]},"type":{"type":"intrinsic","name":"boolean"},"inheritedFrom":{"type":"reference","name":"ProviderAuthRequestConfig.usePKCE"}},{"name":"webClientId","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"Expo web client ID for use in the browser."}]},"type":{"type":"intrinsic","name":"string"}}],"extendedTypes":[{"type":"reference","name":"ProviderAuthRequestConfig"}]},{"name":"GoogleAuthRequestConfig","kind":256,"children":[{"name":"androidClientId","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"Android native client ID for use in standalone, and bare workflow."}]},"type":{"type":"intrinsic","name":"string"}},{"name":"clientId","kind":1024,"comment":{"summary":[{"kind":"text","text":"A unique string representing the registration information provided by the client.\nThe client identifier is not a secret; it is exposed to the resource owner and shouldn't be used\nalone for client authentication.\n\nThe client identifier is unique to the authorization server.\n\n[Section 2.2](https://tools.ietf.org/html/rfc6749#section-2.2)"}]},"type":{"type":"intrinsic","name":"string"},"inheritedFrom":{"type":"reference","name":"ProviderAuthRequestConfig.clientId"}},{"name":"clientSecret","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"Client secret supplied by an auth provider.\nThere is no secure way to store this on the client.\n\n[Section 2.3.1](https://tools.ietf.org/html/rfc6749#section-2.3.1)"}]},"type":{"type":"intrinsic","name":"string"},"inheritedFrom":{"type":"reference","name":"ProviderAuthRequestConfig.clientSecret"}},{"name":"codeChallenge","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"Derived from the code verifier by using the "},{"kind":"code","text":"`CodeChallengeMethod`"},{"kind":"text","text":".\n\n[Section 4.2](https://tools.ietf.org/html/rfc7636#section-4.2)"}]},"type":{"type":"intrinsic","name":"string"},"inheritedFrom":{"type":"reference","name":"ProviderAuthRequestConfig.codeChallenge"}},{"name":"codeChallengeMethod","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"Method used to generate the code challenge. You should never use "},{"kind":"code","text":"`Plain`"},{"kind":"text","text":" as it's not good enough for secure verification."}],"blockTags":[{"tag":"@default","content":[{"kind":"text","text":"CodeChallengeMethod.S256"}]}]},"type":{"type":"reference","name":"CodeChallengeMethod"},"inheritedFrom":{"type":"reference","name":"ProviderAuthRequestConfig.codeChallengeMethod"}},{"name":"expoClientId","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"Proxy client ID for use in the Expo client on Android and iOS."}]},"type":{"type":"intrinsic","name":"string"}},{"name":"extraParams","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"Extra query params that'll be added to the query string."}]},"type":{"type":"reference","typeArguments":[{"type":"intrinsic","name":"string"},{"type":"intrinsic","name":"string"}],"name":"Record","qualifiedName":"Record","package":"typescript"},"inheritedFrom":{"type":"reference","name":"ProviderAuthRequestConfig.extraParams"}},{"name":"iosClientId","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"iOS native client ID for use in standalone, bare workflow, and custom clients."}]},"type":{"type":"intrinsic","name":"string"}},{"name":"language","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"Language code ISO 3166-1 alpha-2 region code, such as 'it' or 'pt-PT'."}]},"type":{"type":"intrinsic","name":"string"},"overwrites":{"type":"reference","name":"ProviderAuthRequestConfig.language"}},{"name":"loginHint","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"If the user's email address is known ahead of time, it can be supplied to be the default option.\nIf the user has approved access for this app in the past then auth may return without any further interaction."}]},"type":{"type":"intrinsic","name":"string"}},{"name":"prompt","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"Informs the server if the user should be prompted to login or consent again.\nThis can be used to present a dialog for switching accounts after the user has already been logged in.\n\n[Section 3.1.2.1](https://openid.net/specs/openid-connect-core-1_0.html#AuthorizationRequest)"}]},"type":{"type":"reference","name":"Prompt"},"inheritedFrom":{"type":"reference","name":"ProviderAuthRequestConfig.prompt"}},{"name":"redirectUri","kind":1024,"comment":{"summary":[{"kind":"text","text":"After completing an interaction with a resource owner the\nserver will redirect to this URI. Learn more about [linking in Expo](/guides/linking/).\n\n[Section 3.1.2](https://tools.ietf.org/html/rfc6749#section-3.1.2)"}]},"type":{"type":"intrinsic","name":"string"},"inheritedFrom":{"type":"reference","name":"ProviderAuthRequestConfig.redirectUri"}},{"name":"responseType","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"Specifies what is returned from the authorization server.\n\n[Section 3.1.1](https://tools.ietf.org/html/rfc6749#section-3.1.1)"}],"blockTags":[{"tag":"@default","content":[{"kind":"text","text":"ResponseType.Code"}]}]},"type":{"type":"intrinsic","name":"string"},"inheritedFrom":{"type":"reference","name":"ProviderAuthRequestConfig.responseType"}},{"name":"scopes","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"List of strings to request access to.\n\n[Section 3.3](https://tools.ietf.org/html/rfc6749#section-3.3)"}]},"type":{"type":"array","elementType":{"type":"intrinsic","name":"string"}},"inheritedFrom":{"type":"reference","name":"ProviderAuthRequestConfig.scopes"}},{"name":"selectAccount","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"When "},{"kind":"code","text":"`true`"},{"kind":"text","text":", the service will allow the user to switch between accounts (if possible)."}],"blockTags":[{"tag":"@default","content":[{"kind":"text","text":"false."}]}]},"type":{"type":"intrinsic","name":"boolean"}},{"name":"shouldAutoExchangeCode","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"Should the hook automatically exchange the response code for an authentication token.\n\nDefaults to "},{"kind":"code","text":"`true`"},{"kind":"text","text":" on installed apps (Android, iOS) when "},{"kind":"code","text":"`ResponseType.Code`"},{"kind":"text","text":" is used (default)."}]},"type":{"type":"intrinsic","name":"boolean"}},{"name":"state","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"Used for protection against [Cross-Site Request Forgery](https://tools.ietf.org/html/rfc6749#section-10.12)."}]},"type":{"type":"intrinsic","name":"string"},"inheritedFrom":{"type":"reference","name":"ProviderAuthRequestConfig.state"}},{"name":"usePKCE","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"Should use [Proof Key for Code Exchange](https://oauth.net/2/pkce/)."}],"blockTags":[{"tag":"@default","content":[{"kind":"text","text":"true"}]}]},"type":{"type":"intrinsic","name":"boolean"},"inheritedFrom":{"type":"reference","name":"ProviderAuthRequestConfig.usePKCE"}},{"name":"webClientId","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"Expo web client ID for use in the browser."}]},"type":{"type":"intrinsic","name":"string"}}],"extendedTypes":[{"type":"reference","name":"ProviderAuthRequestConfig"}]},{"name":"RefreshTokenRequestConfig","kind":256,"comment":{"summary":[{"kind":"text","text":"Config used to request a token refresh, or code exchange."}],"blockTags":[{"tag":"@see","content":[{"kind":"text","text":"[Section 6](https://tools.ietf.org/html/rfc6749#section-6)"}]}]},"children":[{"name":"clientId","kind":1024,"comment":{"summary":[{"kind":"text","text":"A unique string representing the registration information provided by the client.\nThe client identifier is not a secret; it is exposed to the resource owner and shouldn't be used\nalone for client authentication.\n\nThe client identifier is unique to the authorization server.\n\n[Section 2.2](https://tools.ietf.org/html/rfc6749#section-2.2)"}]},"type":{"type":"intrinsic","name":"string"},"inheritedFrom":{"type":"reference","name":"TokenRequestConfig.clientId"}},{"name":"clientSecret","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"Client secret supplied by an auth provider.\nThere is no secure way to store this on the client.\n\n[Section 2.3.1](https://tools.ietf.org/html/rfc6749#section-2.3.1)"}]},"type":{"type":"intrinsic","name":"string"},"inheritedFrom":{"type":"reference","name":"TokenRequestConfig.clientSecret"}},{"name":"extraParams","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"Extra query params that'll be added to the query string."}]},"type":{"type":"reference","typeArguments":[{"type":"intrinsic","name":"string"},{"type":"intrinsic","name":"string"}],"name":"Record","qualifiedName":"Record","package":"typescript"},"inheritedFrom":{"type":"reference","name":"TokenRequestConfig.extraParams"}},{"name":"refreshToken","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"The refresh token issued to the client."}]},"type":{"type":"intrinsic","name":"string"}},{"name":"scopes","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"List of strings to request access to.\n\n[Section 3.3](https://tools.ietf.org/html/rfc6749#section-3.3)"}]},"type":{"type":"array","elementType":{"type":"intrinsic","name":"string"}},"inheritedFrom":{"type":"reference","name":"TokenRequestConfig.scopes"}}],"extendedTypes":[{"type":"reference","name":"TokenRequestConfig"}],"implementedBy":[{"type":"reference","name":"RefreshTokenRequest"}]},{"name":"RevokeTokenRequestConfig","kind":256,"comment":{"summary":[{"kind":"text","text":"Config used to revoke a token."}],"blockTags":[{"tag":"@see","content":[{"kind":"text","text":"[Section 2.1](https://tools.ietf.org/html/rfc7009#section-2.1)"}]}]},"children":[{"name":"clientId","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"A unique string representing the registration information provided by the client.\nThe client identifier is not a secret; it is exposed to the resource owner and shouldn't be used\nalone for client authentication.\n\nThe client identifier is unique to the authorization server.\n\n[Section 2.2](https://tools.ietf.org/html/rfc6749#section-2.2)"}]},"type":{"type":"intrinsic","name":"string"},"inheritedFrom":{"type":"reference","name":"Partial.clientId"}},{"name":"clientSecret","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"Client secret supplied by an auth provider.\nThere is no secure way to store this on the client.\n\n[Section 2.3.1](https://tools.ietf.org/html/rfc6749#section-2.3.1)"}]},"type":{"type":"intrinsic","name":"string"},"inheritedFrom":{"type":"reference","name":"Partial.clientSecret"}},{"name":"extraParams","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"Extra query params that'll be added to the query string."}]},"type":{"type":"reference","typeArguments":[{"type":"intrinsic","name":"string"},{"type":"intrinsic","name":"string"}],"name":"Record","qualifiedName":"Record","package":"typescript"},"inheritedFrom":{"type":"reference","name":"Partial.extraParams"}},{"name":"scopes","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"List of strings to request access to.\n\n[Section 3.3](https://tools.ietf.org/html/rfc6749#section-3.3)"}]},"type":{"type":"array","elementType":{"type":"intrinsic","name":"string"}},"inheritedFrom":{"type":"reference","name":"Partial.scopes"}},{"name":"token","kind":1024,"comment":{"summary":[{"kind":"text","text":"The token that the client wants to get revoked.\n\n[Section 3.1](https://tools.ietf.org/html/rfc6749#section-3.1)"}]},"type":{"type":"intrinsic","name":"string"}},{"name":"tokenTypeHint","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"A hint about the type of the token submitted for revocation.\n\n[Section 3.2](https://tools.ietf.org/html/rfc6749#section-3.2)"}]},"type":{"type":"reference","name":"TokenTypeHint"}}],"extendedTypes":[{"type":"reference","typeArguments":[{"type":"reference","name":"TokenRequestConfig"}],"name":"Partial","qualifiedName":"Partial","package":"typescript"}],"implementedBy":[{"type":"reference","name":"RevokeTokenRequest"}]},{"name":"ServerTokenResponseConfig","kind":256,"comment":{"summary":[{"kind":"text","text":"Object returned from the server after a token response."}]},"children":[{"name":"access_token","kind":1024,"type":{"type":"intrinsic","name":"string"}},{"name":"expires_in","kind":1024,"flags":{"isOptional":true},"type":{"type":"intrinsic","name":"number"}},{"name":"id_token","kind":1024,"flags":{"isOptional":true},"type":{"type":"intrinsic","name":"string"}},{"name":"issued_at","kind":1024,"flags":{"isOptional":true},"type":{"type":"intrinsic","name":"number"}},{"name":"refresh_token","kind":1024,"flags":{"isOptional":true},"type":{"type":"intrinsic","name":"string"}},{"name":"scope","kind":1024,"flags":{"isOptional":true},"type":{"type":"intrinsic","name":"string"}},{"name":"token_type","kind":1024,"flags":{"isOptional":true},"type":{"type":"reference","name":"TokenType"}}]},{"name":"TokenRequestConfig","kind":256,"comment":{"summary":[{"kind":"text","text":"Config used to request a token refresh, revocation, or code exchange."}]},"children":[{"name":"clientId","kind":1024,"comment":{"summary":[{"kind":"text","text":"A unique string representing the registration information provided by the client.\nThe client identifier is not a secret; it is exposed to the resource owner and shouldn't be used\nalone for client authentication.\n\nThe client identifier is unique to the authorization server.\n\n[Section 2.2](https://tools.ietf.org/html/rfc6749#section-2.2)"}]},"type":{"type":"intrinsic","name":"string"}},{"name":"clientSecret","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"Client secret supplied by an auth provider.\nThere is no secure way to store this on the client.\n\n[Section 2.3.1](https://tools.ietf.org/html/rfc6749#section-2.3.1)"}]},"type":{"type":"intrinsic","name":"string"}},{"name":"extraParams","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"Extra query params that'll be added to the query string."}]},"type":{"type":"reference","typeArguments":[{"type":"intrinsic","name":"string"},{"type":"intrinsic","name":"string"}],"name":"Record","qualifiedName":"Record","package":"typescript"}},{"name":"scopes","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"List of strings to request access to.\n\n[Section 3.3](https://tools.ietf.org/html/rfc6749#section-3.3)"}]},"type":{"type":"array","elementType":{"type":"intrinsic","name":"string"}}}],"extendedBy":[{"type":"reference","name":"AccessTokenRequestConfig"},{"type":"reference","name":"RefreshTokenRequestConfig"}]},{"name":"TokenResponseConfig","kind":256,"children":[{"name":"accessToken","kind":1024,"comment":{"summary":[{"kind":"text","text":"The access token issued by the authorization server.\n\n[Section 4.2.2](https://tools.ietf.org/html/rfc6749#section-4.2.2)"}]},"type":{"type":"intrinsic","name":"string"}},{"name":"expiresIn","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"The lifetime in seconds of the access token.\n\nFor example, the value "},{"kind":"code","text":"`3600`"},{"kind":"text","text":" denotes that the access token will\nexpire in one hour from the time the response was generated.\n\nIf omitted, the authorization server should provide the\nexpiration time via other means or document the default value.\n\n[Section 4.2.2](https://tools.ietf.org/html/rfc6749#section-4.2.2)"}]},"type":{"type":"intrinsic","name":"number"}},{"name":"idToken","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"ID Token value associated with the authenticated session.\n\n[TokenResponse](https://openid.net/specs/openid-connect-core-1_0.html#TokenResponse)"}]},"type":{"type":"intrinsic","name":"string"}},{"name":"issuedAt","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"Time in seconds when the token was received by the client."}]},"type":{"type":"intrinsic","name":"number"}},{"name":"refreshToken","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"The refresh token, which can be used to obtain new access tokens using the same authorization grant.\n\n[Section 5.1](https://tools.ietf.org/html/rfc6749#section-5.1)"}]},"type":{"type":"intrinsic","name":"string"}},{"name":"scope","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"The scope of the access token. Only required if it's different to the scope that was requested by the client.\n\n[Section 3.3](https://tools.ietf.org/html/rfc6749#section-3.3)"}]},"type":{"type":"intrinsic","name":"string"}},{"name":"state","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"Required if the \"state\" parameter was present in the client\nauthorization request. The exact value received from the client.\n\n[Section 4.2.2](https://tools.ietf.org/html/rfc6749#section-4.2.2)"}]},"type":{"type":"intrinsic","name":"string"}},{"name":"tokenType","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"The type of the token issued. Value is case insensitive.\n\n[Section 7.1](https://tools.ietf.org/html/rfc6749#section-7.1)"}]},"type":{"type":"reference","name":"TokenType"}}],"implementedBy":[{"type":"reference","name":"TokenResponse"}]},{"name":"AuthRequestPromptOptions","kind":4194304,"comment":{"summary":[{"kind":"text","text":"Options passed to the "},{"kind":"code","text":"`promptAsync()`"},{"kind":"text","text":" method of "},{"kind":"code","text":"`AuthRequest`"},{"kind":"text","text":"s.\nThis can be used to configure how the web browser should look and behave."}]},"type":{"type":"intersection","types":[{"type":"reference","typeArguments":[{"type":"reference","name":"WebBrowserOpenOptions"},{"type":"literal","value":"windowFeatures"}],"name":"Omit","qualifiedName":"Omit","package":"typescript"},{"type":"reflection","declaration":{"name":"__type","kind":65536,"children":[{"name":"url","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"URL to open when prompting the user. This usually should be defined internally and left "},{"kind":"code","text":"`undefined`"},{"kind":"text","text":" in most cases."}]},"type":{"type":"intrinsic","name":"string"}},{"name":"windowFeatures","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"Features to use with "},{"kind":"code","text":"`window.open()`"},{"kind":"text","text":"."}],"blockTags":[{"tag":"@platform","content":[{"kind":"text","text":"web"}]}]},"type":{"type":"reference","name":"WebBrowserWindowFeatures"}}]}}]}},{"name":"AuthSessionOptions","kind":4194304,"type":{"type":"reflection","declaration":{"name":"__type","kind":65536,"children":[{"name":"authUrl","kind":1024,"comment":{"summary":[{"kind":"text","text":"The URL that points to the sign in page that you would like to open the user to."}]},"type":{"type":"intrinsic","name":"string"}},{"name":"projectNameForProxy","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"Project name to use for the "},{"kind":"code","text":"`auth.expo.io`"},{"kind":"text","text":" proxy."}]},"type":{"type":"intrinsic","name":"string"}},{"name":"returnUrl","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"The URL to return to the application. In managed apps, it's optional and defaults to output of ["},{"kind":"code","text":"`Linking.createURL('expo-auth-session', params)`"},{"kind":"text","text":"](./linking/#linkingcreateurlpath-namedparameters)\ncall with "},{"kind":"code","text":"`scheme`"},{"kind":"text","text":" and "},{"kind":"code","text":"`queryParams`"},{"kind":"text","text":" params. However, in the bare app, it's required - "},{"kind":"code","text":"`AuthSession`"},{"kind":"text","text":" needs to know where to wait for the response.\nHence, this method will throw an exception, if you don't provide "},{"kind":"code","text":"`returnUrl`"},{"kind":"text","text":"."}]},"type":{"type":"intrinsic","name":"string"}},{"name":"showInRecents","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"A boolean determining whether browsed website should be shown as separate entry in Android recents/multitasking view."}],"blockTags":[{"tag":"@default","content":[{"kind":"text","text":"false"}]},{"tag":"@platform","content":[{"kind":"text","text":"android"}]}]},"type":{"type":"intrinsic","name":"boolean"}}]}}},{"name":"AuthSessionRedirectUriOptions","kind":4194304,"comment":{"summary":[{"kind":"text","text":"Options passed to "},{"kind":"code","text":"`makeRedirectUri`"},{"kind":"text","text":"."}]},"type":{"type":"reflection","declaration":{"name":"__type","kind":65536,"children":[{"name":"isTripleSlashed","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"Should the URI be triple slashed "},{"kind":"code","text":"`scheme:///path`"},{"kind":"text","text":" or double slashed "},{"kind":"code","text":"`scheme://path`"},{"kind":"text","text":".\nDefaults to "},{"kind":"code","text":"`false`"},{"kind":"text","text":"."}]},"type":{"type":"intrinsic","name":"boolean"}},{"name":"native","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"Manual scheme to use in Bare and Standalone native app contexts. Takes precedence over all other properties.\nYou must define the URI scheme that will be used in a custom built native application or standalone Expo application.\nThe value should conform to your native app's URI schemes.\nYou can see conformance with "},{"kind":"code","text":"`npx uri-scheme list`"},{"kind":"text","text":"."}]},"type":{"type":"intrinsic","name":"string"}},{"name":"path","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"Optional path to append to a URI. This will not be added to "},{"kind":"code","text":"`native`"},{"kind":"text","text":"."}]},"type":{"type":"intrinsic","name":"string"}},{"name":"preferLocalhost","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"Attempt to convert the Expo server IP address to localhost.\nThis is useful for testing when your IP changes often, this will only work for iOS simulator."}],"blockTags":[{"tag":"@default","content":[{"kind":"text","text":"false"}]}]},"type":{"type":"intrinsic","name":"boolean"}},{"name":"queryParams","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"Optional native scheme\nURI protocol "},{"kind":"code","text":"`://`"},{"kind":"text","text":" that must be built into your native app."}]},"type":{"type":"reference","typeArguments":[{"type":"intrinsic","name":"string"},{"type":"union","types":[{"type":"intrinsic","name":"string"},{"type":"intrinsic","name":"undefined"}]}],"name":"Record","qualifiedName":"Record","package":"typescript"}},{"name":"scheme","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"URI protocol "},{"kind":"code","text":"`://`"},{"kind":"text","text":" that must be built into your native app."}]},"type":{"type":"intrinsic","name":"string"}}]}}},{"name":"AuthSessionResult","kind":4194304,"comment":{"summary":[{"kind":"text","text":"Object returned after an auth request has completed.\n- If the user cancelled the authentication session by closing the browser, the result is "},{"kind":"code","text":"`{ type: 'cancel' }`"},{"kind":"text","text":".\n- If the authentication is dismissed manually with "},{"kind":"code","text":"`AuthSession.dismiss()`"},{"kind":"text","text":", the result is "},{"kind":"code","text":"`{ type: 'dismiss' }`"},{"kind":"text","text":".\n- If the authentication flow is successful, the result is "},{"kind":"code","text":"`{ type: 'success', params: Object, event: Object }`"},{"kind":"text","text":".\n- If the authentication flow is returns an error, the result is "},{"kind":"code","text":"`{ type: 'error', params: Object, error: string, event: Object }`"},{"kind":"text","text":".\n- If you call "},{"kind":"code","text":"`AuthSession.startAsync()`"},{"kind":"text","text":" more than once before the first call has returned, the result is "},{"kind":"code","text":"`{ type: 'locked' }`"},{"kind":"text","text":",\n because only one "},{"kind":"code","text":"`AuthSession`"},{"kind":"text","text":" can be in progress at any time."}]},"type":{"type":"union","types":[{"type":"reflection","declaration":{"name":"__type","kind":65536,"children":[{"name":"type","kind":1024,"comment":{"summary":[{"kind":"text","text":"How the auth completed."}]},"type":{"type":"union","types":[{"type":"literal","value":"cancel"},{"type":"literal","value":"dismiss"},{"type":"literal","value":"opened"},{"type":"literal","value":"locked"}]}}]}},{"type":"reflection","declaration":{"name":"__type","kind":65536,"children":[{"name":"authentication","kind":1024,"comment":{"summary":[{"kind":"text","text":"Returned when the auth finishes with an "},{"kind":"code","text":"`access_token`"},{"kind":"text","text":" property."}]},"type":{"type":"union","types":[{"type":"reference","name":"TokenResponse"},{"type":"literal","value":null}]}},{"name":"error","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"Possible error if the auth failed with type "},{"kind":"code","text":"`error`"},{"kind":"text","text":"."}]},"type":{"type":"union","types":[{"type":"reference","name":"AuthError"},{"type":"literal","value":null}]}},{"name":"errorCode","kind":1024,"comment":{"summary":[],"blockTags":[{"tag":"@deprecated","content":[{"kind":"text","text":"Legacy error code query param, use "},{"kind":"code","text":"`error`"},{"kind":"text","text":" instead."}]}]},"type":{"type":"union","types":[{"type":"intrinsic","name":"string"},{"type":"literal","value":null}]}},{"name":"params","kind":1024,"comment":{"summary":[{"kind":"text","text":"Query params from the "},{"kind":"code","text":"`url`"},{"kind":"text","text":" as an object."}]},"type":{"type":"reference","typeArguments":[{"type":"intrinsic","name":"string"},{"type":"intrinsic","name":"string"}],"name":"Record","qualifiedName":"Record","package":"typescript"}},{"name":"type","kind":1024,"comment":{"summary":[{"kind":"text","text":"How the auth completed."}]},"type":{"type":"union","types":[{"type":"literal","value":"error"},{"type":"literal","value":"success"}]}},{"name":"url","kind":1024,"comment":{"summary":[{"kind":"text","text":"Auth URL that was opened"}]},"type":{"type":"intrinsic","name":"string"}}]}}]}},{"name":"Issuer","kind":4194304,"comment":{"summary":[{"kind":"text","text":"URL using the "},{"kind":"code","text":"`https`"},{"kind":"text","text":" scheme with no query or fragment component that the OP asserts as its Issuer Identifier."}]},"type":{"type":"intrinsic","name":"string"}},{"name":"IssuerOrDiscovery","kind":4194304,"type":{"type":"union","types":[{"type":"reference","name":"Issuer"},{"type":"reference","name":"DiscoveryDocument"}]}},{"name":"ProviderMetadata","kind":4194304,"comment":{"summary":[{"kind":"text","text":"OpenID Providers have metadata describing their configuration.\n[ProviderMetadata](https://openid.net/specs/openid-connect-discovery-1_0.html#ProviderMetadata)"}]},"type":{"type":"intersection","types":[{"type":"reference","typeArguments":[{"type":"intrinsic","name":"string"},{"type":"union","types":[{"type":"intrinsic","name":"string"},{"type":"intrinsic","name":"boolean"},{"type":"array","elementType":{"type":"intrinsic","name":"string"}}]}],"name":"Record","qualifiedName":"Record","package":"typescript"},{"type":"reference","name":"ProviderMetadataEndpoints"},{"type":"reflection","declaration":{"name":"__type","kind":65536,"children":[{"name":"backchannel_logout_session_supported","kind":1024,"flags":{"isOptional":true},"type":{"type":"intrinsic","name":"boolean"}},{"name":"backchannel_logout_supported","kind":1024,"flags":{"isOptional":true},"type":{"type":"intrinsic","name":"boolean"}},{"name":"check_session_iframe","kind":1024,"flags":{"isOptional":true},"type":{"type":"intrinsic","name":"string"}},{"name":"claim_types_supported","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"a list of the Claim Types that the OpenID Provider supports."}]},"type":{"type":"array","elementType":{"type":"intrinsic","name":"string"}}},{"name":"claims_locales_supported","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"Languages and scripts supported for values in Claims being returned."}]},"type":{"type":"array","elementType":{"type":"intrinsic","name":"string"}}},{"name":"claims_parameter_supported","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"Boolean value specifying whether the OP supports use of the claims parameter, with "},{"kind":"code","text":"`true`"},{"kind":"text","text":" indicating support."}],"blockTags":[{"tag":"@default","content":[{"kind":"text","text":"false"}]}]},"type":{"type":"intrinsic","name":"boolean"}},{"name":"claims_supported","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"a list of the Claim Names of the Claims that the OpenID Provider may be able to supply values for.\nNote that for privacy or other reasons, this might not be an exhaustive list."}]},"type":{"type":"array","elementType":{"type":"intrinsic","name":"string"}}},{"name":"code_challenge_methods_supported","kind":1024,"flags":{"isOptional":true},"type":{"type":"array","elementType":{"type":"reference","name":"CodeChallengeMethod"}}},{"name":"display_values_supported","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"a list of the "},{"kind":"code","text":"`display`"},{"kind":"text","text":" parameter values that the OpenID Provider supports."}]},"type":{"type":"array","elementType":{"type":"intrinsic","name":"string"}}},{"name":"frontchannel_logout_session_supported","kind":1024,"flags":{"isOptional":true},"type":{"type":"intrinsic","name":"boolean"}},{"name":"frontchannel_logout_supported","kind":1024,"flags":{"isOptional":true},"type":{"type":"intrinsic","name":"boolean"}},{"name":"grant_types_supported","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"JSON array containing a list of the OAuth 2.0 Grant Type values that this OP supports.\nDynamic OpenID Providers MUST support the authorization_code and implicit Grant Type values and MAY support other Grant Types.\nIf omitted, the default value is [\"authorization_code\", \"implicit\"]."}]},"type":{"type":"array","elementType":{"type":"intrinsic","name":"string"}}},{"name":"id_token_signing_alg_values_supported","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"JSON array containing a list of the JWS signing algorithms (alg values) supported by the OP for the ID Token to encode the Claims in a JWT.\nThe algorithm RS256 MUST be included."}]},"type":{"type":"array","elementType":{"type":"intrinsic","name":"string"}}},{"name":"jwks_uri","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"URL of the OP's JSON Web Key Set [JWK](https://openid.net/specs/openid-connect-discovery-1_0.html#JWK) document."}]},"type":{"type":"intrinsic","name":"string"}},{"name":"op_policy_uri","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"URL that the OpenID Provider provides to the person registering the Client to read about the OP's requirements on how\nthe Relying Party can use the data provided by the OP. The registration process SHOULD display this URL to the person\nregistering the Client if it is given."}]},"type":{"type":"intrinsic","name":"string"}},{"name":"op_tos_uri","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"URL that the OpenID Provider provides to the person registering the Client to read about OpenID Provider's terms of service.\nThe registration process should display this URL to the person registering the Client if it is given."}]},"type":{"type":"intrinsic","name":"string"}},{"name":"request_parameter_supported","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"Boolean value specifying whether the OP supports use of the request parameter, with "},{"kind":"code","text":"`true`"},{"kind":"text","text":" indicating support."}],"blockTags":[{"tag":"@default","content":[{"kind":"text","text":"false"}]}]},"type":{"type":"intrinsic","name":"boolean"}},{"name":"request_uri_parameter_supported","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"Whether the OP supports use of the "},{"kind":"code","text":"`request_uri`"},{"kind":"text","text":" parameter, with "},{"kind":"code","text":"`true`"},{"kind":"text","text":" indicating support."}],"blockTags":[{"tag":"@default","content":[{"kind":"text","text":"true"}]}]},"type":{"type":"intrinsic","name":"boolean"}},{"name":"require_request_uri_registration","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"Whether the OP requires any "},{"kind":"code","text":"`request_uri`"},{"kind":"text","text":" values used to be pre-registered using the "},{"kind":"code","text":"`request_uris`"},{"kind":"text","text":" registration parameter.\nPre-registration is required when the value is "},{"kind":"code","text":"`true`"},{"kind":"text","text":"."}],"blockTags":[{"tag":"@default","content":[{"kind":"text","text":"false"}]}]},"type":{"type":"intrinsic","name":"boolean"}},{"name":"response_modes_supported","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"JSON array containing a list of the OAuth 2.0 "},{"kind":"code","text":"`response_mode`"},{"kind":"text","text":" values that this OP supports,\nas specified in [OAuth 2.0 Multiple Response Type Encoding Practices](https://openid.net/specs/openid-connect-discovery-1_0.html#OAuth.Responses).\nIf omitted, the default for Dynamic OpenID Providers is "},{"kind":"code","text":"`[\"query\", \"fragment\"]`"},{"kind":"text","text":"."}]},"type":{"type":"array","elementType":{"type":"intrinsic","name":"string"}}},{"name":"response_types_supported","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"JSON array containing a list of the OAuth 2.0 "},{"kind":"code","text":"`response_type`"},{"kind":"text","text":" values that this OP supports.\nDynamic OpenID Providers must support the "},{"kind":"code","text":"`code`"},{"kind":"text","text":", "},{"kind":"code","text":"`id_token`"},{"kind":"text","text":", and the "},{"kind":"code","text":"`token`"},{"kind":"text","text":" "},{"kind":"code","text":"`id_token`"},{"kind":"text","text":" Response Type values"}]},"type":{"type":"array","elementType":{"type":"intrinsic","name":"string"}}},{"name":"scopes_supported","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"JSON array containing a list of the OAuth 2.0 [RFC6749](https://openid.net/specs/openid-connect-discovery-1_0.html#RFC6749)\nscope values that this server supports."}]},"type":{"type":"array","elementType":{"type":"intrinsic","name":"string"}}},{"name":"service_documentation","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"URL of a page containing human-readable information that developers might want or need to know when using the OpenID Provider.\nIn particular, if the OpenID Provider does not support Dynamic Client Registration, then information on how to register Clients\nneeds to be provided in this documentation."}]},"type":{"type":"intrinsic","name":"string"}},{"name":"subject_types_supported","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"JSON array containing a list of the Subject Identifier types that this OP supports.\nValid types include "},{"kind":"code","text":"`pairwise`"},{"kind":"text","text":" and "},{"kind":"code","text":"`public`"},{"kind":"text","text":"."}]},"type":{"type":"array","elementType":{"type":"intrinsic","name":"string"}}},{"name":"token_endpoint_auth_methods_supported","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"A list of Client authentication methods supported by this Token Endpoint.\nIf omitted, the default is "},{"kind":"code","text":"`['client_secret_basic']`"}]},"type":{"type":"array","elementType":{"type":"union","types":[{"type":"literal","value":"client_secret_post"},{"type":"literal","value":"client_secret_basic"},{"type":"literal","value":"client_secret_jwt"},{"type":"literal","value":"private_key_jwt"},{"type":"intrinsic","name":"string"}]}}},{"name":"ui_locales_supported","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"Languages and scripts supported for the user interface,\nrepresented as a JSON array of [BCP47](https://openid.net/specs/openid-connect-discovery-1_0.html#RFC5646) language tag values."}]},"type":{"type":"array","elementType":{"type":"intrinsic","name":"string"}}}]}}]}},{"name":"TokenType","kind":4194304,"comment":{"summary":[{"kind":"text","text":"Access token type."}],"blockTags":[{"tag":"@see","content":[{"kind":"text","text":"[Section 7.1](https://tools.ietf.org/html/rfc6749#section-7.1)"}]}]},"type":{"type":"union","types":[{"type":"literal","value":"bearer"},{"type":"literal","value":"mac"}]}},{"name":"dismiss","kind":64,"signatures":[{"name":"dismiss","kind":4096,"comment":{"summary":[{"kind":"text","text":"Cancels an active "},{"kind":"code","text":"`AuthSession`"},{"kind":"text","text":" if there is one. No return value, but if there is an active "},{"kind":"code","text":"`AuthSession`"},{"kind":"text","text":"\nthen the Promise returned by the "},{"kind":"code","text":"`AuthSession.startAsync()`"},{"kind":"text","text":" that initiated it resolves to "},{"kind":"code","text":"`{ type: 'dismiss' }`"},{"kind":"text","text":"."}]},"type":{"type":"intrinsic","name":"void"}}]},{"name":"exchangeCodeAsync","kind":64,"signatures":[{"name":"exchangeCodeAsync","kind":4096,"comment":{"summary":[{"kind":"text","text":"Exchange an authorization code for an access token that can be used to get data from the provider."}],"blockTags":[{"tag":"@returns","content":[{"kind":"text","text":"Returns a discovery document with a valid "},{"kind":"code","text":"`tokenEndpoint`"},{"kind":"text","text":" URL."}]}]},"parameters":[{"name":"config","kind":32768,"comment":{"summary":[{"kind":"text","text":"Configuration used to exchange the code for a token."}]},"type":{"type":"reference","name":"AccessTokenRequestConfig"}},{"name":"discovery","kind":32768,"comment":{"summary":[{"kind":"text","text":"The "},{"kind":"code","text":"`tokenEndpoint`"},{"kind":"text","text":" for a provider."}]},"type":{"type":"reference","typeArguments":[{"type":"reference","name":"DiscoveryDocument"},{"type":"literal","value":"tokenEndpoint"}],"name":"Pick","qualifiedName":"Pick","package":"typescript"}}],"type":{"type":"reference","typeArguments":[{"type":"reference","name":"TokenResponse"}],"name":"Promise","qualifiedName":"Promise","package":"typescript"}}]},{"name":"fetchDiscoveryAsync","kind":64,"signatures":[{"name":"fetchDiscoveryAsync","kind":4096,"comment":{"summary":[{"kind":"text","text":"Fetch a "},{"kind":"code","text":"`DiscoveryDocument`"},{"kind":"text","text":" from a well-known resource provider that supports auto discovery."}],"blockTags":[{"tag":"@returns","content":[{"kind":"text","text":"Returns a discovery document that can be used for authentication."}]}]},"parameters":[{"name":"issuer","kind":32768,"comment":{"summary":[{"kind":"text","text":"An "},{"kind":"code","text":"`Issuer`"},{"kind":"text","text":" URL to fetch from."}]},"type":{"type":"intrinsic","name":"string"}}],"type":{"type":"reference","typeArguments":[{"type":"reference","name":"DiscoveryDocument"}],"name":"Promise","qualifiedName":"Promise","package":"typescript"}}]},{"name":"fetchUserInfoAsync","kind":64,"signatures":[{"name":"fetchUserInfoAsync","kind":4096,"comment":{"summary":[{"kind":"text","text":"Fetch generic user info from the provider's OpenID Connect "},{"kind":"code","text":"`userInfoEndpoint`"},{"kind":"text","text":" (if supported)."}],"blockTags":[{"tag":"@see","content":[{"kind":"text","text":"[UserInfo](https://openid.net/specs/openid-connect-core-1_0.html#UserInfo)."}]}]},"parameters":[{"name":"config","kind":32768,"comment":{"summary":[{"kind":"text","text":"The "},{"kind":"code","text":"`accessToken`"},{"kind":"text","text":" for a user, returned from a code exchange or auth request."}]},"type":{"type":"reference","typeArguments":[{"type":"reference","name":"TokenResponse"},{"type":"literal","value":"accessToken"}],"name":"Pick","qualifiedName":"Pick","package":"typescript"}},{"name":"discovery","kind":32768,"comment":{"summary":[{"kind":"text","text":"The "},{"kind":"code","text":"`userInfoEndpoint`"},{"kind":"text","text":" for a provider."}]},"type":{"type":"reference","typeArguments":[{"type":"reference","name":"DiscoveryDocument"},{"type":"literal","value":"userInfoEndpoint"}],"name":"Pick","qualifiedName":"Pick","package":"typescript"}}],"type":{"type":"reference","typeArguments":[{"type":"reference","typeArguments":[{"type":"intrinsic","name":"string"},{"type":"intrinsic","name":"any"}],"name":"Record","qualifiedName":"Record","package":"typescript"}],"name":"Promise","qualifiedName":"Promise","package":"typescript"}}]},{"name":"generateHexStringAsync","kind":64,"signatures":[{"name":"generateHexStringAsync","kind":4096,"comment":{"summary":[{"kind":"text","text":"Digest a random string with hex encoding, useful for creating "},{"kind":"code","text":"`nonce`"},{"kind":"text","text":"s."}]},"parameters":[{"name":"size","kind":32768,"type":{"type":"intrinsic","name":"number"}}],"type":{"type":"reference","typeArguments":[{"type":"intrinsic","name":"string"}],"name":"Promise","qualifiedName":"Promise","package":"typescript"}}]},{"name":"getDefaultReturnUrl","kind":64,"signatures":[{"name":"getDefaultReturnUrl","kind":4096,"parameters":[{"name":"urlPath","kind":32768,"flags":{"isOptional":true},"type":{"type":"intrinsic","name":"string"}},{"name":"options","kind":32768,"flags":{"isOptional":true},"type":{"type":"reference","typeArguments":[{"type":"reference","name":"CreateURLOptions"},{"type":"literal","value":"queryParams"}],"name":"Omit","qualifiedName":"Omit","package":"typescript"}}],"type":{"type":"intrinsic","name":"string"}}]},{"name":"getRedirectUrl","kind":64,"signatures":[{"name":"getRedirectUrl","kind":4096,"comment":{"summary":[{"kind":"text","text":"Get the URL that your authentication provider needs to redirect to. For example: "},{"kind":"code","text":"`https://auth.expo.io/@your-username/your-app-slug`"},{"kind":"text","text":". You can pass an additional path component to be appended to the default redirect URL.\n> **Note** This method will throw an exception if you're using the bare workflow on native."}],"blockTags":[{"tag":"@returns","content":[]},{"tag":"@example","content":[{"kind":"code","text":"```ts\nconst url = AuthSession.getRedirectUrl('redirect');\n\n// Managed: https://auth.expo.io/@your-username/your-app-slug/redirect\n// Web: https://localhost:19006/redirect\n```"}]},{"tag":"@deprecated","content":[{"kind":"text","text":"Use "},{"kind":"code","text":"`makeRedirectUri()`"},{"kind":"text","text":" instead."}]}]},"parameters":[{"name":"path","kind":32768,"flags":{"isOptional":true},"type":{"type":"intrinsic","name":"string"}}],"type":{"type":"intrinsic","name":"string"}}]},{"name":"loadAsync","kind":64,"signatures":[{"name":"loadAsync","kind":4096,"comment":{"summary":[{"kind":"text","text":"Build an "},{"kind":"code","text":"`AuthRequest`"},{"kind":"text","text":" and load it before returning."}],"blockTags":[{"tag":"@returns","content":[{"kind":"text","text":"Returns an instance of "},{"kind":"code","text":"`AuthRequest`"},{"kind":"text","text":" that can be used to prompt the user for authorization."}]}]},"parameters":[{"name":"config","kind":32768,"comment":{"summary":[{"kind":"text","text":"A valid ["},{"kind":"code","text":"`AuthRequestConfig`"},{"kind":"text","text":"](#authrequestconfig) that specifies what provider to use."}]},"type":{"type":"reference","name":"AuthRequestConfig"}},{"name":"issuerOrDiscovery","kind":32768,"comment":{"summary":[{"kind":"text","text":"A loaded ["},{"kind":"code","text":"`DiscoveryDocument`"},{"kind":"text","text":"](#discoverydocument) or issuer URL.\n(Only "},{"kind":"code","text":"`authorizationEndpoint`"},{"kind":"text","text":" is required for requesting an authorization code)."}]},"type":{"type":"reference","name":"IssuerOrDiscovery"}}],"type":{"type":"reference","typeArguments":[{"type":"reference","name":"AuthRequest"}],"name":"Promise","qualifiedName":"Promise","package":"typescript"}}]},{"name":"makeRedirectUri","kind":64,"signatures":[{"name":"makeRedirectUri","kind":4096,"comment":{"summary":[{"kind":"text","text":"Create a redirect url for the current platform and environment. You need to manually define the redirect that will be used in\na bare workflow React Native app, or an Expo standalone app, this is because it cannot be inferred automatically.\n- **Web:** Generates a path based on the current "},{"kind":"code","text":"`window.location`"},{"kind":"text","text":". For production web apps, you should hard code the URL as well.\n- **Managed workflow:** Uses the "},{"kind":"code","text":"`scheme`"},{"kind":"text","text":" property of your "},{"kind":"code","text":"`app.config.js`"},{"kind":"text","text":" or "},{"kind":"code","text":"`app.json`"},{"kind":"text","text":".\n - **Proxy:** Uses "},{"kind":"code","text":"`auth.expo.io`"},{"kind":"text","text":" as the base URL for the path. This only works in Expo Go and standalone environments.\n- **Bare workflow:** Will fallback to using the "},{"kind":"code","text":"`native`"},{"kind":"text","text":" option for bare workflow React Native apps."}],"blockTags":[{"tag":"@returns","content":[{"kind":"text","text":"The "},{"kind":"code","text":"`redirectUri`"},{"kind":"text","text":" to use in an authentication request."}]},{"tag":"@example","content":[{"kind":"code","text":"```ts\nconst redirectUri = makeRedirectUri({\n scheme: 'my-scheme',\n path: 'redirect'\n});\n// Development Build: my-scheme://redirect\n// Expo Go: exp://127.0.0.1:8081/--/redirect\n// Web dev: https://localhost:19006/redirect\n// Web prod: https://yourwebsite.com/redirect\n\nconst redirectUri2 = makeRedirectUri({\n scheme: 'scheme2',\n preferLocalhost: true,\n isTripleSlashed: true,\n});\n// Development Build: scheme2:///\n// Expo Go: exp://localhost:8081\n// Web dev: https://localhost:19006\n// Web prod: https://yourwebsite.com\n```"}]}]},"parameters":[{"name":"options","kind":32768,"comment":{"summary":[{"kind":"text","text":"Additional options for configuring the path."}]},"type":{"type":"reference","name":"AuthSessionRedirectUriOptions"},"defaultValue":"{}"}],"type":{"type":"intrinsic","name":"string"}}]},{"name":"refreshAsync","kind":64,"signatures":[{"name":"refreshAsync","kind":4096,"comment":{"summary":[{"kind":"text","text":"Refresh an access token.\n- If the provider didn't return a "},{"kind":"code","text":"`refresh_token`"},{"kind":"text","text":" then the access token may not be refreshed.\n- If the provider didn't return a "},{"kind":"code","text":"`expires_in`"},{"kind":"text","text":" then it's assumed that the token does not expire.\n- Determine if a token needs to be refreshed via "},{"kind":"code","text":"`TokenResponse.isTokenFresh()`"},{"kind":"text","text":" or "},{"kind":"code","text":"`shouldRefresh()`"},{"kind":"text","text":" on an instance of "},{"kind":"code","text":"`TokenResponse`"},{"kind":"text","text":"."}],"blockTags":[{"tag":"@see","content":[{"kind":"text","text":"[Section 6](https://tools.ietf.org/html/rfc6749#section-6)."}]},{"tag":"@returns","content":[{"kind":"text","text":"Returns a discovery document with a valid "},{"kind":"code","text":"`tokenEndpoint`"},{"kind":"text","text":" URL."}]}]},"parameters":[{"name":"config","kind":32768,"comment":{"summary":[{"kind":"text","text":"Configuration used to refresh the given access token."}]},"type":{"type":"reference","name":"RefreshTokenRequestConfig"}},{"name":"discovery","kind":32768,"comment":{"summary":[{"kind":"text","text":"The "},{"kind":"code","text":"`tokenEndpoint`"},{"kind":"text","text":" for a provider."}]},"type":{"type":"reference","typeArguments":[{"type":"reference","name":"DiscoveryDocument"},{"type":"literal","value":"tokenEndpoint"}],"name":"Pick","qualifiedName":"Pick","package":"typescript"}}],"type":{"type":"reference","typeArguments":[{"type":"reference","name":"TokenResponse"}],"name":"Promise","qualifiedName":"Promise","package":"typescript"}}]},{"name":"resolveDiscoveryAsync","kind":64,"signatures":[{"name":"resolveDiscoveryAsync","kind":4096,"comment":{"summary":[{"kind":"text","text":"Utility method for resolving the discovery document from an issuer or object."}]},"parameters":[{"name":"issuerOrDiscovery","kind":32768,"type":{"type":"reference","name":"IssuerOrDiscovery"}}],"type":{"type":"reference","typeArguments":[{"type":"reference","name":"DiscoveryDocument"}],"name":"Promise","qualifiedName":"Promise","package":"typescript"}}]},{"name":"revokeAsync","kind":64,"signatures":[{"name":"revokeAsync","kind":4096,"comment":{"summary":[{"kind":"text","text":"Revoke a token with a provider. This makes the token unusable, effectively requiring the user to login again."}],"blockTags":[{"tag":"@returns","content":[{"kind":"text","text":"Returns a discovery document with a valid "},{"kind":"code","text":"`revocationEndpoint`"},{"kind":"text","text":" URL. Many providers do not support this feature."}]}]},"parameters":[{"name":"config","kind":32768,"comment":{"summary":[{"kind":"text","text":"Configuration used to revoke a refresh or access token."}]},"type":{"type":"reference","name":"RevokeTokenRequestConfig"}},{"name":"discovery","kind":32768,"comment":{"summary":[{"kind":"text","text":"The "},{"kind":"code","text":"`revocationEndpoint`"},{"kind":"text","text":" for a provider."}]},"type":{"type":"reference","typeArguments":[{"type":"reference","name":"DiscoveryDocument"},{"type":"literal","value":"revocationEndpoint"}],"name":"Pick","qualifiedName":"Pick","package":"typescript"}}],"type":{"type":"reference","typeArguments":[{"type":"intrinsic","name":"boolean"}],"name":"Promise","qualifiedName":"Promise","package":"typescript"}}]},{"name":"useAuthRequest","kind":64,"signatures":[{"name":"useAuthRequest","kind":4096,"comment":{"summary":[{"kind":"text","text":"Load an authorization request for a code. When the prompt method completes then the response will be fulfilled.\n\n> In order to close the popup window on web, you need to invoke "},{"kind":"code","text":"`WebBrowser.maybeCompleteAuthSession()`"},{"kind":"text","text":".\n> See the [Identity example](/guides/authentication#identityserver-4) for more info.\n\nIf an Implicit grant flow was used, you can pass the "},{"kind":"code","text":"`response.params`"},{"kind":"text","text":" to "},{"kind":"code","text":"`TokenResponse.fromQueryParams()`"},{"kind":"text","text":"\nto get a "},{"kind":"code","text":"`TokenResponse`"},{"kind":"text","text":" instance which you can use to easily refresh the token."}],"blockTags":[{"tag":"@returns","content":[{"kind":"text","text":"Returns a loaded request, a response, and a prompt method in a single array in the following order:\n- "},{"kind":"code","text":"`request`"},{"kind":"text","text":" - An instance of ["},{"kind":"code","text":"`AuthRequest`"},{"kind":"text","text":"](#authrequest) that can be used to prompt the user for authorization.\n This will be "},{"kind":"code","text":"`null`"},{"kind":"text","text":" until the auth request has finished loading.\n- "},{"kind":"code","text":"`response`"},{"kind":"text","text":" - This is "},{"kind":"code","text":"`null`"},{"kind":"text","text":" until "},{"kind":"code","text":"`promptAsync`"},{"kind":"text","text":" has been invoked. Once fulfilled it will return information about the authorization.\n- "},{"kind":"code","text":"`promptAsync`"},{"kind":"text","text":" - When invoked, a web browser will open up and prompt the user for authentication.\n Accepts an ["},{"kind":"code","text":"`AuthRequestPromptOptions`"},{"kind":"text","text":"](#authrequestpromptoptions) object with options about how the prompt will execute."}]},{"tag":"@example","content":[{"kind":"code","text":"```ts\nconst [request, response, promptAsync] = useAuthRequest({ ... }, { ... });\n```"}]}]},"parameters":[{"name":"config","kind":32768,"comment":{"summary":[{"kind":"text","text":"A valid ["},{"kind":"code","text":"`AuthRequestConfig`"},{"kind":"text","text":"](#authrequestconfig) that specifies what provider to use."}]},"type":{"type":"reference","name":"AuthRequestConfig"}},{"name":"discovery","kind":32768,"comment":{"summary":[{"kind":"text","text":"A loaded ["},{"kind":"code","text":"`DiscoveryDocument`"},{"kind":"text","text":"](#discoverydocument) with endpoints used for authenticating.\nOnly "},{"kind":"code","text":"`authorizationEndpoint`"},{"kind":"text","text":" is required for requesting an authorization code."}]},"type":{"type":"union","types":[{"type":"literal","value":null},{"type":"reference","name":"DiscoveryDocument"}]}}],"type":{"type":"tuple","elements":[{"type":"union","types":[{"type":"reference","name":"AuthRequest"},{"type":"literal","value":null}]},{"type":"union","types":[{"type":"reference","name":"AuthSessionResult"},{"type":"literal","value":null}]},{"type":"reflection","declaration":{"name":"__type","kind":65536,"signatures":[{"name":"__type","kind":4096,"parameters":[{"name":"options","kind":32768,"flags":{"isOptional":true},"type":{"type":"reference","name":"AuthRequestPromptOptions"}}],"type":{"type":"reference","typeArguments":[{"type":"reference","name":"AuthSessionResult"}],"name":"Promise","qualifiedName":"Promise","package":"typescript"}}]}}]}}]},{"name":"useAutoDiscovery","kind":64,"signatures":[{"name":"useAutoDiscovery","kind":4096,"comment":{"summary":[{"kind":"text","text":"Given an OpenID Connect issuer URL, this will fetch and return the ["},{"kind":"code","text":"`DiscoveryDocument`"},{"kind":"text","text":"](#discoverydocument)\n(a collection of URLs) from the resource provider."}],"blockTags":[{"tag":"@returns","content":[{"kind":"text","text":"Returns "},{"kind":"code","text":"`null`"},{"kind":"text","text":" until the ["},{"kind":"code","text":"`DiscoveryDocument`"},{"kind":"text","text":"](#discoverydocument) has been fetched from the provided issuer URL."}]},{"tag":"@example","content":[{"kind":"code","text":"```ts\nconst discovery = useAutoDiscovery('https://example.com/auth');\n```"}]}]},"parameters":[{"name":"issuerOrDiscovery","kind":32768,"comment":{"summary":[{"kind":"text","text":"URL using the "},{"kind":"code","text":"`https`"},{"kind":"text","text":" scheme with no query or fragment component that the OP asserts as its Issuer Identifier."}]},"type":{"type":"reference","name":"IssuerOrDiscovery"}}],"type":{"type":"union","types":[{"type":"reference","name":"DiscoveryDocument"},{"type":"literal","value":null}]}}]}]}
\ No newline at end of file
diff --git a/docs/public/static/data/v49.0.0/expo-av.json b/docs/public/static/data/v49.0.0/expo-av.json
new file mode 100644
index 0000000000000..f4642bb7eaafd
--- /dev/null
+++ b/docs/public/static/data/v49.0.0/expo-av.json
@@ -0,0 +1 @@
+{"name":"expo-av","kind":1,"children":[{"name":"_DEFAULT_INITIAL_PLAYBACK_STATUS","kind":32,"flags":{"isConst":true},"comment":{"summary":[{"kind":"text","text":"The default initial "},{"kind":"code","text":"`AVPlaybackStatusToSet`"},{"kind":"text","text":" of all "},{"kind":"code","text":"`Audio.Sound`"},{"kind":"text","text":" objects and "},{"kind":"code","text":"`Video`"},{"kind":"text","text":" components is as follows:\n\n"},{"kind":"code","text":"```javascript\n{\n progressUpdateIntervalMillis: 500,\n positionMillis: 0,\n shouldPlay: false,\n rate: 1.0,\n shouldCorrectPitch: false,\n volume: 1.0,\n isMuted: false,\n isLooping: false,\n}\n```"},{"kind":"text","text":"\n\nThis default initial status can be overwritten by setting the optional "},{"kind":"code","text":"`initialStatus`"},{"kind":"text","text":" in "},{"kind":"code","text":"`loadAsync()`"},{"kind":"text","text":" or "},{"kind":"code","text":"`Audio.Sound.createAsync()`"},{"kind":"text","text":"."}]},"type":{"type":"reference","name":"AVPlaybackStatusToSet"},"defaultValue":"..."},{"name":"AV","kind":256,"children":[{"name":"getStatusAsync","kind":2048,"signatures":[{"name":"getStatusAsync","kind":4096,"comment":{"summary":[{"kind":"text","text":"Gets the "},{"kind":"code","text":"`AVPlaybackStatus`"},{"kind":"text","text":" of the "},{"kind":"code","text":"`playbackObject`"},{"kind":"text","text":"."}],"blockTags":[{"tag":"@returns","content":[{"kind":"text","text":"A "},{"kind":"code","text":"`Promise`"},{"kind":"text","text":" that is fulfilled with the "},{"kind":"code","text":"`AVPlaybackStatus`"},{"kind":"text","text":" of the "},{"kind":"code","text":"`playbackObject`"},{"kind":"text","text":"."}]}]},"type":{"type":"reference","typeArguments":[{"type":"reference","name":"AVPlaybackStatus"}],"name":"Promise","qualifiedName":"Promise","package":"typescript"}}]},{"name":"setStatusAsync","kind":2048,"signatures":[{"name":"setStatusAsync","kind":4096,"comment":{"summary":[{"kind":"text","text":"Sets a new "},{"kind":"code","text":"`AVPlaybackStatusToSet`"},{"kind":"text","text":" on the "},{"kind":"code","text":"`playbackObject`"},{"kind":"text","text":". This method can only be called if the media has been loaded."}],"blockTags":[{"tag":"@returns","content":[{"kind":"text","text":"A "},{"kind":"code","text":"`Promise`"},{"kind":"text","text":" that is fulfilled with the "},{"kind":"code","text":"`AVPlaybackStatus`"},{"kind":"text","text":" of the "},{"kind":"code","text":"`playbackObject`"},{"kind":"text","text":" once the new status has been set successfully,\nor rejects if setting the new status failed. See below for details on "},{"kind":"code","text":"`AVPlaybackStatus`"},{"kind":"text","text":"."}]}]},"parameters":[{"name":"status","kind":32768,"comment":{"summary":[{"kind":"text","text":"The new "},{"kind":"code","text":"`AVPlaybackStatusToSet`"},{"kind":"text","text":" of the "},{"kind":"code","text":"`playbackObject`"},{"kind":"text","text":", whose values will override the current playback status."}]},"type":{"type":"reference","name":"AVPlaybackStatusToSet"}}],"type":{"type":"reference","typeArguments":[{"type":"reference","name":"AVPlaybackStatus"}],"name":"Promise","qualifiedName":"Promise","package":"typescript"}}]}],"extendedBy":[{"type":"reference","name":"Playback"}]},{"name":"AVMetadata","kind":8388608},{"name":"AVMetadata","kind":4194304,"comment":{"summary":[{"kind":"text","text":"Object passed to the "},{"kind":"code","text":"`onMetadataUpdate`"},{"kind":"text","text":" function."}]},"type":{"type":"reflection","declaration":{"name":"__type","kind":65536,"children":[{"name":"title","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"A string with the title of the sound object."}]},"type":{"type":"intrinsic","name":"string"}}]}}},{"name":"AVPlaybackSource","kind":8388608},{"name":"AVPlaybackSource","kind":4194304,"comment":{"summary":[{"kind":"text","text":"The following forms of source are supported:\n- A dictionary of the form "},{"kind":"code","text":"`AVPlaybackSourceObject`"},{"kind":"text","text":".\n The "},{"kind":"code","text":"`overrideFileExtensionAndroid`"},{"kind":"text","text":" property may come in handy if the player receives an URL like "},{"kind":"code","text":"`example.com/play`"},{"kind":"text","text":" which redirects to "},{"kind":"code","text":"`example.com/player.m3u8`"},{"kind":"text","text":".\n Setting this property to "},{"kind":"code","text":"`m3u8`"},{"kind":"text","text":" would allow the Android player to properly infer the content type of the media and use proper media file reader.\n- "},{"kind":"code","text":"`require('path/to/file')`"},{"kind":"text","text":" for a media file asset in the source code directory.\n- An ["},{"kind":"code","text":"`Asset`"},{"kind":"text","text":"](./asset) object for a media file asset.\n\nThe [iOS developer documentation](https://developer.apple.com/library/ios/documentation/Miscellaneous/Conceptual/iPhoneOSTechOverview/MediaLayer/MediaLayer.html)\nlists the audio and video formats supported on iOS.\n\nThere are two sets of audio and video formats supported on Android: [formats supported by ExoPlayer](https://google.github.io/ExoPlayer/supported-formats.html)\nand [formats supported by Android's MediaPlayer](https://developer.android.com/guide/appendix/media-formats.html#formats-table).\nExpo uses ExoPlayer implementation by default. To use "},{"kind":"code","text":"`MediaPlayer`"},{"kind":"text","text":", add "},{"kind":"code","text":"`androidImplementation: 'MediaPlayer'`"},{"kind":"text","text":" to the initial status of the AV object."}]},"type":{"type":"union","types":[{"type":"intrinsic","name":"number"},{"type":"reference","name":"AVPlaybackSourceObject"},{"type":"reference","name":"Asset"}]}},{"name":"AVPlaybackSourceObject","kind":8388608},{"name":"AVPlaybackSourceObject","kind":4194304,"comment":{"summary":[{"kind":"text","text":"One of the possible forms of the "},{"kind":"code","text":"`AVPlaybackSource`"},{"kind":"text","text":"."}]},"type":{"type":"reflection","declaration":{"name":"__type","kind":65536,"children":[{"name":"headers","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"An optional headers object passed in a network request."}]},"type":{"type":"reference","typeArguments":[{"type":"intrinsic","name":"string"},{"type":"intrinsic","name":"string"}],"name":"Record","qualifiedName":"Record","package":"typescript"}},{"name":"overrideFileExtensionAndroid","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"An optional string overriding extension inferred from the URL."}],"blockTags":[{"tag":"@platform","content":[{"kind":"text","text":"android"}]}]},"type":{"type":"intrinsic","name":"string"}},{"name":"uri","kind":1024,"comment":{"summary":[{"kind":"text","text":"A network URL pointing to a media file."}]},"type":{"type":"intrinsic","name":"string"}}]}}},{"name":"AVPlaybackStatus","kind":8388608},{"name":"AVPlaybackStatus","kind":4194304,"comment":{"summary":[{"kind":"text","text":"This is the structure returned from all playback API calls and describes the state of the "},{"kind":"code","text":"`playbackObject`"},{"kind":"text","text":" at that point in time.\nIt can take a form of "},{"kind":"code","text":"`AVPlaybackStatusSuccess`"},{"kind":"text","text":" or "},{"kind":"code","text":"`AVPlaybackStatusError`"},{"kind":"text","text":" based on the "},{"kind":"code","text":"`playbackObject`"},{"kind":"text","text":" load status."}]},"type":{"type":"union","types":[{"type":"reference","name":"AVPlaybackStatusError"},{"type":"reference","name":"AVPlaybackStatusSuccess"}]}},{"name":"AVPlaybackStatusError","kind":8388608},{"name":"AVPlaybackStatusError","kind":4194304,"type":{"type":"reflection","declaration":{"name":"__type","kind":65536,"children":[{"name":"androidImplementation","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"Underlying implementation to use (when set to "},{"kind":"code","text":"`MediaPlayer`"},{"kind":"text","text":" it uses [Android's MediaPlayer](https://developer.android.com/reference/android/media/MediaPlayer.html),\nuses [ExoPlayer](https://google.github.io/ExoPlayer/) otherwise). You may need to use this property if you're trying to play an item unsupported by ExoPlayer\n([formats supported by ExoPlayer](https://google.github.io/ExoPlayer/supported-formats.html), [formats supported by Android's MediaPlayer](https://developer.android.com/guide/appendix/media-formats.html#formats-table)).\n\nNote that setting this property takes effect only when the AV object is just being created (toggling its value later will do nothing)."}],"blockTags":[{"tag":"@platform","content":[{"kind":"text","text":"android"}]}]},"type":{"type":"intrinsic","name":"string"}},{"name":"error","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"A string only present if the "},{"kind":"code","text":"`playbackObject`"},{"kind":"text","text":" just encountered a fatal error and forced unload.\nPopulated exactly once when an error forces the object to unload."}]},"type":{"type":"intrinsic","name":"string"}},{"name":"isLoaded","kind":1024,"comment":{"summary":[{"kind":"text","text":"A boolean set to "},{"kind":"code","text":"`false`"},{"kind":"text","text":"."}]},"type":{"type":"literal","value":false}}]}}},{"name":"AVPlaybackStatusSuccess","kind":8388608},{"name":"AVPlaybackStatusSuccess","kind":4194304,"type":{"type":"reflection","declaration":{"name":"__type","kind":65536,"children":[{"name":"androidImplementation","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"Underlying implementation to use (when set to "},{"kind":"code","text":"`MediaPlayer`"},{"kind":"text","text":" it uses [Android's MediaPlayer](https://developer.android.com/reference/android/media/MediaPlayer.html),\nuses [ExoPlayer](https://google.github.io/ExoPlayer/) otherwise). You may need to use this property if you're trying to play an item unsupported by ExoPlayer\n([formats supported by ExoPlayer](https://google.github.io/ExoPlayer/supported-formats.html), [formats supported by Android's MediaPlayer](https://developer.android.com/guide/appendix/media-formats.html#formats-table)).\n\nNote that setting this property takes effect only when the AV object is just being created (toggling its value later will do nothing)."}],"blockTags":[{"tag":"@platform","content":[{"kind":"text","text":"android"}]}]},"type":{"type":"intrinsic","name":"string"}},{"name":"audioPan","kind":1024,"comment":{"summary":[{"kind":"text","text":"The current audio panning value of the audio for this media."}]},"type":{"type":"intrinsic","name":"number"}},{"name":"didJustFinish","kind":1024,"comment":{"summary":[{"kind":"text","text":"A boolean describing if the media just played to completion at the time that this status was received.\nWhen the media plays to completion, the function passed in "},{"kind":"code","text":"`setOnPlaybackStatusUpdate()`"},{"kind":"text","text":" is called exactly once\nwith "},{"kind":"code","text":"`didJustFinish`"},{"kind":"text","text":" set to "},{"kind":"code","text":"`true`"},{"kind":"text","text":". "},{"kind":"code","text":"`didJustFinish`"},{"kind":"text","text":" is never "},{"kind":"code","text":"`true`"},{"kind":"text","text":" in any other case."}]},"type":{"type":"intrinsic","name":"boolean"}},{"name":"durationMillis","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"The duration of the media in milliseconds. This is only present if the media has a duration.\n> Note that in some cases, a media file's duration is readable on Android, but not on iOS."}]},"type":{"type":"intrinsic","name":"number"}},{"name":"isBuffering","kind":1024,"comment":{"summary":[{"kind":"text","text":"A boolean describing if the media is currently buffering."}]},"type":{"type":"intrinsic","name":"boolean"}},{"name":"isLoaded","kind":1024,"comment":{"summary":[{"kind":"text","text":"A boolean set to "},{"kind":"code","text":"`true`"},{"kind":"text","text":"."}]},"type":{"type":"literal","value":true}},{"name":"isLooping","kind":1024,"comment":{"summary":[{"kind":"text","text":"A boolean describing if the media is currently looping."}]},"type":{"type":"intrinsic","name":"boolean"}},{"name":"isMuted","kind":1024,"comment":{"summary":[{"kind":"text","text":"A boolean describing if the audio of this media is currently muted."}]},"type":{"type":"intrinsic","name":"boolean"}},{"name":"isPlaying","kind":1024,"comment":{"summary":[{"kind":"text","text":"A boolean describing if the media is currently playing."}]},"type":{"type":"intrinsic","name":"boolean"}},{"name":"pitchCorrectionQuality","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"iOS time pitch algorithm setting. See "},{"kind":"code","text":"`setRateAsync`"},{"kind":"text","text":" for details."}]},"type":{"type":"reference","name":"PitchCorrectionQuality"}},{"name":"playableDurationMillis","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"The position until which the media has been buffered into memory. Like "},{"kind":"code","text":"`durationMillis`"},{"kind":"text","text":", this is only present in some cases."}]},"type":{"type":"intrinsic","name":"number"}},{"name":"positionMillis","kind":1024,"comment":{"summary":[{"kind":"text","text":"The current position of playback in milliseconds."}]},"type":{"type":"intrinsic","name":"number"}},{"name":"progressUpdateIntervalMillis","kind":1024,"comment":{"summary":[{"kind":"text","text":"The minimum interval in milliseconds between calls of "},{"kind":"code","text":"`onPlaybackStatusUpdate`"},{"kind":"text","text":". See "},{"kind":"code","text":"`setOnPlaybackStatusUpdate()`"},{"kind":"text","text":" for details."}]},"type":{"type":"intrinsic","name":"number"}},{"name":"rate","kind":1024,"comment":{"summary":[{"kind":"text","text":"The current rate of the media."}]},"type":{"type":"intrinsic","name":"number"}},{"name":"seekMillisToleranceAfter","kind":1024,"flags":{"isOptional":true},"type":{"type":"intrinsic","name":"number"}},{"name":"seekMillisToleranceBefore","kind":1024,"flags":{"isOptional":true},"type":{"type":"intrinsic","name":"number"}},{"name":"shouldCorrectPitch","kind":1024,"comment":{"summary":[{"kind":"text","text":"A boolean describing if we are correcting the pitch for a changed rate."}]},"type":{"type":"intrinsic","name":"boolean"}},{"name":"shouldPlay","kind":1024,"comment":{"summary":[{"kind":"text","text":"A boolean describing if the media is supposed to play."}]},"type":{"type":"intrinsic","name":"boolean"}},{"name":"uri","kind":1024,"comment":{"summary":[{"kind":"text","text":"The location of the media source."}]},"type":{"type":"intrinsic","name":"string"}},{"name":"volume","kind":1024,"comment":{"summary":[{"kind":"text","text":"The current volume of the audio for this media."}]},"type":{"type":"intrinsic","name":"number"}}]}}},{"name":"AVPlaybackStatusToSet","kind":8388608},{"name":"AVPlaybackStatusToSet","kind":4194304,"comment":{"summary":[{"kind":"text","text":"This is the structure passed to "},{"kind":"code","text":"`setStatusAsync()`"},{"kind":"text","text":" to modify the state of the "},{"kind":"code","text":"`playbackObject`"},{"kind":"text","text":"."}]},"type":{"type":"reflection","declaration":{"name":"__type","kind":65536,"children":[{"name":"androidImplementation","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"Underlying implementation to use (when set to "},{"kind":"code","text":"`MediaPlayer`"},{"kind":"text","text":" it uses [Android's MediaPlayer](https://developer.android.com/reference/android/media/MediaPlayer.html),\nuses [ExoPlayer](https://google.github.io/ExoPlayer/) otherwise). You may need to use this property if you're trying to play an item unsupported by ExoPlayer\n([formats supported by ExoPlayer](https://google.github.io/ExoPlayer/supported-formats.html), [formats supported by Android's MediaPlayer](https://developer.android.com/guide/appendix/media-formats.html#formats-table)).\n\nNote that setting this property takes effect only when the AV object is just being created (toggling its value later will do nothing)."}],"blockTags":[{"tag":"@platform","content":[{"kind":"text","text":"android"}]}]},"type":{"type":"intrinsic","name":"string"}},{"name":"audioPan","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"The current audio panning value of the audio for this media.\n> Note that this only affect the audio of this "},{"kind":"code","text":"`playbackObject`"},{"kind":"text","text":" and do NOT affect the system volume.\n> Also note that this is only available when the video was loaded using "},{"kind":"code","text":"`androidImplementation: 'MediaPlayer'`"}],"blockTags":[{"tag":"@platform","content":[{"kind":"text","text":"android"}]}]},"type":{"type":"intrinsic","name":"number"}},{"name":"isLooping","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"A boolean describing if the media is currently looping."}]},"type":{"type":"intrinsic","name":"boolean"}},{"name":"isMuted","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"A boolean describing if the audio of this media is currently muted.\n> Note that this only affect the audio of this "},{"kind":"code","text":"`playbackObject`"},{"kind":"text","text":" and do NOT affect the system volume."}]},"type":{"type":"intrinsic","name":"boolean"}},{"name":"pitchCorrectionQuality","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"iOS time pitch algorithm setting. See "},{"kind":"code","text":"`setRateAsync`"},{"kind":"text","text":" for details."}]},"type":{"type":"reference","name":"PitchCorrectionQuality"}},{"name":"positionMillis","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"The current position of playback in milliseconds."}]},"type":{"type":"intrinsic","name":"number"}},{"name":"progressUpdateIntervalMillis","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"The minimum interval in milliseconds between calls of "},{"kind":"code","text":"`onPlaybackStatusUpdate`"},{"kind":"text","text":". See "},{"kind":"code","text":"`setOnPlaybackStatusUpdate()`"},{"kind":"text","text":" for details."}]},"type":{"type":"intrinsic","name":"number"}},{"name":"rate","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"The current rate of the media."}],"blockTags":[{"tag":"@platform","content":[{"kind":"text","text":"android API 23+"}]},{"tag":"@platform","content":[{"kind":"text","text":"ios"}]}]},"type":{"type":"intrinsic","name":"number"}},{"name":"seekMillisToleranceAfter","kind":1024,"flags":{"isOptional":true},"type":{"type":"intrinsic","name":"number"}},{"name":"seekMillisToleranceBefore","kind":1024,"flags":{"isOptional":true},"type":{"type":"intrinsic","name":"number"}},{"name":"shouldCorrectPitch","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"A boolean describing if we are correcting the pitch for a changed rate."}]},"type":{"type":"intrinsic","name":"boolean"}},{"name":"shouldPlay","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"A boolean describing if the media is supposed to play."}]},"type":{"type":"intrinsic","name":"boolean"}},{"name":"volume","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"The current volume of the audio for this media.\n> Note that this only affect the audio of this "},{"kind":"code","text":"`playbackObject`"},{"kind":"text","text":" and do NOT affect the system volume."}]},"type":{"type":"intrinsic","name":"number"}}]}}},{"name":"AVPlaybackTolerance","kind":8388608},{"name":"AVPlaybackTolerance","kind":4194304,"type":{"type":"reflection","declaration":{"name":"__type","kind":65536,"children":[{"name":"toleranceMillisAfter","kind":1024,"flags":{"isOptional":true},"type":{"type":"intrinsic","name":"number"}},{"name":"toleranceMillisBefore","kind":1024,"flags":{"isOptional":true},"type":{"type":"intrinsic","name":"number"}}]}}},{"name":"PitchCorrectionQuality","kind":8388608},{"name":"PitchCorrectionQuality","kind":8,"comment":{"summary":[{"kind":"text","text":"Check [official Apple documentation](https://developer.apple.com/documentation/avfoundation/avaudiotimepitchalgorithmlowqualityzerolatency) for more information."}]},"children":[{"name":"High","kind":16,"comment":{"summary":[{"kind":"text","text":"Equivalent to "},{"kind":"code","text":"`AVAudioTimePitchAlgorithmSpectral`"},{"kind":"text","text":"."}]},"type":{"type":"intrinsic","name":"number"}},{"name":"Low","kind":16,"comment":{"summary":[{"kind":"text","text":"Equivalent to "},{"kind":"code","text":"`AVAudioTimePitchAlgorithmLowQualityZeroLatency`"},{"kind":"text","text":"."}]},"type":{"type":"intrinsic","name":"number"}},{"name":"Medium","kind":16,"comment":{"summary":[{"kind":"text","text":"Equivalent to "},{"kind":"code","text":"`AVAudioTimePitchAlgorithmTimeDomain`"},{"kind":"text","text":"."}]},"type":{"type":"intrinsic","name":"number"}}]},{"name":"Playback","kind":256,"comment":{"summary":[{"kind":"text","text":"On the "},{"kind":"code","text":"`playbackObject`"},{"kind":"text","text":" reference, the following API is provided."}]},"children":[{"name":"getStatusAsync","kind":2048,"signatures":[{"name":"getStatusAsync","kind":4096,"comment":{"summary":[{"kind":"text","text":"Gets the "},{"kind":"code","text":"`AVPlaybackStatus`"},{"kind":"text","text":" of the "},{"kind":"code","text":"`playbackObject`"},{"kind":"text","text":"."}],"blockTags":[{"tag":"@returns","content":[{"kind":"text","text":"A "},{"kind":"code","text":"`Promise`"},{"kind":"text","text":" that is fulfilled with the "},{"kind":"code","text":"`AVPlaybackStatus`"},{"kind":"text","text":" of the "},{"kind":"code","text":"`playbackObject`"},{"kind":"text","text":"."}]}]},"type":{"type":"reference","typeArguments":[{"type":"reference","name":"AVPlaybackStatus"}],"name":"Promise","qualifiedName":"Promise","package":"typescript"},"inheritedFrom":{"type":"reference","name":"AV.getStatusAsync"}}],"inheritedFrom":{"type":"reference","name":"AV.getStatusAsync"}},{"name":"loadAsync","kind":2048,"signatures":[{"name":"loadAsync","kind":4096,"comment":{"summary":[{"kind":"text","text":"Loads the media from "},{"kind":"code","text":"`source`"},{"kind":"text","text":" into memory and prepares it for playing. This must be called before calling "},{"kind":"code","text":"`setStatusAsync()`"},{"kind":"text","text":"\nor any of the convenience set status methods. This method can only be called if the "},{"kind":"code","text":"`playbackObject`"},{"kind":"text","text":" is in an unloaded state."}],"blockTags":[{"tag":"@returns","content":[{"kind":"text","text":"A "},{"kind":"code","text":"`Promise`"},{"kind":"text","text":" that is fulfilled with the "},{"kind":"code","text":"`AVPlaybackStatus`"},{"kind":"text","text":" of the "},{"kind":"code","text":"`playbackObject`"},{"kind":"text","text":" once it is loaded, or rejects if loading failed.\nThe "},{"kind":"code","text":"`Promise`"},{"kind":"text","text":" will also reject if the "},{"kind":"code","text":"`playbackObject`"},{"kind":"text","text":" was already loaded. See below for details on "},{"kind":"code","text":"`AVPlaybackStatus`"},{"kind":"text","text":"."}]}]},"parameters":[{"name":"source","kind":32768,"comment":{"summary":[{"kind":"text","text":"The source of the media."}]},"type":{"type":"reference","name":"AVPlaybackSource"}},{"name":"initialStatus","kind":32768,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"The initial intended "},{"kind":"code","text":"`AVPlaybackStatusToSet`"},{"kind":"text","text":" of the "},{"kind":"code","text":"`playbackObject`"},{"kind":"text","text":", whose values will override the default initial playback status.\nThis value defaults to "},{"kind":"code","text":"`{}`"},{"kind":"text","text":" if no parameter is passed. For more information see the details on "},{"kind":"code","text":"`AVPlaybackStatusToSet`"},{"kind":"text","text":" type\nand the default initial playback status."}]},"type":{"type":"reference","name":"AVPlaybackStatusToSet"}},{"name":"downloadAsync","kind":32768,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"If set to "},{"kind":"code","text":"`true`"},{"kind":"text","text":", the system will attempt to download the resource to the device before loading.\nThis value defaults to "},{"kind":"code","text":"`true`"},{"kind":"text","text":". Note that at the moment, this will only work for "},{"kind":"code","text":"`source`"},{"kind":"text","text":"s of the form "},{"kind":"code","text":"`require('path/to/file')`"},{"kind":"text","text":" or "},{"kind":"code","text":"`Asset`"},{"kind":"text","text":" objects."}]},"type":{"type":"intrinsic","name":"boolean"}}],"type":{"type":"reference","typeArguments":[{"type":"reference","name":"AVPlaybackStatus"}],"name":"Promise","qualifiedName":"Promise","package":"typescript"}}]},{"name":"pauseAsync","kind":2048,"signatures":[{"name":"pauseAsync","kind":4096,"comment":{"summary":[{"kind":"text","text":"This is equivalent to "},{"kind":"code","text":"`playbackObject.setStatusAsync({ shouldPlay: false })`"},{"kind":"text","text":"."}]},"type":{"type":"reference","typeArguments":[{"type":"reference","name":"AVPlaybackStatus"}],"name":"Promise","qualifiedName":"Promise","package":"typescript"}}]},{"name":"playAsync","kind":2048,"signatures":[{"name":"playAsync","kind":4096,"comment":{"summary":[{"kind":"text","text":"This is equivalent to "},{"kind":"code","text":"`playbackObject.setStatusAsync({ shouldPlay: true })`"},{"kind":"text","text":".\n\nPlayback may not start immediately after calling this function for reasons such as buffering. Make sure to update your UI based\non the "},{"kind":"code","text":"`isPlaying`"},{"kind":"text","text":" and "},{"kind":"code","text":"`isBuffering`"},{"kind":"text","text":" properties of the "},{"kind":"code","text":"`AVPlaybackStatus`"},{"kind":"text","text":"."}]},"type":{"type":"reference","typeArguments":[{"type":"reference","name":"AVPlaybackStatus"}],"name":"Promise","qualifiedName":"Promise","package":"typescript"}}]},{"name":"playFromPositionAsync","kind":2048,"signatures":[{"name":"playFromPositionAsync","kind":4096,"comment":{"summary":[{"kind":"text","text":"This is equivalent to "},{"kind":"code","text":"`playbackObject.setStatusAsync({ shouldPlay: true, positionMillis, seekMillisToleranceAfter: tolerances.seekMillisToleranceAfter, seekMillisToleranceBefore: tolerances.seekMillisToleranceBefore })`"},{"kind":"text","text":".\n\nPlayback may not start immediately after calling this function for reasons such as buffering. Make sure to update your UI based\non the "},{"kind":"code","text":"`isPlaying`"},{"kind":"text","text":" and "},{"kind":"code","text":"`isBuffering`"},{"kind":"text","text":" properties of the "},{"kind":"code","text":"`AVPlaybackStatus`"},{"kind":"text","text":"."}]},"parameters":[{"name":"positionMillis","kind":32768,"comment":{"summary":[{"kind":"text","text":"The desired position of playback in milliseconds."}]},"type":{"type":"intrinsic","name":"number"}},{"name":"tolerances","kind":32768,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"The tolerances are used only on iOS ([more details](#what-is-seek-tolerance-and-why-would))."}]},"type":{"type":"reference","name":"AVPlaybackTolerance"}}],"type":{"type":"reference","typeArguments":[{"type":"reference","name":"AVPlaybackStatus"}],"name":"Promise","qualifiedName":"Promise","package":"typescript"}}]},{"name":"replayAsync","kind":2048,"signatures":[{"name":"replayAsync","kind":4096,"comment":{"summary":[{"kind":"text","text":"Replays the playback item. When using "},{"kind":"code","text":"`playFromPositionAsync(0)`"},{"kind":"text","text":" the item is seeked to the position at "},{"kind":"code","text":"`0 ms`"},{"kind":"text","text":".\nOn iOS this method uses internal implementation of the player and is able to play the item from the beginning immediately."}],"blockTags":[{"tag":"@returns","content":[{"kind":"text","text":"A "},{"kind":"code","text":"`Promise`"},{"kind":"text","text":" that is fulfilled with the "},{"kind":"code","text":"`AVPlaybackStatus`"},{"kind":"text","text":" of the "},{"kind":"code","text":"`playbackObject`"},{"kind":"text","text":" once the new status has been set successfully,\nor rejects if setting the new status failed."}]}]},"parameters":[{"name":"status","kind":32768,"comment":{"summary":[{"kind":"text","text":"The new "},{"kind":"code","text":"`AVPlaybackStatusToSet`"},{"kind":"text","text":" of the "},{"kind":"code","text":"`playbackObject`"},{"kind":"text","text":", whose values will override the current playback status.\n"},{"kind":"code","text":"`positionMillis`"},{"kind":"text","text":" and "},{"kind":"code","text":"`shouldPlay`"},{"kind":"text","text":" properties will be overridden with respectively "},{"kind":"code","text":"`0`"},{"kind":"text","text":" and "},{"kind":"code","text":"`true`"},{"kind":"text","text":"."}]},"type":{"type":"reference","name":"AVPlaybackStatusToSet"}}],"type":{"type":"reference","typeArguments":[{"type":"reference","name":"AVPlaybackStatus"}],"name":"Promise","qualifiedName":"Promise","package":"typescript"}}]},{"name":"setIsLoopingAsync","kind":2048,"signatures":[{"name":"setIsLoopingAsync","kind":4096,"comment":{"summary":[{"kind":"text","text":"This is equivalent to "},{"kind":"code","text":"`playbackObject.setStatusAsync({ isLooping })`"},{"kind":"text","text":"."}]},"parameters":[{"name":"isLooping","kind":32768,"comment":{"summary":[{"kind":"text","text":"A boolean describing if the media should play once ("},{"kind":"code","text":"`false`"},{"kind":"text","text":") or loop indefinitely ("},{"kind":"code","text":"`true`"},{"kind":"text","text":")."}]},"type":{"type":"intrinsic","name":"boolean"}}],"type":{"type":"reference","typeArguments":[{"type":"reference","name":"AVPlaybackStatus"}],"name":"Promise","qualifiedName":"Promise","package":"typescript"}}]},{"name":"setIsMutedAsync","kind":2048,"signatures":[{"name":"setIsMutedAsync","kind":4096,"comment":{"summary":[{"kind":"text","text":"This is equivalent to "},{"kind":"code","text":"`playbackObject.setStatusAsync({ isMuted })`"},{"kind":"text","text":"."}]},"parameters":[{"name":"isMuted","kind":32768,"comment":{"summary":[{"kind":"text","text":"A boolean describing if the audio of this media should be muted."}]},"type":{"type":"intrinsic","name":"boolean"}}],"type":{"type":"reference","typeArguments":[{"type":"reference","name":"AVPlaybackStatus"}],"name":"Promise","qualifiedName":"Promise","package":"typescript"}}]},{"name":"setPositionAsync","kind":2048,"signatures":[{"name":"setPositionAsync","kind":4096,"comment":{"summary":[{"kind":"text","text":"This is equivalent to "},{"kind":"code","text":"`playbackObject.setStatusAsync({ positionMillis })`"},{"kind":"text","text":"."}]},"parameters":[{"name":"positionMillis","kind":32768,"comment":{"summary":[{"kind":"text","text":"The desired position of playback in milliseconds."}]},"type":{"type":"intrinsic","name":"number"}},{"name":"tolerances","kind":32768,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"The tolerances are used only on iOS ([more details](#what-is-seek-tolerance-and-why-would))."}]},"type":{"type":"reference","name":"AVPlaybackTolerance"}}],"type":{"type":"reference","typeArguments":[{"type":"reference","name":"AVPlaybackStatus"}],"name":"Promise","qualifiedName":"Promise","package":"typescript"}}]},{"name":"setProgressUpdateIntervalAsync","kind":2048,"signatures":[{"name":"setProgressUpdateIntervalAsync","kind":4096,"comment":{"summary":[{"kind":"text","text":"This is equivalent to "},{"kind":"code","text":"`playbackObject.setStatusAsync({ progressUpdateIntervalMillis })`"},{"kind":"text","text":"."}]},"parameters":[{"name":"progressUpdateIntervalMillis","kind":32768,"comment":{"summary":[{"kind":"text","text":"The new minimum interval in milliseconds between calls of "},{"kind":"code","text":"`onPlaybackStatusUpdate`"},{"kind":"text","text":".\nSee "},{"kind":"code","text":"`setOnPlaybackStatusUpdate()`"},{"kind":"text","text":" for details."}]},"type":{"type":"intrinsic","name":"number"}}],"type":{"type":"reference","typeArguments":[{"type":"reference","name":"AVPlaybackStatus"}],"name":"Promise","qualifiedName":"Promise","package":"typescript"}}]},{"name":"setRateAsync","kind":2048,"signatures":[{"name":"setRateAsync","kind":4096,"comment":{"summary":[{"kind":"text","text":"This is equivalent to "},{"kind":"code","text":"`playbackObject.setStatusAsync({ rate, shouldCorrectPitch, pitchCorrectionQuality })`"},{"kind":"text","text":"."}]},"parameters":[{"name":"rate","kind":32768,"comment":{"summary":[{"kind":"text","text":"The desired playback rate of the media. This value must be between "},{"kind":"code","text":"`0.0`"},{"kind":"text","text":" and "},{"kind":"code","text":"`32.0`"},{"kind":"text","text":". Only available on Android API version 23 and later and iOS."}]},"type":{"type":"intrinsic","name":"number"}},{"name":"shouldCorrectPitch","kind":32768,"comment":{"summary":[{"kind":"text","text":"A boolean describing if we should correct the pitch for a changed rate. If set to "},{"kind":"code","text":"`true`"},{"kind":"text","text":", the pitch of the audio will be corrected\n(so a rate different than "},{"kind":"code","text":"`1.0`"},{"kind":"text","text":" will timestretch the audio)."}]},"type":{"type":"intrinsic","name":"boolean"}},{"name":"pitchCorrectionQuality","kind":32768,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"iOS time pitch algorithm setting, defaults to "},{"kind":"code","text":"`Audio.PitchCorrectionQuality.Low`"},{"kind":"text","text":"."}]},"type":{"type":"reference","name":"PitchCorrectionQuality"}}],"type":{"type":"reference","typeArguments":[{"type":"reference","name":"AVPlaybackStatus"}],"name":"Promise","qualifiedName":"Promise","package":"typescript"}}]},{"name":"setStatusAsync","kind":2048,"signatures":[{"name":"setStatusAsync","kind":4096,"comment":{"summary":[{"kind":"text","text":"Sets a new "},{"kind":"code","text":"`AVPlaybackStatusToSet`"},{"kind":"text","text":" on the "},{"kind":"code","text":"`playbackObject`"},{"kind":"text","text":". This method can only be called if the media has been loaded."}],"blockTags":[{"tag":"@returns","content":[{"kind":"text","text":"A "},{"kind":"code","text":"`Promise`"},{"kind":"text","text":" that is fulfilled with the "},{"kind":"code","text":"`AVPlaybackStatus`"},{"kind":"text","text":" of the "},{"kind":"code","text":"`playbackObject`"},{"kind":"text","text":" once the new status has been set successfully,\nor rejects if setting the new status failed. See below for details on "},{"kind":"code","text":"`AVPlaybackStatus`"},{"kind":"text","text":"."}]}]},"parameters":[{"name":"status","kind":32768,"comment":{"summary":[{"kind":"text","text":"The new "},{"kind":"code","text":"`AVPlaybackStatusToSet`"},{"kind":"text","text":" of the "},{"kind":"code","text":"`playbackObject`"},{"kind":"text","text":", whose values will override the current playback status."}]},"type":{"type":"reference","name":"AVPlaybackStatusToSet"}}],"type":{"type":"reference","typeArguments":[{"type":"reference","name":"AVPlaybackStatus"}],"name":"Promise","qualifiedName":"Promise","package":"typescript"},"inheritedFrom":{"type":"reference","name":"AV.setStatusAsync"}}],"inheritedFrom":{"type":"reference","name":"AV.setStatusAsync"}},{"name":"setVolumeAsync","kind":2048,"signatures":[{"name":"setVolumeAsync","kind":4096,"comment":{"summary":[{"kind":"text","text":"This is equivalent to "},{"kind":"code","text":"`playbackObject.setStatusAsync({ volume, audioPan })`"},{"kind":"text","text":".\nNote: "},{"kind":"code","text":"`audioPan`"},{"kind":"text","text":" is currently only supported on Android using "},{"kind":"code","text":"`androidImplementation: 'MediaPlayer'`"}]},"parameters":[{"name":"volume","kind":32768,"comment":{"summary":[{"kind":"text","text":"A number between "},{"kind":"code","text":"`0.0`"},{"kind":"text","text":" (silence) and "},{"kind":"code","text":"`1.0`"},{"kind":"text","text":" (maximum volume)."}]},"type":{"type":"intrinsic","name":"number"}},{"name":"audioPan","kind":32768,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"A number between "},{"kind":"code","text":"`-1.0`"},{"kind":"text","text":" (full left) and "},{"kind":"code","text":"`1.0`"},{"kind":"text","text":" (full right)."}]},"type":{"type":"intrinsic","name":"number"}}],"type":{"type":"reference","typeArguments":[{"type":"reference","name":"AVPlaybackStatus"}],"name":"Promise","qualifiedName":"Promise","package":"typescript"}}]},{"name":"stopAsync","kind":2048,"signatures":[{"name":"stopAsync","kind":4096,"comment":{"summary":[{"kind":"text","text":"This is equivalent to "},{"kind":"code","text":"`playbackObject.setStatusAsync({ shouldPlay: false, positionMillis: 0 })`"},{"kind":"text","text":"."}]},"type":{"type":"reference","typeArguments":[{"type":"reference","name":"AVPlaybackStatus"}],"name":"Promise","qualifiedName":"Promise","package":"typescript"}}]},{"name":"unloadAsync","kind":2048,"signatures":[{"name":"unloadAsync","kind":4096,"comment":{"summary":[{"kind":"text","text":"Unloads the media from memory. "},{"kind":"code","text":"`loadAsync()`"},{"kind":"text","text":" must be called again in order to be able to play the media.\n> This cleanup function will be automatically called in the "},{"kind":"code","text":"`Video`"},{"kind":"text","text":" component's "},{"kind":"code","text":"`componentWillUnmount`"},{"kind":"text","text":"."}],"blockTags":[{"tag":"@returns","content":[{"kind":"text","text":"A "},{"kind":"code","text":"`Promise`"},{"kind":"text","text":" that is fulfilled with the "},{"kind":"code","text":"`AVPlaybackStatus`"},{"kind":"text","text":" of the "},{"kind":"code","text":"`playbackObject`"},{"kind":"text","text":" once it is unloaded, or rejects if unloading failed."}]}]},"type":{"type":"reference","typeArguments":[{"type":"reference","name":"AVPlaybackStatus"}],"name":"Promise","qualifiedName":"Promise","package":"typescript"}}]}],"extendedTypes":[{"type":"reference","name":"AV"}]}]}
\ No newline at end of file
diff --git a/docs/public/static/data/v49.0.0/expo-background-fetch.json b/docs/public/static/data/v49.0.0/expo-background-fetch.json
new file mode 100644
index 0000000000000..aee0e0a19756c
--- /dev/null
+++ b/docs/public/static/data/v49.0.0/expo-background-fetch.json
@@ -0,0 +1 @@
+{"name":"expo-background-fetch","kind":1,"children":[{"name":"BackgroundFetchResult","kind":8,"comment":{"summary":[{"kind":"text","text":"This return value is to let iOS know what the result of your background fetch was, so the\nplatform can better schedule future background fetches. Also, your app has up to 30 seconds\nto perform the task, otherwise your app will be terminated and future background fetches\nmay be delayed."}]},"children":[{"name":"Failed","kind":16,"comment":{"summary":[{"kind":"text","text":"An attempt to download data was made but that attempt failed."}]},"type":{"type":"literal","value":3}},{"name":"NewData","kind":16,"comment":{"summary":[{"kind":"text","text":"New data was successfully downloaded."}]},"type":{"type":"literal","value":2}},{"name":"NoData","kind":16,"comment":{"summary":[{"kind":"text","text":"There was no new data to download."}]},"type":{"type":"literal","value":1}}]},{"name":"BackgroundFetchStatus","kind":8,"children":[{"name":"Available","kind":16,"comment":{"summary":[{"kind":"text","text":"Background updates are available for the app."}]},"type":{"type":"literal","value":3}},{"name":"Denied","kind":16,"comment":{"summary":[{"kind":"text","text":"The user explicitly disabled background behavior for this app or for the whole system."}]},"type":{"type":"literal","value":1}},{"name":"Restricted","kind":16,"comment":{"summary":[{"kind":"text","text":"Background updates are unavailable and the user cannot enable them again. This status can occur\nwhen, for example, parental controls are in effect for the current user."}]},"type":{"type":"literal","value":2}}]},{"name":"BackgroundFetchOptions","kind":256,"children":[{"name":"minimumInterval","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"Inexact interval in seconds between subsequent repeats of the background fetch alarm. The final\ninterval may differ from the specified one to minimize wakeups and battery usage.\n- On Android it defaults to __10 minutes__,\n- On iOS it calls ["},{"kind":"code","text":"`BackgroundFetch.setMinimumIntervalAsync`"},{"kind":"text","text":"](#backgroundfetchsetminimumintervalasyncminimuminterval)\n behind the scenes and the default value is the smallest fetch interval supported by the system __(10-15 minutes)__.\nBackground fetch task receives no data, but your task should return a value that best describes\nthe results of your background fetch work."}],"blockTags":[{"tag":"@returns","content":[{"kind":"text","text":"Returns a promise that fulfils once the task is registered and rejects in case of any errors."}]}]},"type":{"type":"intrinsic","name":"number"}},{"name":"startOnBoot","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"Whether to restart background fetch events when the device has finished booting."}],"blockTags":[{"tag":"@default","content":[{"kind":"text","text":"false"}]},{"tag":"@platform","content":[{"kind":"text","text":"android"}]}]},"type":{"type":"intrinsic","name":"boolean"}},{"name":"stopOnTerminate","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"Whether to stop receiving background fetch events after user terminates the app."}],"blockTags":[{"tag":"@default","content":[{"kind":"text","text":"true"}]},{"tag":"@platform","content":[{"kind":"text","text":"android"}]}]},"type":{"type":"intrinsic","name":"boolean"}}]},{"name":"getStatusAsync","kind":64,"signatures":[{"name":"getStatusAsync","kind":4096,"comment":{"summary":[{"kind":"text","text":"Gets a status of background fetch."}],"blockTags":[{"tag":"@returns","content":[{"kind":"text","text":"Returns a promise which fulfils with one of "},{"kind":"code","text":"`BackgroundFetchStatus`"},{"kind":"text","text":" enum values."}]}]},"type":{"type":"reference","typeArguments":[{"type":"union","types":[{"type":"reference","name":"BackgroundFetchStatus"},{"type":"literal","value":null}]}],"name":"Promise","qualifiedName":"Promise","package":"typescript"}}]},{"name":"registerTaskAsync","kind":64,"signatures":[{"name":"registerTaskAsync","kind":4096,"comment":{"summary":[{"kind":"text","text":"Registers background fetch task with given name. Registered tasks are saved in persistent storage and restored once the app is initialized."}],"blockTags":[{"tag":"@example","content":[{"kind":"code","text":"```ts\nimport * as BackgroundFetch from 'expo-background-fetch';\nimport * as TaskManager from 'expo-task-manager';\n\nTaskManager.defineTask(YOUR_TASK_NAME, () => {\n try {\n const receivedNewData = // do your background fetch here\n return receivedNewData ? BackgroundFetch.BackgroundFetchResult.NewData : BackgroundFetch.BackgroundFetchResult.NoData;\n } catch (error) {\n return BackgroundFetch.BackgroundFetchResult.Failed;\n }\n});\n```"}]}]},"parameters":[{"name":"taskName","kind":32768,"comment":{"summary":[{"kind":"text","text":"Name of the task to register. The task needs to be defined first - see ["},{"kind":"code","text":"`TaskManager.defineTask`"},{"kind":"text","text":"](taskmanager#defineTask)\nfor more details."}]},"type":{"type":"intrinsic","name":"string"}},{"name":"options","kind":32768,"comment":{"summary":[{"kind":"text","text":"An object containing the background fetch options."}]},"type":{"type":"reference","name":"BackgroundFetchOptions"},"defaultValue":"{}"}],"type":{"type":"reference","typeArguments":[{"type":"intrinsic","name":"void"}],"name":"Promise","qualifiedName":"Promise","package":"typescript"}}]},{"name":"setMinimumIntervalAsync","kind":64,"signatures":[{"name":"setMinimumIntervalAsync","kind":4096,"comment":{"summary":[{"kind":"text","text":"Sets the minimum number of seconds that must elapse before another background fetch can be\ninitiated. This value is advisory only and does not indicate the exact amount of time expected\nbetween fetch operations.\n\n> This method doesn't take any effect on Android. It is a global value which means that it can\noverwrite settings from another application opened through Expo Go."}],"blockTags":[{"tag":"@returns","content":[{"kind":"text","text":"A promise which fulfils once the minimum interval is set."}]}]},"parameters":[{"name":"minimumInterval","kind":32768,"comment":{"summary":[{"kind":"text","text":"Number of seconds that must elapse before another background fetch can be called."}]},"type":{"type":"intrinsic","name":"number"}}],"type":{"type":"reference","typeArguments":[{"type":"intrinsic","name":"void"}],"name":"Promise","qualifiedName":"Promise","package":"typescript"}}]},{"name":"unregisterTaskAsync","kind":64,"signatures":[{"name":"unregisterTaskAsync","kind":4096,"comment":{"summary":[{"kind":"text","text":"Unregisters background fetch task, so the application will no longer be executing this task."}],"blockTags":[{"tag":"@returns","content":[{"kind":"text","text":"A promise which fulfils when the task is fully unregistered."}]}]},"parameters":[{"name":"taskName","kind":32768,"comment":{"summary":[{"kind":"text","text":"Name of the task to unregister."}]},"type":{"type":"intrinsic","name":"string"}}],"type":{"type":"reference","typeArguments":[{"type":"intrinsic","name":"void"}],"name":"Promise","qualifiedName":"Promise","package":"typescript"}}]}]}
\ No newline at end of file
diff --git a/docs/public/static/data/v49.0.0/expo-barcode-scanner.json b/docs/public/static/data/v49.0.0/expo-barcode-scanner.json
new file mode 100644
index 0000000000000..31cfb437022d9
--- /dev/null
+++ b/docs/public/static/data/v49.0.0/expo-barcode-scanner.json
@@ -0,0 +1 @@
+{"name":"expo-barcode-scanner","kind":1,"children":[{"name":"PermissionStatus","kind":8,"children":[{"name":"DENIED","kind":16,"comment":{"summary":[{"kind":"text","text":"User has denied the permission."}]},"type":{"type":"literal","value":"denied"}},{"name":"GRANTED","kind":16,"comment":{"summary":[{"kind":"text","text":"User has granted the permission."}]},"type":{"type":"literal","value":"granted"}},{"name":"UNDETERMINED","kind":16,"comment":{"summary":[{"kind":"text","text":"User hasn't granted or denied the permission yet."}]},"type":{"type":"literal","value":"undetermined"}}]},{"name":"BarCodeScanner","kind":128,"children":[{"name":"constructor","kind":512,"flags":{"isExternal":true},"signatures":[{"name":"new BarCodeScanner","kind":16384,"flags":{"isExternal":true},"parameters":[{"name":"props","kind":32768,"flags":{"isExternal":true},"type":{"type":"union","types":[{"type":"reference","name":"BarCodeScannerProps"},{"type":"reference","typeArguments":[{"type":"reference","name":"BarCodeScannerProps"}],"name":"Readonly","qualifiedName":"Readonly","package":"typescript"}]}}],"type":{"type":"reference","name":"BarCodeScanner"},"inheritedFrom":{"type":"reference","name":"React.Component.constructor"}},{"name":"new BarCodeScanner","kind":16384,"flags":{"isExternal":true},"comment":{"summary":[],"blockTags":[{"tag":"@deprecated","content":[]},{"tag":"@see","content":[{"kind":"text","text":"https://reactjs.org/docs/legacy-context.html"}]}]},"parameters":[{"name":"props","kind":32768,"flags":{"isExternal":true},"type":{"type":"reference","name":"BarCodeScannerProps"}},{"name":"context","kind":32768,"flags":{"isExternal":true},"type":{"type":"intrinsic","name":"any"}}],"type":{"type":"reference","name":"BarCodeScanner"},"inheritedFrom":{"type":"reference","name":"React.Component.constructor"}}],"inheritedFrom":{"type":"reference","name":"React.Component.constructor"}},{"name":"lastEvents","kind":1024,"type":{"type":"reflection","declaration":{"name":"__type","kind":65536,"indexSignature":{"name":"__index","kind":8192,"parameters":[{"name":"key","kind":32768,"type":{"type":"intrinsic","name":"string"}}],"type":{"type":"intrinsic","name":"any"}}}},"defaultValue":"{}"},{"name":"lastEventsTimes","kind":1024,"type":{"type":"reflection","declaration":{"name":"__type","kind":65536,"indexSignature":{"name":"__index","kind":8192,"parameters":[{"name":"key","kind":32768,"type":{"type":"intrinsic","name":"string"}}],"type":{"type":"intrinsic","name":"any"}}}},"defaultValue":"{}"},{"name":"Constants","kind":1024,"flags":{"isStatic":true},"type":{"type":"reflection","declaration":{"name":"__type","kind":65536,"children":[{"name":"BarCodeType","kind":1024,"type":{"type":"intrinsic","name":"any"}},{"name":"Type","kind":1024,"type":{"type":"intrinsic","name":"any"}}]}},"defaultValue":"..."},{"name":"ConversionTables","kind":1024,"flags":{"isStatic":true},"type":{"type":"reflection","declaration":{"name":"__type","kind":65536,"children":[{"name":"type","kind":1024,"type":{"type":"intrinsic","name":"any"},"defaultValue":"Type"}]}},"defaultValue":"..."},{"name":"defaultProps","kind":1024,"flags":{"isStatic":true},"type":{"type":"reflection","declaration":{"name":"__type","kind":65536,"children":[{"name":"barCodeTypes","kind":1024,"type":{"type":"array","elementType":{"type":"intrinsic","name":"unknown"}},"defaultValue":"..."},{"name":"type","kind":1024,"type":{"type":"intrinsic","name":"any"},"defaultValue":"Type.back"}]}},"defaultValue":"..."},{"name":"usePermissions","kind":1024,"flags":{"isStatic":true},"type":{"type":"reflection","declaration":{"name":"__type","kind":65536,"signatures":[{"name":"__type","kind":4096,"comment":{"summary":[{"kind":"text","text":"Check or request permissions for the barcode scanner.\nThis uses both "},{"kind":"code","text":"`requestPermissionAsync`"},{"kind":"text","text":" and "},{"kind":"code","text":"`getPermissionsAsync`"},{"kind":"text","text":" to interact with the permissions."}],"blockTags":[{"tag":"@example","content":[{"kind":"code","text":"```ts\nconst [permissionResponse, requestPermission] = BarCodeScanner.usePermissions();\n```"}]}]},"parameters":[{"name":"options","kind":32768,"flags":{"isOptional":true},"type":{"type":"reference","typeArguments":[{"type":"intrinsic","name":"object"}],"name":"PermissionHookOptions"}}],"type":{"type":"tuple","elements":[{"type":"union","types":[{"type":"literal","value":null},{"type":"reference","name":"PermissionResponse"}]},{"type":"reference","typeArguments":[{"type":"reference","name":"PermissionResponse"}],"name":"RequestPermissionMethod"},{"type":"reference","typeArguments":[{"type":"reference","name":"PermissionResponse"}],"name":"GetPermissionMethod"}]}}]}},"defaultValue":"..."},{"name":"render","kind":2048,"signatures":[{"name":"render","kind":4096,"type":{"type":"reference","name":"Element","qualifiedName":"global.JSX.Element","package":"@types/react"},"overwrites":{"type":"reference","name":"React.Component.render"}}],"overwrites":{"type":"reference","name":"React.Component.render"}},{"name":"getPermissionsAsync","kind":2048,"flags":{"isStatic":true},"signatures":[{"name":"getPermissionsAsync","kind":4096,"comment":{"summary":[{"kind":"text","text":"Checks user's permissions for accessing the camera."}],"blockTags":[{"tag":"@returns","content":[{"kind":"text","text":"Return a promise that fulfills to an object of type ["},{"kind":"code","text":"`PermissionResponse`"},{"kind":"text","text":"](#permissionresponse)."}]}]},"type":{"type":"reference","typeArguments":[{"type":"reference","name":"PermissionResponse"}],"name":"Promise","qualifiedName":"Promise","package":"typescript"}}]},{"name":"requestPermissionsAsync","kind":2048,"flags":{"isStatic":true},"signatures":[{"name":"requestPermissionsAsync","kind":4096,"comment":{"summary":[{"kind":"text","text":"Asks the user to grant permissions for accessing the camera.\n\nOn iOS this will require apps to specify the "},{"kind":"code","text":"`NSCameraUsageDescription`"},{"kind":"text","text":" entry in the "},{"kind":"code","text":"`Info.plist`"},{"kind":"text","text":"."}],"blockTags":[{"tag":"@returns","content":[{"kind":"text","text":"Return a promise that fulfills to an object of type ["},{"kind":"code","text":"`PermissionResponse`"},{"kind":"text","text":"](#permissionresponse)."}]}]},"type":{"type":"reference","typeArguments":[{"type":"reference","name":"PermissionResponse"}],"name":"Promise","qualifiedName":"Promise","package":"typescript"}}]},{"name":"scanFromURLAsync","kind":2048,"flags":{"isStatic":true},"signatures":[{"name":"scanFromURLAsync","kind":4096,"comment":{"summary":[{"kind":"text","text":"Scan bar codes from the image given by the URL."}],"blockTags":[{"tag":"@returns","content":[{"kind":"text","text":"A possibly empty array of objects of the "},{"kind":"code","text":"`BarCodeScannerResult`"},{"kind":"text","text":" shape, where the type\nrefers to the bar code type that was scanned and the data is the information encoded in the bar\ncode."}]}]},"parameters":[{"name":"url","kind":32768,"comment":{"summary":[{"kind":"text","text":"URL to get the image from."}]},"type":{"type":"intrinsic","name":"string"}},{"name":"barCodeTypes","kind":32768,"comment":{"summary":[{"kind":"text","text":"An array of bar code types. Defaults to all supported bar code types on\nthe platform.\n> __Note:__ Only QR codes are supported on iOS."}]},"type":{"type":"array","elementType":{"type":"intrinsic","name":"string"}},"defaultValue":"..."}],"type":{"type":"reference","typeArguments":[{"type":"array","elementType":{"type":"reference","name":"BarCodeScannerResult"}}],"name":"Promise","qualifiedName":"Promise","package":"typescript"}}]}],"extendedTypes":[{"type":"reference","typeArguments":[{"type":"reference","name":"BarCodeScannerProps"}],"name":"Component","qualifiedName":"React.Component","package":"@types/react"}]},{"name":"PermissionResponse","kind":256,"comment":{"summary":[{"kind":"text","text":"An object obtained by permissions get and request functions."}]},"children":[{"name":"canAskAgain","kind":1024,"comment":{"summary":[{"kind":"text","text":"Indicates if user can be asked again for specific permission.\nIf not, one should be directed to the Settings app\nin order to enable/disable the permission."}]},"type":{"type":"intrinsic","name":"boolean"}},{"name":"expires","kind":1024,"comment":{"summary":[{"kind":"text","text":"Determines time when the permission expires."}]},"type":{"type":"reference","name":"PermissionExpiration"}},{"name":"granted","kind":1024,"comment":{"summary":[{"kind":"text","text":"A convenience boolean that indicates if the permission is granted."}]},"type":{"type":"intrinsic","name":"boolean"}},{"name":"status","kind":1024,"comment":{"summary":[{"kind":"text","text":"Determines the status of the permission."}]},"type":{"type":"reference","name":"PermissionStatus"}}]},{"name":"BarCodeBounds","kind":4194304,"type":{"type":"reflection","declaration":{"name":"__type","kind":65536,"children":[{"name":"origin","kind":1024,"comment":{"summary":[{"kind":"text","text":"The origin point of the bounding box."}]},"type":{"type":"reference","name":"BarCodePoint"}},{"name":"size","kind":1024,"comment":{"summary":[{"kind":"text","text":"The size of the bounding box."}]},"type":{"type":"reference","name":"BarCodeSize"}}]}}},{"name":"BarCodeEvent","kind":4194304,"type":{"type":"intersection","types":[{"type":"reference","name":"BarCodeScannerResult"},{"type":"reflection","declaration":{"name":"__type","kind":65536,"children":[{"name":"target","kind":1024,"flags":{"isOptional":true},"type":{"type":"intrinsic","name":"number"}}]}}]}},{"name":"BarCodeEventCallbackArguments","kind":4194304,"type":{"type":"reflection","declaration":{"name":"__type","kind":65536,"children":[{"name":"nativeEvent","kind":1024,"type":{"type":"reference","name":"BarCodeEvent"}}]}}},{"name":"BarCodePoint","kind":4194304,"comment":{"summary":[{"kind":"text","text":"Those coordinates are represented in the coordinate space of the barcode source (e.g. when you\nare using the barcode scanner view, these values are adjusted to the dimensions of the view)."}]},"type":{"type":"reflection","declaration":{"name":"__type","kind":65536,"children":[{"name":"x","kind":1024,"comment":{"summary":[{"kind":"text","text":"The "},{"kind":"code","text":"`x`"},{"kind":"text","text":" coordinate value."}]},"type":{"type":"intrinsic","name":"number"}},{"name":"y","kind":1024,"comment":{"summary":[{"kind":"text","text":"The "},{"kind":"code","text":"`y`"},{"kind":"text","text":" coordinate value."}]},"type":{"type":"intrinsic","name":"number"}}]}}},{"name":"BarCodeScannedCallback","kind":4194304,"type":{"type":"reflection","declaration":{"name":"__type","kind":65536,"signatures":[{"name":"__type","kind":4096,"parameters":[{"name":"params","kind":32768,"type":{"type":"reference","name":"BarCodeEvent"}}],"type":{"type":"intrinsic","name":"void"}}]}}},{"name":"BarCodeScannerProps","kind":4194304,"type":{"type":"intersection","types":[{"type":"reference","name":"ViewProps","qualifiedName":"ViewProps","package":"react-native"},{"type":"reflection","declaration":{"name":"__type","kind":65536,"children":[{"name":"barCodeTypes","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"An array of bar code types. Usage: "},{"kind":"code","text":"`BarCodeScanner.Constants.BarCodeType.`"},{"kind":"text","text":" where\n"},{"kind":"code","text":"`codeType`"},{"kind":"text","text":" is one of these [listed above](#supported-formats). Defaults to all supported bar\ncode types. It is recommended to provide only the bar code formats you expect to scan to\nminimize battery usage.\n\nFor example: "},{"kind":"code","text":"`barCodeTypes={[BarCodeScanner.Constants.BarCodeType.qr]}`"},{"kind":"text","text":"."}]},"type":{"type":"array","elementType":{"type":"intrinsic","name":"string"}}},{"name":"onBarCodeScanned","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"A callback that is invoked when a bar code has been successfully scanned. The callback is\nprovided with an [BarCodeScannerResult](#barcodescannerresult).\n> __Note:__ Passing "},{"kind":"code","text":"`undefined`"},{"kind":"text","text":" to the "},{"kind":"code","text":"`onBarCodeScanned`"},{"kind":"text","text":" prop will result in no scanning. This\n> can be used to effectively \"pause\" the scanner so that it doesn't continually scan even after\n> data has been retrieved."}]},"type":{"type":"reference","name":"BarCodeScannedCallback"}},{"name":"type","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"Camera facing. Use one of "},{"kind":"code","text":"`BarCodeScanner.Constants.Type`"},{"kind":"text","text":". Use either "},{"kind":"code","text":"`Type.front`"},{"kind":"text","text":" or "},{"kind":"code","text":"`Type.back`"},{"kind":"text","text":".\nSame as "},{"kind":"code","text":"`Camera.Constants.Type`"},{"kind":"text","text":"."}],"blockTags":[{"tag":"@default","content":[{"kind":"text","text":"Type.back"}]}]},"type":{"type":"union","types":[{"type":"literal","value":"front"},{"type":"literal","value":"back"},{"type":"intrinsic","name":"number"}]}}]}}]}},{"name":"BarCodeScannerResult","kind":4194304,"type":{"type":"reflection","declaration":{"name":"__type","kind":65536,"children":[{"name":"bounds","kind":1024,"comment":{"summary":[{"kind":"text","text":"The [BarCodeBounds](#barcodebounds) object.\n"},{"kind":"code","text":"`bounds`"},{"kind":"text","text":" in some case will be representing an empty rectangle.\nMoreover, "},{"kind":"code","text":"`bounds`"},{"kind":"text","text":" doesn't have to bound the whole barcode.\nFor some types, they will represent the area used by the scanner."}]},"type":{"type":"reference","name":"BarCodeBounds"}},{"name":"cornerPoints","kind":1024,"comment":{"summary":[{"kind":"text","text":"Corner points of the bounding box.\n"},{"kind":"code","text":"`cornerPoints`"},{"kind":"text","text":" is not always available and may be empty. On iOS, for "},{"kind":"code","text":"`code39`"},{"kind":"text","text":" and "},{"kind":"code","text":"`pdf417`"},{"kind":"text","text":"\nyou don't get this value."}]},"type":{"type":"array","elementType":{"type":"reference","name":"BarCodePoint"}}},{"name":"data","kind":1024,"comment":{"summary":[{"kind":"text","text":"The information encoded in the bar code."}]},"type":{"type":"intrinsic","name":"string"}},{"name":"type","kind":1024,"comment":{"summary":[{"kind":"text","text":"The barcode type."}]},"type":{"type":"intrinsic","name":"string"}}]}}},{"name":"BarCodeSize","kind":4194304,"type":{"type":"reflection","declaration":{"name":"__type","kind":65536,"children":[{"name":"height","kind":1024,"comment":{"summary":[{"kind":"text","text":"The height value."}]},"type":{"type":"intrinsic","name":"number"}},{"name":"width","kind":1024,"comment":{"summary":[{"kind":"text","text":"The width value."}]},"type":{"type":"intrinsic","name":"number"}}]}}},{"name":"PermissionHookOptions","kind":4194304,"typeParameters":[{"name":"Options","kind":131072,"type":{"type":"intrinsic","name":"object"}}],"type":{"type":"intersection","types":[{"type":"reference","name":"PermissionHookBehavior"},{"type":"reference","name":"Options"}]}},{"name":"Constants","kind":32,"type":{"type":"reflection","declaration":{"name":"__type","kind":65536,"children":[{"name":"BarCodeType","kind":1024,"type":{"type":"intrinsic","name":"any"}},{"name":"Type","kind":1024,"type":{"type":"intrinsic","name":"any"}}]}}},{"name":"getPermissionsAsync","kind":64,"signatures":[{"name":"getPermissionsAsync","kind":4096,"comment":{"summary":[{"kind":"text","text":"Checks user's permissions for accessing the camera."}],"blockTags":[{"tag":"@returns","content":[{"kind":"text","text":"Return a promise that fulfills to an object of type ["},{"kind":"code","text":"`PermissionResponse`"},{"kind":"text","text":"](#permissionresponse)."}]}]},"type":{"type":"reference","typeArguments":[{"type":"reference","name":"PermissionResponse"}],"name":"Promise","qualifiedName":"Promise","package":"typescript"}}]},{"name":"requestPermissionsAsync","kind":64,"signatures":[{"name":"requestPermissionsAsync","kind":4096,"comment":{"summary":[{"kind":"text","text":"Asks the user to grant permissions for accessing the camera.\n\nOn iOS this will require apps to specify the "},{"kind":"code","text":"`NSCameraUsageDescription`"},{"kind":"text","text":" entry in the "},{"kind":"code","text":"`Info.plist`"},{"kind":"text","text":"."}],"blockTags":[{"tag":"@returns","content":[{"kind":"text","text":"Return a promise that fulfills to an object of type ["},{"kind":"code","text":"`PermissionResponse`"},{"kind":"text","text":"](#permissionresponse)."}]}]},"type":{"type":"reference","typeArguments":[{"type":"reference","name":"PermissionResponse"}],"name":"Promise","qualifiedName":"Promise","package":"typescript"}}]},{"name":"scanFromURLAsync","kind":64,"signatures":[{"name":"scanFromURLAsync","kind":4096,"comment":{"summary":[{"kind":"text","text":"Scan bar codes from the image given by the URL."}],"blockTags":[{"tag":"@returns","content":[{"kind":"text","text":"A possibly empty array of objects of the "},{"kind":"code","text":"`BarCodeScannerResult`"},{"kind":"text","text":" shape, where the type\nrefers to the bar code type that was scanned and the data is the information encoded in the bar\ncode."}]}]},"parameters":[{"name":"url","kind":32768,"comment":{"summary":[{"kind":"text","text":"URL to get the image from."}]},"type":{"type":"intrinsic","name":"string"}},{"name":"barCodeTypes","kind":32768,"comment":{"summary":[{"kind":"text","text":"An array of bar code types. Defaults to all supported bar code types on\nthe platform.\n> __Note:__ Only QR codes are supported on iOS."}]},"type":{"type":"array","elementType":{"type":"intrinsic","name":"string"}},"defaultValue":"..."}],"type":{"type":"reference","typeArguments":[{"type":"array","elementType":{"type":"reference","name":"BarCodeScannerResult"}}],"name":"Promise","qualifiedName":"Promise","package":"typescript"}}]}]}
\ No newline at end of file
diff --git a/docs/public/static/data/v49.0.0/expo-barometer.json b/docs/public/static/data/v49.0.0/expo-barometer.json
new file mode 100644
index 0000000000000..36779600166fb
--- /dev/null
+++ b/docs/public/static/data/v49.0.0/expo-barometer.json
@@ -0,0 +1 @@
+{"name":"expo-barometer","kind":1,"children":[{"name":"BarometerMeasurement","kind":4194304,"comment":{"summary":[{"kind":"text","text":"The altitude data returned from the native sensors."}]},"type":{"type":"reflection","declaration":{"name":"__type","kind":65536,"children":[{"name":"pressure","kind":1024,"comment":{"summary":[{"kind":"text","text":"Measurement in hectopascals ("},{"kind":"code","text":"`hPa`"},{"kind":"text","text":")."}]},"type":{"type":"intrinsic","name":"number"}},{"name":"relativeAltitude","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"Measurement in meters ("},{"kind":"code","text":"`m`"},{"kind":"text","text":")."}],"blockTags":[{"tag":"@platform","content":[{"kind":"text","text":"ios"}]}]},"type":{"type":"intrinsic","name":"number"}}]}}},{"name":"BarometerSensor","kind":128,"comment":{"summary":[],"blockTags":[{"tag":"@platform","content":[{"kind":"text","text":"android"}]},{"tag":"@platform","content":[{"kind":"text","text":"ios"}]}]},"children":[{"name":"constructor","kind":512,"signatures":[{"name":"new BarometerSensor","kind":16384,"parameters":[{"name":"nativeSensorModule","kind":32768,"type":{"type":"intrinsic","name":"any"}},{"name":"nativeEventName","kind":32768,"type":{"type":"intrinsic","name":"string"}}],"type":{"type":"reference","name":"BarometerSensor"},"inheritedFrom":{"type":"reference","name":"default.constructor"}}],"inheritedFrom":{"type":"reference","name":"default.constructor"}},{"name":"_listenerCount","kind":1024,"type":{"type":"intrinsic","name":"number"},"inheritedFrom":{"type":"reference","name":"default._listenerCount"}},{"name":"_nativeEmitter","kind":1024,"type":{"type":"reference","name":"EventEmitter"},"inheritedFrom":{"type":"reference","name":"default._nativeEmitter"}},{"name":"_nativeEventName","kind":1024,"type":{"type":"intrinsic","name":"string"},"inheritedFrom":{"type":"reference","name":"default._nativeEventName"}},{"name":"_nativeModule","kind":1024,"type":{"type":"intrinsic","name":"any"},"inheritedFrom":{"type":"reference","name":"default._nativeModule"}},{"name":"addListener","kind":2048,"signatures":[{"name":"addListener","kind":4096,"comment":{"summary":[{"kind":"text","text":"Subscribe for updates to the barometer."}],"blockTags":[{"tag":"@example","content":[{"kind":"code","text":"```ts\nconst subscription = Barometer.addListener(({ pressure, relativeAltitude }) => {\n console.log({ pressure, relativeAltitude });\n});\n```"}]},{"tag":"@returns","content":[{"kind":"text","text":"A subscription that you can call "},{"kind":"code","text":"`remove()`"},{"kind":"text","text":" on when you would like to unsubscribe the listener."}]}]},"parameters":[{"name":"listener","kind":32768,"comment":{"summary":[{"kind":"text","text":"A callback that is invoked when a barometer update is available. When invoked, the listener is provided with a single argument that is "},{"kind":"code","text":"`BarometerMeasurement`"},{"kind":"text","text":"."}]},"type":{"type":"reference","typeArguments":[{"type":"reference","name":"BarometerMeasurement"}],"name":"Listener"}}],"type":{"type":"reference","name":"Subscription"},"overwrites":{"type":"reference","name":"default.addListener"}}],"overwrites":{"type":"reference","name":"default.addListener"}},{"name":"getListenerCount","kind":2048,"signatures":[{"name":"getListenerCount","kind":4096,"comment":{"summary":[{"kind":"text","text":"Returns the registered listeners count."}]},"type":{"type":"intrinsic","name":"number"},"inheritedFrom":{"type":"reference","name":"default.getListenerCount"}}],"inheritedFrom":{"type":"reference","name":"default.getListenerCount"}},{"name":"getPermissionsAsync","kind":2048,"signatures":[{"name":"getPermissionsAsync","kind":4096,"comment":{"summary":[{"kind":"text","text":"Checks user's permissions for accessing sensor."}]},"type":{"type":"reference","typeArguments":[{"type":"reference","name":"PermissionResponse"}],"name":"Promise","qualifiedName":"Promise","package":"typescript"},"inheritedFrom":{"type":"reference","name":"default.getPermissionsAsync"}}],"inheritedFrom":{"type":"reference","name":"default.getPermissionsAsync"}},{"name":"hasListeners","kind":2048,"signatures":[{"name":"hasListeners","kind":4096,"comment":{"summary":[{"kind":"text","text":"Returns boolean which signifies if sensor has any listeners registered."}]},"type":{"type":"intrinsic","name":"boolean"},"inheritedFrom":{"type":"reference","name":"default.hasListeners"}}],"inheritedFrom":{"type":"reference","name":"default.hasListeners"}},{"name":"isAvailableAsync","kind":2048,"signatures":[{"name":"isAvailableAsync","kind":4096,"comment":{"summary":[{"kind":"text","text":"> **info** You should always check the sensor availability before attempting to use it.\n\nCheck the availability of the device barometer. Requires at least Android 2.3 (API Level 9) and iOS 8."}],"blockTags":[{"tag":"@returns","content":[{"kind":"text","text":"A promise that resolves to a "},{"kind":"code","text":"`boolean`"},{"kind":"text","text":" denoting the availability of the sensor."}]}]},"type":{"type":"reference","typeArguments":[{"type":"intrinsic","name":"boolean"}],"name":"Promise","qualifiedName":"Promise","package":"typescript"},"overwrites":{"type":"reference","name":"default.isAvailableAsync"}}],"overwrites":{"type":"reference","name":"default.isAvailableAsync"}},{"name":"removeAllListeners","kind":2048,"signatures":[{"name":"removeAllListeners","kind":4096,"comment":{"summary":[{"kind":"text","text":"Removes all registered listeners."}]},"type":{"type":"intrinsic","name":"void"},"inheritedFrom":{"type":"reference","name":"default.removeAllListeners"}}],"inheritedFrom":{"type":"reference","name":"default.removeAllListeners"}},{"name":"removeSubscription","kind":2048,"signatures":[{"name":"removeSubscription","kind":4096,"comment":{"summary":[{"kind":"text","text":"Removes the given subscription."}]},"parameters":[{"name":"subscription","kind":32768,"comment":{"summary":[{"kind":"text","text":"A subscription to remove."}]},"type":{"type":"reference","name":"Subscription"}}],"type":{"type":"intrinsic","name":"void"},"inheritedFrom":{"type":"reference","name":"default.removeSubscription"}}],"inheritedFrom":{"type":"reference","name":"default.removeSubscription"}},{"name":"requestPermissionsAsync","kind":2048,"signatures":[{"name":"requestPermissionsAsync","kind":4096,"comment":{"summary":[{"kind":"text","text":"Asks the user to grant permissions for accessing sensor."}]},"type":{"type":"reference","typeArguments":[{"type":"reference","name":"PermissionResponse"}],"name":"Promise","qualifiedName":"Promise","package":"typescript"},"inheritedFrom":{"type":"reference","name":"default.requestPermissionsAsync"}}],"inheritedFrom":{"type":"reference","name":"default.requestPermissionsAsync"}},{"name":"setUpdateInterval","kind":2048,"signatures":[{"name":"setUpdateInterval","kind":4096,"comment":{"summary":[{"kind":"text","text":"Set the sensor update interval."}]},"parameters":[{"name":"intervalMs","kind":32768,"comment":{"summary":[{"kind":"text","text":"Desired interval in milliseconds between sensor updates.\n> Starting from Android 12 (API level 31), the system has a 200ms limit for each sensor updates.\n>\n> If you need an update interval less than 200ms, you should:\n> * add "},{"kind":"code","text":"`android.permission.HIGH_SAMPLING_RATE_SENSORS`"},{"kind":"text","text":" to [**app.json** "},{"kind":"code","text":"`permissions`"},{"kind":"text","text":" field](/versions/latest/config/app/#permissions)\n> * or if you are using bare workflow, add "},{"kind":"code","text":"``"},{"kind":"text","text":" to **AndroidManifest.xml**."}]},"type":{"type":"intrinsic","name":"number"}}],"type":{"type":"intrinsic","name":"void"},"inheritedFrom":{"type":"reference","name":"default.setUpdateInterval"}}],"inheritedFrom":{"type":"reference","name":"default.setUpdateInterval"}}],"extendedTypes":[{"type":"reference","typeArguments":[{"type":"reference","name":"BarometerMeasurement"}],"name":"default"}]},{"name":"default","kind":32,"type":{"type":"reference","name":"BarometerSensor"}},{"name":"default","kind":128,"comment":{"summary":[{"kind":"text","text":"A base class for subscribable sensors. The events emitted by this class are measurements\nspecified by the parameter type "},{"kind":"code","text":"`Measurement`"},{"kind":"text","text":"."}]},"children":[{"name":"constructor","kind":512,"signatures":[{"name":"new default","kind":16384,"typeParameter":[{"name":"Measurement","kind":131072}],"parameters":[{"name":"nativeSensorModule","kind":32768,"type":{"type":"intrinsic","name":"any"}},{"name":"nativeEventName","kind":32768,"type":{"type":"intrinsic","name":"string"}}],"type":{"type":"reference","typeArguments":[{"type":"reference","name":"Measurement"}],"name":"default"}}]},{"name":"_listenerCount","kind":1024,"type":{"type":"intrinsic","name":"number"}},{"name":"_nativeEmitter","kind":1024,"type":{"type":"reference","name":"EventEmitter"}},{"name":"_nativeEventName","kind":1024,"type":{"type":"intrinsic","name":"string"}},{"name":"_nativeModule","kind":1024,"type":{"type":"intrinsic","name":"any"}},{"name":"addListener","kind":2048,"signatures":[{"name":"addListener","kind":4096,"parameters":[{"name":"listener","kind":32768,"type":{"type":"reference","typeArguments":[{"type":"reference","name":"Measurement"}],"name":"Listener"}}],"type":{"type":"reference","name":"Subscription"}}]},{"name":"getListenerCount","kind":2048,"signatures":[{"name":"getListenerCount","kind":4096,"comment":{"summary":[{"kind":"text","text":"Returns the registered listeners count."}]},"type":{"type":"intrinsic","name":"number"}}]},{"name":"getPermissionsAsync","kind":2048,"signatures":[{"name":"getPermissionsAsync","kind":4096,"comment":{"summary":[{"kind":"text","text":"Checks user's permissions for accessing sensor."}]},"type":{"type":"reference","typeArguments":[{"type":"reference","name":"PermissionResponse"}],"name":"Promise","qualifiedName":"Promise","package":"typescript"}}]},{"name":"hasListeners","kind":2048,"signatures":[{"name":"hasListeners","kind":4096,"comment":{"summary":[{"kind":"text","text":"Returns boolean which signifies if sensor has any listeners registered."}]},"type":{"type":"intrinsic","name":"boolean"}}]},{"name":"isAvailableAsync","kind":2048,"signatures":[{"name":"isAvailableAsync","kind":4096,"comment":{"summary":[{"kind":"text","text":"> **info** You should always check the sensor availability before attempting to use it."}],"blockTags":[{"tag":"@returns","content":[{"kind":"text","text":"A promise that resolves to a "},{"kind":"code","text":"`boolean`"},{"kind":"text","text":" denoting the availability of the sensor."}]}]},"type":{"type":"reference","typeArguments":[{"type":"intrinsic","name":"boolean"}],"name":"Promise","qualifiedName":"Promise","package":"typescript"}}]},{"name":"removeAllListeners","kind":2048,"signatures":[{"name":"removeAllListeners","kind":4096,"comment":{"summary":[{"kind":"text","text":"Removes all registered listeners."}]},"type":{"type":"intrinsic","name":"void"}}]},{"name":"removeSubscription","kind":2048,"signatures":[{"name":"removeSubscription","kind":4096,"comment":{"summary":[{"kind":"text","text":"Removes the given subscription."}]},"parameters":[{"name":"subscription","kind":32768,"comment":{"summary":[{"kind":"text","text":"A subscription to remove."}]},"type":{"type":"reference","name":"Subscription"}}],"type":{"type":"intrinsic","name":"void"}}]},{"name":"requestPermissionsAsync","kind":2048,"signatures":[{"name":"requestPermissionsAsync","kind":4096,"comment":{"summary":[{"kind":"text","text":"Asks the user to grant permissions for accessing sensor."}]},"type":{"type":"reference","typeArguments":[{"type":"reference","name":"PermissionResponse"}],"name":"Promise","qualifiedName":"Promise","package":"typescript"}}]},{"name":"setUpdateInterval","kind":2048,"signatures":[{"name":"setUpdateInterval","kind":4096,"comment":{"summary":[{"kind":"text","text":"Set the sensor update interval."}]},"parameters":[{"name":"intervalMs","kind":32768,"comment":{"summary":[{"kind":"text","text":"Desired interval in milliseconds between sensor updates.\n> Starting from Android 12 (API level 31), the system has a 200ms limit for each sensor updates.\n>\n> If you need an update interval less than 200ms, you should:\n> * add "},{"kind":"code","text":"`android.permission.HIGH_SAMPLING_RATE_SENSORS`"},{"kind":"text","text":" to [**app.json** "},{"kind":"code","text":"`permissions`"},{"kind":"text","text":" field](/versions/latest/config/app/#permissions)\n> * or if you are using bare workflow, add "},{"kind":"code","text":"``"},{"kind":"text","text":" to **AndroidManifest.xml**."}]},"type":{"type":"intrinsic","name":"number"}}],"type":{"type":"intrinsic","name":"void"}}]}],"typeParameters":[{"name":"Measurement","kind":131072}],"extendedBy":[{"type":"reference","name":"BarometerSensor"}]},{"name":"PermissionExpiration","kind":4194304,"comment":{"summary":[{"kind":"text","text":"Permission expiration time. Currently, all permissions are granted permanently."}]},"type":{"type":"union","types":[{"type":"literal","value":"never"},{"type":"intrinsic","name":"number"}]}},{"name":"PermissionResponse","kind":256,"comment":{"summary":[{"kind":"text","text":"An object obtained by permissions get and request functions."}]},"children":[{"name":"canAskAgain","kind":1024,"comment":{"summary":[{"kind":"text","text":"Indicates if user can be asked again for specific permission.\nIf not, one should be directed to the Settings app\nin order to enable/disable the permission."}]},"type":{"type":"intrinsic","name":"boolean"}},{"name":"expires","kind":1024,"comment":{"summary":[{"kind":"text","text":"Determines time when the permission expires."}]},"type":{"type":"reference","name":"PermissionExpiration"}},{"name":"granted","kind":1024,"comment":{"summary":[{"kind":"text","text":"A convenience boolean that indicates if the permission is granted."}]},"type":{"type":"intrinsic","name":"boolean"}},{"name":"status","kind":1024,"comment":{"summary":[{"kind":"text","text":"Determines the status of the permission."}]},"type":{"type":"reference","name":"PermissionStatus"}}]},{"name":"PermissionStatus","kind":8,"children":[{"name":"DENIED","kind":16,"comment":{"summary":[{"kind":"text","text":"User has denied the permission."}]},"type":{"type":"literal","value":"denied"}},{"name":"GRANTED","kind":16,"comment":{"summary":[{"kind":"text","text":"User has granted the permission."}]},"type":{"type":"literal","value":"granted"}},{"name":"UNDETERMINED","kind":16,"comment":{"summary":[{"kind":"text","text":"User hasn't granted or denied the permission yet."}]},"type":{"type":"literal","value":"undetermined"}}]},{"name":"Subscription","kind":4194304,"type":{"type":"reflection","declaration":{"name":"__type","kind":65536,"children":[{"name":"remove","kind":1024,"type":{"type":"reflection","declaration":{"name":"__type","kind":65536,"signatures":[{"name":"__type","kind":4096,"comment":{"summary":[{"kind":"text","text":"A method to unsubscribe the listener."}]},"type":{"type":"intrinsic","name":"void"}}]}}}]}}}]}
\ No newline at end of file
diff --git a/docs/public/static/data/v49.0.0/expo-battery.json b/docs/public/static/data/v49.0.0/expo-battery.json
new file mode 100644
index 0000000000000..84c53c9d02211
--- /dev/null
+++ b/docs/public/static/data/v49.0.0/expo-battery.json
@@ -0,0 +1 @@
+{"name":"expo-battery","kind":1,"children":[{"name":"BatteryState","kind":8,"children":[{"name":"CHARGING","kind":16,"comment":{"summary":[{"kind":"text","text":"if battery is charging."}]},"type":{"type":"literal","value":2}},{"name":"FULL","kind":16,"comment":{"summary":[{"kind":"text","text":"if the battery level is full."}]},"type":{"type":"literal","value":3}},{"name":"UNKNOWN","kind":16,"comment":{"summary":[{"kind":"text","text":"if the battery state is unknown or inaccessible."}]},"type":{"type":"literal","value":0}},{"name":"UNPLUGGED","kind":16,"comment":{"summary":[{"kind":"text","text":"if battery is not charging or discharging."}]},"type":{"type":"literal","value":1}}]},{"name":"BatteryLevelEvent","kind":4194304,"type":{"type":"reflection","declaration":{"name":"__type","kind":65536,"children":[{"name":"batteryLevel","kind":1024,"comment":{"summary":[{"kind":"text","text":"A number between "},{"kind":"code","text":"`0`"},{"kind":"text","text":" and "},{"kind":"code","text":"`1`"},{"kind":"text","text":", inclusive, or "},{"kind":"code","text":"`-1`"},{"kind":"text","text":" if the battery level is unknown."}]},"type":{"type":"intrinsic","name":"number"}}]}}},{"name":"BatteryStateEvent","kind":4194304,"type":{"type":"reflection","declaration":{"name":"__type","kind":65536,"children":[{"name":"batteryState","kind":1024,"comment":{"summary":[{"kind":"text","text":"An enum value representing the battery state."}]},"type":{"type":"reference","name":"BatteryState"}}]}}},{"name":"PowerModeEvent","kind":4194304,"type":{"type":"reflection","declaration":{"name":"__type","kind":65536,"children":[{"name":"lowPowerMode","kind":1024,"comment":{"summary":[{"kind":"text","text":"A boolean value, "},{"kind":"code","text":"`true`"},{"kind":"text","text":" if lowPowerMode is on, "},{"kind":"code","text":"`false`"},{"kind":"text","text":" if lowPowerMode is off"}]},"type":{"type":"intrinsic","name":"boolean"}}]}}},{"name":"PowerState","kind":4194304,"type":{"type":"reflection","declaration":{"name":"__type","kind":65536,"children":[{"name":"batteryLevel","kind":1024,"comment":{"summary":[{"kind":"text","text":"A number between "},{"kind":"code","text":"`0`"},{"kind":"text","text":" and "},{"kind":"code","text":"`1`"},{"kind":"text","text":", inclusive, or "},{"kind":"code","text":"`-1`"},{"kind":"text","text":" if the battery level is unknown."}]},"type":{"type":"intrinsic","name":"number"}},{"name":"batteryState","kind":1024,"comment":{"summary":[{"kind":"text","text":"An enum value representing the battery state."}]},"type":{"type":"reference","name":"BatteryState"}},{"name":"lowPowerMode","kind":1024,"comment":{"summary":[{"kind":"text","text":"A boolean value, "},{"kind":"code","text":"`true`"},{"kind":"text","text":" if lowPowerMode is on, "},{"kind":"code","text":"`false`"},{"kind":"text","text":" if lowPowerMode is off"}]},"type":{"type":"intrinsic","name":"boolean"}}]}}},{"name":"Subscription","kind":4194304,"type":{"type":"reflection","declaration":{"name":"__type","kind":65536,"children":[{"name":"remove","kind":1024,"type":{"type":"reflection","declaration":{"name":"__type","kind":65536,"signatures":[{"name":"__type","kind":4096,"comment":{"summary":[{"kind":"text","text":"A method to unsubscribe the listener."}]},"type":{"type":"intrinsic","name":"void"}}]}}}]}}},{"name":"addBatteryLevelListener","kind":64,"signatures":[{"name":"addBatteryLevelListener","kind":4096,"comment":{"summary":[{"kind":"text","text":"Subscribe to the battery level change updates.\n\nOn iOS devices, the event fires when the battery level drops one percent or more, but is only\nfired once per minute at maximum.\n\nOn Android devices, the event fires only when significant changes happens, which is when the\nbattery level drops below ["},{"kind":"code","text":"`\"android.intent.action.BATTERY_LOW\"`"},{"kind":"text","text":"](https://developer.android.com/reference/android/content/Intent#ACTION_BATTERY_LOW)\nor rises above ["},{"kind":"code","text":"`\"android.intent.action.BATTERY_OKAY\"`"},{"kind":"text","text":"](https://developer.android.com/reference/android/content/Intent#ACTION_BATTERY_OKAY)\nfrom a low battery level. See [here](https://developer.android.com/training/monitoring-device-state/battery-monitoring)\nto read more from the Android docs.\n\nOn web, the event never fires."}],"blockTags":[{"tag":"@returns","content":[{"kind":"text","text":"A "},{"kind":"code","text":"`Subscription`"},{"kind":"text","text":" object on which you can call "},{"kind":"code","text":"`remove()`"},{"kind":"text","text":" to unsubscribe from the listener.s"}]}]},"parameters":[{"name":"listener","kind":32768,"comment":{"summary":[{"kind":"text","text":"A callback that is invoked when battery level changes. The callback is provided a\nsingle argument that is an object with a "},{"kind":"code","text":"`batteryLevel`"},{"kind":"text","text":" key."}]},"type":{"type":"reflection","declaration":{"name":"__type","kind":65536,"signatures":[{"name":"__type","kind":4096,"parameters":[{"name":"event","kind":32768,"type":{"type":"reference","name":"BatteryLevelEvent"}}],"type":{"type":"intrinsic","name":"void"}}]}}}],"type":{"type":"reference","name":"Subscription"}}]},{"name":"addBatteryStateListener","kind":64,"signatures":[{"name":"addBatteryStateListener","kind":4096,"comment":{"summary":[{"kind":"text","text":"Subscribe to the battery state change updates to receive an object with a ["},{"kind":"code","text":"`Battery.BatteryState`"},{"kind":"text","text":"](#batterystate)\nenum value for whether the device is any of the four states.\n\nOn web, the event never fires."}],"blockTags":[{"tag":"@returns","content":[{"kind":"text","text":"A "},{"kind":"code","text":"`Subscription`"},{"kind":"text","text":" object on which you can call "},{"kind":"code","text":"`remove()`"},{"kind":"text","text":" to unsubscribe from the listener."}]}]},"parameters":[{"name":"listener","kind":32768,"comment":{"summary":[{"kind":"text","text":"A callback that is invoked when battery state changes. The callback is provided a\nsingle argument that is an object with a "},{"kind":"code","text":"`batteryState`"},{"kind":"text","text":" key."}]},"type":{"type":"reflection","declaration":{"name":"__type","kind":65536,"signatures":[{"name":"__type","kind":4096,"parameters":[{"name":"event","kind":32768,"type":{"type":"reference","name":"BatteryStateEvent"}}],"type":{"type":"intrinsic","name":"void"}}]}}}],"type":{"type":"reference","name":"Subscription"}}]},{"name":"addLowPowerModeListener","kind":64,"signatures":[{"name":"addLowPowerModeListener","kind":4096,"comment":{"summary":[{"kind":"text","text":"Subscribe to Low Power Mode (iOS) or Power Saver Mode (Android) updates. The event fires whenever\nthe power mode is toggled.\n\nOn web, the event never fires."}],"blockTags":[{"tag":"@returns","content":[{"kind":"text","text":"A "},{"kind":"code","text":"`Subscription`"},{"kind":"text","text":" object on which you can call "},{"kind":"code","text":"`remove()`"},{"kind":"text","text":" to unsubscribe from the listener."}]}]},"parameters":[{"name":"listener","kind":32768,"comment":{"summary":[{"kind":"text","text":"A callback that is invoked when Low Power Mode (iOS) or Power Saver Mode (Android)\nchanges. The callback is provided a single argument that is an object with a "},{"kind":"code","text":"`lowPowerMode`"},{"kind":"text","text":" key."}]},"type":{"type":"reflection","declaration":{"name":"__type","kind":65536,"signatures":[{"name":"__type","kind":4096,"parameters":[{"name":"event","kind":32768,"type":{"type":"reference","name":"PowerModeEvent"}}],"type":{"type":"intrinsic","name":"void"}}]}}}],"type":{"type":"reference","name":"Subscription"}}]},{"name":"getBatteryLevelAsync","kind":64,"signatures":[{"name":"getBatteryLevelAsync","kind":4096,"comment":{"summary":[{"kind":"text","text":"Gets the battery level of the device as a number between "},{"kind":"code","text":"`0`"},{"kind":"text","text":" and "},{"kind":"code","text":"`1`"},{"kind":"text","text":", inclusive. If the device\ndoes not support retrieving the battery level, this method returns "},{"kind":"code","text":"`-1`"},{"kind":"text","text":". On web, this method\nalways returns "},{"kind":"code","text":"`-1`"},{"kind":"text","text":"."}],"blockTags":[{"tag":"@returns","content":[{"kind":"text","text":"A "},{"kind":"code","text":"`Promise`"},{"kind":"text","text":" that fulfils with a number between "},{"kind":"code","text":"`0`"},{"kind":"text","text":" and "},{"kind":"code","text":"`1`"},{"kind":"text","text":" representing the battery level,\nor "},{"kind":"code","text":"`-1`"},{"kind":"text","text":" if the device does not provide it."}]},{"tag":"@example","content":[{"kind":"code","text":"```ts\nawait Battery.getBatteryLevelAsync();\n// 0.759999\n```"}]}]},"type":{"type":"reference","typeArguments":[{"type":"intrinsic","name":"number"}],"name":"Promise","qualifiedName":"Promise","package":"typescript"}}]},{"name":"getBatteryStateAsync","kind":64,"signatures":[{"name":"getBatteryStateAsync","kind":4096,"comment":{"summary":[{"kind":"text","text":"Tells the battery's current state. On web, this always returns "},{"kind":"code","text":"`BatteryState.UNKNOWN`"},{"kind":"text","text":"."}],"blockTags":[{"tag":"@returns","content":[{"kind":"text","text":"Returns a "},{"kind":"code","text":"`Promise`"},{"kind":"text","text":" which fulfills with a ["},{"kind":"code","text":"`Battery.BatteryState`"},{"kind":"text","text":"](#batterystate) enum\nvalue for whether the device is any of the four states."}]},{"tag":"@example","content":[{"kind":"code","text":"```ts\nawait Battery.getBatteryStateAsync();\n// BatteryState.CHARGING\n```"}]}]},"type":{"type":"reference","typeArguments":[{"type":"reference","name":"BatteryState"}],"name":"Promise","qualifiedName":"Promise","package":"typescript"}}]},{"name":"getPowerStateAsync","kind":64,"signatures":[{"name":"getPowerStateAsync","kind":4096,"comment":{"summary":[{"kind":"text","text":"Gets the power state of the device including the battery level, whether it is plugged in, and if\nthe system is currently operating in Low Power Mode (iOS) or Power Saver Mode (Android). This\nmethod re-throws any errors that occur when retrieving any of the power-state information."}],"blockTags":[{"tag":"@returns","content":[{"kind":"text","text":"Returns a "},{"kind":"code","text":"`Promise`"},{"kind":"text","text":" which fulfills with ["},{"kind":"code","text":"`PowerState`"},{"kind":"text","text":"](#powerstate) object."}]},{"tag":"@example","content":[{"kind":"code","text":"```ts\nawait Battery.getPowerStateAsync();\n// {\n// batteryLevel: 0.759999,\n// batteryState: BatteryState.UNPLUGGED,\n// lowPowerMode: true,\n// }\n```"}]}]},"type":{"type":"reference","typeArguments":[{"type":"reference","name":"PowerState"}],"name":"Promise","qualifiedName":"Promise","package":"typescript"}}]},{"name":"isAvailableAsync","kind":64,"signatures":[{"name":"isAvailableAsync","kind":4096,"comment":{"summary":[{"kind":"text","text":"Resolves with whether the battery API is available on the current device. The value of this\nproperty is "},{"kind":"code","text":"`true`"},{"kind":"text","text":" on Android and physical iOS devices and "},{"kind":"code","text":"`false`"},{"kind":"text","text":" on iOS simulators. On web,\nit depends on whether the browser supports the web battery API."}]},"type":{"type":"reference","typeArguments":[{"type":"intrinsic","name":"boolean"}],"name":"Promise","qualifiedName":"Promise","package":"typescript"}}]},{"name":"isBatteryOptimizationEnabledAsync","kind":64,"signatures":[{"name":"isBatteryOptimizationEnabledAsync","kind":4096,"comment":{"summary":[{"kind":"text","text":"Checks whether battery optimization is enabled for your application.\nIf battery optimization is enabled for your app, background tasks might be affected\nwhen your app goes into doze mode state. (only on Android 6.0 or later)"}],"blockTags":[{"tag":"@returns","content":[{"kind":"text","text":"Returns a "},{"kind":"code","text":"`Promise`"},{"kind":"text","text":" which fulfills with a "},{"kind":"code","text":"`boolean`"},{"kind":"text","text":" value of either "},{"kind":"code","text":"`true`"},{"kind":"text","text":" or "},{"kind":"code","text":"`false`"},{"kind":"text","text":",\nindicating whether the battery optimization is enabled or disabled, respectively. (Android only)"}]},{"tag":"@example","content":[{"kind":"code","text":"```ts\nawait Battery.isBatteryOptimizationEnabledAsync();\n// true\n```"}]}]},"type":{"type":"reference","typeArguments":[{"type":"intrinsic","name":"boolean"}],"name":"Promise","qualifiedName":"Promise","package":"typescript"}}]},{"name":"isLowPowerModeEnabledAsync","kind":64,"signatures":[{"name":"isLowPowerModeEnabledAsync","kind":4096,"comment":{"summary":[{"kind":"text","text":"Gets the current status of Low Power mode on iOS and Power Saver mode on Android. If a platform\ndoesn't support Low Power mode reporting (like web, older Android devices), the reported low-power\nstate is always "},{"kind":"code","text":"`false`"},{"kind":"text","text":", even if the device is actually in low-power mode."}],"blockTags":[{"tag":"@returns","content":[{"kind":"text","text":"Returns a "},{"kind":"code","text":"`Promise`"},{"kind":"text","text":" which fulfills with a "},{"kind":"code","text":"`boolean`"},{"kind":"text","text":" value of either "},{"kind":"code","text":"`true`"},{"kind":"text","text":" or "},{"kind":"code","text":"`false`"},{"kind":"text","text":",\nindicating whether low power mode is enabled or disabled, respectively."}]},{"tag":"@example","content":[{"kind":"text","text":"Low Power Mode (iOS) or Power Saver Mode (Android) are enabled.\n"},{"kind":"code","text":"```ts\nawait Battery.isLowPowerModeEnabledAsync();\n// true\n```"}]}]},"type":{"type":"reference","typeArguments":[{"type":"intrinsic","name":"boolean"}],"name":"Promise","qualifiedName":"Promise","package":"typescript"}}]},{"name":"useBatteryLevel","kind":64,"signatures":[{"name":"useBatteryLevel","kind":4096,"comment":{"summary":[{"kind":"text","text":"Gets the device's battery level, as in ["},{"kind":"code","text":"`getBatteryLevelAsync`"},{"kind":"text","text":"](#getbatterylevelasync)."}],"blockTags":[{"tag":"@example","content":[{"kind":"code","text":"```ts\nconst batteryLevel = useBatteryLevel();\n```"}]},{"tag":"@returns","content":[{"kind":"text","text":"The battery level of the device"}]}]},"type":{"type":"intrinsic","name":"number"}}]},{"name":"useBatteryState","kind":64,"signatures":[{"name":"useBatteryState","kind":4096,"comment":{"summary":[{"kind":"text","text":"Gets the device's battery state, as in ["},{"kind":"code","text":"`getBatteryStateAsync`"},{"kind":"text","text":"](#getbatterystateasync)."}],"blockTags":[{"tag":"@example","content":[{"kind":"code","text":"```ts\nconst batteryState = useBatteryState();\n```"}]},{"tag":"@returns","content":[{"kind":"text","text":"The battery state of the device"}]}]},"type":{"type":"reference","name":"BatteryState"}}]},{"name":"useLowPowerMode","kind":64,"signatures":[{"name":"useLowPowerMode","kind":4096,"comment":{"summary":[{"kind":"text","text":"Boolean that indicates if the device is in low power or power saver mode, as in ["},{"kind":"code","text":"`isLowPowerModeEnabledAsync`"},{"kind":"text","text":"](#islowpowermodeenabledasync)."}],"blockTags":[{"tag":"@example","content":[{"kind":"code","text":"```ts\nconst lowPowerMode = useLowPowerMode();\n```"}]},{"tag":"@returns","content":[{"kind":"text","text":"boolean indicating if the device is in low power mode"}]}]},"type":{"type":"intrinsic","name":"boolean"}}]},{"name":"usePowerState","kind":64,"signatures":[{"name":"usePowerState","kind":4096,"comment":{"summary":[{"kind":"text","text":"Gets the device's power state information, as in ["},{"kind":"code","text":"`getPowerStateAsync`"},{"kind":"text","text":"](#getpowerstateasync)."}],"blockTags":[{"tag":"@example","content":[{"kind":"code","text":"```ts\nconst { lowPowerMode, batteryLevel, batteryState } = usePowerState();\n```"}]},{"tag":"@returns","content":[{"kind":"text","text":"power state information"}]}]},"type":{"type":"reference","name":"PowerState"}}]}]}
\ No newline at end of file
diff --git a/docs/public/static/data/v49.0.0/expo-blur.json b/docs/public/static/data/v49.0.0/expo-blur.json
new file mode 100644
index 0000000000000..0889b0408007b
--- /dev/null
+++ b/docs/public/static/data/v49.0.0/expo-blur.json
@@ -0,0 +1 @@
+{"name":"expo-blur","kind":1,"children":[{"name":"BlurView","kind":128,"children":[{"name":"constructor","kind":512,"flags":{"isExternal":true},"signatures":[{"name":"new BlurView","kind":16384,"flags":{"isExternal":true},"parameters":[{"name":"props","kind":32768,"flags":{"isExternal":true},"type":{"type":"union","types":[{"type":"reference","name":"BlurViewProps"},{"type":"reference","typeArguments":[{"type":"reference","name":"BlurViewProps"}],"name":"Readonly","qualifiedName":"Readonly","package":"typescript"}]}}],"type":{"type":"reference","name":"default"},"inheritedFrom":{"type":"reference","name":"React.Component.constructor"}},{"name":"new BlurView","kind":16384,"flags":{"isExternal":true},"comment":{"summary":[],"blockTags":[{"tag":"@deprecated","content":[]},{"tag":"@see","content":[{"kind":"text","text":"https://reactjs.org/docs/legacy-context.html"}]}]},"parameters":[{"name":"props","kind":32768,"flags":{"isExternal":true},"type":{"type":"reference","name":"BlurViewProps"}},{"name":"context","kind":32768,"flags":{"isExternal":true},"type":{"type":"intrinsic","name":"any"}}],"type":{"type":"reference","name":"default"},"inheritedFrom":{"type":"reference","name":"React.Component.constructor"}}],"inheritedFrom":{"type":"reference","name":"React.Component.constructor"}},{"name":"blurViewRef","kind":1024,"flags":{"isOptional":true},"type":{"type":"reference","typeArguments":[{"type":"reference","typeArguments":[{"type":"intrinsic","name":"any"}],"name":"ComponentType","qualifiedName":"React.ComponentType","package":"@types/react"}],"name":"RefObject","qualifiedName":"React.RefObject","package":"@types/react"},"defaultValue":"..."},{"name":"render","kind":2048,"signatures":[{"name":"render","kind":4096,"type":{"type":"reference","name":"Element","qualifiedName":"global.JSX.Element","package":"@types/react"},"overwrites":{"type":"reference","name":"React.Component.render"}}],"overwrites":{"type":"reference","name":"React.Component.render"}}],"extendedTypes":[{"type":"reference","typeArguments":[{"type":"reference","name":"BlurViewProps"}],"name":"Component","qualifiedName":"React.Component","package":"@types/react"}]},{"name":"BlurTint","kind":4194304,"type":{"type":"union","types":[{"type":"literal","value":"light"},{"type":"literal","value":"dark"},{"type":"literal","value":"default"}]}},{"name":"BlurViewProps","kind":4194304,"type":{"type":"intersection","types":[{"type":"reflection","declaration":{"name":"__type","kind":65536,"children":[{"name":"blurReductionFactor","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"A number by which the blur intensity will be divided on Android.\n\nDue to platform differences blurs on Android and iOS vary slightly and might look different\nat different intensity levels. This property can be used to fine tune blur intensity on Android to match it\nmore closely with iOS."}],"blockTags":[{"tag":"@default","content":[{"kind":"text","text":"4"}]},{"tag":"@platform","content":[{"kind":"text","text":"android"}]}]},"type":{"type":"intrinsic","name":"number"}},{"name":"intensity","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"A number from "},{"kind":"code","text":"`1`"},{"kind":"text","text":" to "},{"kind":"code","text":"`100`"},{"kind":"text","text":" to control the intensity of the blur effect.\n\nYou can animate this property using "},{"kind":"code","text":"`react-native-reanimated`"},{"kind":"text","text":"."}],"blockTags":[{"tag":"@default","content":[{"kind":"text","text":"50"}]}]},"type":{"type":"intrinsic","name":"number"}},{"name":"tint","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"A tint mode which will be applied to the view."}],"blockTags":[{"tag":"@default","content":[{"kind":"text","text":"'default'"}]}]},"type":{"type":"reference","name":"BlurTint"}}]}},{"type":"reference","name":"ViewProps","qualifiedName":"ViewProps","package":"react-native"}]}}]}
\ No newline at end of file
diff --git a/docs/public/static/data/v49.0.0/expo-brightness.json b/docs/public/static/data/v49.0.0/expo-brightness.json
new file mode 100644
index 0000000000000..e883f4ee3917b
--- /dev/null
+++ b/docs/public/static/data/v49.0.0/expo-brightness.json
@@ -0,0 +1 @@
+{"name":"expo-brightness","kind":1,"children":[{"name":"BrightnessMode","kind":8,"children":[{"name":"AUTOMATIC","kind":16,"comment":{"summary":[{"kind":"text","text":"Mode in which the device OS will automatically adjust the screen brightness depending on the\nambient light."}]},"type":{"type":"literal","value":1}},{"name":"MANUAL","kind":16,"comment":{"summary":[{"kind":"text","text":"Mode in which the screen brightness will remain constant and will not be adjusted by the OS."}]},"type":{"type":"literal","value":2}},{"name":"UNKNOWN","kind":16,"comment":{"summary":[{"kind":"text","text":"Means that the current brightness mode cannot be determined."}]},"type":{"type":"literal","value":0}}]},{"name":"PermissionStatus","kind":8,"children":[{"name":"DENIED","kind":16,"comment":{"summary":[{"kind":"text","text":"User has denied the permission."}]},"type":{"type":"literal","value":"denied"}},{"name":"GRANTED","kind":16,"comment":{"summary":[{"kind":"text","text":"User has granted the permission."}]},"type":{"type":"literal","value":"granted"}},{"name":"UNDETERMINED","kind":16,"comment":{"summary":[{"kind":"text","text":"User hasn't granted or denied the permission yet."}]},"type":{"type":"literal","value":"undetermined"}}]},{"name":"PermissionResponse","kind":256,"comment":{"summary":[{"kind":"text","text":"An object obtained by permissions get and request functions."}]},"children":[{"name":"canAskAgain","kind":1024,"comment":{"summary":[{"kind":"text","text":"Indicates if user can be asked again for specific permission.\nIf not, one should be directed to the Settings app\nin order to enable/disable the permission."}]},"type":{"type":"intrinsic","name":"boolean"}},{"name":"expires","kind":1024,"comment":{"summary":[{"kind":"text","text":"Determines time when the permission expires."}]},"type":{"type":"reference","name":"PermissionExpiration"}},{"name":"granted","kind":1024,"comment":{"summary":[{"kind":"text","text":"A convenience boolean that indicates if the permission is granted."}]},"type":{"type":"intrinsic","name":"boolean"}},{"name":"status","kind":1024,"comment":{"summary":[{"kind":"text","text":"Determines the status of the permission."}]},"type":{"type":"reference","name":"PermissionStatus"}}]},{"name":"BrightnessEvent","kind":4194304,"type":{"type":"reflection","declaration":{"name":"__type","kind":65536,"children":[{"name":"brightness","kind":1024,"comment":{"summary":[{"kind":"text","text":"A number between "},{"kind":"code","text":"`0`"},{"kind":"text","text":" and "},{"kind":"code","text":"`1`"},{"kind":"text","text":", inclusive, representing the current screen brightness."}]},"type":{"type":"intrinsic","name":"number"}}]}}},{"name":"PermissionExpiration","kind":4194304,"comment":{"summary":[{"kind":"text","text":"Permission expiration time. Currently, all permissions are granted permanently."}]},"type":{"type":"union","types":[{"type":"literal","value":"never"},{"type":"intrinsic","name":"number"}]}},{"name":"PermissionHookOptions","kind":4194304,"typeParameters":[{"name":"Options","kind":131072,"type":{"type":"intrinsic","name":"object"}}],"type":{"type":"intersection","types":[{"type":"reference","name":"PermissionHookBehavior"},{"type":"reference","name":"Options"}]}},{"name":"addBrightnessListener","kind":64,"signatures":[{"name":"addBrightnessListener","kind":4096,"comment":{"summary":[{"kind":"text","text":"Subscribe to brightness (iOS) updates. The event fires whenever\nthe power mode is toggled.\n\nOn web and android the event never fires."}],"blockTags":[{"tag":"@returns","content":[{"kind":"text","text":"A "},{"kind":"code","text":"`Subscription`"},{"kind":"text","text":" object on which you can call "},{"kind":"code","text":"`remove()`"},{"kind":"text","text":" to unsubscribe from the listener."}]},{"tag":"@platform","content":[{"kind":"text","text":"ios"}]}]},"parameters":[{"name":"listener","kind":32768,"comment":{"summary":[{"kind":"text","text":"A callback that is invoked when brightness (iOS) changes.\nThe callback is provided a single argument that is an object with a "},{"kind":"code","text":"`brightness`"},{"kind":"text","text":" key."}]},"type":{"type":"reflection","declaration":{"name":"__type","kind":65536,"signatures":[{"name":"__type","kind":4096,"parameters":[{"name":"event","kind":32768,"type":{"type":"reference","name":"BrightnessEvent"}}],"type":{"type":"intrinsic","name":"void"}}]}}}],"type":{"type":"reference","name":"Subscription"}}]},{"name":"getBrightnessAsync","kind":64,"signatures":[{"name":"getBrightnessAsync","kind":4096,"comment":{"summary":[{"kind":"text","text":"Gets the current brightness level of the device's main screen."}],"blockTags":[{"tag":"@returns","content":[{"kind":"text","text":"A "},{"kind":"code","text":"`Promise`"},{"kind":"text","text":" that fulfils with a number between "},{"kind":"code","text":"`0`"},{"kind":"text","text":" and "},{"kind":"code","text":"`1`"},{"kind":"text","text":", inclusive, representing the\ncurrent screen brightness."}]}]},"type":{"type":"reference","typeArguments":[{"type":"intrinsic","name":"number"}],"name":"Promise","qualifiedName":"Promise","package":"typescript"}}]},{"name":"getPermissionsAsync","kind":64,"signatures":[{"name":"getPermissionsAsync","kind":4096,"comment":{"summary":[{"kind":"text","text":"Checks user's permissions for accessing system brightness."}],"blockTags":[{"tag":"@returns","content":[{"kind":"text","text":"A promise that fulfils with an object of type [PermissionResponse](#permissionrespons)."}]}]},"type":{"type":"reference","typeArguments":[{"type":"reference","name":"PermissionResponse"}],"name":"Promise","qualifiedName":"Promise","package":"typescript"}}]},{"name":"getSystemBrightnessAsync","kind":64,"signatures":[{"name":"getSystemBrightnessAsync","kind":4096,"comment":{"summary":[{"kind":"text","text":"Gets the global system screen brightness."}],"blockTags":[{"tag":"@returns","content":[{"kind":"text","text":"A "},{"kind":"code","text":"`Promise`"},{"kind":"text","text":" that is resolved with a number between "},{"kind":"code","text":"`0`"},{"kind":"text","text":" and "},{"kind":"code","text":"`1`"},{"kind":"text","text":", inclusive, representing\nthe current system screen brightness."}]},{"tag":"@platform","content":[{"kind":"text","text":"android"}]}]},"type":{"type":"reference","typeArguments":[{"type":"intrinsic","name":"number"}],"name":"Promise","qualifiedName":"Promise","package":"typescript"}}]},{"name":"getSystemBrightnessModeAsync","kind":64,"signatures":[{"name":"getSystemBrightnessModeAsync","kind":4096,"comment":{"summary":[{"kind":"text","text":"Gets the system brightness mode (e.g. whether or not the OS will automatically\nadjust the screen brightness depending on ambient light)."}],"blockTags":[{"tag":"@returns","content":[{"kind":"text","text":"A "},{"kind":"code","text":"`Promise`"},{"kind":"text","text":" that fulfils with a ["},{"kind":"code","text":"`BrightnessMode`"},{"kind":"text","text":"](#brightnessmode). Requires\n"},{"kind":"code","text":"`SYSTEM_BRIGHTNESS`"},{"kind":"text","text":" permissions."}]},{"tag":"@platform","content":[{"kind":"text","text":"android"}]}]},"type":{"type":"reference","typeArguments":[{"type":"reference","name":"BrightnessMode"}],"name":"Promise","qualifiedName":"Promise","package":"typescript"}}]},{"name":"isAvailableAsync","kind":64,"signatures":[{"name":"isAvailableAsync","kind":4096,"comment":{"summary":[{"kind":"text","text":"Returns whether the Brightness API is enabled on the current device. This does not check the app\npermissions."}],"blockTags":[{"tag":"@returns","content":[{"kind":"text","text":"Async "},{"kind":"code","text":"`boolean`"},{"kind":"text","text":", indicating whether the Brightness API is available on the current device.\nCurrently this resolves "},{"kind":"code","text":"`true`"},{"kind":"text","text":" on iOS and Android only."}]}]},"type":{"type":"reference","typeArguments":[{"type":"intrinsic","name":"boolean"}],"name":"Promise","qualifiedName":"Promise","package":"typescript"}}]},{"name":"isUsingSystemBrightnessAsync","kind":64,"signatures":[{"name":"isUsingSystemBrightnessAsync","kind":4096,"comment":{"summary":[{"kind":"text","text":"Returns a boolean specifying whether or not the current activity is using the\nsystem-wide brightness value."}],"blockTags":[{"tag":"@returns","content":[{"kind":"text","text":"A "},{"kind":"code","text":"`Promise`"},{"kind":"text","text":" that fulfils with "},{"kind":"code","text":"`true`"},{"kind":"text","text":" when the current activity is using the system-wide\nbrightness value, and "},{"kind":"code","text":"`false`"},{"kind":"text","text":" otherwise."}]},{"tag":"@platform","content":[{"kind":"text","text":"android"}]}]},"type":{"type":"reference","typeArguments":[{"type":"intrinsic","name":"boolean"}],"name":"Promise","qualifiedName":"Promise","package":"typescript"}}]},{"name":"requestPermissionsAsync","kind":64,"signatures":[{"name":"requestPermissionsAsync","kind":4096,"comment":{"summary":[{"kind":"text","text":"Asks the user to grant permissions for accessing system brightness."}],"blockTags":[{"tag":"@returns","content":[{"kind":"text","text":"A promise that fulfils with an object of type [PermissionResponse](#permissionrespons)."}]}]},"type":{"type":"reference","typeArguments":[{"type":"reference","name":"PermissionResponse"}],"name":"Promise","qualifiedName":"Promise","package":"typescript"}}]},{"name":"restoreSystemBrightnessAsync","kind":64,"signatures":[{"name":"restoreSystemBrightnessAsync","kind":4096,"comment":{"summary":[{"kind":"text","text":"Resets the brightness setting of the current activity to use the system-wide\nbrightness value rather than overriding it."}],"blockTags":[{"tag":"@returns","content":[{"kind":"text","text":"A "},{"kind":"code","text":"`Promise`"},{"kind":"text","text":" that fulfils when the setting has been successfully changed."}]},{"tag":"@platform","content":[{"kind":"text","text":"android"}]}]},"type":{"type":"reference","typeArguments":[{"type":"intrinsic","name":"void"}],"name":"Promise","qualifiedName":"Promise","package":"typescript"}}]},{"name":"setBrightnessAsync","kind":64,"signatures":[{"name":"setBrightnessAsync","kind":4096,"comment":{"summary":[{"kind":"text","text":"Sets the current screen brightness. On iOS, this setting will persist until the device is locked,\nafter which the screen brightness will revert to the user's default setting. On Android, this\nsetting only applies to the current activity; it will override the system brightness value\nwhenever your app is in the foreground."}],"blockTags":[{"tag":"@returns","content":[{"kind":"text","text":"A "},{"kind":"code","text":"`Promise`"},{"kind":"text","text":" that fulfils when the brightness has been successfully set."}]}]},"parameters":[{"name":"brightnessValue","kind":32768,"comment":{"summary":[{"kind":"text","text":"A number between "},{"kind":"code","text":"`0`"},{"kind":"text","text":" and "},{"kind":"code","text":"`1`"},{"kind":"text","text":", inclusive, representing the desired screen\nbrightness."}]},"type":{"type":"intrinsic","name":"number"}}],"type":{"type":"reference","typeArguments":[{"type":"intrinsic","name":"void"}],"name":"Promise","qualifiedName":"Promise","package":"typescript"}}]},{"name":"setSystemBrightnessAsync","kind":64,"signatures":[{"name":"setSystemBrightnessAsync","kind":4096,"comment":{"summary":[{"kind":"text","text":"> __WARNING:__ This method is experimental.\n\nSets the global system screen brightness and changes the brightness mode to\n"},{"kind":"code","text":"`MANUAL`"},{"kind":"text","text":". Requires "},{"kind":"code","text":"`SYSTEM_BRIGHTNESS`"},{"kind":"text","text":" permissions."}],"blockTags":[{"tag":"@returns","content":[{"kind":"text","text":"A "},{"kind":"code","text":"`Promise`"},{"kind":"text","text":" that fulfils when the brightness has been successfully set."}]},{"tag":"@platform","content":[{"kind":"text","text":"android"}]}]},"parameters":[{"name":"brightnessValue","kind":32768,"comment":{"summary":[{"kind":"text","text":"A number between "},{"kind":"code","text":"`0`"},{"kind":"text","text":" and "},{"kind":"code","text":"`1`"},{"kind":"text","text":", inclusive, representing the desired screen\nbrightness."}]},"type":{"type":"intrinsic","name":"number"}}],"type":{"type":"reference","typeArguments":[{"type":"intrinsic","name":"void"}],"name":"Promise","qualifiedName":"Promise","package":"typescript"}}]},{"name":"setSystemBrightnessModeAsync","kind":64,"signatures":[{"name":"setSystemBrightnessModeAsync","kind":4096,"comment":{"summary":[{"kind":"text","text":"Sets the system brightness mode."}],"blockTags":[{"tag":"@platform","content":[{"kind":"text","text":"android"}]}]},"parameters":[{"name":"brightnessMode","kind":32768,"comment":{"summary":[{"kind":"text","text":"One of "},{"kind":"code","text":"`BrightnessMode.MANUAL`"},{"kind":"text","text":" or "},{"kind":"code","text":"`BrightnessMode.AUTOMATIC`"},{"kind":"text","text":". The system\nbrightness mode cannot be set to "},{"kind":"code","text":"`BrightnessMode.UNKNOWN`"},{"kind":"text","text":"."}]},"type":{"type":"reference","name":"BrightnessMode"}}],"type":{"type":"reference","typeArguments":[{"type":"intrinsic","name":"void"}],"name":"Promise","qualifiedName":"Promise","package":"typescript"}}]},{"name":"usePermissions","kind":64,"signatures":[{"name":"usePermissions","kind":4096,"comment":{"summary":[{"kind":"text","text":"Check or request permissions to modify the system brightness.\nThis uses both "},{"kind":"code","text":"`requestPermissionAsync`"},{"kind":"text","text":" and "},{"kind":"code","text":"`getPermissionsAsync`"},{"kind":"text","text":" to interact with the permissions."}],"blockTags":[{"tag":"@example","content":[{"kind":"code","text":"```ts\nconst [permissionResponse, requestPermission] = Brightness.usePermissions();\n```"}]}]},"parameters":[{"name":"options","kind":32768,"flags":{"isOptional":true},"type":{"type":"reference","typeArguments":[{"type":"intrinsic","name":"object"}],"name":"PermissionHookOptions"}}],"type":{"type":"tuple","elements":[{"type":"union","types":[{"type":"literal","value":null},{"type":"reference","name":"PermissionResponse"}]},{"type":"reference","typeArguments":[{"type":"reference","name":"PermissionResponse"}],"name":"RequestPermissionMethod"},{"type":"reference","typeArguments":[{"type":"reference","name":"PermissionResponse"}],"name":"GetPermissionMethod"}]}}]},{"name":"useSystemBrightnessAsync","kind":64,"signatures":[{"name":"useSystemBrightnessAsync","kind":4096,"comment":{"summary":[],"blockTags":[{"tag":"@deprecated","content":[{"kind":"text","text":"Use ["},{"kind":"code","text":"`restoreSystemBrightnessAsync`"},{"kind":"text","text":"](#brightnessrestoresystembrightnessasync) method instead."}]},{"tag":"@platform","content":[{"kind":"text","text":"android"}]}]},"type":{"type":"reference","typeArguments":[{"type":"intrinsic","name":"void"}],"name":"Promise","qualifiedName":"Promise","package":"typescript"}}]}]}
\ No newline at end of file
diff --git a/docs/public/static/data/v49.0.0/expo-build-properties.json b/docs/public/static/data/v49.0.0/expo-build-properties.json
new file mode 100644
index 0000000000000..c75e4be4484e9
--- /dev/null
+++ b/docs/public/static/data/v49.0.0/expo-build-properties.json
@@ -0,0 +1 @@
+{"name":"expo-build-properties","kind":1,"children":[{"name":"default","kind":8388608},{"name":"ExtraIosPodDependency","kind":256,"comment":{"summary":[{"kind":"text","text":"Interface representing extra CocoaPods dependency."}],"blockTags":[{"tag":"@see","content":[{"kind":"text","text":"[Podfile syntax reference](https://guides.cocoapods.org/syntax/podfile.html#pod)"}]},{"tag":"@platform","content":[{"kind":"text","text":"ios"}]}]},"children":[{"name":"branch","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"The git branch to fetch. See the "},{"kind":"inline-tag","tag":"@link","text":"git"},{"kind":"text","text":" property for more information."}]},"type":{"type":"intrinsic","name":"string"}},{"name":"commit","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"The git commit to fetch. See the "},{"kind":"inline-tag","tag":"@link","text":"git"},{"kind":"text","text":" property for more information."}]},"type":{"type":"intrinsic","name":"string"}},{"name":"configurations","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"Build configurations for which the pod should be installed."}],"blockTags":[{"tag":"@example","content":[{"kind":"code","text":"`['Debug', 'Release']`"}]}]},"type":{"type":"array","elementType":{"type":"intrinsic","name":"string"}}},{"name":"git","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"Use the bleeding edge version of a Pod."}],"blockTags":[{"tag":"@example","content":[{"kind":"code","text":"```\n{ \"name\": \"AFNetworking\", \"git\": \"https://github.com/gowalla/AFNetworking.git\", \"tag\": \"0.7.0\" }\n```"},{"kind":"text","text":"\n\nThis acts like to add this pod dependency statement:\n"},{"kind":"code","text":"```\npod 'AFNetworking', :git => 'https://github.com/gowalla/AFNetworking.git', :tag => '0.7.0'\n```"}]}]},"type":{"type":"intrinsic","name":"string"}},{"name":"modular_headers","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"Whether this pod should use modular headers."}]},"type":{"type":"intrinsic","name":"boolean"}},{"name":"name","kind":1024,"comment":{"summary":[{"kind":"text","text":"Name of the pod."}]},"type":{"type":"intrinsic","name":"string"}},{"name":"path","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"Custom local filesystem path to add the dependency."}],"blockTags":[{"tag":"@example","content":[{"kind":"code","text":"`~/Documents/AFNetworking`"}]}]},"type":{"type":"intrinsic","name":"string"}},{"name":"podspec","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"Custom podspec path."}],"blockTags":[{"tag":"@example","content":[{"kind":"code","text":"`https://example.com/JSONKit.podspec`"}]}]},"type":{"type":"intrinsic","name":"string"}},{"name":"source","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"Custom source to search for this dependency."}],"blockTags":[{"tag":"@example","content":[{"kind":"code","text":"`https://github.com/CocoaPods/Specs.git`"}]}]},"type":{"type":"intrinsic","name":"string"}},{"name":"tag","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"The git tag to fetch. See the "},{"kind":"inline-tag","tag":"@link","text":"git"},{"kind":"text","text":" property for more information."}]},"type":{"type":"intrinsic","name":"string"}},{"name":"testspecs","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"Test specs can be optionally included via the :testspecs option. By default, none of a Pod's test specs are included."}],"blockTags":[{"tag":"@example","content":[{"kind":"code","text":"`['UnitTests', 'SomeOtherTests']`"}]}]},"type":{"type":"array","elementType":{"type":"intrinsic","name":"string"}}},{"name":"version","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"Version of the pod.\nCocoaPods supports various [versioning options](https://guides.cocoapods.org/using/the-podfile.html#pod)."}],"blockTags":[{"tag":"@example","content":[{"kind":"code","text":"`~> 0.1.2`"}]}]},"type":{"type":"intrinsic","name":"string"}}]},{"name":"PluginConfigType","kind":256,"comment":{"summary":[{"kind":"text","text":"Interface representing base build properties configuration."}]},"children":[{"name":"android","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"Interface representing available configuration for Android native build properties."}],"blockTags":[{"tag":"@platform","content":[{"kind":"text","text":"android"}]}]},"type":{"type":"reference","name":"PluginConfigTypeAndroid"}},{"name":"ios","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"Interface representing available configuration for iOS native build properties."}],"blockTags":[{"tag":"@platform","content":[{"kind":"text","text":"ios"}]}]},"type":{"type":"reference","name":"PluginConfigTypeIos"}}]},{"name":"PluginConfigTypeAndroid","kind":256,"comment":{"summary":[{"kind":"text","text":"Interface representing available configuration for Android native build properties."}],"blockTags":[{"tag":"@platform","content":[{"kind":"text","text":"android"}]}]},"children":[{"name":"buildToolsVersion","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"Override the default "},{"kind":"code","text":"`buildToolsVersion`"},{"kind":"text","text":" version number in **build.gradle**."}]},"type":{"type":"intrinsic","name":"string"}},{"name":"compileSdkVersion","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"Override the default "},{"kind":"code","text":"`compileSdkVersion`"},{"kind":"text","text":" version number in **build.gradle**."}]},"type":{"type":"intrinsic","name":"number"}},{"name":"enableProguardInReleaseBuilds","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"Enable [Proguard or R8](https://developer.android.com/studio/build/shrink-code) in release builds to obfuscate Java code and reduce app size."}]},"type":{"type":"intrinsic","name":"boolean"}},{"name":"enableShrinkResourcesInReleaseBuilds","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"Enable ["},{"kind":"code","text":"`shrinkResources`"},{"kind":"text","text":"](https://developer.android.com/studio/build/shrink-code#shrink-resources) in release builds to remove unused resources from the app.\nThis property should be used in combination with "},{"kind":"code","text":"`enableProguardInReleaseBuilds`"},{"kind":"text","text":"."}]},"type":{"type":"intrinsic","name":"boolean"}},{"name":"extraMavenRepos","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"Add extra maven repositories to all gradle projects.\n\nThis acts like to add the following code to **android/build.gradle**:\n"},{"kind":"code","text":"```groovy\nallprojects {\n repositories {\n maven {\n url [THE_EXTRA_MAVEN_REPOSITORY]\n }\n }\n}\n```"}],"blockTags":[{"tag":"@hide","content":[{"kind":"text","text":"For the implementation details,\nthis property is actually handled by "},{"kind":"code","text":"`expo-modules-autolinking`"},{"kind":"text","text":" but not the config-plugins inside expo-build-properties."}]}]},"type":{"type":"array","elementType":{"type":"intrinsic","name":"string"}}},{"name":"extraProguardRules","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"Append custom [Proguard rules](https://www.guardsquare.com/manual/configuration/usage) to **android/app/proguard-rules.pro**."}]},"type":{"type":"intrinsic","name":"string"}},{"name":"flipper","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"By default, Flipper is enabled with the version that comes bundled with "},{"kind":"code","text":"`react-native`"},{"kind":"text","text":".\n\nUse this to change the [Flipper](https://fbflipper.com/) version when\nrunning your app on Android. You can set the "},{"kind":"code","text":"`flipper`"},{"kind":"text","text":" property to a\nsemver string and specify an alternate Flipper version."}]},"type":{"type":"intrinsic","name":"string"}},{"name":"kotlinVersion","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"Override the Kotlin version used when building the app."}]},"type":{"type":"intrinsic","name":"string"}},{"name":"minSdkVersion","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"Override the default "},{"kind":"code","text":"`minSdkVersion`"},{"kind":"text","text":" version number in **build.gradle**."}]},"type":{"type":"intrinsic","name":"number"}},{"name":"networkInspector","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"Enable the Network Inspector."}],"blockTags":[{"tag":"@default","content":[{"kind":"text","text":"true"}]}]},"type":{"type":"intrinsic","name":"boolean"}},{"name":"newArchEnabled","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"Enable React Native new architecture for Android platform."}]},"type":{"type":"intrinsic","name":"boolean"}},{"name":"packagingOptions","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"Interface representing available configuration for Android Gradle plugin [PackagingOptions](https://developer.android.com/reference/tools/gradle-api/7.0/com/android/build/api/dsl/PackagingOptions)."}]},"type":{"type":"reference","name":"PluginConfigTypeAndroidPackagingOptions"}},{"name":"targetSdkVersion","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"Override the default "},{"kind":"code","text":"`targetSdkVersion`"},{"kind":"text","text":" version number in **build.gradle**."}]},"type":{"type":"intrinsic","name":"number"}},{"name":"usesCleartextTraffic","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"Indicates whether the app intends to use cleartext network traffic."}],"blockTags":[{"tag":"@default","content":[{"kind":"text","text":"false"}]},{"tag":"@see","content":[{"kind":"text","text":"[Android documentation](https://developer.android.com/guide/topics/manifest/application-element#usesCleartextTraffic)"}]}]},"type":{"type":"intrinsic","name":"boolean"}}]},{"name":"PluginConfigTypeAndroidPackagingOptions","kind":256,"comment":{"summary":[{"kind":"text","text":"Interface representing available configuration for Android Gradle plugin [PackagingOptions](https://developer.android.com/reference/tools/gradle-api/7.0/com/android/build/api/dsl/PackagingOptions)."}],"blockTags":[{"tag":"@platform","content":[{"kind":"text","text":"android"}]}]},"children":[{"name":"doNotStrip","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"Array of patterns for native libraries that should not be stripped of debug symbols."}]},"type":{"type":"array","elementType":{"type":"intrinsic","name":"string"}}},{"name":"exclude","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"Array of patterns for native libraries that should be excluded from being packaged in the APK."}]},"type":{"type":"array","elementType":{"type":"intrinsic","name":"string"}}},{"name":"merge","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"Array of patterns for native libraries where all occurrences are concatenated and packaged in the APK."}]},"type":{"type":"array","elementType":{"type":"intrinsic","name":"string"}}},{"name":"pickFirst","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"Array of patterns for native libraries where only the first occurrence is packaged in the APK."}]},"type":{"type":"array","elementType":{"type":"intrinsic","name":"string"}}}]},{"name":"PluginConfigTypeIos","kind":256,"comment":{"summary":[{"kind":"text","text":"Interface representing available configuration for iOS native build properties."}],"blockTags":[{"tag":"@platform","content":[{"kind":"text","text":"ios"}]}]},"children":[{"name":"deploymentTarget","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"Override the default iOS \"Deployment Target\" version in the following projects:\n - in CocoaPods projects,\n - "},{"kind":"code","text":"`PBXNativeTarget`"},{"kind":"text","text":" with \"com.apple.product-type.application\" "},{"kind":"code","text":"`productType`"},{"kind":"text","text":" in the app project."}]},"type":{"type":"intrinsic","name":"string"}},{"name":"extraPods","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"Add extra CocoaPods dependencies for all targets.\n\nThis acts like to add the following code to **ios/Podfile**:\n"},{"kind":"code","text":"```\npod '[EXTRA_POD_NAME]', '~> [EXTRA_POD_VERSION]'\n# e.g.\npod 'Protobuf', '~> 3.14.0'\n```"}],"blockTags":[{"tag":"@hide","content":[{"kind":"text","text":"For the implementation details,\nthis property is actually handled by "},{"kind":"code","text":"`expo-modules-autolinking`"},{"kind":"text","text":" but not the config-plugins inside expo-build-properties."}]}]},"type":{"type":"array","elementType":{"type":"reference","name":"ExtraIosPodDependency"}}},{"name":"flipper","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"Enable [Flipper](https://fbflipper.com/) when running your app on iOS in\nDebug mode. Setting "},{"kind":"code","text":"`true`"},{"kind":"text","text":" enables the default version of Flipper, while\nsetting a semver string will enable a specific version of Flipper you've\ndeclared in your **package.json**. The default for this configuration is "},{"kind":"code","text":"`false`"},{"kind":"text","text":".\n\n> You cannot use "},{"kind":"code","text":"`flipper`"},{"kind":"text","text":" at the same time as "},{"kind":"code","text":"`useFrameworks`"},{"kind":"text","text":", and\ndoing so will generate an error."}]},"type":{"type":"union","types":[{"type":"intrinsic","name":"string"},{"type":"intrinsic","name":"boolean"}]}},{"name":"networkInspector","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"Enable the Network Inspector."}],"blockTags":[{"tag":"@default","content":[{"kind":"text","text":"true"}]}]},"type":{"type":"intrinsic","name":"boolean"}},{"name":"newArchEnabled","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"Enable React Native new architecture for iOS platform."}]},"type":{"type":"intrinsic","name":"boolean"}},{"name":"useFrameworks","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"Enable ["},{"kind":"code","text":"`use_frameworks!`"},{"kind":"text","text":"](https://guides.cocoapods.org/syntax/podfile.html#use_frameworks_bang)\nin "},{"kind":"code","text":"`Podfile`"},{"kind":"text","text":" to use frameworks instead of static libraries for Pods.\n\n> You cannot use "},{"kind":"code","text":"`useFrameworks`"},{"kind":"text","text":" and "},{"kind":"code","text":"`flipper`"},{"kind":"text","text":" at the same time , and\ndoing so will generate an error."}]},"type":{"type":"union","types":[{"type":"literal","value":"static"},{"type":"literal","value":"dynamic"}]}}]},{"name":"withBuildProperties","kind":64,"signatures":[{"name":"withBuildProperties","kind":4096,"comment":{"summary":[{"kind":"text","text":"Config plugin allowing customizing native Android and iOS build properties for managed apps."}]},"parameters":[{"name":"config","kind":32768,"comment":{"summary":[{"kind":"text","text":"Expo config for application."}]},"type":{"type":"reference","name":"ExpoConfig"}},{"name":"props","kind":32768,"comment":{"summary":[{"kind":"text","text":"Configuration for the build properties plugin."}]},"type":{"type":"reference","name":"PluginConfigType"}}],"type":{"type":"reference","name":"ExpoConfig"}}]}]}
\ No newline at end of file
diff --git a/docs/public/static/data/v49.0.0/expo-calendar.json b/docs/public/static/data/v49.0.0/expo-calendar.json
new file mode 100644
index 0000000000000..c04afcbba8642
--- /dev/null
+++ b/docs/public/static/data/v49.0.0/expo-calendar.json
@@ -0,0 +1 @@
+{"name":"expo-calendar","kind":1,"children":[{"name":"DayOfTheWeek","kind":8,"children":[{"name":"Friday","kind":16,"type":{"type":"literal","value":6}},{"name":"Monday","kind":16,"type":{"type":"literal","value":2}},{"name":"Saturday","kind":16,"type":{"type":"literal","value":7}},{"name":"Sunday","kind":16,"type":{"type":"literal","value":1}},{"name":"Thursday","kind":16,"type":{"type":"literal","value":5}},{"name":"Tuesday","kind":16,"type":{"type":"literal","value":3}},{"name":"Wednesday","kind":16,"type":{"type":"literal","value":4}}]},{"name":"MonthOfTheYear","kind":8,"children":[{"name":"April","kind":16,"type":{"type":"literal","value":4}},{"name":"August","kind":16,"type":{"type":"literal","value":8}},{"name":"December","kind":16,"type":{"type":"literal","value":12}},{"name":"February","kind":16,"type":{"type":"literal","value":2}},{"name":"January","kind":16,"type":{"type":"literal","value":1}},{"name":"July","kind":16,"type":{"type":"literal","value":7}},{"name":"June","kind":16,"type":{"type":"literal","value":6}},{"name":"March","kind":16,"type":{"type":"literal","value":3}},{"name":"May","kind":16,"type":{"type":"literal","value":5}},{"name":"November","kind":16,"type":{"type":"literal","value":11}},{"name":"October","kind":16,"type":{"type":"literal","value":10}},{"name":"September","kind":16,"type":{"type":"literal","value":9}}]},{"name":"PermissionStatus","kind":8,"children":[{"name":"DENIED","kind":16,"comment":{"summary":[{"kind":"text","text":"User has denied the permission."}]},"type":{"type":"literal","value":"denied"}},{"name":"GRANTED","kind":16,"comment":{"summary":[{"kind":"text","text":"User has granted the permission."}]},"type":{"type":"literal","value":"granted"}},{"name":"UNDETERMINED","kind":16,"comment":{"summary":[{"kind":"text","text":"User hasn't granted or denied the permission yet."}]},"type":{"type":"literal","value":"undetermined"}}]},{"name":"PermissionResponse","kind":256,"comment":{"summary":[{"kind":"text","text":"An object obtained by permissions get and request functions."}]},"children":[{"name":"canAskAgain","kind":1024,"comment":{"summary":[{"kind":"text","text":"Indicates if user can be asked again for specific permission.\nIf not, one should be directed to the Settings app\nin order to enable/disable the permission."}]},"type":{"type":"intrinsic","name":"boolean"}},{"name":"expires","kind":1024,"comment":{"summary":[{"kind":"text","text":"Determines time when the permission expires."}]},"type":{"type":"reference","name":"PermissionExpiration"}},{"name":"granted","kind":1024,"comment":{"summary":[{"kind":"text","text":"A convenience boolean that indicates if the permission is granted."}]},"type":{"type":"intrinsic","name":"boolean"}},{"name":"status","kind":1024,"comment":{"summary":[{"kind":"text","text":"Determines the status of the permission."}]},"type":{"type":"reference","name":"PermissionStatus"}}]},{"name":"Alarm","kind":4194304,"comment":{"summary":[{"kind":"text","text":"A method for having the OS automatically remind the user about an calendar item."}]},"type":{"type":"reflection","declaration":{"name":"__type","kind":65536,"children":[{"name":"absoluteDate","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"Date object or string representing an absolute time the alarm should occur.\nOverrides "},{"kind":"code","text":"`relativeOffset`"},{"kind":"text","text":" and "},{"kind":"code","text":"`structuredLocation`"},{"kind":"text","text":" if specified alongside either."}],"blockTags":[{"tag":"@platform","content":[{"kind":"text","text":"ios"}]}]},"type":{"type":"intrinsic","name":"string"}},{"name":"method","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"Method of alerting the user that this alarm should use; on iOS this is always a notification.\nPossible values: ["},{"kind":"code","text":"`AlarmMethod`"},{"kind":"text","text":"](#calendaralarmmethod)."}],"blockTags":[{"tag":"@platform","content":[{"kind":"text","text":"android"}]}]},"type":{"type":"intrinsic","name":"string"}},{"name":"relativeOffset","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"Number of minutes from the "},{"kind":"code","text":"`startDate`"},{"kind":"text","text":" of the calendar item that the alarm should occur.\nUse negative values to have the alarm occur before the "},{"kind":"code","text":"`startDate`"},{"kind":"text","text":"."}]},"type":{"type":"intrinsic","name":"number"}},{"name":"structuredLocation","kind":1024,"flags":{"isOptional":true},"type":{"type":"reference","name":"AlarmLocation"}}]}}},{"name":"AlarmLocation","kind":4194304,"type":{"type":"reflection","declaration":{"name":"__type","kind":65536,"children":[{"name":"coords","kind":1024,"flags":{"isOptional":true},"type":{"type":"reflection","declaration":{"name":"__type","kind":65536,"children":[{"name":"latitude","kind":1024,"flags":{"isOptional":true},"type":{"type":"intrinsic","name":"number"}},{"name":"longitude","kind":1024,"flags":{"isOptional":true},"type":{"type":"intrinsic","name":"number"}}]}}},{"name":"proximity","kind":1024,"flags":{"isOptional":true},"type":{"type":"intrinsic","name":"string"}},{"name":"radius","kind":1024,"flags":{"isOptional":true},"type":{"type":"intrinsic","name":"number"}},{"name":"title","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[],"blockTags":[{"tag":"@platform","content":[{"kind":"text","text":"ios"}]}]},"type":{"type":"intrinsic","name":"string"}}]}}},{"name":"Attendee","kind":4194304,"comment":{"summary":[{"kind":"text","text":"A person or entity that is associated with an event by being invited or fulfilling some other role."}]},"type":{"type":"reflection","declaration":{"name":"__type","kind":65536,"children":[{"name":"email","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"Email address of the attendee."}],"blockTags":[{"tag":"@platform","content":[{"kind":"text","text":"android"}]}]},"type":{"type":"intrinsic","name":"string"}},{"name":"id","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"Internal ID that represents this attendee on the device."}],"blockTags":[{"tag":"@platform","content":[{"kind":"text","text":"android"}]}]},"type":{"type":"intrinsic","name":"string"}},{"name":"isCurrentUser","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"Indicates whether or not this attendee is the current OS user."}],"blockTags":[{"tag":"@platform","content":[{"kind":"text","text":"ios"}]}]},"type":{"type":"intrinsic","name":"boolean"}},{"name":"name","kind":1024,"comment":{"summary":[{"kind":"text","text":"Displayed name of the attendee."}]},"type":{"type":"intrinsic","name":"string"}},{"name":"role","kind":1024,"comment":{"summary":[{"kind":"text","text":"Role of the attendee at the event.\nPossible values: ["},{"kind":"code","text":"`AttendeeRole`"},{"kind":"text","text":"](#calendarattendeerole)."}]},"type":{"type":"intrinsic","name":"string"}},{"name":"status","kind":1024,"comment":{"summary":[{"kind":"text","text":"Status of the attendee in relation to the event.\nPossible values: ["},{"kind":"code","text":"`AttendeeStatus`"},{"kind":"text","text":"](#calendarattendeestatus)."}]},"type":{"type":"intrinsic","name":"string"}},{"name":"type","kind":1024,"comment":{"summary":[{"kind":"text","text":"Type of the attendee.\nPossible values: ["},{"kind":"code","text":"`AttendeeType`"},{"kind":"text","text":"](#calendarattendeetype)."}]},"type":{"type":"intrinsic","name":"string"}},{"name":"url","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"URL for the attendee."}],"blockTags":[{"tag":"@platform","content":[{"kind":"text","text":"ios"}]}]},"type":{"type":"intrinsic","name":"string"}}]}}},{"name":"Calendar","kind":4194304,"comment":{"summary":[{"kind":"text","text":"A calendar record upon which events (or, on iOS, reminders) can be stored. Settings here apply to\nthe calendar as a whole and how its events are displayed in the OS calendar app."}]},"type":{"type":"reflection","declaration":{"name":"__type","kind":65536,"children":[{"name":"accessLevel","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"Level of access that the user has for the calendar.\nPossible values: ["},{"kind":"code","text":"`CalendarAccessLevel`"},{"kind":"text","text":"](#calendarcalendaraccesslevel)."}],"blockTags":[{"tag":"@platform","content":[{"kind":"text","text":"android"}]}]},"type":{"type":"intrinsic","name":"string"}},{"name":"allowedAttendeeTypes","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"Attendee types that this calendar supports.\nPossible values: Array of ["},{"kind":"code","text":"`AttendeeType`"},{"kind":"text","text":"](#calendarattendeetype)."}],"blockTags":[{"tag":"@platform","content":[{"kind":"text","text":"android"}]}]},"type":{"type":"array","elementType":{"type":"intrinsic","name":"string"}}},{"name":"allowedAvailabilities","kind":1024,"comment":{"summary":[{"kind":"text","text":"Availability types that this calendar supports.\nPossible values: Array of ["},{"kind":"code","text":"`Availability`"},{"kind":"text","text":"](#calendaravailability)."}]},"type":{"type":"array","elementType":{"type":"intrinsic","name":"string"}}},{"name":"allowedReminders","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"Alarm methods that this calendar supports.\nPossible values: Array of ["},{"kind":"code","text":"`AlarmMethod`"},{"kind":"text","text":"](#calendaralarmmethod)."}],"blockTags":[{"tag":"@platform","content":[{"kind":"text","text":"android"}]}]},"type":{"type":"array","elementType":{"type":"intrinsic","name":"string"}}},{"name":"allowsModifications","kind":1024,"comment":{"summary":[{"kind":"text","text":"Boolean value that determines whether this calendar can be modified."}]},"type":{"type":"intrinsic","name":"boolean"}},{"name":"color","kind":1024,"comment":{"summary":[{"kind":"text","text":"Color used to display this calendar's events."}]},"type":{"type":"intrinsic","name":"string"}},{"name":"entityType","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"Whether the calendar is used in the Calendar or Reminders OS app.\nPossible values: ["},{"kind":"code","text":"`EntityTypes`"},{"kind":"text","text":"](#calendarentitytypes)."}],"blockTags":[{"tag":"@platform","content":[{"kind":"text","text":"ios"}]}]},"type":{"type":"intrinsic","name":"string"}},{"name":"id","kind":1024,"comment":{"summary":[{"kind":"text","text":"Internal ID that represents this calendar on the device."}]},"type":{"type":"intrinsic","name":"string"}},{"name":"isPrimary","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"Boolean value indicating whether this is the device's primary calendar."}],"blockTags":[{"tag":"@platform","content":[{"kind":"text","text":"android"}]}]},"type":{"type":"intrinsic","name":"boolean"}},{"name":"isSynced","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"Indicates whether this calendar is synced and its events stored on the device.\nUnexpected behavior may occur if this is not set to "},{"kind":"code","text":"`true`"},{"kind":"text","text":"."}],"blockTags":[{"tag":"@platform","content":[{"kind":"text","text":"android"}]}]},"type":{"type":"intrinsic","name":"boolean"}},{"name":"isVisible","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"Indicates whether the OS displays events on this calendar."}],"blockTags":[{"tag":"@platform","content":[{"kind":"text","text":"android"}]}]},"type":{"type":"intrinsic","name":"boolean"}},{"name":"name","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"Internal system name of the calendar."}],"blockTags":[{"tag":"@platform","content":[{"kind":"text","text":"android"}]}]},"type":{"type":"union","types":[{"type":"intrinsic","name":"string"},{"type":"literal","value":null}]}},{"name":"ownerAccount","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"Name for the account that owns this calendar."}],"blockTags":[{"tag":"@platform","content":[{"kind":"text","text":"android"}]}]},"type":{"type":"intrinsic","name":"string"}},{"name":"source","kind":1024,"comment":{"summary":[{"kind":"text","text":"Object representing the source to be used for the calendar."}]},"type":{"type":"reference","name":"Source"}},{"name":"sourceId","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"ID of the source to be used for the calendar. Likely the same as the source for any other\nlocally stored calendars."}],"blockTags":[{"tag":"@platform","content":[{"kind":"text","text":"ios"}]}]},"type":{"type":"intrinsic","name":"string"}},{"name":"timeZone","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"Time zone for the calendar."}],"blockTags":[{"tag":"@platform","content":[{"kind":"text","text":"android"}]}]},"type":{"type":"intrinsic","name":"string"}},{"name":"title","kind":1024,"comment":{"summary":[{"kind":"text","text":"Visible name of the calendar."}]},"type":{"type":"intrinsic","name":"string"}},{"name":"type","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"Type of calendar this object represents.\nPossible values: ["},{"kind":"code","text":"`CalendarType`"},{"kind":"text","text":"](#calendarcalendartype)."}],"blockTags":[{"tag":"@platform","content":[{"kind":"text","text":"ios"}]}]},"type":{"type":"intrinsic","name":"string"}}]}}},{"name":"DaysOfTheWeek","kind":4194304,"comment":{"summary":[],"blockTags":[{"tag":"@platform","content":[{"kind":"text","text":"ios"}]}]},"type":{"type":"reflection","declaration":{"name":"__type","kind":65536,"children":[{"name":"dayOfTheWeek","kind":1024,"comment":{"summary":[{"kind":"text","text":"Sunday to Saturday - "},{"kind":"code","text":"`DayOfTheWeek`"},{"kind":"text","text":" enum."}]},"type":{"type":"reference","name":"DayOfTheWeek"}},{"name":"weekNumber","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"code","text":"`-53`"},{"kind":"text","text":" to "},{"kind":"code","text":"`53`"},{"kind":"text","text":" ("},{"kind":"code","text":"`0`"},{"kind":"text","text":" ignores this field, and a negative indicates a value from the end of the range)."}]},"type":{"type":"intrinsic","name":"number"}}]}}},{"name":"Event","kind":4194304,"comment":{"summary":[{"kind":"text","text":"An event record, or a single instance of a recurring event. On iOS, used in the Calendar app."}]},"type":{"type":"reflection","declaration":{"name":"__type","kind":65536,"children":[{"name":"accessLevel","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"User's access level for the event.\nPossible values: ["},{"kind":"code","text":"`EventAccessLevel`"},{"kind":"text","text":"](#calendareventaccesslevel)."}],"blockTags":[{"tag":"@platform","content":[{"kind":"text","text":"android"}]}]},"type":{"type":"intrinsic","name":"string"}},{"name":"alarms","kind":1024,"comment":{"summary":[{"kind":"text","text":"Array of Alarm objects which control automated reminders to the user."}]},"type":{"type":"array","elementType":{"type":"reference","name":"Alarm"}}},{"name":"allDay","kind":1024,"comment":{"summary":[{"kind":"text","text":"Whether the event is displayed as an all-day event on the calendar"}]},"type":{"type":"intrinsic","name":"boolean"}},{"name":"availability","kind":1024,"comment":{"summary":[{"kind":"text","text":"The availability setting for the event.\nPossible values: ["},{"kind":"code","text":"`Availability`"},{"kind":"text","text":"](#calendaravailability)."}]},"type":{"type":"intrinsic","name":"string"}},{"name":"calendarId","kind":1024,"comment":{"summary":[{"kind":"text","text":"ID of the calendar that contains this event."}]},"type":{"type":"intrinsic","name":"string"}},{"name":"creationDate","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"Date when the event record was created."}],"blockTags":[{"tag":"@platform","content":[{"kind":"text","text":"ios"}]}]},"type":{"type":"union","types":[{"type":"intrinsic","name":"string"},{"type":"reference","name":"Date","qualifiedName":"Date","package":"typescript"}]}},{"name":"endDate","kind":1024,"comment":{"summary":[{"kind":"text","text":"Date object or string representing the time when the event ends."}]},"type":{"type":"union","types":[{"type":"intrinsic","name":"string"},{"type":"reference","name":"Date","qualifiedName":"Date","package":"typescript"}]}},{"name":"endTimeZone","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"Time zone for the event end time."}],"blockTags":[{"tag":"@platform","content":[{"kind":"text","text":"android"}]}]},"type":{"type":"intrinsic","name":"string"}},{"name":"guestsCanInviteOthers","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"Whether invited guests can invite other guests."}],"blockTags":[{"tag":"@platform","content":[{"kind":"text","text":"android"}]}]},"type":{"type":"intrinsic","name":"boolean"}},{"name":"guestsCanModify","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"Whether invited guests can modify the details of the event."}],"blockTags":[{"tag":"@platform","content":[{"kind":"text","text":"android"}]}]},"type":{"type":"intrinsic","name":"boolean"}},{"name":"guestsCanSeeGuests","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"Whether invited guests can see other guests."}],"blockTags":[{"tag":"@platform","content":[{"kind":"text","text":"android"}]}]},"type":{"type":"intrinsic","name":"boolean"}},{"name":"id","kind":1024,"comment":{"summary":[{"kind":"text","text":"Internal ID that represents this event on the device."}]},"type":{"type":"intrinsic","name":"string"}},{"name":"instanceId","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"For instances of recurring events, volatile ID representing this instance. Not guaranteed to\nalways refer to the same instance."}],"blockTags":[{"tag":"@platform","content":[{"kind":"text","text":"android"}]}]},"type":{"type":"intrinsic","name":"string"}},{"name":"isDetached","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"Boolean value indicating whether or not the event is a detached (modified) instance of a recurring event."}],"blockTags":[{"tag":"@platform","content":[{"kind":"text","text":"ios"}]}]},"type":{"type":"intrinsic","name":"boolean"}},{"name":"lastModifiedDate","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"Date when the event record was last modified."}],"blockTags":[{"tag":"@platform","content":[{"kind":"text","text":"ios"}]}]},"type":{"type":"union","types":[{"type":"intrinsic","name":"string"},{"type":"reference","name":"Date","qualifiedName":"Date","package":"typescript"}]}},{"name":"location","kind":1024,"comment":{"summary":[{"kind":"text","text":"Location field of the event."}]},"type":{"type":"intrinsic","name":"string"}},{"name":"notes","kind":1024,"comment":{"summary":[{"kind":"text","text":"Description or notes saved with the event."}]},"type":{"type":"intrinsic","name":"string"}},{"name":"organizer","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"Organizer of the event."}],"blockTags":[{"tag":"@platform","content":[{"kind":"text","text":"ios"}]}]},"type":{"type":"intrinsic","name":"string"}},{"name":"organizerEmail","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"Email address of the organizer of the event."}],"blockTags":[{"tag":"@platform","content":[{"kind":"text","text":"android"}]}]},"type":{"type":"intrinsic","name":"string"}},{"name":"originalId","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"For detached (modified) instances of recurring events, the ID of the original recurring event."}],"blockTags":[{"tag":"@platform","content":[{"kind":"text","text":"android"}]}]},"type":{"type":"intrinsic","name":"string"}},{"name":"originalStartDate","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"For recurring events, the start date for the first (original) instance of the event."}],"blockTags":[{"tag":"@platform","content":[{"kind":"text","text":"ios"}]}]},"type":{"type":"union","types":[{"type":"intrinsic","name":"string"},{"type":"reference","name":"Date","qualifiedName":"Date","package":"typescript"}]}},{"name":"recurrenceRule","kind":1024,"comment":{"summary":[{"kind":"text","text":"Object representing rules for recurring or repeating events. Set to "},{"kind":"code","text":"`null`"},{"kind":"text","text":" for one-time events."}]},"type":{"type":"reference","name":"RecurrenceRule"}},{"name":"startDate","kind":1024,"comment":{"summary":[{"kind":"text","text":"Date object or string representing the time when the event starts."}]},"type":{"type":"union","types":[{"type":"intrinsic","name":"string"},{"type":"reference","name":"Date","qualifiedName":"Date","package":"typescript"}]}},{"name":"status","kind":1024,"comment":{"summary":[{"kind":"text","text":"Status of the event.\nPossible values: ["},{"kind":"code","text":"`EventStatus`"},{"kind":"text","text":"](#calendareventstatus)."}]},"type":{"type":"intrinsic","name":"string"}},{"name":"timeZone","kind":1024,"comment":{"summary":[{"kind":"text","text":"Time zone the event is scheduled in."}]},"type":{"type":"intrinsic","name":"string"}},{"name":"title","kind":1024,"comment":{"summary":[{"kind":"text","text":"Visible name of the event."}]},"type":{"type":"intrinsic","name":"string"}},{"name":"url","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"URL for the event."}],"blockTags":[{"tag":"@platform","content":[{"kind":"text","text":"ios"}]}]},"type":{"type":"intrinsic","name":"string"}}]}}},{"name":"PermissionHookOptions","kind":4194304,"typeParameters":[{"name":"Options","kind":131072,"type":{"type":"intrinsic","name":"object"}}],"type":{"type":"intersection","types":[{"type":"reference","name":"PermissionHookBehavior"},{"type":"reference","name":"Options"}]}},{"name":"RecurrenceRule","kind":4194304,"comment":{"summary":[{"kind":"text","text":"A recurrence rule for events or reminders, allowing the same calendar item to recur multiple times.\nThis type is based on [the iOS interface](https://developer.apple.com/documentation/eventkit/ekrecurrencerule/1507320-initrecurrencewithfrequency)\nwhich is in turn based on [the iCal RFC](https://tools.ietf.org/html/rfc5545#section-3.8.5.3)\nso you can refer to those to learn more about this potentially complex interface.\n\nNot all of the combinations make sense. For example, when frequency is "},{"kind":"code","text":"`DAILY`"},{"kind":"text","text":", setting "},{"kind":"code","text":"`daysOfTheMonth`"},{"kind":"text","text":" makes no sense."}]},"type":{"type":"reflection","declaration":{"name":"__type","kind":65536,"children":[{"name":"daysOfTheMonth","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"The days of the month this event occurs on.\n"},{"kind":"code","text":"`-31`"},{"kind":"text","text":" to "},{"kind":"code","text":"`31`"},{"kind":"text","text":" (not including "},{"kind":"code","text":"`0`"},{"kind":"text","text":"). Negative indicates a value from the end of the range.\nThis field is only valid for "},{"kind":"code","text":"`Calendar.Frequency.Monthly`"},{"kind":"text","text":"."}],"blockTags":[{"tag":"@platform","content":[{"kind":"text","text":"ios"}]}]},"type":{"type":"array","elementType":{"type":"intrinsic","name":"number"}}},{"name":"daysOfTheWeek","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"The days of the week the event should recur on. An array of ["},{"kind":"code","text":"`DaysOfTheWeek`"},{"kind":"text","text":"](#daysoftheweek) object."}],"blockTags":[{"tag":"@platform","content":[{"kind":"text","text":"ios"}]}]},"type":{"type":"array","elementType":{"type":"reference","name":"DaysOfTheWeek"}}},{"name":"daysOfTheYear","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"The days of the year this event occurs on.\n"},{"kind":"code","text":"`-366`"},{"kind":"text","text":" to "},{"kind":"code","text":"`366`"},{"kind":"text","text":" (not including "},{"kind":"code","text":"`0`"},{"kind":"text","text":"). Negative indicates a value from the end of the range.\nThis field is only valid for "},{"kind":"code","text":"`Calendar.Frequency.Yearly`"},{"kind":"text","text":"."}],"blockTags":[{"tag":"@platform","content":[{"kind":"text","text":"ios"}]}]},"type":{"type":"array","elementType":{"type":"intrinsic","name":"number"}}},{"name":"endDate","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"Date on which the calendar item should stop recurring; overrides "},{"kind":"code","text":"`occurrence`"},{"kind":"text","text":" if both are specified."}]},"type":{"type":"union","types":[{"type":"intrinsic","name":"string"},{"type":"reference","name":"Date","qualifiedName":"Date","package":"typescript"}]}},{"name":"frequency","kind":1024,"comment":{"summary":[{"kind":"text","text":"How often the calendar item should recur.\nPossible values: ["},{"kind":"code","text":"`Frequency`"},{"kind":"text","text":"](#calendarfrequency)."}]},"type":{"type":"intrinsic","name":"string"}},{"name":"interval","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"Interval at which the calendar item should recur. For example, an "},{"kind":"code","text":"`interval: 2`"},{"kind":"text","text":" with "},{"kind":"code","text":"`frequency: DAILY`"},{"kind":"text","text":"\nwould yield an event that recurs every other day."}],"blockTags":[{"tag":"@default","content":[{"kind":"text","text":"1"}]}]},"type":{"type":"intrinsic","name":"number"}},{"name":"monthsOfTheYear","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"The months this event occurs on.\nThis field is only valid for "},{"kind":"code","text":"`Calendar.Frequency.Yearly`"},{"kind":"text","text":"."}],"blockTags":[{"tag":"@platform","content":[{"kind":"text","text":"ios"}]}]},"type":{"type":"array","elementType":{"type":"reference","name":"MonthOfTheYear"}}},{"name":"occurrence","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"Number of times the calendar item should recur before stopping."}]},"type":{"type":"intrinsic","name":"number"}},{"name":"setPositions","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"TAn array of numbers that filters which recurrences to include. For example, for an event that\nrecurs every Monday, passing 2 here will make it recur every other Monday.\n"},{"kind":"code","text":"`-366`"},{"kind":"text","text":" to "},{"kind":"code","text":"`366`"},{"kind":"text","text":" (not including "},{"kind":"code","text":"`0`"},{"kind":"text","text":"). Negative indicates a value from the end of the range.\nThis field is only valid for "},{"kind":"code","text":"`Calendar.Frequency.Yearly`"},{"kind":"text","text":"."}],"blockTags":[{"tag":"@platform","content":[{"kind":"text","text":"ios"}]}]},"type":{"type":"array","elementType":{"type":"intrinsic","name":"number"}}},{"name":"weeksOfTheYear","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"The weeks of the year this event occurs on.\n"},{"kind":"code","text":"`-53`"},{"kind":"text","text":" to "},{"kind":"code","text":"`53`"},{"kind":"text","text":" (not including "},{"kind":"code","text":"`0`"},{"kind":"text","text":"). Negative indicates a value from the end of the range.\nThis field is only valid for "},{"kind":"code","text":"`Calendar.Frequency.Yearly`"},{"kind":"text","text":"."}],"blockTags":[{"tag":"@platform","content":[{"kind":"text","text":"ios"}]}]},"type":{"type":"array","elementType":{"type":"intrinsic","name":"number"}}}]}}},{"name":"RecurringEventOptions","kind":4194304,"comment":{"summary":[],"blockTags":[{"tag":"@platform","content":[{"kind":"text","text":"ios"}]}]},"type":{"type":"reflection","declaration":{"name":"__type","kind":65536,"children":[{"name":"futureEvents","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"Whether or not future events in the recurring series should also be updated. If "},{"kind":"code","text":"`true`"},{"kind":"text","text":", will\napply the given changes to the recurring instance specified by "},{"kind":"code","text":"`instanceStartDate`"},{"kind":"text","text":" and all\nfuture events in the series. If "},{"kind":"code","text":"`false`"},{"kind":"text","text":", will only apply the given changes to the instance\nspecified by "},{"kind":"code","text":"`instanceStartDate`"},{"kind":"text","text":"."}]},"type":{"type":"intrinsic","name":"boolean"}},{"name":"instanceStartDate","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"Date object representing the start time of the desired instance, if looking for a single instance\nof a recurring event. If this is not provided and **id** represents a recurring event, the first\ninstance of that event will be returned by default."}]},"type":{"type":"union","types":[{"type":"intrinsic","name":"string"},{"type":"reference","name":"Date","qualifiedName":"Date","package":"typescript"}]}}]}}},{"name":"Reminder","kind":4194304,"comment":{"summary":[{"kind":"text","text":"A reminder record, used in the iOS Reminders app. No direct analog on Android."}],"blockTags":[{"tag":"@platform","content":[{"kind":"text","text":"ios"}]}]},"type":{"type":"reflection","declaration":{"name":"__type","kind":65536,"children":[{"name":"alarms","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"Array of Alarm objects which control automated alarms to the user about the task."}]},"type":{"type":"array","elementType":{"type":"reference","name":"Alarm"}}},{"name":"calendarId","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"ID of the calendar that contains this reminder."}]},"type":{"type":"intrinsic","name":"string"}},{"name":"completed","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"Indicates whether or not the task has been completed."}]},"type":{"type":"intrinsic","name":"boolean"}},{"name":"completionDate","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"Date object or string representing the date of completion, if "},{"kind":"code","text":"`completed`"},{"kind":"text","text":" is "},{"kind":"code","text":"`true`"},{"kind":"text","text":".\nSetting this property of a nonnull "},{"kind":"code","text":"`Date`"},{"kind":"text","text":" will automatically set the reminder's "},{"kind":"code","text":"`completed`"},{"kind":"text","text":" value to "},{"kind":"code","text":"`true`"},{"kind":"text","text":"."}]},"type":{"type":"union","types":[{"type":"intrinsic","name":"string"},{"type":"reference","name":"Date","qualifiedName":"Date","package":"typescript"}]}},{"name":"creationDate","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"Date when the reminder record was created."}]},"type":{"type":"union","types":[{"type":"intrinsic","name":"string"},{"type":"reference","name":"Date","qualifiedName":"Date","package":"typescript"}]}},{"name":"dueDate","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"Date object or string representing the time when the reminder task is due."}]},"type":{"type":"union","types":[{"type":"intrinsic","name":"string"},{"type":"reference","name":"Date","qualifiedName":"Date","package":"typescript"}]}},{"name":"id","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"Internal ID that represents this reminder on the device."}]},"type":{"type":"intrinsic","name":"string"}},{"name":"lastModifiedDate","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"Date when the reminder record was last modified."}]},"type":{"type":"union","types":[{"type":"intrinsic","name":"string"},{"type":"reference","name":"Date","qualifiedName":"Date","package":"typescript"}]}},{"name":"location","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"Location field of the reminder"}]},"type":{"type":"intrinsic","name":"string"}},{"name":"notes","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"Description or notes saved with the reminder."}]},"type":{"type":"intrinsic","name":"string"}},{"name":"recurrenceRule","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"Object representing rules for recurring or repeated reminders. Null for one-time tasks."}]},"type":{"type":"reference","name":"RecurrenceRule"}},{"name":"startDate","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"Date object or string representing the start date of the reminder task."}]},"type":{"type":"union","types":[{"type":"intrinsic","name":"string"},{"type":"reference","name":"Date","qualifiedName":"Date","package":"typescript"}]}},{"name":"timeZone","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"Time zone the reminder is scheduled in."}]},"type":{"type":"intrinsic","name":"string"}},{"name":"title","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"Visible name of the reminder."}]},"type":{"type":"intrinsic","name":"string"}},{"name":"url","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"URL for the reminder."}]},"type":{"type":"intrinsic","name":"string"}}]}}},{"name":"Source","kind":4194304,"comment":{"summary":[{"kind":"text","text":"A source account that owns a particular calendar. Expo apps will typically not need to interact with "},{"kind":"code","text":"`Source`"},{"kind":"text","text":" objects."}]},"type":{"type":"reflection","declaration":{"name":"__type","kind":65536,"children":[{"name":"id","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"Internal ID that represents this source on the device."}],"blockTags":[{"tag":"@platform","content":[{"kind":"text","text":"ios"}]}]},"type":{"type":"intrinsic","name":"string"}},{"name":"isLocalAccount","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"Whether this source is the local phone account. Must be "},{"kind":"code","text":"`true`"},{"kind":"text","text":" if "},{"kind":"code","text":"`type`"},{"kind":"text","text":" is "},{"kind":"code","text":"`undefined`"},{"kind":"text","text":"."}],"blockTags":[{"tag":"@platform","content":[{"kind":"text","text":"android"}]}]},"type":{"type":"intrinsic","name":"boolean"}},{"name":"name","kind":1024,"comment":{"summary":[{"kind":"text","text":"Name for the account that owns this calendar and was used to sync the calendar to the device."}]},"type":{"type":"intrinsic","name":"string"}},{"name":"type","kind":1024,"comment":{"summary":[{"kind":"text","text":"Type of the account that owns this calendar and was used to sync it to the device.\nIf "},{"kind":"code","text":"`isLocalAccount`"},{"kind":"text","text":" is falsy then this must be defined, and must match an account on the device\nalong with "},{"kind":"code","text":"`name`"},{"kind":"text","text":", or the OS will delete the calendar.\nOn iOS, one of ["},{"kind":"code","text":"`SourceType`"},{"kind":"text","text":"](#calendarsourcetype)s."}]},"type":{"type":"intrinsic","name":"string"}}]}}},{"name":"AlarmMethod","kind":32,"flags":{"isConst":true},"type":{"type":"reflection","declaration":{"name":"__type","kind":65536,"children":[{"name":"ALARM","kind":1024,"type":{"type":"intrinsic","name":"string"},"defaultValue":"'alarm'"},{"name":"ALERT","kind":1024,"type":{"type":"intrinsic","name":"string"},"defaultValue":"'alert'"},{"name":"DEFAULT","kind":1024,"type":{"type":"intrinsic","name":"string"},"defaultValue":"'default'"},{"name":"EMAIL","kind":1024,"type":{"type":"intrinsic","name":"string"},"defaultValue":"'email'"},{"name":"SMS","kind":1024,"type":{"type":"intrinsic","name":"string"},"defaultValue":"'sms'"}]}},"defaultValue":"..."},{"name":"AttendeeRole","kind":32,"flags":{"isConst":true},"type":{"type":"reflection","declaration":{"name":"__type","kind":65536,"children":[{"name":"ATTENDEE","kind":1024,"type":{"type":"intrinsic","name":"string"},"defaultValue":"'attendee'"},{"name":"CHAIR","kind":1024,"type":{"type":"intrinsic","name":"string"},"defaultValue":"'chair'"},{"name":"NONE","kind":1024,"type":{"type":"intrinsic","name":"string"},"defaultValue":"'none'"},{"name":"NON_PARTICIPANT","kind":1024,"type":{"type":"intrinsic","name":"string"},"defaultValue":"'nonParticipant'"},{"name":"OPTIONAL","kind":1024,"type":{"type":"intrinsic","name":"string"},"defaultValue":"'optional'"},{"name":"ORGANIZER","kind":1024,"type":{"type":"intrinsic","name":"string"},"defaultValue":"'organizer'"},{"name":"PERFORMER","kind":1024,"type":{"type":"intrinsic","name":"string"},"defaultValue":"'performer'"},{"name":"REQUIRED","kind":1024,"type":{"type":"intrinsic","name":"string"},"defaultValue":"'required'"},{"name":"SPEAKER","kind":1024,"type":{"type":"intrinsic","name":"string"},"defaultValue":"'speaker'"},{"name":"UNKNOWN","kind":1024,"type":{"type":"intrinsic","name":"string"},"defaultValue":"'unknown'"}]}},"defaultValue":"..."},{"name":"AttendeeStatus","kind":32,"flags":{"isConst":true},"type":{"type":"reflection","declaration":{"name":"__type","kind":65536,"children":[{"name":"ACCEPTED","kind":1024,"type":{"type":"intrinsic","name":"string"},"defaultValue":"'accepted'"},{"name":"COMPLETED","kind":1024,"type":{"type":"intrinsic","name":"string"},"defaultValue":"'completed'"},{"name":"DECLINED","kind":1024,"type":{"type":"intrinsic","name":"string"},"defaultValue":"'declined'"},{"name":"DELEGATED","kind":1024,"type":{"type":"intrinsic","name":"string"},"defaultValue":"'delegated'"},{"name":"INVITED","kind":1024,"type":{"type":"intrinsic","name":"string"},"defaultValue":"'invited'"},{"name":"IN_PROCESS","kind":1024,"type":{"type":"intrinsic","name":"string"},"defaultValue":"'inProcess'"},{"name":"NONE","kind":1024,"type":{"type":"intrinsic","name":"string"},"defaultValue":"'none'"},{"name":"PENDING","kind":1024,"type":{"type":"intrinsic","name":"string"},"defaultValue":"'pending'"},{"name":"TENTATIVE","kind":1024,"type":{"type":"intrinsic","name":"string"},"defaultValue":"'tentative'"},{"name":"UNKNOWN","kind":1024,"type":{"type":"intrinsic","name":"string"},"defaultValue":"'unknown'"}]}},"defaultValue":"..."},{"name":"AttendeeType","kind":32,"flags":{"isConst":true},"type":{"type":"reflection","declaration":{"name":"__type","kind":65536,"children":[{"name":"GROUP","kind":1024,"type":{"type":"intrinsic","name":"string"},"defaultValue":"'group'"},{"name":"NONE","kind":1024,"type":{"type":"intrinsic","name":"string"},"defaultValue":"'none'"},{"name":"OPTIONAL","kind":1024,"type":{"type":"intrinsic","name":"string"},"defaultValue":"'optional'"},{"name":"PERSON","kind":1024,"type":{"type":"intrinsic","name":"string"},"defaultValue":"'person'"},{"name":"REQUIRED","kind":1024,"type":{"type":"intrinsic","name":"string"},"defaultValue":"'required'"},{"name":"RESOURCE","kind":1024,"type":{"type":"intrinsic","name":"string"},"defaultValue":"'resource'"},{"name":"ROOM","kind":1024,"type":{"type":"intrinsic","name":"string"},"defaultValue":"'room'"},{"name":"UNKNOWN","kind":1024,"type":{"type":"intrinsic","name":"string"},"defaultValue":"'unknown'"}]}},"defaultValue":"..."},{"name":"Availability","kind":32,"flags":{"isConst":true},"type":{"type":"reflection","declaration":{"name":"__type","kind":65536,"children":[{"name":"BUSY","kind":1024,"type":{"type":"intrinsic","name":"string"},"defaultValue":"'busy'"},{"name":"FREE","kind":1024,"type":{"type":"intrinsic","name":"string"},"defaultValue":"'free'"},{"name":"NOT_SUPPORTED","kind":1024,"type":{"type":"intrinsic","name":"string"},"defaultValue":"'notSupported'"},{"name":"TENTATIVE","kind":1024,"type":{"type":"intrinsic","name":"string"},"defaultValue":"'tentative'"},{"name":"UNAVAILABLE","kind":1024,"type":{"type":"intrinsic","name":"string"},"defaultValue":"'unavailable'"}]}},"defaultValue":"..."},{"name":"CalendarAccessLevel","kind":32,"flags":{"isConst":true},"type":{"type":"reflection","declaration":{"name":"__type","kind":65536,"children":[{"name":"CONTRIBUTOR","kind":1024,"type":{"type":"intrinsic","name":"string"},"defaultValue":"'contributor'"},{"name":"EDITOR","kind":1024,"type":{"type":"intrinsic","name":"string"},"defaultValue":"'editor'"},{"name":"FREEBUSY","kind":1024,"type":{"type":"intrinsic","name":"string"},"defaultValue":"'freebusy'"},{"name":"NONE","kind":1024,"type":{"type":"intrinsic","name":"string"},"defaultValue":"'none'"},{"name":"OVERRIDE","kind":1024,"type":{"type":"intrinsic","name":"string"},"defaultValue":"'override'"},{"name":"OWNER","kind":1024,"type":{"type":"intrinsic","name":"string"},"defaultValue":"'owner'"},{"name":"READ","kind":1024,"type":{"type":"intrinsic","name":"string"},"defaultValue":"'read'"},{"name":"RESPOND","kind":1024,"type":{"type":"intrinsic","name":"string"},"defaultValue":"'respond'"},{"name":"ROOT","kind":1024,"type":{"type":"intrinsic","name":"string"},"defaultValue":"'root'"}]}},"defaultValue":"..."},{"name":"CalendarType","kind":32,"flags":{"isConst":true},"type":{"type":"reflection","declaration":{"name":"__type","kind":65536,"children":[{"name":"BIRTHDAYS","kind":1024,"type":{"type":"intrinsic","name":"string"},"defaultValue":"'birthdays'"},{"name":"CALDAV","kind":1024,"type":{"type":"intrinsic","name":"string"},"defaultValue":"'caldav'"},{"name":"EXCHANGE","kind":1024,"type":{"type":"intrinsic","name":"string"},"defaultValue":"'exchange'"},{"name":"LOCAL","kind":1024,"type":{"type":"intrinsic","name":"string"},"defaultValue":"'local'"},{"name":"SUBSCRIBED","kind":1024,"type":{"type":"intrinsic","name":"string"},"defaultValue":"'subscribed'"},{"name":"UNKNOWN","kind":1024,"type":{"type":"intrinsic","name":"string"},"defaultValue":"'unknown'"}]}},"defaultValue":"..."},{"name":"EntityTypes","kind":32,"flags":{"isConst":true},"type":{"type":"reflection","declaration":{"name":"__type","kind":65536,"children":[{"name":"EVENT","kind":1024,"type":{"type":"intrinsic","name":"string"},"defaultValue":"'event'"},{"name":"REMINDER","kind":1024,"type":{"type":"intrinsic","name":"string"},"defaultValue":"'reminder'"}]}},"defaultValue":"..."},{"name":"EventAccessLevel","kind":32,"flags":{"isConst":true},"type":{"type":"reflection","declaration":{"name":"__type","kind":65536,"children":[{"name":"CONFIDENTIAL","kind":1024,"type":{"type":"intrinsic","name":"string"},"defaultValue":"'confidential'"},{"name":"DEFAULT","kind":1024,"type":{"type":"intrinsic","name":"string"},"defaultValue":"'default'"},{"name":"PRIVATE","kind":1024,"type":{"type":"intrinsic","name":"string"},"defaultValue":"'private'"},{"name":"PUBLIC","kind":1024,"type":{"type":"intrinsic","name":"string"},"defaultValue":"'public'"}]}},"defaultValue":"..."},{"name":"EventStatus","kind":32,"flags":{"isConst":true},"type":{"type":"reflection","declaration":{"name":"__type","kind":65536,"children":[{"name":"CANCELED","kind":1024,"type":{"type":"intrinsic","name":"string"},"defaultValue":"'canceled'"},{"name":"CONFIRMED","kind":1024,"type":{"type":"intrinsic","name":"string"},"defaultValue":"'confirmed'"},{"name":"NONE","kind":1024,"type":{"type":"intrinsic","name":"string"},"defaultValue":"'none'"},{"name":"TENTATIVE","kind":1024,"type":{"type":"intrinsic","name":"string"},"defaultValue":"'tentative'"}]}},"defaultValue":"..."},{"name":"Frequency","kind":32,"flags":{"isConst":true},"type":{"type":"reflection","declaration":{"name":"__type","kind":65536,"children":[{"name":"DAILY","kind":1024,"type":{"type":"intrinsic","name":"string"},"defaultValue":"'daily'"},{"name":"MONTHLY","kind":1024,"type":{"type":"intrinsic","name":"string"},"defaultValue":"'monthly'"},{"name":"WEEKLY","kind":1024,"type":{"type":"intrinsic","name":"string"},"defaultValue":"'weekly'"},{"name":"YEARLY","kind":1024,"type":{"type":"intrinsic","name":"string"},"defaultValue":"'yearly'"}]}},"defaultValue":"..."},{"name":"ReminderStatus","kind":32,"flags":{"isConst":true},"type":{"type":"reflection","declaration":{"name":"__type","kind":65536,"children":[{"name":"COMPLETED","kind":1024,"type":{"type":"intrinsic","name":"string"},"defaultValue":"'completed'"},{"name":"INCOMPLETE","kind":1024,"type":{"type":"intrinsic","name":"string"},"defaultValue":"'incomplete'"}]}},"defaultValue":"..."},{"name":"SourceType","kind":32,"flags":{"isConst":true},"type":{"type":"reflection","declaration":{"name":"__type","kind":65536,"children":[{"name":"BIRTHDAYS","kind":1024,"type":{"type":"intrinsic","name":"string"},"defaultValue":"'birthdays'"},{"name":"CALDAV","kind":1024,"type":{"type":"intrinsic","name":"string"},"defaultValue":"'caldav'"},{"name":"EXCHANGE","kind":1024,"type":{"type":"intrinsic","name":"string"},"defaultValue":"'exchange'"},{"name":"LOCAL","kind":1024,"type":{"type":"intrinsic","name":"string"},"defaultValue":"'local'"},{"name":"MOBILEME","kind":1024,"type":{"type":"intrinsic","name":"string"},"defaultValue":"'mobileme'"},{"name":"SUBSCRIBED","kind":1024,"type":{"type":"intrinsic","name":"string"},"defaultValue":"'subscribed'"}]}},"defaultValue":"..."},{"name":"createAttendeeAsync","kind":64,"signatures":[{"name":"createAttendeeAsync","kind":4096,"comment":{"summary":[{"kind":"text","text":"Creates a new attendee record and adds it to the specified event. Note that if "},{"kind":"code","text":"`eventId`"},{"kind":"text","text":" specifies\na recurring event, this will add the attendee to every instance of the event."}],"blockTags":[{"tag":"@returns","content":[{"kind":"text","text":"A string representing the ID of the newly created attendee record."}]},{"tag":"@platform","content":[{"kind":"text","text":"android"}]}]},"parameters":[{"name":"eventId","kind":32768,"comment":{"summary":[{"kind":"text","text":"ID of the event to add this attendee to."}]},"type":{"type":"intrinsic","name":"string"}},{"name":"details","kind":32768,"comment":{"summary":[{"kind":"text","text":"A map of details for the attendee to be created."}]},"type":{"type":"reference","typeArguments":[{"type":"reference","name":"Attendee"}],"name":"Partial","qualifiedName":"Partial","package":"typescript"},"defaultValue":"{}"}],"type":{"type":"reference","typeArguments":[{"type":"intrinsic","name":"string"}],"name":"Promise","qualifiedName":"Promise","package":"typescript"}}]},{"name":"createCalendarAsync","kind":64,"signatures":[{"name":"createCalendarAsync","kind":4096,"comment":{"summary":[{"kind":"text","text":"Creates a new calendar on the device, allowing events to be added later and displayed in the OS Calendar app."}],"blockTags":[{"tag":"@returns","content":[{"kind":"text","text":"A string representing the ID of the newly created calendar."}]}]},"parameters":[{"name":"details","kind":32768,"comment":{"summary":[{"kind":"text","text":"A map of details for the calendar to be created."}]},"type":{"type":"reference","typeArguments":[{"type":"reference","name":"Calendar"}],"name":"Partial","qualifiedName":"Partial","package":"typescript"},"defaultValue":"{}"}],"type":{"type":"reference","typeArguments":[{"type":"intrinsic","name":"string"}],"name":"Promise","qualifiedName":"Promise","package":"typescript"}}]},{"name":"createEventAsync","kind":64,"signatures":[{"name":"createEventAsync","kind":4096,"comment":{"summary":[{"kind":"text","text":"Creates a new event on the specified calendar."}],"blockTags":[{"tag":"@returns","content":[{"kind":"text","text":"A promise which fulfils with a string representing the ID of the newly created event."}]}]},"parameters":[{"name":"calendarId","kind":32768,"comment":{"summary":[{"kind":"text","text":"ID of the calendar to create this event in."}]},"type":{"type":"intrinsic","name":"string"}},{"name":"eventData","kind":32768,"comment":{"summary":[{"kind":"text","text":"A map of details for the event to be created."}]},"type":{"type":"reference","typeArguments":[{"type":"reference","name":"Event"}],"name":"Partial","qualifiedName":"Partial","package":"typescript"},"defaultValue":"{}"}],"type":{"type":"reference","typeArguments":[{"type":"intrinsic","name":"string"}],"name":"Promise","qualifiedName":"Promise","package":"typescript"}}]},{"name":"createReminderAsync","kind":64,"signatures":[{"name":"createReminderAsync","kind":4096,"comment":{"summary":[{"kind":"text","text":"Creates a new reminder on the specified calendar."}],"blockTags":[{"tag":"@returns","content":[{"kind":"text","text":"A promise which fulfils with a string representing the ID of the newly created reminder."}]},{"tag":"@platform","content":[{"kind":"text","text":"ios"}]}]},"parameters":[{"name":"calendarId","kind":32768,"comment":{"summary":[{"kind":"text","text":"ID of the calendar to create this reminder in (or "},{"kind":"code","text":"`null`"},{"kind":"text","text":" to add the calendar to\nthe OS-specified default calendar for reminders)."}]},"type":{"type":"union","types":[{"type":"literal","value":null},{"type":"intrinsic","name":"string"}]}},{"name":"reminder","kind":32768,"comment":{"summary":[{"kind":"text","text":"A map of details for the reminder to be created"}]},"type":{"type":"reference","name":"Reminder"},"defaultValue":"{}"}],"type":{"type":"reference","typeArguments":[{"type":"intrinsic","name":"string"}],"name":"Promise","qualifiedName":"Promise","package":"typescript"}}]},{"name":"deleteAttendeeAsync","kind":64,"signatures":[{"name":"deleteAttendeeAsync","kind":4096,"comment":{"summary":[{"kind":"text","text":"Deletes an existing attendee record from the device. __Use with caution.__"}],"blockTags":[{"tag":"@platform","content":[{"kind":"text","text":"android"}]}]},"parameters":[{"name":"id","kind":32768,"comment":{"summary":[{"kind":"text","text":"ID of the attendee to delete."}]},"type":{"type":"intrinsic","name":"string"}}],"type":{"type":"reference","typeArguments":[{"type":"intrinsic","name":"void"}],"name":"Promise","qualifiedName":"Promise","package":"typescript"}}]},{"name":"deleteCalendarAsync","kind":64,"signatures":[{"name":"deleteCalendarAsync","kind":4096,"comment":{"summary":[{"kind":"text","text":"Deletes an existing calendar and all associated events/reminders/attendees from the device. __Use with caution.__"}]},"parameters":[{"name":"id","kind":32768,"comment":{"summary":[{"kind":"text","text":"ID of the calendar to delete."}]},"type":{"type":"intrinsic","name":"string"}}],"type":{"type":"reference","typeArguments":[{"type":"intrinsic","name":"void"}],"name":"Promise","qualifiedName":"Promise","package":"typescript"}}]},{"name":"deleteEventAsync","kind":64,"signatures":[{"name":"deleteEventAsync","kind":4096,"comment":{"summary":[{"kind":"text","text":"Deletes an existing event from the device. Use with caution."}]},"parameters":[{"name":"id","kind":32768,"comment":{"summary":[{"kind":"text","text":"ID of the event to be deleted."}]},"type":{"type":"intrinsic","name":"string"}},{"name":"recurringEventOptions","kind":32768,"comment":{"summary":[{"kind":"text","text":"A map of options for recurring events."}]},"type":{"type":"reference","name":"RecurringEventOptions"},"defaultValue":"{}"}],"type":{"type":"reference","typeArguments":[{"type":"intrinsic","name":"void"}],"name":"Promise","qualifiedName":"Promise","package":"typescript"}}]},{"name":"deleteReminderAsync","kind":64,"signatures":[{"name":"deleteReminderAsync","kind":4096,"comment":{"summary":[{"kind":"text","text":"Deletes an existing reminder from the device. __Use with caution.__"}],"blockTags":[{"tag":"@platform","content":[{"kind":"text","text":"ios"}]}]},"parameters":[{"name":"id","kind":32768,"comment":{"summary":[{"kind":"text","text":"ID of the reminder to be deleted."}]},"type":{"type":"intrinsic","name":"string"}}],"type":{"type":"reference","typeArguments":[{"type":"intrinsic","name":"void"}],"name":"Promise","qualifiedName":"Promise","package":"typescript"}}]},{"name":"getAttendeesForEventAsync","kind":64,"signatures":[{"name":"getAttendeesForEventAsync","kind":4096,"comment":{"summary":[{"kind":"text","text":"Gets all attendees for a given event (or instance of a recurring event)."}],"blockTags":[{"tag":"@returns","content":[{"kind":"text","text":"A promise which fulfils with an array of ["},{"kind":"code","text":"`Attendee`"},{"kind":"text","text":"](#attendee) associated with the\nspecified event."}]}]},"parameters":[{"name":"id","kind":32768,"comment":{"summary":[{"kind":"text","text":"ID of the event to return attendees for."}]},"type":{"type":"intrinsic","name":"string"}},{"name":"recurringEventOptions","kind":32768,"comment":{"summary":[{"kind":"text","text":"A map of options for recurring events."}]},"type":{"type":"reference","name":"RecurringEventOptions"},"defaultValue":"{}"}],"type":{"type":"reference","typeArguments":[{"type":"array","elementType":{"type":"reference","name":"Attendee"}}],"name":"Promise","qualifiedName":"Promise","package":"typescript"}}]},{"name":"getCalendarPermissionsAsync","kind":64,"signatures":[{"name":"getCalendarPermissionsAsync","kind":4096,"comment":{"summary":[{"kind":"text","text":"Checks user's permissions for accessing user's calendars."}],"blockTags":[{"tag":"@returns","content":[{"kind":"text","text":"A promise that resolves to an object of type ["},{"kind":"code","text":"`PermissionResponse`"},{"kind":"text","text":"](#permissionresponse)."}]}]},"type":{"type":"reference","typeArguments":[{"type":"reference","name":"PermissionResponse"}],"name":"Promise","qualifiedName":"Promise","package":"typescript"}}]},{"name":"getCalendarsAsync","kind":64,"signatures":[{"name":"getCalendarsAsync","kind":4096,"comment":{"summary":[{"kind":"text","text":"Gets an array of calendar objects with details about the different calendars stored on the device."}],"blockTags":[{"tag":"@returns","content":[{"kind":"text","text":"An array of [calendar objects](#calendar 'Calendar') matching the provided entity type (if provided)."}]}]},"parameters":[{"name":"entityType","kind":32768,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"__iOS Only.__ Not required, but if defined, filters the returned calendars to\na specific entity type. Possible values are "},{"kind":"code","text":"`Calendar.EntityTypes.EVENT`"},{"kind":"text","text":" (for calendars shown in\nthe Calendar app) and "},{"kind":"code","text":"`Calendar.EntityTypes.REMINDER`"},{"kind":"text","text":" (for the Reminders app).\n> **Note:** If not defined, you will need both permissions: **CALENDAR** and **REMINDERS**."}]},"type":{"type":"intrinsic","name":"string"}}],"type":{"type":"reference","typeArguments":[{"type":"array","elementType":{"type":"reference","name":"Calendar"}}],"name":"Promise","qualifiedName":"Promise","package":"typescript"}}]},{"name":"getDefaultCalendarAsync","kind":64,"signatures":[{"name":"getDefaultCalendarAsync","kind":4096,"comment":{"summary":[{"kind":"text","text":"Gets an instance of the default calendar object."}],"blockTags":[{"tag":"@returns","content":[{"kind":"text","text":"A promise resolving to the [Calendar](#calendar) object that is the user's default calendar."}]},{"tag":"@platform","content":[{"kind":"text","text":"ios"}]}]},"type":{"type":"reference","typeArguments":[{"type":"reference","name":"Calendar"}],"name":"Promise","qualifiedName":"Promise","package":"typescript"}}]},{"name":"getEventAsync","kind":64,"signatures":[{"name":"getEventAsync","kind":4096,"comment":{"summary":[{"kind":"text","text":"Returns a specific event selected by ID. If a specific instance of a recurring event is desired,\nthe start date of this instance must also be provided, as instances of recurring events do not\nhave their own unique and stable IDs on either iOS or Android."}],"blockTags":[{"tag":"@returns","content":[{"kind":"text","text":"A promise which fulfils with an ["},{"kind":"code","text":"`Event`"},{"kind":"text","text":"](#event) object matching the provided criteria, if one exists."}]}]},"parameters":[{"name":"id","kind":32768,"comment":{"summary":[{"kind":"text","text":"ID of the event to return."}]},"type":{"type":"intrinsic","name":"string"}},{"name":"recurringEventOptions","kind":32768,"comment":{"summary":[{"kind":"text","text":"A map of options for recurring events."}]},"type":{"type":"reference","name":"RecurringEventOptions"},"defaultValue":"{}"}],"type":{"type":"reference","typeArguments":[{"type":"reference","name":"Event"}],"name":"Promise","qualifiedName":"Promise","package":"typescript"}}]},{"name":"getEventsAsync","kind":64,"signatures":[{"name":"getEventsAsync","kind":4096,"comment":{"summary":[{"kind":"text","text":"Returns all events in a given set of calendars over a specified time period. The filtering has\nslightly different behavior per-platform - on iOS, all events that overlap at all with the\n"},{"kind":"code","text":"`[startDate, endDate]`"},{"kind":"text","text":" interval are returned, whereas on Android, only events that begin on or\nafter the "},{"kind":"code","text":"`startDate`"},{"kind":"text","text":" and end on or before the "},{"kind":"code","text":"`endDate`"},{"kind":"text","text":" will be returned."}],"blockTags":[{"tag":"@returns","content":[{"kind":"text","text":"A promise which fulfils with an array of ["},{"kind":"code","text":"`Event`"},{"kind":"text","text":"](#event) objects matching the search criteria."}]}]},"parameters":[{"name":"calendarIds","kind":32768,"comment":{"summary":[{"kind":"text","text":"Array of IDs of calendars to search for events in."}]},"type":{"type":"array","elementType":{"type":"intrinsic","name":"string"}}},{"name":"startDate","kind":32768,"comment":{"summary":[{"kind":"text","text":"Beginning of time period to search for events in."}]},"type":{"type":"reference","name":"Date","qualifiedName":"Date","package":"typescript"}},{"name":"endDate","kind":32768,"comment":{"summary":[{"kind":"text","text":"End of time period to search for events in."}]},"type":{"type":"reference","name":"Date","qualifiedName":"Date","package":"typescript"}}],"type":{"type":"reference","typeArguments":[{"type":"array","elementType":{"type":"reference","name":"Event"}}],"name":"Promise","qualifiedName":"Promise","package":"typescript"}}]},{"name":"getReminderAsync","kind":64,"signatures":[{"name":"getReminderAsync","kind":4096,"comment":{"summary":[{"kind":"text","text":"Returns a specific reminder selected by ID."}],"blockTags":[{"tag":"@returns","content":[{"kind":"text","text":"A promise which fulfils with a ["},{"kind":"code","text":"`Reminder`"},{"kind":"text","text":"](#reminder) matching the provided ID, if one exists."}]},{"tag":"@platform","content":[{"kind":"text","text":"ios"}]}]},"parameters":[{"name":"id","kind":32768,"comment":{"summary":[{"kind":"text","text":"ID of the reminder to return."}]},"type":{"type":"intrinsic","name":"string"}}],"type":{"type":"reference","typeArguments":[{"type":"reference","name":"Reminder"}],"name":"Promise","qualifiedName":"Promise","package":"typescript"}}]},{"name":"getRemindersAsync","kind":64,"signatures":[{"name":"getRemindersAsync","kind":4096,"comment":{"summary":[{"kind":"text","text":"Returns a list of reminders matching the provided criteria. If "},{"kind":"code","text":"`startDate`"},{"kind":"text","text":" and "},{"kind":"code","text":"`endDate`"},{"kind":"text","text":" are defined,\nreturns all reminders that overlap at all with the [startDate, endDate] interval - i.e. all reminders\nthat end after the "},{"kind":"code","text":"`startDate`"},{"kind":"text","text":" or begin before the "},{"kind":"code","text":"`endDate`"},{"kind":"text","text":"."}],"blockTags":[{"tag":"@returns","content":[{"kind":"text","text":"A promise which fulfils with an array of ["},{"kind":"code","text":"`Reminder`"},{"kind":"text","text":"](#reminder) objects matching the search criteria."}]},{"tag":"@platform","content":[{"kind":"text","text":"ios"}]}]},"parameters":[{"name":"calendarIds","kind":32768,"comment":{"summary":[{"kind":"text","text":"Array of IDs of calendars to search for reminders in."}]},"type":{"type":"array","elementType":{"type":"union","types":[{"type":"literal","value":null},{"type":"intrinsic","name":"string"}]}}},{"name":"status","kind":32768,"comment":{"summary":[{"kind":"text","text":"One of "},{"kind":"code","text":"`Calendar.ReminderStatus.COMPLETED`"},{"kind":"text","text":" or "},{"kind":"code","text":"`Calendar.ReminderStatus.INCOMPLETE`"},{"kind":"text","text":"."}]},"type":{"type":"union","types":[{"type":"literal","value":null},{"type":"intrinsic","name":"string"}]}},{"name":"startDate","kind":32768,"comment":{"summary":[{"kind":"text","text":"Beginning of time period to search for reminders in. Required if "},{"kind":"code","text":"`status`"},{"kind":"text","text":" is defined."}]},"type":{"type":"reference","name":"Date","qualifiedName":"Date","package":"typescript"}},{"name":"endDate","kind":32768,"comment":{"summary":[{"kind":"text","text":"End of time period to search for reminders in. Required if "},{"kind":"code","text":"`status`"},{"kind":"text","text":" is defined."}]},"type":{"type":"reference","name":"Date","qualifiedName":"Date","package":"typescript"}}],"type":{"type":"reference","typeArguments":[{"type":"array","elementType":{"type":"reference","name":"Reminder"}}],"name":"Promise","qualifiedName":"Promise","package":"typescript"}}]},{"name":"getRemindersPermissionsAsync","kind":64,"signatures":[{"name":"getRemindersPermissionsAsync","kind":4096,"comment":{"summary":[{"kind":"text","text":"Checks user's permissions for accessing user's reminders."}],"blockTags":[{"tag":"@returns","content":[{"kind":"text","text":"A promise that resolves to an object of type ["},{"kind":"code","text":"`PermissionResponse`"},{"kind":"text","text":"](#permissionresponse)."}]},{"tag":"@platform","content":[{"kind":"text","text":"ios"}]}]},"type":{"type":"reference","typeArguments":[{"type":"reference","name":"PermissionResponse"}],"name":"Promise","qualifiedName":"Promise","package":"typescript"}}]},{"name":"getSourceAsync","kind":64,"signatures":[{"name":"getSourceAsync","kind":4096,"comment":{"summary":[{"kind":"text","text":"Returns a specific source selected by ID."}],"blockTags":[{"tag":"@returns","content":[{"kind":"text","text":"A promise which fulfils with an array of ["},{"kind":"code","text":"`Source`"},{"kind":"text","text":"](#source) object matching the provided\nID, if one exists."}]},{"tag":"@platform","content":[{"kind":"text","text":"ios"}]}]},"parameters":[{"name":"id","kind":32768,"comment":{"summary":[{"kind":"text","text":"ID of the source to return."}]},"type":{"type":"intrinsic","name":"string"}}],"type":{"type":"reference","typeArguments":[{"type":"reference","name":"Source"}],"name":"Promise","qualifiedName":"Promise","package":"typescript"}}]},{"name":"getSourcesAsync","kind":64,"signatures":[{"name":"getSourcesAsync","kind":4096,"comment":{"summary":[],"blockTags":[{"tag":"@returns","content":[{"kind":"text","text":"A promise which fulfils with an array of ["},{"kind":"code","text":"`Source`"},{"kind":"text","text":"](#source) objects all sources for\ncalendars stored on the device."}]},{"tag":"@platform","content":[{"kind":"text","text":"ios"}]}]},"type":{"type":"reference","typeArguments":[{"type":"array","elementType":{"type":"reference","name":"Source"}}],"name":"Promise","qualifiedName":"Promise","package":"typescript"}}]},{"name":"isAvailableAsync","kind":64,"signatures":[{"name":"isAvailableAsync","kind":4096,"comment":{"summary":[{"kind":"text","text":"Returns whether the Calendar API is enabled on the current device. This does not check the app permissions."}],"blockTags":[{"tag":"@returns","content":[{"kind":"text","text":"Async "},{"kind":"code","text":"`boolean`"},{"kind":"text","text":", indicating whether the Calendar API is available on the current device.\nCurrently, this resolves "},{"kind":"code","text":"`true`"},{"kind":"text","text":" on iOS and Android only."}]}]},"type":{"type":"reference","typeArguments":[{"type":"intrinsic","name":"boolean"}],"name":"Promise","qualifiedName":"Promise","package":"typescript"}}]},{"name":"openEventInCalendar","kind":64,"signatures":[{"name":"openEventInCalendar","kind":4096,"comment":{"summary":[{"kind":"text","text":"Sends an intent to open the specified event in the OS Calendar app."}],"blockTags":[{"tag":"@platform","content":[{"kind":"text","text":"android"}]}]},"parameters":[{"name":"id","kind":32768,"comment":{"summary":[{"kind":"text","text":"ID of the event to open."}]},"type":{"type":"intrinsic","name":"string"}}],"type":{"type":"intrinsic","name":"void"}}]},{"name":"requestCalendarPermissionsAsync","kind":64,"signatures":[{"name":"requestCalendarPermissionsAsync","kind":4096,"comment":{"summary":[{"kind":"text","text":"Asks the user to grant permissions for accessing user's calendars."}],"blockTags":[{"tag":"@returns","content":[{"kind":"text","text":"A promise that resolves to an object of type ["},{"kind":"code","text":"`PermissionResponse`"},{"kind":"text","text":"](#permissionresponse)."}]}]},"type":{"type":"reference","typeArguments":[{"type":"reference","name":"PermissionResponse"}],"name":"Promise","qualifiedName":"Promise","package":"typescript"}}]},{"name":"requestPermissionsAsync","kind":64,"signatures":[{"name":"requestPermissionsAsync","kind":4096,"comment":{"summary":[],"blockTags":[{"tag":"@deprecated","content":[{"kind":"text","text":"Use ["},{"kind":"code","text":"`requestCalendarPermissionsAsync()`"},{"kind":"text","text":"](#calendarrequestcalendarpermissionsasync) instead."}]}]},"type":{"type":"reference","typeArguments":[{"type":"reference","name":"PermissionResponse"}],"name":"Promise","qualifiedName":"Promise","package":"typescript"}}]},{"name":"requestRemindersPermissionsAsync","kind":64,"signatures":[{"name":"requestRemindersPermissionsAsync","kind":4096,"comment":{"summary":[{"kind":"text","text":"Asks the user to grant permissions for accessing user's reminders."}],"blockTags":[{"tag":"@returns","content":[{"kind":"text","text":"A promise that resolves to an object of type ["},{"kind":"code","text":"`PermissionResponse`"},{"kind":"text","text":"](#permissionresponse)."}]},{"tag":"@platform","content":[{"kind":"text","text":"ios"}]}]},"type":{"type":"reference","typeArguments":[{"type":"reference","name":"PermissionResponse"}],"name":"Promise","qualifiedName":"Promise","package":"typescript"}}]},{"name":"updateAttendeeAsync","kind":64,"signatures":[{"name":"updateAttendeeAsync","kind":4096,"comment":{"summary":[{"kind":"text","text":"Updates an existing attendee record. To remove a property, explicitly set it to "},{"kind":"code","text":"`null`"},{"kind":"text","text":" in "},{"kind":"code","text":"`details`"},{"kind":"text","text":"."}],"blockTags":[{"tag":"@platform","content":[{"kind":"text","text":"android"}]}]},"parameters":[{"name":"id","kind":32768,"comment":{"summary":[{"kind":"text","text":"ID of the attendee record to be updated."}]},"type":{"type":"intrinsic","name":"string"}},{"name":"details","kind":32768,"comment":{"summary":[{"kind":"text","text":"A map of properties to be updated."}]},"type":{"type":"reference","typeArguments":[{"type":"reference","name":"Attendee"}],"name":"Partial","qualifiedName":"Partial","package":"typescript"},"defaultValue":"{}"}],"type":{"type":"reference","typeArguments":[{"type":"intrinsic","name":"string"}],"name":"Promise","qualifiedName":"Promise","package":"typescript"}}]},{"name":"updateCalendarAsync","kind":64,"signatures":[{"name":"updateCalendarAsync","kind":4096,"comment":{"summary":[{"kind":"text","text":"Updates the provided details of an existing calendar stored on the device. To remove a property,\nexplicitly set it to "},{"kind":"code","text":"`null`"},{"kind":"text","text":" in "},{"kind":"code","text":"`details`"},{"kind":"text","text":"."}]},"parameters":[{"name":"id","kind":32768,"comment":{"summary":[{"kind":"text","text":"ID of the calendar to update."}]},"type":{"type":"intrinsic","name":"string"}},{"name":"details","kind":32768,"comment":{"summary":[{"kind":"text","text":"A map of properties to be updated."}]},"type":{"type":"reference","typeArguments":[{"type":"reference","name":"Calendar"}],"name":"Partial","qualifiedName":"Partial","package":"typescript"},"defaultValue":"{}"}],"type":{"type":"reference","typeArguments":[{"type":"intrinsic","name":"string"}],"name":"Promise","qualifiedName":"Promise","package":"typescript"}}]},{"name":"updateEventAsync","kind":64,"signatures":[{"name":"updateEventAsync","kind":4096,"comment":{"summary":[{"kind":"text","text":"Updates the provided details of an existing calendar stored on the device. To remove a property,\nexplicitly set it to "},{"kind":"code","text":"`null`"},{"kind":"text","text":" in "},{"kind":"code","text":"`details`"},{"kind":"text","text":"."}]},"parameters":[{"name":"id","kind":32768,"comment":{"summary":[{"kind":"text","text":"ID of the event to be updated."}]},"type":{"type":"intrinsic","name":"string"}},{"name":"details","kind":32768,"comment":{"summary":[{"kind":"text","text":"A map of properties to be updated."}]},"type":{"type":"reference","typeArguments":[{"type":"reference","name":"Event"}],"name":"Partial","qualifiedName":"Partial","package":"typescript"},"defaultValue":"{}"},{"name":"recurringEventOptions","kind":32768,"comment":{"summary":[{"kind":"text","text":"A map of options for recurring events."}]},"type":{"type":"reference","name":"RecurringEventOptions"},"defaultValue":"{}"}],"type":{"type":"reference","typeArguments":[{"type":"intrinsic","name":"string"}],"name":"Promise","qualifiedName":"Promise","package":"typescript"}}]},{"name":"updateReminderAsync","kind":64,"signatures":[{"name":"updateReminderAsync","kind":4096,"comment":{"summary":[{"kind":"text","text":"Updates the provided details of an existing reminder stored on the device. To remove a property,\nexplicitly set it to "},{"kind":"code","text":"`null`"},{"kind":"text","text":" in "},{"kind":"code","text":"`details`"},{"kind":"text","text":"."}],"blockTags":[{"tag":"@platform","content":[{"kind":"text","text":"ios"}]}]},"parameters":[{"name":"id","kind":32768,"comment":{"summary":[{"kind":"text","text":"ID of the reminder to be updated."}]},"type":{"type":"intrinsic","name":"string"}},{"name":"details","kind":32768,"comment":{"summary":[{"kind":"text","text":"A map of properties to be updated."}]},"type":{"type":"reference","name":"Reminder"},"defaultValue":"{}"}],"type":{"type":"reference","typeArguments":[{"type":"intrinsic","name":"string"}],"name":"Promise","qualifiedName":"Promise","package":"typescript"}}]},{"name":"useCalendarPermissions","kind":64,"signatures":[{"name":"useCalendarPermissions","kind":4096,"comment":{"summary":[{"kind":"text","text":"Check or request permissions to access the calendar.\nThis uses both "},{"kind":"code","text":"`getCalendarPermissionsAsync`"},{"kind":"text","text":" and "},{"kind":"code","text":"`requestCalendarPermissionsAsync`"},{"kind":"text","text":" to interact\nwith the permissions."}],"blockTags":[{"tag":"@example","content":[{"kind":"code","text":"```ts\nconst [status, requestPermission] = Calendar.useCalendarPermissions();\n```"}]}]},"parameters":[{"name":"options","kind":32768,"flags":{"isOptional":true},"type":{"type":"reference","typeArguments":[{"type":"intrinsic","name":"object"}],"name":"PermissionHookOptions"}}],"type":{"type":"tuple","elements":[{"type":"union","types":[{"type":"literal","value":null},{"type":"reference","name":"PermissionResponse"}]},{"type":"reference","typeArguments":[{"type":"reference","name":"PermissionResponse"}],"name":"RequestPermissionMethod"},{"type":"reference","typeArguments":[{"type":"reference","name":"PermissionResponse"}],"name":"GetPermissionMethod"}]}}]},{"name":"useRemindersPermissions","kind":64,"signatures":[{"name":"useRemindersPermissions","kind":4096,"comment":{"summary":[{"kind":"text","text":"Check or request permissions to access reminders.\nThis uses both "},{"kind":"code","text":"`getRemindersPermissionsAsync`"},{"kind":"text","text":" and "},{"kind":"code","text":"`requestRemindersPermissionsAsync`"},{"kind":"text","text":" to interact\nwith the permissions."}],"blockTags":[{"tag":"@example","content":[{"kind":"code","text":"```ts\nconst [status, requestPermission] = Calendar.useRemindersPermissions();\n```"}]}]},"parameters":[{"name":"options","kind":32768,"flags":{"isOptional":true},"type":{"type":"reference","typeArguments":[{"type":"intrinsic","name":"object"}],"name":"PermissionHookOptions"}}],"type":{"type":"tuple","elements":[{"type":"union","types":[{"type":"literal","value":null},{"type":"reference","name":"PermissionResponse"}]},{"type":"reference","typeArguments":[{"type":"reference","name":"PermissionResponse"}],"name":"RequestPermissionMethod"},{"type":"reference","typeArguments":[{"type":"reference","name":"PermissionResponse"}],"name":"GetPermissionMethod"}]}}]}]}
\ No newline at end of file
diff --git a/docs/public/static/data/v49.0.0/expo-camera.json b/docs/public/static/data/v49.0.0/expo-camera.json
new file mode 100644
index 0000000000000..fa31ffc90cbb9
--- /dev/null
+++ b/docs/public/static/data/v49.0.0/expo-camera.json
@@ -0,0 +1 @@
+{"name":"expo-camera","kind":1,"children":[{"name":"AutoFocus","kind":8,"children":[{"name":"auto","kind":16,"comment":{"summary":[],"blockTags":[{"tag":"@platform","content":[{"kind":"text","text":"web"}]}]},"type":{"type":"literal","value":"auto"}},{"name":"off","kind":16,"type":{"type":"literal","value":"off"}},{"name":"on","kind":16,"type":{"type":"literal","value":"on"}},{"name":"singleShot","kind":16,"comment":{"summary":[],"blockTags":[{"tag":"@platform","content":[{"kind":"text","text":"web"}]}]},"type":{"type":"literal","value":"singleShot"}}]},{"name":"CameraOrientation","kind":8,"children":[{"name":"landscapeLeft","kind":16,"type":{"type":"literal","value":3}},{"name":"landscapeRight","kind":16,"type":{"type":"literal","value":4}},{"name":"portrait","kind":16,"type":{"type":"literal","value":1}},{"name":"portraitUpsideDown","kind":16,"type":{"type":"literal","value":2}}]},{"name":"CameraType","kind":8,"children":[{"name":"back","kind":16,"type":{"type":"literal","value":"back"}},{"name":"front","kind":16,"type":{"type":"literal","value":"front"}}]},{"name":"FlashMode","kind":8,"children":[{"name":"auto","kind":16,"type":{"type":"literal","value":"auto"}},{"name":"off","kind":16,"type":{"type":"literal","value":"off"}},{"name":"on","kind":16,"type":{"type":"literal","value":"on"}},{"name":"torch","kind":16,"type":{"type":"literal","value":"torch"}}]},{"name":"ImageType","kind":8,"children":[{"name":"jpg","kind":16,"type":{"type":"literal","value":"jpg"}},{"name":"png","kind":16,"type":{"type":"literal","value":"png"}}]},{"name":"PermissionStatus","kind":8,"children":[{"name":"DENIED","kind":16,"comment":{"summary":[{"kind":"text","text":"User has denied the permission."}]},"type":{"type":"literal","value":"denied"}},{"name":"GRANTED","kind":16,"comment":{"summary":[{"kind":"text","text":"User has granted the permission."}]},"type":{"type":"literal","value":"granted"}},{"name":"UNDETERMINED","kind":16,"comment":{"summary":[{"kind":"text","text":"User hasn't granted or denied the permission yet."}]},"type":{"type":"literal","value":"undetermined"}}]},{"name":"VideoCodec","kind":8,"comment":{"summary":[{"kind":"text","text":"This option specifies what codec to use when recording a video."}],"blockTags":[{"tag":"@platform","content":[{"kind":"text","text":"ios"}]}]},"children":[{"name":"AppleProRes422","kind":16,"type":{"type":"literal","value":"apcn"}},{"name":"AppleProRes4444","kind":16,"type":{"type":"literal","value":"ap4h"}},{"name":"H264","kind":16,"type":{"type":"literal","value":"avc1"}},{"name":"HEVC","kind":16,"type":{"type":"literal","value":"hvc1"}},{"name":"JPEG","kind":16,"type":{"type":"literal","value":"jpeg"}}]},{"name":"VideoQuality","kind":8,"children":[{"name":"1080p","kind":16,"type":{"type":"literal","value":"1080p"}},{"name":"2160p","kind":16,"type":{"type":"literal","value":"2160p"}},{"name":"480p","kind":16,"type":{"type":"literal","value":"480p"}},{"name":"4:3","kind":16,"type":{"type":"literal","value":"4:3"}},{"name":"720p","kind":16,"type":{"type":"literal","value":"720p"}}]},{"name":"VideoStabilization","kind":8,"comment":{"summary":[{"kind":"text","text":"This option specifies the stabilization mode to use when recording a video."}],"blockTags":[{"tag":"@platform","content":[{"kind":"text","text":"ios"}]}]},"children":[{"name":"auto","kind":16,"type":{"type":"literal","value":"auto"}},{"name":"cinematic","kind":16,"type":{"type":"literal","value":"cinematic"}},{"name":"off","kind":16,"type":{"type":"literal","value":"off"}},{"name":"standard","kind":16,"type":{"type":"literal","value":"standard"}}]},{"name":"WhiteBalance","kind":8,"children":[{"name":"auto","kind":16,"type":{"type":"literal","value":"auto"}},{"name":"cloudy","kind":16,"comment":{"summary":[],"blockTags":[{"tag":"@platform","content":[{"kind":"text","text":"android"}]},{"tag":"@platform","content":[{"kind":"text","text":"ios"}]}]},"type":{"type":"literal","value":"cloudy"}},{"name":"continuous","kind":16,"comment":{"summary":[],"blockTags":[{"tag":"@platform","content":[{"kind":"text","text":"web"}]}]},"type":{"type":"literal","value":"continuous"}},{"name":"fluorescent","kind":16,"comment":{"summary":[],"blockTags":[{"tag":"@platform","content":[{"kind":"text","text":"android"}]},{"tag":"@platform","content":[{"kind":"text","text":"ios"}]}]},"type":{"type":"literal","value":"fluorescent"}},{"name":"incandescent","kind":16,"comment":{"summary":[],"blockTags":[{"tag":"@platform","content":[{"kind":"text","text":"android"}]},{"tag":"@platform","content":[{"kind":"text","text":"ios"}]}]},"type":{"type":"literal","value":"incandescent"}},{"name":"manual","kind":16,"comment":{"summary":[],"blockTags":[{"tag":"@platform","content":[{"kind":"text","text":"web"}]}]},"type":{"type":"literal","value":"manual"}},{"name":"shadow","kind":16,"comment":{"summary":[],"blockTags":[{"tag":"@platform","content":[{"kind":"text","text":"android"}]},{"tag":"@platform","content":[{"kind":"text","text":"ios"}]}]},"type":{"type":"literal","value":"shadow"}},{"name":"sunny","kind":16,"comment":{"summary":[],"blockTags":[{"tag":"@platform","content":[{"kind":"text","text":"android"}]},{"tag":"@platform","content":[{"kind":"text","text":"ios"}]}]},"type":{"type":"literal","value":"sunny"}}]},{"name":"Camera","kind":128,"children":[{"name":"constructor","kind":512,"flags":{"isExternal":true},"signatures":[{"name":"new Camera","kind":16384,"flags":{"isExternal":true},"parameters":[{"name":"props","kind":32768,"flags":{"isExternal":true},"type":{"type":"union","types":[{"type":"reference","name":"CameraProps"},{"type":"reference","typeArguments":[{"type":"reference","name":"CameraProps"}],"name":"Readonly","qualifiedName":"Readonly","package":"typescript"}]}}],"type":{"type":"reference","name":"default"},"inheritedFrom":{"type":"reference","name":"React.Component.constructor"}},{"name":"new Camera","kind":16384,"flags":{"isExternal":true},"comment":{"summary":[],"blockTags":[{"tag":"@deprecated","content":[]},{"tag":"@see","content":[{"kind":"text","text":"https://reactjs.org/docs/legacy-context.html"}]}]},"parameters":[{"name":"props","kind":32768,"flags":{"isExternal":true},"type":{"type":"reference","name":"CameraProps"}},{"name":"context","kind":32768,"flags":{"isExternal":true},"type":{"type":"intrinsic","name":"any"}}],"type":{"type":"reference","name":"default"},"inheritedFrom":{"type":"reference","name":"React.Component.constructor"}}],"inheritedFrom":{"type":"reference","name":"React.Component.constructor"}},{"name":"_cameraHandle","kind":1024,"flags":{"isOptional":true},"type":{"type":"union","types":[{"type":"literal","value":null},{"type":"intrinsic","name":"number"}]}},{"name":"_cameraRef","kind":1024,"flags":{"isOptional":true},"type":{"type":"union","types":[{"type":"literal","value":null},{"type":"reference","typeArguments":[{"type":"reflection","declaration":{"name":"__type","kind":65536}},{"type":"reflection","declaration":{"name":"__type","kind":65536}},{"type":"intrinsic","name":"any"}],"name":"Component","qualifiedName":"React.Component","package":"@types/react"}]}},{"name":"_lastEvents","kind":1024,"type":{"type":"reflection","declaration":{"name":"__type","kind":65536,"indexSignature":{"name":"__index","kind":8192,"parameters":[{"name":"eventName","kind":32768,"type":{"type":"intrinsic","name":"string"}}],"type":{"type":"intrinsic","name":"string"}}}},"defaultValue":"{}"},{"name":"_lastEventsTimes","kind":1024,"type":{"type":"reflection","declaration":{"name":"__type","kind":65536,"indexSignature":{"name":"__index","kind":8192,"parameters":[{"name":"eventName","kind":32768,"type":{"type":"intrinsic","name":"string"}}],"type":{"type":"reference","name":"Date","qualifiedName":"Date","package":"typescript"}}}},"defaultValue":"{}"},{"name":"Constants","kind":1024,"flags":{"isStatic":true},"type":{"type":"reference","name":"ConstantsType"},"defaultValue":"..."},{"name":"ConversionTables","kind":1024,"flags":{"isStatic":true},"type":{"type":"reflection","declaration":{"name":"__type","kind":65536,"children":[{"name":"autoFocus","kind":1024,"type":{"type":"reference","typeArguments":[{"type":"union","types":[{"type":"literal","value":"on"},{"type":"literal","value":"off"},{"type":"literal","value":"auto"},{"type":"literal","value":"singleShot"}]},{"type":"union","types":[{"type":"intrinsic","name":"undefined"},{"type":"intrinsic","name":"string"},{"type":"intrinsic","name":"number"},{"type":"intrinsic","name":"boolean"}]}],"name":"Record","qualifiedName":"Record","package":"typescript"}},{"name":"flashMode","kind":1024,"type":{"type":"reference","typeArguments":[{"type":"union","types":[{"type":"literal","value":"on"},{"type":"literal","value":"off"},{"type":"literal","value":"auto"},{"type":"literal","value":"torch"}]},{"type":"union","types":[{"type":"intrinsic","name":"undefined"},{"type":"intrinsic","name":"string"},{"type":"intrinsic","name":"number"}]}],"name":"Record","qualifiedName":"Record","package":"typescript"}},{"name":"type","kind":1024,"type":{"type":"reference","typeArguments":[{"type":"union","types":[{"type":"literal","value":"front"},{"type":"literal","value":"back"}]},{"type":"union","types":[{"type":"intrinsic","name":"undefined"},{"type":"intrinsic","name":"string"},{"type":"intrinsic","name":"number"}]}],"name":"Record","qualifiedName":"Record","package":"typescript"}},{"name":"whiteBalance","kind":1024,"type":{"type":"reference","typeArguments":[{"type":"union","types":[{"type":"literal","value":"auto"},{"type":"literal","value":"sunny"},{"type":"literal","value":"cloudy"},{"type":"literal","value":"shadow"},{"type":"literal","value":"incandescent"},{"type":"literal","value":"fluorescent"},{"type":"literal","value":"continuous"},{"type":"literal","value":"manual"}]},{"type":"union","types":[{"type":"intrinsic","name":"undefined"},{"type":"intrinsic","name":"string"},{"type":"intrinsic","name":"number"}]}],"name":"Record","qualifiedName":"Record","package":"typescript"}}]}},"defaultValue":"ConversionTables"},{"name":"defaultProps","kind":1024,"flags":{"isStatic":true},"type":{"type":"reference","name":"CameraProps"},"defaultValue":"..."},{"name":"useCameraPermissions","kind":1024,"flags":{"isStatic":true},"type":{"type":"reflection","declaration":{"name":"__type","kind":65536,"signatures":[{"name":"__type","kind":4096,"comment":{"summary":[{"kind":"text","text":"Check or request permissions to access the camera.\nThis uses both "},{"kind":"code","text":"`requestCameraPermissionsAsync`"},{"kind":"text","text":" and "},{"kind":"code","text":"`getCameraPermissionsAsync`"},{"kind":"text","text":" to interact with the permissions."}],"blockTags":[{"tag":"@example","content":[{"kind":"code","text":"```ts\nconst [status, requestPermission] = Camera.useCameraPermissions();\n```"}]}]},"parameters":[{"name":"options","kind":32768,"flags":{"isOptional":true},"type":{"type":"reference","typeArguments":[{"type":"intrinsic","name":"object"}],"name":"PermissionHookOptions"}}],"type":{"type":"tuple","elements":[{"type":"union","types":[{"type":"literal","value":null},{"type":"reference","name":"PermissionResponse"}]},{"type":"reference","typeArguments":[{"type":"reference","name":"PermissionResponse"}],"name":"RequestPermissionMethod"},{"type":"reference","typeArguments":[{"type":"reference","name":"PermissionResponse"}],"name":"GetPermissionMethod"}]}}]}},"defaultValue":"..."},{"name":"useMicrophonePermissions","kind":1024,"flags":{"isStatic":true},"type":{"type":"reflection","declaration":{"name":"__type","kind":65536,"signatures":[{"name":"__type","kind":4096,"comment":{"summary":[{"kind":"text","text":"Check or request permissions to access the microphone.\nThis uses both "},{"kind":"code","text":"`requestMicrophonePermissionsAsync`"},{"kind":"text","text":" and "},{"kind":"code","text":"`getMicrophonePermissionsAsync`"},{"kind":"text","text":" to interact with the permissions."}],"blockTags":[{"tag":"@example","content":[{"kind":"code","text":"```ts\nconst [status, requestPermission] = Camera.useMicrophonePermissions();\n```"}]}]},"parameters":[{"name":"options","kind":32768,"flags":{"isOptional":true},"type":{"type":"reference","typeArguments":[{"type":"intrinsic","name":"object"}],"name":"PermissionHookOptions"}}],"type":{"type":"tuple","elements":[{"type":"union","types":[{"type":"literal","value":null},{"type":"reference","name":"PermissionResponse"}]},{"type":"reference","typeArguments":[{"type":"reference","name":"PermissionResponse"}],"name":"RequestPermissionMethod"},{"type":"reference","typeArguments":[{"type":"reference","name":"PermissionResponse"}],"name":"GetPermissionMethod"}]}}]}},"defaultValue":"..."},{"name":"_onCameraReady","kind":2048,"signatures":[{"name":"_onCameraReady","kind":4096,"type":{"type":"intrinsic","name":"void"}}]},{"name":"_onMountError","kind":2048,"signatures":[{"name":"_onMountError","kind":4096,"parameters":[{"name":"__namedParameters","kind":32768,"type":{"type":"reflection","declaration":{"name":"__type","kind":65536,"children":[{"name":"nativeEvent","kind":1024,"type":{"type":"reflection","declaration":{"name":"__type","kind":65536,"children":[{"name":"message","kind":1024,"type":{"type":"intrinsic","name":"string"}}]}}}]}}}],"type":{"type":"intrinsic","name":"void"}}]},{"name":"_onObjectDetected","kind":2048,"signatures":[{"name":"_onObjectDetected","kind":4096,"parameters":[{"name":"callback","kind":32768,"flags":{"isOptional":true},"type":{"type":"reference","name":"Function","qualifiedName":"Function","package":"typescript"}}],"type":{"type":"reflection","declaration":{"name":"__type","kind":65536,"signatures":[{"name":"__type","kind":4096,"parameters":[{"name":"__namedParameters","kind":32768,"type":{"type":"reflection","declaration":{"name":"__type","kind":65536,"children":[{"name":"nativeEvent","kind":1024,"type":{"type":"intrinsic","name":"any"}}]}}}],"type":{"type":"intrinsic","name":"void"}}]}}}]},{"name":"_onResponsiveOrientationChanged","kind":2048,"signatures":[{"name":"_onResponsiveOrientationChanged","kind":4096,"parameters":[{"name":"__namedParameters","kind":32768,"type":{"type":"reflection","declaration":{"name":"__type","kind":65536,"children":[{"name":"nativeEvent","kind":1024,"type":{"type":"reflection","declaration":{"name":"__type","kind":65536,"children":[{"name":"orientation","kind":1024,"type":{"type":"reference","name":"CameraOrientation"}}]}}}]}}}],"type":{"type":"intrinsic","name":"void"}}]},{"name":"_setReference","kind":2048,"signatures":[{"name":"_setReference","kind":4096,"parameters":[{"name":"ref","kind":32768,"flags":{"isOptional":true},"type":{"type":"reference","typeArguments":[{"type":"reflection","declaration":{"name":"__type","kind":65536}},{"type":"reflection","declaration":{"name":"__type","kind":65536}},{"type":"intrinsic","name":"any"}],"name":"Component","qualifiedName":"React.Component","package":"@types/react"}}],"type":{"type":"intrinsic","name":"void"}}]},{"name":"getAvailablePictureSizesAsync","kind":2048,"signatures":[{"name":"getAvailablePictureSizesAsync","kind":4096,"comment":{"summary":[{"kind":"text","text":"Get picture sizes that are supported by the device for given "},{"kind":"code","text":"`ratio`"},{"kind":"text","text":"."}],"blockTags":[{"tag":"@returns","content":[{"kind":"text","text":"Returns a Promise that resolves to an array of strings representing picture sizes that can be passed to "},{"kind":"code","text":"`pictureSize`"},{"kind":"text","text":" prop.\nThe list varies across Android devices but is the same for every iOS."}]}]},"parameters":[{"name":"ratio","kind":32768,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"A string representing aspect ratio of sizes to be returned."}]},"type":{"type":"intrinsic","name":"string"}}],"type":{"type":"reference","typeArguments":[{"type":"array","elementType":{"type":"intrinsic","name":"string"}}],"name":"Promise","qualifiedName":"Promise","package":"typescript"}}]},{"name":"getSupportedRatiosAsync","kind":2048,"signatures":[{"name":"getSupportedRatiosAsync","kind":4096,"comment":{"summary":[{"kind":"text","text":"Get aspect ratios that are supported by the device and can be passed via "},{"kind":"code","text":"`ratio`"},{"kind":"text","text":" prop."}],"blockTags":[{"tag":"@returns","content":[{"kind":"text","text":"Returns a Promise that resolves to an array of strings representing ratios, eg. "},{"kind":"code","text":"`['4:3', '1:1']`"},{"kind":"text","text":"."}]},{"tag":"@platform","content":[{"kind":"text","text":"android"}]}]},"type":{"type":"reference","typeArguments":[{"type":"array","elementType":{"type":"intrinsic","name":"string"}}],"name":"Promise","qualifiedName":"Promise","package":"typescript"}}]},{"name":"pausePreview","kind":2048,"signatures":[{"name":"pausePreview","kind":4096,"comment":{"summary":[{"kind":"text","text":"Pauses the camera preview. It is not recommended to use "},{"kind":"code","text":"`takePictureAsync`"},{"kind":"text","text":" when preview is paused."}]},"type":{"type":"intrinsic","name":"void"}}]},{"name":"recordAsync","kind":2048,"signatures":[{"name":"recordAsync","kind":4096,"comment":{"summary":[{"kind":"text","text":"Starts recording a video that will be saved to cache directory. Videos are rotated to match device's orientation.\nFlipping camera during a recording results in stopping it."}],"blockTags":[{"tag":"@returns","content":[{"kind":"text","text":"Returns a Promise that resolves to an object containing video file "},{"kind":"code","text":"`uri`"},{"kind":"text","text":" property and a "},{"kind":"code","text":"`codec`"},{"kind":"text","text":" property on iOS.\nThe Promise is returned if "},{"kind":"code","text":"`stopRecording`"},{"kind":"text","text":" was invoked, one of "},{"kind":"code","text":"`maxDuration`"},{"kind":"text","text":" and "},{"kind":"code","text":"`maxFileSize`"},{"kind":"text","text":" is reached or camera preview is stopped."}]},{"tag":"@platform","content":[{"kind":"text","text":"android"}]},{"tag":"@platform","content":[{"kind":"text","text":"ios"}]}]},"parameters":[{"name":"options","kind":32768,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"A map of "},{"kind":"code","text":"`CameraRecordingOptions`"},{"kind":"text","text":" type."}]},"type":{"type":"reference","name":"CameraRecordingOptions"}}],"type":{"type":"reference","typeArguments":[{"type":"reflection","declaration":{"name":"__type","kind":65536,"children":[{"name":"uri","kind":1024,"type":{"type":"intrinsic","name":"string"}}]}}],"name":"Promise","qualifiedName":"Promise","package":"typescript"}}]},{"name":"render","kind":2048,"signatures":[{"name":"render","kind":4096,"type":{"type":"reference","name":"Element","qualifiedName":"global.JSX.Element","package":"@types/react"},"overwrites":{"type":"reference","name":"React.Component.render"}}],"overwrites":{"type":"reference","name":"React.Component.render"}},{"name":"resumePreview","kind":2048,"signatures":[{"name":"resumePreview","kind":4096,"comment":{"summary":[{"kind":"text","text":"Resumes the camera preview."}]},"type":{"type":"intrinsic","name":"void"}}]},{"name":"stopRecording","kind":2048,"signatures":[{"name":"stopRecording","kind":4096,"comment":{"summary":[{"kind":"text","text":"Stops recording if any is in progress."}]},"type":{"type":"intrinsic","name":"void"}}]},{"name":"takePictureAsync","kind":2048,"signatures":[{"name":"takePictureAsync","kind":4096,"comment":{"summary":[{"kind":"text","text":"Takes a picture and saves it to app's cache directory. Photos are rotated to match device's orientation\n(if "},{"kind":"code","text":"`options.skipProcessing`"},{"kind":"text","text":" flag is not enabled) and scaled to match the preview. Anyway on Android it is essential\nto set ratio prop to get a picture with correct dimensions.\n> **Note**: Make sure to wait for the ["},{"kind":"code","text":"`onCameraReady`"},{"kind":"text","text":"](#oncameraready) callback before calling this method."}],"blockTags":[{"tag":"@returns","content":[{"kind":"text","text":"Returns a Promise that resolves to "},{"kind":"code","text":"`CameraCapturedPicture`"},{"kind":"text","text":" object, where "},{"kind":"code","text":"`uri`"},{"kind":"text","text":" is a URI to the local image file on iOS,\nAndroid, and a base64 string on web (usable as the source for an "},{"kind":"code","text":"`Image`"},{"kind":"text","text":" element). The "},{"kind":"code","text":"`width`"},{"kind":"text","text":" and "},{"kind":"code","text":"`height`"},{"kind":"text","text":" properties specify\nthe dimensions of the image. "},{"kind":"code","text":"`base64`"},{"kind":"text","text":" is included if the "},{"kind":"code","text":"`base64`"},{"kind":"text","text":" option was truthy, and is a string containing the JPEG data\nof the image in Base64--prepend that with "},{"kind":"code","text":"`'data:image/jpg;base64,'`"},{"kind":"text","text":" to get a data URI, which you can use as the source\nfor an "},{"kind":"code","text":"`Image`"},{"kind":"text","text":" element for example. "},{"kind":"code","text":"`exif`"},{"kind":"text","text":" is included if the "},{"kind":"code","text":"`exif`"},{"kind":"text","text":" option was truthy, and is an object containing EXIF\ndata for the image--the names of its properties are EXIF tags and their values are the values for those tags.\n\n> On native platforms, the local image URI is temporary. Use ["},{"kind":"code","text":"`FileSystem.copyAsync`"},{"kind":"text","text":"](filesystem.md#filesystemcopyasyncoptions)\n> to make a permanent copy of the image."}]}]},"parameters":[{"name":"options","kind":32768,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"An object in form of "},{"kind":"code","text":"`CameraPictureOptions`"},{"kind":"text","text":" type."}]},"type":{"type":"reference","name":"CameraPictureOptions"}}],"type":{"type":"reference","typeArguments":[{"type":"reference","name":"CameraCapturedPicture"}],"name":"Promise","qualifiedName":"Promise","package":"typescript"}}]},{"name":"getAvailableCameraTypesAsync","kind":2048,"flags":{"isStatic":true},"signatures":[{"name":"getAvailableCameraTypesAsync","kind":4096,"comment":{"summary":[{"kind":"text","text":"Returns a list of camera types "},{"kind":"code","text":"`['front', 'back']`"},{"kind":"text","text":". This is useful for desktop browsers which only have front-facing cameras."}],"blockTags":[{"tag":"@platform","content":[{"kind":"text","text":"web"}]}]},"type":{"type":"reference","typeArguments":[{"type":"array","elementType":{"type":"reference","name":"CameraType"}}],"name":"Promise","qualifiedName":"Promise","package":"typescript"}}]},{"name":"getAvailableVideoCodecsAsync","kind":2048,"flags":{"isStatic":true},"signatures":[{"name":"getAvailableVideoCodecsAsync","kind":4096,"comment":{"summary":[{"kind":"text","text":"Queries the device for the available video codecs that can be used in video recording."}],"blockTags":[{"tag":"@returns","content":[{"kind":"text","text":"A promise that resolves to a list of strings that represents available codecs."}]},{"tag":"@platform","content":[{"kind":"text","text":"ios"}]}]},"type":{"type":"reference","typeArguments":[{"type":"array","elementType":{"type":"reference","name":"VideoCodec"}}],"name":"Promise","qualifiedName":"Promise","package":"typescript"}}]},{"name":"getCameraPermissionsAsync","kind":2048,"flags":{"isStatic":true},"signatures":[{"name":"getCameraPermissionsAsync","kind":4096,"comment":{"summary":[{"kind":"text","text":"Checks user's permissions for accessing camera."}],"blockTags":[{"tag":"@returns","content":[{"kind":"text","text":"A promise that resolves to an object of type [PermissionResponse](#permissionresponse)."}]}]},"type":{"type":"reference","typeArguments":[{"type":"reference","name":"PermissionResponse"}],"name":"Promise","qualifiedName":"Promise","package":"typescript"}}]},{"name":"getMicrophonePermissionsAsync","kind":2048,"flags":{"isStatic":true},"signatures":[{"name":"getMicrophonePermissionsAsync","kind":4096,"comment":{"summary":[{"kind":"text","text":"Checks user's permissions for accessing microphone."}],"blockTags":[{"tag":"@returns","content":[{"kind":"text","text":"A promise that resolves to an object of type [PermissionResponse](#permissionresponse)."}]}]},"type":{"type":"reference","typeArguments":[{"type":"reference","name":"PermissionResponse"}],"name":"Promise","qualifiedName":"Promise","package":"typescript"}}]},{"name":"getPermissionsAsync","kind":2048,"flags":{"isStatic":true},"signatures":[{"name":"getPermissionsAsync","kind":4096,"comment":{"summary":[],"blockTags":[{"tag":"@deprecated","content":[{"kind":"text","text":"Use "},{"kind":"code","text":"`getCameraPermissionsAsync`"},{"kind":"text","text":" or "},{"kind":"code","text":"`getMicrophonePermissionsAsync`"},{"kind":"text","text":" instead.\nChecks user's permissions for accessing camera."}]}]},"type":{"type":"reference","typeArguments":[{"type":"reference","name":"PermissionResponse"}],"name":"Promise","qualifiedName":"Promise","package":"typescript"}}]},{"name":"isAvailableAsync","kind":2048,"flags":{"isStatic":true},"signatures":[{"name":"isAvailableAsync","kind":4096,"comment":{"summary":[{"kind":"text","text":"Check whether the current device has a camera. This is useful for web and simulators cases.\nThis isn't influenced by the Permissions API (all platforms), or HTTP usage (in the browser).\nYou will still need to check if the native permission has been accepted."}],"blockTags":[{"tag":"@platform","content":[{"kind":"text","text":"web"}]}]},"type":{"type":"reference","typeArguments":[{"type":"intrinsic","name":"boolean"}],"name":"Promise","qualifiedName":"Promise","package":"typescript"}}]},{"name":"requestCameraPermissionsAsync","kind":2048,"flags":{"isStatic":true},"signatures":[{"name":"requestCameraPermissionsAsync","kind":4096,"comment":{"summary":[{"kind":"text","text":"Asks the user to grant permissions for accessing camera.\nOn iOS this will require apps to specify an "},{"kind":"code","text":"`NSCameraUsageDescription`"},{"kind":"text","text":" entry in the **Info.plist**."}],"blockTags":[{"tag":"@returns","content":[{"kind":"text","text":"A promise that resolves to an object of type [PermissionResponse](#permissionresponse)."}]}]},"type":{"type":"reference","typeArguments":[{"type":"reference","name":"PermissionResponse"}],"name":"Promise","qualifiedName":"Promise","package":"typescript"}}]},{"name":"requestMicrophonePermissionsAsync","kind":2048,"flags":{"isStatic":true},"signatures":[{"name":"requestMicrophonePermissionsAsync","kind":4096,"comment":{"summary":[{"kind":"text","text":"Asks the user to grant permissions for accessing the microphone.\nOn iOS this will require apps to specify an "},{"kind":"code","text":"`NSMicrophoneUsageDescription`"},{"kind":"text","text":" entry in the **Info.plist**."}],"blockTags":[{"tag":"@returns","content":[{"kind":"text","text":"A promise that resolves to an object of type [PermissionResponse](#permissionresponse)."}]}]},"type":{"type":"reference","typeArguments":[{"type":"reference","name":"PermissionResponse"}],"name":"Promise","qualifiedName":"Promise","package":"typescript"}}]},{"name":"requestPermissionsAsync","kind":2048,"flags":{"isStatic":true},"signatures":[{"name":"requestPermissionsAsync","kind":4096,"comment":{"summary":[{"kind":"text","text":"Asks the user to grant permissions for accessing camera.\nOn iOS this will require apps to specify both "},{"kind":"code","text":"`NSCameraUsageDescription`"},{"kind":"text","text":" and "},{"kind":"code","text":"`NSMicrophoneUsageDescription`"},{"kind":"text","text":" entries in the **Info.plist**."}],"blockTags":[{"tag":"@returns","content":[{"kind":"text","text":"A promise that resolves to an object of type [PermissionResponse](#permissionresponse)."}]},{"tag":"@deprecated","content":[{"kind":"text","text":"Use "},{"kind":"code","text":"`requestCameraPermissionsAsync`"},{"kind":"text","text":" or "},{"kind":"code","text":"`requestMicrophonePermissionsAsync`"},{"kind":"text","text":" instead."}]}]},"type":{"type":"reference","typeArguments":[{"type":"reference","name":"PermissionResponse"}],"name":"Promise","qualifiedName":"Promise","package":"typescript"}}]}],"extendedTypes":[{"type":"reference","typeArguments":[{"type":"reference","name":"CameraProps"}],"name":"Component","qualifiedName":"React.Component","package":"@types/react"}]},{"name":"PermissionResponse","kind":256,"comment":{"summary":[{"kind":"text","text":"An object obtained by permissions get and request functions."}]},"children":[{"name":"canAskAgain","kind":1024,"comment":{"summary":[{"kind":"text","text":"Indicates if user can be asked again for specific permission.\nIf not, one should be directed to the Settings app\nin order to enable/disable the permission."}]},"type":{"type":"intrinsic","name":"boolean"}},{"name":"expires","kind":1024,"comment":{"summary":[{"kind":"text","text":"Determines time when the permission expires."}]},"type":{"type":"reference","name":"PermissionExpiration"}},{"name":"granted","kind":1024,"comment":{"summary":[{"kind":"text","text":"A convenience boolean that indicates if the permission is granted."}]},"type":{"type":"intrinsic","name":"boolean"}},{"name":"status","kind":1024,"comment":{"summary":[{"kind":"text","text":"Determines the status of the permission."}]},"type":{"type":"reference","name":"PermissionStatus"}}]},{"name":"BarCodeBounds","kind":4194304,"type":{"type":"reflection","declaration":{"name":"__type","kind":65536,"children":[{"name":"origin","kind":1024,"comment":{"summary":[{"kind":"text","text":"The origin point of the bounding box."}]},"type":{"type":"reference","name":"BarCodePoint"}},{"name":"size","kind":1024,"comment":{"summary":[{"kind":"text","text":"The size of the bounding box."}]},"type":{"type":"reference","name":"BarCodeSize"}}]}}},{"name":"BarCodePoint","kind":4194304,"comment":{"summary":[{"kind":"text","text":"These coordinates are represented in the coordinate space of the camera source (e.g. when you\nare using the camera view, these values are adjusted to the dimensions of the view)."}]},"type":{"type":"reference","name":"Point"}},{"name":"BarCodeScanningResult","kind":4194304,"type":{"type":"reflection","declaration":{"name":"__type","kind":65536,"children":[{"name":"bounds","kind":1024,"comment":{"summary":[{"kind":"text","text":"The [BarCodeBounds](#barcodebounds) object.\n"},{"kind":"code","text":"`bounds`"},{"kind":"text","text":" in some case will be representing an empty rectangle.\nMoreover, "},{"kind":"code","text":"`bounds`"},{"kind":"text","text":" doesn't have to bound the whole barcode.\nFor some types, they will represent the area used by the scanner."}]},"type":{"type":"reference","name":"BarCodeBounds"}},{"name":"cornerPoints","kind":1024,"comment":{"summary":[{"kind":"text","text":"Corner points of the bounding box.\n"},{"kind":"code","text":"`cornerPoints`"},{"kind":"text","text":" is not always available and may be empty. On iOS, for "},{"kind":"code","text":"`code39`"},{"kind":"text","text":" and "},{"kind":"code","text":"`pdf417`"},{"kind":"text","text":"\nyou don't get this value."}]},"type":{"type":"array","elementType":{"type":"reference","name":"BarCodePoint"}}},{"name":"data","kind":1024,"comment":{"summary":[{"kind":"text","text":"The information encoded in the bar code."}]},"type":{"type":"intrinsic","name":"string"}},{"name":"type","kind":1024,"comment":{"summary":[{"kind":"text","text":"The barcode type."}]},"type":{"type":"intrinsic","name":"string"}}]}}},{"name":"BarCodeSettings","kind":4194304,"type":{"type":"reflection","declaration":{"name":"__type","kind":65536,"children":[{"name":"barCodeTypes","kind":1024,"type":{"type":"array","elementType":{"type":"intrinsic","name":"string"}}},{"name":"interval","kind":1024,"flags":{"isOptional":true},"type":{"type":"intrinsic","name":"number"}}]}}},{"name":"BarCodeSize","kind":4194304,"type":{"type":"reflection","declaration":{"name":"__type","kind":65536,"children":[{"name":"height","kind":1024,"comment":{"summary":[{"kind":"text","text":"The height value."}]},"type":{"type":"intrinsic","name":"number"}},{"name":"width","kind":1024,"comment":{"summary":[{"kind":"text","text":"The width value."}]},"type":{"type":"intrinsic","name":"number"}}]}}},{"name":"CameraCapturedPicture","kind":4194304,"type":{"type":"reflection","declaration":{"name":"__type","kind":65536,"children":[{"name":"base64","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"A Base64 representation of the image."}]},"type":{"type":"intrinsic","name":"string"}},{"name":"exif","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"On Android and iOS this object may include various fields based on the device and operating system.\nOn web, it is a partial representation of the ["},{"kind":"code","text":"`MediaTrackSettings`"},{"kind":"text","text":"](https://developer.mozilla.org/en-US/docs/Web/API/MediaTrackSettings) dictionary."}]},"type":{"type":"union","types":[{"type":"reference","typeArguments":[{"type":"reference","name":"MediaTrackSettings","qualifiedName":"MediaTrackSettings","package":"typescript"}],"name":"Partial","qualifiedName":"Partial","package":"typescript"},{"type":"intrinsic","name":"any"}]}},{"name":"height","kind":1024,"comment":{"summary":[{"kind":"text","text":"Captured image height."}]},"type":{"type":"intrinsic","name":"number"}},{"name":"uri","kind":1024,"comment":{"summary":[{"kind":"text","text":"On web, the value of "},{"kind":"code","text":"`uri`"},{"kind":"text","text":" is the same as "},{"kind":"code","text":"`base64`"},{"kind":"text","text":" because file system URLs are not supported in the browser."}]},"type":{"type":"intrinsic","name":"string"}},{"name":"width","kind":1024,"comment":{"summary":[{"kind":"text","text":"Captured image width."}]},"type":{"type":"intrinsic","name":"number"}}]}}},{"name":"CameraMountError","kind":4194304,"type":{"type":"reflection","declaration":{"name":"__type","kind":65536,"children":[{"name":"message","kind":1024,"type":{"type":"intrinsic","name":"string"}}]}}},{"name":"CameraPictureOptions","kind":4194304,"type":{"type":"reflection","declaration":{"name":"__type","kind":65536,"children":[{"name":"additionalExif","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"Additional EXIF data to be included for the image. Only useful when "},{"kind":"code","text":"`exif`"},{"kind":"text","text":" option is set to "},{"kind":"code","text":"`true`"},{"kind":"text","text":"."}],"blockTags":[{"tag":"@platform","content":[{"kind":"text","text":"android"}]},{"tag":"@platform","content":[{"kind":"text","text":"ios"}]}]},"type":{"type":"reflection","declaration":{"name":"__type","kind":65536,"indexSignature":{"name":"__index","kind":8192,"parameters":[{"name":"name","kind":32768,"type":{"type":"intrinsic","name":"string"}}],"type":{"type":"intrinsic","name":"any"}}}}},{"name":"base64","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"Whether to also include the image data in Base64 format."}]},"type":{"type":"intrinsic","name":"boolean"}},{"name":"exif","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"Whether to also include the EXIF data for the image."}]},"type":{"type":"intrinsic","name":"boolean"}},{"name":"imageType","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[],"blockTags":[{"tag":"@platform","content":[{"kind":"text","text":"web"}]}]},"type":{"type":"reference","name":"ImageType"}},{"name":"isImageMirror","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[],"blockTags":[{"tag":"@platform","content":[{"kind":"text","text":"web"}]}]},"type":{"type":"intrinsic","name":"boolean"}},{"name":"onPictureSaved","kind":1024,"flags":{"isOptional":true},"type":{"type":"reflection","declaration":{"name":"__type","kind":65536,"signatures":[{"name":"__type","kind":4096,"comment":{"summary":[{"kind":"text","text":"A callback invoked when picture is saved. If set, the promise of this method will resolve immediately with no data after picture is captured.\nThe data that it should contain will be passed to this callback. If displaying or processing a captured photo right after taking it\nis not your case, this callback lets you skip waiting for it to be saved."}]},"parameters":[{"name":"picture","kind":32768,"type":{"type":"reference","name":"CameraCapturedPicture"}}],"type":{"type":"intrinsic","name":"void"}}]}}},{"name":"quality","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"Specify the quality of compression, from 0 to 1. 0 means compress for small size, 1 means compress for maximum quality."}]},"type":{"type":"intrinsic","name":"number"}},{"name":"scale","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[],"blockTags":[{"tag":"@platform","content":[{"kind":"text","text":"web"}]}]},"type":{"type":"intrinsic","name":"number"}},{"name":"skipProcessing","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"If set to "},{"kind":"code","text":"`true`"},{"kind":"text","text":", camera skips orientation adjustment and returns an image straight from the device's camera.\nIf enabled, "},{"kind":"code","text":"`quality`"},{"kind":"text","text":" option is discarded (processing pipeline is skipped as a whole).\nAlthough enabling this option reduces image delivery time significantly, it may cause the image to appear in a wrong orientation\nin the "},{"kind":"code","text":"`Image`"},{"kind":"text","text":" component (at the time of writing, it does not respect EXIF orientation of the images).\n> **Note**: Enabling "},{"kind":"code","text":"`skipProcessing`"},{"kind":"text","text":" would cause orientation uncertainty. "},{"kind":"code","text":"`Image`"},{"kind":"text","text":" component does not respect EXIF\n> stored orientation information, that means obtained image would be displayed wrongly (rotated by 90°, 180° or 270°).\n> Different devices provide different orientations. For example some Sony Xperia or Samsung devices don't provide\n> correctly oriented images by default. To always obtain correctly oriented image disable "},{"kind":"code","text":"`skipProcessing`"},{"kind":"text","text":" option."}]},"type":{"type":"intrinsic","name":"boolean"}}]}}},{"name":"CameraProps","kind":4194304,"type":{"type":"intersection","types":[{"type":"reference","name":"ViewProps","qualifiedName":"ViewProps","package":"react-native"},{"type":"reflection","declaration":{"name":"__type","kind":65536,"children":[{"name":"autoFocus","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"State of camera auto focus. Use one of ["},{"kind":"code","text":"`AutoFocus.`"},{"kind":"text","text":"](#autofocus-1). When "},{"kind":"code","text":"`AutoFocus.on`"},{"kind":"text","text":",\nauto focus will be enabled, when "},{"kind":"code","text":"`AutoFocus.off`"},{"kind":"text","text":", it won't and focus will lock as it was in the moment of change,\nbut it can be adjusted on some devices via "},{"kind":"code","text":"`focusDepth`"},{"kind":"text","text":" prop."}],"blockTags":[{"tag":"@default","content":[{"kind":"text","text":"AutoFocus.on"}]}]},"type":{"type":"union","types":[{"type":"intrinsic","name":"boolean"},{"type":"intrinsic","name":"number"},{"type":"reference","name":"AutoFocus"}]}},{"name":"barCodeScannerSettings","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"Settings exposed by ["},{"kind":"code","text":"`BarCodeScanner`"},{"kind":"text","text":"](bar-code-scanner) module. Supported settings: **barCodeTypes**."}],"blockTags":[{"tag":"@example","content":[{"kind":"code","text":"```tsx\n \n```"}]}]},"type":{"type":"reference","name":"BarCodeSettings"}},{"name":"faceDetectorSettings","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"A settings object passed directly to an underlying module providing face detection features.\nSee ["},{"kind":"code","text":"`DetectionOptions`"},{"kind":"text","text":"](facedetector/#detectionoptions) in FaceDetector documentation for details."}]},"type":{"type":"intrinsic","name":"object"}},{"name":"flashMode","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"Camera flash mode. Use one of ["},{"kind":"code","text":"`FlashMode.`"},{"kind":"text","text":"](#flashmode-1). When "},{"kind":"code","text":"`FlashMode.on`"},{"kind":"text","text":", the flash on your device will\nturn on when taking a picture, when "},{"kind":"code","text":"`FlashMode.off`"},{"kind":"text","text":", it won't. Setting to "},{"kind":"code","text":"`FlashMode.auto`"},{"kind":"text","text":" will fire flash if required,\n"},{"kind":"code","text":"`FlashMode.torch`"},{"kind":"text","text":" turns on flash during the preview."}],"blockTags":[{"tag":"@default","content":[{"kind":"text","text":"FlashMode.off"}]}]},"type":{"type":"union","types":[{"type":"intrinsic","name":"number"},{"type":"reference","name":"FlashMode"}]}},{"name":"focusDepth","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"Distance to plane of the sharpest focus. A value between "},{"kind":"code","text":"`0`"},{"kind":"text","text":" and "},{"kind":"code","text":"`1`"},{"kind":"text","text":" where: "},{"kind":"code","text":"`0`"},{"kind":"text","text":" - infinity focus, "},{"kind":"code","text":"`1`"},{"kind":"text","text":" - focus as close as possible.\nFor Android this is available only for some devices and when "},{"kind":"code","text":"`useCamera2Api`"},{"kind":"text","text":" is set to "},{"kind":"code","text":"`true`"},{"kind":"text","text":"."}],"blockTags":[{"tag":"@default","content":[{"kind":"text","text":"0"}]}]},"type":{"type":"intrinsic","name":"number"}},{"name":"onBarCodeScanned","kind":1024,"flags":{"isOptional":true},"type":{"type":"reflection","declaration":{"name":"__type","kind":65536,"signatures":[{"name":"__type","kind":4096,"comment":{"summary":[{"kind":"text","text":"Callback that is invoked when a bar code has been successfully scanned. The callback is provided with\nan object of the ["},{"kind":"code","text":"`BarCodeScanningResult`"},{"kind":"text","text":"](#barcodescanningresult) shape, where the "},{"kind":"code","text":"`type`"},{"kind":"text","text":"\nrefers to the bar code type that was scanned and the "},{"kind":"code","text":"`data`"},{"kind":"text","text":" is the information encoded in the bar code\n(in this case of QR codes, this is often a URL). See ["},{"kind":"code","text":"`BarCodeScanner.Constants.BarCodeType`"},{"kind":"text","text":"](bar-code-scanner#supported-formats)\nfor supported values."}]},"parameters":[{"name":"scanningResult","kind":32768,"type":{"type":"reference","name":"BarCodeScanningResult"}}],"type":{"type":"intrinsic","name":"void"}}]}}},{"name":"onCameraReady","kind":1024,"flags":{"isOptional":true},"type":{"type":"reflection","declaration":{"name":"__type","kind":65536,"signatures":[{"name":"__type","kind":4096,"comment":{"summary":[{"kind":"text","text":"Callback invoked when camera preview has been set."}]},"type":{"type":"intrinsic","name":"void"}}]}}},{"name":"onFacesDetected","kind":1024,"flags":{"isOptional":true},"type":{"type":"reflection","declaration":{"name":"__type","kind":65536,"signatures":[{"name":"__type","kind":4096,"comment":{"summary":[{"kind":"text","text":"Callback invoked with results of face detection on the preview.\nSee ["},{"kind":"code","text":"`DetectionResult`"},{"kind":"text","text":"](facedetector/#detectionresult) in FaceDetector documentation for more details."}]},"parameters":[{"name":"faces","kind":32768,"type":{"type":"reference","name":"FaceDetectionResult"}}],"type":{"type":"intrinsic","name":"void"}}]}}},{"name":"onMountError","kind":1024,"flags":{"isOptional":true},"type":{"type":"reflection","declaration":{"name":"__type","kind":65536,"signatures":[{"name":"__type","kind":4096,"comment":{"summary":[{"kind":"text","text":"Callback invoked when camera preview could not been started."}]},"parameters":[{"name":"event","kind":32768,"comment":{"summary":[{"kind":"text","text":"Error object that contains a "},{"kind":"code","text":"`message`"},{"kind":"text","text":"."}]},"type":{"type":"reference","name":"CameraMountError"}}],"type":{"type":"intrinsic","name":"void"}}]}}},{"name":"onResponsiveOrientationChanged","kind":1024,"flags":{"isOptional":true},"type":{"type":"reflection","declaration":{"name":"__type","kind":65536,"signatures":[{"name":"__type","kind":4096,"comment":{"summary":[{"kind":"text","text":"Callback invoked when responsive orientation changes. Only applicable if "},{"kind":"code","text":"`responsiveOrientationWhenOrientationLocked`"},{"kind":"text","text":" is "},{"kind":"code","text":"`true`"}],"blockTags":[{"tag":"@platform","content":[{"kind":"text","text":"ios"}]}]},"parameters":[{"name":"event","kind":32768,"comment":{"summary":[{"kind":"text","text":"result object that contains updated orientation of camera"}]},"type":{"type":"reference","name":"ResponsiveOrientationChanged"}}],"type":{"type":"intrinsic","name":"void"}}]}}},{"name":"pictureSize","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"A string representing the size of pictures ["},{"kind":"code","text":"`takePictureAsync`"},{"kind":"text","text":"](#takepictureasync) will take.\nAvailable sizes can be fetched with ["},{"kind":"code","text":"`getAvailablePictureSizesAsync`"},{"kind":"text","text":"](#getavailablepicturesizesasync)."}]},"type":{"type":"intrinsic","name":"string"}},{"name":"poster","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"A URL for an image to be shown while the camera is loading."}],"blockTags":[{"tag":"@platform","content":[{"kind":"text","text":"web"}]}]},"type":{"type":"intrinsic","name":"string"}},{"name":"ratio","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"A string representing aspect ratio of the preview, eg. "},{"kind":"code","text":"`4:3`"},{"kind":"text","text":", "},{"kind":"code","text":"`16:9`"},{"kind":"text","text":", "},{"kind":"code","text":"`1:1`"},{"kind":"text","text":". To check if a ratio is supported\nby the device use ["},{"kind":"code","text":"`getSupportedRatiosAsync`"},{"kind":"text","text":"](#getsupportedratiosasync)."}],"blockTags":[{"tag":"@default","content":[{"kind":"text","text":"4:3"}]},{"tag":"@platform","content":[{"kind":"text","text":"android"}]}]},"type":{"type":"intrinsic","name":"string"}},{"name":"responsiveOrientationWhenOrientationLocked","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"Whether to allow responsive orientation of the camera when the screen orientation is locked (i.e. when set to "},{"kind":"code","text":"`true`"},{"kind":"text","text":"\nlandscape photos will be taken if the device is turned that way, even if the app or device orientation is locked to portrait)"}],"blockTags":[{"tag":"@platform","content":[{"kind":"text","text":"ios"}]}]},"type":{"type":"intrinsic","name":"boolean"}},{"name":"type","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"Camera facing. Use one of "},{"kind":"code","text":"`CameraType`"},{"kind":"text","text":". When "},{"kind":"code","text":"`CameraType.front`"},{"kind":"text","text":", use the front-facing camera.\nWhen "},{"kind":"code","text":"`CameraType.back`"},{"kind":"text","text":", use the back-facing camera."}],"blockTags":[{"tag":"@default","content":[{"kind":"text","text":"CameraType.back"}]}]},"type":{"type":"union","types":[{"type":"intrinsic","name":"number"},{"type":"reference","name":"CameraType"}]}},{"name":"useCamera2Api","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"Whether to use Android's Camera2 API. See "},{"kind":"code","text":"`Note`"},{"kind":"text","text":" at the top of this page."}],"blockTags":[{"tag":"@platform","content":[{"kind":"text","text":"android"}]}]},"type":{"type":"intrinsic","name":"boolean"}},{"name":"videoStabilizationMode","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"The video stabilization mode used for a video recording. Use one of ["},{"kind":"code","text":"`VideoStabilization.`"},{"kind":"text","text":"](#videostabilization).\nYou can read more about each stabilization type in [Apple Documentation](https://developer.apple.com/documentation/avfoundation/avcapturevideostabilizationmode)."}],"blockTags":[{"tag":"@platform","content":[{"kind":"text","text":"ios"}]}]},"type":{"type":"reference","name":"VideoStabilization"}},{"name":"whiteBalance","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"Camera white balance. Use one of ["},{"kind":"code","text":"`WhiteBalance.`"},{"kind":"text","text":"](#whitebalance). If a device does not support any of these values previous one is used."}],"blockTags":[{"tag":"@default","content":[{"kind":"text","text":"WhiteBalance.auto"}]}]},"type":{"type":"union","types":[{"type":"intrinsic","name":"number"},{"type":"reference","name":"WhiteBalance"}]}},{"name":"zoom","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"A value between "},{"kind":"code","text":"`0`"},{"kind":"text","text":" and "},{"kind":"code","text":"`1`"},{"kind":"text","text":" being a percentage of device's max zoom. "},{"kind":"code","text":"`0`"},{"kind":"text","text":" - not zoomed, "},{"kind":"code","text":"`1`"},{"kind":"text","text":" - maximum zoom."}],"blockTags":[{"tag":"@default","content":[{"kind":"text","text":"0"}]}]},"type":{"type":"intrinsic","name":"number"}}]}}]}},{"name":"CameraRecordingOptions","kind":4194304,"type":{"type":"reflection","declaration":{"name":"__type","kind":65536,"children":[{"name":"codec","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"This option specifies what codec to use when recording the video. See ["},{"kind":"code","text":"`VideoCodec`"},{"kind":"text","text":"](#videocodec) for the possible values."}],"blockTags":[{"tag":"@platform","content":[{"kind":"text","text":"ios"}]}]},"type":{"type":"reference","name":"VideoCodec"}},{"name":"maxDuration","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"Maximum video duration in seconds."}]},"type":{"type":"intrinsic","name":"number"}},{"name":"maxFileSize","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"Maximum video file size in bytes."}]},"type":{"type":"intrinsic","name":"number"}},{"name":"mirror","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"If "},{"kind":"code","text":"`true`"},{"kind":"text","text":", the recorded video will be flipped along the vertical axis. iOS flips videos recorded with the front camera by default,\nbut you can reverse that back by setting this to "},{"kind":"code","text":"`true`"},{"kind":"text","text":". On Android, this is handled in the user's device settings."}],"blockTags":[{"tag":"@platform","content":[{"kind":"text","text":"ios"}]}]},"type":{"type":"intrinsic","name":"boolean"}},{"name":"mute","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"If present, video will be recorded with no sound."}]},"type":{"type":"intrinsic","name":"boolean"}},{"name":"quality","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"Specify the quality of recorded video. Use one of ["},{"kind":"code","text":"`VideoQuality.`"},{"kind":"text","text":"](#videoquality).\nPossible values: for 16:9 resolution "},{"kind":"code","text":"`2160p`"},{"kind":"text","text":", "},{"kind":"code","text":"`1080p`"},{"kind":"text","text":", "},{"kind":"code","text":"`720p`"},{"kind":"text","text":", "},{"kind":"code","text":"`480p`"},{"kind":"text","text":" : "},{"kind":"code","text":"`Android only`"},{"kind":"text","text":" and for 4:3 "},{"kind":"code","text":"`4:3`"},{"kind":"text","text":" (the size is 640x480).\nIf the chosen quality is not available for a device, the highest available is chosen."}]},"type":{"type":"union","types":[{"type":"intrinsic","name":"number"},{"type":"intrinsic","name":"string"}]}},{"name":"videoBitrate","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"Only works if "},{"kind":"code","text":"`useCamera2Api`"},{"kind":"text","text":" is set to "},{"kind":"code","text":"`true`"},{"kind":"text","text":". This option specifies a desired video bitrate. For example, "},{"kind":"code","text":"`5*1000*1000`"},{"kind":"text","text":" would be 5Mbps."}],"blockTags":[{"tag":"@platform","content":[{"kind":"text","text":"android"}]}]},"type":{"type":"intrinsic","name":"number"}}]}}},{"name":"FaceDetectionResult","kind":4194304,"type":{"type":"reflection","declaration":{"name":"__type","kind":65536,"children":[{"name":"faces","kind":1024,"comment":{"summary":[{"kind":"text","text":"Array of objects representing results of face detection.\nSee ["},{"kind":"code","text":"`FaceFeature`"},{"kind":"text","text":"](facedetector/#facefeature) in FaceDetector documentation for more details."}]},"type":{"type":"array","elementType":{"type":"intrinsic","name":"object"}}}]}}},{"name":"PermissionExpiration","kind":4194304,"comment":{"summary":[{"kind":"text","text":"Permission expiration time. Currently, all permissions are granted permanently."}]},"type":{"type":"union","types":[{"type":"literal","value":"never"},{"type":"intrinsic","name":"number"}]}},{"name":"PermissionHookOptions","kind":4194304,"typeParameters":[{"name":"Options","kind":131072,"type":{"type":"intrinsic","name":"object"}}],"type":{"type":"intersection","types":[{"type":"reference","name":"PermissionHookBehavior"},{"type":"reference","name":"Options"}]}},{"name":"Point","kind":4194304,"type":{"type":"reflection","declaration":{"name":"__type","kind":65536,"children":[{"name":"x","kind":1024,"type":{"type":"intrinsic","name":"number"}},{"name":"y","kind":1024,"type":{"type":"intrinsic","name":"number"}}]}}},{"name":"ResponsiveOrientationChanged","kind":4194304,"type":{"type":"reflection","declaration":{"name":"__type","kind":65536,"children":[{"name":"orientation","kind":1024,"type":{"type":"reference","name":"CameraOrientation"}}]}}},{"name":"Constants","kind":32,"type":{"type":"reference","name":"ConstantsType"}},{"name":"getCameraPermissionsAsync","kind":64,"signatures":[{"name":"getCameraPermissionsAsync","kind":4096,"comment":{"summary":[{"kind":"text","text":"Checks user's permissions for accessing camera."}],"blockTags":[{"tag":"@returns","content":[{"kind":"text","text":"A promise that resolves to an object of type [PermissionResponse](#permissionresponse)."}]}]},"type":{"type":"reference","typeArguments":[{"type":"reference","name":"PermissionResponse"}],"name":"Promise","qualifiedName":"Promise","package":"typescript"}}]},{"name":"getMicrophonePermissionsAsync","kind":64,"signatures":[{"name":"getMicrophonePermissionsAsync","kind":4096,"comment":{"summary":[{"kind":"text","text":"Checks user's permissions for accessing microphone."}],"blockTags":[{"tag":"@returns","content":[{"kind":"text","text":"A promise that resolves to an object of type [PermissionResponse](#permissionresponse)."}]}]},"type":{"type":"reference","typeArguments":[{"type":"reference","name":"PermissionResponse"}],"name":"Promise","qualifiedName":"Promise","package":"typescript"}}]},{"name":"getPermissionsAsync","kind":64,"signatures":[{"name":"getPermissionsAsync","kind":4096,"comment":{"summary":[],"blockTags":[{"tag":"@deprecated","content":[{"kind":"text","text":"Use "},{"kind":"code","text":"`getCameraPermissionsAsync`"},{"kind":"text","text":" or "},{"kind":"code","text":"`getMicrophonePermissionsAsync`"},{"kind":"text","text":" instead.\nChecks user's permissions for accessing camera."}]}]},"type":{"type":"reference","typeArguments":[{"type":"reference","name":"PermissionResponse"}],"name":"Promise","qualifiedName":"Promise","package":"typescript"}}]},{"name":"requestCameraPermissionsAsync","kind":64,"signatures":[{"name":"requestCameraPermissionsAsync","kind":4096,"comment":{"summary":[{"kind":"text","text":"Asks the user to grant permissions for accessing camera.\nOn iOS this will require apps to specify an "},{"kind":"code","text":"`NSCameraUsageDescription`"},{"kind":"text","text":" entry in the **Info.plist**."}],"blockTags":[{"tag":"@returns","content":[{"kind":"text","text":"A promise that resolves to an object of type [PermissionResponse](#permissionresponse)."}]}]},"type":{"type":"reference","typeArguments":[{"type":"reference","name":"PermissionResponse"}],"name":"Promise","qualifiedName":"Promise","package":"typescript"}}]},{"name":"requestMicrophonePermissionsAsync","kind":64,"signatures":[{"name":"requestMicrophonePermissionsAsync","kind":4096,"comment":{"summary":[{"kind":"text","text":"Asks the user to grant permissions for accessing the microphone.\nOn iOS this will require apps to specify an "},{"kind":"code","text":"`NSMicrophoneUsageDescription`"},{"kind":"text","text":" entry in the **Info.plist**."}],"blockTags":[{"tag":"@returns","content":[{"kind":"text","text":"A promise that resolves to an object of type [PermissionResponse](#permissionresponse)."}]}]},"type":{"type":"reference","typeArguments":[{"type":"reference","name":"PermissionResponse"}],"name":"Promise","qualifiedName":"Promise","package":"typescript"}}]},{"name":"requestPermissionsAsync","kind":64,"signatures":[{"name":"requestPermissionsAsync","kind":4096,"comment":{"summary":[{"kind":"text","text":"Asks the user to grant permissions for accessing camera.\nOn iOS this will require apps to specify both "},{"kind":"code","text":"`NSCameraUsageDescription`"},{"kind":"text","text":" and "},{"kind":"code","text":"`NSMicrophoneUsageDescription`"},{"kind":"text","text":" entries in the **Info.plist**."}],"blockTags":[{"tag":"@returns","content":[{"kind":"text","text":"A promise that resolves to an object of type [PermissionResponse](#permissionresponse)."}]},{"tag":"@deprecated","content":[{"kind":"text","text":"Use "},{"kind":"code","text":"`requestCameraPermissionsAsync`"},{"kind":"text","text":" or "},{"kind":"code","text":"`requestMicrophonePermissionsAsync`"},{"kind":"text","text":" instead."}]}]},"type":{"type":"reference","typeArguments":[{"type":"reference","name":"PermissionResponse"}],"name":"Promise","qualifiedName":"Promise","package":"typescript"}}]}]}
\ No newline at end of file
diff --git a/docs/public/static/data/v49.0.0/expo-cellular.json b/docs/public/static/data/v49.0.0/expo-cellular.json
new file mode 100644
index 0000000000000..86894c12e2ba5
--- /dev/null
+++ b/docs/public/static/data/v49.0.0/expo-cellular.json
@@ -0,0 +1 @@
+{"name":"expo-cellular","kind":1,"children":[{"name":"CellularGeneration","kind":8,"comment":{"summary":[{"kind":"text","text":"Describes the current generation of the cellular connection. It is an enum with these possible\nvalues:"}]},"children":[{"name":"CELLULAR_2G","kind":16,"comment":{"summary":[{"kind":"text","text":"Currently connected to a 2G cellular network. Includes CDMA, EDGE, GPRS, and IDEN type connections."}]},"type":{"type":"literal","value":1}},{"name":"CELLULAR_3G","kind":16,"comment":{"summary":[{"kind":"text","text":"Currently connected to a 3G cellular network. Includes EHRPD, EVDO, HSPA, HSUPA, HSDPA, and UTMS type connections."}]},"type":{"type":"literal","value":2}},{"name":"CELLULAR_4G","kind":16,"comment":{"summary":[{"kind":"text","text":"Currently connected to a 4G cellular network. Includes HSPAP and LTE type connections."}]},"type":{"type":"literal","value":3}},{"name":"CELLULAR_5G","kind":16,"comment":{"summary":[{"kind":"text","text":"Currently connected to a 5G cellular network. Includes NR and NRNSA type connections."}]},"type":{"type":"literal","value":4}},{"name":"UNKNOWN","kind":16,"comment":{"summary":[{"kind":"text","text":"Either we are not currently connected to a cellular network or type could not be determined."}]},"type":{"type":"literal","value":0}}]},{"name":"allowsVoip","kind":32,"flags":{"isConst":true},"comment":{"summary":[{"kind":"text","text":"Indicates if the carrier allows making VoIP calls on its network. On Android, this checks whether\nthe system supports SIP-based VoIP API. See [here](https://developer.android.com/reference/android/net/sip/SipManager.html#isVoipSupported(android.content.Context))\nto view more information.\n\nOn iOS, if you configure a device for a carrier and then remove the SIM card, this property\nretains the "},{"kind":"code","text":"`boolean`"},{"kind":"text","text":" value indicating the carrier’s policy regarding VoIP. If you then install\na new SIM card, its VoIP policy "},{"kind":"code","text":"`boolean`"},{"kind":"text","text":" replaces the previous value of this property.\n\nOn web, this returns "},{"kind":"code","text":"`null`"},{"kind":"text","text":"."}],"blockTags":[{"tag":"@example","content":[{"kind":"code","text":"```ts\nCellular.allowsVoip; // true or false\n```"}]},{"tag":"@deprecated","content":[{"kind":"text","text":"Use ["},{"kind":"code","text":"`allowsVoipAsync()`"},{"kind":"text","text":"](#allowsvoipasync) instead."}]}]},"type":{"type":"union","types":[{"type":"intrinsic","name":"boolean"},{"type":"literal","value":null}]},"defaultValue":"..."},{"name":"carrier","kind":32,"flags":{"isConst":true},"comment":{"summary":[{"kind":"text","text":"The name of the user’s home cellular service provider. If the device has dual SIM cards, only the\ncarrier for the currently active SIM card will be returned. On Android, this value is only\navailable when the SIM state is ["},{"kind":"code","text":"`SIM_STATE_READY`"},{"kind":"text","text":"](https://developer.android.com/reference/android/telephony/TelephonyManager.html#SIM_STATE_READY).\nOtherwise, this returns "},{"kind":"code","text":"`null`"},{"kind":"text","text":".\n\nOn iOS, if you configure a device for a carrier and then remove the SIM card, this property\nretains the name of the carrier. If you then install a new SIM card, its carrier name replaces\nthe previous value of this property. The value for this property is "},{"kind":"code","text":"`null`"},{"kind":"text","text":" if the user never\nconfigured a carrier for the device.\n\nOn web, this returns "},{"kind":"code","text":"`null`"},{"kind":"text","text":"."}],"blockTags":[{"tag":"@example","content":[{"kind":"code","text":"```ts\nCellular.carrier; // \"T-Mobile\" or \"Verizon\"\n```"}]},{"tag":"@deprecated","content":[{"kind":"text","text":"Use ["},{"kind":"code","text":"`getCarrierNameAsync()`"},{"kind":"text","text":"](#getcarriernameasync) instead."}]}]},"type":{"type":"union","types":[{"type":"intrinsic","name":"string"},{"type":"literal","value":null}]},"defaultValue":"..."},{"name":"isoCountryCode","kind":32,"flags":{"isConst":true},"comment":{"summary":[{"kind":"text","text":"The ISO country code for the user’s cellular service provider. On iOS, the value is "},{"kind":"code","text":"`null`"},{"kind":"text","text":" if any\nof the following apply:\n- The device is in airplane mode.\n- There is no SIM card in the device.\n- The device is outside of cellular service range.\n\nOn web, this returns "},{"kind":"code","text":"`null`"},{"kind":"text","text":"."}],"blockTags":[{"tag":"@example","content":[{"kind":"code","text":"```ts\nCellular.isoCountryCode; // \"us\" or \"au\"\n```"}]},{"tag":"@deprecated","content":[{"kind":"text","text":"Use ["},{"kind":"code","text":"`getIsoCountryCodeAsync()`"},{"kind":"text","text":"](#getisocountrycodeAsync) instead."}]}]},"type":{"type":"union","types":[{"type":"intrinsic","name":"string"},{"type":"literal","value":null}]},"defaultValue":"..."},{"name":"mobileCountryCode","kind":32,"flags":{"isConst":true},"comment":{"summary":[{"kind":"text","text":"The mobile country code (MCC) for the user’s current registered cellular service provider.\nOn Android, this value is only available when SIM state is ["},{"kind":"code","text":"`SIM_STATE_READY`"},{"kind":"text","text":"](https://developer.android.com/reference/android/telephony/TelephonyManager.html#SIM_STATE_READY). Otherwise, this\nreturns "},{"kind":"code","text":"`null`"},{"kind":"text","text":". On iOS, the value may be null on hardware prior to iPhone 4S when in airplane mode.\nFurthermore, the value for this property is "},{"kind":"code","text":"`null`"},{"kind":"text","text":" if any of the following apply:\n- There is no SIM card in the device.\n- The device is outside of cellular service range.\n\nOn web, this returns "},{"kind":"code","text":"`null`"},{"kind":"text","text":"."}],"blockTags":[{"tag":"@example","content":[{"kind":"code","text":"```ts\nCellular.mobileCountryCode; // \"310\"\n```"}]},{"tag":"@deprecated","content":[{"kind":"text","text":"Use ["},{"kind":"code","text":"`getMobileCountryCodeAsync()`"},{"kind":"text","text":"](#getmobilecountrycodeasync) instead."}]}]},"type":{"type":"union","types":[{"type":"intrinsic","name":"string"},{"type":"literal","value":null}]},"defaultValue":"..."},{"name":"mobileNetworkCode","kind":32,"flags":{"isConst":true},"comment":{"summary":[{"kind":"text","text":"The ISO country code for the user’s cellular service provider. On iOS, the value is "},{"kind":"code","text":"`null`"},{"kind":"text","text":" if\nany of the following apply:\n- The device is in airplane mode.\n- There is no SIM card in the device.\n- The device is outside of cellular service range.\n\nOn web, this returns "},{"kind":"code","text":"`null`"},{"kind":"text","text":"."}],"blockTags":[{"tag":"@example","content":[{"kind":"code","text":"```ts\nCellular.mobileNetworkCode; // \"260\"\n```"}]},{"tag":"@deprecated","content":[{"kind":"text","text":"Use ["},{"kind":"code","text":"`getMobileNetworkCodeAsync()`"},{"kind":"text","text":"](#getmobilenetworkcodeasync) instead."}]}]},"type":{"type":"union","types":[{"type":"intrinsic","name":"string"},{"type":"literal","value":null}]},"defaultValue":"..."},{"name":"allowsVoipAsync","kind":64,"signatures":[{"name":"allowsVoipAsync","kind":4096,"comment":{"summary":[],"blockTags":[{"tag":"@returns","content":[{"kind":"text","text":"Returns if the carrier allows making VoIP calls on its network. On Android, this checks whether\nthe system supports SIP-based VoIP API. See [here](https://developer.android.com/reference/android/net/sip/SipManager.html#isVoipSupported(android.content.Context))\nto view more information.\n\nOn iOS, if you configure a device for a carrier and then remove the SIM card, this property\nretains the "},{"kind":"code","text":"`boolean`"},{"kind":"text","text":" value indicating the carrier’s policy regarding VoIP. If you then install\na new SIM card, its VoIP policy "},{"kind":"code","text":"`boolean`"},{"kind":"text","text":" replaces the previous value of this property.\n\nOn web, this returns "},{"kind":"code","text":"`null`"},{"kind":"text","text":"."}]},{"tag":"@example","content":[{"kind":"code","text":"```ts\nawait Cellular.allowsVoipAsync(); // true or false\n```"}]}]},"type":{"type":"reference","typeArguments":[{"type":"union","types":[{"type":"intrinsic","name":"boolean"},{"type":"literal","value":null}]}],"name":"Promise","qualifiedName":"Promise","package":"typescript"}}]},{"name":"getCarrierNameAsync","kind":64,"signatures":[{"name":"getCarrierNameAsync","kind":4096,"comment":{"summary":[],"blockTags":[{"tag":"@returns","content":[{"kind":"text","text":"Returns name of the user’s home cellular service provider. If the device has dual SIM cards, only the\ncarrier for the currently active SIM card will be returned.\n\nOn Android, this value is only available when the SIM state is ["},{"kind":"code","text":"`SIM_STATE_READY`"},{"kind":"text","text":"](https://developer.android.com/reference/android/telephony/TelephonyManager.html#SIM_STATE_READY).\nOtherwise, this returns "},{"kind":"code","text":"`null`"},{"kind":"text","text":".\n\nOn iOS, if you configure a device for a carrier and then remove the SIM card, this property\nretains the name of the carrier. If you then install a new SIM card, its carrier name replaces\nthe previous value of this property. The value for this property is "},{"kind":"code","text":"`null`"},{"kind":"text","text":" if the user never\nconfigured a carrier for the device.\n\nOn web, this returns "},{"kind":"code","text":"`null`"},{"kind":"text","text":"."}]},{"tag":"@example","content":[{"kind":"code","text":"```ts\nawait Cellular.getCarrierNameAsync(); // \"T-Mobile\" or \"Verizon\"\n```"}]}]},"type":{"type":"reference","typeArguments":[{"type":"union","types":[{"type":"intrinsic","name":"string"},{"type":"literal","value":null}]}],"name":"Promise","qualifiedName":"Promise","package":"typescript"}}]},{"name":"getCellularGenerationAsync","kind":64,"signatures":[{"name":"getCellularGenerationAsync","kind":4096,"comment":{"summary":[],"blockTags":[{"tag":"@returns","content":[{"kind":"text","text":"Returns a promise which fulfils with a ["},{"kind":"code","text":"`Cellular.CellularGeneration`"},{"kind":"text","text":"](#cellulargeneration)\nenum value that represents the current cellular-generation type.\n\nYou will need to check if the native permission has been accepted to obtain generation. \nIf the permission is denied "},{"kind":"code","text":"`getCellularGenerationAsync`"},{"kind":"text","text":" will resolve to "},{"kind":"code","text":"`Cellular.Cellular Generation.UNKNOWN`"},{"kind":"text","text":".\n\n\nOn web, this method uses ["},{"kind":"code","text":"`navigator.connection.effectiveType`"},{"kind":"text","text":"](https://developer.mozilla.org/en-US/docs/Web/API/NetworkInformation/effectiveType)\nto detect the effective type of the connection using a combination of recently observed\nround-trip time and downlink values. See [here](https://developer.mozilla.org/en-US/docs/Web/API/Network_Information_API)\nto view browser compatibility."}]},{"tag":"@example","content":[{"kind":"code","text":"```ts\nawait Cellular.getCellularGenerationAsync();\n// CellularGeneration.CELLULAR_4G\n```"}]}]},"type":{"type":"reference","typeArguments":[{"type":"reference","name":"CellularGeneration"}],"name":"Promise","qualifiedName":"Promise","package":"typescript"}}]},{"name":"getIsoCountryCodeAsync","kind":64,"signatures":[{"name":"getIsoCountryCodeAsync","kind":4096,"comment":{"summary":[],"blockTags":[{"tag":"@returns","content":[{"kind":"text","text":"Returns the ISO country code for the user’s cellular service provider.\n\nOn iOS, the value is "},{"kind":"code","text":"`null`"},{"kind":"text","text":" if any of the following apply:\n- The device is in airplane mode.\n- There is no SIM card in the device.\n- The device is outside of cellular service range.\n\nOn web, this returns "},{"kind":"code","text":"`null`"},{"kind":"text","text":"."}]},{"tag":"@example","content":[{"kind":"code","text":"```ts\nawait Cellular.getIsoCountryCodeAsync(); // \"us\" or \"au\"\n```"}]}]},"type":{"type":"reference","typeArguments":[{"type":"union","types":[{"type":"intrinsic","name":"string"},{"type":"literal","value":null}]}],"name":"Promise","qualifiedName":"Promise","package":"typescript"}}]},{"name":"getMobileCountryCodeAsync","kind":64,"signatures":[{"name":"getMobileCountryCodeAsync","kind":4096,"comment":{"summary":[],"blockTags":[{"tag":"@returns","content":[{"kind":"text","text":"Returns mobile country code (MCC) for the user’s current registered cellular service provider.\n\nOn Android, this value is only available when SIM state is ["},{"kind":"code","text":"`SIM_STATE_READY`"},{"kind":"text","text":"](https://developer.android.com/reference/android/telephony/TelephonyManager.html#SIM_STATE_READY). Otherwise, this\nreturns "},{"kind":"code","text":"`null`"},{"kind":"text","text":". On iOS, the value may be null on hardware prior to iPhone 4S when in airplane mode.\nFurthermore, the value for this property is "},{"kind":"code","text":"`null`"},{"kind":"text","text":" if any of the following apply:\n- There is no SIM card in the device.\n- The device is outside of cellular service range.\n\nOn web, this returns "},{"kind":"code","text":"`null`"},{"kind":"text","text":"."}]},{"tag":"@example","content":[{"kind":"code","text":"```ts\nawait Cellular.getMobileCountryCodeAsync(); // \"310\"\n```"}]}]},"type":{"type":"reference","typeArguments":[{"type":"union","types":[{"type":"intrinsic","name":"string"},{"type":"literal","value":null}]}],"name":"Promise","qualifiedName":"Promise","package":"typescript"}}]},{"name":"getMobileNetworkCodeAsync","kind":64,"signatures":[{"name":"getMobileNetworkCodeAsync","kind":4096,"comment":{"summary":[],"blockTags":[{"tag":"@returns","content":[{"kind":"text","text":"Returns the mobile network code (MNC) for the user’s current registered cellular service provider.\n\nOn Android, this value is only available when SIM state is ["},{"kind":"code","text":"`SIM_STATE_READY`"},{"kind":"text","text":"](https://developer.android.com/reference/android/telephony/TelephonyManager.html#SIM_STATE_READY). Otherwise, this\nreturns "},{"kind":"code","text":"`null`"},{"kind":"text","text":". On iOS, the value may be null on hardware prior to iPhone 4S when in airplane mode.\nFurthermore, the value for this property is "},{"kind":"code","text":"`null`"},{"kind":"text","text":" if any of the following apply:\n- There is no SIM card in the device.\n- The device is outside of cellular service range.\n\nOn web, this returns "},{"kind":"code","text":"`null`"},{"kind":"text","text":"."}]},{"tag":"@example","content":[{"kind":"code","text":"```ts\nawait Cellular.getMobileNetworkCodeAsync(); // \"310\"\n```"}]}]},"type":{"type":"reference","typeArguments":[{"type":"union","types":[{"type":"intrinsic","name":"string"},{"type":"literal","value":null}]}],"name":"Promise","qualifiedName":"Promise","package":"typescript"}}]},{"name":"getPermissionsAsync","kind":64,"signatures":[{"name":"getPermissionsAsync","kind":4096,"comment":{"summary":[{"kind":"text","text":"Checks user's permissions for accessing phone state."}]},"type":{"type":"reference","typeArguments":[{"type":"reference","name":"PermissionResponse"}],"name":"Promise","qualifiedName":"Promise","package":"typescript"}}]},{"name":"requestPermissionsAsync","kind":64,"signatures":[{"name":"requestPermissionsAsync","kind":4096,"comment":{"summary":[{"kind":"text","text":"Asks the user to grant permissions for accessing the phone state."}]},"type":{"type":"reference","typeArguments":[{"type":"reference","name":"PermissionResponse"}],"name":"Promise","qualifiedName":"Promise","package":"typescript"}}]},{"name":"usePermissions","kind":64,"signatures":[{"name":"usePermissions","kind":4096,"comment":{"summary":[{"kind":"text","text":"Check or request permissions to access the phone state.\nThis uses both "},{"kind":"code","text":"`Cellular.requestPermissionsAsync`"},{"kind":"text","text":" and "},{"kind":"code","text":"`Cellular.getPermissionsAsync`"},{"kind":"text","text":" to interact with the permissions."}],"blockTags":[{"tag":"@example","content":[{"kind":"code","text":"```ts\nconst [status, requestPermission] = Cellular.usePermissions();\n```"}]}]},"parameters":[{"name":"options","kind":32768,"flags":{"isOptional":true},"type":{"type":"reference","typeArguments":[{"type":"intrinsic","name":"object"}],"name":"PermissionHookOptions"}}],"type":{"type":"tuple","elements":[{"type":"union","types":[{"type":"literal","value":null},{"type":"reference","name":"PermissionResponse"}]},{"type":"reference","typeArguments":[{"type":"reference","name":"PermissionResponse"}],"name":"RequestPermissionMethod"},{"type":"reference","typeArguments":[{"type":"reference","name":"PermissionResponse"}],"name":"GetPermissionMethod"}]}}]}]}
\ No newline at end of file
diff --git a/docs/public/static/data/v49.0.0/expo-checkbox.json b/docs/public/static/data/v49.0.0/expo-checkbox.json
new file mode 100644
index 0000000000000..c0e7e5fda83c8
--- /dev/null
+++ b/docs/public/static/data/v49.0.0/expo-checkbox.json
@@ -0,0 +1 @@
+{"name":"expo-checkbox","kind":1,"children":[{"name":"default","kind":8388608},{"name":"Checkbox","kind":128,"children":[{"name":"constructor","kind":512,"flags":{"isExternal":true},"signatures":[{"name":"new Checkbox","kind":16384,"flags":{"isExternal":true},"parameters":[{"name":"props","kind":32768,"flags":{"isExternal":true},"type":{"type":"union","types":[{"type":"reference","name":"CheckboxProps"},{"type":"reference","typeArguments":[{"type":"reference","name":"CheckboxProps"}],"name":"Readonly","qualifiedName":"Readonly","package":"typescript"}]}}],"type":{"type":"reference","name":"default"},"inheritedFrom":{"type":"reference","name":"React.PureComponent.constructor"}},{"name":"new Checkbox","kind":16384,"flags":{"isExternal":true},"comment":{"summary":[],"blockTags":[{"tag":"@deprecated","content":[]},{"tag":"@see","content":[{"kind":"text","text":"https://reactjs.org/docs/legacy-context.html"}]}]},"parameters":[{"name":"props","kind":32768,"flags":{"isExternal":true},"type":{"type":"reference","name":"CheckboxProps"}},{"name":"context","kind":32768,"flags":{"isExternal":true},"type":{"type":"intrinsic","name":"any"}}],"type":{"type":"reference","name":"default"},"inheritedFrom":{"type":"reference","name":"React.PureComponent.constructor"}}],"inheritedFrom":{"type":"reference","name":"React.PureComponent.constructor"}},{"name":"render","kind":2048,"signatures":[{"name":"render","kind":4096,"type":{"type":"reference","name":"Element","qualifiedName":"global.JSX.Element","package":"@types/react"},"overwrites":{"type":"reference","name":"React.PureComponent.render"}}],"overwrites":{"type":"reference","name":"React.PureComponent.render"}}],"extendedTypes":[{"type":"reference","typeArguments":[{"type":"reference","name":"CheckboxProps"}],"name":"PureComponent","qualifiedName":"React.PureComponent","package":"@types/react"}]},{"name":"CheckboxEvent","kind":4194304,"type":{"type":"reflection","declaration":{"name":"__type","kind":65536,"children":[{"name":"target","kind":1024,"comment":{"summary":[{"kind":"text","text":"On native platforms, a "},{"kind":"code","text":"`NodeHandle`"},{"kind":"text","text":" for the element on which the event has occurred.\nOn web, a DOM node on which the event has occurred."}]},"type":{"type":"intrinsic","name":"any"}},{"name":"value","kind":1024,"comment":{"summary":[{"kind":"text","text":"A boolean representing checkbox current value."}]},"type":{"type":"intrinsic","name":"boolean"}}]}}},{"name":"CheckboxProps","kind":4194304,"type":{"type":"intersection","types":[{"type":"reference","name":"ViewProps","qualifiedName":"ViewProps","package":"react-native"},{"type":"reflection","declaration":{"name":"__type","kind":65536,"children":[{"name":"color","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"The tint or color of the checkbox. This overrides the disabled opaque style."}]},"type":{"type":"reference","name":"ColorValue","qualifiedName":"ColorValue","package":"react-native"}},{"name":"disabled","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"If the checkbox is disabled, it becomes opaque and uncheckable."}]},"type":{"type":"intrinsic","name":"boolean"}},{"name":"onChange","kind":1024,"flags":{"isOptional":true},"type":{"type":"reflection","declaration":{"name":"__type","kind":65536,"signatures":[{"name":"__type","kind":4096,"comment":{"summary":[{"kind":"text","text":"Callback that is invoked when the user presses the checkbox."}]},"parameters":[{"name":"event","kind":32768,"comment":{"summary":[{"kind":"text","text":"A native event containing the checkbox change."}]},"type":{"type":"union","types":[{"type":"reference","typeArguments":[{"type":"reference","name":"CheckboxEvent"}],"name":"NativeSyntheticEvent","qualifiedName":"NativeSyntheticEvent","package":"react-native"},{"type":"reference","typeArguments":[{"type":"reference","name":"HTMLInputElement","qualifiedName":"HTMLInputElement","package":"typescript"},{"type":"reference","name":"CheckboxEvent"}],"name":"SyntheticEvent","qualifiedName":"React.SyntheticEvent","package":"@types/react"}]}}],"type":{"type":"intrinsic","name":"void"}}]}}},{"name":"onValueChange","kind":1024,"flags":{"isOptional":true},"type":{"type":"reflection","declaration":{"name":"__type","kind":65536,"signatures":[{"name":"__type","kind":4096,"comment":{"summary":[{"kind":"text","text":"Callback that is invoked when the user presses the checkbox."}]},"parameters":[{"name":"value","kind":32768,"comment":{"summary":[{"kind":"text","text":"A boolean indicating the new checked state of the checkbox."}]},"type":{"type":"intrinsic","name":"boolean"}}],"type":{"type":"intrinsic","name":"void"}}]}}},{"name":"value","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"Value indicating if the checkbox should be rendered as checked or not."}],"blockTags":[{"tag":"@default","content":[{"kind":"text","text":"false"}]}]},"type":{"type":"intrinsic","name":"boolean"}}]}}]}}]}
\ No newline at end of file
diff --git a/docs/public/static/data/v49.0.0/expo-clipboard.json b/docs/public/static/data/v49.0.0/expo-clipboard.json
new file mode 100644
index 0000000000000..f14f5f7d5c14a
--- /dev/null
+++ b/docs/public/static/data/v49.0.0/expo-clipboard.json
@@ -0,0 +1 @@
+{"name":"expo-clipboard","kind":1,"children":[{"name":"addClipboardListener","kind":64,"signatures":[{"name":"addClipboardListener","kind":4096,"comment":{"summary":[{"kind":"text","text":"Adds a listener that will fire whenever the content of the user's clipboard changes. This method\nis a no-op on Web."}],"blockTags":[{"tag":"@example","content":[{"kind":"code","text":"```typescript\nClipboard.addClipboardListener(({ contentTypes }: ClipboardEvent) => {\n if (contentTypes.includes(Clipboard.ContentType.PLAIN_TEXT)) {\n Clipboard.getStringAsync().then(content => {\n alert('Copy pasta! Here\\'s the string that was copied: ' + content)\n });\n } else if (contentTypes.includes(Clipboard.ContentType.IMAGE)) {\n alert('Yay! Clipboard contains an image');\n }\n});\n```"}]}]},"parameters":[{"name":"listener","kind":32768,"comment":{"summary":[{"kind":"text","text":"Callback to execute when listener is triggered. The callback is provided a\nsingle argument that is an object containing information about clipboard contents."}]},"type":{"type":"reflection","declaration":{"name":"__type","kind":65536,"signatures":[{"name":"__type","kind":4096,"parameters":[{"name":"event","kind":32768,"type":{"type":"reference","name":"ClipboardEvent"}}],"type":{"type":"intrinsic","name":"void"}}]}}}],"type":{"type":"reference","name":"Subscription"}}]},{"name":"ClipboardEvent","kind":4194304,"type":{"type":"reflection","declaration":{"name":"__type","kind":65536,"children":[{"name":"content","kind":1024,"comment":{"summary":[],"blockTags":[{"tag":"@deprecated","content":[{"kind":"text","text":"Returns empty string. Use ["},{"kind":"code","text":"`getStringAsync()`"},{"kind":"text","text":"](#getstringasyncoptions) instead to retrieve clipboard content."}]}]},"type":{"type":"intrinsic","name":"string"}},{"name":"contentTypes","kind":1024,"comment":{"summary":[{"kind":"text","text":"An array of content types that are available on the clipboard."}]},"type":{"type":"array","elementType":{"type":"reference","name":"ContentType"}}}]}}},{"name":"ClipboardImage","kind":8388608},{"name":"ClipboardImage","kind":256,"children":[{"name":"data","kind":1024,"comment":{"summary":[{"kind":"text","text":"A Base64-encoded string of the image data.\nIts format is dependent on the "},{"kind":"code","text":"`format`"},{"kind":"text","text":" option.\n\n> **NOTE:** The string is already prepended with "},{"kind":"code","text":"`data:image/png;base64,`"},{"kind":"text","text":" or "},{"kind":"code","text":"`data:image/jpeg;base64,`"},{"kind":"text","text":" prefix.\n\nYou can use it directly as the source of an "},{"kind":"code","text":"`Image`"},{"kind":"text","text":" element."}],"blockTags":[{"tag":"@example","content":[{"kind":"code","text":"```ts\n \n```"}]}]},"type":{"type":"intrinsic","name":"string"}},{"name":"size","kind":1024,"comment":{"summary":[{"kind":"text","text":"Dimensions ("},{"kind":"code","text":"`width`"},{"kind":"text","text":" and "},{"kind":"code","text":"`height`"},{"kind":"text","text":") of the image pasted from clipboard."}]},"type":{"type":"reflection","declaration":{"name":"__type","kind":65536,"children":[{"name":"height","kind":1024,"type":{"type":"intrinsic","name":"number"}},{"name":"width","kind":1024,"type":{"type":"intrinsic","name":"number"}}]}}}],"extendedBy":[{"type":"reference","name":"ImagePasteEvent"}]},{"name":"ClipboardPasteButton","kind":64,"signatures":[{"name":"ClipboardPasteButton","kind":4096,"comment":{"summary":[{"kind":"text","text":"This component displays the "},{"kind":"code","text":"`UIPasteControl`"},{"kind":"text","text":" button on your screen. This allows pasting from the clipboard without requesting permission from the user.\n\nYou should only attempt to render this if ["},{"kind":"code","text":"`Clipboard.pasteButtonIsAvailable()`"},{"kind":"text","text":"](#pasteButtonIsAvailable)\nreturns "},{"kind":"code","text":"`true`"},{"kind":"text","text":". This component will render nothing if it is not available, and you will get\na warning in development mode ("},{"kind":"code","text":"`__DEV__ === true`"},{"kind":"text","text":").\n\nThe properties of this component extend from "},{"kind":"code","text":"`View`"},{"kind":"text","text":"; however, you should not attempt to set\n"},{"kind":"code","text":"`backgroundColor`"},{"kind":"text","text":", "},{"kind":"code","text":"`color`"},{"kind":"text","text":" or "},{"kind":"code","text":"`borderRadius`"},{"kind":"text","text":" with the "},{"kind":"code","text":"`style`"},{"kind":"text","text":" property. Apple restricts customisation of this view.\nInstead, you should use the backgroundColor and foregroundColor properties to set the colors of the button, the cornerStyle property to change the border radius,\nand the displayMode property to change the appearance of the icon and label. The word \"Paste\" is not editable and neither is the icon.\n\nMake sure to attach height and width via the style props as without these styles, the button will\nnot appear on the screen."}],"blockTags":[{"tag":"@see","content":[{"kind":"text","text":"[Apple Documentation](https://developer.apple.com/documentation/uikit/uipastecontrol) for more details."}]}]},"parameters":[{"name":"__namedParameters","kind":32768,"type":{"type":"reference","name":"ClipboardPasteButtonProps"}}],"type":{"type":"union","types":[{"type":"literal","value":null},{"type":"reference","name":"Element","qualifiedName":"global.JSX.Element","package":"@types/react"}]}}]},{"name":"ClipboardPasteButtonProps","kind":8388608},{"name":"ClipboardPasteButtonProps","kind":256,"children":[{"name":"acceptedContentTypes","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"An array of the content types that will cause the button to become active"}],"blockTags":[{"tag":"@note","content":[{"kind":"text","text":"do not include "},{"kind":"code","text":"`plain-text`"},{"kind":"text","text":" and "},{"kind":"code","text":"`html`"},{"kind":"text","text":" at the same time as this will cause all text to be treated as "},{"kind":"code","text":"`html`"}]},{"tag":"@default","content":[{"kind":"text","text":"['plain-text', 'image']"}]}]},"type":{"type":"array","elementType":{"type":"reference","name":"AcceptedContentType"}}},{"name":"backgroundColor","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"The backgroundColor of the button.\nLeaving this as the default allows the color to adjust to the system theme settings."}]},"type":{"type":"union","types":[{"type":"literal","value":null},{"type":"intrinsic","name":"string"}]}},{"name":"cornerStyle","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"The cornerStyle of the button."}],"blockTags":[{"tag":"@default","content":[{"kind":"text","text":"capsule"}]},{"tag":"@see","content":[{"kind":"text","text":"[Apple Documentation](https://developer.apple.com/documentation/uikit/uibutton/configuration/cornerstyle) for more details."}]}]},"type":{"type":"union","types":[{"type":"literal","value":null},{"type":"reference","name":"CornerStyle"}]}},{"name":"displayMode","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"The displayMode of the button."}],"blockTags":[{"tag":"@default","content":[{"kind":"code","text":"`iconAndLabel`"}]},{"tag":"@see","content":[{"kind":"text","text":"[Apple Documentation](https://developer.apple.com/documentation/uikit/uipastecontrol/displaymode) for more details."}]}]},"type":{"type":"union","types":[{"type":"literal","value":null},{"type":"reference","name":"DisplayMode"}]}},{"name":"foregroundColor","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"The foregroundColor of the button."}],"blockTags":[{"tag":"@default","content":[{"kind":"text","text":"white"}]}]},"type":{"type":"union","types":[{"type":"literal","value":null},{"type":"intrinsic","name":"string"}]}},{"name":"imageOptions","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"The options to use when pasting an image from the clipboard."}]},"type":{"type":"union","types":[{"type":"literal","value":null},{"type":"reference","name":"GetImageOptions"}]}},{"name":"onPress","kind":1024,"type":{"type":"reflection","declaration":{"name":"__type","kind":65536,"signatures":[{"name":"__type","kind":4096,"comment":{"summary":[{"kind":"text","text":"A callback that is called with the result of the paste action.\nInspect the "},{"kind":"code","text":"`type`"},{"kind":"text","text":" property to determine the type of the pasted data.\n\nCan be one of "},{"kind":"code","text":"`text`"},{"kind":"text","text":" or "},{"kind":"code","text":"`image`"},{"kind":"text","text":"."}],"blockTags":[{"tag":"@example","content":[{"kind":"code","text":"```ts\n onPress={(data) => {\n if (data.type === 'image') {\n setImageData(data);\n } else {\n setTextData(data);\n }\n }}\n```"}]}]},"parameters":[{"name":"data","kind":32768,"type":{"type":"reference","name":"PasteEventPayload"}}],"type":{"type":"intrinsic","name":"void"}}]}}},{"name":"style","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"The custom style to apply to the button. Should not include "},{"kind":"code","text":"`backgroundColor`"},{"kind":"text","text":", "},{"kind":"code","text":"`borderRadius`"},{"kind":"text","text":" or "},{"kind":"code","text":"`color`"},{"kind":"text","text":"\nproperties."}]},"type":{"type":"reference","typeArguments":[{"type":"reference","typeArguments":[{"type":"reference","name":"ViewStyle","qualifiedName":"ViewStyle","package":"react-native"},{"type":"union","types":[{"type":"literal","value":"backgroundColor"},{"type":"literal","value":"borderRadius"},{"type":"literal","value":"color"}]}],"name":"Omit","qualifiedName":"Omit","package":"typescript"}],"name":"StyleProp","qualifiedName":"StyleProp","package":"react-native"},"overwrites":{"type":"reference","name":"ViewProps.style"}}],"extendedTypes":[{"type":"reference","name":"ViewProps","qualifiedName":"ViewProps","package":"react-native"}]},{"name":"ContentType","kind":8388608},{"name":"ContentType","kind":8,"comment":{"summary":[{"kind":"text","text":"Type used to define what type of data is stored in the clipboard."}]},"children":[{"name":"HTML","kind":16,"type":{"type":"literal","value":"html"}},{"name":"IMAGE","kind":16,"type":{"type":"literal","value":"image"}},{"name":"PLAIN_TEXT","kind":16,"type":{"type":"literal","value":"plain-text"}},{"name":"URL","kind":16,"comment":{"summary":[],"blockTags":[{"tag":"@platform","content":[{"kind":"text","text":"iOS"}]}]},"type":{"type":"literal","value":"url"}}]},{"name":"getImageAsync","kind":64,"signatures":[{"name":"getImageAsync","kind":4096,"comment":{"summary":[{"kind":"text","text":"Gets the image from the user's clipboard and returns it in the specified format. Please note that calling\nthis method on web will prompt the user to grant your app permission to \"see text and images copied to the clipboard.\""}],"blockTags":[{"tag":"@returns","content":[{"kind":"text","text":"If there was an image in the clipboard, the promise resolves to\na ["},{"kind":"code","text":"`ClipboardImage`"},{"kind":"text","text":"](#clipboardimage) object containing the base64 string and metadata of the image.\nOtherwise, it resolves to "},{"kind":"code","text":"`null`"},{"kind":"text","text":"."}]},{"tag":"@example","content":[{"kind":"code","text":"```tsx\nconst img = await Clipboard.getImageAsync({ format: 'png' });\n// ...\n \n```"}]}]},"parameters":[{"name":"options","kind":32768,"comment":{"summary":[{"kind":"text","text":"A "},{"kind":"code","text":"`GetImageOptions`"},{"kind":"text","text":" object to specify the desired format of the image."}]},"type":{"type":"reference","name":"GetImageOptions"}}],"type":{"type":"reference","typeArguments":[{"type":"union","types":[{"type":"reference","name":"ClipboardImage"},{"type":"literal","value":null}]}],"name":"Promise","qualifiedName":"Promise","package":"typescript"}}]},{"name":"GetImageOptions","kind":8388608},{"name":"GetImageOptions","kind":256,"children":[{"name":"format","kind":1024,"comment":{"summary":[{"kind":"text","text":"The format of the clipboard image to be converted to."}]},"type":{"type":"union","types":[{"type":"literal","value":"png"},{"type":"literal","value":"jpeg"}]}},{"name":"jpegQuality","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"Specify the quality of the returned image, between "},{"kind":"code","text":"`0`"},{"kind":"text","text":" and "},{"kind":"code","text":"`1`"},{"kind":"text","text":". Defaults to "},{"kind":"code","text":"`1`"},{"kind":"text","text":" (highest quality).\nApplicable only when "},{"kind":"code","text":"`format`"},{"kind":"text","text":" is set to "},{"kind":"code","text":"`jpeg`"},{"kind":"text","text":", ignored otherwise."}],"blockTags":[{"tag":"@default","content":[{"kind":"text","text":"1"}]}]},"type":{"type":"intrinsic","name":"number"}}]},{"name":"getStringAsync","kind":64,"signatures":[{"name":"getStringAsync","kind":4096,"comment":{"summary":[{"kind":"text","text":"Gets the content of the user's clipboard. Please note that calling this method on web will prompt\nthe user to grant your app permission to \"see text and images copied to the clipboard.\""}],"blockTags":[{"tag":"@returns","content":[{"kind":"text","text":"A promise that resolves to the content of the clipboard."}]}]},"parameters":[{"name":"options","kind":32768,"comment":{"summary":[{"kind":"text","text":"Options for the clipboard content to be retrieved."}]},"type":{"type":"reference","name":"GetStringOptions"},"defaultValue":"{}"}],"type":{"type":"reference","typeArguments":[{"type":"intrinsic","name":"string"}],"name":"Promise","qualifiedName":"Promise","package":"typescript"}}]},{"name":"GetStringOptions","kind":8388608},{"name":"GetStringOptions","kind":256,"children":[{"name":"preferredFormat","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"The target format of the clipboard string to be converted to, if possible."}],"blockTags":[{"tag":"@default","content":[{"kind":"text","text":"StringFormat.PLAIN_TEXT"}]}]},"type":{"type":"reference","name":"StringFormat"}}]},{"name":"getUrlAsync","kind":64,"signatures":[{"name":"getUrlAsync","kind":4096,"comment":{"summary":[{"kind":"text","text":"Gets the URL from the user's clipboard."}],"blockTags":[{"tag":"@returns","content":[{"kind":"text","text":"A promise that fulfills to the URL in the clipboard."}]},{"tag":"@platform","content":[{"kind":"text","text":"ios"}]}]},"type":{"type":"reference","typeArguments":[{"type":"union","types":[{"type":"intrinsic","name":"string"},{"type":"literal","value":null}]}],"name":"Promise","qualifiedName":"Promise","package":"typescript"}}]},{"name":"hasImageAsync","kind":64,"signatures":[{"name":"hasImageAsync","kind":4096,"comment":{"summary":[{"kind":"text","text":"Returns whether the clipboard has an image content.\n\nOn web, this requires the user to grant your app permission to _\"see text and images copied to the clipboard\"_."}],"blockTags":[{"tag":"@returns","content":[{"kind":"text","text":"A promise that fulfills to "},{"kind":"code","text":"`true`"},{"kind":"text","text":" if clipboard has image content, resolves to "},{"kind":"code","text":"`false`"},{"kind":"text","text":" otherwise."}]}]},"type":{"type":"reference","typeArguments":[{"type":"intrinsic","name":"boolean"}],"name":"Promise","qualifiedName":"Promise","package":"typescript"}}]},{"name":"hasStringAsync","kind":64,"signatures":[{"name":"hasStringAsync","kind":4096,"comment":{"summary":[{"kind":"text","text":"Returns whether the clipboard has text content. Returns true for both plain text and rich text (e.g. HTML).\n\nOn web, this requires the user to grant your app permission to _\"see text and images copied to the clipboard\"_."}],"blockTags":[{"tag":"@returns","content":[{"kind":"text","text":"A promise that fulfills to "},{"kind":"code","text":"`true`"},{"kind":"text","text":" if clipboard has text content, resolves to "},{"kind":"code","text":"`false`"},{"kind":"text","text":" otherwise."}]}]},"type":{"type":"reference","typeArguments":[{"type":"intrinsic","name":"boolean"}],"name":"Promise","qualifiedName":"Promise","package":"typescript"}}]},{"name":"hasUrlAsync","kind":64,"signatures":[{"name":"hasUrlAsync","kind":4096,"comment":{"summary":[{"kind":"text","text":"Returns whether the clipboard has a URL content."}],"blockTags":[{"tag":"@returns","content":[{"kind":"text","text":"A promise that fulfills to "},{"kind":"code","text":"`true`"},{"kind":"text","text":" if clipboard has URL content, resolves to "},{"kind":"code","text":"`false`"},{"kind":"text","text":" otherwise."}]},{"tag":"@platform","content":[{"kind":"text","text":"ios"}]}]},"type":{"type":"reference","typeArguments":[{"type":"intrinsic","name":"boolean"}],"name":"Promise","qualifiedName":"Promise","package":"typescript"}}]},{"name":"ImagePasteEvent","kind":8388608},{"name":"ImagePasteEvent","kind":256,"children":[{"name":"data","kind":1024,"comment":{"summary":[{"kind":"text","text":"A Base64-encoded string of the image data.\nIts format is dependent on the "},{"kind":"code","text":"`format`"},{"kind":"text","text":" option.\n\n> **NOTE:** The string is already prepended with "},{"kind":"code","text":"`data:image/png;base64,`"},{"kind":"text","text":" or "},{"kind":"code","text":"`data:image/jpeg;base64,`"},{"kind":"text","text":" prefix.\n\nYou can use it directly as the source of an "},{"kind":"code","text":"`Image`"},{"kind":"text","text":" element."}],"blockTags":[{"tag":"@example","content":[{"kind":"code","text":"```ts\n \n```"}]}]},"type":{"type":"intrinsic","name":"string"},"inheritedFrom":{"type":"reference","name":"ClipboardImage.data"}},{"name":"size","kind":1024,"comment":{"summary":[{"kind":"text","text":"Dimensions ("},{"kind":"code","text":"`width`"},{"kind":"text","text":" and "},{"kind":"code","text":"`height`"},{"kind":"text","text":") of the image pasted from clipboard."}]},"type":{"type":"reflection","declaration":{"name":"__type","kind":65536,"children":[{"name":"height","kind":1024,"type":{"type":"intrinsic","name":"number"}},{"name":"width","kind":1024,"type":{"type":"intrinsic","name":"number"}}]}},"inheritedFrom":{"type":"reference","name":"ClipboardImage.size"}},{"name":"type","kind":1024,"type":{"type":"literal","value":"image"}}],"extendedTypes":[{"type":"reference","name":"ClipboardImage"}]},{"name":"isPasteButtonAvailable","kind":32,"flags":{"isConst":true},"comment":{"summary":[{"kind":"text","text":"Property that determines if the "},{"kind":"code","text":"`ClipboardPasteButton`"},{"kind":"text","text":" is available.\n\nThis requires the users device to be using at least iOS 16.\n\n"},{"kind":"code","text":"`true`"},{"kind":"text","text":" if the component is available, and "},{"kind":"code","text":"`false`"},{"kind":"text","text":" otherwise."}]},"type":{"type":"intrinsic","name":"boolean"},"defaultValue":"..."},{"name":"PasteEventPayload","kind":8388608},{"name":"PasteEventPayload","kind":4194304,"type":{"type":"union","types":[{"type":"reference","name":"TextPasteEvent"},{"type":"reference","name":"ImagePasteEvent"}]}},{"name":"removeClipboardListener","kind":64,"signatures":[{"name":"removeClipboardListener","kind":4096,"comment":{"summary":[{"kind":"text","text":"Removes the listener added by addClipboardListener. This method is a no-op on Web."}],"blockTags":[{"tag":"@example","content":[{"kind":"code","text":"```typescript\nconst subscription = addClipboardListener(() => {\n alert('Copy pasta!');\n});\nremoveClipboardListener(subscription);\n```"}]}]},"parameters":[{"name":"subscription","kind":32768,"comment":{"summary":[{"kind":"text","text":"The subscription to remove (created by addClipboardListener)."}]},"type":{"type":"reference","name":"Subscription"}}],"type":{"type":"intrinsic","name":"void"}}]},{"name":"setImageAsync","kind":64,"signatures":[{"name":"setImageAsync","kind":4096,"comment":{"summary":[{"kind":"text","text":"Sets an image in the user's clipboard."}],"blockTags":[{"tag":"@example","content":[{"kind":"code","text":"```tsx\nconst result = await ImagePicker.launchImageLibraryAsync({\n mediaTypes: ImagePicker.MediaTypeOptions.Images,\n base64: true,\n});\nawait Clipboard.setImageAsync(result.base64);\n```"}]}]},"parameters":[{"name":"base64Image","kind":32768,"comment":{"summary":[{"kind":"text","text":"Image encoded as a base64 string, without MIME type."}]},"type":{"type":"intrinsic","name":"string"}}],"type":{"type":"reference","typeArguments":[{"type":"intrinsic","name":"void"}],"name":"Promise","qualifiedName":"Promise","package":"typescript"}}]},{"name":"setString","kind":64,"signatures":[{"name":"setString","kind":4096,"comment":{"summary":[{"kind":"text","text":"Sets the content of the user's clipboard."}],"blockTags":[{"tag":"@deprecated","content":[{"kind":"text","text":"Use ["},{"kind":"code","text":"`setStringAsync()`"},{"kind":"text","text":"](#setstringasynctext-options) instead."}]},{"tag":"@returns","content":[{"kind":"text","text":"On web, this returns a boolean value indicating whether or not the string was saved to\nthe user's clipboard. On iOS and Android, nothing is returned."}]}]},"parameters":[{"name":"text","kind":32768,"type":{"type":"intrinsic","name":"string"}}],"type":{"type":"intrinsic","name":"void"}}]},{"name":"setStringAsync","kind":64,"signatures":[{"name":"setStringAsync","kind":4096,"comment":{"summary":[{"kind":"text","text":"Sets the content of the user's clipboard."}],"blockTags":[{"tag":"@returns","content":[{"kind":"text","text":"On web, this returns a promise that fulfills to a boolean value indicating whether or not\nthe string was saved to the user's clipboard. On iOS and Android, the promise always resolves to "},{"kind":"code","text":"`true`"},{"kind":"text","text":"."}]}]},"parameters":[{"name":"text","kind":32768,"comment":{"summary":[{"kind":"text","text":"The string to save to the clipboard."}]},"type":{"type":"intrinsic","name":"string"}},{"name":"options","kind":32768,"comment":{"summary":[{"kind":"text","text":"Options for the clipboard content to be set."}]},"type":{"type":"reference","name":"SetStringOptions"},"defaultValue":"{}"}],"type":{"type":"reference","typeArguments":[{"type":"intrinsic","name":"boolean"}],"name":"Promise","qualifiedName":"Promise","package":"typescript"}}]},{"name":"SetStringOptions","kind":8388608},{"name":"SetStringOptions","kind":256,"children":[{"name":"inputFormat","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"The input format of the provided string.\nAdjusting this option can help other applications interpret copied string properly."}],"blockTags":[{"tag":"@default","content":[{"kind":"text","text":"StringFormat.PLAIN_TEXT"}]}]},"type":{"type":"reference","name":"StringFormat"}}]},{"name":"setUrlAsync","kind":64,"signatures":[{"name":"setUrlAsync","kind":4096,"comment":{"summary":[{"kind":"text","text":"Sets a URL in the user's clipboard.\n\nThis function behaves the same as ["},{"kind":"code","text":"`setStringAsync()`"},{"kind":"text","text":"](#setstringasynctext-options), except that\nit sets the clipboard content type to be a URL. It lets your app or other apps know that the\nclipboard contains a URL and behave accordingly."}],"blockTags":[{"tag":"@platform","content":[{"kind":"text","text":"ios"}]}]},"parameters":[{"name":"url","kind":32768,"comment":{"summary":[{"kind":"text","text":"The URL to save to the clipboard."}]},"type":{"type":"intrinsic","name":"string"}}],"type":{"type":"reference","typeArguments":[{"type":"intrinsic","name":"void"}],"name":"Promise","qualifiedName":"Promise","package":"typescript"}}]},{"name":"StringFormat","kind":8388608},{"name":"StringFormat","kind":8,"comment":{"summary":[{"kind":"text","text":"Type used to determine string format stored in the clipboard."}]},"children":[{"name":"HTML","kind":16,"type":{"type":"literal","value":"html"}},{"name":"PLAIN_TEXT","kind":16,"type":{"type":"literal","value":"plainText"}}]},{"name":"Subscription","kind":4194304,"type":{"type":"reflection","declaration":{"name":"__type","kind":65536,"children":[{"name":"remove","kind":1024,"type":{"type":"reflection","declaration":{"name":"__type","kind":65536,"signatures":[{"name":"__type","kind":4096,"comment":{"summary":[{"kind":"text","text":"A method to unsubscribe the listener."}]},"type":{"type":"intrinsic","name":"void"}}]}}}]}}},{"name":"TextPasteEvent","kind":8388608},{"name":"TextPasteEvent","kind":256,"children":[{"name":"text","kind":1024,"type":{"type":"intrinsic","name":"string"}},{"name":"type","kind":1024,"type":{"type":"literal","value":"text"}}]}]}
\ No newline at end of file
diff --git a/docs/public/static/data/v49.0.0/expo-constants.json b/docs/public/static/data/v49.0.0/expo-constants.json
new file mode 100644
index 0000000000000..84d530f7a698f
--- /dev/null
+++ b/docs/public/static/data/v49.0.0/expo-constants.json
@@ -0,0 +1 @@
+{"name":"expo-constants","kind":1,"children":[{"name":"AndroidManifest","kind":8388608},{"name":"AndroidManifest","kind":256,"children":[{"name":"versionCode","kind":1024,"comment":{"summary":[{"kind":"text","text":"The version code set by "},{"kind":"code","text":"`android.versionCode`"},{"kind":"text","text":" in app.json.\nThe value is set to "},{"kind":"code","text":"`null`"},{"kind":"text","text":" in case you run your app in Expo Go."}],"blockTags":[{"tag":"@deprecated","content":[{"kind":"text","text":"Use "},{"kind":"code","text":"`expo-application`"},{"kind":"text","text":"'s ["},{"kind":"code","text":"`Application.nativeBuildVersion`"},{"kind":"text","text":"](./application/#applicationnativebuildversion)."}]}]},"type":{"type":"intrinsic","name":"number"}}],"indexSignature":{"name":"__index","kind":8192,"parameters":[{"name":"key","kind":32768,"type":{"type":"intrinsic","name":"string"}}],"type":{"type":"intrinsic","name":"any"}}},{"name":"AppManifest","kind":4194304,"comment":{"summary":[{"kind":"text","text":"Represents an intersection of all possible Config types."}]},"type":{"type":"intersection","types":[{"type":"reference","name":"ExpoClientConfig"},{"type":"reference","name":"ExpoGoConfig"},{"type":"reference","name":"EASConfig"},{"type":"reference","name":"ClientScopingConfig"},{"type":"reference","typeArguments":[{"type":"intrinsic","name":"string"},{"type":"intrinsic","name":"any"}],"name":"Record","qualifiedName":"Record","package":"typescript"}]}},{"name":"AppOwnership","kind":8388608},{"name":"AppOwnership","kind":8,"children":[{"name":"Expo","kind":16,"comment":{"summary":[{"kind":"text","text":"The experience is running inside of the Expo Go app."}]},"type":{"type":"literal","value":"expo"}},{"name":"Guest","kind":16,"comment":{"summary":[{"kind":"text","text":"It has been opened through a link from a standalone app."}]},"type":{"type":"literal","value":"guest"}},{"name":"Standalone","kind":16,"comment":{"summary":[{"kind":"text","text":"It is a [standalone app](/classic/building-standalone-apps#building-standalone-apps)."}]},"type":{"type":"literal","value":"standalone"}}]},{"name":"ClientScopingConfig","kind":4194304,"type":{"type":"reflection","declaration":{"name":"__type","kind":65536,"children":[{"name":"scopeKey","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"An opaque unique string for scoping client-side data to this project. This value\nwill not change when a project is transferred between accounts or renamed."}]},"type":{"type":"intrinsic","name":"string"}}]}}},{"name":"Constants","kind":8388608},{"name":"Constants","kind":256,"children":[{"name":"appOwnership","kind":1024,"comment":{"summary":[{"kind":"text","text":"Returns "},{"kind":"code","text":"`expo`"},{"kind":"text","text":", "},{"kind":"code","text":"`standalone`"},{"kind":"text","text":", or "},{"kind":"code","text":"`guest`"},{"kind":"text","text":". This property only applies to the managed workflow\nand classic builds; for apps built with EAS Build and in bare workflow, the result is\nalways "},{"kind":"code","text":"`null`"},{"kind":"text","text":"."}]},"type":{"type":"union","types":[{"type":"literal","value":null},{"type":"reference","name":"AppOwnership"}]},"inheritedFrom":{"type":"reference","name":"NativeConstants.appOwnership"}},{"name":"debugMode","kind":1024,"type":{"type":"intrinsic","name":"boolean"},"inheritedFrom":{"type":"reference","name":"NativeConstants.debugMode"}},{"name":"deviceName","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"A human-readable name for the device type."}]},"type":{"type":"intrinsic","name":"string"},"inheritedFrom":{"type":"reference","name":"NativeConstants.deviceName"}},{"name":"deviceYearClass","kind":1024,"comment":{"summary":[{"kind":"text","text":"The [device year class](https://github.com/facebook/device-year-class) of this device."}],"blockTags":[{"tag":"@deprecated","content":[{"kind":"text","text":"Moved to "},{"kind":"code","text":"`expo-device`"},{"kind":"text","text":" as ["},{"kind":"code","text":"`Device.deviceYearClass`"},{"kind":"text","text":"](./device/#deviceyearclass)."}]}]},"type":{"type":"union","types":[{"type":"literal","value":null},{"type":"intrinsic","name":"number"}]},"inheritedFrom":{"type":"reference","name":"NativeConstants.deviceYearClass"}},{"name":"easConfig","kind":1024,"comment":{"summary":[{"kind":"text","text":"The standard EAS config object populated when using EAS."}]},"type":{"type":"union","types":[{"type":"literal","value":null},{"type":"reference","name":"EASConfig"}]},"inheritedFrom":{"type":"reference","name":"NativeConstants.easConfig"}},{"name":"executionEnvironment","kind":1024,"type":{"type":"reference","name":"ExecutionEnvironment"},"inheritedFrom":{"type":"reference","name":"NativeConstants.executionEnvironment"}},{"name":"experienceUrl","kind":1024,"type":{"type":"intrinsic","name":"string"},"inheritedFrom":{"type":"reference","name":"NativeConstants.experienceUrl"}},{"name":"expoConfig","kind":1024,"comment":{"summary":[{"kind":"text","text":"The standard Expo config object defined in "},{"kind":"code","text":"`app.json`"},{"kind":"text","text":" and "},{"kind":"code","text":"`app.config.js`"},{"kind":"text","text":" files. For both\nclassic and modern manifests, whether they are embedded or remote."}]},"type":{"type":"union","types":[{"type":"literal","value":null},{"type":"intersection","types":[{"type":"reference","name":"ExpoConfig"},{"type":"reflection","declaration":{"name":"__type","kind":65536,"children":[{"name":"hostUri","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"Only present during development using @expo/cli."}]},"type":{"type":"intrinsic","name":"string"}}]}}]}]},"inheritedFrom":{"type":"reference","name":"NativeConstants.expoConfig"}},{"name":"expoGoConfig","kind":1024,"comment":{"summary":[{"kind":"text","text":"The standard Expo Go config object populated when running in Expo Go."}]},"type":{"type":"union","types":[{"type":"literal","value":null},{"type":"reference","name":"ExpoGoConfig"}]},"inheritedFrom":{"type":"reference","name":"NativeConstants.expoGoConfig"}},{"name":"expoRuntimeVersion","kind":1024,"type":{"type":"union","types":[{"type":"literal","value":null},{"type":"intrinsic","name":"string"}]},"inheritedFrom":{"type":"reference","name":"NativeConstants.expoRuntimeVersion"}},{"name":"expoVersion","kind":1024,"comment":{"summary":[{"kind":"text","text":"The version string of the Expo Go app currently running.\nReturns "},{"kind":"code","text":"`null`"},{"kind":"text","text":" in bare workflow and web."}]},"type":{"type":"union","types":[{"type":"literal","value":null},{"type":"intrinsic","name":"string"}]},"inheritedFrom":{"type":"reference","name":"NativeConstants.expoVersion"}},{"name":"getWebViewUserAgentAsync","kind":1024,"type":{"type":"reflection","declaration":{"name":"__type","kind":65536,"signatures":[{"name":"__type","kind":4096,"comment":{"summary":[{"kind":"text","text":"Gets the user agent string which would be included in requests sent by a web view running on\nthis device. This is probably not the same user agent you might be providing in your JS "},{"kind":"code","text":"`fetch`"},{"kind":"text","text":"\nrequests."}]},"type":{"type":"reference","typeArguments":[{"type":"union","types":[{"type":"literal","value":null},{"type":"intrinsic","name":"string"}]}],"name":"Promise","qualifiedName":"Promise","package":"typescript"}}]}},"inheritedFrom":{"type":"reference","name":"NativeConstants.getWebViewUserAgentAsync"}},{"name":"installationId","kind":1024,"comment":{"summary":[{"kind":"text","text":"An identifier that is unique to this particular device and whose lifetime is at least as long\nas the installation of the app."}],"blockTags":[{"tag":"@deprecated","content":[{"kind":"code","text":"`Constants.installationId`"},{"kind":"text","text":" is deprecated in favor of generating your own ID and\nstoring it."}]}]},"type":{"type":"intrinsic","name":"string"},"inheritedFrom":{"type":"reference","name":"NativeConstants.installationId"}},{"name":"intentUri","kind":1024,"flags":{"isOptional":true},"type":{"type":"intrinsic","name":"string"},"inheritedFrom":{"type":"reference","name":"NativeConstants.intentUri"}},{"name":"isDetached","kind":1024,"flags":{"isOptional":true},"type":{"type":"intrinsic","name":"boolean"},"inheritedFrom":{"type":"reference","name":"NativeConstants.isDetached"}},{"name":"isDevice","kind":1024,"comment":{"summary":[{"kind":"code","text":"`true`"},{"kind":"text","text":" if the app is running on a device, "},{"kind":"code","text":"`false`"},{"kind":"text","text":" if running in a simulator or emulator."}],"blockTags":[{"tag":"@deprecated","content":[{"kind":"text","text":"Use "},{"kind":"code","text":"`expo-device`"},{"kind":"text","text":"'s ["},{"kind":"code","text":"`Device.isDevice`"},{"kind":"text","text":"](./device/#deviceisdevice)."}]}]},"type":{"type":"intrinsic","name":"boolean"},"inheritedFrom":{"type":"reference","name":"NativeConstants.isDevice"}},{"name":"isHeadless","kind":1024,"type":{"type":"intrinsic","name":"boolean"},"inheritedFrom":{"type":"reference","name":"NativeConstants.isHeadless"}},{"name":"linkingUri","kind":1024,"type":{"type":"intrinsic","name":"string"},"inheritedFrom":{"type":"reference","name":"NativeConstants.linkingUri"}},{"name":"manifest","kind":1024,"comment":{"summary":[{"kind":"text","text":"Classic manifest for Expo apps using classic updates and the updates embedded in builds.\nReturns "},{"kind":"code","text":"`null`"},{"kind":"text","text":" in bare workflow and when "},{"kind":"code","text":"`manifest2`"},{"kind":"text","text":" is non-null."}],"blockTags":[{"tag":"@deprecated","content":[{"kind":"text","text":"Use "},{"kind":"code","text":"`Constants.expoConfig`"},{"kind":"text","text":" instead, which behaves more consistently across EAS Build\nand EAS Update."}]}]},"type":{"type":"union","types":[{"type":"literal","value":null},{"type":"reference","name":"AppManifest"}]},"inheritedFrom":{"type":"reference","name":"NativeConstants.manifest"}},{"name":"manifest2","kind":1024,"comment":{"summary":[{"kind":"text","text":"Manifest for Expo apps using modern Expo Updates from a remote source, such as apps that\nuse EAS Update. Returns "},{"kind":"code","text":"`null`"},{"kind":"text","text":" in bare workflow and when "},{"kind":"code","text":"`manifest`"},{"kind":"text","text":" is non-null.\n"},{"kind":"code","text":"`Constants.expoConfig`"},{"kind":"text","text":" should be used for accessing the Expo config object."}]},"type":{"type":"union","types":[{"type":"literal","value":null},{"type":"reference","name":"Manifest"}]},"inheritedFrom":{"type":"reference","name":"NativeConstants.manifest2"}},{"name":"nativeAppVersion","kind":1024,"comment":{"summary":[{"kind":"text","text":"The **Info.plist** value for "},{"kind":"code","text":"`CFBundleShortVersionString`"},{"kind":"text","text":" on iOS and the version name set\nby "},{"kind":"code","text":"`version`"},{"kind":"text","text":" in app.json on Android at the time the native app was built."}],"blockTags":[{"tag":"@deprecated","content":[{"kind":"text","text":"Use "},{"kind":"code","text":"`expo-application`"},{"kind":"text","text":"'s ["},{"kind":"code","text":"`Application.nativeApplicationVersion`"},{"kind":"text","text":"](./application/#applicationnativeapplicationversion)."}]}]},"type":{"type":"union","types":[{"type":"literal","value":null},{"type":"intrinsic","name":"string"}]},"inheritedFrom":{"type":"reference","name":"NativeConstants.nativeAppVersion"}},{"name":"nativeBuildVersion","kind":1024,"comment":{"summary":[{"kind":"text","text":"The **Info.plist** value for "},{"kind":"code","text":"`CFBundleVersion`"},{"kind":"text","text":" on iOS (set with "},{"kind":"code","text":"`ios.buildNumber`"},{"kind":"text","text":" value in\n**app.json** in a standalone app) and the version code set by "},{"kind":"code","text":"`android.versionCode`"},{"kind":"text","text":" in\n**app.json** on Android at the time the native app was built."}],"blockTags":[{"tag":"@deprecated","content":[{"kind":"text","text":"Use "},{"kind":"code","text":"`expo-application`"},{"kind":"text","text":"'s ["},{"kind":"code","text":"`Application.nativeBuildVersion`"},{"kind":"text","text":"](./application/#applicationnativebuildversion)."}]}]},"type":{"type":"union","types":[{"type":"literal","value":null},{"type":"intrinsic","name":"string"}]},"inheritedFrom":{"type":"reference","name":"NativeConstants.nativeBuildVersion"}},{"name":"platform","kind":1024,"flags":{"isOptional":true},"type":{"type":"reference","name":"PlatformManifest"},"inheritedFrom":{"type":"reference","name":"NativeConstants.platform"}},{"name":"sessionId","kind":1024,"comment":{"summary":[{"kind":"text","text":"A string that is unique to the current session of your app. It is different across apps and\nacross multiple launches of the same app."}]},"type":{"type":"intrinsic","name":"string"},"inheritedFrom":{"type":"reference","name":"NativeConstants.sessionId"}},{"name":"statusBarHeight","kind":1024,"comment":{"summary":[{"kind":"text","text":"The default status bar height for the device. Does not factor in changes when location tracking\nis in use or a phone call is active."}]},"type":{"type":"intrinsic","name":"number"},"inheritedFrom":{"type":"reference","name":"NativeConstants.statusBarHeight"}},{"name":"systemFonts","kind":1024,"comment":{"summary":[{"kind":"text","text":"A list of the system font names available on the current device."}]},"type":{"type":"array","elementType":{"type":"intrinsic","name":"string"}},"inheritedFrom":{"type":"reference","name":"NativeConstants.systemFonts"}},{"name":"systemVersion","kind":1024,"flags":{"isOptional":true},"type":{"type":"intrinsic","name":"number"},"inheritedFrom":{"type":"reference","name":"NativeConstants.systemVersion"}}],"extendedTypes":[{"type":"reference","name":"NativeConstants"}]},{"name":"default","kind":32,"type":{"type":"reference","name":"Constants"}},{"name":"EASConfig","kind":4194304,"type":{"type":"reflection","declaration":{"name":"__type","kind":65536,"children":[{"name":"projectId","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"The ID for this project if it's using EAS. UUID. This value will not change when a project is\ntransferred between accounts or renamed."}]},"type":{"type":"intrinsic","name":"string"}}]}}},{"name":"ExecutionEnvironment","kind":8388608},{"name":"ExecutionEnvironment","kind":8,"children":[{"name":"Bare","kind":16,"type":{"type":"literal","value":"bare"}},{"name":"Standalone","kind":16,"type":{"type":"literal","value":"standalone"}},{"name":"StoreClient","kind":16,"type":{"type":"literal","value":"storeClient"}}]},{"name":"ExpoClientConfig","kind":4194304,"type":{"type":"intersection","types":[{"type":"reference","name":"ExpoConfig"},{"type":"reflection","declaration":{"name":"__type","kind":65536,"children":[{"name":"bundleUrl","kind":1024,"type":{"type":"intrinsic","name":"string"}},{"name":"currentFullName","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"The Expo account name and slug used for display purposes. Formatted like "},{"kind":"code","text":"`@username/slug`"},{"kind":"text","text":".\nWhen unauthenticated, the username is "},{"kind":"code","text":"`@anonymous`"},{"kind":"text","text":". For published projects, this value\nmay change when a project is transferred between accounts or renamed."}]},"type":{"type":"intrinsic","name":"string"}},{"name":"hostUri","kind":1024,"flags":{"isOptional":true},"type":{"type":"intrinsic","name":"string"}},{"name":"id","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"The Expo account name and slug for this project."}],"blockTags":[{"tag":"@deprecated","content":[{"kind":"text","text":"Prefer "},{"kind":"code","text":"`projectId`"},{"kind":"text","text":" or "},{"kind":"code","text":"`originalFullName`"},{"kind":"text","text":" instead for identification and\n"},{"kind":"code","text":"`scopeKey`"},{"kind":"text","text":" for scoping due to immutability."}]}]},"type":{"type":"intrinsic","name":"string"}},{"name":"originalFullName","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"The original Expo account name and slug for this project. Formatted like "},{"kind":"code","text":"`@username/slug`"},{"kind":"text","text":".\nWhen unauthenticated, the username is "},{"kind":"code","text":"`@anonymous`"},{"kind":"text","text":". For published projects, this value\nwill not change when a project is transferred between accounts or renamed."}]},"type":{"type":"intrinsic","name":"string"}},{"name":"publishedTime","kind":1024,"flags":{"isOptional":true},"type":{"type":"intrinsic","name":"string"}},{"name":"releaseChannel","kind":1024,"flags":{"isOptional":true},"type":{"type":"intrinsic","name":"string"}},{"name":"releaseId","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"Published apps only."}]},"type":{"type":"intrinsic","name":"string"}},{"name":"revisionId","kind":1024,"flags":{"isOptional":true},"type":{"type":"intrinsic","name":"string"}}]}}]}},{"name":"ExpoGoConfig","kind":4194304,"type":{"type":"reflection","declaration":{"name":"__type","kind":65536,"children":[{"name":"debuggerHost","kind":1024,"flags":{"isOptional":true},"type":{"type":"intrinsic","name":"string"}},{"name":"developer","kind":1024,"flags":{"isOptional":true},"type":{"type":"reflection","declaration":{"name":"__type","kind":65536,"children":[{"name":"tool","kind":1024,"flags":{"isOptional":true},"type":{"type":"intrinsic","name":"string"}}],"indexSignature":{"name":"__index","kind":8192,"parameters":[{"name":"key","kind":32768,"type":{"type":"intrinsic","name":"string"}}],"type":{"type":"intrinsic","name":"any"}}}}},{"name":"logUrl","kind":1024,"flags":{"isOptional":true},"type":{"type":"intrinsic","name":"string"}},{"name":"mainModuleName","kind":1024,"flags":{"isOptional":true},"type":{"type":"intrinsic","name":"string"}},{"name":"packagerOpts","kind":1024,"flags":{"isOptional":true},"type":{"type":"reference","name":"ExpoGoPackagerOpts"}}]}}},{"name":"ExpoGoPackagerOpts","kind":4194304,"type":{"type":"reflection","declaration":{"name":"__type","kind":65536,"children":[{"name":"dev","kind":1024,"flags":{"isOptional":true},"type":{"type":"intrinsic","name":"boolean"}},{"name":"hostType","kind":1024,"flags":{"isOptional":true},"type":{"type":"intrinsic","name":"string"}},{"name":"lanType","kind":1024,"flags":{"isOptional":true},"type":{"type":"intrinsic","name":"string"}},{"name":"minify","kind":1024,"flags":{"isOptional":true},"type":{"type":"intrinsic","name":"boolean"}},{"name":"strict","kind":1024,"flags":{"isOptional":true},"type":{"type":"intrinsic","name":"boolean"}},{"name":"urlRandomness","kind":1024,"flags":{"isOptional":true},"type":{"type":"intrinsic","name":"string"}},{"name":"urlType","kind":1024,"flags":{"isOptional":true},"type":{"type":"intrinsic","name":"string"}}],"indexSignature":{"name":"__index","kind":8192,"parameters":[{"name":"key","kind":32768,"type":{"type":"intrinsic","name":"string"}}],"type":{"type":"intrinsic","name":"any"}}}}},{"name":"IOSManifest","kind":8388608},{"name":"IOSManifest","kind":256,"children":[{"name":"buildNumber","kind":1024,"comment":{"summary":[{"kind":"text","text":"The build number specified in the embedded **Info.plist** value for "},{"kind":"code","text":"`CFBundleVersion`"},{"kind":"text","text":" in this app.\nIn a standalone app, you can set this with the "},{"kind":"code","text":"`ios.buildNumber`"},{"kind":"text","text":" value in **app.json**. This\nmay differ from the value in "},{"kind":"code","text":"`Constants.expoConfig.ios.buildNumber`"},{"kind":"text","text":" because the manifest\ncan be updated, whereas this value will never change for a given native binary.\nThe value is set to "},{"kind":"code","text":"`null`"},{"kind":"text","text":" in case you run your app in Expo Go."}]},"type":{"type":"union","types":[{"type":"literal","value":null},{"type":"intrinsic","name":"string"}]}},{"name":"model","kind":1024,"comment":{"summary":[{"kind":"text","text":"The human-readable model name of this device, e.g. "},{"kind":"code","text":"`\"iPhone 7 Plus\"`"},{"kind":"text","text":" if it can be determined,\notherwise will be "},{"kind":"code","text":"`null`"},{"kind":"text","text":"."}],"blockTags":[{"tag":"@deprecated","content":[{"kind":"text","text":"Moved to "},{"kind":"code","text":"`expo-device`"},{"kind":"text","text":" as ["},{"kind":"code","text":"`Device.modelName`"},{"kind":"text","text":"](./device/#devicemodelname)."}]}]},"type":{"type":"union","types":[{"type":"literal","value":null},{"type":"intrinsic","name":"string"}]}},{"name":"platform","kind":1024,"comment":{"summary":[{"kind":"text","text":"The Apple internal model identifier for this device, e.g. "},{"kind":"code","text":"`iPhone1,1`"},{"kind":"text","text":"."}],"blockTags":[{"tag":"@deprecated","content":[{"kind":"text","text":"Use "},{"kind":"code","text":"`expo-device`"},{"kind":"text","text":"'s ["},{"kind":"code","text":"`Device.modelId`"},{"kind":"text","text":"](./device/#devicemodelid)."}]}]},"type":{"type":"intrinsic","name":"string"}},{"name":"systemVersion","kind":1024,"comment":{"summary":[{"kind":"text","text":"The version of iOS running on this device, e.g. "},{"kind":"code","text":"`10.3`"},{"kind":"text","text":"."}],"blockTags":[{"tag":"@deprecated","content":[{"kind":"text","text":"Use "},{"kind":"code","text":"`expo-device`"},{"kind":"text","text":"'s ["},{"kind":"code","text":"`Device.osVersion`"},{"kind":"text","text":"](./device/#deviceosversion)."}]}]},"type":{"type":"intrinsic","name":"string"}},{"name":"userInterfaceIdiom","kind":1024,"comment":{"summary":[{"kind":"text","text":"The user interface idiom of this device, i.e. whether the app is running on an iPhone or an iPad."}],"blockTags":[{"tag":"@deprecated","content":[{"kind":"text","text":"Use "},{"kind":"code","text":"`expo-device`"},{"kind":"text","text":"'s ["},{"kind":"code","text":"`Device.getDeviceTypeAsync()`"},{"kind":"text","text":"](./device/#devicegetdevicetypeasync)."}]}]},"type":{"type":"reference","name":"UserInterfaceIdiom"}}],"indexSignature":{"name":"__index","kind":8192,"parameters":[{"name":"key","kind":32768,"type":{"type":"intrinsic","name":"string"}}],"type":{"type":"intrinsic","name":"any"}}},{"name":"Manifest","kind":4194304,"comment":{"summary":[{"kind":"text","text":"A modern manifest."}]},"type":{"type":"reflection","declaration":{"name":"__type","kind":65536,"children":[{"name":"assets","kind":1024,"type":{"type":"array","elementType":{"type":"reference","name":"ManifestAsset"}}},{"name":"createdAt","kind":1024,"type":{"type":"intrinsic","name":"string"}},{"name":"extra","kind":1024,"flags":{"isOptional":true},"type":{"type":"reference","name":"ManifestExtra"}},{"name":"id","kind":1024,"type":{"type":"intrinsic","name":"string"}},{"name":"launchAsset","kind":1024,"type":{"type":"reference","name":"ManifestAsset"}},{"name":"metadata","kind":1024,"type":{"type":"intrinsic","name":"object"}},{"name":"runtimeVersion","kind":1024,"type":{"type":"intrinsic","name":"string"}}]}}},{"name":"ManifestAsset","kind":256,"children":[{"name":"url","kind":1024,"type":{"type":"intrinsic","name":"string"}}]},{"name":"ManifestExtra","kind":4194304,"type":{"type":"intersection","types":[{"type":"reference","name":"ClientScopingConfig"},{"type":"reflection","declaration":{"name":"__type","kind":65536,"children":[{"name":"eas","kind":1024,"flags":{"isOptional":true},"type":{"type":"reference","name":"EASConfig"}},{"name":"expoClient","kind":1024,"flags":{"isOptional":true},"type":{"type":"intersection","types":[{"type":"reference","name":"ExpoConfig"},{"type":"reflection","declaration":{"name":"__type","kind":65536,"children":[{"name":"hostUri","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"Only present during development using @expo/cli."}]},"type":{"type":"intrinsic","name":"string"}}]}}]}},{"name":"expoGo","kind":1024,"flags":{"isOptional":true},"type":{"type":"reference","name":"ExpoGoConfig"}}]}}]}},{"name":"NativeConstants","kind":8388608},{"name":"NativeConstants","kind":256,"children":[{"name":"appOwnership","kind":1024,"comment":{"summary":[{"kind":"text","text":"Returns "},{"kind":"code","text":"`expo`"},{"kind":"text","text":", "},{"kind":"code","text":"`standalone`"},{"kind":"text","text":", or "},{"kind":"code","text":"`guest`"},{"kind":"text","text":". This property only applies to the managed workflow\nand classic builds; for apps built with EAS Build and in bare workflow, the result is\nalways "},{"kind":"code","text":"`null`"},{"kind":"text","text":"."}]},"type":{"type":"union","types":[{"type":"literal","value":null},{"type":"reference","name":"AppOwnership"}]}},{"name":"debugMode","kind":1024,"type":{"type":"intrinsic","name":"boolean"}},{"name":"deviceName","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"A human-readable name for the device type."}]},"type":{"type":"intrinsic","name":"string"}},{"name":"deviceYearClass","kind":1024,"comment":{"summary":[{"kind":"text","text":"The [device year class](https://github.com/facebook/device-year-class) of this device."}],"blockTags":[{"tag":"@deprecated","content":[{"kind":"text","text":"Moved to "},{"kind":"code","text":"`expo-device`"},{"kind":"text","text":" as ["},{"kind":"code","text":"`Device.deviceYearClass`"},{"kind":"text","text":"](./device/#deviceyearclass)."}]}]},"type":{"type":"union","types":[{"type":"literal","value":null},{"type":"intrinsic","name":"number"}]}},{"name":"easConfig","kind":1024,"comment":{"summary":[{"kind":"text","text":"The standard EAS config object populated when using EAS."}]},"type":{"type":"union","types":[{"type":"literal","value":null},{"type":"reference","name":"EASConfig"}]}},{"name":"executionEnvironment","kind":1024,"type":{"type":"reference","name":"ExecutionEnvironment"}},{"name":"experienceUrl","kind":1024,"type":{"type":"intrinsic","name":"string"}},{"name":"expoConfig","kind":1024,"comment":{"summary":[{"kind":"text","text":"The standard Expo config object defined in "},{"kind":"code","text":"`app.json`"},{"kind":"text","text":" and "},{"kind":"code","text":"`app.config.js`"},{"kind":"text","text":" files. For both\nclassic and modern manifests, whether they are embedded or remote."}]},"type":{"type":"union","types":[{"type":"literal","value":null},{"type":"intersection","types":[{"type":"reference","name":"ExpoConfig"},{"type":"reflection","declaration":{"name":"__type","kind":65536,"children":[{"name":"hostUri","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"Only present during development using @expo/cli."}]},"type":{"type":"intrinsic","name":"string"}}]}}]}]}},{"name":"expoGoConfig","kind":1024,"comment":{"summary":[{"kind":"text","text":"The standard Expo Go config object populated when running in Expo Go."}]},"type":{"type":"union","types":[{"type":"literal","value":null},{"type":"reference","name":"ExpoGoConfig"}]}},{"name":"expoRuntimeVersion","kind":1024,"type":{"type":"union","types":[{"type":"literal","value":null},{"type":"intrinsic","name":"string"}]}},{"name":"expoVersion","kind":1024,"comment":{"summary":[{"kind":"text","text":"The version string of the Expo Go app currently running.\nReturns "},{"kind":"code","text":"`null`"},{"kind":"text","text":" in bare workflow and web."}]},"type":{"type":"union","types":[{"type":"literal","value":null},{"type":"intrinsic","name":"string"}]}},{"name":"getWebViewUserAgentAsync","kind":1024,"type":{"type":"reflection","declaration":{"name":"__type","kind":65536,"signatures":[{"name":"__type","kind":4096,"comment":{"summary":[{"kind":"text","text":"Gets the user agent string which would be included in requests sent by a web view running on\nthis device. This is probably not the same user agent you might be providing in your JS "},{"kind":"code","text":"`fetch`"},{"kind":"text","text":"\nrequests."}]},"type":{"type":"reference","typeArguments":[{"type":"union","types":[{"type":"literal","value":null},{"type":"intrinsic","name":"string"}]}],"name":"Promise","qualifiedName":"Promise","package":"typescript"}}]}}},{"name":"installationId","kind":1024,"comment":{"summary":[{"kind":"text","text":"An identifier that is unique to this particular device and whose lifetime is at least as long\nas the installation of the app."}],"blockTags":[{"tag":"@deprecated","content":[{"kind":"code","text":"`Constants.installationId`"},{"kind":"text","text":" is deprecated in favor of generating your own ID and\nstoring it."}]}]},"type":{"type":"intrinsic","name":"string"}},{"name":"intentUri","kind":1024,"flags":{"isOptional":true},"type":{"type":"intrinsic","name":"string"}},{"name":"isDetached","kind":1024,"flags":{"isOptional":true},"type":{"type":"intrinsic","name":"boolean"}},{"name":"isDevice","kind":1024,"comment":{"summary":[{"kind":"code","text":"`true`"},{"kind":"text","text":" if the app is running on a device, "},{"kind":"code","text":"`false`"},{"kind":"text","text":" if running in a simulator or emulator."}],"blockTags":[{"tag":"@deprecated","content":[{"kind":"text","text":"Use "},{"kind":"code","text":"`expo-device`"},{"kind":"text","text":"'s ["},{"kind":"code","text":"`Device.isDevice`"},{"kind":"text","text":"](./device/#deviceisdevice)."}]}]},"type":{"type":"intrinsic","name":"boolean"}},{"name":"isHeadless","kind":1024,"type":{"type":"intrinsic","name":"boolean"}},{"name":"linkingUri","kind":1024,"type":{"type":"intrinsic","name":"string"}},{"name":"manifest","kind":1024,"comment":{"summary":[{"kind":"text","text":"Classic manifest for Expo apps using classic updates and the updates embedded in builds.\nReturns "},{"kind":"code","text":"`null`"},{"kind":"text","text":" in bare workflow and when "},{"kind":"code","text":"`manifest2`"},{"kind":"text","text":" is non-null."}],"blockTags":[{"tag":"@deprecated","content":[{"kind":"text","text":"Use "},{"kind":"code","text":"`Constants.expoConfig`"},{"kind":"text","text":" instead, which behaves more consistently across EAS Build\nand EAS Update."}]}]},"type":{"type":"union","types":[{"type":"literal","value":null},{"type":"reference","name":"AppManifest"}]}},{"name":"manifest2","kind":1024,"comment":{"summary":[{"kind":"text","text":"Manifest for Expo apps using modern Expo Updates from a remote source, such as apps that\nuse EAS Update. Returns "},{"kind":"code","text":"`null`"},{"kind":"text","text":" in bare workflow and when "},{"kind":"code","text":"`manifest`"},{"kind":"text","text":" is non-null.\n"},{"kind":"code","text":"`Constants.expoConfig`"},{"kind":"text","text":" should be used for accessing the Expo config object."}]},"type":{"type":"union","types":[{"type":"literal","value":null},{"type":"reference","name":"Manifest"}]}},{"name":"nativeAppVersion","kind":1024,"comment":{"summary":[{"kind":"text","text":"The **Info.plist** value for "},{"kind":"code","text":"`CFBundleShortVersionString`"},{"kind":"text","text":" on iOS and the version name set\nby "},{"kind":"code","text":"`version`"},{"kind":"text","text":" in app.json on Android at the time the native app was built."}],"blockTags":[{"tag":"@deprecated","content":[{"kind":"text","text":"Use "},{"kind":"code","text":"`expo-application`"},{"kind":"text","text":"'s ["},{"kind":"code","text":"`Application.nativeApplicationVersion`"},{"kind":"text","text":"](./application/#applicationnativeapplicationversion)."}]}]},"type":{"type":"union","types":[{"type":"literal","value":null},{"type":"intrinsic","name":"string"}]}},{"name":"nativeBuildVersion","kind":1024,"comment":{"summary":[{"kind":"text","text":"The **Info.plist** value for "},{"kind":"code","text":"`CFBundleVersion`"},{"kind":"text","text":" on iOS (set with "},{"kind":"code","text":"`ios.buildNumber`"},{"kind":"text","text":" value in\n**app.json** in a standalone app) and the version code set by "},{"kind":"code","text":"`android.versionCode`"},{"kind":"text","text":" in\n**app.json** on Android at the time the native app was built."}],"blockTags":[{"tag":"@deprecated","content":[{"kind":"text","text":"Use "},{"kind":"code","text":"`expo-application`"},{"kind":"text","text":"'s ["},{"kind":"code","text":"`Application.nativeBuildVersion`"},{"kind":"text","text":"](./application/#applicationnativebuildversion)."}]}]},"type":{"type":"union","types":[{"type":"literal","value":null},{"type":"intrinsic","name":"string"}]}},{"name":"platform","kind":1024,"flags":{"isOptional":true},"type":{"type":"reference","name":"PlatformManifest"}},{"name":"sessionId","kind":1024,"comment":{"summary":[{"kind":"text","text":"A string that is unique to the current session of your app. It is different across apps and\nacross multiple launches of the same app."}]},"type":{"type":"intrinsic","name":"string"}},{"name":"statusBarHeight","kind":1024,"comment":{"summary":[{"kind":"text","text":"The default status bar height for the device. Does not factor in changes when location tracking\nis in use or a phone call is active."}]},"type":{"type":"intrinsic","name":"number"}},{"name":"systemFonts","kind":1024,"comment":{"summary":[{"kind":"text","text":"A list of the system font names available on the current device."}]},"type":{"type":"array","elementType":{"type":"intrinsic","name":"string"}}},{"name":"systemVersion","kind":1024,"flags":{"isOptional":true},"type":{"type":"intrinsic","name":"number"}}],"indexSignature":{"name":"__index","kind":8192,"parameters":[{"name":"key","kind":32768,"type":{"type":"intrinsic","name":"string"}}],"type":{"type":"intrinsic","name":"any"}},"extendedBy":[{"type":"reference","name":"Constants"}]},{"name":"PlatformManifest","kind":8388608},{"name":"PlatformManifest","kind":256,"children":[{"name":"android","kind":1024,"flags":{"isOptional":true},"type":{"type":"reference","name":"AndroidManifest"}},{"name":"detach","kind":1024,"flags":{"isOptional":true},"type":{"type":"reflection","declaration":{"name":"__type","kind":65536,"children":[{"name":"scheme","kind":1024,"flags":{"isOptional":true},"type":{"type":"intrinsic","name":"string"}}],"indexSignature":{"name":"__index","kind":8192,"parameters":[{"name":"key","kind":32768,"type":{"type":"intrinsic","name":"string"}}],"type":{"type":"intrinsic","name":"any"}}}}},{"name":"developer","kind":1024,"flags":{"isOptional":true},"type":{"type":"intrinsic","name":"string"}},{"name":"hostUri","kind":1024,"flags":{"isOptional":true},"type":{"type":"intrinsic","name":"string"}},{"name":"ios","kind":1024,"flags":{"isOptional":true},"type":{"type":"reference","name":"IOSManifest"}},{"name":"logUrl","kind":1024,"flags":{"isOptional":true},"type":{"type":"intrinsic","name":"string"}},{"name":"scheme","kind":1024,"flags":{"isOptional":true},"type":{"type":"intrinsic","name":"string"}},{"name":"web","kind":1024,"flags":{"isOptional":true},"type":{"type":"reference","name":"WebManifest"}}],"indexSignature":{"name":"__index","kind":8192,"parameters":[{"name":"key","kind":32768,"type":{"type":"intrinsic","name":"string"}}],"type":{"type":"intrinsic","name":"any"}}},{"name":"UserInterfaceIdiom","kind":8388608},{"name":"UserInterfaceIdiom","kind":8,"comment":{"summary":[{"kind":"text","text":"Current supported values are "},{"kind":"code","text":"`handset`"},{"kind":"text","text":" and "},{"kind":"code","text":"`tablet`"},{"kind":"text","text":". Apple TV and CarPlay will show up\nas "},{"kind":"code","text":"`unsupported`"},{"kind":"text","text":"."}]},"children":[{"name":"Handset","kind":16,"type":{"type":"literal","value":"handset"}},{"name":"Tablet","kind":16,"type":{"type":"literal","value":"tablet"}},{"name":"Unsupported","kind":16,"type":{"type":"literal","value":"unsupported"}}]},{"name":"WebManifest","kind":8388608},{"name":"WebManifest","kind":256,"indexSignature":{"name":"__index","kind":8192,"parameters":[{"name":"key","kind":32768,"type":{"type":"intrinsic","name":"string"}}],"type":{"type":"intrinsic","name":"any"}}}]}
\ No newline at end of file
diff --git a/docs/public/static/data/v49.0.0/expo-contacts.json b/docs/public/static/data/v49.0.0/expo-contacts.json
new file mode 100644
index 0000000000000..b2db9721b5970
--- /dev/null
+++ b/docs/public/static/data/v49.0.0/expo-contacts.json
@@ -0,0 +1 @@
+{"name":"expo-contacts","kind":1,"children":[{"name":"CalendarFormats","kind":8,"comment":{"summary":[{"kind":"text","text":"This format denotes the common calendar format used to specify how a date is calculated in "},{"kind":"code","text":"`nonGregorianBirthday`"},{"kind":"text","text":" fields."}]},"children":[{"name":"Buddhist","kind":16,"comment":{"summary":[],"blockTags":[{"tag":"@platform","content":[{"kind":"text","text":"ios"}]}]},"type":{"type":"literal","value":"buddhist"}},{"name":"Chinese","kind":16,"comment":{"summary":[],"blockTags":[{"tag":"@platform","content":[{"kind":"text","text":"ios"}]}]},"type":{"type":"literal","value":"chinese"}},{"name":"Coptic","kind":16,"comment":{"summary":[],"blockTags":[{"tag":"@platform","content":[{"kind":"text","text":"ios"}]}]},"type":{"type":"literal","value":"coptic"}},{"name":"EthiopicAmeteAlem","kind":16,"comment":{"summary":[],"blockTags":[{"tag":"@platform","content":[{"kind":"text","text":"ios"}]}]},"type":{"type":"literal","value":"ethiopicAmeteAlem"}},{"name":"EthiopicAmeteMihret","kind":16,"comment":{"summary":[],"blockTags":[{"tag":"@platform","content":[{"kind":"text","text":"ios"}]}]},"type":{"type":"literal","value":"ethiopicAmeteMihret"}},{"name":"Gregorian","kind":16,"type":{"type":"literal","value":"gregorian"}},{"name":"Hebrew","kind":16,"comment":{"summary":[],"blockTags":[{"tag":"@platform","content":[{"kind":"text","text":"ios"}]}]},"type":{"type":"literal","value":"hebrew"}},{"name":"ISO8601","kind":16,"comment":{"summary":[],"blockTags":[{"tag":"@platform","content":[{"kind":"text","text":"ios"}]}]},"type":{"type":"literal","value":"iso8601"}},{"name":"Indian","kind":16,"comment":{"summary":[],"blockTags":[{"tag":"@platform","content":[{"kind":"text","text":"ios"}]}]},"type":{"type":"literal","value":"indian"}},{"name":"Islamic","kind":16,"comment":{"summary":[],"blockTags":[{"tag":"@platform","content":[{"kind":"text","text":"ios"}]}]},"type":{"type":"literal","value":"islamic"}},{"name":"IslamicCivil","kind":16,"comment":{"summary":[],"blockTags":[{"tag":"@platform","content":[{"kind":"text","text":"ios"}]}]},"type":{"type":"literal","value":"islamicCivil"}},{"name":"IslamicTabular","kind":16,"comment":{"summary":[],"blockTags":[{"tag":"@platform","content":[{"kind":"text","text":"ios"}]}]},"type":{"type":"literal","value":"islamicTabular"}},{"name":"IslamicUmmAlQura","kind":16,"comment":{"summary":[],"blockTags":[{"tag":"@platform","content":[{"kind":"text","text":"ios"}]}]},"type":{"type":"literal","value":"islamicUmmAlQura"}},{"name":"Japanese","kind":16,"comment":{"summary":[],"blockTags":[{"tag":"@platform","content":[{"kind":"text","text":"ios"}]}]},"type":{"type":"literal","value":"japanese"}},{"name":"Persian","kind":16,"comment":{"summary":[],"blockTags":[{"tag":"@platform","content":[{"kind":"text","text":"ios"}]}]},"type":{"type":"literal","value":"persian"}},{"name":"RepublicOfChina","kind":16,"comment":{"summary":[],"blockTags":[{"tag":"@platform","content":[{"kind":"text","text":"ios"}]}]},"type":{"type":"literal","value":"republicOfChina"}}]},{"name":"ContactTypes","kind":8,"children":[{"name":"Company","kind":16,"comment":{"summary":[{"kind":"text","text":"Contact is group or company."}]},"type":{"type":"literal","value":"company"}},{"name":"Person","kind":16,"comment":{"summary":[{"kind":"text","text":"Contact is a human."}]},"type":{"type":"literal","value":"person"}}]},{"name":"ContainerTypes","kind":8,"comment":{"summary":[],"blockTags":[{"tag":"@platform","content":[{"kind":"text","text":"ios"}]}]},"children":[{"name":"CardDAV","kind":16,"comment":{"summary":[{"kind":"text","text":"With cardDAV protocol used for sharing."}]},"type":{"type":"literal","value":"cardDAV"}},{"name":"Exchange","kind":16,"comment":{"summary":[{"kind":"text","text":"In association with email server."}]},"type":{"type":"literal","value":"exchange"}},{"name":"Local","kind":16,"comment":{"summary":[{"kind":"text","text":"A local non-iCloud container."}]},"type":{"type":"literal","value":"local"}},{"name":"Unassigned","kind":16,"comment":{"summary":[{"kind":"text","text":"Unknown container."}]},"type":{"type":"literal","value":"unassigned"}}]},{"name":"Fields","kind":8,"comment":{"summary":[{"kind":"text","text":"Possible fields to retrieve for a contact."}]},"children":[{"name":"Addresses","kind":16,"type":{"type":"literal","value":"addresses"}},{"name":"Birthday","kind":16,"type":{"type":"literal","value":"birthday"}},{"name":"Company","kind":16,"type":{"type":"literal","value":"company"}},{"name":"ContactType","kind":16,"type":{"type":"literal","value":"contactType"}},{"name":"Dates","kind":16,"type":{"type":"literal","value":"dates"}},{"name":"Department","kind":16,"type":{"type":"literal","value":"department"}},{"name":"Emails","kind":16,"type":{"type":"literal","value":"emails"}},{"name":"ExtraNames","kind":16,"type":{"type":"literal","value":"extraNames"}},{"name":"FirstName","kind":16,"type":{"type":"literal","value":"firstName"}},{"name":"ID","kind":16,"type":{"type":"literal","value":"id"}},{"name":"Image","kind":16,"type":{"type":"literal","value":"image"}},{"name":"ImageAvailable","kind":16,"type":{"type":"literal","value":"imageAvailable"}},{"name":"InstantMessageAddresses","kind":16,"type":{"type":"literal","value":"instantMessageAddresses"}},{"name":"JobTitle","kind":16,"type":{"type":"literal","value":"jobTitle"}},{"name":"LastName","kind":16,"type":{"type":"literal","value":"lastName"}},{"name":"MaidenName","kind":16,"type":{"type":"literal","value":"maidenName"}},{"name":"MiddleName","kind":16,"type":{"type":"literal","value":"middleName"}},{"name":"Name","kind":16,"type":{"type":"literal","value":"name"}},{"name":"NamePrefix","kind":16,"type":{"type":"literal","value":"namePrefix"}},{"name":"NameSuffix","kind":16,"type":{"type":"literal","value":"nameSuffix"}},{"name":"Nickname","kind":16,"type":{"type":"literal","value":"nickname"}},{"name":"NonGregorianBirthday","kind":16,"comment":{"summary":[],"blockTags":[{"tag":"@platform","content":[{"kind":"text","text":"ios"}]}]},"type":{"type":"literal","value":"nonGregorianBirthday"}},{"name":"Note","kind":16,"type":{"type":"literal","value":"note"}},{"name":"PhoneNumbers","kind":16,"type":{"type":"literal","value":"phoneNumbers"}},{"name":"PhoneticFirstName","kind":16,"type":{"type":"literal","value":"phoneticFirstName"}},{"name":"PhoneticLastName","kind":16,"type":{"type":"literal","value":"phoneticLastName"}},{"name":"PhoneticMiddleName","kind":16,"type":{"type":"literal","value":"phoneticMiddleName"}},{"name":"RawImage","kind":16,"type":{"type":"literal","value":"rawImage"}},{"name":"Relationships","kind":16,"type":{"type":"literal","value":"relationships"}},{"name":"SocialProfiles","kind":16,"comment":{"summary":[],"blockTags":[{"tag":"@platform","content":[{"kind":"text","text":"ios"}]}]},"type":{"type":"literal","value":"socialProfiles"}},{"name":"UrlAddresses","kind":16,"type":{"type":"literal","value":"urlAddresses"}}]},{"name":"PermissionStatus","kind":8,"children":[{"name":"DENIED","kind":16,"comment":{"summary":[{"kind":"text","text":"User has denied the permission."}]},"type":{"type":"literal","value":"denied"}},{"name":"GRANTED","kind":16,"comment":{"summary":[{"kind":"text","text":"User has granted the permission."}]},"type":{"type":"literal","value":"granted"}},{"name":"UNDETERMINED","kind":16,"comment":{"summary":[{"kind":"text","text":"User hasn't granted or denied the permission yet."}]},"type":{"type":"literal","value":"undetermined"}}]},{"name":"SortTypes","kind":8,"children":[{"name":"FirstName","kind":16,"comment":{"summary":[{"kind":"text","text":"Sort by first name in ascending order."}]},"type":{"type":"literal","value":"firstName"}},{"name":"LastName","kind":16,"comment":{"summary":[{"kind":"text","text":"Sort by last name in ascending order."}]},"type":{"type":"literal","value":"lastName"}},{"name":"None","kind":16,"comment":{"summary":[{"kind":"text","text":"No sorting should be applied."}]},"type":{"type":"literal","value":"none"}},{"name":"UserDefault","kind":16,"comment":{"summary":[{"kind":"text","text":"The user default method of sorting."}],"blockTags":[{"tag":"@platform","content":[{"kind":"text","text":"android"}]}]},"type":{"type":"literal","value":"userDefault"}}]},{"name":"PermissionResponse","kind":256,"comment":{"summary":[{"kind":"text","text":"An object obtained by permissions get and request functions."}]},"children":[{"name":"canAskAgain","kind":1024,"comment":{"summary":[{"kind":"text","text":"Indicates if user can be asked again for specific permission.\nIf not, one should be directed to the Settings app\nin order to enable/disable the permission."}]},"type":{"type":"intrinsic","name":"boolean"}},{"name":"expires","kind":1024,"comment":{"summary":[{"kind":"text","text":"Determines time when the permission expires."}]},"type":{"type":"reference","name":"PermissionExpiration"}},{"name":"granted","kind":1024,"comment":{"summary":[{"kind":"text","text":"A convenience boolean that indicates if the permission is granted."}]},"type":{"type":"intrinsic","name":"boolean"}},{"name":"status","kind":1024,"comment":{"summary":[{"kind":"text","text":"Determines the status of the permission."}]},"type":{"type":"reference","name":"PermissionStatus"}}]},{"name":"Address","kind":4194304,"type":{"type":"reflection","declaration":{"name":"__type","kind":65536,"children":[{"name":"city","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"City name."}]},"type":{"type":"intrinsic","name":"string"}},{"name":"country","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"Country name"}]},"type":{"type":"intrinsic","name":"string"}},{"name":"id","kind":1024,"comment":{"summary":[{"kind":"text","text":"Unique ID."}]},"type":{"type":"intrinsic","name":"string"}},{"name":"isoCountryCode","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"[Standard country code](https://www.iso.org/iso-3166-country-codes.html)."}]},"type":{"type":"intrinsic","name":"string"}},{"name":"label","kind":1024,"comment":{"summary":[{"kind":"text","text":"Localized display name."}]},"type":{"type":"intrinsic","name":"string"}},{"name":"neighborhood","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"Neighborhood name."}]},"type":{"type":"intrinsic","name":"string"}},{"name":"poBox","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"P.O. Box."}]},"type":{"type":"intrinsic","name":"string"}},{"name":"postalCode","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"Local post code."}]},"type":{"type":"intrinsic","name":"string"}},{"name":"region","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"Region or state name."}]},"type":{"type":"intrinsic","name":"string"}},{"name":"street","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"Street name."}]},"type":{"type":"intrinsic","name":"string"}}]}}},{"name":"CalendarFormatType","kind":4194304,"type":{"type":"union","types":[{"type":"reference","name":"CalendarFormats"},{"type":"template-literal","head":"","tail":[[{"type":"reference","name":"CalendarFormats"},""]]}]}},{"name":"Contact","kind":4194304,"comment":{"summary":[{"kind":"text","text":"A set of fields that define information about a single contact entity."}]},"type":{"type":"reflection","declaration":{"name":"__type","kind":65536,"children":[{"name":"addresses","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"Locations."}]},"type":{"type":"array","elementType":{"type":"reference","name":"Address"}}},{"name":"birthday","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"Birthday information in Gregorian format."}]},"type":{"type":"reference","name":"Date"}},{"name":"company","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"Organization the entity belongs to."}]},"type":{"type":"intrinsic","name":"string"}},{"name":"contactType","kind":1024,"comment":{"summary":[{"kind":"text","text":"Denoting a person or company."}]},"type":{"type":"reference","name":"ContactType"}},{"name":"dates","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"A labeled list of other relevant user dates in Gregorian format."}]},"type":{"type":"array","elementType":{"type":"reference","name":"Date"}}},{"name":"department","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"Job department."}]},"type":{"type":"intrinsic","name":"string"}},{"name":"emails","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"Email addresses."}]},"type":{"type":"array","elementType":{"type":"reference","name":"Email"}}},{"name":"firstName","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"Given name."}]},"type":{"type":"intrinsic","name":"string"}},{"name":"id","kind":1024,"comment":{"summary":[{"kind":"text","text":"Immutable identifier used for querying and indexing."}]},"type":{"type":"intrinsic","name":"string"}},{"name":"image","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"Thumbnail image. On iOS it size is set to 320×320px, on Android it may vary."}]},"type":{"type":"reference","name":"Image"}},{"name":"imageAvailable","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"Used for efficient retrieval of images."}]},"type":{"type":"intrinsic","name":"boolean"}},{"name":"instantMessageAddresses","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"Instant messaging connections."}]},"type":{"type":"array","elementType":{"type":"reference","name":"InstantMessageAddress"}}},{"name":"jobTitle","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"Job description."}]},"type":{"type":"intrinsic","name":"string"}},{"name":"lastName","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"Last name."}]},"type":{"type":"intrinsic","name":"string"}},{"name":"maidenName","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"Maiden name."}]},"type":{"type":"intrinsic","name":"string"}},{"name":"middleName","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"Middle name"}]},"type":{"type":"intrinsic","name":"string"}},{"name":"name","kind":1024,"comment":{"summary":[{"kind":"text","text":"Full name with proper format."}]},"type":{"type":"intrinsic","name":"string"}},{"name":"namePrefix","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"Dr. Mr. Mrs. ect…"}]},"type":{"type":"intrinsic","name":"string"}},{"name":"nameSuffix","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"Jr. Sr. ect…"}]},"type":{"type":"intrinsic","name":"string"}},{"name":"nickname","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"An alias to the proper name."}]},"type":{"type":"intrinsic","name":"string"}},{"name":"nonGregorianBirthday","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"Birthday that doesn't conform to the Gregorian calendar format, interpreted based on the [calendar "},{"kind":"code","text":"`format`"},{"kind":"text","text":"](#date) setting."}],"blockTags":[{"tag":"@platform","content":[{"kind":"text","text":"ios"}]}]},"type":{"type":"reference","name":"Date"}},{"name":"note","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"Additional information.\n> On iOS 13+, the "},{"kind":"code","text":"`note`"},{"kind":"text","text":" field [requires your app to request additional entitlements](https://developer.apple.com/documentation/bundleresources/entitlements/com_apple_developer_contacts_notes).\n> The Expo Go app does not contain those entitlements, so in order to test this feature you will need to [request the entitlement from Apple](https://developer.apple.com/contact/request/contact-note-field),\n> set the ["},{"kind":"code","text":"`ios.accessesContactNotes`"},{"kind":"text","text":"](./config/app.mdx#accessescontactnotes) field in app.json to "},{"kind":"code","text":"`true`"},{"kind":"text","text":", and [create your development build](/develop/development-builds/create-a-build/)."}]},"type":{"type":"intrinsic","name":"string"}},{"name":"phoneNumbers","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"Phone numbers."}]},"type":{"type":"array","elementType":{"type":"reference","name":"PhoneNumber"}}},{"name":"phoneticFirstName","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"Pronunciation of the first name."}]},"type":{"type":"intrinsic","name":"string"}},{"name":"phoneticLastName","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"Pronunciation of the last name."}]},"type":{"type":"intrinsic","name":"string"}},{"name":"phoneticMiddleName","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"Pronunciation of the middle name."}]},"type":{"type":"intrinsic","name":"string"}},{"name":"rawImage","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"Raw image without cropping, usually large."}]},"type":{"type":"reference","name":"Image"}},{"name":"relationships","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"Names of other relevant user connections."}]},"type":{"type":"array","elementType":{"type":"reference","name":"Relationship"}}},{"name":"socialProfiles","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"Social networks."}],"blockTags":[{"tag":"@platform","content":[{"kind":"text","text":"ios"}]}]},"type":{"type":"array","elementType":{"type":"reference","name":"SocialProfile"}}},{"name":"urlAddresses","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"Associated web URLs."}]},"type":{"type":"array","elementType":{"type":"reference","name":"UrlAddress"}}}]}}},{"name":"ContactQuery","kind":4194304,"comment":{"summary":[{"kind":"text","text":"Used to query contacts from the user's device."}]},"type":{"type":"reflection","declaration":{"name":"__type","kind":65536,"children":[{"name":"containerId","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"Get all contacts that belong to the container matching this ID."}],"blockTags":[{"tag":"@platform","content":[{"kind":"text","text":"ios"}]}]},"type":{"type":"intrinsic","name":"string"}},{"name":"fields","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"If specified, the defined fields will be returned. If skipped, all fields will be returned."}]},"type":{"type":"array","elementType":{"type":"reference","name":"FieldType"}}},{"name":"groupId","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"Get all contacts that belong to the group matching this ID."}],"blockTags":[{"tag":"@platform","content":[{"kind":"text","text":"ios"}]}]},"type":{"type":"intrinsic","name":"string"}},{"name":"id","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"Get contacts with a matching ID or array of IDs."}]},"type":{"type":"union","types":[{"type":"intrinsic","name":"string"},{"type":"array","elementType":{"type":"intrinsic","name":"string"}}]}},{"name":"name","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"Get all contacts whose name contains the provided string (not case-sensitive)."}]},"type":{"type":"intrinsic","name":"string"}},{"name":"pageOffset","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"The number of contacts to skip before gathering contacts."}]},"type":{"type":"intrinsic","name":"number"}},{"name":"pageSize","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"The max number of contacts to return. If skipped or set to "},{"kind":"code","text":"`0`"},{"kind":"text","text":" all contacts will be returned."}]},"type":{"type":"intrinsic","name":"number"}},{"name":"rawContacts","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"Prevent unification of contacts when gathering."}],"blockTags":[{"tag":"@default","content":[{"kind":"text","text":"false"}]},{"tag":"@platform","content":[{"kind":"text","text":"ios"}]}]},"type":{"type":"intrinsic","name":"boolean"}},{"name":"sort","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"Sort method used when gathering contacts."}]},"type":{"type":"reference","name":"ContactSort"}}]}}},{"name":"ContactResponse","kind":4194304,"comment":{"summary":[{"kind":"text","text":"The return value for queried contact operations like "},{"kind":"code","text":"`getContactsAsync`"},{"kind":"text","text":"."}]},"type":{"type":"reflection","declaration":{"name":"__type","kind":65536,"children":[{"name":"data","kind":1024,"comment":{"summary":[{"kind":"text","text":"An array of contacts that match a particular query."}]},"type":{"type":"array","elementType":{"type":"reference","name":"Contact"}}},{"name":"hasNextPage","kind":1024,"comment":{"summary":[{"kind":"text","text":"This will be "},{"kind":"code","text":"`true`"},{"kind":"text","text":" if there are more contacts to retrieve beyond what is returned."}]},"type":{"type":"intrinsic","name":"boolean"}},{"name":"hasPreviousPage","kind":1024,"comment":{"summary":[{"kind":"text","text":"This will be "},{"kind":"code","text":"`true if there are previous contacts that weren't retrieved due to `"},{"kind":"text","text":"pageOffset` limit."}]},"type":{"type":"intrinsic","name":"boolean"}}]}}},{"name":"ContactSort","kind":4194304,"type":{"type":"template-literal","head":"","tail":[[{"type":"reference","name":"SortTypes"},""]]}},{"name":"ContactType","kind":4194304,"type":{"type":"union","types":[{"type":"reference","name":"ContactTypes"},{"type":"template-literal","head":"","tail":[[{"type":"reference","name":"ContactTypes"},""]]}]}},{"name":"Container","kind":4194304,"type":{"type":"reflection","declaration":{"name":"__type","kind":65536,"children":[{"name":"id","kind":1024,"type":{"type":"intrinsic","name":"string"}},{"name":"name","kind":1024,"type":{"type":"intrinsic","name":"string"}},{"name":"type","kind":1024,"type":{"type":"reference","name":"ContainerType"}}]}}},{"name":"ContainerQuery","kind":4194304,"comment":{"summary":[{"kind":"text","text":"Used to query native contact containers."}],"blockTags":[{"tag":"@platform","content":[{"kind":"text","text":"ios"}]}]},"type":{"type":"reflection","declaration":{"name":"__type","kind":65536,"children":[{"name":"contactId","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"Query all the containers that parent a contact."}]},"type":{"type":"intrinsic","name":"string"}},{"name":"containerId","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"Query all the containers that matches ID or an array od IDs."}]},"type":{"type":"union","types":[{"type":"intrinsic","name":"string"},{"type":"array","elementType":{"type":"intrinsic","name":"string"}}]}},{"name":"groupId","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"Query all the containers that parent a group."}]},"type":{"type":"intrinsic","name":"string"}}]}}},{"name":"ContainerType","kind":4194304,"type":{"type":"union","types":[{"type":"reference","name":"ContainerTypes"},{"type":"template-literal","head":"","tail":[[{"type":"reference","name":"ContainerTypes"},""]]}]}},{"name":"Date","kind":4194304,"type":{"type":"reflection","declaration":{"name":"__type","kind":65536,"children":[{"name":"day","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"Day."}]},"type":{"type":"intrinsic","name":"number"}},{"name":"format","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"Format for the input date."}]},"type":{"type":"reference","name":"CalendarFormatType"}},{"name":"id","kind":1024,"comment":{"summary":[{"kind":"text","text":"Unique ID."}]},"type":{"type":"intrinsic","name":"string"}},{"name":"label","kind":1024,"comment":{"summary":[{"kind":"text","text":"Localized display name."}]},"type":{"type":"intrinsic","name":"string"}},{"name":"month","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"Month - adjusted for JavaScript "},{"kind":"code","text":"`Date`"},{"kind":"text","text":" which starts at "},{"kind":"code","text":"`0`"},{"kind":"text","text":"."}]},"type":{"type":"intrinsic","name":"number"}},{"name":"year","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"Year."}]},"type":{"type":"intrinsic","name":"number"}}]}}},{"name":"Email","kind":4194304,"type":{"type":"reflection","declaration":{"name":"__type","kind":65536,"children":[{"name":"email","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"Email address."}]},"type":{"type":"intrinsic","name":"string"}},{"name":"id","kind":1024,"comment":{"summary":[{"kind":"text","text":"Unique ID."}]},"type":{"type":"intrinsic","name":"string"}},{"name":"isPrimary","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"Flag signifying if it is a primary email address."}]},"type":{"type":"intrinsic","name":"boolean"}},{"name":"label","kind":1024,"comment":{"summary":[{"kind":"text","text":"Localized display name."}]},"type":{"type":"intrinsic","name":"string"}}]}}},{"name":"FieldType","kind":4194304,"type":{"type":"union","types":[{"type":"reference","name":"Fields"},{"type":"template-literal","head":"","tail":[[{"type":"reference","name":"Fields"},""]]}]}},{"name":"FormOptions","kind":4194304,"comment":{"summary":[{"kind":"text","text":"Denotes the functionality of a native contact form."}]},"type":{"type":"reflection","declaration":{"name":"__type","kind":65536,"children":[{"name":"allowsActions","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"Actions like share, add, create."}]},"type":{"type":"intrinsic","name":"boolean"}},{"name":"allowsEditing","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"Allows for contact mutation."}]},"type":{"type":"intrinsic","name":"boolean"}},{"name":"alternateName","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"Used if contact doesn't have a name defined."}]},"type":{"type":"intrinsic","name":"string"}},{"name":"cancelButtonTitle","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"The name of the left bar button."}]},"type":{"type":"intrinsic","name":"string"}},{"name":"displayedPropertyKeys","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"The properties that will be displayed. On iOS those properties does nothing while in editing mode."}]},"type":{"type":"array","elementType":{"type":"reference","name":"FieldType"}}},{"name":"groupId","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"The parent group for a new contact."}]},"type":{"type":"intrinsic","name":"string"}},{"name":"isNew","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"Present the new contact controller. If set to "},{"kind":"code","text":"`false`"},{"kind":"text","text":" the unknown controller will be shown."}]},"type":{"type":"intrinsic","name":"boolean"}},{"name":"message","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"Controller title."}]},"type":{"type":"intrinsic","name":"string"}},{"name":"preventAnimation","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"Prevents the controller from animating in."}]},"type":{"type":"intrinsic","name":"boolean"}},{"name":"shouldShowLinkedContacts","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"Show or hide the similar contacts."}]},"type":{"type":"intrinsic","name":"boolean"}}]}}},{"name":"Group","kind":4194304,"comment":{"summary":[{"kind":"text","text":"A parent to contacts. A contact can belong to multiple groups. Here are some query operations you can perform:\n- Child Contacts: "},{"kind":"code","text":"`getContactsAsync({ groupId })`"},{"kind":"text","text":"\n- Groups From Container: "},{"kind":"code","text":"`getGroupsAsync({ containerId })`"},{"kind":"text","text":"\n- Groups Named: "},{"kind":"code","text":"`getContainersAsync({ groupName })`"}],"blockTags":[{"tag":"@platform","content":[{"kind":"text","text":"ios"}]}]},"type":{"type":"reflection","declaration":{"name":"__type","kind":65536,"children":[{"name":"id","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"The editable name of a group."}]},"type":{"type":"intrinsic","name":"string"}},{"name":"name","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"Immutable id representing the group."}]},"type":{"type":"intrinsic","name":"string"}}]}}},{"name":"GroupQuery","kind":4194304,"comment":{"summary":[{"kind":"text","text":"Used to query native contact groups."}],"blockTags":[{"tag":"@platform","content":[{"kind":"text","text":"ios"}]}]},"type":{"type":"reflection","declaration":{"name":"__type","kind":65536,"children":[{"name":"containerId","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"Query all groups that belong to a certain container."}]},"type":{"type":"intrinsic","name":"string"}},{"name":"groupId","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"Query the group with a matching ID."}]},"type":{"type":"intrinsic","name":"string"}},{"name":"groupName","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"Query all groups matching a name."}]},"type":{"type":"intrinsic","name":"string"}}]}}},{"name":"Image","kind":4194304,"comment":{"summary":[{"kind":"text","text":"Information regarding thumbnail images.\n> On Android you can get dimensions using ["},{"kind":"code","text":"`Image.getSize`"},{"kind":"text","text":"](https://reactnative.dev/docs/image#getsize) method."}]},"type":{"type":"reflection","declaration":{"name":"__type","kind":65536,"children":[{"name":"base64","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"Image as Base64 string."}]},"type":{"type":"intrinsic","name":"string"}},{"name":"height","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"Image height"}],"blockTags":[{"tag":"@platform","content":[{"kind":"text","text":"ios"}]}]},"type":{"type":"intrinsic","name":"number"}},{"name":"uri","kind":1024,"flags":{"isOptional":true},"type":{"type":"intrinsic","name":"string"}},{"name":"width","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"Image width."}],"blockTags":[{"tag":"@platform","content":[{"kind":"text","text":"ios"}]}]},"type":{"type":"intrinsic","name":"number"}}]}}},{"name":"InstantMessageAddress","kind":4194304,"type":{"type":"reflection","declaration":{"name":"__type","kind":65536,"children":[{"name":"id","kind":1024,"comment":{"summary":[{"kind":"text","text":"Unique ID."}]},"type":{"type":"intrinsic","name":"string"}},{"name":"label","kind":1024,"comment":{"summary":[{"kind":"text","text":"Localized display name."}]},"type":{"type":"intrinsic","name":"string"}},{"name":"localizedService","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"Localized name of app."}]},"type":{"type":"intrinsic","name":"string"}},{"name":"service","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"Name of instant messaging app."}]},"type":{"type":"intrinsic","name":"string"}},{"name":"username","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"Username in IM app."}]},"type":{"type":"intrinsic","name":"string"}}]}}},{"name":"PhoneNumber","kind":4194304,"type":{"type":"reflection","declaration":{"name":"__type","kind":65536,"children":[{"name":"countryCode","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"Country code."}],"blockTags":[{"tag":"@example","content":[{"kind":"code","text":"`+1`"}]}]},"type":{"type":"intrinsic","name":"string"}},{"name":"digits","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"Phone number without format."}],"blockTags":[{"tag":"@example","content":[{"kind":"code","text":"`8674305`"}]}]},"type":{"type":"intrinsic","name":"string"}},{"name":"id","kind":1024,"comment":{"summary":[{"kind":"text","text":"Unique ID."}]},"type":{"type":"intrinsic","name":"string"}},{"name":"isPrimary","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"Flag signifying if it is a primary phone number."}]},"type":{"type":"intrinsic","name":"boolean"}},{"name":"label","kind":1024,"comment":{"summary":[{"kind":"text","text":"Localized display name."}]},"type":{"type":"intrinsic","name":"string"}},{"name":"number","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"Phone number."}]},"type":{"type":"intrinsic","name":"string"}}]}}},{"name":"Relationship","kind":4194304,"type":{"type":"reflection","declaration":{"name":"__type","kind":65536,"children":[{"name":"id","kind":1024,"comment":{"summary":[{"kind":"text","text":"Unique ID."}]},"type":{"type":"intrinsic","name":"string"}},{"name":"label","kind":1024,"comment":{"summary":[{"kind":"text","text":"Localized display name."}]},"type":{"type":"intrinsic","name":"string"}},{"name":"name","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"Name of related contact."}]},"type":{"type":"intrinsic","name":"string"}}]}}},{"name":"SocialProfile","kind":4194304,"comment":{"summary":[],"blockTags":[{"tag":"@platform","content":[{"kind":"text","text":"ios"}]}]},"type":{"type":"reflection","declaration":{"name":"__type","kind":65536,"children":[{"name":"id","kind":1024,"comment":{"summary":[{"kind":"text","text":"Unique ID."}]},"type":{"type":"intrinsic","name":"string"}},{"name":"label","kind":1024,"comment":{"summary":[{"kind":"text","text":"Localized display name."}]},"type":{"type":"intrinsic","name":"string"}},{"name":"localizedProfile","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"Localized profile name."}]},"type":{"type":"intrinsic","name":"string"}},{"name":"service","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"Name of social app."}]},"type":{"type":"intrinsic","name":"string"}},{"name":"url","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"Web URL."}]},"type":{"type":"intrinsic","name":"string"}},{"name":"userId","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"Username ID in social app."}]},"type":{"type":"intrinsic","name":"string"}},{"name":"username","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"Username in social app."}]},"type":{"type":"intrinsic","name":"string"}}]}}},{"name":"UrlAddress","kind":4194304,"type":{"type":"reflection","declaration":{"name":"__type","kind":65536,"children":[{"name":"id","kind":1024,"comment":{"summary":[{"kind":"text","text":"Unique ID."}]},"type":{"type":"intrinsic","name":"string"}},{"name":"label","kind":1024,"comment":{"summary":[{"kind":"text","text":"Localized display name."}]},"type":{"type":"intrinsic","name":"string"}},{"name":"url","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"Web URL."}]},"type":{"type":"intrinsic","name":"string"}}]}}},{"name":"addContactAsync","kind":64,"signatures":[{"name":"addContactAsync","kind":4096,"comment":{"summary":[{"kind":"text","text":"Creates a new contact and adds it to the system.\n> **Note**: For Android users, the Expo Go app does not have the required "},{"kind":"code","text":"`WRITE_CONTACTS`"},{"kind":"text","text":" permission to write to Contacts.\n> You will need to create a [development build](/develop/development-builds/create-a-build/) and add permission in there manually to use this method."}],"blockTags":[{"tag":"@returns","content":[{"kind":"text","text":"A promise that fulfills with ID of the new system contact."}]},{"tag":"@example","content":[{"kind":"code","text":"```js\nconst contact = {\n [Contacts.Fields.FirstName]: 'Bird',\n [Contacts.Fields.LastName]: 'Man',\n [Contacts.Fields.Company]: 'Young Money',\n};\nconst contactId = await Contacts.addContactAsync(contact);\n```"}]}]},"parameters":[{"name":"contact","kind":32768,"comment":{"summary":[{"kind":"text","text":"A contact with the changes you wish to persist. The "},{"kind":"code","text":"`id`"},{"kind":"text","text":" parameter will not be used."}]},"type":{"type":"reference","name":"Contact"}},{"name":"containerId","kind":32768,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"@tag-ios The container that will parent the contact."}]},"type":{"type":"intrinsic","name":"string"}}],"type":{"type":"reference","typeArguments":[{"type":"intrinsic","name":"string"}],"name":"Promise","qualifiedName":"Promise","package":"typescript"}}]},{"name":"addExistingContactToGroupAsync","kind":64,"signatures":[{"name":"addExistingContactToGroupAsync","kind":4096,"comment":{"summary":[{"kind":"text","text":"Add a contact as a member to a group. A contact can be a member of multiple groups."}],"blockTags":[{"tag":"@example","content":[{"kind":"code","text":"```js\nawait Contacts.addExistingContactToGroupAsync(\n '665FDBCFAE55-D614-4A15-8DC6-161A368D',\n '161A368D-D614-4A15-8DC6-665FDBCFAE55'\n);\n```"}]},{"tag":"@platform","content":[{"kind":"text","text":"ios"}]}]},"parameters":[{"name":"contactId","kind":32768,"comment":{"summary":[{"kind":"text","text":"ID of the contact you want to edit."}]},"type":{"type":"intrinsic","name":"string"}},{"name":"groupId","kind":32768,"comment":{"summary":[{"kind":"text","text":"ID for the group you want to add membership to."}]},"type":{"type":"intrinsic","name":"string"}}],"type":{"type":"reference","typeArguments":[{"type":"intrinsic","name":"any"}],"name":"Promise","qualifiedName":"Promise","package":"typescript"}}]},{"name":"addExistingGroupToContainerAsync","kind":64,"signatures":[{"name":"addExistingGroupToContainerAsync","kind":4096,"comment":{"summary":[{"kind":"text","text":"Add a group to a container."}],"blockTags":[{"tag":"@example","content":[{"kind":"code","text":"```js\nawait Contacts.addExistingGroupToContainerAsync(\n '161A368D-D614-4A15-8DC6-665FDBCFAE55',\n '665FDBCFAE55-D614-4A15-8DC6-161A368D'\n);\n```"}]},{"tag":"@platform","content":[{"kind":"text","text":"ios"}]}]},"parameters":[{"name":"groupId","kind":32768,"comment":{"summary":[{"kind":"text","text":"The group you want to target."}]},"type":{"type":"intrinsic","name":"string"}},{"name":"containerId","kind":32768,"comment":{"summary":[{"kind":"text","text":"The container you want to add membership to."}]},"type":{"type":"intrinsic","name":"string"}}],"type":{"type":"reference","typeArguments":[{"type":"intrinsic","name":"any"}],"name":"Promise","qualifiedName":"Promise","package":"typescript"}}]},{"name":"createGroupAsync","kind":64,"signatures":[{"name":"createGroupAsync","kind":4096,"comment":{"summary":[{"kind":"text","text":"Create a group with a name, and add it to a container. If the container is undefined, the default container will be targeted."}],"blockTags":[{"tag":"@returns","content":[{"kind":"text","text":"A promise that fulfills with ID of the new group."}]},{"tag":"@example","content":[{"kind":"code","text":"```js\nconst groupId = await Contacts.createGroupAsync('Sailor Moon');\n```"}]},{"tag":"@platform","content":[{"kind":"text","text":"ios"}]}]},"parameters":[{"name":"name","kind":32768,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"Name of the new group."}]},"type":{"type":"intrinsic","name":"string"}},{"name":"containerId","kind":32768,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"The container you to add membership to."}]},"type":{"type":"intrinsic","name":"string"}}],"type":{"type":"reference","typeArguments":[{"type":"intrinsic","name":"string"}],"name":"Promise","qualifiedName":"Promise","package":"typescript"}}]},{"name":"getContactByIdAsync","kind":64,"signatures":[{"name":"getContactByIdAsync","kind":4096,"comment":{"summary":[{"kind":"text","text":"Used for gathering precise data about a contact. Returns a contact matching the given "},{"kind":"code","text":"`id`"},{"kind":"text","text":"."}],"blockTags":[{"tag":"@returns","content":[{"kind":"text","text":"A promise that fulfills with "},{"kind":"code","text":"`Contact`"},{"kind":"text","text":" object with ID matching the input ID, or "},{"kind":"code","text":"`undefined`"},{"kind":"text","text":" if there is no match."}]},{"tag":"@example","content":[{"kind":"code","text":"```js\nconst contact = await Contacts.getContactByIdAsync('161A368D-D614-4A15-8DC6-665FDBCFAE55');\nif (contact) {\n console.log(contact);\n}\n```"}]}]},"parameters":[{"name":"id","kind":32768,"comment":{"summary":[{"kind":"text","text":"The ID of a system contact."}]},"type":{"type":"intrinsic","name":"string"}},{"name":"fields","kind":32768,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"If specified, the fields defined will be returned. When skipped, all fields will be returned."}]},"type":{"type":"array","elementType":{"type":"reference","name":"FieldType"}}}],"type":{"type":"reference","typeArguments":[{"type":"union","types":[{"type":"reference","name":"Contact"},{"type":"intrinsic","name":"undefined"}]}],"name":"Promise","qualifiedName":"Promise","package":"typescript"}}]},{"name":"getContactsAsync","kind":64,"signatures":[{"name":"getContactsAsync","kind":4096,"comment":{"summary":[{"kind":"text","text":"Return a list of contacts that fit a given criteria. You can get all of the contacts by passing no criteria."}],"blockTags":[{"tag":"@returns","content":[{"kind":"text","text":"A promise that fulfills with "},{"kind":"code","text":"`ContactResponse`"},{"kind":"text","text":" object returned from the query."}]},{"tag":"@example","content":[{"kind":"code","text":"```js\nconst { data } = await Contacts.getContactsAsync({\n fields: [Contacts.Fields.Emails],\n});\n\nif (data.length > 0) {\n const contact = data[0];\n console.log(contact);\n}\n```"}]}]},"parameters":[{"name":"contactQuery","kind":32768,"comment":{"summary":[{"kind":"text","text":"Object used to query contacts."}]},"type":{"type":"reference","name":"ContactQuery"},"defaultValue":"{}"}],"type":{"type":"reference","typeArguments":[{"type":"reference","name":"ContactResponse"}],"name":"Promise","qualifiedName":"Promise","package":"typescript"}}]},{"name":"getContainersAsync","kind":64,"signatures":[{"name":"getContainersAsync","kind":4096,"comment":{"summary":[{"kind":"text","text":"Query a list of system containers."}],"blockTags":[{"tag":"@returns","content":[{"kind":"text","text":"A promise that fulfills with array of containers that fit the query."}]},{"tag":"@example","content":[{"kind":"code","text":"```js\nconst allContainers = await Contacts.getContainersAsync({\n contactId: '665FDBCFAE55-D614-4A15-8DC6-161A368D',\n});\n```"}]},{"tag":"@platform","content":[{"kind":"text","text":"ios"}]}]},"parameters":[{"name":"containerQuery","kind":32768,"comment":{"summary":[{"kind":"text","text":"Information used to gather containers."}]},"type":{"type":"reference","name":"ContainerQuery"}}],"type":{"type":"reference","typeArguments":[{"type":"array","elementType":{"type":"reference","name":"Container"}}],"name":"Promise","qualifiedName":"Promise","package":"typescript"}}]},{"name":"getDefaultContainerIdAsync","kind":64,"signatures":[{"name":"getDefaultContainerIdAsync","kind":4096,"comment":{"summary":[{"kind":"text","text":"Get the default container's ID."}],"blockTags":[{"tag":"@returns","content":[{"kind":"text","text":"A promise that fulfills with default container ID."}]},{"tag":"@example","content":[{"kind":"code","text":"```js\nconst containerId = await Contacts.getDefaultContainerIdAsync();\n```"}]},{"tag":"@platform","content":[{"kind":"text","text":"ios"}]}]},"type":{"type":"reference","typeArguments":[{"type":"intrinsic","name":"string"}],"name":"Promise","qualifiedName":"Promise","package":"typescript"}}]},{"name":"getGroupsAsync","kind":64,"signatures":[{"name":"getGroupsAsync","kind":4096,"comment":{"summary":[{"kind":"text","text":"Query and return a list of system groups."}],"blockTags":[{"tag":"@example","content":[{"kind":"code","text":"```js\nconst groups = await Contacts.getGroupsAsync({ groupName: 'sailor moon' });\nconst allGroups = await Contacts.getGroupsAsync({});\n```"}]},{"tag":"@returns","content":[{"kind":"text","text":"A promise that fulfills with array of groups that fit the query."}]},{"tag":"@platform","content":[{"kind":"text","text":"ios"}]}]},"parameters":[{"name":"groupQuery","kind":32768,"comment":{"summary":[{"kind":"text","text":"Information regarding which groups you want to get."}]},"type":{"type":"reference","name":"GroupQuery"}}],"type":{"type":"reference","typeArguments":[{"type":"array","elementType":{"type":"reference","name":"Group"}}],"name":"Promise","qualifiedName":"Promise","package":"typescript"}}]},{"name":"getPagedContactsAsync","kind":64,"signatures":[{"name":"getPagedContactsAsync","kind":4096,"parameters":[{"name":"contactQuery","kind":32768,"type":{"type":"reference","name":"ContactQuery"},"defaultValue":"{}"}],"type":{"type":"reference","typeArguments":[{"type":"reference","name":"ContactResponse"}],"name":"Promise","qualifiedName":"Promise","package":"typescript"}}]},{"name":"getPermissionsAsync","kind":64,"signatures":[{"name":"getPermissionsAsync","kind":4096,"comment":{"summary":[{"kind":"text","text":"Checks user's permissions for accessing contacts data."}],"blockTags":[{"tag":"@returns","content":[{"kind":"text","text":"A promise that resolves to a [PermissionResponse](#permissionresponse) object."}]}]},"type":{"type":"reference","typeArguments":[{"type":"reference","name":"PermissionResponse"}],"name":"Promise","qualifiedName":"Promise","package":"typescript"}}]},{"name":"isAvailableAsync","kind":64,"signatures":[{"name":"isAvailableAsync","kind":4096,"comment":{"summary":[{"kind":"text","text":"Returns whether the Contacts API is enabled on the current device. This method does not check the app permissions."}],"blockTags":[{"tag":"@returns","content":[{"kind":"text","text":"A promise that fulfills with a "},{"kind":"code","text":"`boolean`"},{"kind":"text","text":", indicating whether the Contacts API is available on the current device. It always resolves to "},{"kind":"code","text":"`false`"},{"kind":"text","text":" on web."}]}]},"type":{"type":"reference","typeArguments":[{"type":"intrinsic","name":"boolean"}],"name":"Promise","qualifiedName":"Promise","package":"typescript"}}]},{"name":"presentFormAsync","kind":64,"signatures":[{"name":"presentFormAsync","kind":4096,"comment":{"summary":[{"kind":"text","text":"Present a native form for manipulating contacts."}],"blockTags":[{"tag":"@example","content":[{"kind":"code","text":"```js\nawait Contacts.presentFormAsync('161A368D-D614-4A15-8DC6-665FDBCFAE55');\n```"}]}]},"parameters":[{"name":"contactId","kind":32768,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"The ID of a system contact."}]},"type":{"type":"union","types":[{"type":"literal","value":null},{"type":"intrinsic","name":"string"}]}},{"name":"contact","kind":32768,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"A contact with the changes you want to persist."}]},"type":{"type":"union","types":[{"type":"literal","value":null},{"type":"reference","name":"Contact"}]}},{"name":"formOptions","kind":32768,"comment":{"summary":[{"kind":"text","text":"Options for the native editor."}]},"type":{"type":"reference","name":"FormOptions"},"defaultValue":"{}"}],"type":{"type":"reference","typeArguments":[{"type":"intrinsic","name":"any"}],"name":"Promise","qualifiedName":"Promise","package":"typescript"}}]},{"name":"removeContactAsync","kind":64,"signatures":[{"name":"removeContactAsync","kind":4096,"comment":{"summary":[{"kind":"text","text":"Delete a contact from the system."}],"blockTags":[{"tag":"@example","content":[{"kind":"code","text":"```js\nawait Contacts.removeContactAsync('161A368D-D614-4A15-8DC6-665FDBCFAE55');\n```"}]},{"tag":"@platform","content":[{"kind":"text","text":"ios"}]}]},"parameters":[{"name":"contactId","kind":32768,"comment":{"summary":[{"kind":"text","text":"ID of the contact you want to delete."}]},"type":{"type":"intrinsic","name":"string"}}],"type":{"type":"reference","typeArguments":[{"type":"intrinsic","name":"any"}],"name":"Promise","qualifiedName":"Promise","package":"typescript"}}]},{"name":"removeContactFromGroupAsync","kind":64,"signatures":[{"name":"removeContactFromGroupAsync","kind":4096,"comment":{"summary":[{"kind":"text","text":"Remove a contact's membership from a given group. This will not delete the contact."}],"blockTags":[{"tag":"@example","content":[{"kind":"code","text":"```js\nawait Contacts.removeContactFromGroupAsync(\n '665FDBCFAE55-D614-4A15-8DC6-161A368D',\n '161A368D-D614-4A15-8DC6-665FDBCFAE55'\n);\n```"}]},{"tag":"@platform","content":[{"kind":"text","text":"ios"}]}]},"parameters":[{"name":"contactId","kind":32768,"comment":{"summary":[{"kind":"text","text":"ID of the contact you want to remove."}]},"type":{"type":"intrinsic","name":"string"}},{"name":"groupId","kind":32768,"comment":{"summary":[{"kind":"text","text":"ID for the group you want to remove membership of."}]},"type":{"type":"intrinsic","name":"string"}}],"type":{"type":"reference","typeArguments":[{"type":"intrinsic","name":"any"}],"name":"Promise","qualifiedName":"Promise","package":"typescript"}}]},{"name":"removeGroupAsync","kind":64,"signatures":[{"name":"removeGroupAsync","kind":4096,"comment":{"summary":[{"kind":"text","text":"Delete a group from the device."}],"blockTags":[{"tag":"@example","content":[{"kind":"code","text":"```js\nawait Contacts.removeGroupAsync('161A368D-D614-4A15-8DC6-665FDBCFAE55');\n```"}]},{"tag":"@platform","content":[{"kind":"text","text":"ios"}]}]},"parameters":[{"name":"groupId","kind":32768,"comment":{"summary":[{"kind":"text","text":"ID of the group you want to remove."}]},"type":{"type":"intrinsic","name":"string"}}],"type":{"type":"reference","typeArguments":[{"type":"intrinsic","name":"any"}],"name":"Promise","qualifiedName":"Promise","package":"typescript"}}]},{"name":"requestPermissionsAsync","kind":64,"signatures":[{"name":"requestPermissionsAsync","kind":4096,"comment":{"summary":[{"kind":"text","text":"Asks the user to grant permissions for accessing contacts data."}],"blockTags":[{"tag":"@returns","content":[{"kind":"text","text":"A promise that resolves to a [PermissionResponse](#permissionresponse) object."}]}]},"type":{"type":"reference","typeArguments":[{"type":"reference","name":"PermissionResponse"}],"name":"Promise","qualifiedName":"Promise","package":"typescript"}}]},{"name":"shareContactAsync","kind":64,"signatures":[{"name":"shareContactAsync","kind":4096,"parameters":[{"name":"contactId","kind":32768,"type":{"type":"intrinsic","name":"string"}},{"name":"message","kind":32768,"type":{"type":"intrinsic","name":"string"}},{"name":"shareOptions","kind":32768,"type":{"type":"intrinsic","name":"object"},"defaultValue":"{}"}],"type":{"type":"reference","typeArguments":[{"type":"intrinsic","name":"any"}],"name":"Promise","qualifiedName":"Promise","package":"typescript"}}]},{"name":"updateContactAsync","kind":64,"signatures":[{"name":"updateContactAsync","kind":4096,"comment":{"summary":[{"kind":"text","text":"Mutate the information of an existing contact. Due to an iOS bug, "},{"kind":"code","text":"`nonGregorianBirthday`"},{"kind":"text","text":" field cannot be modified.\n> **info** On Android, you can use ["},{"kind":"code","text":"`presentFormAsync`"},{"kind":"text","text":"](#contactspresentformasynccontactid-contact-formoptions) to make edits to contacts."}],"blockTags":[{"tag":"@returns","content":[{"kind":"text","text":"A promise that fulfills with ID of the updated system contact if mutation was successful."}]},{"tag":"@example","content":[{"kind":"code","text":"```js\nconst contact = {\n id: '161A368D-D614-4A15-8DC6-665FDBCFAE55',\n [Contacts.Fields.FirstName]: 'Drake',\n [Contacts.Fields.Company]: 'Young Money',\n};\nawait Contacts.updateContactAsync(contact);\n```"}]},{"tag":"@platform","content":[{"kind":"text","text":"ios"}]}]},"parameters":[{"name":"contact","kind":32768,"comment":{"summary":[{"kind":"text","text":"A contact object including the wanted changes."}]},"type":{"type":"reference","name":"Contact"}}],"type":{"type":"reference","typeArguments":[{"type":"intrinsic","name":"string"}],"name":"Promise","qualifiedName":"Promise","package":"typescript"}}]},{"name":"updateGroupNameAsync","kind":64,"signatures":[{"name":"updateGroupNameAsync","kind":4096,"comment":{"summary":[{"kind":"text","text":"Change the name of an existing group."}],"blockTags":[{"tag":"@example","content":[{"kind":"code","text":"```js\nawait Contacts.updateGroupName('Expo Friends', '161A368D-D614-4A15-8DC6-665FDBCFAE55');\n```"}]},{"tag":"@platform","content":[{"kind":"text","text":"ios"}]}]},"parameters":[{"name":"groupName","kind":32768,"comment":{"summary":[{"kind":"text","text":"New name for an existing group."}]},"type":{"type":"intrinsic","name":"string"}},{"name":"groupId","kind":32768,"comment":{"summary":[{"kind":"text","text":"ID of the group you want to edit."}]},"type":{"type":"intrinsic","name":"string"}}],"type":{"type":"reference","typeArguments":[{"type":"intrinsic","name":"any"}],"name":"Promise","qualifiedName":"Promise","package":"typescript"}}]},{"name":"writeContactToFileAsync","kind":64,"signatures":[{"name":"writeContactToFileAsync","kind":4096,"comment":{"summary":[{"kind":"text","text":"Query a set of contacts and write them to a local URI that can be used for sharing."}],"blockTags":[{"tag":"@returns","content":[{"kind":"text","text":"A promise that fulfills with shareable local URI, or "},{"kind":"code","text":"`undefined`"},{"kind":"text","text":" if there was no match."}]},{"tag":"@example","content":[{"kind":"code","text":"```js\nconst localUri = await Contacts.writeContactToFileAsync({\n id: '161A368D-D614-4A15-8DC6-665FDBCFAE55',\n});\nShare.share({ url: localUri, message: 'Call me!' });\n```"}]}]},"parameters":[{"name":"contactQuery","kind":32768,"comment":{"summary":[{"kind":"text","text":"Used to query contact you want to write."}]},"type":{"type":"reference","name":"ContactQuery"},"defaultValue":"{}"}],"type":{"type":"reference","typeArguments":[{"type":"union","types":[{"type":"intrinsic","name":"string"},{"type":"intrinsic","name":"undefined"}]}],"name":"Promise","qualifiedName":"Promise","package":"typescript"}}]}]}
\ No newline at end of file
diff --git a/docs/public/static/data/v49.0.0/expo-crypto.json b/docs/public/static/data/v49.0.0/expo-crypto.json
new file mode 100644
index 0000000000000..48055be8f1606
--- /dev/null
+++ b/docs/public/static/data/v49.0.0/expo-crypto.json
@@ -0,0 +1 @@
+{"name":"expo-crypto","kind":1,"children":[{"name":"CryptoDigestAlgorithm","kind":8,"comment":{"summary":[{"kind":"text","text":"["},{"kind":"code","text":"`Cryptographic hash function`"},{"kind":"text","text":"](https://developer.mozilla.org/en-US/docs/Glossary/Cryptographic_hash_function)"}]},"children":[{"name":"MD2","kind":16,"comment":{"summary":[{"kind":"code","text":"`128`"},{"kind":"text","text":" bits."}],"blockTags":[{"tag":"@platform","content":[{"kind":"text","text":"ios"}]}]},"type":{"type":"literal","value":"MD2"}},{"name":"MD4","kind":16,"comment":{"summary":[{"kind":"code","text":"`128`"},{"kind":"text","text":" bits."}],"blockTags":[{"tag":"@platform","content":[{"kind":"text","text":"ios"}]}]},"type":{"type":"literal","value":"MD4"}},{"name":"MD5","kind":16,"comment":{"summary":[{"kind":"code","text":"`128`"},{"kind":"text","text":" bits."}],"blockTags":[{"tag":"@platform","content":[{"kind":"text","text":"android"}]},{"tag":"@platform","content":[{"kind":"text","text":"ios"}]}]},"type":{"type":"literal","value":"MD5"}},{"name":"SHA1","kind":16,"comment":{"summary":[{"kind":"code","text":"`160`"},{"kind":"text","text":" bits."}]},"type":{"type":"literal","value":"SHA-1"}},{"name":"SHA256","kind":16,"comment":{"summary":[{"kind":"code","text":"`256`"},{"kind":"text","text":" bits. Collision Resistant."}]},"type":{"type":"literal","value":"SHA-256"}},{"name":"SHA384","kind":16,"comment":{"summary":[{"kind":"code","text":"`384`"},{"kind":"text","text":" bits. Collision Resistant."}]},"type":{"type":"literal","value":"SHA-384"}},{"name":"SHA512","kind":16,"comment":{"summary":[{"kind":"code","text":"`512`"},{"kind":"text","text":" bits. Collision Resistant."}]},"type":{"type":"literal","value":"SHA-512"}}]},{"name":"CryptoEncoding","kind":8,"children":[{"name":"BASE64","kind":16,"comment":{"summary":[{"kind":"text","text":"Has trailing padding. Does not wrap lines. Does not have a trailing newline."}]},"type":{"type":"literal","value":"base64"}},{"name":"HEX","kind":16,"type":{"type":"literal","value":"hex"}}]},{"name":"CryptoDigestOptions","kind":4194304,"type":{"type":"reflection","declaration":{"name":"__type","kind":65536,"children":[{"name":"encoding","kind":1024,"comment":{"summary":[{"kind":"text","text":"Format the digest is returned in."}]},"type":{"type":"reference","name":"CryptoEncoding"}}]}}},{"name":"Digest","kind":4194304,"type":{"type":"intrinsic","name":"string"}},{"name":"digest","kind":64,"signatures":[{"name":"digest","kind":4096,"comment":{"summary":[{"kind":"text","text":"The "},{"kind":"code","text":"`digest()`"},{"kind":"text","text":" method of "},{"kind":"code","text":"`Crypto`"},{"kind":"text","text":" generates a digest of the supplied "},{"kind":"code","text":"`TypedArray`"},{"kind":"text","text":" of bytes "},{"kind":"code","text":"`data`"},{"kind":"text","text":" with the provided digest "},{"kind":"code","text":"`algorithm`"},{"kind":"text","text":".\nA digest is a short fixed-length value derived from some variable-length input. **Cryptographic digests** should exhibit _collision-resistance_,\nmeaning that it's very difficult to generate multiple inputs that have equal digest values.\nOn web, this method can only be called from a secure origin (HTTPS) otherwise, an error will be thrown."}],"blockTags":[{"tag":"@returns","content":[{"kind":"text","text":"A Promise which fulfills with an ArrayBuffer representing the hashed input."}]},{"tag":"@example","content":[{"kind":"code","text":"```ts\nconst array = new Uint8Array([1, 2, 3, 4, 5]);\nconst digest = await Crypto.digest(Crypto.CryptoDigestAlgorithm.SHA512, array);\nconsole.log('Your digest: ' + digest);\n```"}]}]},"parameters":[{"name":"algorithm","kind":32768,"comment":{"summary":[{"kind":"text","text":"The cryptographic hash function to use to transform a block of data into a fixed-size output."}]},"type":{"type":"reference","name":"CryptoDigestAlgorithm"}},{"name":"data","kind":32768,"comment":{"summary":[{"kind":"text","text":"The value that will be used to generate a digest."}]},"type":{"type":"reference","name":"BufferSource","qualifiedName":"BufferSource","package":"typescript"}}],"type":{"type":"reference","typeArguments":[{"type":"reference","name":"ArrayBuffer","qualifiedName":"ArrayBuffer","package":"typescript"}],"name":"Promise","qualifiedName":"Promise","package":"typescript"}}]},{"name":"digestStringAsync","kind":64,"signatures":[{"name":"digestStringAsync","kind":4096,"comment":{"summary":[{"kind":"text","text":"The "},{"kind":"code","text":"`digestStringAsync()`"},{"kind":"text","text":" method of "},{"kind":"code","text":"`Crypto`"},{"kind":"text","text":" generates a digest of the supplied "},{"kind":"code","text":"`data`"},{"kind":"text","text":" string with the provided digest "},{"kind":"code","text":"`algorithm`"},{"kind":"text","text":".\nA digest is a short fixed-length value derived from some variable-length input. **Cryptographic digests** should exhibit _collision-resistance_,\nmeaning that it's very difficult to generate multiple inputs that have equal digest values.\nYou can specify the returned string format as one of "},{"kind":"code","text":"`CryptoEncoding`"},{"kind":"text","text":". By default, the resolved value will be formatted as a "},{"kind":"code","text":"`HEX`"},{"kind":"text","text":" string.\nOn web, this method can only be called from a secure origin (HTTPS) otherwise, an error will be thrown."}],"blockTags":[{"tag":"@returns","content":[{"kind":"text","text":"Return a Promise which fulfills with a value representing the hashed input."}]},{"tag":"@example","content":[{"kind":"code","text":"```ts\nconst digest = await Crypto.digestStringAsync(\n Crypto.CryptoDigestAlgorithm.SHA512,\n '🥓 Easy to Digest! 💙'\n);\n```"}]}]},"parameters":[{"name":"algorithm","kind":32768,"comment":{"summary":[{"kind":"text","text":"The cryptographic hash function to use to transform a block of data into a fixed-size output."}]},"type":{"type":"reference","name":"CryptoDigestAlgorithm"}},{"name":"data","kind":32768,"comment":{"summary":[{"kind":"text","text":"The value that will be used to generate a digest."}]},"type":{"type":"intrinsic","name":"string"}},{"name":"options","kind":32768,"comment":{"summary":[{"kind":"text","text":"Format of the digest string. Defaults to: "},{"kind":"code","text":"`CryptoDigestOptions.HEX`"},{"kind":"text","text":"."}]},"type":{"type":"reference","name":"CryptoDigestOptions"},"defaultValue":"..."}],"type":{"type":"reference","typeArguments":[{"type":"reference","name":"Digest"}],"name":"Promise","qualifiedName":"Promise","package":"typescript"}}]},{"name":"getRandomBytes","kind":64,"signatures":[{"name":"getRandomBytes","kind":4096,"comment":{"summary":[{"kind":"text","text":"Generates completely random bytes using native implementations. The "},{"kind":"code","text":"`byteCount`"},{"kind":"text","text":" property\nis a "},{"kind":"code","text":"`number`"},{"kind":"text","text":" indicating the number of bytes to generate in the form of a "},{"kind":"code","text":"`Uint8Array`"},{"kind":"text","text":".\nFalls back to "},{"kind":"code","text":"`Math.random`"},{"kind":"text","text":" during development to prevent issues with React Native Debugger."}],"blockTags":[{"tag":"@returns","content":[{"kind":"text","text":"An array of random bytes with the same length as the "},{"kind":"code","text":"`byteCount`"},{"kind":"text","text":"."}]}]},"parameters":[{"name":"byteCount","kind":32768,"comment":{"summary":[{"kind":"text","text":"A number within the range from "},{"kind":"code","text":"`0`"},{"kind":"text","text":" to "},{"kind":"code","text":"`1024`"},{"kind":"text","text":". Anything else will throw a "},{"kind":"code","text":"`TypeError`"},{"kind":"text","text":"."}]},"type":{"type":"intrinsic","name":"number"}}],"type":{"type":"reference","name":"Uint8Array","qualifiedName":"Uint8Array","package":"typescript"}}]},{"name":"getRandomBytesAsync","kind":64,"signatures":[{"name":"getRandomBytesAsync","kind":4096,"comment":{"summary":[{"kind":"text","text":"Generates completely random bytes using native implementations. The "},{"kind":"code","text":"`byteCount`"},{"kind":"text","text":" property\nis a "},{"kind":"code","text":"`number`"},{"kind":"text","text":" indicating the number of bytes to generate in the form of a "},{"kind":"code","text":"`Uint8Array`"},{"kind":"text","text":"."}],"blockTags":[{"tag":"@returns","content":[{"kind":"text","text":"A promise that fulfills with an array of random bytes with the same length as the "},{"kind":"code","text":"`byteCount`"},{"kind":"text","text":"."}]}]},"parameters":[{"name":"byteCount","kind":32768,"comment":{"summary":[{"kind":"text","text":"A number within the range from "},{"kind":"code","text":"`0`"},{"kind":"text","text":" to "},{"kind":"code","text":"`1024`"},{"kind":"text","text":". Anything else will throw a "},{"kind":"code","text":"`TypeError`"},{"kind":"text","text":"."}]},"type":{"type":"intrinsic","name":"number"}}],"type":{"type":"reference","typeArguments":[{"type":"reference","name":"Uint8Array","qualifiedName":"Uint8Array","package":"typescript"}],"name":"Promise","qualifiedName":"Promise","package":"typescript"}}]},{"name":"getRandomValues","kind":64,"signatures":[{"name":"getRandomValues","kind":4096,"comment":{"summary":[{"kind":"text","text":"The "},{"kind":"code","text":"`getRandomValues()`"},{"kind":"text","text":" method of "},{"kind":"code","text":"`Crypto`"},{"kind":"text","text":" fills a provided "},{"kind":"code","text":"`TypedArray`"},{"kind":"text","text":" with cryptographically secure random values."}],"blockTags":[{"tag":"@returns","content":[{"kind":"text","text":"The input array filled with cryptographically secure random values."}]},{"tag":"@example","content":[{"kind":"code","text":"```ts\nconst byteArray = new Uint8Array(16);\nCrypto.getRandomValues(byteArray);\nconsole.log('Your lucky bytes: ' + byteArray);\n```"}]}]},"typeParameter":[{"name":"T","kind":131072,"type":{"type":"union","types":[{"type":"reference","name":"IntBasedTypedArray"},{"type":"reference","name":"UintBasedTypedArray"}]}}],"parameters":[{"name":"typedArray","kind":32768,"comment":{"summary":[{"kind":"text","text":"An integer based ["},{"kind":"code","text":"`TypedArray`"},{"kind":"text","text":"](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/TypedArray) to fill with cryptographically secure random values. It modifies the input array in place."}]},"type":{"type":"reference","name":"T"}}],"type":{"type":"reference","name":"T"}}]},{"name":"randomUUID","kind":64,"signatures":[{"name":"randomUUID","kind":4096,"comment":{"summary":[{"kind":"text","text":"The "},{"kind":"code","text":"`randomUUID()`"},{"kind":"text","text":" method returns a unique identifier based on the V4 UUID spec (RFC4122).\nIt uses cryptographically secure random values to generate the UUID."}],"blockTags":[{"tag":"@returns","content":[{"kind":"text","text":"A string containing a newly generated UUIDv4 identifier"}]},{"tag":"@example","content":[{"kind":"code","text":"```ts\nconst UUID = Crypto.randomUUID();\nconsole.log('Your UUID: ' + UUID);\n```"}]}]},"type":{"type":"intrinsic","name":"string"}}]}]}
\ No newline at end of file
diff --git a/docs/public/static/data/v49.0.0/expo-device-motion.json b/docs/public/static/data/v49.0.0/expo-device-motion.json
new file mode 100644
index 0000000000000..69026716e83ee
--- /dev/null
+++ b/docs/public/static/data/v49.0.0/expo-device-motion.json
@@ -0,0 +1 @@
+{"name":"expo-device-motion","kind":1,"children":[{"name":"default","kind":32,"type":{"type":"reference","name":"DeviceMotionSensor"}},{"name":"default","kind":128,"comment":{"summary":[{"kind":"text","text":"A base class for subscribable sensors. The events emitted by this class are measurements\nspecified by the parameter type "},{"kind":"code","text":"`Measurement`"},{"kind":"text","text":"."}]},"children":[{"name":"constructor","kind":512,"signatures":[{"name":"new default","kind":16384,"typeParameter":[{"name":"Measurement","kind":131072}],"parameters":[{"name":"nativeSensorModule","kind":32768,"type":{"type":"intrinsic","name":"any"}},{"name":"nativeEventName","kind":32768,"type":{"type":"intrinsic","name":"string"}}],"type":{"type":"reference","typeArguments":[{"type":"reference","name":"Measurement"}],"name":"default"}}]},{"name":"_listenerCount","kind":1024,"type":{"type":"intrinsic","name":"number"}},{"name":"_nativeEmitter","kind":1024,"type":{"type":"reference","name":"EventEmitter"}},{"name":"_nativeEventName","kind":1024,"type":{"type":"intrinsic","name":"string"}},{"name":"_nativeModule","kind":1024,"type":{"type":"intrinsic","name":"any"}},{"name":"addListener","kind":2048,"signatures":[{"name":"addListener","kind":4096,"parameters":[{"name":"listener","kind":32768,"type":{"type":"reference","typeArguments":[{"type":"reference","name":"Measurement"}],"name":"Listener"}}],"type":{"type":"reference","name":"Subscription"}}]},{"name":"getListenerCount","kind":2048,"signatures":[{"name":"getListenerCount","kind":4096,"comment":{"summary":[{"kind":"text","text":"Returns the registered listeners count."}]},"type":{"type":"intrinsic","name":"number"}}]},{"name":"getPermissionsAsync","kind":2048,"signatures":[{"name":"getPermissionsAsync","kind":4096,"comment":{"summary":[{"kind":"text","text":"Checks user's permissions for accessing sensor."}]},"type":{"type":"reference","typeArguments":[{"type":"reference","name":"PermissionResponse"}],"name":"Promise","qualifiedName":"Promise","package":"typescript"}}]},{"name":"hasListeners","kind":2048,"signatures":[{"name":"hasListeners","kind":4096,"comment":{"summary":[{"kind":"text","text":"Returns boolean which signifies if sensor has any listeners registered."}]},"type":{"type":"intrinsic","name":"boolean"}}]},{"name":"isAvailableAsync","kind":2048,"signatures":[{"name":"isAvailableAsync","kind":4096,"comment":{"summary":[{"kind":"text","text":"> **info** You should always check the sensor availability before attempting to use it."}],"blockTags":[{"tag":"@returns","content":[{"kind":"text","text":"A promise that resolves to a "},{"kind":"code","text":"`boolean`"},{"kind":"text","text":" denoting the availability of the sensor."}]}]},"type":{"type":"reference","typeArguments":[{"type":"intrinsic","name":"boolean"}],"name":"Promise","qualifiedName":"Promise","package":"typescript"}}]},{"name":"removeAllListeners","kind":2048,"signatures":[{"name":"removeAllListeners","kind":4096,"comment":{"summary":[{"kind":"text","text":"Removes all registered listeners."}]},"type":{"type":"intrinsic","name":"void"}}]},{"name":"removeSubscription","kind":2048,"signatures":[{"name":"removeSubscription","kind":4096,"comment":{"summary":[{"kind":"text","text":"Removes the given subscription."}]},"parameters":[{"name":"subscription","kind":32768,"comment":{"summary":[{"kind":"text","text":"A subscription to remove."}]},"type":{"type":"reference","name":"Subscription"}}],"type":{"type":"intrinsic","name":"void"}}]},{"name":"requestPermissionsAsync","kind":2048,"signatures":[{"name":"requestPermissionsAsync","kind":4096,"comment":{"summary":[{"kind":"text","text":"Asks the user to grant permissions for accessing sensor."}]},"type":{"type":"reference","typeArguments":[{"type":"reference","name":"PermissionResponse"}],"name":"Promise","qualifiedName":"Promise","package":"typescript"}}]},{"name":"setUpdateInterval","kind":2048,"signatures":[{"name":"setUpdateInterval","kind":4096,"comment":{"summary":[{"kind":"text","text":"Set the sensor update interval."}]},"parameters":[{"name":"intervalMs","kind":32768,"comment":{"summary":[{"kind":"text","text":"Desired interval in milliseconds between sensor updates.\n> Starting from Android 12 (API level 31), the system has a 200ms limit for each sensor updates.\n>\n> If you need an update interval less than 200ms, you should:\n> * add "},{"kind":"code","text":"`android.permission.HIGH_SAMPLING_RATE_SENSORS`"},{"kind":"text","text":" to [**app.json** "},{"kind":"code","text":"`permissions`"},{"kind":"text","text":" field](/versions/latest/config/app/#permissions)\n> * or if you are using bare workflow, add "},{"kind":"code","text":"``"},{"kind":"text","text":" to **AndroidManifest.xml**."}]},"type":{"type":"intrinsic","name":"number"}}],"type":{"type":"intrinsic","name":"void"}}]}],"typeParameters":[{"name":"Measurement","kind":131072}],"extendedBy":[{"type":"reference","name":"DeviceMotionSensor"}]},{"name":"DeviceMotionMeasurement","kind":4194304,"type":{"type":"reflection","declaration":{"name":"__type","kind":65536,"children":[{"name":"acceleration","kind":1024,"comment":{"summary":[{"kind":"text","text":"Device acceleration on the three axis as an object with "},{"kind":"code","text":"`x`"},{"kind":"text","text":", "},{"kind":"code","text":"`y`"},{"kind":"text","text":", "},{"kind":"code","text":"`z`"},{"kind":"text","text":" keys. Expressed in meters per second squared (m/s^2)."}]},"type":{"type":"union","types":[{"type":"literal","value":null},{"type":"reflection","declaration":{"name":"__type","kind":65536,"children":[{"name":"x","kind":1024,"type":{"type":"intrinsic","name":"number"}},{"name":"y","kind":1024,"type":{"type":"intrinsic","name":"number"}},{"name":"z","kind":1024,"type":{"type":"intrinsic","name":"number"}}]}}]}},{"name":"accelerationIncludingGravity","kind":1024,"comment":{"summary":[{"kind":"text","text":"Device acceleration with the effect of gravity on the three axis as an object with "},{"kind":"code","text":"`x`"},{"kind":"text","text":", "},{"kind":"code","text":"`y`"},{"kind":"text","text":", "},{"kind":"code","text":"`z`"},{"kind":"text","text":" keys. Expressed in meters per second squared (m/s^2)."}]},"type":{"type":"reflection","declaration":{"name":"__type","kind":65536,"children":[{"name":"x","kind":1024,"type":{"type":"intrinsic","name":"number"}},{"name":"y","kind":1024,"type":{"type":"intrinsic","name":"number"}},{"name":"z","kind":1024,"type":{"type":"intrinsic","name":"number"}}]}}},{"name":"interval","kind":1024,"comment":{"summary":[{"kind":"text","text":"Interval at which data is obtained from the native platform. Expressed in **milliseconds** (ms)."}]},"type":{"type":"intrinsic","name":"number"}},{"name":"orientation","kind":1024,"comment":{"summary":[{"kind":"text","text":"Device orientation based on screen rotation. Value is one of:\n- "},{"kind":"code","text":"`0`"},{"kind":"text","text":" (portrait),\n- "},{"kind":"code","text":"`90`"},{"kind":"text","text":" (right landscape),\n- "},{"kind":"code","text":"`180`"},{"kind":"text","text":" (upside down),\n- "},{"kind":"code","text":"`-90`"},{"kind":"text","text":" (left landscape)."}]},"type":{"type":"reference","name":"DeviceMotionOrientation"}},{"name":"rotation","kind":1024,"comment":{"summary":[{"kind":"text","text":"Device's orientation in space as an object with alpha, beta, gamma keys where alpha is for rotation around Z axis, beta for X axis rotation and gamma for Y axis rotation."}]},"type":{"type":"reflection","declaration":{"name":"__type","kind":65536,"children":[{"name":"alpha","kind":1024,"type":{"type":"intrinsic","name":"number"}},{"name":"beta","kind":1024,"type":{"type":"intrinsic","name":"number"}},{"name":"gamma","kind":1024,"type":{"type":"intrinsic","name":"number"}}]}}},{"name":"rotationRate","kind":1024,"comment":{"summary":[{"kind":"text","text":"Device's rate of rotation in space expressed in degrees per second (deg/s)."}]},"type":{"type":"union","types":[{"type":"literal","value":null},{"type":"reflection","declaration":{"name":"__type","kind":65536,"children":[{"name":"alpha","kind":1024,"comment":{"summary":[{"kind":"text","text":"Rotation in X axis."}]},"type":{"type":"intrinsic","name":"number"}},{"name":"beta","kind":1024,"comment":{"summary":[{"kind":"text","text":"Rotation in Y axis."}]},"type":{"type":"intrinsic","name":"number"}},{"name":"gamma","kind":1024,"comment":{"summary":[{"kind":"text","text":"Rotation in Z axis."}]},"type":{"type":"intrinsic","name":"number"}}]}}]}}]}}},{"name":"DeviceMotionOrientation","kind":8,"children":[{"name":"LeftLandscape","kind":16,"type":{"type":"literal","value":-90}},{"name":"Portrait","kind":16,"type":{"type":"literal","value":0}},{"name":"RightLandscape","kind":16,"type":{"type":"literal","value":90}},{"name":"UpsideDown","kind":16,"type":{"type":"literal","value":180}}]},{"name":"DeviceMotionSensor","kind":128,"comment":{"summary":[{"kind":"text","text":"A base class for subscribable sensors. The events emitted by this class are measurements\nspecified by the parameter type "},{"kind":"code","text":"`Measurement`"},{"kind":"text","text":"."}]},"children":[{"name":"constructor","kind":512,"signatures":[{"name":"new DeviceMotionSensor","kind":16384,"parameters":[{"name":"nativeSensorModule","kind":32768,"type":{"type":"intrinsic","name":"any"}},{"name":"nativeEventName","kind":32768,"type":{"type":"intrinsic","name":"string"}}],"type":{"type":"reference","name":"DeviceMotionSensor"},"inheritedFrom":{"type":"reference","name":"default.constructor"}}],"inheritedFrom":{"type":"reference","name":"default.constructor"}},{"name":"Gravity","kind":1024,"comment":{"summary":[{"kind":"text","text":"Constant value representing standard gravitational acceleration for Earth ("},{"kind":"code","text":"`9.80665`"},{"kind":"text","text":" m/s^2)."}]},"type":{"type":"intrinsic","name":"number"},"defaultValue":"ExponentDeviceMotion.Gravity"},{"name":"_listenerCount","kind":1024,"type":{"type":"intrinsic","name":"number"},"inheritedFrom":{"type":"reference","name":"default._listenerCount"}},{"name":"_nativeEmitter","kind":1024,"type":{"type":"reference","name":"EventEmitter"},"inheritedFrom":{"type":"reference","name":"default._nativeEmitter"}},{"name":"_nativeEventName","kind":1024,"type":{"type":"intrinsic","name":"string"},"inheritedFrom":{"type":"reference","name":"default._nativeEventName"}},{"name":"_nativeModule","kind":1024,"type":{"type":"intrinsic","name":"any"},"inheritedFrom":{"type":"reference","name":"default._nativeModule"}},{"name":"addListener","kind":2048,"signatures":[{"name":"addListener","kind":4096,"comment":{"summary":[{"kind":"text","text":"Subscribe for updates to the device motion sensor."}],"blockTags":[{"tag":"@returns","content":[{"kind":"text","text":"A subscription that you can call "},{"kind":"code","text":"`remove()`"},{"kind":"text","text":" on when you would like to unsubscribe the listener."}]}]},"parameters":[{"name":"listener","kind":32768,"comment":{"summary":[{"kind":"text","text":"A callback that is invoked when a device motion sensor update is available. When invoked,\nthe listener is provided a single argument that is a "},{"kind":"code","text":"`DeviceMotionMeasurement`"},{"kind":"text","text":" object."}]},"type":{"type":"reference","typeArguments":[{"type":"reference","name":"DeviceMotionMeasurement"}],"name":"Listener"}}],"type":{"type":"reference","name":"Subscription"},"overwrites":{"type":"reference","name":"default.addListener"}}],"overwrites":{"type":"reference","name":"default.addListener"}},{"name":"getListenerCount","kind":2048,"signatures":[{"name":"getListenerCount","kind":4096,"comment":{"summary":[{"kind":"text","text":"Returns the registered listeners count."}]},"type":{"type":"intrinsic","name":"number"},"inheritedFrom":{"type":"reference","name":"default.getListenerCount"}}],"inheritedFrom":{"type":"reference","name":"default.getListenerCount"}},{"name":"getPermissionsAsync","kind":2048,"signatures":[{"name":"getPermissionsAsync","kind":4096,"comment":{"summary":[{"kind":"text","text":"Checks user's permissions for accessing sensor."}]},"type":{"type":"reference","typeArguments":[{"type":"reference","name":"PermissionResponse"}],"name":"Promise","qualifiedName":"Promise","package":"typescript"},"inheritedFrom":{"type":"reference","name":"default.getPermissionsAsync"}}],"inheritedFrom":{"type":"reference","name":"default.getPermissionsAsync"}},{"name":"hasListeners","kind":2048,"signatures":[{"name":"hasListeners","kind":4096,"comment":{"summary":[{"kind":"text","text":"Returns boolean which signifies if sensor has any listeners registered."}]},"type":{"type":"intrinsic","name":"boolean"},"inheritedFrom":{"type":"reference","name":"default.hasListeners"}}],"inheritedFrom":{"type":"reference","name":"default.hasListeners"}},{"name":"isAvailableAsync","kind":2048,"signatures":[{"name":"isAvailableAsync","kind":4096,"comment":{"summary":[{"kind":"text","text":"> **info** You should always check the sensor availability before attempting to use it.\n\nReturns whether the accelerometer is enabled on the device.\n\nOn mobile web, you must first invoke "},{"kind":"code","text":"`DeviceMotion.requestPermissionsAsync()`"},{"kind":"text","text":" in a user interaction (i.e. touch event) before you can use this module.\nIf the "},{"kind":"code","text":"`status`"},{"kind":"text","text":" is not equal to "},{"kind":"code","text":"`granted`"},{"kind":"text","text":" then you should inform the end user that they may have to open settings.\n\nOn **web** this starts a timer and waits to see if an event is fired. This should predict if the iOS device has the **device orientation** API disabled in\n**Settings > Safari > Motion & Orientation Access**. Some devices will also not fire if the site isn't hosted with **HTTPS** as "},{"kind":"code","text":"`DeviceMotion`"},{"kind":"text","text":" is now considered a secure API.\nThere is no formal API for detecting the status of "},{"kind":"code","text":"`DeviceMotion`"},{"kind":"text","text":" so this API can sometimes be unreliable on web."}],"blockTags":[{"tag":"@returns","content":[{"kind":"text","text":"A promise that resolves to a "},{"kind":"code","text":"`boolean`"},{"kind":"text","text":" denoting the availability of device motion sensor."}]}]},"type":{"type":"reference","typeArguments":[{"type":"intrinsic","name":"boolean"}],"name":"Promise","qualifiedName":"Promise","package":"typescript"},"overwrites":{"type":"reference","name":"default.isAvailableAsync"}}],"overwrites":{"type":"reference","name":"default.isAvailableAsync"}},{"name":"removeAllListeners","kind":2048,"signatures":[{"name":"removeAllListeners","kind":4096,"comment":{"summary":[{"kind":"text","text":"Removes all registered listeners."}]},"type":{"type":"intrinsic","name":"void"},"inheritedFrom":{"type":"reference","name":"default.removeAllListeners"}}],"inheritedFrom":{"type":"reference","name":"default.removeAllListeners"}},{"name":"removeSubscription","kind":2048,"signatures":[{"name":"removeSubscription","kind":4096,"comment":{"summary":[{"kind":"text","text":"Removes the given subscription."}]},"parameters":[{"name":"subscription","kind":32768,"comment":{"summary":[{"kind":"text","text":"A subscription to remove."}]},"type":{"type":"reference","name":"Subscription"}}],"type":{"type":"intrinsic","name":"void"},"inheritedFrom":{"type":"reference","name":"default.removeSubscription"}}],"inheritedFrom":{"type":"reference","name":"default.removeSubscription"}},{"name":"requestPermissionsAsync","kind":2048,"signatures":[{"name":"requestPermissionsAsync","kind":4096,"comment":{"summary":[{"kind":"text","text":"Asks the user to grant permissions for accessing sensor."}]},"type":{"type":"reference","typeArguments":[{"type":"reference","name":"PermissionResponse"}],"name":"Promise","qualifiedName":"Promise","package":"typescript"},"inheritedFrom":{"type":"reference","name":"default.requestPermissionsAsync"}}],"inheritedFrom":{"type":"reference","name":"default.requestPermissionsAsync"}},{"name":"setUpdateInterval","kind":2048,"signatures":[{"name":"setUpdateInterval","kind":4096,"comment":{"summary":[{"kind":"text","text":"Set the sensor update interval."}]},"parameters":[{"name":"intervalMs","kind":32768,"comment":{"summary":[{"kind":"text","text":"Desired interval in milliseconds between sensor updates.\n> Starting from Android 12 (API level 31), the system has a 200ms limit for each sensor updates.\n>\n> If you need an update interval less than 200ms, you should:\n> * add "},{"kind":"code","text":"`android.permission.HIGH_SAMPLING_RATE_SENSORS`"},{"kind":"text","text":" to [**app.json** "},{"kind":"code","text":"`permissions`"},{"kind":"text","text":" field](/versions/latest/config/app/#permissions)\n> * or if you are using bare workflow, add "},{"kind":"code","text":"``"},{"kind":"text","text":" to **AndroidManifest.xml**."}]},"type":{"type":"intrinsic","name":"number"}}],"type":{"type":"intrinsic","name":"void"},"inheritedFrom":{"type":"reference","name":"default.setUpdateInterval"}}],"inheritedFrom":{"type":"reference","name":"default.setUpdateInterval"}}],"extendedTypes":[{"type":"reference","typeArguments":[{"type":"reference","name":"DeviceMotionMeasurement"}],"name":"default"}]},{"name":"Gravity","kind":32,"flags":{"isConst":true},"comment":{"summary":[{"kind":"text","text":"Constant value representing standard gravitational acceleration for Earth ("},{"kind":"code","text":"`9.80665`"},{"kind":"text","text":" m/s^2)."}]},"type":{"type":"intrinsic","name":"number"},"defaultValue":"ExponentDeviceMotion.Gravity"},{"name":"PermissionExpiration","kind":4194304,"comment":{"summary":[{"kind":"text","text":"Permission expiration time. Currently, all permissions are granted permanently."}]},"type":{"type":"union","types":[{"type":"literal","value":"never"},{"type":"intrinsic","name":"number"}]}},{"name":"PermissionResponse","kind":256,"comment":{"summary":[{"kind":"text","text":"An object obtained by permissions get and request functions."}]},"children":[{"name":"canAskAgain","kind":1024,"comment":{"summary":[{"kind":"text","text":"Indicates if user can be asked again for specific permission.\nIf not, one should be directed to the Settings app\nin order to enable/disable the permission."}]},"type":{"type":"intrinsic","name":"boolean"}},{"name":"expires","kind":1024,"comment":{"summary":[{"kind":"text","text":"Determines time when the permission expires."}]},"type":{"type":"reference","name":"PermissionExpiration"}},{"name":"granted","kind":1024,"comment":{"summary":[{"kind":"text","text":"A convenience boolean that indicates if the permission is granted."}]},"type":{"type":"intrinsic","name":"boolean"}},{"name":"status","kind":1024,"comment":{"summary":[{"kind":"text","text":"Determines the status of the permission."}]},"type":{"type":"reference","name":"PermissionStatus"}}]},{"name":"PermissionStatus","kind":8,"children":[{"name":"DENIED","kind":16,"comment":{"summary":[{"kind":"text","text":"User has denied the permission."}]},"type":{"type":"literal","value":"denied"}},{"name":"GRANTED","kind":16,"comment":{"summary":[{"kind":"text","text":"User has granted the permission."}]},"type":{"type":"literal","value":"granted"}},{"name":"UNDETERMINED","kind":16,"comment":{"summary":[{"kind":"text","text":"User hasn't granted or denied the permission yet."}]},"type":{"type":"literal","value":"undetermined"}}]},{"name":"Subscription","kind":4194304,"type":{"type":"reflection","declaration":{"name":"__type","kind":65536,"children":[{"name":"remove","kind":1024,"type":{"type":"reflection","declaration":{"name":"__type","kind":65536,"signatures":[{"name":"__type","kind":4096,"comment":{"summary":[{"kind":"text","text":"A method to unsubscribe the listener."}]},"type":{"type":"intrinsic","name":"void"}}]}}}]}}}]}
\ No newline at end of file
diff --git a/docs/public/static/data/v49.0.0/expo-device.json b/docs/public/static/data/v49.0.0/expo-device.json
new file mode 100644
index 0000000000000..b503359136872
--- /dev/null
+++ b/docs/public/static/data/v49.0.0/expo-device.json
@@ -0,0 +1 @@
+{"name":"expo-device","kind":1,"children":[{"name":"DeviceType","kind":8,"comment":{"summary":[{"kind":"text","text":"An enum representing the different types of devices supported by Expo."}]},"children":[{"name":"DESKTOP","kind":16,"comment":{"summary":[{"kind":"text","text":"Desktop or laptop computers, typically with a keyboard and mouse."}]},"type":{"type":"literal","value":3}},{"name":"PHONE","kind":16,"comment":{"summary":[{"kind":"text","text":"Mobile phone handsets, typically with a touch screen and held in one hand."}]},"type":{"type":"literal","value":1}},{"name":"TABLET","kind":16,"comment":{"summary":[{"kind":"text","text":"Tablet computers, typically with a touch screen that is larger than a usual phone."}]},"type":{"type":"literal","value":2}},{"name":"TV","kind":16,"comment":{"summary":[{"kind":"text","text":"Device with TV-based interfaces."}]},"type":{"type":"literal","value":4}},{"name":"UNKNOWN","kind":16,"comment":{"summary":[{"kind":"text","text":"An unrecognized device type."}]},"type":{"type":"literal","value":0}}]},{"name":"brand","kind":32,"flags":{"isConst":true},"comment":{"summary":[{"kind":"text","text":"The device brand. The consumer-visible brand of the product/hardware. On web, this value is always "},{"kind":"code","text":"`null`"},{"kind":"text","text":"."}],"blockTags":[{"tag":"@example","content":[{"kind":"code","text":"```js\nDevice.brand; // Android: \"google\", \"xiaomi\"; iOS: \"Apple\"; web: null\n```"}]},{"tag":"@platform","content":[{"kind":"text","text":"android"}]},{"tag":"@platform","content":[{"kind":"text","text":"ios"}]}]},"type":{"type":"union","types":[{"type":"intrinsic","name":"string"},{"type":"literal","value":null}]},"defaultValue":"..."},{"name":"designName","kind":32,"flags":{"isConst":true},"comment":{"summary":[{"kind":"text","text":"The specific configuration or name of the industrial design. It represents the device's name when it was designed during manufacturing into mass production.\nOn Android, it corresponds to ["},{"kind":"code","text":"`Build.DEVICE`"},{"kind":"text","text":"](https://developer.android.com/reference/android/os/Build#DEVICE). On web and iOS, this value is always "},{"kind":"code","text":"`null`"},{"kind":"text","text":"."}],"blockTags":[{"tag":"@example","content":[{"kind":"code","text":"```js\nDevice.designName; // Android: \"kminilte\"; iOS: null; web: null\n```"}]},{"tag":"@platform","content":[{"kind":"text","text":"android"}]}]},"type":{"type":"union","types":[{"type":"intrinsic","name":"string"},{"type":"literal","value":null}]},"defaultValue":"..."},{"name":"deviceName","kind":32,"flags":{"isConst":true},"comment":{"summary":[{"kind":"text","text":"The human-readable name of the device, which may be set by the device's user. If the device name is unavailable, particularly on web, this value is "},{"kind":"code","text":"`null`"},{"kind":"text","text":".\n\n> On iOS 16 and newer, this value will be set to generic \"iPhone\" until you add the correct entitlement, see [iOS Capabilities page](/build-reference/ios-capabilities)\n> to learn how to add one and check out [Apple documentation](https://developer.apple.com/documentation/uikit/uidevice/1620015-name#discussion)\n> for more details on this change."}],"blockTags":[{"tag":"@example","content":[{"kind":"code","text":"```js\nDevice.deviceName; // \"Vivian's iPhone XS\"\n```"}]}]},"type":{"type":"union","types":[{"type":"intrinsic","name":"string"},{"type":"literal","value":null}]},"defaultValue":"..."},{"name":"deviceType","kind":32,"flags":{"isConst":true},"comment":{"summary":[{"kind":"text","text":"The type of the device as a ["},{"kind":"code","text":"`DeviceType`"},{"kind":"text","text":"](#devicetype) enum value.\n\nOn Android, for devices other than TVs, the device type is determined by the screen resolution (screen diagonal size), so the result may not be completely accurate.\nIf the screen diagonal length is between 3\" and 6.9\", the method returns "},{"kind":"code","text":"`DeviceType.PHONE`"},{"kind":"text","text":". For lengths between 7\" and 18\", the method returns "},{"kind":"code","text":"`DeviceType.TABLET`"},{"kind":"text","text":".\nOtherwise, the method returns "},{"kind":"code","text":"`DeviceType.UNKNOWN`"},{"kind":"text","text":"."}],"blockTags":[{"tag":"@example","content":[{"kind":"code","text":"```js\nDevice.deviceType; // UNKNOWN, PHONE, TABLET, TV, DESKTOP\n```"}]}]},"type":{"type":"union","types":[{"type":"reference","name":"DeviceType"},{"type":"literal","value":null}]},"defaultValue":"..."},{"name":"deviceYearClass","kind":32,"flags":{"isConst":true},"comment":{"summary":[{"kind":"text","text":"The [device year class](https://github.com/facebook/device-year-class) of this device. On web, this value is always "},{"kind":"code","text":"`null`"},{"kind":"text","text":"."}]},"type":{"type":"union","types":[{"type":"intrinsic","name":"number"},{"type":"literal","value":null}]},"defaultValue":"..."},{"name":"isDevice","kind":32,"flags":{"isConst":true},"comment":{"summary":[{"kind":"code","text":"`true`"},{"kind":"text","text":" if the app is running on a real device and "},{"kind":"code","text":"`false`"},{"kind":"text","text":" if running in a simulator or emulator.\nOn web, this is always set to "},{"kind":"code","text":"`true`"},{"kind":"text","text":"."}]},"type":{"type":"intrinsic","name":"boolean"},"defaultValue":"..."},{"name":"manufacturer","kind":32,"flags":{"isConst":true},"comment":{"summary":[{"kind":"text","text":"The actual device manufacturer of the product or hardware. This value of this field may be "},{"kind":"code","text":"`null`"},{"kind":"text","text":" if it cannot be determined.\n\nTo view difference between "},{"kind":"code","text":"`brand`"},{"kind":"text","text":" and "},{"kind":"code","text":"`manufacturer`"},{"kind":"text","text":" on Android see [official documentation](https://developer.android.com/reference/android/os/Build)."}],"blockTags":[{"tag":"@example","content":[{"kind":"code","text":"```js\nDevice.manufacturer; // Android: \"Google\", \"xiaomi\"; iOS: \"Apple\"; web: \"Google\", null\n```"}]}]},"type":{"type":"union","types":[{"type":"intrinsic","name":"string"},{"type":"literal","value":null}]},"defaultValue":"..."},{"name":"modelId","kind":32,"flags":{"isConst":true},"comment":{"summary":[{"kind":"text","text":"The internal model ID of the device. This is useful for programmatically identifying the type of device and is not a human-friendly string.\nOn web and Android, this value is always "},{"kind":"code","text":"`null`"},{"kind":"text","text":"."}],"blockTags":[{"tag":"@example","content":[{"kind":"code","text":"```js\nDevice.modelId; // iOS: \"iPhone7,2\"; Android: null; web: null\n```"}]},{"tag":"@platform","content":[{"kind":"text","text":"ios"}]}]},"type":{"type":"intrinsic","name":"any"},"defaultValue":"..."},{"name":"modelName","kind":32,"flags":{"isConst":true},"comment":{"summary":[{"kind":"text","text":"The human-friendly name of the device model. This is the name that people would typically use to refer to the device rather than a programmatic model identifier.\nThis value of this field may be "},{"kind":"code","text":"`null`"},{"kind":"text","text":" if it cannot be determined."}],"blockTags":[{"tag":"@example","content":[{"kind":"code","text":"```js\nDevice.modelName; // Android: \"Pixel 2\"; iOS: \"iPhone XS Max\"; web: \"iPhone\", null\n```"}]}]},"type":{"type":"union","types":[{"type":"intrinsic","name":"string"},{"type":"literal","value":null}]},"defaultValue":"..."},{"name":"osBuildFingerprint","kind":32,"flags":{"isConst":true},"comment":{"summary":[{"kind":"text","text":"A string that uniquely identifies the build of the currently running system OS. On Android, it follows this template:\n- "},{"kind":"code","text":"`$(BRAND)/$(PRODUCT)/$(DEVICE)/$(BOARD):$(VERSION.RELEASE)/$(ID)/$(VERSION.INCREMENTAL):$(TYPE)/\\$(TAGS)`"},{"kind":"text","text":"\nOn web and iOS, this value is always "},{"kind":"code","text":"`null`"},{"kind":"text","text":"."}],"blockTags":[{"tag":"@example","content":[{"kind":"code","text":"```js\nDevice.osBuildFingerprint;\n// Android: \"google/sdk_gphone_x86/generic_x86:9/PSR1.180720.075/5124027:user/release-keys\";\n// iOS: null; web: null\n```"}]},{"tag":"@platform","content":[{"kind":"text","text":"android"}]}]},"type":{"type":"union","types":[{"type":"intrinsic","name":"string"},{"type":"literal","value":null}]},"defaultValue":"..."},{"name":"osBuildId","kind":32,"flags":{"isConst":true},"comment":{"summary":[{"kind":"text","text":"The build ID of the OS that more precisely identifies the version of the OS. On Android, this corresponds to "},{"kind":"code","text":"`Build.DISPLAY`"},{"kind":"text","text":" (not "},{"kind":"code","text":"`Build.ID`"},{"kind":"text","text":")\nand currently is a string as described [here](https://source.android.com/setup/start/build-numbers). On iOS, this corresponds to "},{"kind":"code","text":"`kern.osversion`"},{"kind":"text","text":"\nand is the detailed OS version sometimes displayed next to the more human-readable version. On web, this value is always "},{"kind":"code","text":"`null`"},{"kind":"text","text":"."}],"blockTags":[{"tag":"@example","content":[{"kind":"code","text":"```js\nDevice.osBuildId; // Android: \"PSR1.180720.075\"; iOS: \"16F203\"; web: null\n```"}]}]},"type":{"type":"union","types":[{"type":"intrinsic","name":"string"},{"type":"literal","value":null}]},"defaultValue":"..."},{"name":"osInternalBuildId","kind":32,"flags":{"isConst":true},"comment":{"summary":[{"kind":"text","text":"The internal build ID of the OS running on the device. On Android, this corresponds to "},{"kind":"code","text":"`Build.ID`"},{"kind":"text","text":".\nOn iOS, this is the same value as ["},{"kind":"code","text":"`Device.osBuildId`"},{"kind":"text","text":"](#deviceosbuildid). On web, this value is always "},{"kind":"code","text":"`null`"},{"kind":"text","text":"."}],"blockTags":[{"tag":"@example","content":[{"kind":"code","text":"```js\nDevice.osInternalBuildId; // Android: \"MMB29K\"; iOS: \"16F203\"; web: null,\n```"}]}]},"type":{"type":"union","types":[{"type":"intrinsic","name":"string"},{"type":"literal","value":null}]},"defaultValue":"..."},{"name":"osName","kind":32,"flags":{"isConst":true},"comment":{"summary":[{"kind":"text","text":"The name of the OS running on the device."}],"blockTags":[{"tag":"@example","content":[{"kind":"code","text":"```js\nDevice.osName; // Android: \"Android\"; iOS: \"iOS\" or \"iPadOS\"; web: \"iOS\", \"Android\", \"Windows\"\n```"}]}]},"type":{"type":"union","types":[{"type":"intrinsic","name":"string"},{"type":"literal","value":null}]},"defaultValue":"..."},{"name":"osVersion","kind":32,"flags":{"isConst":true},"comment":{"summary":[{"kind":"text","text":"The human-readable OS version string. Note that the version string may not always contain three numbers separated by dots."}],"blockTags":[{"tag":"@example","content":[{"kind":"code","text":"```js\nDevice.osVersion; // Android: \"4.0.3\"; iOS: \"12.3.1\"; web: \"11.0\", \"8.1.0\"\n```"}]}]},"type":{"type":"union","types":[{"type":"intrinsic","name":"string"},{"type":"literal","value":null}]},"defaultValue":"..."},{"name":"platformApiLevel","kind":32,"flags":{"isConst":true},"comment":{"summary":[{"kind":"text","text":"The Android SDK version of the software currently running on this hardware device. This value never changes while a device is booted,\nbut it may increase when the hardware manufacturer provides an OS update. See [here](https://developer.android.com/reference/android/os/Build.VERSION_CODES.html)\nto see all possible version codes and corresponding versions. On iOS and web, this value is always "},{"kind":"code","text":"`null`"},{"kind":"text","text":"."}],"blockTags":[{"tag":"@example","content":[{"kind":"code","text":"```js\nDevice.platformApiLevel; // Android: 19; iOS: null; web: null\n```"}]},{"tag":"@platform","content":[{"kind":"text","text":"android"}]}]},"type":{"type":"union","types":[{"type":"intrinsic","name":"number"},{"type":"literal","value":null}]},"defaultValue":"..."},{"name":"productName","kind":32,"flags":{"isConst":true},"comment":{"summary":[{"kind":"text","text":"The device's overall product name chosen by the device implementer containing the development name or code name of the device.\nCorresponds to ["},{"kind":"code","text":"`Build.PRODUCT`"},{"kind":"text","text":"](https://developer.android.com/reference/android/os/Build#PRODUCT). On web and iOS, this value is always "},{"kind":"code","text":"`null`"},{"kind":"text","text":"."}],"blockTags":[{"tag":"@example","content":[{"kind":"code","text":"```js\nDevice.productName; // Android: \"kminiltexx\"; iOS: null; web: null\n```"}]},{"tag":"@platform","content":[{"kind":"text","text":"android"}]}]},"type":{"type":"union","types":[{"type":"intrinsic","name":"string"},{"type":"literal","value":null}]},"defaultValue":"..."},{"name":"supportedCpuArchitectures","kind":32,"flags":{"isConst":true},"comment":{"summary":[{"kind":"text","text":"A list of supported processor architecture versions. The device expects the binaries it runs to be compiled for one of these architectures.\nThis value is "},{"kind":"code","text":"`null`"},{"kind":"text","text":" if the supported architectures could not be determined, particularly on web."}],"blockTags":[{"tag":"@example","content":[{"kind":"code","text":"```js\nDevice.supportedCpuArchitectures; // ['arm64 v8', 'Intel x86-64h Haswell', 'arm64-v8a', 'armeabi-v7a\", 'armeabi']\n```"}]}]},"type":{"type":"union","types":[{"type":"array","elementType":{"type":"intrinsic","name":"string"}},{"type":"literal","value":null}]},"defaultValue":"..."},{"name":"totalMemory","kind":32,"flags":{"isConst":true},"comment":{"summary":[{"kind":"text","text":"The device's total memory, in bytes. This is the total memory accessible to the kernel, but not necessarily to a single app.\nThis is basically the amount of RAM the device has, not including below-kernel fixed allocations like DMA buffers, RAM for the baseband CPU, etc…\nOn web, this value is always "},{"kind":"code","text":"`null`"},{"kind":"text","text":"."}],"blockTags":[{"tag":"@example","content":[{"kind":"code","text":"```js\nDevice.totalMemory; // 17179869184\n```"}]}]},"type":{"type":"union","types":[{"type":"intrinsic","name":"number"},{"type":"literal","value":null}]},"defaultValue":"..."},{"name":"getDeviceTypeAsync","kind":64,"signatures":[{"name":"getDeviceTypeAsync","kind":4096,"comment":{"summary":[{"kind":"text","text":"Checks the type of the device as a ["},{"kind":"code","text":"`DeviceType`"},{"kind":"text","text":"](#devicetype) enum value.\n\nOn Android, for devices other than TVs, the device type is determined by the screen resolution (screen diagonal size), so the result may not be completely accurate.\nIf the screen diagonal length is between 3\" and 6.9\", the method returns "},{"kind":"code","text":"`DeviceType.PHONE`"},{"kind":"text","text":". For lengths between 7\" and 18\", the method returns "},{"kind":"code","text":"`DeviceType.TABLET`"},{"kind":"text","text":".\nOtherwise, the method returns "},{"kind":"code","text":"`DeviceType.UNKNOWN`"},{"kind":"text","text":"."}],"blockTags":[{"tag":"@returns","content":[{"kind":"text","text":"Returns a promise that resolves to a ["},{"kind":"code","text":"`DeviceType`"},{"kind":"text","text":"](#devicetype) enum value."}]},{"tag":"@example","content":[{"kind":"code","text":"```js\nawait Device.getDeviceTypeAsync();\n// DeviceType.PHONE\n```"}]}]},"type":{"type":"reference","typeArguments":[{"type":"reference","name":"DeviceType"}],"name":"Promise","qualifiedName":"Promise","package":"typescript"}}]},{"name":"getMaxMemoryAsync","kind":64,"signatures":[{"name":"getMaxMemoryAsync","kind":4096,"comment":{"summary":[{"kind":"text","text":"Returns the maximum amount of memory that the Java VM will attempt to use. If there is no inherent limit then "},{"kind":"code","text":"`Number.MAX_SAFE_INTEGER`"},{"kind":"text","text":" is returned."}],"blockTags":[{"tag":"@returns","content":[{"kind":"text","text":"Returns a promise that resolves to the maximum available memory that the Java VM will use, in bytes."}]},{"tag":"@example","content":[{"kind":"code","text":"```js\nawait Device.getMaxMemoryAsync();\n// 402653184\n```"}]},{"tag":"@platform","content":[{"kind":"text","text":"android"}]}]},"type":{"type":"reference","typeArguments":[{"type":"intrinsic","name":"number"}],"name":"Promise","qualifiedName":"Promise","package":"typescript"}}]},{"name":"getPlatformFeaturesAsync","kind":64,"signatures":[{"name":"getPlatformFeaturesAsync","kind":4096,"comment":{"summary":[{"kind":"text","text":"Gets a list of features that are available on the system. The feature names are platform-specific.\nSee [Android documentation]()\nto learn more about this implementation."}],"blockTags":[{"tag":"@returns","content":[{"kind":"text","text":"Returns a promise that resolves to an array of strings, each of which is a platform-specific name of a feature available on the current device.\nOn iOS and web, the promise always resolves to an empty array."}]},{"tag":"@example","content":[{"kind":"code","text":"```js\nawait Device.getPlatformFeaturesAsync();\n// [\n// 'android.software.adoptable_storage',\n// 'android.software.backup',\n// 'android.hardware.sensor.accelerometer',\n// 'android.hardware.touchscreen',\n// ]\n```"}]},{"tag":"@platform","content":[{"kind":"text","text":"android"}]}]},"type":{"type":"reference","typeArguments":[{"type":"array","elementType":{"type":"intrinsic","name":"string"}}],"name":"Promise","qualifiedName":"Promise","package":"typescript"}}]},{"name":"getUptimeAsync","kind":64,"signatures":[{"name":"getUptimeAsync","kind":4096,"comment":{"summary":[{"kind":"text","text":"Gets the uptime since the last reboot of the device, in milliseconds. Android devices do not count time spent in deep sleep."}],"blockTags":[{"tag":"@returns","content":[{"kind":"text","text":"Returns a promise that resolves to a "},{"kind":"code","text":"`number`"},{"kind":"text","text":" that represents the milliseconds since last reboot."}]},{"tag":"@example","content":[{"kind":"code","text":"```js\nawait Device.getUptimeAsync();\n// 4371054\n```"}]},{"tag":"@platform","content":[{"kind":"text","text":"android"}]},{"tag":"@platform","content":[{"kind":"text","text":"ios"}]}]},"type":{"type":"reference","typeArguments":[{"type":"intrinsic","name":"number"}],"name":"Promise","qualifiedName":"Promise","package":"typescript"}}]},{"name":"hasPlatformFeatureAsync","kind":64,"signatures":[{"name":"hasPlatformFeatureAsync","kind":4096,"comment":{"summary":[{"kind":"text","text":"Tells if the device has a specific system feature."}],"blockTags":[{"tag":"@returns","content":[{"kind":"text","text":"Returns a promise that resolves to a boolean value indicating whether the device has the specified system feature.\nOn iOS and web, the promise always resolves to "},{"kind":"code","text":"`false`"},{"kind":"text","text":"."}]},{"tag":"@example","content":[{"kind":"code","text":"```js\nawait Device.hasPlatformFeatureAsync('amazon.hardware.fire_tv');\n// true or false\n```"}]},{"tag":"@platform","content":[{"kind":"text","text":"android"}]}]},"parameters":[{"name":"feature","kind":32768,"comment":{"summary":[{"kind":"text","text":"The platform-specific name of the feature to check for on the device. You can get all available system features with "},{"kind":"code","text":"`Device.getSystemFeatureAsync()`"},{"kind":"text","text":".\nSee [Android documentation]() to view acceptable feature strings."}]},"type":{"type":"intrinsic","name":"string"}}],"type":{"type":"reference","typeArguments":[{"type":"intrinsic","name":"boolean"}],"name":"Promise","qualifiedName":"Promise","package":"typescript"}}]},{"name":"isRootedExperimentalAsync","kind":64,"signatures":[{"name":"isRootedExperimentalAsync","kind":4096,"comment":{"summary":[{"kind":"text","text":"> **warning** This method is experimental and is not completely reliable. See description below.\n\nChecks whether the device has been rooted (Android) or jailbroken (iOS). This is not completely reliable because there exist solutions to bypass root-detection\non both [iOS](https://www.theiphonewiki.com/wiki/XCon) and [Android](https://tweakerlinks.com/how-to-bypass-apps-root-detection-in-android-device/).\nFurther, many root-detection checks can be bypassed via reverse engineering.\n- On Android, it's implemented in a way to find all possible files paths that contain the "},{"kind":"code","text":"`\"su\"`"},{"kind":"text","text":" executable but some devices that are not rooted may also have this executable. Therefore, there's no guarantee that this method will always return correctly.\n- On iOS, [these jailbreak checks](https://www.theiphonewiki.com/wiki/Bypassing_Jailbreak_Detection) are used to detect if a device is rooted/jailbroken. However, since there are closed-sourced solutions such as [xCon](https://www.theiphonewiki.com/wiki/XCon) that aim to hook every known method and function responsible for informing an application of a jailbroken device, this method may not reliably detect devices that have xCon or similar packages installed.\n- On web, this always resolves to "},{"kind":"code","text":"`false`"},{"kind":"text","text":" even if the device is rooted."}],"blockTags":[{"tag":"@returns","content":[{"kind":"text","text":"Returns a promise that resolves to a "},{"kind":"code","text":"`boolean`"},{"kind":"text","text":" that specifies whether this device is rooted."}]},{"tag":"@example","content":[{"kind":"code","text":"```js\nawait Device.isRootedExperimentalAsync();\n// true or false\n```"}]}]},"type":{"type":"reference","typeArguments":[{"type":"intrinsic","name":"boolean"}],"name":"Promise","qualifiedName":"Promise","package":"typescript"}}]},{"name":"isSideLoadingEnabledAsync","kind":64,"signatures":[{"name":"isSideLoadingEnabledAsync","kind":4096,"comment":{"summary":[{"kind":"text","text":"**Using this method requires you to [add the "},{"kind":"code","text":"`REQUEST_INSTALL_PACKAGES`"},{"kind":"text","text":" permission](/config/app#permissions).**\nReturns whether applications can be installed for this user via the system's [Intent#ACTION_INSTALL_PACKAGE](https://developer.android.com/reference/android/content/Intent.html#ACTION_INSTALL_PACKAGE)\nmechanism rather than through the OS's default app store, like Google Play."}],"blockTags":[{"tag":"@returns","content":[{"kind":"text","text":"Returns a promise that resolves to a "},{"kind":"code","text":"`boolean`"},{"kind":"text","text":" that represents whether the calling package is allowed to request package installation."}]},{"tag":"@example","content":[{"kind":"code","text":"```js\nawait Device.isSideLoadingEnabledAsync();\n// true or false\n```"}]},{"tag":"@platform","content":[{"kind":"text","text":"android"}]}]},"type":{"type":"reference","typeArguments":[{"type":"intrinsic","name":"boolean"}],"name":"Promise","qualifiedName":"Promise","package":"typescript"}}]}]}
\ No newline at end of file
diff --git a/docs/public/static/data/v49.0.0/expo-document-picker.json b/docs/public/static/data/v49.0.0/expo-document-picker.json
new file mode 100644
index 0000000000000..ad295d193a47b
--- /dev/null
+++ b/docs/public/static/data/v49.0.0/expo-document-picker.json
@@ -0,0 +1 @@
+{"name":"expo-document-picker","kind":1,"children":[{"name":"DocumentPickerAsset","kind":4194304,"type":{"type":"reflection","declaration":{"name":"__type","kind":65536,"children":[{"name":"file","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"code","text":"`File`"},{"kind":"text","text":" object for the parity with web File API."}],"blockTags":[{"tag":"@platform","content":[{"kind":"text","text":"web"}]}]},"type":{"type":"reference","name":"File","qualifiedName":"File","package":"typescript"}},{"name":"lastModified","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"Timestamp of last document modification."}]},"type":{"type":"intrinsic","name":"number"}},{"name":"mimeType","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"Document MIME type."}]},"type":{"type":"intrinsic","name":"string"}},{"name":"name","kind":1024,"comment":{"summary":[{"kind":"text","text":"Document original name."}]},"type":{"type":"intrinsic","name":"string"}},{"name":"output","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"code","text":"`FileList`"},{"kind":"text","text":" object for the parity with web File API."}],"blockTags":[{"tag":"@platform","content":[{"kind":"text","text":"web"}]}]},"type":{"type":"union","types":[{"type":"reference","name":"FileList","qualifiedName":"FileList","package":"typescript"},{"type":"literal","value":null}]}},{"name":"size","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"Document size in bytes."}]},"type":{"type":"intrinsic","name":"number"}},{"name":"uri","kind":1024,"comment":{"summary":[{"kind":"text","text":"An URI to the local document file."}]},"type":{"type":"intrinsic","name":"string"}}]}}},{"name":"DocumentPickerOptions","kind":4194304,"type":{"type":"reflection","declaration":{"name":"__type","kind":65536,"children":[{"name":"copyToCacheDirectory","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"If "},{"kind":"code","text":"`true`"},{"kind":"text","text":", the picked file is copied to ["},{"kind":"code","text":"`FileSystem.CacheDirectory`"},{"kind":"text","text":"](./filesystem#filesystemcachedirectory),\nwhich allows other Expo APIs to read the file immediately. This may impact performance for\nlarge files, so you should consider setting this to "},{"kind":"code","text":"`false`"},{"kind":"text","text":" if you expect users to pick\nparticularly large files and your app does not need immediate read access."}],"blockTags":[{"tag":"@default","content":[{"kind":"text","text":"true"}]}]},"type":{"type":"intrinsic","name":"boolean"}},{"name":"multiple","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"Allows multiple files to be selected from the system UI."}],"blockTags":[{"tag":"@default","content":[{"kind":"text","text":"false"}]}]},"type":{"type":"intrinsic","name":"boolean"}},{"name":"type","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"The [MIME type(s)](https://en.wikipedia.org/wiki/Media_type) of the documents that are available\nto be picked. It also supports wildcards like "},{"kind":"code","text":"`'image/*'`"},{"kind":"text","text":" to choose any image. To allow any type\nof document you can use "},{"kind":"code","text":"`'*/*'`"},{"kind":"text","text":"."}],"blockTags":[{"tag":"@default","content":[{"kind":"text","text":"'*/*'"}]}]},"type":{"type":"union","types":[{"type":"intrinsic","name":"string"},{"type":"array","elementType":{"type":"intrinsic","name":"string"}}]}}]}}},{"name":"DocumentPickerResult","kind":4194304,"type":{"type":"intersection","types":[{"type":"reflection","declaration":{"name":"__type","kind":65536,"children":[{"name":"assets","kind":1024,"comment":{"summary":[{"kind":"text","text":"An array of picked assets or "},{"kind":"code","text":"`null`"},{"kind":"text","text":" when the request was canceled."}]},"type":{"type":"union","types":[{"type":"array","elementType":{"type":"reference","name":"DocumentPickerAsset"}},{"type":"literal","value":null}]}},{"name":"canceled","kind":1024,"comment":{"summary":[{"kind":"text","text":"Boolean flag which shows if request was canceled. If asset data have been returned this should\nalways be "},{"kind":"code","text":"`false`"},{"kind":"text","text":"."}]},"type":{"type":"intrinsic","name":"boolean"}},{"name":"file","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"code","text":"`File`"},{"kind":"text","text":" object for the parity with web File API."}],"blockTags":[{"tag":"@platform","content":[{"kind":"text","text":"web"}]}]},"type":{"type":"reference","name":"File","qualifiedName":"File","package":"typescript"}},{"name":"lastModified","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"Timestamp of last document modification."}]},"type":{"type":"intrinsic","name":"number"}},{"name":"mimeType","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"Document MIME type."}]},"type":{"type":"intrinsic","name":"string"}},{"name":"name","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"Document original name."}]},"type":{"type":"intrinsic","name":"string"}},{"name":"output","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"code","text":"`FileList`"},{"kind":"text","text":" object for the parity with web File API."}],"blockTags":[{"tag":"@platform","content":[{"kind":"text","text":"web"}]}]},"type":{"type":"union","types":[{"type":"reference","name":"FileList","qualifiedName":"FileList","package":"typescript"},{"type":"literal","value":null}]}},{"name":"size","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"Document size in bytes."}]},"type":{"type":"intrinsic","name":"number"}},{"name":"type","kind":1024,"flags":{"isOptional":true},"type":{"type":"intrinsic","name":"string"}},{"name":"uri","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"An URI to the local document file."}]},"type":{"type":"intrinsic","name":"string"}}]}},{"type":"union","types":[{"type":"reference","name":"DocumentPickerSuccessResult"},{"type":"reference","name":"DocumentPickerCanceledResult"}]}]}},{"name":"getDocumentAsync","kind":64,"signatures":[{"name":"getDocumentAsync","kind":4096,"comment":{"summary":[{"kind":"text","text":"Display the system UI for choosing a document. By default, the chosen file is copied to [the app's internal cache directory](filesystem.md#filesystemcachedirectory).\n> **Notes for Web:** The system UI can only be shown after user activation (e.g. a "},{"kind":"code","text":"`Button`"},{"kind":"text","text":" press).\n> Therefore, calling "},{"kind":"code","text":"`getDocumentAsync`"},{"kind":"text","text":" in "},{"kind":"code","text":"`componentDidMount`"},{"kind":"text","text":", for example, will **not** work as\n> intended. The "},{"kind":"code","text":"`cancel`"},{"kind":"text","text":" event will not be returned in the browser due to platform restrictions and\n> inconsistencies across browsers."}],"blockTags":[{"tag":"@returns","content":[{"kind":"text","text":"On success returns a promise that fulfils with ["},{"kind":"code","text":"`DocumentResult`"},{"kind":"text","text":"](#documentresult) object.\n\nIf the user cancelled the document picking, the promise resolves to "},{"kind":"code","text":"`{ type: 'cancel' }`"},{"kind":"text","text":"."}]}]},"parameters":[{"name":"__namedParameters","kind":32768,"type":{"type":"reference","name":"DocumentPickerOptions"},"defaultValue":"{}"}],"type":{"type":"reference","typeArguments":[{"type":"reference","name":"DocumentPickerResult"}],"name":"Promise","qualifiedName":"Promise","package":"typescript"}}]}]}
\ No newline at end of file
diff --git a/docs/public/static/data/v49.0.0/expo-face-detector.json b/docs/public/static/data/v49.0.0/expo-face-detector.json
new file mode 100644
index 0000000000000..4e8bf9a216066
--- /dev/null
+++ b/docs/public/static/data/v49.0.0/expo-face-detector.json
@@ -0,0 +1 @@
+{"name":"expo-face-detector","kind":1,"children":[{"name":"FaceDetectorClassifications","kind":8,"children":[{"name":"all","kind":16,"type":{"type":"literal","value":2}},{"name":"none","kind":16,"type":{"type":"literal","value":1}}]},{"name":"FaceDetectorLandmarks","kind":8,"children":[{"name":"all","kind":16,"type":{"type":"literal","value":2}},{"name":"none","kind":16,"type":{"type":"literal","value":1}}]},{"name":"FaceDetectorMode","kind":8,"children":[{"name":"accurate","kind":16,"type":{"type":"literal","value":2}},{"name":"fast","kind":16,"type":{"type":"literal","value":1}}]},{"name":"DetectionOptions","kind":4194304,"comment":{"summary":[{"kind":"text","text":"In order to configure detector's behavior modules pass a settings object which is then\ninterpreted by this module."}]},"type":{"type":"reflection","declaration":{"name":"__type","kind":65536,"children":[{"name":"detectLandmarks","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"Whether to detect and return landmarks positions on the face (ears, eyes, mouth, cheeks, nose).\nUse "},{"kind":"code","text":"`FaceDetector.FaceDetectorLandmarks.{all, none}`"},{"kind":"text","text":"."}]},"type":{"type":"reference","name":"FaceDetectorLandmarks"}},{"name":"minDetectionInterval","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"Minimal interval in milliseconds between two face detection events being submitted to JS.\nUse, when you expect lots of faces for long time and are afraid of JS Bridge being overloaded."}],"blockTags":[{"tag":"@default","content":[{"kind":"text","text":"0"}]}]},"type":{"type":"intrinsic","name":"number"}},{"name":"mode","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"Whether to detect faces in fast or accurate mode. Use "},{"kind":"code","text":"`FaceDetector.FaceDetectorMode.{fast, accurate}`"},{"kind":"text","text":"."}]},"type":{"type":"reference","name":"FaceDetectorMode"}},{"name":"runClassifications","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"Whether to run additional classifications on detected faces (smiling probability, open eye\nprobabilities). Use "},{"kind":"code","text":"`FaceDetector.FaceDetectorClassifications.{all, none}`"},{"kind":"text","text":"."}]},"type":{"type":"reference","name":"FaceDetectorClassifications"}},{"name":"tracking","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"Flag to enable tracking of faces between frames. If true, each face will be returned with\n"},{"kind":"code","text":"`faceID`"},{"kind":"text","text":" attribute which should be consistent across frames."}],"blockTags":[{"tag":"@default","content":[{"kind":"text","text":"false"}]}]},"type":{"type":"intrinsic","name":"boolean"}}]}}},{"name":"DetectionResult","kind":4194304,"type":{"type":"reflection","declaration":{"name":"__type","kind":65536,"children":[{"name":"faces","kind":1024,"comment":{"summary":[{"kind":"text","text":"Array of faces objects."}]},"type":{"type":"array","elementType":{"type":"reference","name":"FaceFeature"}}},{"name":"image","kind":1024,"type":{"type":"reference","name":"Image"}}]}}},{"name":"FaceFeature","kind":4194304,"type":{"type":"reflection","declaration":{"name":"__type","kind":65536,"children":[{"name":"bottomMouthPosition","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"Position of the bottom edge of the mouth in image coordinates. Returned only if detection\nclassifications property is set to "},{"kind":"code","text":"`FaceDetectorLandmarks.all`"},{"kind":"text","text":"."}]},"type":{"type":"reference","name":"Point"}},{"name":"bounds","kind":1024,"comment":{"summary":[{"kind":"text","text":"An object containing face bounds."}]},"type":{"type":"reference","name":"FaceFeatureBounds"}},{"name":"faceID","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"A face identifier (used for tracking, if the same face appears on consecutive frames it will\nhave the same "},{"kind":"code","text":"`faceID`"},{"kind":"text","text":")."}]},"type":{"type":"intrinsic","name":"number"}},{"name":"leftCheekPosition","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"Position of the left cheek in image coordinates. Returned only if detection classifications\nproperty is set to "},{"kind":"code","text":"`FaceDetectorLandmarks.all`"},{"kind":"text","text":"."}]},"type":{"type":"reference","name":"Point"}},{"name":"leftEarPosition","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"Position of the left ear in image coordinates. Returned only if detection classifications\nproperty is set to "},{"kind":"code","text":"`FaceDetectorLandmarks.all`"},{"kind":"text","text":"."}]},"type":{"type":"reference","name":"Point"}},{"name":"leftEyeOpenProbability","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"Probability that the left eye is open. Returned only if detection classifications property is\nset to "},{"kind":"code","text":"`FaceDetectorClassifications.all`"},{"kind":"text","text":"."}]},"type":{"type":"intrinsic","name":"number"}},{"name":"leftEyePosition","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"Position of the left eye in image coordinates. Returned only if detection classifications\nproperty is set to "},{"kind":"code","text":"`FaceDetectorLandmarks.all`"},{"kind":"text","text":"."}]},"type":{"type":"reference","name":"Point"}},{"name":"leftMouthPosition","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"Position of the left edge of the mouth in image coordinates. Returned only if detection\nclassifications property is set to "},{"kind":"code","text":"`FaceDetectorLandmarks.all`"},{"kind":"text","text":"."}]},"type":{"type":"reference","name":"Point"}},{"name":"mouthPosition","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"Position of the center of the mouth in image coordinates. Returned only if detection\nclassifications property is set to "},{"kind":"code","text":"`FaceDetectorLandmarks.all`"},{"kind":"text","text":"."}]},"type":{"type":"reference","name":"Point"}},{"name":"noseBasePosition","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"Position of the nose base in image coordinates. Returned only if detection classifications\nproperty is set to "},{"kind":"code","text":"`FaceDetectorLandmarks.all`"},{"kind":"text","text":"."}]},"type":{"type":"reference","name":"Point"}},{"name":"rightCheekPosition","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"Position of the right cheek in image coordinates. Returned only if detection classifications\nproperty is set to "},{"kind":"code","text":"`FaceDetectorLandmarks.all`"},{"kind":"text","text":"."}]},"type":{"type":"reference","name":"Point"}},{"name":"rightEarPosition","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"Position of the right ear in image coordinates. Returned only if detection classifications\nproperty is set to "},{"kind":"code","text":"`FaceDetectorLandmarks.all`"},{"kind":"text","text":"."}]},"type":{"type":"reference","name":"Point"}},{"name":"rightEyeOpenProbability","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"Probability that the right eye is open. Returned only if detection classifications property is\nset to "},{"kind":"code","text":"`FaceDetectorClassifications.all`"},{"kind":"text","text":"."}]},"type":{"type":"intrinsic","name":"number"}},{"name":"rightEyePosition","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"Position of the right eye in image coordinates. Returned only if detection classifications\nproperty is set to "},{"kind":"code","text":"`FaceDetectorLandmarks.all`"},{"kind":"text","text":"."}]},"type":{"type":"reference","name":"Point"}},{"name":"rightMouthPosition","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"Position of the right edge of the mouth in image coordinates. Returned only if detection\nclassifications property is set to "},{"kind":"code","text":"`FaceDetectorLandmarks.all`"},{"kind":"text","text":"."}]},"type":{"type":"reference","name":"Point"}},{"name":"rollAngle","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"Roll angle of the face (bank)."}]},"type":{"type":"intrinsic","name":"number"}},{"name":"smilingProbability","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"Probability that the face is smiling. Returned only if detection classifications property is\nset to "},{"kind":"code","text":"`FaceDetectorClassifications.all`"},{"kind":"text","text":"."}]},"type":{"type":"intrinsic","name":"number"}},{"name":"yawAngle","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"Yaw angle of the face (heading, turning head left or right)."}]},"type":{"type":"intrinsic","name":"number"}}]}}},{"name":"FaceFeatureBounds","kind":4194304,"type":{"type":"reflection","declaration":{"name":"__type","kind":65536,"children":[{"name":"origin","kind":1024,"comment":{"summary":[{"kind":"text","text":"Position of the top left corner of a square containing the face in image coordinates,"}]},"type":{"type":"reference","name":"Point"}},{"name":"size","kind":1024,"comment":{"summary":[{"kind":"text","text":"Size of the square containing the face in image coordinates,"}]},"type":{"type":"reflection","declaration":{"name":"__type","kind":65536,"children":[{"name":"height","kind":1024,"type":{"type":"intrinsic","name":"number"}},{"name":"width","kind":1024,"type":{"type":"intrinsic","name":"number"}}]}}}]}}},{"name":"Image","kind":4194304,"type":{"type":"reflection","declaration":{"name":"__type","kind":65536,"children":[{"name":"height","kind":1024,"comment":{"summary":[{"kind":"text","text":"Height of the image in pixels."}]},"type":{"type":"intrinsic","name":"number"}},{"name":"orientation","kind":1024,"comment":{"summary":[{"kind":"text","text":"Orientation of the image (value conforms to the EXIF orientation tag standard)."}]},"type":{"type":"intrinsic","name":"number"}},{"name":"uri","kind":1024,"comment":{"summary":[{"kind":"text","text":"URI of the image."}]},"type":{"type":"intrinsic","name":"string"}},{"name":"width","kind":1024,"comment":{"summary":[{"kind":"text","text":"Width of the image in pixels."}]},"type":{"type":"intrinsic","name":"number"}}]}}},{"name":"Point","kind":4194304,"type":{"type":"reflection","declaration":{"name":"__type","kind":65536,"children":[{"name":"x","kind":1024,"type":{"type":"intrinsic","name":"number"}},{"name":"y","kind":1024,"type":{"type":"intrinsic","name":"number"}}]}}},{"name":"detectFacesAsync","kind":64,"signatures":[{"name":"detectFacesAsync","kind":4096,"comment":{"summary":[{"kind":"text","text":"Detect faces on a picture."}],"blockTags":[{"tag":"@returns","content":[{"kind":"text","text":"Returns a Promise which fulfils with ["},{"kind":"code","text":"`DetectionResult`"},{"kind":"text","text":"](#detectionresult) object."}]}]},"parameters":[{"name":"uri","kind":32768,"comment":{"summary":[{"kind":"code","text":"`file://`"},{"kind":"text","text":" URI to the image."}]},"type":{"type":"intrinsic","name":"string"}},{"name":"options","kind":32768,"comment":{"summary":[{"kind":"text","text":"A map of detection options."}]},"type":{"type":"reference","name":"DetectionOptions"},"defaultValue":"{}"}],"type":{"type":"reference","typeArguments":[{"type":"reference","name":"DetectionResult"}],"name":"Promise","qualifiedName":"Promise","package":"typescript"}}]}]}
\ No newline at end of file
diff --git a/docs/public/static/data/v49.0.0/expo-file-system.json b/docs/public/static/data/v49.0.0/expo-file-system.json
new file mode 100644
index 0000000000000..787d25bc15108
--- /dev/null
+++ b/docs/public/static/data/v49.0.0/expo-file-system.json
@@ -0,0 +1 @@
+{"name":"expo-file-system","kind":1,"children":[{"name":"StorageAccessFramework","kind":4,"comment":{"summary":[{"kind":"text","text":"The "},{"kind":"code","text":"`StorageAccessFramework`"},{"kind":"text","text":" is a namespace inside of the "},{"kind":"code","text":"`expo-file-system`"},{"kind":"text","text":" module, which encapsulates all functions which can be used with [SAF URIs](#saf-uri).\nYou can read more about SAF in the [Android documentation](https://developer.android.com/guide/topics/providers/document-provider)."}],"blockTags":[{"tag":"@example","content":[{"kind":"text","text":"# Basic Usage\n\n"},{"kind":"code","text":"```ts\nimport { StorageAccessFramework } from 'expo-file-system';\n\n// Requests permissions for external directory\nconst permissions = await StorageAccessFramework.requestDirectoryPermissionsAsync();\n\nif (permissions.granted) {\n // Gets SAF URI from response\n const uri = permissions.directoryUri;\n\n // Gets all files inside of selected directory\n const files = await StorageAccessFramework.readDirectoryAsync(uri);\n alert(`Files inside ${uri}:\\n\\n${JSON.stringify(files)}`);\n}\n```"},{"kind":"text","text":"\n\n# Migrating an album\n\n"},{"kind":"code","text":"```ts\nimport * as MediaLibrary from 'expo-media-library';\nimport * as FileSystem from 'expo-file-system';\nconst { StorageAccessFramework } = FileSystem;\n\nasync function migrateAlbum(albumName: string) {\n // Gets SAF URI to the album\n const albumUri = StorageAccessFramework.getUriForDirectoryInRoot(albumName);\n\n // Requests permissions\n const permissions = await StorageAccessFramework.requestDirectoryPermissionsAsync(albumUri);\n if (!permissions.granted) {\n return;\n }\n\n const permittedUri = permissions.directoryUri;\n // Checks if users selected the correct folder\n if (!permittedUri.includes(albumName)) {\n return;\n }\n\n const mediaLibraryPermissions = await MediaLibrary.requestPermissionsAsync();\n if (!mediaLibraryPermissions.granted) {\n return;\n }\n\n // Moves files from external storage to internal storage\n await StorageAccessFramework.moveAsync({\n from: permittedUri,\n to: FileSystem.documentDirectory!,\n });\n\n const outputDir = FileSystem.documentDirectory! + albumName;\n const migratedFiles = await FileSystem.readDirectoryAsync(outputDir);\n\n // Creates assets from local files\n const [newAlbumCreator, ...assets] = await Promise.all(\n migratedFiles.map>(\n async fileName => await MediaLibrary.createAssetAsync(outputDir + '/' + fileName)\n )\n );\n\n // Album was empty\n if (!newAlbumCreator) {\n return;\n }\n\n // Creates a new album in the scoped directory\n const newAlbum = await MediaLibrary.createAlbumAsync(albumName, newAlbumCreator, false);\n if (assets.length) {\n await MediaLibrary.addAssetsToAlbumAsync(assets, newAlbum, false);\n }\n}\n```"}]},{"tag":"@platform","content":[{"kind":"text","text":"Android"}]}]},"children":[{"name":"copyAsync","kind":64,"signatures":[{"name":"copyAsync","kind":4096,"comment":{"summary":[{"kind":"text","text":"Alias for ["},{"kind":"code","text":"`copyAsync`"},{"kind":"text","text":"](#filesystemcopyasyncoptions) method."}]},"parameters":[{"name":"options","kind":32768,"type":{"type":"reference","name":"RelocatingOptions"}}],"type":{"type":"reference","typeArguments":[{"type":"intrinsic","name":"void"}],"name":"Promise","qualifiedName":"Promise","package":"typescript"}}]},{"name":"createFileAsync","kind":64,"signatures":[{"name":"createFileAsync","kind":4096,"comment":{"summary":[{"kind":"text","text":"Creates a new empty file."}],"blockTags":[{"tag":"@returns","content":[{"kind":"text","text":"A Promise that resolves to a [SAF URI](#saf-uri) to the created file."}]}]},"parameters":[{"name":"parentUri","kind":32768,"comment":{"summary":[{"kind":"text","text":"The [SAF](#saf-uri) URI to the parent directory."}]},"type":{"type":"intrinsic","name":"string"}},{"name":"fileName","kind":32768,"comment":{"summary":[{"kind":"text","text":"The name of new file **without the extension**."}]},"type":{"type":"intrinsic","name":"string"}},{"name":"mimeType","kind":32768,"comment":{"summary":[{"kind":"text","text":"The MIME type of new file."}]},"type":{"type":"intrinsic","name":"string"}}],"type":{"type":"reference","typeArguments":[{"type":"intrinsic","name":"string"}],"name":"Promise","qualifiedName":"Promise","package":"typescript"}}]},{"name":"deleteAsync","kind":64,"signatures":[{"name":"deleteAsync","kind":4096,"comment":{"summary":[{"kind":"text","text":"Alias for ["},{"kind":"code","text":"`deleteAsync`"},{"kind":"text","text":"](#filesystemdeleteasyncfileuri-options) method."}]},"parameters":[{"name":"fileUri","kind":32768,"type":{"type":"intrinsic","name":"string"}},{"name":"options","kind":32768,"type":{"type":"reference","name":"DeletingOptions"},"defaultValue":"{}"}],"type":{"type":"reference","typeArguments":[{"type":"intrinsic","name":"void"}],"name":"Promise","qualifiedName":"Promise","package":"typescript"}}]},{"name":"getUriForDirectoryInRoot","kind":64,"signatures":[{"name":"getUriForDirectoryInRoot","kind":4096,"comment":{"summary":[{"kind":"text","text":"Gets a [SAF URI](#saf-uri) pointing to a folder in the Android root directory. You can use this function to get URI for\n"},{"kind":"code","text":"`StorageAccessFramework.requestDirectoryPermissionsAsync()`"},{"kind":"text","text":" when you trying to migrate an album. In that case, the name of the album is the folder name."}],"blockTags":[{"tag":"@returns","content":[{"kind":"text","text":"Returns a [SAF URI](#saf-uri) to a folder."}]}]},"parameters":[{"name":"folderName","kind":32768,"comment":{"summary":[{"kind":"text","text":"The name of the folder which is located in the Android root directory."}]},"type":{"type":"intrinsic","name":"string"}}],"type":{"type":"intrinsic","name":"string"}}]},{"name":"makeDirectoryAsync","kind":64,"signatures":[{"name":"makeDirectoryAsync","kind":4096,"comment":{"summary":[{"kind":"text","text":"Creates a new empty directory."}],"blockTags":[{"tag":"@returns","content":[{"kind":"text","text":"A Promise that resolves to a [SAF URI](#saf-uri) to the created directory."}]}]},"parameters":[{"name":"parentUri","kind":32768,"comment":{"summary":[{"kind":"text","text":"The [SAF](#saf-uri) URI to the parent directory."}]},"type":{"type":"intrinsic","name":"string"}},{"name":"dirName","kind":32768,"comment":{"summary":[{"kind":"text","text":"The name of new directory."}]},"type":{"type":"intrinsic","name":"string"}}],"type":{"type":"reference","typeArguments":[{"type":"intrinsic","name":"string"}],"name":"Promise","qualifiedName":"Promise","package":"typescript"}}]},{"name":"moveAsync","kind":64,"signatures":[{"name":"moveAsync","kind":4096,"comment":{"summary":[{"kind":"text","text":"Alias for ["},{"kind":"code","text":"`moveAsync`"},{"kind":"text","text":"](#filesystemmoveasyncoptions) method."}]},"parameters":[{"name":"options","kind":32768,"type":{"type":"reference","name":"RelocatingOptions"}}],"type":{"type":"reference","typeArguments":[{"type":"intrinsic","name":"void"}],"name":"Promise","qualifiedName":"Promise","package":"typescript"}}]},{"name":"readAsStringAsync","kind":64,"signatures":[{"name":"readAsStringAsync","kind":4096,"comment":{"summary":[{"kind":"text","text":"Alias for ["},{"kind":"code","text":"`readAsStringAsync`"},{"kind":"text","text":"](#filesystemreadasstringasyncfileuri-options) method."}]},"parameters":[{"name":"fileUri","kind":32768,"type":{"type":"intrinsic","name":"string"}},{"name":"options","kind":32768,"type":{"type":"reference","name":"ReadingOptions"},"defaultValue":"{}"}],"type":{"type":"reference","typeArguments":[{"type":"intrinsic","name":"string"}],"name":"Promise","qualifiedName":"Promise","package":"typescript"}}]},{"name":"readDirectoryAsync","kind":64,"signatures":[{"name":"readDirectoryAsync","kind":4096,"comment":{"summary":[{"kind":"text","text":"Enumerate the contents of a directory."}],"blockTags":[{"tag":"@returns","content":[{"kind":"text","text":"A Promise that resolves to an array of strings, each containing the full [SAF URI](#saf-uri) of a file or directory contained in the directory at "},{"kind":"code","text":"`fileUri`"},{"kind":"text","text":"."}]}]},"parameters":[{"name":"dirUri","kind":32768,"comment":{"summary":[{"kind":"text","text":"[SAF](#saf-uri) URI to the directory."}]},"type":{"type":"intrinsic","name":"string"}}],"type":{"type":"reference","typeArguments":[{"type":"array","elementType":{"type":"intrinsic","name":"string"}}],"name":"Promise","qualifiedName":"Promise","package":"typescript"}}]},{"name":"requestDirectoryPermissionsAsync","kind":64,"signatures":[{"name":"requestDirectoryPermissionsAsync","kind":4096,"comment":{"summary":[{"kind":"text","text":"Allows users to select a specific directory, granting your app access to all of the files and sub-directories within that directory."}],"blockTags":[{"tag":"@platform","content":[{"kind":"text","text":"android 11+"}]},{"tag":"@returns","content":[{"kind":"text","text":"Returns a Promise that resolves to "},{"kind":"code","text":"`FileSystemRequestDirectoryPermissionsResult`"},{"kind":"text","text":" object."}]}]},"parameters":[{"name":"initialFileUrl","kind":32768,"comment":{"summary":[{"kind":"text","text":"The [SAF URI](#saf-uri) of the directory that the file picker should display when it first loads.\nIf URI is incorrect or points to a non-existing folder, it's ignored."}]},"type":{"type":"union","types":[{"type":"literal","value":null},{"type":"intrinsic","name":"string"}]},"defaultValue":"null"}],"type":{"type":"reference","typeArguments":[{"type":"reference","name":"FileSystemRequestDirectoryPermissionsResult"}],"name":"Promise","qualifiedName":"Promise","package":"typescript"}}]},{"name":"writeAsStringAsync","kind":64,"signatures":[{"name":"writeAsStringAsync","kind":4096,"comment":{"summary":[{"kind":"text","text":"Alias for ["},{"kind":"code","text":"`writeAsStringAsync`"},{"kind":"text","text":"](#filesystemwriteasstringasyncfileuri-contents-options) method."}]},"parameters":[{"name":"fileUri","kind":32768,"type":{"type":"intrinsic","name":"string"}},{"name":"contents","kind":32768,"type":{"type":"intrinsic","name":"string"}},{"name":"options","kind":32768,"type":{"type":"reference","name":"WritingOptions"},"defaultValue":"{}"}],"type":{"type":"reference","typeArguments":[{"type":"intrinsic","name":"void"}],"name":"Promise","qualifiedName":"Promise","package":"typescript"}}]}]},{"name":"EncodingType","kind":8,"comment":{"summary":[{"kind":"text","text":"These values can be used to define how file system data is read / written."}]},"children":[{"name":"Base64","kind":16,"comment":{"summary":[{"kind":"text","text":"Binary, radix-64 representation."}]},"type":{"type":"literal","value":"base64"}},{"name":"UTF8","kind":16,"comment":{"summary":[{"kind":"text","text":"Standard encoding format."}]},"type":{"type":"literal","value":"utf8"}}]},{"name":"FileSystemSessionType","kind":8,"comment":{"summary":[{"kind":"text","text":"These values can be used to define how sessions work on iOS."}],"blockTags":[{"tag":"@platform","content":[{"kind":"text","text":"ios"}]}]},"children":[{"name":"BACKGROUND","kind":16,"comment":{"summary":[{"kind":"text","text":"Using this mode means that the downloading/uploading session on the native side will work even if the application is moved to background.\nIf the task completes while the application is in background, the Promise will be either resolved immediately or (if the application execution has already been stopped) once the app is moved to foreground again.\n> Note: The background session doesn't fail if the server or your connection is down. Rather, it continues retrying until the task succeeds or is canceled manually."}]},"type":{"type":"literal","value":0}},{"name":"FOREGROUND","kind":16,"comment":{"summary":[{"kind":"text","text":"Using this mode means that downloading/uploading session on the native side will be terminated once the application becomes inactive (e.g. when it goes to background).\nBringing the application to foreground again would trigger Promise rejection."}]},"type":{"type":"literal","value":1}}]},{"name":"FileSystemUploadType","kind":8,"children":[{"name":"BINARY_CONTENT","kind":16,"comment":{"summary":[{"kind":"text","text":"The file will be sent as a request's body. The request can't contain additional data."}]},"type":{"type":"literal","value":0}},{"name":"MULTIPART","kind":16,"comment":{"summary":[{"kind":"text","text":"An [RFC 2387-compliant](https://www.ietf.org/rfc/rfc2387.txt) request body. The provided file will be encoded into HTTP request.\nThis request can contain additional data represented by ["},{"kind":"code","text":"`UploadOptionsMultipart`"},{"kind":"text","text":"](#uploadoptionsmultipart) type."}]},"type":{"type":"literal","value":1}}]},{"name":"DownloadResumable","kind":128,"children":[{"name":"constructor","kind":512,"signatures":[{"name":"new DownloadResumable","kind":16384,"parameters":[{"name":"url","kind":32768,"type":{"type":"intrinsic","name":"string"}},{"name":"_fileUri","kind":32768,"type":{"type":"intrinsic","name":"string"}},{"name":"options","kind":32768,"type":{"type":"reference","name":"DownloadOptions"},"defaultValue":"{}"},{"name":"callback","kind":32768,"flags":{"isOptional":true},"type":{"type":"reference","typeArguments":[{"type":"reference","name":"DownloadProgressData"}],"name":"FileSystemNetworkTaskProgressCallback"}},{"name":"resumeData","kind":32768,"flags":{"isOptional":true},"type":{"type":"intrinsic","name":"string"}}],"type":{"type":"reference","name":"DownloadResumable"},"overwrites":{"type":"reference","name":"FileSystemCancellableNetworkTask.constructor"}}],"overwrites":{"type":"reference","name":"FileSystemCancellableNetworkTask.constructor"}},{"name":"fileUri","kind":262144,"flags":{"isPublic":true},"getSignature":{"name":"fileUri","kind":524288,"type":{"type":"intrinsic","name":"string"}}},{"name":"cancelAsync","kind":2048,"flags":{"isPublic":true},"signatures":[{"name":"cancelAsync","kind":4096,"type":{"type":"reference","typeArguments":[{"type":"intrinsic","name":"void"}],"name":"Promise","qualifiedName":"Promise","package":"typescript"},"inheritedFrom":{"type":"reference","name":"FileSystemCancellableNetworkTask.cancelAsync"}}],"inheritedFrom":{"type":"reference","name":"FileSystemCancellableNetworkTask.cancelAsync"}},{"name":"downloadAsync","kind":2048,"signatures":[{"name":"downloadAsync","kind":4096,"comment":{"summary":[{"kind":"text","text":"Download the contents at a remote URI to a file in the app's file system."}],"blockTags":[{"tag":"@returns","content":[{"kind":"text","text":"Returns a Promise that resolves to "},{"kind":"code","text":"`FileSystemDownloadResult`"},{"kind":"text","text":" object, or to "},{"kind":"code","text":"`undefined`"},{"kind":"text","text":" when task was cancelled."}]}]},"type":{"type":"reference","typeArguments":[{"type":"union","types":[{"type":"intrinsic","name":"undefined"},{"type":"reference","name":"FileSystemDownloadResult"}]}],"name":"Promise","qualifiedName":"Promise","package":"typescript"}}]},{"name":"pauseAsync","kind":2048,"signatures":[{"name":"pauseAsync","kind":4096,"comment":{"summary":[{"kind":"text","text":"Pause the current download operation. "},{"kind":"code","text":"`resumeData`"},{"kind":"text","text":" is added to the "},{"kind":"code","text":"`DownloadResumable`"},{"kind":"text","text":" object after a successful pause operation.\nReturns an object that can be saved with "},{"kind":"code","text":"`AsyncStorage`"},{"kind":"text","text":" for future retrieval (the same object that is returned from calling "},{"kind":"code","text":"`FileSystem.DownloadResumable.savable()`"},{"kind":"text","text":")."}],"blockTags":[{"tag":"@returns","content":[{"kind":"text","text":"Returns a Promise that resolves to "},{"kind":"code","text":"`DownloadPauseState`"},{"kind":"text","text":" object."}]}]},"type":{"type":"reference","typeArguments":[{"type":"reference","name":"DownloadPauseState"}],"name":"Promise","qualifiedName":"Promise","package":"typescript"}}]},{"name":"resumeAsync","kind":2048,"signatures":[{"name":"resumeAsync","kind":4096,"comment":{"summary":[{"kind":"text","text":"Resume a paused download operation."}],"blockTags":[{"tag":"@returns","content":[{"kind":"text","text":"Returns a Promise that resolves to "},{"kind":"code","text":"`FileSystemDownloadResult`"},{"kind":"text","text":" object, or to "},{"kind":"code","text":"`undefined`"},{"kind":"text","text":" when task was cancelled."}]}]},"type":{"type":"reference","typeArguments":[{"type":"union","types":[{"type":"intrinsic","name":"undefined"},{"type":"reference","name":"FileSystemDownloadResult"}]}],"name":"Promise","qualifiedName":"Promise","package":"typescript"}}]},{"name":"savable","kind":2048,"signatures":[{"name":"savable","kind":4096,"comment":{"summary":[{"kind":"text","text":"Method to get the object which can be saved with "},{"kind":"code","text":"`AsyncStorage`"},{"kind":"text","text":" for future retrieval."}],"blockTags":[{"tag":"@returns","content":[{"kind":"text","text":"Returns object in shape of "},{"kind":"code","text":"`DownloadPauseState`"},{"kind":"text","text":" type."}]}]},"type":{"type":"reference","name":"DownloadPauseState"}}]}],"extendedTypes":[{"type":"reference","typeArguments":[{"type":"reference","name":"DownloadProgressData"}],"name":"FileSystemCancellableNetworkTask"}]},{"name":"FileSystemCancellableNetworkTask","kind":128,"flags":{"isAbstract":true},"children":[{"name":"constructor","kind":512,"signatures":[{"name":"new FileSystemCancellableNetworkTask","kind":16384,"typeParameter":[{"name":"T","kind":131072,"type":{"type":"union","types":[{"type":"reference","name":"DownloadProgressData"},{"type":"reference","name":"UploadProgressData"}]}}],"type":{"type":"reference","typeArguments":[{"type":"reference","name":"T"}],"name":"FileSystemCancellableNetworkTask"}}]},{"name":"cancelAsync","kind":2048,"flags":{"isPublic":true},"signatures":[{"name":"cancelAsync","kind":4096,"type":{"type":"reference","typeArguments":[{"type":"intrinsic","name":"void"}],"name":"Promise","qualifiedName":"Promise","package":"typescript"}}]}],"typeParameters":[{"name":"T","kind":131072,"type":{"type":"union","types":[{"type":"reference","name":"DownloadProgressData"},{"type":"reference","name":"UploadProgressData"}]}}],"extendedBy":[{"type":"reference","name":"UploadTask"},{"type":"reference","name":"DownloadResumable"}]},{"name":"UploadTask","kind":128,"children":[{"name":"constructor","kind":512,"signatures":[{"name":"new UploadTask","kind":16384,"parameters":[{"name":"url","kind":32768,"type":{"type":"intrinsic","name":"string"}},{"name":"fileUri","kind":32768,"type":{"type":"intrinsic","name":"string"}},{"name":"options","kind":32768,"flags":{"isOptional":true},"type":{"type":"reference","name":"FileSystemUploadOptions"}},{"name":"callback","kind":32768,"flags":{"isOptional":true},"type":{"type":"reference","typeArguments":[{"type":"reference","name":"UploadProgressData"}],"name":"FileSystemNetworkTaskProgressCallback"}}],"type":{"type":"reference","name":"UploadTask"},"overwrites":{"type":"reference","name":"FileSystemCancellableNetworkTask.constructor"}}],"overwrites":{"type":"reference","name":"FileSystemCancellableNetworkTask.constructor"}},{"name":"cancelAsync","kind":2048,"flags":{"isPublic":true},"signatures":[{"name":"cancelAsync","kind":4096,"type":{"type":"reference","typeArguments":[{"type":"intrinsic","name":"void"}],"name":"Promise","qualifiedName":"Promise","package":"typescript"},"inheritedFrom":{"type":"reference","name":"FileSystemCancellableNetworkTask.cancelAsync"}}],"inheritedFrom":{"type":"reference","name":"FileSystemCancellableNetworkTask.cancelAsync"}},{"name":"uploadAsync","kind":2048,"flags":{"isPublic":true},"signatures":[{"name":"uploadAsync","kind":4096,"type":{"type":"reference","typeArguments":[{"type":"union","types":[{"type":"intrinsic","name":"undefined"},{"type":"reference","name":"FileSystemUploadResult"}]}],"name":"Promise","qualifiedName":"Promise","package":"typescript"}}]}],"extendedTypes":[{"type":"reference","typeArguments":[{"type":"reference","name":"UploadProgressData"}],"name":"FileSystemCancellableNetworkTask"}]},{"name":"DeletingOptions","kind":4194304,"type":{"type":"reflection","declaration":{"name":"__type","kind":65536,"children":[{"name":"idempotent","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"If "},{"kind":"code","text":"`true`"},{"kind":"text","text":", don't throw an error if there is no file or directory at this URI."}],"blockTags":[{"tag":"@default","content":[{"kind":"text","text":"false"}]}]},"type":{"type":"intrinsic","name":"boolean"}}]}}},{"name":"DownloadOptions","kind":4194304,"type":{"type":"reflection","declaration":{"name":"__type","kind":65536,"children":[{"name":"cache","kind":1024,"flags":{"isOptional":true},"type":{"type":"intrinsic","name":"boolean"}},{"name":"headers","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"An object containing all the HTTP header fields and their values for the download network request. The keys and values of the object are the header names and values respectively."}]},"type":{"type":"reference","typeArguments":[{"type":"intrinsic","name":"string"},{"type":"intrinsic","name":"string"}],"name":"Record","qualifiedName":"Record","package":"typescript"}},{"name":"md5","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"If "},{"kind":"code","text":"`true`"},{"kind":"text","text":", include the MD5 hash of the file in the returned object. Provided for convenience since it is common to check the integrity of a file immediately after downloading."}],"blockTags":[{"tag":"@default","content":[{"kind":"text","text":"false"}]}]},"type":{"type":"intrinsic","name":"boolean"}},{"name":"sessionType","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"A session type. Determines if tasks can be handled in the background. On Android, sessions always work in the background and you can't change it."}],"blockTags":[{"tag":"@default","content":[{"kind":"text","text":"FileSystemSessionType.BACKGROUND"}]},{"tag":"@platform","content":[{"kind":"text","text":"ios"}]}]},"type":{"type":"reference","name":"FileSystemSessionType"}}]}}},{"name":"DownloadPauseState","kind":4194304,"type":{"type":"reflection","declaration":{"name":"__type","kind":65536,"children":[{"name":"fileUri","kind":1024,"comment":{"summary":[{"kind":"text","text":"The local URI of the file to download to. If there is no file at this URI, a new one is created. If there is a file at this URI, its contents are replaced."}]},"type":{"type":"intrinsic","name":"string"}},{"name":"options","kind":1024,"comment":{"summary":[{"kind":"text","text":"Object representing the file download options."}]},"type":{"type":"reference","name":"DownloadOptions"}},{"name":"resumeData","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"The string which allows the API to resume a paused download."}]},"type":{"type":"intrinsic","name":"string"}},{"name":"url","kind":1024,"comment":{"summary":[{"kind":"text","text":"The remote URI to download from."}]},"type":{"type":"intrinsic","name":"string"}}]}}},{"name":"DownloadProgressCallback","kind":4194304,"comment":{"summary":[],"blockTags":[{"tag":"@deprecated","content":[{"kind":"text","text":"use "},{"kind":"code","text":"`FileSystemNetworkTaskProgressCallback`"},{"kind":"text","text":" instead."}]}]},"type":{"type":"reference","typeArguments":[{"type":"reference","name":"DownloadProgressData"}],"name":"FileSystemNetworkTaskProgressCallback"}},{"name":"DownloadProgressData","kind":4194304,"type":{"type":"reflection","declaration":{"name":"__type","kind":65536,"children":[{"name":"totalBytesExpectedToWrite","kind":1024,"comment":{"summary":[{"kind":"text","text":"The total bytes expected to be written by the download operation. A value of "},{"kind":"code","text":"`-1`"},{"kind":"text","text":" means that the server did not return the "},{"kind":"code","text":"`Content-Length`"},{"kind":"text","text":" header\nand the total size is unknown. Without this header, you won't be able to track the download progress."}]},"type":{"type":"intrinsic","name":"number"}},{"name":"totalBytesWritten","kind":1024,"comment":{"summary":[{"kind":"text","text":"The total bytes written by the download operation."}]},"type":{"type":"intrinsic","name":"number"}}]}}},{"name":"DownloadResult","kind":4194304,"comment":{"summary":[],"blockTags":[{"tag":"@deprecated","content":[{"kind":"text","text":"Use "},{"kind":"code","text":"`FileSystemDownloadResult`"},{"kind":"text","text":" instead."}]}]},"type":{"type":"reference","name":"FileSystemDownloadResult"}},{"name":"FileInfo","kind":4194304,"type":{"type":"union","types":[{"type":"reflection","declaration":{"name":"__type","kind":65536,"children":[{"name":"exists","kind":1024,"comment":{"summary":[{"kind":"text","text":"Signifies that the requested file exist."}]},"type":{"type":"literal","value":true}},{"name":"isDirectory","kind":1024,"comment":{"summary":[{"kind":"text","text":"Boolean set to "},{"kind":"code","text":"`true`"},{"kind":"text","text":" if this is a directory and "},{"kind":"code","text":"`false`"},{"kind":"text","text":" if it is a file."}]},"type":{"type":"intrinsic","name":"boolean"}},{"name":"md5","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"Present if the "},{"kind":"code","text":"`md5`"},{"kind":"text","text":" option was truthy. Contains the MD5 hash of the file."}]},"type":{"type":"intrinsic","name":"string"}},{"name":"modificationTime","kind":1024,"comment":{"summary":[{"kind":"text","text":"The last modification time of the file expressed in seconds since epoch."}]},"type":{"type":"intrinsic","name":"number"}},{"name":"size","kind":1024,"comment":{"summary":[{"kind":"text","text":"The size of the file in bytes. If operating on a source such as an iCloud file, only present if the "},{"kind":"code","text":"`size`"},{"kind":"text","text":" option was truthy."}]},"type":{"type":"intrinsic","name":"number"}},{"name":"uri","kind":1024,"comment":{"summary":[{"kind":"text","text":"A "},{"kind":"code","text":"`file://`"},{"kind":"text","text":" URI pointing to the file. This is the same as the "},{"kind":"code","text":"`fileUri`"},{"kind":"text","text":" input parameter."}]},"type":{"type":"intrinsic","name":"string"}}]}},{"type":"reflection","declaration":{"name":"__type","kind":65536,"children":[{"name":"exists","kind":1024,"type":{"type":"literal","value":false}},{"name":"isDirectory","kind":1024,"type":{"type":"literal","value":false}},{"name":"uri","kind":1024,"type":{"type":"intrinsic","name":"string"}}]}}]}},{"name":"FileSystemAcceptedUploadHttpMethod","kind":4194304,"type":{"type":"union","types":[{"type":"literal","value":"POST"},{"type":"literal","value":"PUT"},{"type":"literal","value":"PATCH"}]}},{"name":"FileSystemDownloadResult","kind":4194304,"type":{"type":"intersection","types":[{"type":"reference","name":"FileSystemHttpResult"},{"type":"reflection","declaration":{"name":"__type","kind":65536,"children":[{"name":"md5","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"Present if the "},{"kind":"code","text":"`md5`"},{"kind":"text","text":" option was truthy. Contains the MD5 hash of the file."}]},"type":{"type":"intrinsic","name":"string"}},{"name":"uri","kind":1024,"comment":{"summary":[{"kind":"text","text":"A "},{"kind":"code","text":"`file://`"},{"kind":"text","text":" URI pointing to the file. This is the same as the "},{"kind":"code","text":"`fileUri`"},{"kind":"text","text":" input parameter."}]},"type":{"type":"intrinsic","name":"string"}}]}}]}},{"name":"FileSystemHttpResult","kind":4194304,"type":{"type":"reflection","declaration":{"name":"__type","kind":65536,"children":[{"name":"headers","kind":1024,"comment":{"summary":[{"kind":"text","text":"An object containing all the HTTP response header fields and their values for the download network request.\nThe keys and values of the object are the header names and values respectively."}]},"type":{"type":"reference","typeArguments":[{"type":"intrinsic","name":"string"},{"type":"intrinsic","name":"string"}],"name":"Record","qualifiedName":"Record","package":"typescript"}},{"name":"mimeType","kind":1024,"type":{"type":"union","types":[{"type":"intrinsic","name":"string"},{"type":"literal","value":null}]}},{"name":"status","kind":1024,"comment":{"summary":[{"kind":"text","text":"The HTTP response status code for the download network request."}]},"type":{"type":"intrinsic","name":"number"}}]}}},{"name":"FileSystemNetworkTaskProgressCallback","kind":4194304,"typeParameters":[{"name":"T","kind":131072,"type":{"type":"union","types":[{"type":"reference","name":"DownloadProgressData"},{"type":"reference","name":"UploadProgressData"}]}}],"type":{"type":"reflection","declaration":{"name":"__type","kind":65536,"signatures":[{"name":"__type","kind":4096,"parameters":[{"name":"data","kind":32768,"type":{"type":"reference","name":"T"}}],"type":{"type":"intrinsic","name":"void"}}]}}},{"name":"FileSystemRequestDirectoryPermissionsResult","kind":4194304,"type":{"type":"union","types":[{"type":"reflection","declaration":{"name":"__type","kind":65536,"children":[{"name":"granted","kind":1024,"type":{"type":"literal","value":false}}]}},{"type":"reflection","declaration":{"name":"__type","kind":65536,"children":[{"name":"directoryUri","kind":1024,"comment":{"summary":[{"kind":"text","text":"The [SAF URI](#saf-uri) to the user's selected directory. Available only if permissions were granted."}]},"type":{"type":"intrinsic","name":"string"}},{"name":"granted","kind":1024,"type":{"type":"literal","value":true}}]}}]}},{"name":"FileSystemUploadOptions","kind":4194304,"type":{"type":"intersection","types":[{"type":"union","types":[{"type":"reference","name":"UploadOptionsBinary"},{"type":"reference","name":"UploadOptionsMultipart"}]},{"type":"reflection","declaration":{"name":"__type","kind":65536,"children":[{"name":"headers","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"An object containing all the HTTP header fields and their values for the upload network request.\nThe keys and values of the object are the header names and values respectively."}]},"type":{"type":"reference","typeArguments":[{"type":"intrinsic","name":"string"},{"type":"intrinsic","name":"string"}],"name":"Record","qualifiedName":"Record","package":"typescript"}},{"name":"httpMethod","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"The request method."}],"blockTags":[{"tag":"@default","content":[{"kind":"text","text":"FileSystemAcceptedUploadHttpMethod.POST"}]}]},"type":{"type":"reference","name":"FileSystemAcceptedUploadHttpMethod"}},{"name":"sessionType","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"A session type. Determines if tasks can be handled in the background. On Android, sessions always work in the background and you can't change it."}],"blockTags":[{"tag":"@default","content":[{"kind":"text","text":"FileSystemSessionType.BACKGROUND"}]},{"tag":"@platform","content":[{"kind":"text","text":"ios"}]}]},"type":{"type":"reference","name":"FileSystemSessionType"}}]}}]}},{"name":"FileSystemUploadResult","kind":4194304,"type":{"type":"intersection","types":[{"type":"reference","name":"FileSystemHttpResult"},{"type":"reflection","declaration":{"name":"__type","kind":65536,"children":[{"name":"body","kind":1024,"comment":{"summary":[{"kind":"text","text":"The body of the server response."}]},"type":{"type":"intrinsic","name":"string"}}]}}]}},{"name":"InfoOptions","kind":4194304,"type":{"type":"reflection","declaration":{"name":"__type","kind":65536,"children":[{"name":"md5","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"Whether to return the MD5 hash of the file."}],"blockTags":[{"tag":"@default","content":[{"kind":"text","text":"false"}]}]},"type":{"type":"intrinsic","name":"boolean"}},{"name":"size","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"Explicitly specify that the file size should be included. For example, skipping this can prevent downloading the file if it's stored in iCloud.\nThe size is always returned for "},{"kind":"code","text":"`file://`"},{"kind":"text","text":" locations."}]},"type":{"type":"intrinsic","name":"boolean"}}]}}},{"name":"MakeDirectoryOptions","kind":4194304,"type":{"type":"reflection","declaration":{"name":"__type","kind":65536,"children":[{"name":"intermediates","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"If "},{"kind":"code","text":"`true`"},{"kind":"text","text":", don't throw an error if there is no file or directory at this URI."}],"blockTags":[{"tag":"@default","content":[{"kind":"text","text":"false"}]}]},"type":{"type":"intrinsic","name":"boolean"}}]}}},{"name":"ProgressEvent","kind":4194304,"typeParameters":[{"name":"T","kind":131072}],"type":{"type":"reflection","declaration":{"name":"__type","kind":65536,"children":[{"name":"data","kind":1024,"type":{"type":"reference","name":"T"}},{"name":"uuid","kind":1024,"type":{"type":"intrinsic","name":"string"}}]}}},{"name":"ReadingOptions","kind":4194304,"type":{"type":"reflection","declaration":{"name":"__type","kind":65536,"children":[{"name":"encoding","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"The encoding format to use when reading the file."}],"blockTags":[{"tag":"@default","content":[{"kind":"text","text":"EncodingType.UTF8"}]}]},"type":{"type":"union","types":[{"type":"reference","name":"EncodingType"},{"type":"literal","value":"utf8"},{"type":"literal","value":"base64"}]}},{"name":"length","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"Optional number of bytes to read. This option is only used when "},{"kind":"code","text":"`encoding: FileSystem.EncodingType.Base64`"},{"kind":"text","text":" and "},{"kind":"code","text":"`position`"},{"kind":"text","text":" is defined."}]},"type":{"type":"intrinsic","name":"number"}},{"name":"position","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"Optional number of bytes to skip. This option is only used when "},{"kind":"code","text":"`encoding: FileSystem.EncodingType.Base64`"},{"kind":"text","text":" and "},{"kind":"code","text":"`length`"},{"kind":"text","text":" is defined."}]},"type":{"type":"intrinsic","name":"number"}}]}}},{"name":"RelocatingOptions","kind":4194304,"type":{"type":"reflection","declaration":{"name":"__type","kind":65536,"children":[{"name":"from","kind":1024,"comment":{"summary":[{"kind":"text","text":"URI or [SAF](#saf-uri) URI to the asset, file, or directory. See [supported URI schemes](#supported-uri-schemes-1)."}]},"type":{"type":"intrinsic","name":"string"}},{"name":"to","kind":1024,"comment":{"summary":[{"kind":"code","text":"`file://`"},{"kind":"text","text":" URI to the file or directory which should be its new location."}]},"type":{"type":"intrinsic","name":"string"}}]}}},{"name":"UploadOptionsBinary","kind":4194304,"comment":{"summary":[{"kind":"text","text":"Upload options when upload type is set to binary."}]},"type":{"type":"reflection","declaration":{"name":"__type","kind":65536,"children":[{"name":"uploadType","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"Upload type determines how the file will be sent to the server.\nValue will be "},{"kind":"code","text":"`FileSystemUploadType.BINARY_CONTENT`"},{"kind":"text","text":"."}]},"type":{"type":"reference","name":"FileSystemUploadType"}}]}}},{"name":"UploadOptionsMultipart","kind":4194304,"comment":{"summary":[{"kind":"text","text":"Upload options when upload type is set to multipart."}]},"type":{"type":"reflection","declaration":{"name":"__type","kind":65536,"children":[{"name":"fieldName","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"The name of the field which will hold uploaded file. Defaults to the file name without an extension."}]},"type":{"type":"intrinsic","name":"string"}},{"name":"mimeType","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"The MIME type of the provided file. If not provided, the module will try to guess it based on the extension."}]},"type":{"type":"intrinsic","name":"string"}},{"name":"parameters","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"Additional form properties. They will be located in the request body."}]},"type":{"type":"reference","typeArguments":[{"type":"intrinsic","name":"string"},{"type":"intrinsic","name":"string"}],"name":"Record","qualifiedName":"Record","package":"typescript"}},{"name":"uploadType","kind":1024,"comment":{"summary":[{"kind":"text","text":"Upload type determines how the file will be sent to the server.\nValue will be "},{"kind":"code","text":"`FileSystemUploadType.MULTIPART`"},{"kind":"text","text":"."}]},"type":{"type":"reference","name":"FileSystemUploadType"}}]}}},{"name":"UploadProgressData","kind":4194304,"type":{"type":"reflection","declaration":{"name":"__type","kind":65536,"children":[{"name":"totalBytesExpectedToSend","kind":1024,"comment":{"summary":[{"kind":"text","text":"The total bytes expected to be sent by the upload operation."}]},"type":{"type":"intrinsic","name":"number"}},{"name":"totalBytesSent","kind":1024,"comment":{"summary":[{"kind":"text","text":"The total bytes sent by the upload operation."}]},"type":{"type":"intrinsic","name":"number"}}]}}},{"name":"WritingOptions","kind":4194304,"type":{"type":"reflection","declaration":{"name":"__type","kind":65536,"children":[{"name":"encoding","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"The encoding format to use when writing the file."}],"blockTags":[{"tag":"@default","content":[{"kind":"text","text":"FileSystem.EncodingType.UTF8"}]}]},"type":{"type":"union","types":[{"type":"reference","name":"EncodingType"},{"type":"literal","value":"utf8"},{"type":"literal","value":"base64"}]}}]}}},{"name":"bundleDirectory","kind":32,"type":{"type":"union","types":[{"type":"literal","value":null},{"type":"intrinsic","name":"string"}]}},{"name":"bundledAssets","kind":32,"type":{"type":"union","types":[{"type":"literal","value":null},{"type":"intrinsic","name":"string"}]}},{"name":"cacheDirectory","kind":32,"flags":{"isConst":true},"comment":{"summary":[{"kind":"code","text":"`file://`"},{"kind":"text","text":" URI pointing to the directory where temporary files used by this app will be stored.\nFiles stored here may be automatically deleted by the system when low on storage.\nExample uses are for downloaded or generated files that the app just needs for one-time usage."}]},"type":{"type":"union","types":[{"type":"literal","value":null},{"type":"intrinsic","name":"string"}]},"defaultValue":"..."},{"name":"documentDirectory","kind":32,"flags":{"isConst":true},"comment":{"summary":[{"kind":"code","text":"`file://`"},{"kind":"text","text":" URI pointing to the directory where user documents for this app will be stored.\nFiles stored here will remain until explicitly deleted by the app. Ends with a trailing "},{"kind":"code","text":"`/`"},{"kind":"text","text":".\nExample uses are for files the user saves that they expect to see again."}]},"type":{"type":"union","types":[{"type":"literal","value":null},{"type":"intrinsic","name":"string"}]},"defaultValue":"..."},{"name":"copyAsync","kind":64,"signatures":[{"name":"copyAsync","kind":4096,"comment":{"summary":[{"kind":"text","text":"Create a copy of a file or directory. Directories are recursively copied with all of their contents.\nIt can be also used to copy content shared by other apps to local filesystem."}]},"parameters":[{"name":"options","kind":32768,"comment":{"summary":[{"kind":"text","text":"A map of move options represented by ["},{"kind":"code","text":"`RelocatingOptions`"},{"kind":"text","text":"](#relocatingoptions) type."}]},"type":{"type":"reference","name":"RelocatingOptions"}}],"type":{"type":"reference","typeArguments":[{"type":"intrinsic","name":"void"}],"name":"Promise","qualifiedName":"Promise","package":"typescript"}}]},{"name":"createDownloadResumable","kind":64,"signatures":[{"name":"createDownloadResumable","kind":4096,"comment":{"summary":[{"kind":"text","text":"Create a "},{"kind":"code","text":"`DownloadResumable`"},{"kind":"text","text":" object which can start, pause, and resume a download of contents at a remote URI to a file in the app's file system.\n> Note: You need to call "},{"kind":"code","text":"`downloadAsync()`"},{"kind":"text","text":", on a "},{"kind":"code","text":"`DownloadResumable`"},{"kind":"text","text":" instance to initiate the download.\nThe "},{"kind":"code","text":"`DownloadResumable`"},{"kind":"text","text":" object has a callback that provides download progress updates.\nDownloads can be resumed across app restarts by using "},{"kind":"code","text":"`AsyncStorage`"},{"kind":"text","text":" to store the "},{"kind":"code","text":"`DownloadResumable.savable()`"},{"kind":"text","text":" object for later retrieval.\nThe "},{"kind":"code","text":"`savable`"},{"kind":"text","text":" object contains the arguments required to initialize a new "},{"kind":"code","text":"`DownloadResumable`"},{"kind":"text","text":" object to resume the download after an app restart.\nThe directory for a local file uri must exist prior to calling this function."}]},"parameters":[{"name":"uri","kind":32768,"comment":{"summary":[{"kind":"text","text":"The remote URI to download from."}]},"type":{"type":"intrinsic","name":"string"}},{"name":"fileUri","kind":32768,"comment":{"summary":[{"kind":"text","text":"The local URI of the file to download to. If there is no file at this URI, a new one is created.\nIf there is a file at this URI, its contents are replaced. The directory for the file must exist."}]},"type":{"type":"intrinsic","name":"string"}},{"name":"options","kind":32768,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"A map of download options represented by ["},{"kind":"code","text":"`DownloadOptions`"},{"kind":"text","text":"](#downloadoptions) type."}]},"type":{"type":"reference","name":"DownloadOptions"}},{"name":"callback","kind":32768,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"This function is called on each data write to update the download progress.\n> **Note**: When the app has been moved to the background, this callback won't be fired until it's moved to the foreground."}]},"type":{"type":"reference","typeArguments":[{"type":"reference","name":"DownloadProgressData"}],"name":"FileSystemNetworkTaskProgressCallback"}},{"name":"resumeData","kind":32768,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"The string which allows the api to resume a paused download. This is set on the "},{"kind":"code","text":"`DownloadResumable`"},{"kind":"text","text":" object automatically when a download is paused.\nWhen initializing a new "},{"kind":"code","text":"`DownloadResumable`"},{"kind":"text","text":" this should be "},{"kind":"code","text":"`null`"},{"kind":"text","text":"."}]},"type":{"type":"intrinsic","name":"string"}}],"type":{"type":"reference","name":"DownloadResumable"}}]},{"name":"createUploadTask","kind":64,"signatures":[{"name":"createUploadTask","kind":4096,"parameters":[{"name":"url","kind":32768,"type":{"type":"intrinsic","name":"string"}},{"name":"fileUri","kind":32768,"type":{"type":"intrinsic","name":"string"}},{"name":"options","kind":32768,"flags":{"isOptional":true},"type":{"type":"reference","name":"FileSystemUploadOptions"}},{"name":"callback","kind":32768,"flags":{"isOptional":true},"type":{"type":"reference","typeArguments":[{"type":"reference","name":"UploadProgressData"}],"name":"FileSystemNetworkTaskProgressCallback"}}],"type":{"type":"reference","name":"UploadTask"}}]},{"name":"deleteAsync","kind":64,"signatures":[{"name":"deleteAsync","kind":4096,"comment":{"summary":[{"kind":"text","text":"Delete a file or directory. If the URI points to a directory, the directory and all its contents are recursively deleted."}]},"parameters":[{"name":"fileUri","kind":32768,"comment":{"summary":[{"kind":"code","text":"`file://`"},{"kind":"text","text":" or [SAF](#saf-uri) URI to the file or directory."}]},"type":{"type":"intrinsic","name":"string"}},{"name":"options","kind":32768,"comment":{"summary":[{"kind":"text","text":"A map of write options represented by ["},{"kind":"code","text":"`DeletingOptions`"},{"kind":"text","text":"](#deletingoptions) type."}]},"type":{"type":"reference","name":"DeletingOptions"},"defaultValue":"{}"}],"type":{"type":"reference","typeArguments":[{"type":"intrinsic","name":"void"}],"name":"Promise","qualifiedName":"Promise","package":"typescript"}}]},{"name":"deleteLegacyDocumentDirectoryAndroid","kind":64,"signatures":[{"name":"deleteLegacyDocumentDirectoryAndroid","kind":4096,"type":{"type":"reference","typeArguments":[{"type":"intrinsic","name":"void"}],"name":"Promise","qualifiedName":"Promise","package":"typescript"}}]},{"name":"downloadAsync","kind":64,"signatures":[{"name":"downloadAsync","kind":4096,"comment":{"summary":[{"kind":"text","text":"Download the contents at a remote URI to a file in the app's file system. The directory for a local file uri must exist prior to calling this function."}],"blockTags":[{"tag":"@example","content":[{"kind":"code","text":"```js\nFileSystem.downloadAsync(\n 'http://techslides.com/demos/sample-videos/small.mp4',\n FileSystem.documentDirectory + 'small.mp4'\n)\n .then(({ uri }) => {\n console.log('Finished downloading to ', uri);\n })\n .catch(error => {\n console.error(error);\n });\n```"}]},{"tag":"@returns","content":[{"kind":"text","text":"Returns a Promise that resolves to a "},{"kind":"code","text":"`FileSystemDownloadResult`"},{"kind":"text","text":" object."}]}]},"parameters":[{"name":"uri","kind":32768,"comment":{"summary":[{"kind":"text","text":"The remote URI to download from."}]},"type":{"type":"intrinsic","name":"string"}},{"name":"fileUri","kind":32768,"comment":{"summary":[{"kind":"text","text":"The local URI of the file to download to. If there is no file at this URI, a new one is created.\nIf there is a file at this URI, its contents are replaced. The directory for the file must exist."}]},"type":{"type":"intrinsic","name":"string"}},{"name":"options","kind":32768,"comment":{"summary":[{"kind":"text","text":"A map of download options represented by ["},{"kind":"code","text":"`DownloadOptions`"},{"kind":"text","text":"](#downloadoptions) type."}]},"type":{"type":"reference","name":"DownloadOptions"},"defaultValue":"{}"}],"type":{"type":"reference","typeArguments":[{"type":"reference","name":"FileSystemDownloadResult"}],"name":"Promise","qualifiedName":"Promise","package":"typescript"}}]},{"name":"getContentUriAsync","kind":64,"signatures":[{"name":"getContentUriAsync","kind":4096,"comment":{"summary":[{"kind":"text","text":"Takes a "},{"kind":"code","text":"`file://`"},{"kind":"text","text":" URI and converts it into content URI ("},{"kind":"code","text":"`content://`"},{"kind":"text","text":") so that it can be accessed by other applications outside of Expo."}],"blockTags":[{"tag":"@example","content":[{"kind":"code","text":"```js\nFileSystem.getContentUriAsync(uri).then(cUri => {\n console.log(cUri);\n IntentLauncher.startActivityAsync('android.intent.action.VIEW', {\n data: cUri,\n flags: 1,\n });\n});\n```"}]},{"tag":"@returns","content":[{"kind":"text","text":"Returns a Promise that resolves to a "},{"kind":"code","text":"`string`"},{"kind":"text","text":" containing a "},{"kind":"code","text":"`content://`"},{"kind":"text","text":" URI pointing to the file.\nThe URI is the same as the "},{"kind":"code","text":"`fileUri`"},{"kind":"text","text":" input parameter but in a different format."}]},{"tag":"@platform","content":[{"kind":"text","text":"android"}]}]},"parameters":[{"name":"fileUri","kind":32768,"comment":{"summary":[{"kind":"text","text":"The local URI of the file. If there is no file at this URI, an exception will be thrown."}]},"type":{"type":"intrinsic","name":"string"}}],"type":{"type":"reference","typeArguments":[{"type":"intrinsic","name":"string"}],"name":"Promise","qualifiedName":"Promise","package":"typescript"}}]},{"name":"getFreeDiskStorageAsync","kind":64,"signatures":[{"name":"getFreeDiskStorageAsync","kind":4096,"comment":{"summary":[{"kind":"text","text":"Gets the available internal disk storage size, in bytes. This returns the free space on the data partition that hosts all of the internal storage for all apps on the device."}],"blockTags":[{"tag":"@returns","content":[{"kind":"text","text":"Returns a Promise that resolves to the number of bytes available on the internal disk, or JavaScript's ["},{"kind":"code","text":"`MAX_SAFE_INTEGER`"},{"kind":"text","text":"](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Number/MAX_SAFE_INTEGER)\nif the capacity is greater than 253 - 1 bytes."}]}]},"type":{"type":"reference","typeArguments":[{"type":"intrinsic","name":"number"}],"name":"Promise","qualifiedName":"Promise","package":"typescript"}}]},{"name":"getInfoAsync","kind":64,"signatures":[{"name":"getInfoAsync","kind":4096,"comment":{"summary":[{"kind":"text","text":"Get metadata information about a file, directory or external content/asset."}],"blockTags":[{"tag":"@returns","content":[{"kind":"text","text":"A Promise that resolves to a "},{"kind":"code","text":"`FileInfo`"},{"kind":"text","text":" object. If no item exists at this URI,\nthe returned Promise resolves to "},{"kind":"code","text":"`FileInfo`"},{"kind":"text","text":" object in form of "},{"kind":"code","text":"`{ exists: false, isDirectory: false }`"},{"kind":"text","text":"."}]}]},"parameters":[{"name":"fileUri","kind":32768,"comment":{"summary":[{"kind":"text","text":"URI to the file or directory. See [supported URI schemes](#supported-uri-schemes)."}]},"type":{"type":"intrinsic","name":"string"}},{"name":"options","kind":32768,"comment":{"summary":[{"kind":"text","text":"A map of options represented by ["},{"kind":"code","text":"`GetInfoAsyncOptions`"},{"kind":"text","text":"](#getinfoasyncoptions) type."}]},"type":{"type":"reference","name":"InfoOptions"},"defaultValue":"{}"}],"type":{"type":"reference","typeArguments":[{"type":"reference","name":"FileInfo"}],"name":"Promise","qualifiedName":"Promise","package":"typescript"}}]},{"name":"getTotalDiskCapacityAsync","kind":64,"signatures":[{"name":"getTotalDiskCapacityAsync","kind":4096,"comment":{"summary":[{"kind":"text","text":"Gets total internal disk storage size, in bytes. This is the total capacity of the data partition that hosts all the internal storage for all apps on the device."}],"blockTags":[{"tag":"@returns","content":[{"kind":"text","text":"Returns a Promise that resolves to a number that specifies the total internal disk storage capacity in bytes, or JavaScript's ["},{"kind":"code","text":"`MAX_SAFE_INTEGER`"},{"kind":"text","text":"](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Number/MAX_SAFE_INTEGER)\nif the capacity is greater than 253 - 1 bytes."}]}]},"type":{"type":"reference","typeArguments":[{"type":"intrinsic","name":"number"}],"name":"Promise","qualifiedName":"Promise","package":"typescript"}}]},{"name":"makeDirectoryAsync","kind":64,"signatures":[{"name":"makeDirectoryAsync","kind":4096,"comment":{"summary":[{"kind":"text","text":"Create a new empty directory."}]},"parameters":[{"name":"fileUri","kind":32768,"comment":{"summary":[{"kind":"code","text":"`file://`"},{"kind":"text","text":" URI to the new directory to create."}]},"type":{"type":"intrinsic","name":"string"}},{"name":"options","kind":32768,"comment":{"summary":[{"kind":"text","text":"A map of create directory options represented by ["},{"kind":"code","text":"`MakeDirectoryOptions`"},{"kind":"text","text":"](#makedirectoryoptions) type."}]},"type":{"type":"reference","name":"MakeDirectoryOptions"},"defaultValue":"{}"}],"type":{"type":"reference","typeArguments":[{"type":"intrinsic","name":"void"}],"name":"Promise","qualifiedName":"Promise","package":"typescript"}}]},{"name":"moveAsync","kind":64,"signatures":[{"name":"moveAsync","kind":4096,"comment":{"summary":[{"kind":"text","text":"Move a file or directory to a new location."}]},"parameters":[{"name":"options","kind":32768,"comment":{"summary":[{"kind":"text","text":"A map of move options represented by ["},{"kind":"code","text":"`RelocatingOptions`"},{"kind":"text","text":"](#relocatingoptions) type."}]},"type":{"type":"reference","name":"RelocatingOptions"}}],"type":{"type":"reference","typeArguments":[{"type":"intrinsic","name":"void"}],"name":"Promise","qualifiedName":"Promise","package":"typescript"}}]},{"name":"readAsStringAsync","kind":64,"signatures":[{"name":"readAsStringAsync","kind":4096,"comment":{"summary":[{"kind":"text","text":"Read the entire contents of a file as a string. Binary will be returned in raw format, you will need to append "},{"kind":"code","text":"`data:image/png;base64,`"},{"kind":"text","text":" to use it as Base64."}],"blockTags":[{"tag":"@returns","content":[{"kind":"text","text":"A Promise that resolves to a string containing the entire contents of the file."}]}]},"parameters":[{"name":"fileUri","kind":32768,"comment":{"summary":[{"kind":"code","text":"`file://`"},{"kind":"text","text":" or [SAF](#saf-uri) URI to the file or directory."}]},"type":{"type":"intrinsic","name":"string"}},{"name":"options","kind":32768,"comment":{"summary":[{"kind":"text","text":"A map of read options represented by ["},{"kind":"code","text":"`ReadingOptions`"},{"kind":"text","text":"](#readingoptions) type."}]},"type":{"type":"reference","name":"ReadingOptions"},"defaultValue":"{}"}],"type":{"type":"reference","typeArguments":[{"type":"intrinsic","name":"string"}],"name":"Promise","qualifiedName":"Promise","package":"typescript"}}]},{"name":"readDirectoryAsync","kind":64,"signatures":[{"name":"readDirectoryAsync","kind":4096,"comment":{"summary":[{"kind":"text","text":"Enumerate the contents of a directory."}],"blockTags":[{"tag":"@returns","content":[{"kind":"text","text":"A Promise that resolves to an array of strings, each containing the name of a file or directory contained in the directory at "},{"kind":"code","text":"`fileUri`"},{"kind":"text","text":"."}]}]},"parameters":[{"name":"fileUri","kind":32768,"comment":{"summary":[{"kind":"code","text":"`file://`"},{"kind":"text","text":" URI to the directory."}]},"type":{"type":"intrinsic","name":"string"}}],"type":{"type":"reference","typeArguments":[{"type":"array","elementType":{"type":"intrinsic","name":"string"}}],"name":"Promise","qualifiedName":"Promise","package":"typescript"}}]},{"name":"uploadAsync","kind":64,"signatures":[{"name":"uploadAsync","kind":4096,"comment":{"summary":[{"kind":"text","text":"Upload the contents of the file pointed by "},{"kind":"code","text":"`fileUri`"},{"kind":"text","text":" to the remote url."}],"blockTags":[{"tag":"@example","content":[{"kind":"text","text":"**Client**\n\n"},{"kind":"code","text":"```js\nimport * as FileSystem from 'expo-file-system';\n\ntry {\n const response = await FileSystem.uploadAsync(`http://192.168.0.1:1234/binary-upload`, fileUri, {\n fieldName: 'file',\n httpMethod: 'PATCH',\n uploadType: FileSystem.FileSystemUploadType.BINARY_CONTENT,\n });\n console.log(JSON.stringify(response, null, 4));\n} catch (error) {\n console.log(error);\n}\n```"},{"kind":"text","text":"\n\n**Server**\n\nPlease refer to the \"[Server: Handling multipart requests](#server-handling-multipart-requests)\" example - there is code for a simple Node.js server."}]},{"tag":"@returns","content":[{"kind":"text","text":"Returns a Promise that resolves to "},{"kind":"code","text":"`FileSystemUploadResult`"},{"kind":"text","text":" object."}]}]},"parameters":[{"name":"url","kind":32768,"comment":{"summary":[{"kind":"text","text":"The remote URL, where the file will be sent."}]},"type":{"type":"intrinsic","name":"string"}},{"name":"fileUri","kind":32768,"comment":{"summary":[{"kind":"text","text":"The local URI of the file to send. The file must exist."}]},"type":{"type":"intrinsic","name":"string"}},{"name":"options","kind":32768,"comment":{"summary":[{"kind":"text","text":"A map of download options represented by ["},{"kind":"code","text":"`FileSystemUploadOptions`"},{"kind":"text","text":"](#filesystemuploadoptions) type."}]},"type":{"type":"reference","name":"FileSystemUploadOptions"},"defaultValue":"{}"}],"type":{"type":"reference","typeArguments":[{"type":"reference","name":"FileSystemUploadResult"}],"name":"Promise","qualifiedName":"Promise","package":"typescript"}}]},{"name":"writeAsStringAsync","kind":64,"signatures":[{"name":"writeAsStringAsync","kind":4096,"comment":{"summary":[{"kind":"text","text":"Write the entire contents of a file as a string."}]},"parameters":[{"name":"fileUri","kind":32768,"comment":{"summary":[{"kind":"code","text":"`file://`"},{"kind":"text","text":" or [SAF](#saf-uri) URI to the file or directory.\n> Note: when you're using SAF URI the file needs to exist. You can't create a new file."}]},"type":{"type":"intrinsic","name":"string"}},{"name":"contents","kind":32768,"comment":{"summary":[{"kind":"text","text":"The string to replace the contents of the file with."}]},"type":{"type":"intrinsic","name":"string"}},{"name":"options","kind":32768,"comment":{"summary":[{"kind":"text","text":"A map of write options represented by ["},{"kind":"code","text":"`WritingOptions`"},{"kind":"text","text":"](#writingoptions) type."}]},"type":{"type":"reference","name":"WritingOptions"},"defaultValue":"{}"}],"type":{"type":"reference","typeArguments":[{"type":"intrinsic","name":"void"}],"name":"Promise","qualifiedName":"Promise","package":"typescript"}}]}]}
\ No newline at end of file
diff --git a/docs/public/static/data/v49.0.0/expo-font.json b/docs/public/static/data/v49.0.0/expo-font.json
new file mode 100644
index 0000000000000..70a7d79420833
--- /dev/null
+++ b/docs/public/static/data/v49.0.0/expo-font.json
@@ -0,0 +1 @@
+{"name":"expo-font","kind":1,"children":[{"name":"FontDisplay","kind":8,"comment":{"summary":[{"kind":"text","text":"Sets the [font-display](https://developer.mozilla.org/en-US/docs/Web/CSS/@font-face/font-display)\nfor a given typeface. The default font value on web is "},{"kind":"code","text":"`FontDisplay.AUTO`"},{"kind":"text","text":".\nEven though setting the "},{"kind":"code","text":"`fontDisplay`"},{"kind":"text","text":" does nothing on native platforms, the default behavior\nemulates "},{"kind":"code","text":"`FontDisplay.SWAP`"},{"kind":"text","text":" on flagship devices like iOS, Samsung, Pixel, etc. Default\nfunctionality varies on One Plus devices. In the browser this value is set in the generated\n"},{"kind":"code","text":"`@font-face`"},{"kind":"text","text":" CSS block and not as a style property meaning you cannot dynamically change this\nvalue based on the element it's used in."}],"blockTags":[{"tag":"@platform","content":[{"kind":"text","text":"web"}]}]},"children":[{"name":"AUTO","kind":16,"comment":{"summary":[{"kind":"text","text":"__(Default)__ The font display strategy is defined by the user agent or platform.\nThis generally defaults to the text being invisible until the font is loaded.\nGood for buttons or banners that require a specific treatment."}]},"type":{"type":"literal","value":"auto"}},{"name":"BLOCK","kind":16,"comment":{"summary":[{"kind":"text","text":"The text will be invisible until the font has loaded. If the font fails to load then nothing\nwill appear - it's best to turn this off when debugging missing text."}]},"type":{"type":"literal","value":"block"}},{"name":"FALLBACK","kind":16,"comment":{"summary":[{"kind":"text","text":"Splits the behavior between "},{"kind":"code","text":"`SWAP`"},{"kind":"text","text":" and "},{"kind":"code","text":"`BLOCK`"},{"kind":"text","text":".\nThere will be a [100ms timeout](https://developers.google.com/web/updates/2016/02/font-display?hl=en)\nwhere the text with a custom font is invisible, after that the text will either swap to the\nstyled text or it'll show the unstyled text and continue to load the custom font. This is good\nfor buttons that need a custom font but should also be quickly available to screen-readers."}]},"type":{"type":"literal","value":"fallback"}},{"name":"OPTIONAL","kind":16,"comment":{"summary":[{"kind":"text","text":"This works almost identically to "},{"kind":"code","text":"`FALLBACK`"},{"kind":"text","text":", the only difference is that the browser will\ndecide to load the font based on slow connection speed or critical resource demand."}]},"type":{"type":"literal","value":"optional"}},{"name":"SWAP","kind":16,"comment":{"summary":[{"kind":"text","text":"Fallback text is rendered immediately with a default font while the desired font is loaded.\nThis is good for making the content appear to load instantly and is usually preferred."}]},"type":{"type":"literal","value":"swap"}}]},{"name":"FontResource","kind":4194304,"comment":{"summary":[{"kind":"text","text":"An object used to dictate the resource that is loaded into the provided font namespace when used\nwith ["},{"kind":"code","text":"`loadAsync`"},{"kind":"text","text":"](#loadasync)."}]},"type":{"type":"reflection","declaration":{"name":"__type","kind":65536,"children":[{"name":"default","kind":1024,"flags":{"isOptional":true},"type":{"type":"intrinsic","name":"string"}},{"name":"display","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"Sets the ["},{"kind":"code","text":"`font-display`"},{"kind":"text","text":"](#fontdisplay) property for a given typeface in the browser."}],"blockTags":[{"tag":"@platform","content":[{"kind":"text","text":"web"}]}]},"type":{"type":"reference","name":"FontDisplay"}},{"name":"uri","kind":1024,"flags":{"isOptional":true},"type":{"type":"union","types":[{"type":"intrinsic","name":"string"},{"type":"intrinsic","name":"number"}]}}]}}},{"name":"FontSource","kind":4194304,"comment":{"summary":[{"kind":"text","text":"The different types of assets you can provide to the ["},{"kind":"code","text":"`loadAsync()`"},{"kind":"text","text":"](#loadAsync) function.\nA font source can be a URI, a module ID, or an Expo Asset."}]},"type":{"type":"union","types":[{"type":"intrinsic","name":"string"},{"type":"intrinsic","name":"number"},{"type":"reference","name":"Asset"},{"type":"reference","name":"FontResource"}]}},{"name":"UnloadFontOptions","kind":4194304,"comment":{"summary":[{"kind":"text","text":"Object used to query fonts for unloading."}]},"type":{"type":"reference","typeArguments":[{"type":"reference","name":"FontResource"},{"type":"literal","value":"display"}],"name":"Pick","qualifiedName":"Pick","package":"typescript"}},{"name":"isLoaded","kind":64,"signatures":[{"name":"isLoaded","kind":4096,"comment":{"summary":[{"kind":"text","text":"Synchronously detect if the font for "},{"kind":"code","text":"`fontFamily`"},{"kind":"text","text":" has finished loading."}],"blockTags":[{"tag":"@returns","content":[{"kind":"text","text":"Returns "},{"kind":"code","text":"`true`"},{"kind":"text","text":" if the font has fully loaded."}]}]},"parameters":[{"name":"fontFamily","kind":32768,"comment":{"summary":[{"kind":"text","text":"The name used to load the "},{"kind":"code","text":"`FontResource`"},{"kind":"text","text":"."}]},"type":{"type":"intrinsic","name":"string"}}],"type":{"type":"intrinsic","name":"boolean"}}]},{"name":"isLoading","kind":64,"signatures":[{"name":"isLoading","kind":4096,"comment":{"summary":[{"kind":"text","text":"Synchronously detect if the font for "},{"kind":"code","text":"`fontFamily`"},{"kind":"text","text":" is still being loaded."}],"blockTags":[{"tag":"@returns","content":[{"kind":"text","text":"Returns "},{"kind":"code","text":"`true`"},{"kind":"text","text":" if the font is still loading."}]}]},"parameters":[{"name":"fontFamily","kind":32768,"comment":{"summary":[{"kind":"text","text":"The name used to load the "},{"kind":"code","text":"`FontResource`"},{"kind":"text","text":"."}]},"type":{"type":"intrinsic","name":"string"}}],"type":{"type":"intrinsic","name":"boolean"}}]},{"name":"loadAsync","kind":64,"signatures":[{"name":"loadAsync","kind":4096,"comment":{"summary":[{"kind":"text","text":"Highly efficient method for loading fonts from static or remote resources which can then be used\nwith the platform's native text elements. In the browser this generates a "},{"kind":"code","text":"`@font-face`"},{"kind":"text","text":" block in\na shared style sheet for fonts. No CSS is needed to use this method."}],"blockTags":[{"tag":"@returns","content":[{"kind":"text","text":"Returns a promise that fulfils when the font has loaded. Often you may want to wrap the\nmethod in a "},{"kind":"code","text":"`try/catch/finally`"},{"kind":"text","text":" to ensure the app continues if the font fails to load."}]}]},"parameters":[{"name":"fontFamilyOrFontMap","kind":32768,"comment":{"summary":[{"kind":"text","text":"string or map of values that can be used as the ["},{"kind":"code","text":"`fontFamily`"},{"kind":"text","text":"](https://reactnative.dev/docs/text#style)\nstyle prop with React Native Text elements."}]},"type":{"type":"union","types":[{"type":"intrinsic","name":"string"},{"type":"reference","typeArguments":[{"type":"intrinsic","name":"string"},{"type":"reference","name":"FontSource"}],"name":"Record","qualifiedName":"Record","package":"typescript"}]}},{"name":"source","kind":32768,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"the font asset that should be loaded into the "},{"kind":"code","text":"`fontFamily`"},{"kind":"text","text":" namespace."}]},"type":{"type":"reference","name":"FontSource"}}],"type":{"type":"reference","typeArguments":[{"type":"intrinsic","name":"void"}],"name":"Promise","qualifiedName":"Promise","package":"typescript"}}]},{"name":"processFontFamily","kind":64,"signatures":[{"name":"processFontFamily","kind":4096,"comment":{"summary":[{"kind":"text","text":"Used to transform font family names to the scoped name. This does not need to\nbe called in standalone or bare apps but it will return unscoped font family\nnames if it is called in those contexts."}],"blockTags":[{"tag":"@returns","content":[{"kind":"text","text":"Returns a name processed for use with the [current workflow](https://docs.expo.dev/archive/managed-vs-bare/)."}]}]},"parameters":[{"name":"fontFamily","kind":32768,"comment":{"summary":[{"kind":"text","text":"Name of font to process."}]},"type":{"type":"union","types":[{"type":"literal","value":null},{"type":"intrinsic","name":"string"}]}}],"type":{"type":"union","types":[{"type":"intrinsic","name":"string"},{"type":"literal","value":null}]}}]},{"name":"unloadAllAsync","kind":64,"signatures":[{"name":"unloadAllAsync","kind":4096,"comment":{"summary":[{"kind":"text","text":"Unloads all the custom fonts. This is used for testing."}]},"type":{"type":"reference","typeArguments":[{"type":"intrinsic","name":"void"}],"name":"Promise","qualifiedName":"Promise","package":"typescript"}}]},{"name":"unloadAsync","kind":64,"signatures":[{"name":"unloadAsync","kind":4096,"comment":{"summary":[{"kind":"text","text":"Unload custom fonts matching the "},{"kind":"code","text":"`fontFamily`"},{"kind":"text","text":"s and display values provided.\nBecause fonts are automatically unloaded on every platform this is mostly used for testing."}]},"parameters":[{"name":"fontFamilyOrFontMap","kind":32768,"comment":{"summary":[{"kind":"text","text":"The name or names of the custom fonts that will be unloaded."}]},"type":{"type":"union","types":[{"type":"intrinsic","name":"string"},{"type":"reference","typeArguments":[{"type":"intrinsic","name":"string"},{"type":"reference","name":"UnloadFontOptions"}],"name":"Record","qualifiedName":"Record","package":"typescript"}]}},{"name":"options","kind":32768,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"When "},{"kind":"code","text":"`fontFamilyOrFontMap`"},{"kind":"text","text":" is a string, this should be the font source used to load\nthe custom font originally."}]},"type":{"type":"reference","name":"UnloadFontOptions"}}],"type":{"type":"reference","typeArguments":[{"type":"intrinsic","name":"void"}],"name":"Promise","qualifiedName":"Promise","package":"typescript"}}]},{"name":"useFonts","kind":64,"signatures":[{"name":"useFonts","kind":4096,"comment":{"summary":[{"kind":"code","text":"```ts\nconst [loaded, error] = useFonts({ ... });\n```"},{"kind":"text","text":"\nLoad a map of fonts with ["},{"kind":"code","text":"`loadAsync`"},{"kind":"text","text":"](#loadasync). This returns a "},{"kind":"code","text":"`boolean`"},{"kind":"text","text":" if the fonts are\nloaded and ready to use. It also returns an error if something went wrong, to use in development.\n\n> Note, the fonts are not \"reloaded\" when you dynamically change the font map."}],"blockTags":[{"tag":"@returns","content":[{"kind":"text","text":"- __loaded__ ("},{"kind":"code","text":"`boolean`"},{"kind":"text","text":") - A boolean to detect if the font for "},{"kind":"code","text":"`fontFamily`"},{"kind":"text","text":" has finished\nloading.\n- __error__ ("},{"kind":"code","text":"`Error | null`"},{"kind":"text","text":") - An error encountered when loading the fonts."}]}]},"parameters":[{"name":"map","kind":32768,"comment":{"summary":[{"kind":"text","text":"A map of "},{"kind":"code","text":"`fontFamily`"},{"kind":"text","text":"s to ["},{"kind":"code","text":"`FontSource`"},{"kind":"text","text":"](#fontsource)s. After loading the font you can\nuse the key in the "},{"kind":"code","text":"`fontFamily`"},{"kind":"text","text":" style prop of a "},{"kind":"code","text":"`Text`"},{"kind":"text","text":" element."}]},"type":{"type":"union","types":[{"type":"intrinsic","name":"string"},{"type":"reference","typeArguments":[{"type":"intrinsic","name":"string"},{"type":"reference","name":"FontSource"}],"name":"Record","qualifiedName":"Record","package":"typescript"}]}}],"type":{"type":"tuple","elements":[{"type":"intrinsic","name":"boolean"},{"type":"union","types":[{"type":"reference","name":"Error","qualifiedName":"Error","package":"typescript"},{"type":"literal","value":null}]}]}}]}]}
\ No newline at end of file
diff --git a/docs/public/static/data/v49.0.0/expo-gl.json b/docs/public/static/data/v49.0.0/expo-gl.json
new file mode 100644
index 0000000000000..db96888b6690d
--- /dev/null
+++ b/docs/public/static/data/v49.0.0/expo-gl.json
@@ -0,0 +1 @@
+{"name":"expo-gl","kind":1,"children":[{"name":"GLLoggingOption","kind":8,"children":[{"name":"ALL","kind":16,"comment":{"summary":[{"kind":"text","text":"Enables all other options. It implies "},{"kind":"code","text":"`GET_ERRORS`"},{"kind":"text","text":" so be aware of the slowdown."}]},"type":{"type":"literal","value":15}},{"name":"DISABLED","kind":16,"comment":{"summary":[{"kind":"text","text":"Disables logging entirely."}]},"type":{"type":"literal","value":0}},{"name":"GET_ERRORS","kind":16,"comment":{"summary":[{"kind":"text","text":"Calls "},{"kind":"code","text":"`gl.getError()`"},{"kind":"text","text":" after each other method call and prints an error if any is returned.\nThis option has a significant impact on the performance as this method is blocking."}]},"type":{"type":"literal","value":2}},{"name":"METHOD_CALLS","kind":16,"comment":{"summary":[{"kind":"text","text":"Logs method calls, their parameters and results."}]},"type":{"type":"literal","value":1}},{"name":"RESOLVE_CONSTANTS","kind":16,"comment":{"summary":[{"kind":"text","text":"Resolves parameters of type "},{"kind":"code","text":"`number`"},{"kind":"text","text":" to their constant names."}]},"type":{"type":"literal","value":4}},{"name":"TRUNCATE_STRINGS","kind":16,"comment":{"summary":[{"kind":"text","text":"When this option is enabled, long strings will be truncated.\nIt's useful if your shaders are really big and logging them significantly reduces performance."}]},"type":{"type":"literal","value":8}}]},{"name":"GLView","kind":128,"comment":{"summary":[{"kind":"text","text":"A View that acts as an OpenGL ES render target. On mounting, an OpenGL ES context is created.\nIts drawing buffer is presented as the contents of the View every frame."}]},"children":[{"name":"constructor","kind":512,"flags":{"isExternal":true},"signatures":[{"name":"new GLView","kind":16384,"flags":{"isExternal":true},"parameters":[{"name":"props","kind":32768,"flags":{"isExternal":true},"type":{"type":"union","types":[{"type":"reference","name":"GLViewProps"},{"type":"reference","typeArguments":[{"type":"reference","name":"GLViewProps"}],"name":"Readonly","qualifiedName":"Readonly","package":"typescript"}]}}],"type":{"type":"reference","name":"GLView"},"inheritedFrom":{"type":"reference","name":"React.Component.constructor"}},{"name":"new GLView","kind":16384,"flags":{"isExternal":true},"comment":{"summary":[],"blockTags":[{"tag":"@deprecated","content":[]},{"tag":"@see","content":[{"kind":"text","text":"https://reactjs.org/docs/legacy-context.html"}]}]},"parameters":[{"name":"props","kind":32768,"flags":{"isExternal":true},"type":{"type":"reference","name":"GLViewProps"}},{"name":"context","kind":32768,"flags":{"isExternal":true},"type":{"type":"intrinsic","name":"any"}}],"type":{"type":"reference","name":"GLView"},"inheritedFrom":{"type":"reference","name":"React.Component.constructor"}}],"inheritedFrom":{"type":"reference","name":"React.Component.constructor"}},{"name":"exglCtxId","kind":1024,"flags":{"isOptional":true},"type":{"type":"intrinsic","name":"number"}},{"name":"nativeRef","kind":1024,"type":{"type":"reference","name":"ComponentOrHandle"},"defaultValue":"null"},{"name":"NativeView","kind":1024,"flags":{"isStatic":true},"type":{"type":"intrinsic","name":"any"}},{"name":"defaultProps","kind":1024,"flags":{"isStatic":true},"type":{"type":"reflection","declaration":{"name":"__type","kind":65536,"children":[{"name":"enableExperimentalWorkletSupport","kind":1024,"type":{"type":"intrinsic","name":"boolean"},"defaultValue":"false"},{"name":"msaaSamples","kind":1024,"type":{"type":"intrinsic","name":"number"},"defaultValue":"4"}]}},"defaultValue":"..."},{"name":"getWorkletContext","kind":1024,"flags":{"isStatic":true},"type":{"type":"reflection","declaration":{"name":"__type","kind":65536,"signatures":[{"name":"__type","kind":4096,"parameters":[{"name":"contextId","kind":32768,"type":{"type":"intrinsic","name":"number"}}],"type":{"type":"union","types":[{"type":"intrinsic","name":"undefined"},{"type":"reference","name":"ExpoWebGLRenderingContext"}]}}]}},"defaultValue":"workletContextManager.getContext"},{"name":"_onSurfaceCreate","kind":2048,"signatures":[{"name":"_onSurfaceCreate","kind":4096,"parameters":[{"name":"__namedParameters","kind":32768,"type":{"type":"reference","name":"SurfaceCreateEvent"}}],"type":{"type":"intrinsic","name":"void"}}]},{"name":"_setNativeRef","kind":2048,"signatures":[{"name":"_setNativeRef","kind":4096,"parameters":[{"name":"nativeRef","kind":32768,"type":{"type":"reference","name":"ComponentOrHandle"}}],"type":{"type":"intrinsic","name":"void"}}]},{"name":"componentDidUpdate","kind":2048,"signatures":[{"name":"componentDidUpdate","kind":4096,"parameters":[{"name":"prevProps","kind":32768,"type":{"type":"reference","name":"GLViewProps"}}],"type":{"type":"intrinsic","name":"void"},"overwrites":{"type":"reference","name":"React.Component.componentDidUpdate"}}],"overwrites":{"type":"reference","name":"React.Component.componentDidUpdate"}},{"name":"componentWillUnmount","kind":2048,"signatures":[{"name":"componentWillUnmount","kind":4096,"type":{"type":"intrinsic","name":"void"},"overwrites":{"type":"reference","name":"React.Component.componentWillUnmount"}}],"overwrites":{"type":"reference","name":"React.Component.componentWillUnmount"}},{"name":"createCameraTextureAsync","kind":2048,"signatures":[{"name":"createCameraTextureAsync","kind":4096,"parameters":[{"name":"cameraRefOrHandle","kind":32768,"type":{"type":"reference","name":"ComponentOrHandle"}}],"type":{"type":"reference","typeArguments":[{"type":"reference","name":"WebGLTexture","qualifiedName":"WebGLTexture","package":"typescript"}],"name":"Promise","qualifiedName":"Promise","package":"typescript"}}]},{"name":"destroyObjectAsync","kind":2048,"signatures":[{"name":"destroyObjectAsync","kind":4096,"parameters":[{"name":"glObject","kind":32768,"type":{"type":"reference","name":"WebGLObject"}}],"type":{"type":"reference","typeArguments":[{"type":"intrinsic","name":"boolean"}],"name":"Promise","qualifiedName":"Promise","package":"typescript"}}]},{"name":"render","kind":2048,"signatures":[{"name":"render","kind":4096,"type":{"type":"reference","name":"Element","qualifiedName":"global.JSX.Element","package":"@types/react"},"overwrites":{"type":"reference","name":"React.Component.render"}}],"overwrites":{"type":"reference","name":"React.Component.render"}},{"name":"startARSessionAsync","kind":2048,"signatures":[{"name":"startARSessionAsync","kind":4096,"type":{"type":"reference","typeArguments":[{"type":"intrinsic","name":"any"}],"name":"Promise","qualifiedName":"Promise","package":"typescript"}}]},{"name":"takeSnapshotAsync","kind":2048,"signatures":[{"name":"takeSnapshotAsync","kind":4096,"comment":{"summary":[{"kind":"text","text":"Same as static ["},{"kind":"code","text":"`takeSnapshotAsync()`"},{"kind":"text","text":"](#glviewtakesnapshotasyncgl-options),\nbut uses WebGL context that is associated with the view on which the method is called."}]},"parameters":[{"name":"options","kind":32768,"type":{"type":"reference","name":"SnapshotOptions"},"defaultValue":"{}"}],"type":{"type":"reference","typeArguments":[{"type":"reference","name":"GLSnapshot"}],"name":"Promise","qualifiedName":"Promise","package":"typescript"}}]},{"name":"createContextAsync","kind":2048,"flags":{"isStatic":true},"signatures":[{"name":"createContextAsync","kind":4096,"comment":{"summary":[{"kind":"text","text":"Imperative API that creates headless context which is devoid of underlying view.\nIt's useful for headless rendering or in case you want to keep just one context per application and share it between multiple components.\nIt is slightly faster than usual context as it doesn't swap framebuffers and doesn't present them on the canvas,\nhowever it may require you to take a snapshot in order to present its results.\nAlso, keep in mind that you need to set up a viewport and create your own framebuffer and texture that you will be drawing to, before you take a snapshot."}],"blockTags":[{"tag":"@returns","content":[{"kind":"text","text":"A promise that resolves to WebGL context object. See [WebGL API](#webgl-api) for more details."}]}]},"type":{"type":"reference","typeArguments":[{"type":"reference","name":"ExpoWebGLRenderingContext"}],"name":"Promise","qualifiedName":"Promise","package":"typescript"}}]},{"name":"destroyContextAsync","kind":2048,"flags":{"isStatic":true},"signatures":[{"name":"destroyContextAsync","kind":4096,"comment":{"summary":[{"kind":"text","text":"Destroys given context."}],"blockTags":[{"tag":"@returns","content":[{"kind":"text","text":"A promise that resolves to boolean value that is "},{"kind":"code","text":"`true`"},{"kind":"text","text":" if given context existed and has been destroyed successfully."}]}]},"parameters":[{"name":"exgl","kind":32768,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"WebGL context to destroy."}]},"type":{"type":"union","types":[{"type":"intrinsic","name":"number"},{"type":"reference","name":"ExpoWebGLRenderingContext"}]}}],"type":{"type":"reference","typeArguments":[{"type":"intrinsic","name":"boolean"}],"name":"Promise","qualifiedName":"Promise","package":"typescript"}}]},{"name":"takeSnapshotAsync","kind":2048,"flags":{"isStatic":true},"signatures":[{"name":"takeSnapshotAsync","kind":4096,"comment":{"summary":[{"kind":"text","text":"Takes a snapshot of the framebuffer and saves it as a file to app's cache directory."}],"blockTags":[{"tag":"@returns","content":[{"kind":"text","text":"A promise that resolves to "},{"kind":"code","text":"`GLSnapshot`"},{"kind":"text","text":" object."}]}]},"parameters":[{"name":"exgl","kind":32768,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"WebGL context to take a snapshot from."}]},"type":{"type":"union","types":[{"type":"intrinsic","name":"number"},{"type":"reference","name":"ExpoWebGLRenderingContext"}]}},{"name":"options","kind":32768,"type":{"type":"reference","name":"SnapshotOptions"},"defaultValue":"{}"}],"type":{"type":"reference","typeArguments":[{"type":"reference","name":"GLSnapshot"}],"name":"Promise","qualifiedName":"Promise","package":"typescript"}}]}],"extendedTypes":[{"type":"reference","typeArguments":[{"type":"reference","name":"GLViewProps"}],"name":"Component","qualifiedName":"React.Component","package":"@types/react"}]},{"name":"ExpoWebGLRenderingContext","kind":256,"children":[{"name":"contextId","kind":1024,"type":{"type":"intrinsic","name":"number"}},{"name":"__expoSetLogging","kind":2048,"signatures":[{"name":"__expoSetLogging","kind":4096,"parameters":[{"name":"option","kind":32768,"type":{"type":"reference","name":"GLLoggingOption"}}],"type":{"type":"intrinsic","name":"void"}}]},{"name":"endFrameEXP","kind":2048,"signatures":[{"name":"endFrameEXP","kind":4096,"type":{"type":"intrinsic","name":"void"}}]},{"name":"flushEXP","kind":2048,"signatures":[{"name":"flushEXP","kind":4096,"type":{"type":"intrinsic","name":"void"}}]}],"extendedTypes":[{"type":"reference","name":"WebGL2RenderingContext","qualifiedName":"WebGL2RenderingContext","package":"typescript"}]},{"name":"ComponentOrHandle","kind":4194304,"type":{"type":"union","types":[{"type":"literal","value":null},{"type":"intrinsic","name":"number"},{"type":"reference","typeArguments":[{"type":"intrinsic","name":"any"},{"type":"intrinsic","name":"any"}],"name":"Component","qualifiedName":"React.Component","package":"@types/react"},{"type":"reference","typeArguments":[{"type":"intrinsic","name":"any"}],"name":"ComponentClass","qualifiedName":"React.ComponentClass","package":"@types/react"}]}},{"name":"GLSnapshot","kind":4194304,"type":{"type":"reflection","declaration":{"name":"__type","kind":65536,"children":[{"name":"height","kind":1024,"comment":{"summary":[{"kind":"text","text":"Height of the snapshot."}]},"type":{"type":"intrinsic","name":"number"}},{"name":"localUri","kind":1024,"comment":{"summary":[{"kind":"text","text":"Synonym for "},{"kind":"code","text":"`uri`"},{"kind":"text","text":". Makes snapshot object compatible with "},{"kind":"code","text":"`texImage2D`"},{"kind":"text","text":"."}]},"type":{"type":"intrinsic","name":"string"}},{"name":"uri","kind":1024,"comment":{"summary":[{"kind":"text","text":"URI to the snapshot."}]},"type":{"type":"union","types":[{"type":"intrinsic","name":"string"},{"type":"reference","name":"Blob","qualifiedName":"Blob","package":"typescript"},{"type":"literal","value":null}]}},{"name":"width","kind":1024,"comment":{"summary":[{"kind":"text","text":"Width of the snapshot."}]},"type":{"type":"intrinsic","name":"number"}}]}}},{"name":"GLViewProps","kind":4194304,"type":{"type":"intersection","types":[{"type":"reflection","declaration":{"name":"__type","kind":65536,"children":[{"name":"enableExperimentalWorkletSupport","kind":1024,"comment":{"summary":[{"kind":"text","text":"Enables support for interacting with a "},{"kind":"code","text":"`gl`"},{"kind":"text","text":" object from code running on the Reanimated worklet thread."}],"blockTags":[{"tag":"@default","content":[{"kind":"text","text":"false"}]}]},"type":{"type":"intrinsic","name":"boolean"}},{"name":"msaaSamples","kind":1024,"comment":{"summary":[{"kind":"code","text":"`GLView`"},{"kind":"text","text":" can enable iOS's built-in [multisampling](https://www.khronos.org/registry/OpenGL/extensions/APPLE/APPLE_framebuffer_multisample.txt).\nThis prop specifies the number of samples to use. Setting this to "},{"kind":"code","text":"`0`"},{"kind":"text","text":" turns off multisampling."}],"blockTags":[{"tag":"@platform","content":[{"kind":"text","text":"ios"}]},{"tag":"@default","content":[{"kind":"text","text":"4"}]}]},"type":{"type":"intrinsic","name":"number"}},{"name":"onContextCreate","kind":2048,"signatures":[{"name":"onContextCreate","kind":4096,"comment":{"summary":[{"kind":"text","text":"A function that will be called when the OpenGL ES context is created.\nThe function is passed a single argument "},{"kind":"code","text":"`gl`"},{"kind":"text","text":" that extends a [WebGLRenderingContext](https://www.khronos.org/registry/webgl/specs/latest/1.0/#5.14) interface."}]},"parameters":[{"name":"gl","kind":32768,"type":{"type":"reference","name":"ExpoWebGLRenderingContext"}}],"type":{"type":"intrinsic","name":"void"}}]}]}},{"type":"reference","name":"ViewProps","qualifiedName":"ViewProps","package":"react-native"}]}},{"name":"SnapshotOptions","kind":4194304,"type":{"type":"reflection","declaration":{"name":"__type","kind":65536,"children":[{"name":"compress","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"A value in range "},{"kind":"code","text":"`0`"},{"kind":"text","text":" to "},{"kind":"code","text":"`1.0`"},{"kind":"text","text":" specifying compression level of the result image.\n"},{"kind":"code","text":"`1.0`"},{"kind":"text","text":" means no compression and "},{"kind":"code","text":"`0`"},{"kind":"text","text":" the highest compression."}],"blockTags":[{"tag":"@default","content":[{"kind":"text","text":"1.0"}]}]},"type":{"type":"intrinsic","name":"number"}},{"name":"flip","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"Whether to flip the snapshot vertically."}],"blockTags":[{"tag":"@default","content":[{"kind":"text","text":"false"}]}]},"type":{"type":"intrinsic","name":"boolean"}},{"name":"format","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"Specifies what type of compression should be used and what is the result file extension.\nPNG compression is lossless but slower, JPEG is faster but the image has visible artifacts.\n> **Note:** When using WebP format, the iOS version will print a warning, and generate a "},{"kind":"code","text":"`'png'`"},{"kind":"text","text":" file instead.\n> It is recommendable to use platform dependant code in this case. You can refer to the [documentation on platform specific code](/versions/latest/react-native/platform-specific-code)."}],"blockTags":[{"tag":"@default","content":[{"kind":"text","text":"'jpeg'"}]}]},"type":{"type":"union","types":[{"type":"literal","value":"jpeg"},{"type":"literal","value":"png"},{"type":"literal","value":"webp"}]}},{"name":"framebuffer","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"Specify the framebuffer that we will be reading from.\nDefaults to underlying framebuffer that is presented in the view or the current framebuffer if context is headless."}]},"type":{"type":"reference","name":"WebGLFramebuffer","qualifiedName":"WebGLFramebuffer","package":"typescript"}},{"name":"rect","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"Rect to crop the snapshot. It's passed directly to "},{"kind":"code","text":"`glReadPixels`"},{"kind":"text","text":"."}]},"type":{"type":"reflection","declaration":{"name":"__type","kind":65536,"children":[{"name":"height","kind":1024,"type":{"type":"intrinsic","name":"number"}},{"name":"width","kind":1024,"type":{"type":"intrinsic","name":"number"}},{"name":"x","kind":1024,"type":{"type":"intrinsic","name":"number"}},{"name":"y","kind":1024,"type":{"type":"intrinsic","name":"number"}}]}}}]}}},{"name":"SurfaceCreateEvent","kind":4194304,"type":{"type":"reflection","declaration":{"name":"__type","kind":65536,"children":[{"name":"nativeEvent","kind":1024,"type":{"type":"reflection","declaration":{"name":"__type","kind":65536,"children":[{"name":"exglCtxId","kind":1024,"type":{"type":"intrinsic","name":"number"}}]}}}]}}},{"name":"WebGLObject","kind":4194304,"type":{"type":"reflection","declaration":{"name":"__type","kind":65536,"children":[{"name":"id","kind":1024,"type":{"type":"intrinsic","name":"number"}}]}}}]}
\ No newline at end of file
diff --git a/docs/public/static/data/v49.0.0/expo-gyroscope.json b/docs/public/static/data/v49.0.0/expo-gyroscope.json
new file mode 100644
index 0000000000000..a3fdee13908a1
--- /dev/null
+++ b/docs/public/static/data/v49.0.0/expo-gyroscope.json
@@ -0,0 +1 @@
+{"name":"expo-gyroscope","kind":1,"children":[{"name":"default","kind":128,"comment":{"summary":[{"kind":"text","text":"A base class for subscribable sensors. The events emitted by this class are measurements\nspecified by the parameter type "},{"kind":"code","text":"`Measurement`"},{"kind":"text","text":"."}]},"children":[{"name":"constructor","kind":512,"signatures":[{"name":"new default","kind":16384,"typeParameter":[{"name":"Measurement","kind":131072}],"parameters":[{"name":"nativeSensorModule","kind":32768,"type":{"type":"intrinsic","name":"any"}},{"name":"nativeEventName","kind":32768,"type":{"type":"intrinsic","name":"string"}}],"type":{"type":"reference","typeArguments":[{"type":"reference","name":"Measurement"}],"name":"default"}}]},{"name":"_listenerCount","kind":1024,"type":{"type":"intrinsic","name":"number"}},{"name":"_nativeEmitter","kind":1024,"type":{"type":"reference","name":"EventEmitter"}},{"name":"_nativeEventName","kind":1024,"type":{"type":"intrinsic","name":"string"}},{"name":"_nativeModule","kind":1024,"type":{"type":"intrinsic","name":"any"}},{"name":"addListener","kind":2048,"signatures":[{"name":"addListener","kind":4096,"parameters":[{"name":"listener","kind":32768,"type":{"type":"reference","typeArguments":[{"type":"reference","name":"Measurement"}],"name":"Listener"}}],"type":{"type":"reference","name":"Subscription"}}]},{"name":"getListenerCount","kind":2048,"signatures":[{"name":"getListenerCount","kind":4096,"comment":{"summary":[{"kind":"text","text":"Returns the registered listeners count."}]},"type":{"type":"intrinsic","name":"number"}}]},{"name":"getPermissionsAsync","kind":2048,"signatures":[{"name":"getPermissionsAsync","kind":4096,"comment":{"summary":[{"kind":"text","text":"Checks user's permissions for accessing sensor."}]},"type":{"type":"reference","typeArguments":[{"type":"reference","name":"PermissionResponse"}],"name":"Promise","qualifiedName":"Promise","package":"typescript"}}]},{"name":"hasListeners","kind":2048,"signatures":[{"name":"hasListeners","kind":4096,"comment":{"summary":[{"kind":"text","text":"Returns boolean which signifies if sensor has any listeners registered."}]},"type":{"type":"intrinsic","name":"boolean"}}]},{"name":"isAvailableAsync","kind":2048,"signatures":[{"name":"isAvailableAsync","kind":4096,"comment":{"summary":[{"kind":"text","text":"> **info** You should always check the sensor availability before attempting to use it."}],"blockTags":[{"tag":"@returns","content":[{"kind":"text","text":"A promise that resolves to a "},{"kind":"code","text":"`boolean`"},{"kind":"text","text":" denoting the availability of the sensor."}]}]},"type":{"type":"reference","typeArguments":[{"type":"intrinsic","name":"boolean"}],"name":"Promise","qualifiedName":"Promise","package":"typescript"}}]},{"name":"removeAllListeners","kind":2048,"signatures":[{"name":"removeAllListeners","kind":4096,"comment":{"summary":[{"kind":"text","text":"Removes all registered listeners."}]},"type":{"type":"intrinsic","name":"void"}}]},{"name":"removeSubscription","kind":2048,"signatures":[{"name":"removeSubscription","kind":4096,"comment":{"summary":[{"kind":"text","text":"Removes the given subscription."}]},"parameters":[{"name":"subscription","kind":32768,"comment":{"summary":[{"kind":"text","text":"A subscription to remove."}]},"type":{"type":"reference","name":"Subscription"}}],"type":{"type":"intrinsic","name":"void"}}]},{"name":"requestPermissionsAsync","kind":2048,"signatures":[{"name":"requestPermissionsAsync","kind":4096,"comment":{"summary":[{"kind":"text","text":"Asks the user to grant permissions for accessing sensor."}]},"type":{"type":"reference","typeArguments":[{"type":"reference","name":"PermissionResponse"}],"name":"Promise","qualifiedName":"Promise","package":"typescript"}}]},{"name":"setUpdateInterval","kind":2048,"signatures":[{"name":"setUpdateInterval","kind":4096,"comment":{"summary":[{"kind":"text","text":"Set the sensor update interval."}]},"parameters":[{"name":"intervalMs","kind":32768,"comment":{"summary":[{"kind":"text","text":"Desired interval in milliseconds between sensor updates.\n> Starting from Android 12 (API level 31), the system has a 200ms limit for each sensor updates.\n>\n> If you need an update interval less than 200ms, you should:\n> * add "},{"kind":"code","text":"`android.permission.HIGH_SAMPLING_RATE_SENSORS`"},{"kind":"text","text":" to [**app.json** "},{"kind":"code","text":"`permissions`"},{"kind":"text","text":" field](/versions/latest/config/app/#permissions)\n> * or if you are using bare workflow, add "},{"kind":"code","text":"``"},{"kind":"text","text":" to **AndroidManifest.xml**."}]},"type":{"type":"intrinsic","name":"number"}}],"type":{"type":"intrinsic","name":"void"}}]}],"typeParameters":[{"name":"Measurement","kind":131072}],"extendedBy":[{"type":"reference","name":"GyroscopeSensor"}]},{"name":"default","kind":32,"type":{"type":"reference","name":"GyroscopeSensor"}},{"name":"GyroscopeMeasurement","kind":4194304,"comment":{"summary":[{"kind":"text","text":"Each of these keys represents the rotation along that particular axis measured in degrees per second (°/s)."}]},"type":{"type":"reflection","declaration":{"name":"__type","kind":65536,"children":[{"name":"x","kind":1024,"comment":{"summary":[{"kind":"text","text":"Value of rotation in degrees per second device reported in X axis."}]},"type":{"type":"intrinsic","name":"number"}},{"name":"y","kind":1024,"comment":{"summary":[{"kind":"text","text":"Value of rotation in degrees per second device reported in Y axis."}]},"type":{"type":"intrinsic","name":"number"}},{"name":"z","kind":1024,"comment":{"summary":[{"kind":"text","text":"Value of rotation in degrees per second device reported in Z axis."}]},"type":{"type":"intrinsic","name":"number"}}]}}},{"name":"GyroscopeSensor","kind":128,"comment":{"summary":[{"kind":"text","text":"A base class for subscribable sensors. The events emitted by this class are measurements\nspecified by the parameter type "},{"kind":"code","text":"`Measurement`"},{"kind":"text","text":"."}]},"children":[{"name":"constructor","kind":512,"signatures":[{"name":"new GyroscopeSensor","kind":16384,"parameters":[{"name":"nativeSensorModule","kind":32768,"type":{"type":"intrinsic","name":"any"}},{"name":"nativeEventName","kind":32768,"type":{"type":"intrinsic","name":"string"}}],"type":{"type":"reference","name":"GyroscopeSensor"},"inheritedFrom":{"type":"reference","name":"default.constructor"}}],"inheritedFrom":{"type":"reference","name":"default.constructor"}},{"name":"_listenerCount","kind":1024,"type":{"type":"intrinsic","name":"number"},"inheritedFrom":{"type":"reference","name":"default._listenerCount"}},{"name":"_nativeEmitter","kind":1024,"type":{"type":"reference","name":"EventEmitter"},"inheritedFrom":{"type":"reference","name":"default._nativeEmitter"}},{"name":"_nativeEventName","kind":1024,"type":{"type":"intrinsic","name":"string"},"inheritedFrom":{"type":"reference","name":"default._nativeEventName"}},{"name":"_nativeModule","kind":1024,"type":{"type":"intrinsic","name":"any"},"inheritedFrom":{"type":"reference","name":"default._nativeModule"}},{"name":"addListener","kind":2048,"signatures":[{"name":"addListener","kind":4096,"comment":{"summary":[{"kind":"text","text":"Subscribe for updates to the accelerometer."}],"blockTags":[{"tag":"@returns","content":[{"kind":"text","text":"A subscription that you can call "},{"kind":"code","text":"`remove()`"},{"kind":"text","text":" on when you would like to unsubscribe the listener."}]}]},"parameters":[{"name":"listener","kind":32768,"comment":{"summary":[{"kind":"text","text":"A callback that is invoked when an accelerometer update is available. When invoked,\nthe listener is provided a single argument that is an "},{"kind":"code","text":"`GyroscopeMeasurement`"},{"kind":"text","text":" object."}]},"type":{"type":"reference","typeArguments":[{"type":"reference","name":"GyroscopeMeasurement"}],"name":"Listener"}}],"type":{"type":"reference","name":"Subscription"},"overwrites":{"type":"reference","name":"default.addListener"}}],"overwrites":{"type":"reference","name":"default.addListener"}},{"name":"getListenerCount","kind":2048,"signatures":[{"name":"getListenerCount","kind":4096,"comment":{"summary":[{"kind":"text","text":"Returns the registered listeners count."}]},"type":{"type":"intrinsic","name":"number"},"inheritedFrom":{"type":"reference","name":"default.getListenerCount"}}],"inheritedFrom":{"type":"reference","name":"default.getListenerCount"}},{"name":"getPermissionsAsync","kind":2048,"signatures":[{"name":"getPermissionsAsync","kind":4096,"comment":{"summary":[{"kind":"text","text":"Checks user's permissions for accessing sensor."}]},"type":{"type":"reference","typeArguments":[{"type":"reference","name":"PermissionResponse"}],"name":"Promise","qualifiedName":"Promise","package":"typescript"},"inheritedFrom":{"type":"reference","name":"default.getPermissionsAsync"}}],"inheritedFrom":{"type":"reference","name":"default.getPermissionsAsync"}},{"name":"hasListeners","kind":2048,"signatures":[{"name":"hasListeners","kind":4096,"comment":{"summary":[{"kind":"text","text":"Returns boolean which signifies if sensor has any listeners registered."}]},"type":{"type":"intrinsic","name":"boolean"},"inheritedFrom":{"type":"reference","name":"default.hasListeners"}}],"inheritedFrom":{"type":"reference","name":"default.hasListeners"}},{"name":"isAvailableAsync","kind":2048,"signatures":[{"name":"isAvailableAsync","kind":4096,"comment":{"summary":[{"kind":"text","text":"> **info** You should always check the sensor availability before attempting to use it.\n\nReturns whether the gyroscope is enabled on the device.\n\nOn mobile web, you must first invoke "},{"kind":"code","text":"`Gyroscope.requestPermissionsAsync()`"},{"kind":"text","text":" in a user interaction (i.e. touch event) before you can use this module.\nIf the "},{"kind":"code","text":"`status`"},{"kind":"text","text":" is not equal to "},{"kind":"code","text":"`granted`"},{"kind":"text","text":" then you should inform the end user that they may have to open settings.\n\nOn **web** this starts a timer and waits to see if an event is fired. This should predict if the iOS device has the **device orientation** API disabled in\n**Settings > Safari > Motion & Orientation Access**. Some devices will also not fire if the site isn't hosted with **HTTPS** as "},{"kind":"code","text":"`DeviceMotion`"},{"kind":"text","text":" is now considered a secure API.\nThere is no formal API for detecting the status of "},{"kind":"code","text":"`DeviceMotion`"},{"kind":"text","text":" so this API can sometimes be unreliable on web."}],"blockTags":[{"tag":"@returns","content":[{"kind":"text","text":"A promise that resolves to a "},{"kind":"code","text":"`boolean`"},{"kind":"text","text":" denoting the availability of the gyroscope."}]}]},"type":{"type":"reference","typeArguments":[{"type":"intrinsic","name":"boolean"}],"name":"Promise","qualifiedName":"Promise","package":"typescript"},"overwrites":{"type":"reference","name":"default.isAvailableAsync"}}],"overwrites":{"type":"reference","name":"default.isAvailableAsync"}},{"name":"removeAllListeners","kind":2048,"signatures":[{"name":"removeAllListeners","kind":4096,"comment":{"summary":[{"kind":"text","text":"Removes all registered listeners."}]},"type":{"type":"intrinsic","name":"void"},"inheritedFrom":{"type":"reference","name":"default.removeAllListeners"}}],"inheritedFrom":{"type":"reference","name":"default.removeAllListeners"}},{"name":"removeSubscription","kind":2048,"signatures":[{"name":"removeSubscription","kind":4096,"comment":{"summary":[{"kind":"text","text":"Removes the given subscription."}]},"parameters":[{"name":"subscription","kind":32768,"comment":{"summary":[{"kind":"text","text":"A subscription to remove."}]},"type":{"type":"reference","name":"Subscription"}}],"type":{"type":"intrinsic","name":"void"},"inheritedFrom":{"type":"reference","name":"default.removeSubscription"}}],"inheritedFrom":{"type":"reference","name":"default.removeSubscription"}},{"name":"requestPermissionsAsync","kind":2048,"signatures":[{"name":"requestPermissionsAsync","kind":4096,"comment":{"summary":[{"kind":"text","text":"Asks the user to grant permissions for accessing sensor."}]},"type":{"type":"reference","typeArguments":[{"type":"reference","name":"PermissionResponse"}],"name":"Promise","qualifiedName":"Promise","package":"typescript"},"inheritedFrom":{"type":"reference","name":"default.requestPermissionsAsync"}}],"inheritedFrom":{"type":"reference","name":"default.requestPermissionsAsync"}},{"name":"setUpdateInterval","kind":2048,"signatures":[{"name":"setUpdateInterval","kind":4096,"comment":{"summary":[{"kind":"text","text":"Set the sensor update interval."}]},"parameters":[{"name":"intervalMs","kind":32768,"comment":{"summary":[{"kind":"text","text":"Desired interval in milliseconds between sensor updates.\n> Starting from Android 12 (API level 31), the system has a 200ms limit for each sensor updates.\n>\n> If you need an update interval less than 200ms, you should:\n> * add "},{"kind":"code","text":"`android.permission.HIGH_SAMPLING_RATE_SENSORS`"},{"kind":"text","text":" to [**app.json** "},{"kind":"code","text":"`permissions`"},{"kind":"text","text":" field](/versions/latest/config/app/#permissions)\n> * or if you are using bare workflow, add "},{"kind":"code","text":"``"},{"kind":"text","text":" to **AndroidManifest.xml**."}]},"type":{"type":"intrinsic","name":"number"}}],"type":{"type":"intrinsic","name":"void"},"inheritedFrom":{"type":"reference","name":"default.setUpdateInterval"}}],"inheritedFrom":{"type":"reference","name":"default.setUpdateInterval"}}],"extendedTypes":[{"type":"reference","typeArguments":[{"type":"reference","name":"GyroscopeMeasurement"}],"name":"default"}]},{"name":"PermissionExpiration","kind":4194304,"comment":{"summary":[{"kind":"text","text":"Permission expiration time. Currently, all permissions are granted permanently."}]},"type":{"type":"union","types":[{"type":"literal","value":"never"},{"type":"intrinsic","name":"number"}]}},{"name":"PermissionResponse","kind":256,"comment":{"summary":[{"kind":"text","text":"An object obtained by permissions get and request functions."}]},"children":[{"name":"canAskAgain","kind":1024,"comment":{"summary":[{"kind":"text","text":"Indicates if user can be asked again for specific permission.\nIf not, one should be directed to the Settings app\nin order to enable/disable the permission."}]},"type":{"type":"intrinsic","name":"boolean"}},{"name":"expires","kind":1024,"comment":{"summary":[{"kind":"text","text":"Determines time when the permission expires."}]},"type":{"type":"reference","name":"PermissionExpiration"}},{"name":"granted","kind":1024,"comment":{"summary":[{"kind":"text","text":"A convenience boolean that indicates if the permission is granted."}]},"type":{"type":"intrinsic","name":"boolean"}},{"name":"status","kind":1024,"comment":{"summary":[{"kind":"text","text":"Determines the status of the permission."}]},"type":{"type":"reference","name":"PermissionStatus"}}]},{"name":"PermissionStatus","kind":8,"children":[{"name":"DENIED","kind":16,"comment":{"summary":[{"kind":"text","text":"User has denied the permission."}]},"type":{"type":"literal","value":"denied"}},{"name":"GRANTED","kind":16,"comment":{"summary":[{"kind":"text","text":"User has granted the permission."}]},"type":{"type":"literal","value":"granted"}},{"name":"UNDETERMINED","kind":16,"comment":{"summary":[{"kind":"text","text":"User hasn't granted or denied the permission yet."}]},"type":{"type":"literal","value":"undetermined"}}]},{"name":"Subscription","kind":4194304,"type":{"type":"reflection","declaration":{"name":"__type","kind":65536,"children":[{"name":"remove","kind":1024,"type":{"type":"reflection","declaration":{"name":"__type","kind":65536,"signatures":[{"name":"__type","kind":4096,"comment":{"summary":[{"kind":"text","text":"A method to unsubscribe the listener."}]},"type":{"type":"intrinsic","name":"void"}}]}}}]}}}]}
\ No newline at end of file
diff --git a/docs/public/static/data/v49.0.0/expo-haptics.json b/docs/public/static/data/v49.0.0/expo-haptics.json
new file mode 100644
index 0000000000000..8314485847790
--- /dev/null
+++ b/docs/public/static/data/v49.0.0/expo-haptics.json
@@ -0,0 +1 @@
+{"name":"expo-haptics","kind":1,"children":[{"name":"ImpactFeedbackStyle","kind":8,"comment":{"summary":[{"kind":"text","text":"The mass of the objects in the collision simulated by a UIImpactFeedbackGenerator object\n["},{"kind":"code","text":"`UINotificationFeedbackStyle`"},{"kind":"text","text":"](https://developer.apple.com/documentation/uikit/uiimpactfeedbackstyle)"}]},"children":[{"name":"Heavy","kind":16,"comment":{"summary":[{"kind":"text","text":"A collision between large, heavy user interface elements."}]},"type":{"type":"literal","value":"heavy"}},{"name":"Light","kind":16,"comment":{"summary":[{"kind":"text","text":"A collision between small, light user interface elements."}]},"type":{"type":"literal","value":"light"}},{"name":"Medium","kind":16,"comment":{"summary":[{"kind":"text","text":"A collision between moderately sized user interface elements."}]},"type":{"type":"literal","value":"medium"}}]},{"name":"NotificationFeedbackType","kind":8,"comment":{"summary":[{"kind":"text","text":"The type of notification feedback generated by a UINotificationFeedbackGenerator object.\n["},{"kind":"code","text":"`UINotificationFeedbackType`"},{"kind":"text","text":"](https://developer.apple.com/documentation/uikit/uinotificationfeedbacktype)"}]},"children":[{"name":"Error","kind":16,"comment":{"summary":[{"kind":"text","text":"A notification feedback type indicating that a task has failed."}]},"type":{"type":"literal","value":"error"}},{"name":"Success","kind":16,"comment":{"summary":[{"kind":"text","text":"A notification feedback type indicating that a task has completed successfully."}]},"type":{"type":"literal","value":"success"}},{"name":"Warning","kind":16,"comment":{"summary":[{"kind":"text","text":"A notification feedback type indicating that a task has produced a warning."}]},"type":{"type":"literal","value":"warning"}}]},{"name":"impactAsync","kind":64,"signatures":[{"name":"impactAsync","kind":4096,"comment":{"summary":[],"blockTags":[{"tag":"@returns","content":[{"kind":"text","text":"A "},{"kind":"code","text":"`Promise`"},{"kind":"text","text":" which fulfils once native size haptics functionality is triggered."}]}]},"parameters":[{"name":"style","kind":32768,"comment":{"summary":[{"kind":"text","text":"A collision indicator that on iOS is directly mapped to ["},{"kind":"code","text":"`UIImpactFeedbackStyle`"},{"kind":"text","text":"](https://developer.apple.com/documentation/uikit/uiimpactfeedbackstyle),\nwhile on Android these are simulated using [Vibrator](https://developer.android.com/reference/android/os/Vibrator).\nYou can use one of "},{"kind":"code","text":"`Haptics.ImpactFeedbackStyle.{Light, Medium, Heavy}`"},{"kind":"text","text":"."}]},"type":{"type":"reference","name":"ImpactFeedbackStyle"},"defaultValue":"ImpactFeedbackStyle.Medium"}],"type":{"type":"reference","typeArguments":[{"type":"intrinsic","name":"void"}],"name":"Promise","qualifiedName":"Promise","package":"typescript"}}]},{"name":"notificationAsync","kind":64,"signatures":[{"name":"notificationAsync","kind":4096,"comment":{"summary":[{"kind":"text","text":"The kind of notification response used in the feedback."}],"blockTags":[{"tag":"@returns","content":[{"kind":"text","text":"A "},{"kind":"code","text":"`Promise`"},{"kind":"text","text":" which fulfils once native size haptics functionality is triggered."}]}]},"parameters":[{"name":"type","kind":32768,"comment":{"summary":[{"kind":"text","text":"A notification feedback type that on iOS is directly mapped to [UINotificationFeedbackType](https://developer.apple.com/documentation/uikit/uinotificationfeedbacktype),\nwhile on Android these are simulated using [Vibrator](https://developer.android.com/reference/android/os/Vibrator).\nYou can use one of "},{"kind":"code","text":"`Haptics.NotificationFeedbackType.{Success, Warning, Error}`"},{"kind":"text","text":"."}]},"type":{"type":"reference","name":"NotificationFeedbackType"},"defaultValue":"NotificationFeedbackType.Success"}],"type":{"type":"reference","typeArguments":[{"type":"intrinsic","name":"void"}],"name":"Promise","qualifiedName":"Promise","package":"typescript"}}]},{"name":"selectionAsync","kind":64,"signatures":[{"name":"selectionAsync","kind":4096,"comment":{"summary":[{"kind":"text","text":"Used to let a user know when a selection change has been registered."}],"blockTags":[{"tag":"@returns","content":[{"kind":"text","text":"A "},{"kind":"code","text":"`Promise`"},{"kind":"text","text":" which fulfils once native size haptics functionality is triggered."}]}]},"type":{"type":"reference","typeArguments":[{"type":"intrinsic","name":"void"}],"name":"Promise","qualifiedName":"Promise","package":"typescript"}}]}]}
\ No newline at end of file
diff --git a/docs/public/static/data/v49.0.0/expo-image-manipulator.json b/docs/public/static/data/v49.0.0/expo-image-manipulator.json
new file mode 100644
index 0000000000000..5f493a946e54b
--- /dev/null
+++ b/docs/public/static/data/v49.0.0/expo-image-manipulator.json
@@ -0,0 +1 @@
+{"name":"expo-image-manipulator","kind":1,"children":[{"name":"FlipType","kind":8,"children":[{"name":"Horizontal","kind":16,"type":{"type":"literal","value":"horizontal"}},{"name":"Vertical","kind":16,"type":{"type":"literal","value":"vertical"}}]},{"name":"SaveFormat","kind":8,"children":[{"name":"JPEG","kind":16,"type":{"type":"literal","value":"jpeg"}},{"name":"PNG","kind":16,"type":{"type":"literal","value":"png"}},{"name":"WEBP","kind":16,"comment":{"summary":[],"blockTags":[{"tag":"@platform","content":[{"kind":"text","text":"web"}]}]},"type":{"type":"literal","value":"webp"}}]},{"name":"Action","kind":4194304,"type":{"type":"union","types":[{"type":"reference","name":"ActionResize"},{"type":"reference","name":"ActionRotate"},{"type":"reference","name":"ActionFlip"},{"type":"reference","name":"ActionCrop"}]}},{"name":"ActionCrop","kind":4194304,"type":{"type":"reflection","declaration":{"name":"__type","kind":65536,"children":[{"name":"crop","kind":1024,"comment":{"summary":[{"kind":"text","text":"Fields specify top-left corner and dimensions of a crop rectangle."}]},"type":{"type":"reflection","declaration":{"name":"__type","kind":65536,"children":[{"name":"height","kind":1024,"type":{"type":"intrinsic","name":"number"}},{"name":"originX","kind":1024,"type":{"type":"intrinsic","name":"number"}},{"name":"originY","kind":1024,"type":{"type":"intrinsic","name":"number"}},{"name":"width","kind":1024,"type":{"type":"intrinsic","name":"number"}}]}}}]}}},{"name":"ActionFlip","kind":4194304,"type":{"type":"reflection","declaration":{"name":"__type","kind":65536,"children":[{"name":"flip","kind":1024,"comment":{"summary":[{"kind":"text","text":"An axis on which image will be flipped. Only one flip per transformation is available. If you\nwant to flip according to both axes then provide two separate transformations."}]},"type":{"type":"reference","name":"FlipType"}}]}}},{"name":"ActionResize","kind":4194304,"type":{"type":"reflection","declaration":{"name":"__type","kind":65536,"children":[{"name":"resize","kind":1024,"comment":{"summary":[{"kind":"text","text":"Values correspond to the result image dimensions. If you specify only one value, the other will\nbe calculated automatically to preserve image ratio."}]},"type":{"type":"reflection","declaration":{"name":"__type","kind":65536,"children":[{"name":"height","kind":1024,"flags":{"isOptional":true},"type":{"type":"intrinsic","name":"number"}},{"name":"width","kind":1024,"flags":{"isOptional":true},"type":{"type":"intrinsic","name":"number"}}]}}}]}}},{"name":"ActionRotate","kind":4194304,"type":{"type":"reflection","declaration":{"name":"__type","kind":65536,"children":[{"name":"rotate","kind":1024,"comment":{"summary":[{"kind":"text","text":"Degrees to rotate the image. Rotation is clockwise when the value is positive and\ncounter-clockwise when negative."}]},"type":{"type":"intrinsic","name":"number"}}]}}},{"name":"ImageResult","kind":4194304,"type":{"type":"reflection","declaration":{"name":"__type","kind":65536,"children":[{"name":"base64","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"It is included if the "},{"kind":"code","text":"`base64`"},{"kind":"text","text":" save option was truthy, and is a string containing the\nJPEG/PNG (depending on "},{"kind":"code","text":"`format`"},{"kind":"text","text":") data of the image in Base64. Prepend that with "},{"kind":"code","text":"`'data:image/xxx;base64,'`"},{"kind":"text","text":"\nto get a data URI, which you can use as the source for an "},{"kind":"code","text":"`Image`"},{"kind":"text","text":" element for example\n(where "},{"kind":"code","text":"`xxx`"},{"kind":"text","text":" is "},{"kind":"code","text":"`jpeg`"},{"kind":"text","text":" or "},{"kind":"code","text":"`png`"},{"kind":"text","text":")."}]},"type":{"type":"intrinsic","name":"string"}},{"name":"height","kind":1024,"comment":{"summary":[{"kind":"text","text":"Height of the image or video."}]},"type":{"type":"intrinsic","name":"number"}},{"name":"uri","kind":1024,"comment":{"summary":[{"kind":"text","text":"An URI to the modified image (usable as the source for an "},{"kind":"code","text":"`Image`"},{"kind":"text","text":" or "},{"kind":"code","text":"`Video`"},{"kind":"text","text":" element)."}]},"type":{"type":"intrinsic","name":"string"}},{"name":"width","kind":1024,"comment":{"summary":[{"kind":"text","text":"Width of the image or video."}]},"type":{"type":"intrinsic","name":"number"}}]}}},{"name":"SaveOptions","kind":4194304,"comment":{"summary":[{"kind":"text","text":"A map defining how modified image should be saved."}]},"type":{"type":"reflection","declaration":{"name":"__type","kind":65536,"children":[{"name":"base64","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"Whether to also include the image data in Base64 format."}]},"type":{"type":"intrinsic","name":"boolean"}},{"name":"compress","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"A value in range "},{"kind":"code","text":"`0.0`"},{"kind":"text","text":" - "},{"kind":"code","text":"`1.0`"},{"kind":"text","text":" specifying compression level of the result image. "},{"kind":"code","text":"`1`"},{"kind":"text","text":" means\nno compression (highest quality) and "},{"kind":"code","text":"`0`"},{"kind":"text","text":" the highest compression (lowest quality)."}]},"type":{"type":"intrinsic","name":"number"}},{"name":"format","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"Specifies what type of compression should be used and what is the result file extension.\n"},{"kind":"code","text":"`SaveFormat.PNG`"},{"kind":"text","text":" compression is lossless but slower, "},{"kind":"code","text":"`SaveFormat.JPEG`"},{"kind":"text","text":" is faster but the image\nhas visible artifacts. Defaults to "},{"kind":"code","text":"`SaveFormat.JPEG`"}]},"type":{"type":"reference","name":"SaveFormat"}}]}}},{"name":"manipulateAsync","kind":64,"signatures":[{"name":"manipulateAsync","kind":4096,"comment":{"summary":[{"kind":"text","text":"Manipulate the image provided via "},{"kind":"code","text":"`uri`"},{"kind":"text","text":". Available modifications are rotating, flipping (mirroring),\nresizing and cropping. Each invocation results in a new file. With one invocation you can provide\na set of actions to perform over the image. Overwriting the source file would not have an effect\nin displaying the result as images are cached."}],"blockTags":[{"tag":"@returns","content":[{"kind":"text","text":"Promise which fulfils with ["},{"kind":"code","text":"`ImageResult`"},{"kind":"text","text":"](#imageresult) object."}]}]},"parameters":[{"name":"uri","kind":32768,"comment":{"summary":[{"kind":"text","text":"URI of the file to manipulate. Should be on the local file system or a base64 data URI."}]},"type":{"type":"intrinsic","name":"string"}},{"name":"actions","kind":32768,"comment":{"summary":[{"kind":"text","text":"An array of objects representing manipulation options. Each object should have\n__only one__ of the keys that corresponds to specific transformation."}]},"type":{"type":"array","elementType":{"type":"reference","name":"Action"}},"defaultValue":"[]"},{"name":"saveOptions","kind":32768,"comment":{"summary":[{"kind":"text","text":"A map defining how modified image should be saved."}]},"type":{"type":"reference","name":"SaveOptions"},"defaultValue":"{}"}],"type":{"type":"reference","typeArguments":[{"type":"reference","name":"ImageResult"}],"name":"Promise","qualifiedName":"Promise","package":"typescript"}}]}]}
\ No newline at end of file
diff --git a/docs/public/static/data/v49.0.0/expo-image-picker.json b/docs/public/static/data/v49.0.0/expo-image-picker.json
new file mode 100644
index 0000000000000..0b3b8c38cec12
--- /dev/null
+++ b/docs/public/static/data/v49.0.0/expo-image-picker.json
@@ -0,0 +1 @@
+{"name":"expo-image-picker","kind":1,"children":[{"name":"CameraType","kind":8,"children":[{"name":"back","kind":16,"comment":{"summary":[{"kind":"text","text":"Back/rear camera."}]},"type":{"type":"literal","value":"back"}},{"name":"front","kind":16,"comment":{"summary":[{"kind":"text","text":"Front camera"}]},"type":{"type":"literal","value":"front"}}]},{"name":"MediaTypeOptions","kind":8,"children":[{"name":"All","kind":16,"comment":{"summary":[{"kind":"text","text":"Images and videos."}]},"type":{"type":"literal","value":"All"}},{"name":"Images","kind":16,"comment":{"summary":[{"kind":"text","text":"Only images."}]},"type":{"type":"literal","value":"Images"}},{"name":"Videos","kind":16,"comment":{"summary":[{"kind":"text","text":"Only videos."}]},"type":{"type":"literal","value":"Videos"}}]},{"name":"PermissionStatus","kind":8,"children":[{"name":"DENIED","kind":16,"comment":{"summary":[{"kind":"text","text":"User has denied the permission."}]},"type":{"type":"literal","value":"denied"}},{"name":"GRANTED","kind":16,"comment":{"summary":[{"kind":"text","text":"User has granted the permission."}]},"type":{"type":"literal","value":"granted"}},{"name":"UNDETERMINED","kind":16,"comment":{"summary":[{"kind":"text","text":"User hasn't granted or denied the permission yet."}]},"type":{"type":"literal","value":"undetermined"}}]},{"name":"UIImagePickerControllerQualityType","kind":8,"children":[{"name":"High","kind":16,"comment":{"summary":[{"kind":"text","text":"Highest available resolution."}]},"type":{"type":"literal","value":0}},{"name":"IFrame1280x720","kind":16,"comment":{"summary":[{"kind":"text","text":"1280 × 720"}]},"type":{"type":"literal","value":4}},{"name":"IFrame960x540","kind":16,"comment":{"summary":[{"kind":"text","text":"960 × 540"}]},"type":{"type":"literal","value":5}},{"name":"Low","kind":16,"comment":{"summary":[{"kind":"text","text":"Depends on the device."}]},"type":{"type":"literal","value":2}},{"name":"Medium","kind":16,"comment":{"summary":[{"kind":"text","text":"Depends on the device."}]},"type":{"type":"literal","value":1}},{"name":"VGA640x480","kind":16,"comment":{"summary":[{"kind":"text","text":"640 × 480"}]},"type":{"type":"literal","value":3}}]},{"name":"UIImagePickerPreferredAssetRepresentationMode","kind":8,"comment":{"summary":[{"kind":"text","text":"Picker preferred asset representation mode. Its values are directly mapped to the ["},{"kind":"code","text":"`PHPickerConfigurationAssetRepresentationMode`"},{"kind":"text","text":"](https://developer.apple.com/documentation/photokit/phpickerconfigurationassetrepresentationmode)."}],"blockTags":[{"tag":"@platform","content":[{"kind":"text","text":"ios"}]}]},"children":[{"name":"Automatic","kind":16,"comment":{"summary":[{"kind":"text","text":"A mode that indicates that the system chooses the appropriate asset representation."}]},"type":{"type":"literal","value":"automatic"}},{"name":"Compatible","kind":16,"comment":{"summary":[{"kind":"text","text":"A mode that uses the most compatible asset representation."}]},"type":{"type":"literal","value":"compatible"}},{"name":"Current","kind":16,"comment":{"summary":[{"kind":"text","text":"A mode that uses the current representation to avoid transcoding, if possible."}]},"type":{"type":"literal","value":"current"}}]},{"name":"UIImagePickerPresentationStyle","kind":8,"comment":{"summary":[{"kind":"text","text":"Picker presentation style. Its values are directly mapped to the ["},{"kind":"code","text":"`UIModalPresentationStyle`"},{"kind":"text","text":"](https://developer.apple.com/documentation/uikit/uiviewcontroller/1621355-modalpresentationstyle)."}],"blockTags":[{"tag":"@platform","content":[{"kind":"text","text":"ios"}]}]},"children":[{"name":"AUTOMATIC","kind":16,"comment":{"summary":[{"kind":"text","text":"The default presentation style chosen by the system.\nOn older iOS versions, falls back to "},{"kind":"code","text":"`WebBrowserPresentationStyle.FullScreen`"},{"kind":"text","text":"."}],"blockTags":[{"tag":"@platform","content":[{"kind":"text","text":"ios 13+"}]}]},"type":{"type":"literal","value":"automatic"}},{"name":"CURRENT_CONTEXT","kind":16,"comment":{"summary":[{"kind":"text","text":"A presentation style where the picker is displayed over the app's content."}]},"type":{"type":"literal","value":"currentContext"}},{"name":"FORM_SHEET","kind":16,"comment":{"summary":[{"kind":"text","text":"A presentation style that displays the picker centered in the screen."}]},"type":{"type":"literal","value":"formSheet"}},{"name":"FULL_SCREEN","kind":16,"comment":{"summary":[{"kind":"text","text":"A presentation style in which the presented picker covers the screen."}]},"type":{"type":"literal","value":"fullScreen"}},{"name":"OVER_CURRENT_CONTEXT","kind":16,"comment":{"summary":[{"kind":"text","text":"A presentation style where the picker is displayed over the app's content."}]},"type":{"type":"literal","value":"overCurrentContext"}},{"name":"OVER_FULL_SCREEN","kind":16,"comment":{"summary":[{"kind":"text","text":"A presentation style in which the picker view covers the screen."}]},"type":{"type":"literal","value":"overFullScreen"}},{"name":"PAGE_SHEET","kind":16,"comment":{"summary":[{"kind":"text","text":"A presentation style that partially covers the underlying content."}]},"type":{"type":"literal","value":"pageSheet"}},{"name":"POPOVER","kind":16,"comment":{"summary":[{"kind":"text","text":"A presentation style where the picker is displayed in a popover view."}]},"type":{"type":"literal","value":"popover"}}]},{"name":"VideoExportPreset","kind":8,"children":[{"name":"H264_1280x720","kind":16,"comment":{"summary":[{"kind":"text","text":"Resolution: __1280 × 720__ •\nVideo compression: __H.264__ •\nAudio compression: __AAC__"}]},"type":{"type":"literal","value":6}},{"name":"H264_1920x1080","kind":16,"comment":{"summary":[{"kind":"text","text":"Resolution: __1920 × 1080__ •\nVideo compression: __H.264__ •\nAudio compression: __AAC__"}]},"type":{"type":"literal","value":7}},{"name":"H264_3840x2160","kind":16,"comment":{"summary":[{"kind":"text","text":"Resolution: __3840 × 2160__ •\nVideo compression: __H.264__ •\nAudio compression: __AAC__"}]},"type":{"type":"literal","value":8}},{"name":"H264_640x480","kind":16,"comment":{"summary":[{"kind":"text","text":"Resolution: __640 × 480__ •\nVideo compression: __H.264__ •\nAudio compression: __AAC__"}]},"type":{"type":"literal","value":4}},{"name":"H264_960x540","kind":16,"comment":{"summary":[{"kind":"text","text":"Resolution: __960 × 540__ •\nVideo compression: __H.264__ •\nAudio compression: __AAC__"}]},"type":{"type":"literal","value":5}},{"name":"HEVC_1920x1080","kind":16,"comment":{"summary":[{"kind":"text","text":"Resolution: __1920 × 1080__ •\nVideo compression: __HEVC__ •\nAudio compression: __AAC__"}]},"type":{"type":"literal","value":9}},{"name":"HEVC_3840x2160","kind":16,"comment":{"summary":[{"kind":"text","text":"Resolution: __3840 × 2160__ •\nVideo compression: __HEVC__ •\nAudio compression: __AAC__"}]},"type":{"type":"literal","value":10}},{"name":"HighestQuality","kind":16,"comment":{"summary":[{"kind":"text","text":"Resolution: __Depends on the device__ •\nVideo compression: __H.264__ •\nAudio compression: __AAC__"}]},"type":{"type":"literal","value":3}},{"name":"LowQuality","kind":16,"comment":{"summary":[{"kind":"text","text":"Resolution: __Depends on the device__ •\nVideo compression: __H.264__ •\nAudio compression: __AAC__"}]},"type":{"type":"literal","value":1}},{"name":"MediumQuality","kind":16,"comment":{"summary":[{"kind":"text","text":"Resolution: __Depends on the device__ •\nVideo compression: __H.264__ •\nAudio compression: __AAC__"}]},"type":{"type":"literal","value":2}},{"name":"Passthrough","kind":16,"comment":{"summary":[{"kind":"text","text":"Resolution: __Unchanged__ •\nVideo compression: __None__ •\nAudio compression: __None__"}]},"type":{"type":"literal","value":0}}]},{"name":"PermissionResponse","kind":256,"comment":{"summary":[{"kind":"text","text":"An object obtained by permissions get and request functions."}]},"children":[{"name":"canAskAgain","kind":1024,"comment":{"summary":[{"kind":"text","text":"Indicates if user can be asked again for specific permission.\nIf not, one should be directed to the Settings app\nin order to enable/disable the permission."}]},"type":{"type":"intrinsic","name":"boolean"}},{"name":"expires","kind":1024,"comment":{"summary":[{"kind":"text","text":"Determines time when the permission expires."}]},"type":{"type":"reference","name":"PermissionExpiration"}},{"name":"granted","kind":1024,"comment":{"summary":[{"kind":"text","text":"A convenience boolean that indicates if the permission is granted."}]},"type":{"type":"intrinsic","name":"boolean"}},{"name":"status","kind":1024,"comment":{"summary":[{"kind":"text","text":"Determines the status of the permission."}]},"type":{"type":"reference","name":"PermissionStatus"}}]},{"name":"CameraPermissionResponse","kind":4194304,"comment":{"summary":[{"kind":"text","text":"Alias for "},{"kind":"code","text":"`PermissionResponse`"},{"kind":"text","text":" type exported by "},{"kind":"code","text":"`expo-modules-core`"},{"kind":"text","text":"."}]},"type":{"type":"reference","name":"PermissionResponse"}},{"name":"ImagePickerAsset","kind":4194304,"comment":{"summary":[{"kind":"text","text":"Represents an asset (image or video) returned by the image picker or camera."}]},"type":{"type":"reflection","declaration":{"name":"__type","kind":65536,"children":[{"name":"assetId","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"The unique ID that represents the picked image or video, if picked from the library. It can be used\nby [expo-media-library](./media-library) to manage the picked asset.\n\n> This might be "},{"kind":"code","text":"`null`"},{"kind":"text","text":" when the ID is unavailable or the user gave limited permission to access the media library.\n> On Android, the ID is unavailable when the user selects a photo by directly browsing file system."}],"blockTags":[{"tag":"@platform","content":[{"kind":"text","text":"ios"}]},{"tag":"@platform","content":[{"kind":"text","text":"android"}]}]},"type":{"type":"union","types":[{"type":"intrinsic","name":"string"},{"type":"literal","value":null}]}},{"name":"base64","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"When the "},{"kind":"code","text":"`base64`"},{"kind":"text","text":" option is truthy, it is a Base64-encoded string of the selected image's JPEG data, otherwise "},{"kind":"code","text":"`null`"},{"kind":"text","text":".\nIf you prepend this with "},{"kind":"code","text":"`'data:image/jpeg;base64,'`"},{"kind":"text","text":" to create a data URI,\nyou can use it as the source of an "},{"kind":"code","text":"`Image`"},{"kind":"text","text":" element; for example:\n"},{"kind":"code","text":"```ts\n \n```"}]},"type":{"type":"union","types":[{"type":"intrinsic","name":"string"},{"type":"literal","value":null}]}},{"name":"duration","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"Length of the video in milliseconds or "},{"kind":"code","text":"`null`"},{"kind":"text","text":" if the asset is not a video."}]},"type":{"type":"union","types":[{"type":"intrinsic","name":"number"},{"type":"literal","value":null}]}},{"name":"exif","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"The "},{"kind":"code","text":"`exif`"},{"kind":"text","text":" field is included if the "},{"kind":"code","text":"`exif`"},{"kind":"text","text":" option is truthy, and is an object containing the\nimage's EXIF data. The names of this object's properties are EXIF tags and the values are the\nrespective EXIF values for those tags."}]},"type":{"type":"union","types":[{"type":"reference","typeArguments":[{"type":"intrinsic","name":"string"},{"type":"intrinsic","name":"any"}],"name":"Record","qualifiedName":"Record","package":"typescript"},{"type":"literal","value":null}]}},{"name":"fileName","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"Preferred filename to use when saving this item. This might be "},{"kind":"code","text":"`null`"},{"kind":"text","text":" when the name is unavailable\nor user gave limited permission to access the media library."}],"blockTags":[{"tag":"@platform","content":[{"kind":"text","text":"ios"}]}]},"type":{"type":"union","types":[{"type":"intrinsic","name":"string"},{"type":"literal","value":null}]}},{"name":"fileSize","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"File size of the picked image or video, in bytes."}],"blockTags":[{"tag":"@platform","content":[{"kind":"text","text":"ios"}]}]},"type":{"type":"intrinsic","name":"number"}},{"name":"height","kind":1024,"comment":{"summary":[{"kind":"text","text":"Height of the image or video."}]},"type":{"type":"intrinsic","name":"number"}},{"name":"type","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"The type of the asset."}]},"type":{"type":"union","types":[{"type":"literal","value":"image"},{"type":"literal","value":"video"}]}},{"name":"uri","kind":1024,"comment":{"summary":[{"kind":"text","text":"URI to the local image or video file (usable as the source of an "},{"kind":"code","text":"`Image`"},{"kind":"text","text":" element, in the case of\nan image) and "},{"kind":"code","text":"`width`"},{"kind":"text","text":" and "},{"kind":"code","text":"`height`"},{"kind":"text","text":" specify the dimensions of the media."}]},"type":{"type":"intrinsic","name":"string"}},{"name":"width","kind":1024,"comment":{"summary":[{"kind":"text","text":"Width of the image or video."}]},"type":{"type":"intrinsic","name":"number"}}]}}},{"name":"ImagePickerCanceledResult","kind":4194304,"comment":{"summary":[{"kind":"text","text":"Type representing canceled pick result."}]},"type":{"type":"reflection","declaration":{"name":"__type","kind":65536,"children":[{"name":"assets","kind":1024,"comment":{"summary":[{"kind":"code","text":"`null`"},{"kind":"text","text":" signifying that the request was canceled."}]},"type":{"type":"literal","value":null}},{"name":"canceled","kind":1024,"comment":{"summary":[{"kind":"text","text":"Boolean flag set to "},{"kind":"code","text":"`true`"},{"kind":"text","text":" showing that the request was canceled."}]},"type":{"type":"literal","value":true}}]}}},{"name":"ImagePickerErrorResult","kind":4194304,"type":{"type":"reflection","declaration":{"name":"__type","kind":65536,"children":[{"name":"code","kind":1024,"comment":{"summary":[{"kind":"text","text":"The error code."}]},"type":{"type":"intrinsic","name":"string"}},{"name":"exception","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"The exception which caused the error."}]},"type":{"type":"intrinsic","name":"string"}},{"name":"message","kind":1024,"comment":{"summary":[{"kind":"text","text":"The error message."}]},"type":{"type":"intrinsic","name":"string"}}]}}},{"name":"ImagePickerOptions","kind":4194304,"type":{"type":"reflection","declaration":{"name":"__type","kind":65536,"children":[{"name":"allowsEditing","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"Whether to show a UI to edit the image after it is picked. On Android the user can crop and\nrotate the image and on iOS simply crop it.\n\n> - Cropping multiple images is not supported - this option is mutually exclusive with "},{"kind":"code","text":"`allowsMultipleSelection`"},{"kind":"text","text":".\n> - On iOS, this option is ignored if "},{"kind":"code","text":"`allowsMultipleSelection`"},{"kind":"text","text":" is enabled.\n> - On iOS cropping a "},{"kind":"code","text":"`.bmp`"},{"kind":"text","text":" image will convert it to "},{"kind":"code","text":"`.png`"},{"kind":"text","text":"."}],"blockTags":[{"tag":"@default","content":[{"kind":"text","text":"false"}]},{"tag":"@platform","content":[{"kind":"text","text":"ios"}]},{"tag":"@platform","content":[{"kind":"text","text":"android"}]}]},"type":{"type":"intrinsic","name":"boolean"}},{"name":"allowsMultipleSelection","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"Whether or not to allow selecting multiple media files at once.\n\n> Cropping multiple images is not supported - this option is mutually exclusive with "},{"kind":"code","text":"`allowsEditing`"},{"kind":"text","text":".\n> If this option is enabled, then "},{"kind":"code","text":"`allowsEditing`"},{"kind":"text","text":" is ignored."}],"blockTags":[{"tag":"@default","content":[{"kind":"text","text":"false"}]},{"tag":"@platform","content":[{"kind":"text","text":"ios 14+"}]},{"tag":"@platform","content":[{"kind":"text","text":"android"}]},{"tag":"@platform","content":[{"kind":"text","text":"web"}]}]},"type":{"type":"intrinsic","name":"boolean"}},{"name":"aspect","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"An array with two entries "},{"kind":"code","text":"`[x, y]`"},{"kind":"text","text":" specifying the aspect ratio to maintain if the user is\nallowed to edit the image (by passing "},{"kind":"code","text":"`allowsEditing: true`"},{"kind":"text","text":"). This is only applicable on\nAndroid, since on iOS the crop rectangle is always a square."}]},"type":{"type":"tuple","elements":[{"type":"intrinsic","name":"number"},{"type":"intrinsic","name":"number"}]}},{"name":"base64","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"Whether to also include the image data in Base64 format."}]},"type":{"type":"intrinsic","name":"boolean"}},{"name":"cameraType","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"Selects the camera-facing type. The "},{"kind":"code","text":"`CameraType`"},{"kind":"text","text":" enum provides two options:\n"},{"kind":"code","text":"`front`"},{"kind":"text","text":" for the front-facing camera and "},{"kind":"code","text":"`back`"},{"kind":"text","text":" for the back-facing camera.\n- **On Android**, the behavior of this option may vary based on the camera app installed on the device."}],"blockTags":[{"tag":"@default","content":[{"kind":"text","text":"CameraType.back"}]},{"tag":"@platform","content":[{"kind":"text","text":"ios"}]},{"tag":"@platform","content":[{"kind":"text","text":"android"}]}]},"type":{"type":"reference","name":"CameraType"}},{"name":"exif","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"Whether to also include the EXIF data for the image. On iOS the EXIF data does not include GPS\ntags in the camera case."}]},"type":{"type":"intrinsic","name":"boolean"}},{"name":"mediaTypes","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"Choose what type of media to pick."}],"blockTags":[{"tag":"@default","content":[{"kind":"text","text":"ImagePicker.MediaTypeOptions.Images"}]}]},"type":{"type":"reference","name":"MediaTypeOptions"}},{"name":"orderedSelection","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"Whether to display number badges when assets are selected. The badges are numbered\nin selection order. Assets are then returned in the exact same order they were selected.\n\n> Assets should be returned in the selection order regardless of this option,\n> but there is no guarantee that it is always true when this option is disabled."}],"blockTags":[{"tag":"@platform","content":[{"kind":"text","text":"ios 15+"}]},{"tag":"@default","content":[{"kind":"text","text":"false"}]}]},"type":{"type":"intrinsic","name":"boolean"}},{"name":"preferredAssetRepresentationMode","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"Choose [preferred asset representation mode](https://developer.apple.com/documentation/photokit/phpickerconfigurationassetrepresentationmode)\nto use when loading assets."}],"blockTags":[{"tag":"@default","content":[{"kind":"text","text":"ImagePicker.UIImagePickerPreferredAssetRepresentationMode.Automatic"}]},{"tag":"@platform","content":[{"kind":"text","text":"ios 14+"}]}]},"type":{"type":"reference","name":"UIImagePickerPreferredAssetRepresentationMode"}},{"name":"presentationStyle","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"Choose [presentation style](https://developer.apple.com/documentation/uikit/uiviewcontroller/1621355-modalpresentationstyle?language=objc)\nto customize view during taking photo/video."}],"blockTags":[{"tag":"@default","content":[{"kind":"text","text":"ImagePicker.UIImagePickerPresentationStyle.Automatic"}]},{"tag":"@platform","content":[{"kind":"text","text":"ios"}]}]},"type":{"type":"reference","name":"UIImagePickerPresentationStyle"}},{"name":"quality","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"Specify the quality of compression, from "},{"kind":"code","text":"`0`"},{"kind":"text","text":" to "},{"kind":"code","text":"`1`"},{"kind":"text","text":". "},{"kind":"code","text":"`0`"},{"kind":"text","text":" means compress for small size,\n"},{"kind":"code","text":"`1`"},{"kind":"text","text":" means compress for maximum quality.\n> Note: If the selected image has been compressed before, the size of the output file may be\n> bigger than the size of the original image.\n\n> Note: On iOS, if a "},{"kind":"code","text":"`.bmp`"},{"kind":"text","text":" or "},{"kind":"code","text":"`.png`"},{"kind":"text","text":" image is selected from the library, this option is ignored."}],"blockTags":[{"tag":"@default","content":[{"kind":"text","text":"0.2"}]},{"tag":"@platform","content":[{"kind":"text","text":"ios"}]},{"tag":"@platform","content":[{"kind":"text","text":"android"}]}]},"type":{"type":"intrinsic","name":"number"}},{"name":"selectionLimit","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"The maximum number of items that user can select. Applicable when "},{"kind":"code","text":"`allowsMultipleSelection`"},{"kind":"text","text":" is enabled.\nSetting the value to "},{"kind":"code","text":"`0`"},{"kind":"text","text":" sets the selection limit to the maximum that the system supports."}],"blockTags":[{"tag":"@platform","content":[{"kind":"text","text":"ios 14+"}]},{"tag":"@platform","content":[{"kind":"text","text":"android"}]},{"tag":"@default","content":[{"kind":"text","text":"0"}]}]},"type":{"type":"intrinsic","name":"number"}},{"name":"videoExportPreset","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"Specify preset which will be used to compress selected video."}],"blockTags":[{"tag":"@default","content":[{"kind":"text","text":"ImagePicker.VideoExportPreset.Passthrough"}]},{"tag":"@platform","content":[{"kind":"text","text":"ios 11+"}]},{"tag":"@deprecated","content":[{"kind":"text","text":"See ["},{"kind":"code","text":"`videoExportPreset`"},{"kind":"text","text":"](https://developer.apple.com/documentation/uikit/uiimagepickercontroller/2890964-videoexportpreset?language=objc)\nin Apple documentation."}]}]},"type":{"type":"reference","name":"VideoExportPreset"}},{"name":"videoMaxDuration","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"Maximum duration, in seconds, for video recording. Setting this to "},{"kind":"code","text":"`0`"},{"kind":"text","text":" disables the limit.\nDefaults to "},{"kind":"code","text":"`0`"},{"kind":"text","text":" (no limit).\n- **On iOS**, when "},{"kind":"code","text":"`allowsEditing`"},{"kind":"text","text":" is set to "},{"kind":"code","text":"`true`"},{"kind":"text","text":", maximum duration is limited to 10 minutes.\n This limit is applied automatically, if "},{"kind":"code","text":"`0`"},{"kind":"text","text":" or no value is specified.\n- **On Android**, effect of this option depends on support of installed camera app.\n- **On Web** this option has no effect - the limit is browser-dependant."}]},"type":{"type":"intrinsic","name":"number"}},{"name":"videoQuality","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"Specify the quality of recorded videos. Defaults to the highest quality available for the device."}],"blockTags":[{"tag":"@default","content":[{"kind":"text","text":"ImagePicker.UIImagePickerControllerQualityType.High"}]},{"tag":"@platform","content":[{"kind":"text","text":"ios"}]}]},"type":{"type":"reference","name":"UIImagePickerControllerQualityType"}}]}}},{"name":"ImagePickerResult","kind":4194304,"comment":{"summary":[{"kind":"text","text":"Type representing successful and canceled pick result."}]},"type":{"type":"union","types":[{"type":"reference","name":"ImagePickerSuccessResult"},{"type":"reference","name":"ImagePickerCanceledResult"}]}},{"name":"ImagePickerSuccessResult","kind":4194304,"comment":{"summary":[{"kind":"text","text":"Type representing successful pick result."}]},"type":{"type":"reflection","declaration":{"name":"__type","kind":65536,"children":[{"name":"assets","kind":1024,"comment":{"summary":[{"kind":"text","text":"An array of picked assets."}]},"type":{"type":"array","elementType":{"type":"reference","name":"ImagePickerAsset"}}},{"name":"canceled","kind":1024,"comment":{"summary":[{"kind":"text","text":"Boolean flag set to "},{"kind":"code","text":"`false`"},{"kind":"text","text":" showing that the request was successful."}]},"type":{"type":"literal","value":false}}]}}},{"name":"MediaLibraryPermissionResponse","kind":4194304,"comment":{"summary":[{"kind":"text","text":"Extends "},{"kind":"code","text":"`PermissionResponse`"},{"kind":"text","text":" type exported by "},{"kind":"code","text":"`expo-modules-core`"},{"kind":"text","text":", containing additional iOS-specific field."}]},"type":{"type":"intersection","types":[{"type":"reference","name":"PermissionResponse"},{"type":"reflection","declaration":{"name":"__type","kind":65536,"children":[{"name":"accessPrivileges","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[],"blockTags":[{"tag":"@platform","content":[{"kind":"text","text":"ios"}]}]},"type":{"type":"union","types":[{"type":"literal","value":"all"},{"type":"literal","value":"limited"},{"type":"literal","value":"none"}]}}]}}]}},{"name":"OpenFileBrowserOptions","kind":4194304,"type":{"type":"reflection","declaration":{"name":"__type","kind":65536,"children":[{"name":"allowsMultipleSelection","kind":1024,"comment":{"summary":[{"kind":"text","text":"Whether or not to allow selecting multiple media files at once."}],"blockTags":[{"tag":"@platform","content":[{"kind":"text","text":"web"}]}]},"type":{"type":"intrinsic","name":"boolean"}},{"name":"base64","kind":1024,"comment":{"summary":[{"kind":"text","text":"Whether to also include the image data in Base64 format."}]},"type":{"type":"intrinsic","name":"boolean"}},{"name":"capture","kind":1024,"flags":{"isOptional":true},"type":{"type":"intrinsic","name":"boolean"}},{"name":"mediaTypes","kind":1024,"comment":{"summary":[{"kind":"text","text":"Choose what type of media to pick."}],"blockTags":[{"tag":"@default","content":[{"kind":"text","text":"ImagePicker.MediaTypeOptions.Images"}]}]},"type":{"type":"reference","name":"MediaTypeOptions"}}]}}},{"name":"PermissionExpiration","kind":4194304,"comment":{"summary":[{"kind":"text","text":"Permission expiration time. Currently, all permissions are granted permanently."}]},"type":{"type":"union","types":[{"type":"literal","value":"never"},{"type":"intrinsic","name":"number"}]}},{"name":"PermissionHookOptions","kind":4194304,"typeParameters":[{"name":"Options","kind":131072,"type":{"type":"intrinsic","name":"object"}}],"type":{"type":"intersection","types":[{"type":"reference","name":"PermissionHookBehavior"},{"type":"reference","name":"Options"}]}},{"name":"getCameraPermissionsAsync","kind":64,"signatures":[{"name":"getCameraPermissionsAsync","kind":4096,"comment":{"summary":[{"kind":"text","text":"Checks user's permissions for accessing camera."}],"blockTags":[{"tag":"@returns","content":[{"kind":"text","text":"A promise that fulfills with an object of type [CameraPermissionResponse](#camerapermissionresponse)."}]}]},"type":{"type":"reference","typeArguments":[{"type":"reference","name":"CameraPermissionResponse"}],"name":"Promise","qualifiedName":"Promise","package":"typescript"}}]},{"name":"getMediaLibraryPermissionsAsync","kind":64,"signatures":[{"name":"getMediaLibraryPermissionsAsync","kind":4096,"comment":{"summary":[{"kind":"text","text":"Checks user's permissions for accessing photos."}],"blockTags":[{"tag":"@returns","content":[{"kind":"text","text":"A promise that fulfills with an object of type [MediaLibraryPermissionResponse](#medialibrarypermissionresponse)."}]}]},"parameters":[{"name":"writeOnly","kind":32768,"comment":{"summary":[{"kind":"text","text":"Whether to request write or read and write permissions. Defaults to "},{"kind":"code","text":"`false`"}]},"type":{"type":"intrinsic","name":"boolean"},"defaultValue":"false"}],"type":{"type":"reference","typeArguments":[{"type":"reference","name":"MediaLibraryPermissionResponse"}],"name":"Promise","qualifiedName":"Promise","package":"typescript"}}]},{"name":"getPendingResultAsync","kind":64,"signatures":[{"name":"getPendingResultAsync","kind":4096,"comment":{"summary":[{"kind":"text","text":"Android system sometimes kills the "},{"kind":"code","text":"`MainActivity`"},{"kind":"text","text":" after the "},{"kind":"code","text":"`ImagePicker`"},{"kind":"text","text":" finishes. When this\nhappens, we lost the data selected from the "},{"kind":"code","text":"`ImagePicker`"},{"kind":"text","text":". However, you can retrieve the lost\ndata by calling "},{"kind":"code","text":"`getPendingResultAsync`"},{"kind":"text","text":". You can test this functionality by turning on\n"},{"kind":"code","text":"`Don't keep activities`"},{"kind":"text","text":" in the developer options."}],"blockTags":[{"tag":"@returns","content":[{"kind":"text","text":"- **On Android:** a promise that resolves to an array of objects of exactly same type as in\n"},{"kind":"code","text":"`ImagePicker.launchImageLibraryAsync`"},{"kind":"text","text":" or "},{"kind":"code","text":"`ImagePicker.launchCameraAsync`"},{"kind":"text","text":" if the "},{"kind":"code","text":"`ImagePicker`"},{"kind":"text","text":"\nfinished successfully. Otherwise, to the array of ["},{"kind":"code","text":"`ImagePickerErrorResult`"},{"kind":"text","text":"](#imagepickerimagepickererrorresult).\n- **On other platforms:** an empty array."}]}]},"type":{"type":"reference","typeArguments":[{"type":"array","elementType":{"type":"union","types":[{"type":"reference","name":"ImagePickerResult"},{"type":"reference","name":"ImagePickerErrorResult"}]}}],"name":"Promise","qualifiedName":"Promise","package":"typescript"}}]},{"name":"launchCameraAsync","kind":64,"signatures":[{"name":"launchCameraAsync","kind":4096,"comment":{"summary":[{"kind":"text","text":"Display the system UI for taking a photo with the camera. Requires "},{"kind":"code","text":"`Permissions.CAMERA`"},{"kind":"text","text":".\nOn Android and iOS 10 "},{"kind":"code","text":"`Permissions.CAMERA_ROLL`"},{"kind":"text","text":" is also required. On mobile web, this must be\ncalled immediately in a user interaction like a button press, otherwise the browser will block\nthe request without a warning.\n> **Note:** Make sure that you handle "},{"kind":"code","text":"`MainActivity`"},{"kind":"text","text":" destruction on **Android**. See [ImagePicker.getPendingResultAsync](#imagepickergetpendingresultasync).\n> **Notes for Web:** The system UI can only be shown after user activation (e.g. a "},{"kind":"code","text":"`Button`"},{"kind":"text","text":" press).\nTherefore, calling "},{"kind":"code","text":"`launchCameraAsync`"},{"kind":"text","text":" in "},{"kind":"code","text":"`componentDidMount`"},{"kind":"text","text":", for example, will **not** work as\nintended. The "},{"kind":"code","text":"`cancelled`"},{"kind":"text","text":" event will not be returned in the browser due to platform restrictions\nand inconsistencies across browsers."}],"blockTags":[{"tag":"@returns","content":[{"kind":"text","text":"A promise that resolves to an object with "},{"kind":"code","text":"`canceled`"},{"kind":"text","text":" and "},{"kind":"code","text":"`assets`"},{"kind":"text","text":" fields.\nWhen the user canceled the action the "},{"kind":"code","text":"`assets`"},{"kind":"text","text":" is always "},{"kind":"code","text":"`null`"},{"kind":"text","text":", otherwise it's an array of\nthe selected media assets which have a form of ["},{"kind":"code","text":"`ImagePickerAsset`"},{"kind":"text","text":"](#imagepickerasset)."}]}]},"parameters":[{"name":"options","kind":32768,"comment":{"summary":[{"kind":"text","text":"An "},{"kind":"code","text":"`ImagePickerOptions`"},{"kind":"text","text":" object."}]},"type":{"type":"reference","name":"ImagePickerOptions"},"defaultValue":"{}"}],"type":{"type":"reference","typeArguments":[{"type":"reference","name":"ImagePickerResult"}],"name":"Promise","qualifiedName":"Promise","package":"typescript"}}]},{"name":"launchImageLibraryAsync","kind":64,"signatures":[{"name":"launchImageLibraryAsync","kind":4096,"comment":{"summary":[{"kind":"text","text":"Display the system UI for choosing an image or a video from the phone's library.\nRequires "},{"kind":"code","text":"`Permissions.MEDIA_LIBRARY`"},{"kind":"text","text":" on iOS 10 only. On mobile web, this must be called\nimmediately in a user interaction like a button press, otherwise the browser will block the\nrequest without a warning.\n\n**Animated GIFs support:** On Android, if the selected image is an animated GIF, the result image will be an\nanimated GIF too if and only if "},{"kind":"code","text":"`quality`"},{"kind":"text","text":" is explicitly set to "},{"kind":"code","text":"`1.0`"},{"kind":"text","text":" and "},{"kind":"code","text":"`allowsEditing`"},{"kind":"text","text":" is set to "},{"kind":"code","text":"`false`"},{"kind":"text","text":".\nOtherwise compression and/or cropper will pick the first frame of the GIF and return it as the\nresult (on Android the result will be a PNG). On iOS, both quality and cropping are supported.\n\n> **Notes for Web:** The system UI can only be shown after user activation (e.g. a "},{"kind":"code","text":"`Button`"},{"kind":"text","text":" press).\nTherefore, calling "},{"kind":"code","text":"`launchImageLibraryAsync`"},{"kind":"text","text":" in "},{"kind":"code","text":"`componentDidMount`"},{"kind":"text","text":", for example, will **not**\nwork as intended. The "},{"kind":"code","text":"`cancelled`"},{"kind":"text","text":" event will not be returned in the browser due to platform\nrestrictions and inconsistencies across browsers."}],"blockTags":[{"tag":"@returns","content":[{"kind":"text","text":"A promise that resolves to an object with "},{"kind":"code","text":"`canceled`"},{"kind":"text","text":" and "},{"kind":"code","text":"`assets`"},{"kind":"text","text":" fields.\nWhen the user canceled the action the "},{"kind":"code","text":"`assets`"},{"kind":"text","text":" is always "},{"kind":"code","text":"`null`"},{"kind":"text","text":", otherwise it's an array of\nthe selected media assets which have a form of ["},{"kind":"code","text":"`ImagePickerAsset`"},{"kind":"text","text":"](#imagepickerasset)."}]}]},"parameters":[{"name":"options","kind":32768,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"An object extended by ["},{"kind":"code","text":"`ImagePickerOptions`"},{"kind":"text","text":"](#imagepickeroptions)."}]},"type":{"type":"reference","name":"ImagePickerOptions"}}],"type":{"type":"reference","typeArguments":[{"type":"reference","name":"ImagePickerResult"}],"name":"Promise","qualifiedName":"Promise","package":"typescript"}}]},{"name":"requestCameraPermissionsAsync","kind":64,"signatures":[{"name":"requestCameraPermissionsAsync","kind":4096,"comment":{"summary":[{"kind":"text","text":"Asks the user to grant permissions for accessing camera. This does nothing on web because the\nbrowser camera is not used."}],"blockTags":[{"tag":"@returns","content":[{"kind":"text","text":"A promise that fulfills with an object of type [CameraPermissionResponse](#camerarollpermissionresponse)."}]}]},"type":{"type":"reference","typeArguments":[{"type":"reference","name":"CameraPermissionResponse"}],"name":"Promise","qualifiedName":"Promise","package":"typescript"}}]},{"name":"requestMediaLibraryPermissionsAsync","kind":64,"signatures":[{"name":"requestMediaLibraryPermissionsAsync","kind":4096,"comment":{"summary":[{"kind":"text","text":"Asks the user to grant permissions for accessing user's photo. This method does nothing on web."}],"blockTags":[{"tag":"@returns","content":[{"kind":"text","text":"A promise that fulfills with an object of type [MediaLibraryPermissionResponse](#medialibrarypermissionresponse)."}]}]},"parameters":[{"name":"writeOnly","kind":32768,"comment":{"summary":[{"kind":"text","text":"Whether to request write or read and write permissions. Defaults to "},{"kind":"code","text":"`false`"}]},"type":{"type":"intrinsic","name":"boolean"},"defaultValue":"false"}],"type":{"type":"reference","typeArguments":[{"type":"reference","name":"MediaLibraryPermissionResponse"}],"name":"Promise","qualifiedName":"Promise","package":"typescript"}}]},{"name":"useCameraPermissions","kind":64,"signatures":[{"name":"useCameraPermissions","kind":4096,"comment":{"summary":[{"kind":"text","text":"Check or request permissions to access the camera.\nThis uses both "},{"kind":"code","text":"`requestCameraPermissionsAsync`"},{"kind":"text","text":" and "},{"kind":"code","text":"`getCameraPermissionsAsync`"},{"kind":"text","text":" to interact with the permissions."}],"blockTags":[{"tag":"@example","content":[{"kind":"code","text":"```ts\nconst [status, requestPermission] = ImagePicker.useCameraPermissions();\n```"}]}]},"parameters":[{"name":"options","kind":32768,"flags":{"isOptional":true},"type":{"type":"reference","typeArguments":[{"type":"intrinsic","name":"object"}],"name":"PermissionHookOptions"}}],"type":{"type":"tuple","elements":[{"type":"union","types":[{"type":"literal","value":null},{"type":"reference","name":"PermissionResponse"}]},{"type":"reference","typeArguments":[{"type":"reference","name":"PermissionResponse"}],"name":"RequestPermissionMethod"},{"type":"reference","typeArguments":[{"type":"reference","name":"PermissionResponse"}],"name":"GetPermissionMethod"}]}}]},{"name":"useMediaLibraryPermissions","kind":64,"signatures":[{"name":"useMediaLibraryPermissions","kind":4096,"comment":{"summary":[{"kind":"text","text":"Check or request permissions to access the media library.\nThis uses both "},{"kind":"code","text":"`requestMediaLibraryPermissionsAsync`"},{"kind":"text","text":" and "},{"kind":"code","text":"`getMediaLibraryPermissionsAsync`"},{"kind":"text","text":" to interact with the permissions."}],"blockTags":[{"tag":"@example","content":[{"kind":"code","text":"```ts\nconst [status, requestPermission] = ImagePicker.useMediaLibraryPermissions();\n```"}]}]},"parameters":[{"name":"options","kind":32768,"flags":{"isOptional":true},"type":{"type":"reference","typeArguments":[{"type":"reflection","declaration":{"name":"__type","kind":65536,"children":[{"name":"writeOnly","kind":1024,"flags":{"isOptional":true},"type":{"type":"intrinsic","name":"boolean"}}]}}],"name":"PermissionHookOptions"}}],"type":{"type":"tuple","elements":[{"type":"union","types":[{"type":"literal","value":null},{"type":"reference","name":"MediaLibraryPermissionResponse"}]},{"type":"reference","typeArguments":[{"type":"reference","name":"MediaLibraryPermissionResponse"}],"name":"RequestPermissionMethod"},{"type":"reference","typeArguments":[{"type":"reference","name":"MediaLibraryPermissionResponse"}],"name":"GetPermissionMethod"}]}}]}]}
\ No newline at end of file
diff --git a/docs/public/static/data/v49.0.0/expo-image.json b/docs/public/static/data/v49.0.0/expo-image.json
new file mode 100644
index 0000000000000..6ccd1f2352c1e
--- /dev/null
+++ b/docs/public/static/data/v49.0.0/expo-image.json
@@ -0,0 +1 @@
+{"name":"expo-image","kind":1,"children":[{"name":"Image","kind":128,"children":[{"name":"constructor","kind":512,"flags":{"isExternal":true},"signatures":[{"name":"new Image","kind":16384,"flags":{"isExternal":true},"parameters":[{"name":"props","kind":32768,"flags":{"isExternal":true},"type":{"type":"union","types":[{"type":"reference","name":"ImageProps"},{"type":"reference","typeArguments":[{"type":"reference","name":"ImageProps"}],"name":"Readonly","qualifiedName":"Readonly","package":"typescript"}]}}],"type":{"type":"reference","name":"Image"},"inheritedFrom":{"type":"reference","name":"React.PureComponent.constructor"}},{"name":"new Image","kind":16384,"flags":{"isExternal":true},"comment":{"summary":[],"blockTags":[{"tag":"@deprecated","content":[]},{"tag":"@see","content":[{"kind":"text","text":"https://reactjs.org/docs/legacy-context.html"}]}]},"parameters":[{"name":"props","kind":32768,"flags":{"isExternal":true},"type":{"type":"reference","name":"ImageProps"}},{"name":"context","kind":32768,"flags":{"isExternal":true},"type":{"type":"intrinsic","name":"any"}}],"type":{"type":"reference","name":"Image"},"inheritedFrom":{"type":"reference","name":"React.PureComponent.constructor"}}],"inheritedFrom":{"type":"reference","name":"React.PureComponent.constructor"}},{"name":"render","kind":2048,"signatures":[{"name":"render","kind":4096,"type":{"type":"reference","name":"Element","qualifiedName":"global.JSX.Element","package":"@types/react"},"overwrites":{"type":"reference","name":"React.PureComponent.render"}}],"overwrites":{"type":"reference","name":"React.PureComponent.render"}},{"name":"clearDiskCache","kind":2048,"flags":{"isStatic":true},"signatures":[{"name":"clearDiskCache","kind":4096,"comment":{"summary":[{"kind":"text","text":"Asynchronously clears all images from the disk cache."}],"blockTags":[{"tag":"@platform","content":[{"kind":"text","text":"android"}]},{"tag":"@platform","content":[{"kind":"text","text":"ios"}]},{"tag":"@returns","content":[{"kind":"text","text":"A promise resolving to "},{"kind":"code","text":"`true`"},{"kind":"text","text":" when the operation succeeds.\nIt may resolve to "},{"kind":"code","text":"`false`"},{"kind":"text","text":" on Android when the activity is no longer available.\nResolves to "},{"kind":"code","text":"`false`"},{"kind":"text","text":" on Web."}]}]},"type":{"type":"reference","typeArguments":[{"type":"intrinsic","name":"boolean"}],"name":"Promise","qualifiedName":"Promise","package":"typescript"}}]},{"name":"clearMemoryCache","kind":2048,"flags":{"isStatic":true},"signatures":[{"name":"clearMemoryCache","kind":4096,"comment":{"summary":[{"kind":"text","text":"Asynchronously clears all images stored in memory."}],"blockTags":[{"tag":"@platform","content":[{"kind":"text","text":"android"}]},{"tag":"@platform","content":[{"kind":"text","text":"ios"}]},{"tag":"@returns","content":[{"kind":"text","text":"A promise resolving to "},{"kind":"code","text":"`true`"},{"kind":"text","text":" when the operation succeeds.\nIt may resolve to "},{"kind":"code","text":"`false`"},{"kind":"text","text":" on Android when the activity is no longer available.\nResolves to "},{"kind":"code","text":"`false`"},{"kind":"text","text":" on Web."}]}]},"type":{"type":"reference","typeArguments":[{"type":"intrinsic","name":"boolean"}],"name":"Promise","qualifiedName":"Promise","package":"typescript"}}]},{"name":"prefetch","kind":2048,"flags":{"isStatic":true},"signatures":[{"name":"prefetch","kind":4096,"comment":{"summary":[{"kind":"text","text":"Preloads images at the given urls that can be later used in the image view.\nPreloaded images are always cached on the disk, so make sure to use\n"},{"kind":"code","text":"`disk`"},{"kind":"text","text":" (default) or "},{"kind":"code","text":"`memory-disk`"},{"kind":"text","text":" cache policy."}]},"parameters":[{"name":"urls","kind":32768,"type":{"type":"union","types":[{"type":"intrinsic","name":"string"},{"type":"array","elementType":{"type":"intrinsic","name":"string"}}]}}],"type":{"type":"intrinsic","name":"void"}}]}],"extendedTypes":[{"type":"reference","typeArguments":[{"type":"reference","name":"ImageProps"}],"name":"PureComponent","qualifiedName":"React.PureComponent","package":"@types/react"}]},{"name":"ImageBackgroundProps","kind":256,"children":[{"name":"accessibilityLabel","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"The text that's read by the screen reader when the user interacts with the image. Sets the the "},{"kind":"code","text":"`alt`"},{"kind":"text","text":" tag on web which is used for web crawlers and link traversal."}],"blockTags":[{"tag":"@default","content":[{"kind":"text","text":"undefined"}]}]},"type":{"type":"intrinsic","name":"string"},"inheritedFrom":{"type":"reference","name":"Omit.accessibilityLabel"}},{"name":"accessible","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"When true, indicates that the view is an accessibility element.\nWhen a view is an accessibility element, it groups its children into a single selectable component.\n\nOn Android, the "},{"kind":"code","text":"`accessible`"},{"kind":"text","text":" property will be translated into the native "},{"kind":"code","text":"`isScreenReaderFocusable`"},{"kind":"text","text":",\nso it's only affecting the screen readers behaviour."}],"blockTags":[{"tag":"@default","content":[{"kind":"text","text":"false"}]},{"tag":"@platform","content":[{"kind":"text","text":"android"}]},{"tag":"@platform","content":[{"kind":"text","text":"ios"}]}]},"type":{"type":"intrinsic","name":"boolean"},"inheritedFrom":{"type":"reference","name":"Omit.accessible"}},{"name":"allowDownscaling","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"Whether the image should be downscaled to match the size of the view container.\nTurning off this functionality could negatively impact the application's performance, particularly when working with large assets.\nHowever, it would result in smoother image resizing, and end-users would always have access to the highest possible asset quality.\n\nDownscaling is never used when the "},{"kind":"code","text":"`contentFit`"},{"kind":"text","text":" prop is set to "},{"kind":"code","text":"`none`"},{"kind":"text","text":" or "},{"kind":"code","text":"`fill`"},{"kind":"text","text":"."}],"blockTags":[{"tag":"@default","content":[{"kind":"text","text":"true"}]},{"tag":"@platform","content":[{"kind":"text","text":"android"}]}]},"type":{"type":"intrinsic","name":"boolean"},"inheritedFrom":{"type":"reference","name":"Omit.allowDownscaling"}},{"name":"alt","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"The text that's read by the screen reader when the user interacts with the image. Sets the the "},{"kind":"code","text":"`alt`"},{"kind":"text","text":" tag on web which is used for web crawlers and link traversal. Is an alias for "},{"kind":"code","text":"`accessibilityLabel`"},{"kind":"text","text":"."}],"blockTags":[{"tag":"@alias","content":[{"kind":"text","text":"accessibilityLabel"}]},{"tag":"@default","content":[{"kind":"text","text":"undefined"}]}]},"type":{"type":"intrinsic","name":"string"},"inheritedFrom":{"type":"reference","name":"Omit.alt"}},{"name":"blurRadius","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"The radius of the blur in points, "},{"kind":"code","text":"`0`"},{"kind":"text","text":" means no blur effect.\nThis effect is not applied to placeholders."}],"blockTags":[{"tag":"@default","content":[{"kind":"text","text":"0"}]}]},"type":{"type":"intrinsic","name":"number"},"inheritedFrom":{"type":"reference","name":"Omit.blurRadius"}},{"name":"cachePolicy","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"Determines whether to cache the image and where: on the disk, in the memory or both.\n\n- "},{"kind":"code","text":"`'none'`"},{"kind":"text","text":" - Image is not cached at all.\n\n- "},{"kind":"code","text":"`'disk'`"},{"kind":"text","text":" - Image is queried from the disk cache if exists, otherwise it's downloaded and then stored on the disk.\n\n- "},{"kind":"code","text":"`'memory'`"},{"kind":"text","text":" - Image is cached in memory. Might be useful when you render a high-resolution picture many times.\nMemory cache may be purged very quickly to prevent high memory usage and the risk of out of memory exceptions.\n\n- "},{"kind":"code","text":"`'memory-disk'`"},{"kind":"text","text":" - Image is cached in memory, but with a fallback to the disk cache."}],"blockTags":[{"tag":"@default","content":[{"kind":"text","text":"'disk'"}]}]},"type":{"type":"union","types":[{"type":"literal","value":null},{"type":"literal","value":"none"},{"type":"literal","value":"disk"},{"type":"literal","value":"memory"},{"type":"literal","value":"memory-disk"}]},"inheritedFrom":{"type":"reference","name":"Omit.cachePolicy"}},{"name":"contentFit","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"Determines how the image should be resized to fit its container. This property tells the image to fill the container\nin a variety of ways; such as \"preserve that aspect ratio\" or \"stretch up and take up as much space as possible\".\nIt mirrors the CSS ["},{"kind":"code","text":"`object-fit`"},{"kind":"text","text":"](https://developer.mozilla.org/en-US/docs/Web/CSS/object-fit) property.\n\n- "},{"kind":"code","text":"`'cover'`"},{"kind":"text","text":" - The image is sized to maintain its aspect ratio while filling the container box.\nIf the image's aspect ratio does not match the aspect ratio of its box, then the object will be clipped to fit.\n\n- "},{"kind":"code","text":"`'contain'`"},{"kind":"text","text":" - The image is scaled down or up to maintain its aspect ratio while fitting within the container box.\n\n- "},{"kind":"code","text":"`'fill'`"},{"kind":"text","text":" - The image is sized to entirely fill the container box. If necessary, the image will be stretched or squished to fit.\n\n- "},{"kind":"code","text":"`'none'`"},{"kind":"text","text":" - The image is not resized and is centered by default.\nWhen specified, the exact position can be controlled with ["},{"kind":"code","text":"`contentPosition`"},{"kind":"text","text":"](#contentposition) prop.\n\n- "},{"kind":"code","text":"`'scale-down'`"},{"kind":"text","text":" - The image is sized as if "},{"kind":"code","text":"`none`"},{"kind":"text","text":" or "},{"kind":"code","text":"`contain`"},{"kind":"text","text":" were specified, whichever would result in a smaller concrete image size."}],"blockTags":[{"tag":"@default","content":[{"kind":"text","text":"'cover'"}]}]},"type":{"type":"reference","name":"ImageContentFit"},"inheritedFrom":{"type":"reference","name":"Omit.contentFit"}},{"name":"contentPosition","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"It is used together with ["},{"kind":"code","text":"`contentFit`"},{"kind":"text","text":"](#contentfit) to specify how the image should be positioned with x/y coordinates inside its own container.\nAn equivalent of the CSS ["},{"kind":"code","text":"`object-position`"},{"kind":"text","text":"](https://developer.mozilla.org/en-US/docs/Web/CSS/object-position) property."}],"blockTags":[{"tag":"@default","content":[{"kind":"text","text":"'center'"}]}]},"type":{"type":"reference","name":"ImageContentPosition"},"inheritedFrom":{"type":"reference","name":"Omit.contentPosition"}},{"name":"defaultSource","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[],"blockTags":[{"tag":"@deprecated","content":[{"kind":"text","text":"Provides compatibility for ["},{"kind":"code","text":"`defaultSource`"},{"kind":"text","text":" from React Native Image](https://reactnative.dev/docs/image#defaultsource).\nUse ["},{"kind":"code","text":"`placeholder`"},{"kind":"text","text":"](#placeholder) prop instead."}]}]},"type":{"type":"union","types":[{"type":"literal","value":null},{"type":"reference","name":"ImageSource"}]},"inheritedFrom":{"type":"reference","name":"Omit.defaultSource"}},{"name":"enableLiveTextInteraction","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"Enables Live Text interaction with the image. Check official [Apple documentation](https://developer.apple.com/documentation/visionkit/enabling_live_text_interactions_with_images) for more details."}],"blockTags":[{"tag":"@default","content":[{"kind":"text","text":"false"}]},{"tag":"@platform","content":[{"kind":"text","text":"ios 16.0+"}]}]},"type":{"type":"intrinsic","name":"boolean"},"inheritedFrom":{"type":"reference","name":"Omit.enableLiveTextInteraction"}},{"name":"fadeDuration","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[],"blockTags":[{"tag":"@deprecated","content":[{"kind":"text","text":"Provides compatibility for ["},{"kind":"code","text":"`fadeDuration`"},{"kind":"text","text":" from React Native Image](https://reactnative.dev/docs/image#fadeduration-android).\nInstead use ["},{"kind":"code","text":"`transition`"},{"kind":"text","text":"](#transition) with the provided duration."}]}]},"type":{"type":"intrinsic","name":"number"},"inheritedFrom":{"type":"reference","name":"Omit.fadeDuration"}},{"name":"focusable","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"Whether this View should be focusable with a non-touch input device and receive focus with a hardware keyboard."}],"blockTags":[{"tag":"@default","content":[{"kind":"text","text":"false"}]},{"tag":"@platform","content":[{"kind":"text","text":"android"}]}]},"type":{"type":"intrinsic","name":"boolean"},"inheritedFrom":{"type":"reference","name":"Omit.focusable"}},{"name":"imageStyle","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"Style object for the image"}]},"type":{"type":"reference","typeArguments":[{"type":"reference","name":"ImageStyle","qualifiedName":"ImageStyle","package":"react-native"}],"name":"StyleProp","qualifiedName":"StyleProp","package":"react-native"}},{"name":"loadingIndicatorSource","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[],"blockTags":[{"tag":"@deprecated","content":[{"kind":"text","text":"Provides compatibility for ["},{"kind":"code","text":"`loadingIndicatorSource`"},{"kind":"text","text":" from React Native Image](https://reactnative.dev/docs/image#loadingindicatorsource).\nUse ["},{"kind":"code","text":"`placeholder`"},{"kind":"text","text":"](#placeholder) prop instead."}]}]},"type":{"type":"union","types":[{"type":"literal","value":null},{"type":"reference","name":"ImageSource"}]},"inheritedFrom":{"type":"reference","name":"Omit.loadingIndicatorSource"}},{"name":"onError","kind":1024,"flags":{"isOptional":true},"type":{"type":"reflection","declaration":{"name":"__type","kind":65536,"signatures":[{"name":"__type","kind":4096,"comment":{"summary":[{"kind":"text","text":"Called on an image fetching error."}]},"parameters":[{"name":"event","kind":32768,"type":{"type":"reference","name":"ImageErrorEventData"}}],"type":{"type":"intrinsic","name":"void"}}]}},"inheritedFrom":{"type":"reference","name":"Omit.onError"}},{"name":"onLoad","kind":1024,"flags":{"isOptional":true},"type":{"type":"reflection","declaration":{"name":"__type","kind":65536,"signatures":[{"name":"__type","kind":4096,"comment":{"summary":[{"kind":"text","text":"Called when the image load completes successfully."}]},"parameters":[{"name":"event","kind":32768,"type":{"type":"reference","name":"ImageLoadEventData"}}],"type":{"type":"intrinsic","name":"void"}}]}},"inheritedFrom":{"type":"reference","name":"Omit.onLoad"}},{"name":"onLoadEnd","kind":1024,"flags":{"isOptional":true},"type":{"type":"reflection","declaration":{"name":"__type","kind":65536,"signatures":[{"name":"__type","kind":4096,"comment":{"summary":[{"kind":"text","text":"Called when the image load either succeeds or fails."}]},"type":{"type":"intrinsic","name":"void"}}]}},"inheritedFrom":{"type":"reference","name":"Omit.onLoadEnd"}},{"name":"onLoadStart","kind":1024,"flags":{"isOptional":true},"type":{"type":"reflection","declaration":{"name":"__type","kind":65536,"signatures":[{"name":"__type","kind":4096,"comment":{"summary":[{"kind":"text","text":"Called when the image starts to load."}]},"type":{"type":"intrinsic","name":"void"}}]}},"inheritedFrom":{"type":"reference","name":"Omit.onLoadStart"}},{"name":"onProgress","kind":1024,"flags":{"isOptional":true},"type":{"type":"reflection","declaration":{"name":"__type","kind":65536,"signatures":[{"name":"__type","kind":4096,"comment":{"summary":[{"kind":"text","text":"Called when the image is loading. Can be called multiple times before the image has finished loading.\nThe event object provides details on how many bytes were loaded so far and what's the expected total size."}]},"parameters":[{"name":"event","kind":32768,"type":{"type":"reference","name":"ImageProgressEventData"}}],"type":{"type":"intrinsic","name":"void"}}]}},"inheritedFrom":{"type":"reference","name":"Omit.onProgress"}},{"name":"placeholder","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"An image to display while loading the proper image and no image has been displayed yet or the source is unset."}]},"type":{"type":"union","types":[{"type":"literal","value":null},{"type":"intrinsic","name":"string"},{"type":"intrinsic","name":"number"},{"type":"array","elementType":{"type":"intrinsic","name":"string"}},{"type":"reference","name":"ImageSource"},{"type":"array","elementType":{"type":"reference","name":"ImageSource"}}]},"inheritedFrom":{"type":"reference","name":"Omit.placeholder"}},{"name":"priority","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"Priorities for completing loads. If more than one load is queued at a time,\nthe load with the higher priority will be started first.\nPriorities are considered best effort, there are no guarantees about the order in which loads will start or finish."}],"blockTags":[{"tag":"@default","content":[{"kind":"text","text":"'normal'"}]}]},"type":{"type":"union","types":[{"type":"literal","value":null},{"type":"literal","value":"low"},{"type":"literal","value":"normal"},{"type":"literal","value":"high"}]},"inheritedFrom":{"type":"reference","name":"Omit.priority"}},{"name":"recyclingKey","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"Changing this prop resets the image view content to blank or a placeholder before loading and rendering the final image.\nThis is especially useful for any kinds of recycling views like [FlashList](https://github.com/shopify/flash-list)\nto prevent showing the previous source before the new one fully loads."}],"blockTags":[{"tag":"@default","content":[{"kind":"text","text":"null"}]},{"tag":"@platform","content":[{"kind":"text","text":"android"}]},{"tag":"@platform","content":[{"kind":"text","text":"ios"}]}]},"type":{"type":"union","types":[{"type":"literal","value":null},{"type":"intrinsic","name":"string"}]},"inheritedFrom":{"type":"reference","name":"Omit.recyclingKey"}},{"name":"resizeMode","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[],"blockTags":[{"tag":"@deprecated","content":[{"kind":"text","text":"Provides compatibility for ["},{"kind":"code","text":"`resizeMode`"},{"kind":"text","text":" from React Native Image](https://reactnative.dev/docs/image#resizemode).\nNote that "},{"kind":"code","text":"`\"repeat\"`"},{"kind":"text","text":" option is not supported at all.\nUse the more powerful ["},{"kind":"code","text":"`contentFit`"},{"kind":"text","text":"](#contentfit) and ["},{"kind":"code","text":"`contentPosition`"},{"kind":"text","text":"](#contentposition) props instead."}]}]},"type":{"type":"union","types":[{"type":"literal","value":"cover"},{"type":"literal","value":"contain"},{"type":"literal","value":"center"},{"type":"literal","value":"stretch"},{"type":"literal","value":"repeat"}]},"inheritedFrom":{"type":"reference","name":"Omit.resizeMode"}},{"name":"responsivePolicy","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"Determines whether to choose image source based on container size only on mount or on every resize.\nUse "},{"kind":"code","text":"`initial`"},{"kind":"text","text":" to improve performance."}],"blockTags":[{"tag":"@default","content":[{"kind":"text","text":"\"live\""}]},{"tag":"@platform","content":[{"kind":"text","text":"web"}]}]},"type":{"type":"union","types":[{"type":"literal","value":"live"},{"type":"literal","value":"initial"}]},"inheritedFrom":{"type":"reference","name":"Omit.responsivePolicy"}},{"name":"source","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"The image source, either a remote URL, a local file resource or a number that is the result of the "},{"kind":"code","text":"`require()`"},{"kind":"text","text":" function.\nWhen provided as an array of sources, the source that fits best into the container size and is closest to the screen scale\nwill be chosen. In this case it is important to provide "},{"kind":"code","text":"`width`"},{"kind":"text","text":", "},{"kind":"code","text":"`height`"},{"kind":"text","text":" and "},{"kind":"code","text":"`scale`"},{"kind":"text","text":" properties."}]},"type":{"type":"union","types":[{"type":"literal","value":null},{"type":"intrinsic","name":"string"},{"type":"intrinsic","name":"number"},{"type":"array","elementType":{"type":"intrinsic","name":"string"}},{"type":"reference","name":"ImageSource"},{"type":"array","elementType":{"type":"reference","name":"ImageSource"}}]},"inheritedFrom":{"type":"reference","name":"Omit.source"}},{"name":"style","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"The style of the image container"}]},"type":{"type":"reference","typeArguments":[{"type":"reference","name":"ViewStyle","qualifiedName":"ViewStyle","package":"react-native"}],"name":"StyleProp","qualifiedName":"StyleProp","package":"react-native"}},{"name":"tintColor","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"A color used to tint template images (a bitmap image where only the opacity matters).\nThe color is applied to every non-transparent pixel, causing the image’s shape to adopt that color.\nThis effect is not applied to placeholders."}],"blockTags":[{"tag":"@default","content":[{"kind":"text","text":"null"}]},{"tag":"@platform","content":[{"kind":"text","text":"android"}]},{"tag":"@platform","content":[{"kind":"text","text":"ios"}]}]},"type":{"type":"union","types":[{"type":"literal","value":null},{"type":"intrinsic","name":"string"}]},"inheritedFrom":{"type":"reference","name":"Omit.tintColor"}},{"name":"transition","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"Describes how the image view should transition the contents when switching the image source.\\\nIf provided as a number, it is the duration in milliseconds of the "},{"kind":"code","text":"`'cross-dissolve'`"},{"kind":"text","text":" effect."}]},"type":{"type":"union","types":[{"type":"literal","value":null},{"type":"intrinsic","name":"number"},{"type":"reference","name":"ImageTransition"}]},"inheritedFrom":{"type":"reference","name":"Omit.transition"}}],"extendedTypes":[{"type":"reference","typeArguments":[{"type":"reference","name":"ImageProps"},{"type":"literal","value":"style"}],"name":"Omit","qualifiedName":"Omit","package":"typescript"}]},{"name":"ImageContentPosition","kind":4194304,"comment":{"summary":[{"kind":"text","text":"Specifies the position of the image inside its container. One value controls the x-axis and the second value controls the y-axis.\n\nAdditionally, it supports stringified shorthand form that specifies the edges to which to align the image content:\\\n"},{"kind":"code","text":"`'center'`"},{"kind":"text","text":", "},{"kind":"code","text":"`'top'`"},{"kind":"text","text":", "},{"kind":"code","text":"`'right'`"},{"kind":"text","text":", "},{"kind":"code","text":"`'bottom'`"},{"kind":"text","text":", "},{"kind":"code","text":"`'left'`"},{"kind":"text","text":", "},{"kind":"code","text":"`'top center'`"},{"kind":"text","text":", "},{"kind":"code","text":"`'top right'`"},{"kind":"text","text":", "},{"kind":"code","text":"`'top left'`"},{"kind":"text","text":", "},{"kind":"code","text":"`'right center'`"},{"kind":"text","text":", "},{"kind":"code","text":"`'right top'`"},{"kind":"text","text":",\n"},{"kind":"code","text":"`'right bottom'`"},{"kind":"text","text":", "},{"kind":"code","text":"`'bottom center'`"},{"kind":"text","text":", "},{"kind":"code","text":"`'bottom right'`"},{"kind":"text","text":", "},{"kind":"code","text":"`'bottom left'`"},{"kind":"text","text":", "},{"kind":"code","text":"`'left center'`"},{"kind":"text","text":", "},{"kind":"code","text":"`'left top'`"},{"kind":"text","text":", "},{"kind":"code","text":"`'left bottom'`"},{"kind":"text","text":".\\\nIf only one keyword is provided, then the other dimension is set to "},{"kind":"code","text":"`'center'`"},{"kind":"text","text":" ("},{"kind":"code","text":"`'50%'`"},{"kind":"text","text":"), so the image is placed in the middle of the specified edge.\\\nAs an example, "},{"kind":"code","text":"`'top right'`"},{"kind":"text","text":" is the same as "},{"kind":"code","text":"`{ top: 0, right: 0 }`"},{"kind":"text","text":" and "},{"kind":"code","text":"`'bottom'`"},{"kind":"text","text":" is the same as "},{"kind":"code","text":"`{ bottom: 0, left: '50%' }`"},{"kind":"text","text":"."}]},"type":{"type":"union","types":[{"type":"reflection","declaration":{"name":"__type","kind":65536,"children":[{"name":"right","kind":1024,"flags":{"isOptional":true},"type":{"type":"reference","name":"ImageContentPositionValue"}},{"name":"top","kind":1024,"flags":{"isOptional":true},"type":{"type":"reference","name":"ImageContentPositionValue"}}]}},{"type":"reflection","declaration":{"name":"__type","kind":65536,"children":[{"name":"left","kind":1024,"flags":{"isOptional":true},"type":{"type":"reference","name":"ImageContentPositionValue"}},{"name":"top","kind":1024,"flags":{"isOptional":true},"type":{"type":"reference","name":"ImageContentPositionValue"}}]}},{"type":"reflection","declaration":{"name":"__type","kind":65536,"children":[{"name":"bottom","kind":1024,"flags":{"isOptional":true},"type":{"type":"reference","name":"ImageContentPositionValue"}},{"name":"right","kind":1024,"flags":{"isOptional":true},"type":{"type":"reference","name":"ImageContentPositionValue"}}]}},{"type":"reflection","declaration":{"name":"__type","kind":65536,"children":[{"name":"bottom","kind":1024,"flags":{"isOptional":true},"type":{"type":"reference","name":"ImageContentPositionValue"}},{"name":"left","kind":1024,"flags":{"isOptional":true},"type":{"type":"reference","name":"ImageContentPositionValue"}}]}},{"type":"reference","name":"ImageContentPositionString"}]}},{"name":"ImageContentPositionValue","kind":4194304,"comment":{"summary":[{"kind":"text","text":"A value that represents the relative position of a single axis.\n\nIf "},{"kind":"code","text":"`number`"},{"kind":"text","text":", it is a distance in points (logical pixels) from the respective edge.\\\nIf "},{"kind":"code","text":"`string`"},{"kind":"text","text":", it must be a percentage value where "},{"kind":"code","text":"`'100%'`"},{"kind":"text","text":" is the difference in size between the container and the image along the respective axis,\nor "},{"kind":"code","text":"`'center'`"},{"kind":"text","text":" which is an alias for "},{"kind":"code","text":"`'50%'`"},{"kind":"text","text":" that is the default value. You can read more regarding percentages on the MDN docs for\n["},{"kind":"code","text":"`background-position`"},{"kind":"text","text":"](https://developer.mozilla.org/en-US/docs/Web/CSS/background-position#regarding_percentages) that describes this concept well."}]},"type":{"type":"union","types":[{"type":"intrinsic","name":"number"},{"type":"intrinsic","name":"string"},{"type":"template-literal","head":"","tail":[[{"type":"intrinsic","name":"number"},"%"]]},{"type":"template-literal","head":"","tail":[[{"type":"intrinsic","name":"number"},""]]},{"type":"literal","value":"center"}]}},{"name":"ImageErrorEventData","kind":4194304,"type":{"type":"reflection","declaration":{"name":"__type","kind":65536,"children":[{"name":"error","kind":1024,"type":{"type":"intrinsic","name":"string"}}]}}},{"name":"ImageLoadEventData","kind":4194304,"type":{"type":"reflection","declaration":{"name":"__type","kind":65536,"children":[{"name":"cacheType","kind":1024,"type":{"type":"union","types":[{"type":"literal","value":"none"},{"type":"literal","value":"disk"},{"type":"literal","value":"memory"}]}},{"name":"source","kind":1024,"type":{"type":"reflection","declaration":{"name":"__type","kind":65536,"children":[{"name":"height","kind":1024,"type":{"type":"intrinsic","name":"number"}},{"name":"mediaType","kind":1024,"type":{"type":"union","types":[{"type":"intrinsic","name":"string"},{"type":"literal","value":null}]}},{"name":"url","kind":1024,"type":{"type":"intrinsic","name":"string"}},{"name":"width","kind":1024,"type":{"type":"intrinsic","name":"number"}}]}}}]}}},{"name":"ImageProgressEventData","kind":4194304,"type":{"type":"reflection","declaration":{"name":"__type","kind":65536,"children":[{"name":"loaded","kind":1024,"type":{"type":"intrinsic","name":"number"}},{"name":"total","kind":1024,"type":{"type":"intrinsic","name":"number"}}]}}},{"name":"ImageProps","kind":256,"comment":{"summary":[{"kind":"text","text":"Some props are from React Native Image that Expo Image supports (more or less) for easier migration,\nbut all of them are deprecated and might be removed in the future."}]},"children":[{"name":"accessibilityLabel","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"The text that's read by the screen reader when the user interacts with the image. Sets the the "},{"kind":"code","text":"`alt`"},{"kind":"text","text":" tag on web which is used for web crawlers and link traversal."}],"blockTags":[{"tag":"@default","content":[{"kind":"text","text":"undefined"}]}]},"type":{"type":"intrinsic","name":"string"},"overwrites":{"type":"reference","name":"ViewProps.accessibilityLabel"}},{"name":"accessible","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"When true, indicates that the view is an accessibility element.\nWhen a view is an accessibility element, it groups its children into a single selectable component.\n\nOn Android, the "},{"kind":"code","text":"`accessible`"},{"kind":"text","text":" property will be translated into the native "},{"kind":"code","text":"`isScreenReaderFocusable`"},{"kind":"text","text":",\nso it's only affecting the screen readers behaviour."}],"blockTags":[{"tag":"@default","content":[{"kind":"text","text":"false"}]},{"tag":"@platform","content":[{"kind":"text","text":"android"}]},{"tag":"@platform","content":[{"kind":"text","text":"ios"}]}]},"type":{"type":"intrinsic","name":"boolean"},"overwrites":{"type":"reference","name":"ViewProps.accessible"}},{"name":"allowDownscaling","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"Whether the image should be downscaled to match the size of the view container.\nTurning off this functionality could negatively impact the application's performance, particularly when working with large assets.\nHowever, it would result in smoother image resizing, and end-users would always have access to the highest possible asset quality.\n\nDownscaling is never used when the "},{"kind":"code","text":"`contentFit`"},{"kind":"text","text":" prop is set to "},{"kind":"code","text":"`none`"},{"kind":"text","text":" or "},{"kind":"code","text":"`fill`"},{"kind":"text","text":"."}],"blockTags":[{"tag":"@default","content":[{"kind":"text","text":"true"}]},{"tag":"@platform","content":[{"kind":"text","text":"android"}]}]},"type":{"type":"intrinsic","name":"boolean"}},{"name":"alt","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"The text that's read by the screen reader when the user interacts with the image. Sets the the "},{"kind":"code","text":"`alt`"},{"kind":"text","text":" tag on web which is used for web crawlers and link traversal. Is an alias for "},{"kind":"code","text":"`accessibilityLabel`"},{"kind":"text","text":"."}],"blockTags":[{"tag":"@alias","content":[{"kind":"text","text":"accessibilityLabel"}]},{"tag":"@default","content":[{"kind":"text","text":"undefined"}]}]},"type":{"type":"intrinsic","name":"string"}},{"name":"blurRadius","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"The radius of the blur in points, "},{"kind":"code","text":"`0`"},{"kind":"text","text":" means no blur effect.\nThis effect is not applied to placeholders."}],"blockTags":[{"tag":"@default","content":[{"kind":"text","text":"0"}]}]},"type":{"type":"intrinsic","name":"number"}},{"name":"cachePolicy","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"Determines whether to cache the image and where: on the disk, in the memory or both.\n\n- "},{"kind":"code","text":"`'none'`"},{"kind":"text","text":" - Image is not cached at all.\n\n- "},{"kind":"code","text":"`'disk'`"},{"kind":"text","text":" - Image is queried from the disk cache if exists, otherwise it's downloaded and then stored on the disk.\n\n- "},{"kind":"code","text":"`'memory'`"},{"kind":"text","text":" - Image is cached in memory. Might be useful when you render a high-resolution picture many times.\nMemory cache may be purged very quickly to prevent high memory usage and the risk of out of memory exceptions.\n\n- "},{"kind":"code","text":"`'memory-disk'`"},{"kind":"text","text":" - Image is cached in memory, but with a fallback to the disk cache."}],"blockTags":[{"tag":"@default","content":[{"kind":"text","text":"'disk'"}]}]},"type":{"type":"union","types":[{"type":"literal","value":null},{"type":"literal","value":"none"},{"type":"literal","value":"disk"},{"type":"literal","value":"memory"},{"type":"literal","value":"memory-disk"}]}},{"name":"contentFit","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"Determines how the image should be resized to fit its container. This property tells the image to fill the container\nin a variety of ways; such as \"preserve that aspect ratio\" or \"stretch up and take up as much space as possible\".\nIt mirrors the CSS ["},{"kind":"code","text":"`object-fit`"},{"kind":"text","text":"](https://developer.mozilla.org/en-US/docs/Web/CSS/object-fit) property.\n\n- "},{"kind":"code","text":"`'cover'`"},{"kind":"text","text":" - The image is sized to maintain its aspect ratio while filling the container box.\nIf the image's aspect ratio does not match the aspect ratio of its box, then the object will be clipped to fit.\n\n- "},{"kind":"code","text":"`'contain'`"},{"kind":"text","text":" - The image is scaled down or up to maintain its aspect ratio while fitting within the container box.\n\n- "},{"kind":"code","text":"`'fill'`"},{"kind":"text","text":" - The image is sized to entirely fill the container box. If necessary, the image will be stretched or squished to fit.\n\n- "},{"kind":"code","text":"`'none'`"},{"kind":"text","text":" - The image is not resized and is centered by default.\nWhen specified, the exact position can be controlled with ["},{"kind":"code","text":"`contentPosition`"},{"kind":"text","text":"](#contentposition) prop.\n\n- "},{"kind":"code","text":"`'scale-down'`"},{"kind":"text","text":" - The image is sized as if "},{"kind":"code","text":"`none`"},{"kind":"text","text":" or "},{"kind":"code","text":"`contain`"},{"kind":"text","text":" were specified, whichever would result in a smaller concrete image size."}],"blockTags":[{"tag":"@default","content":[{"kind":"text","text":"'cover'"}]}]},"type":{"type":"reference","name":"ImageContentFit"}},{"name":"contentPosition","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"It is used together with ["},{"kind":"code","text":"`contentFit`"},{"kind":"text","text":"](#contentfit) to specify how the image should be positioned with x/y coordinates inside its own container.\nAn equivalent of the CSS ["},{"kind":"code","text":"`object-position`"},{"kind":"text","text":"](https://developer.mozilla.org/en-US/docs/Web/CSS/object-position) property."}],"blockTags":[{"tag":"@default","content":[{"kind":"text","text":"'center'"}]}]},"type":{"type":"reference","name":"ImageContentPosition"}},{"name":"defaultSource","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[],"blockTags":[{"tag":"@deprecated","content":[{"kind":"text","text":"Provides compatibility for ["},{"kind":"code","text":"`defaultSource`"},{"kind":"text","text":" from React Native Image](https://reactnative.dev/docs/image#defaultsource).\nUse ["},{"kind":"code","text":"`placeholder`"},{"kind":"text","text":"](#placeholder) prop instead."}]}]},"type":{"type":"union","types":[{"type":"literal","value":null},{"type":"reference","name":"ImageSource"}]}},{"name":"enableLiveTextInteraction","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"Enables Live Text interaction with the image. Check official [Apple documentation](https://developer.apple.com/documentation/visionkit/enabling_live_text_interactions_with_images) for more details."}],"blockTags":[{"tag":"@default","content":[{"kind":"text","text":"false"}]},{"tag":"@platform","content":[{"kind":"text","text":"ios 16.0+"}]}]},"type":{"type":"intrinsic","name":"boolean"}},{"name":"fadeDuration","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[],"blockTags":[{"tag":"@deprecated","content":[{"kind":"text","text":"Provides compatibility for ["},{"kind":"code","text":"`fadeDuration`"},{"kind":"text","text":" from React Native Image](https://reactnative.dev/docs/image#fadeduration-android).\nInstead use ["},{"kind":"code","text":"`transition`"},{"kind":"text","text":"](#transition) with the provided duration."}]}]},"type":{"type":"intrinsic","name":"number"}},{"name":"focusable","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"Whether this View should be focusable with a non-touch input device and receive focus with a hardware keyboard."}],"blockTags":[{"tag":"@default","content":[{"kind":"text","text":"false"}]},{"tag":"@platform","content":[{"kind":"text","text":"android"}]}]},"type":{"type":"intrinsic","name":"boolean"},"overwrites":{"type":"reference","name":"ViewProps.focusable"}},{"name":"loadingIndicatorSource","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[],"blockTags":[{"tag":"@deprecated","content":[{"kind":"text","text":"Provides compatibility for ["},{"kind":"code","text":"`loadingIndicatorSource`"},{"kind":"text","text":" from React Native Image](https://reactnative.dev/docs/image#loadingindicatorsource).\nUse ["},{"kind":"code","text":"`placeholder`"},{"kind":"text","text":"](#placeholder) prop instead."}]}]},"type":{"type":"union","types":[{"type":"literal","value":null},{"type":"reference","name":"ImageSource"}]}},{"name":"onError","kind":1024,"flags":{"isOptional":true},"type":{"type":"reflection","declaration":{"name":"__type","kind":65536,"signatures":[{"name":"__type","kind":4096,"comment":{"summary":[{"kind":"text","text":"Called on an image fetching error."}]},"parameters":[{"name":"event","kind":32768,"type":{"type":"reference","name":"ImageErrorEventData"}}],"type":{"type":"intrinsic","name":"void"}}]}}},{"name":"onLoad","kind":1024,"flags":{"isOptional":true},"type":{"type":"reflection","declaration":{"name":"__type","kind":65536,"signatures":[{"name":"__type","kind":4096,"comment":{"summary":[{"kind":"text","text":"Called when the image load completes successfully."}]},"parameters":[{"name":"event","kind":32768,"type":{"type":"reference","name":"ImageLoadEventData"}}],"type":{"type":"intrinsic","name":"void"}}]}}},{"name":"onLoadEnd","kind":1024,"flags":{"isOptional":true},"type":{"type":"reflection","declaration":{"name":"__type","kind":65536,"signatures":[{"name":"__type","kind":4096,"comment":{"summary":[{"kind":"text","text":"Called when the image load either succeeds or fails."}]},"type":{"type":"intrinsic","name":"void"}}]}}},{"name":"onLoadStart","kind":1024,"flags":{"isOptional":true},"type":{"type":"reflection","declaration":{"name":"__type","kind":65536,"signatures":[{"name":"__type","kind":4096,"comment":{"summary":[{"kind":"text","text":"Called when the image starts to load."}]},"type":{"type":"intrinsic","name":"void"}}]}}},{"name":"onProgress","kind":1024,"flags":{"isOptional":true},"type":{"type":"reflection","declaration":{"name":"__type","kind":65536,"signatures":[{"name":"__type","kind":4096,"comment":{"summary":[{"kind":"text","text":"Called when the image is loading. Can be called multiple times before the image has finished loading.\nThe event object provides details on how many bytes were loaded so far and what's the expected total size."}]},"parameters":[{"name":"event","kind":32768,"type":{"type":"reference","name":"ImageProgressEventData"}}],"type":{"type":"intrinsic","name":"void"}}]}}},{"name":"placeholder","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"An image to display while loading the proper image and no image has been displayed yet or the source is unset."}]},"type":{"type":"union","types":[{"type":"literal","value":null},{"type":"intrinsic","name":"string"},{"type":"intrinsic","name":"number"},{"type":"array","elementType":{"type":"intrinsic","name":"string"}},{"type":"reference","name":"ImageSource"},{"type":"array","elementType":{"type":"reference","name":"ImageSource"}}]}},{"name":"priority","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"Priorities for completing loads. If more than one load is queued at a time,\nthe load with the higher priority will be started first.\nPriorities are considered best effort, there are no guarantees about the order in which loads will start or finish."}],"blockTags":[{"tag":"@default","content":[{"kind":"text","text":"'normal'"}]}]},"type":{"type":"union","types":[{"type":"literal","value":null},{"type":"literal","value":"low"},{"type":"literal","value":"normal"},{"type":"literal","value":"high"}]}},{"name":"recyclingKey","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"Changing this prop resets the image view content to blank or a placeholder before loading and rendering the final image.\nThis is especially useful for any kinds of recycling views like [FlashList](https://github.com/shopify/flash-list)\nto prevent showing the previous source before the new one fully loads."}],"blockTags":[{"tag":"@default","content":[{"kind":"text","text":"null"}]},{"tag":"@platform","content":[{"kind":"text","text":"android"}]},{"tag":"@platform","content":[{"kind":"text","text":"ios"}]}]},"type":{"type":"union","types":[{"type":"literal","value":null},{"type":"intrinsic","name":"string"}]}},{"name":"resizeMode","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[],"blockTags":[{"tag":"@deprecated","content":[{"kind":"text","text":"Provides compatibility for ["},{"kind":"code","text":"`resizeMode`"},{"kind":"text","text":" from React Native Image](https://reactnative.dev/docs/image#resizemode).\nNote that "},{"kind":"code","text":"`\"repeat\"`"},{"kind":"text","text":" option is not supported at all.\nUse the more powerful ["},{"kind":"code","text":"`contentFit`"},{"kind":"text","text":"](#contentfit) and ["},{"kind":"code","text":"`contentPosition`"},{"kind":"text","text":"](#contentposition) props instead."}]}]},"type":{"type":"union","types":[{"type":"literal","value":"cover"},{"type":"literal","value":"contain"},{"type":"literal","value":"center"},{"type":"literal","value":"stretch"},{"type":"literal","value":"repeat"}]}},{"name":"responsivePolicy","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"Determines whether to choose image source based on container size only on mount or on every resize.\nUse "},{"kind":"code","text":"`initial`"},{"kind":"text","text":" to improve performance."}],"blockTags":[{"tag":"@default","content":[{"kind":"text","text":"\"live\""}]},{"tag":"@platform","content":[{"kind":"text","text":"web"}]}]},"type":{"type":"union","types":[{"type":"literal","value":"live"},{"type":"literal","value":"initial"}]}},{"name":"source","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"The image source, either a remote URL, a local file resource or a number that is the result of the "},{"kind":"code","text":"`require()`"},{"kind":"text","text":" function.\nWhen provided as an array of sources, the source that fits best into the container size and is closest to the screen scale\nwill be chosen. In this case it is important to provide "},{"kind":"code","text":"`width`"},{"kind":"text","text":", "},{"kind":"code","text":"`height`"},{"kind":"text","text":" and "},{"kind":"code","text":"`scale`"},{"kind":"text","text":" properties."}]},"type":{"type":"union","types":[{"type":"literal","value":null},{"type":"intrinsic","name":"string"},{"type":"intrinsic","name":"number"},{"type":"array","elementType":{"type":"intrinsic","name":"string"}},{"type":"reference","name":"ImageSource"},{"type":"array","elementType":{"type":"reference","name":"ImageSource"}}]}},{"name":"tintColor","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"A color used to tint template images (a bitmap image where only the opacity matters).\nThe color is applied to every non-transparent pixel, causing the image’s shape to adopt that color.\nThis effect is not applied to placeholders."}],"blockTags":[{"tag":"@default","content":[{"kind":"text","text":"null"}]},{"tag":"@platform","content":[{"kind":"text","text":"android"}]},{"tag":"@platform","content":[{"kind":"text","text":"ios"}]}]},"type":{"type":"union","types":[{"type":"literal","value":null},{"type":"intrinsic","name":"string"}]}},{"name":"transition","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"Describes how the image view should transition the contents when switching the image source.\\\nIf provided as a number, it is the duration in milliseconds of the "},{"kind":"code","text":"`'cross-dissolve'`"},{"kind":"text","text":" effect."}]},"type":{"type":"union","types":[{"type":"literal","value":null},{"type":"intrinsic","name":"number"},{"type":"reference","name":"ImageTransition"}]}}],"extendedTypes":[{"type":"reference","name":"ViewProps","qualifiedName":"ViewProps","package":"react-native"}]},{"name":"ImageSource","kind":4194304,"type":{"type":"reflection","declaration":{"name":"__type","kind":65536,"children":[{"name":"blurhash","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"The blurhash string to use to generate the image. You can read more about the blurhash\non ["},{"kind":"code","text":"`woltapp/blurhash`"},{"kind":"text","text":"](https://github.com/woltapp/blurhash) repo. Ignored when "},{"kind":"code","text":"`uri`"},{"kind":"text","text":" is provided.\nWhen using the blurhash, you should also provide "},{"kind":"code","text":"`width`"},{"kind":"text","text":" and "},{"kind":"code","text":"`height`"},{"kind":"text","text":" (higher values reduce performance),\notherwise their default value is "},{"kind":"code","text":"`16`"},{"kind":"text","text":"."}]},"type":{"type":"intrinsic","name":"string"}},{"name":"cacheKey","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"The cache key used to query and store this specific image.\nIf not provided, the "},{"kind":"code","text":"`uri`"},{"kind":"text","text":" is used also as the cache key."}]},"type":{"type":"intrinsic","name":"string"}},{"name":"headers","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"An object representing the HTTP headers to send along with the request for a remote image."}],"blockTags":[{"tag":"@platform","content":[{"kind":"text","text":"android"}]},{"tag":"@platform","content":[{"kind":"text","text":"ios"}]}]},"type":{"type":"reference","typeArguments":[{"type":"intrinsic","name":"string"},{"type":"intrinsic","name":"string"}],"name":"Record","qualifiedName":"Record","package":"typescript"}},{"name":"height","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"Can be specified if known at build time, in which case the value\nwill be used to set the default "},{"kind":"code","text":"` `"},{"kind":"text","text":" component dimension"}]},"type":{"type":"intrinsic","name":"number"}},{"name":"thumbhash","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"The thumbhash string to use to generate the image placeholder. You can read more about thumbhash\non the ["},{"kind":"code","text":"`thumbhash website`"},{"kind":"text","text":"](https://evanw.github.io/thumbhash/). Ignored when "},{"kind":"code","text":"`uri`"},{"kind":"text","text":" is provided."}]},"type":{"type":"intrinsic","name":"string"}},{"name":"uri","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"A string representing the resource identifier for the image,\nwhich could be an http address, a local file path, or the name of a static image resource."}]},"type":{"type":"intrinsic","name":"string"}},{"name":"width","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"Can be specified if known at build time, in which case the value\nwill be used to set the default "},{"kind":"code","text":"` `"},{"kind":"text","text":" component dimension"}]},"type":{"type":"intrinsic","name":"number"}}]}}},{"name":"ImageTransition","kind":4194304,"comment":{"summary":[{"kind":"text","text":"An object that describes the smooth transition when switching the image source."}]},"type":{"type":"reflection","declaration":{"name":"__type","kind":65536,"children":[{"name":"duration","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"The duration of the transition in milliseconds."}],"blockTags":[{"tag":"@default","content":[{"kind":"text","text":"0"}]}]},"type":{"type":"intrinsic","name":"number"}},{"name":"effect","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"An animation effect used for transition."}],"blockTags":[{"tag":"@default","content":[{"kind":"text","text":"'cross-dissolve'\n\nOn Android, only "},{"kind":"code","text":"`'cross-dissolve'`"},{"kind":"text","text":" is supported.\nOn Web, "},{"kind":"code","text":"`'curl-up'`"},{"kind":"text","text":" and "},{"kind":"code","text":"`'curl-down'`"},{"kind":"text","text":" effects are not supported."}]}]},"type":{"type":"union","types":[{"type":"literal","value":"cross-dissolve"},{"type":"literal","value":"flip-from-top"},{"type":"literal","value":"flip-from-right"},{"type":"literal","value":"flip-from-bottom"},{"type":"literal","value":"flip-from-left"},{"type":"literal","value":"curl-up"},{"type":"literal","value":"curl-down"},{"type":"literal","value":null}]}},{"name":"timing","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"Specifies the speed curve of the transition effect and how intermediate values are calculated."}],"blockTags":[{"tag":"@default","content":[{"kind":"text","text":"'ease-in-out'"}]}]},"type":{"type":"union","types":[{"type":"literal","value":"ease-in-out"},{"type":"literal","value":"ease-in"},{"type":"literal","value":"ease-out"},{"type":"literal","value":"linear"}]}}]}}}]}
\ No newline at end of file
diff --git a/docs/public/static/data/v49.0.0/expo-in-app-purchases.json b/docs/public/static/data/v49.0.0/expo-in-app-purchases.json
new file mode 100644
index 0000000000000..1352e80551067
--- /dev/null
+++ b/docs/public/static/data/v49.0.0/expo-in-app-purchases.json
@@ -0,0 +1 @@
+{"name":"expo-in-app-purchases","kind":1,"children":[{"name":"IAPErrorCode","kind":8,"comment":{"summary":[{"kind":"text","text":"Abstracts over the Android [Billing Response Codes](https://developer.android.com/reference/com/android/billingclient/api/BillingClient.BillingResponseCode)\nand iOS [SKErrorCodes](https://developer.apple.com/documentation/storekit/skerrorcode?language=objc)."}]},"children":[{"name":"BILLING_UNAVAILABLE","kind":16,"comment":{"summary":[{"kind":"text","text":"Billing API version is not supported for the type requested. See "},{"kind":"code","text":"`BILLING_UNAVAILABLE`"},{"kind":"text","text":" on\nAndroid."}]},"type":{"type":"literal","value":5}},{"name":"CLOUD_SERVICE","kind":16,"comment":{"summary":[{"kind":"text","text":"Apple Cloud Service connection failed or invalid permissions.\nSee "},{"kind":"code","text":"`SKErrorCloudServicePermissionDenied`"},{"kind":"text","text":", "},{"kind":"code","text":"`SKErrorCloudServiceNetworkConnectionFailed`"},{"kind":"text","text":" and\n"},{"kind":"code","text":"`SKErrorCloudServiceRevoked`"},{"kind":"text","text":" on iOS."}]},"type":{"type":"literal","value":10}},{"name":"DEVELOPER_ERROR","kind":16,"comment":{"summary":[{"kind":"text","text":"Invalid arguments provided to the API. This error can also indicate that the application was\nnot correctly signed or properly set up for In-app Billing in Google Play. See "},{"kind":"code","text":"`DEVELOPER_ERROR`"},{"kind":"text","text":"\non Android."}]},"type":{"type":"literal","value":7}},{"name":"INVALID_IDENTIFIER","kind":16,"comment":{"summary":[{"kind":"text","text":"The offer identifier or price specified in App Store Connect is no longer valid. See\n"},{"kind":"code","text":"`SKErrorInvalidSignature`"},{"kind":"text","text":", "},{"kind":"code","text":"`SKErrorInvalidOfferPrice`"},{"kind":"text","text":", "},{"kind":"code","text":"`SKErrorInvalidOfferIdentifier`"},{"kind":"text","text":" on iOS."}]},"type":{"type":"literal","value":13}},{"name":"ITEM_ALREADY_OWNED","kind":16,"comment":{"summary":[{"kind":"text","text":"Failure to purchase since item is already owned. See "},{"kind":"code","text":"`ITEM_ALREADY_OWNED`"},{"kind":"text","text":" on Android."}]},"type":{"type":"literal","value":8}},{"name":"ITEM_NOT_OWNED","kind":16,"comment":{"summary":[{"kind":"text","text":"Failure to consume since item is not owned. See "},{"kind":"code","text":"`ITEM_NOT_OWNED`"},{"kind":"text","text":" on Android."}]},"type":{"type":"literal","value":9}},{"name":"ITEM_UNAVAILABLE","kind":16,"comment":{"summary":[{"kind":"text","text":"Requested product is not available for purchase. See "},{"kind":"code","text":"`SKErrorStoreProductNotAvailable`"},{"kind":"text","text":" on iOS,\n"},{"kind":"code","text":"`ITEM_UNAVAILABLE`"},{"kind":"text","text":" on Android."}]},"type":{"type":"literal","value":6}},{"name":"MISSING_PARAMS","kind":16,"comment":{"summary":[{"kind":"text","text":"Parameters are missing in a payment discount. See "},{"kind":"code","text":"`SKErrorMissingOfferParams`"},{"kind":"text","text":" on iOS."}]},"type":{"type":"literal","value":14}},{"name":"PAYMENT_INVALID","kind":16,"comment":{"summary":[{"kind":"text","text":"The feature is not allowed on the current device, or the user is not authorized to make payments.\nSee "},{"kind":"code","text":"`SKErrorClientInvalid`"},{"kind":"text","text":", "},{"kind":"code","text":"`SKErrorPaymentInvalid`"},{"kind":"text","text":", and "},{"kind":"code","text":"`SKErrorPaymentNotAllowed`"},{"kind":"text","text":" on iOS,\n"},{"kind":"code","text":"`FEATURE_NOT_SUPPORTED`"},{"kind":"text","text":" on Android."}]},"type":{"type":"literal","value":1}},{"name":"PRIVACY_UNACKNOWLEDGED","kind":16,"comment":{"summary":[{"kind":"text","text":"The user has not yet acknowledged Apple’s privacy policy for Apple Music. See\n"},{"kind":"code","text":"`SKErrorPrivacyAcknowledgementRequired`"},{"kind":"text","text":" on iOS."}]},"type":{"type":"literal","value":11}},{"name":"SERVICE_DISCONNECTED","kind":16,"comment":{"summary":[{"kind":"text","text":"Play Store service is not connected now. See "},{"kind":"code","text":"`SERVICE_DISCONNECTED`"},{"kind":"text","text":" on Android."}]},"type":{"type":"literal","value":2}},{"name":"SERVICE_TIMEOUT","kind":16,"comment":{"summary":[{"kind":"text","text":"The request has reached the maximum timeout before Google Play responds. See "},{"kind":"code","text":"`SERVICE_TIMEOUT`"},{"kind":"text","text":"\non Android."}]},"type":{"type":"literal","value":4}},{"name":"SERVICE_UNAVAILABLE","kind":16,"comment":{"summary":[{"kind":"text","text":"Network connection is down. See "},{"kind":"code","text":"`SERVICE_UNAVAILABLE`"},{"kind":"text","text":" on Android."}]},"type":{"type":"literal","value":3}},{"name":"UNAUTHORIZED_REQUEST","kind":16,"comment":{"summary":[{"kind":"text","text":"The app is attempting to use a property for which it does not have the required entitlement.\nSee "},{"kind":"code","text":"`SKErrorUnauthorizedRequestData`"},{"kind":"text","text":" on iOS."}]},"type":{"type":"literal","value":12}},{"name":"UNKNOWN","kind":16,"comment":{"summary":[{"kind":"text","text":"An unknown or unexpected error occurred. See "},{"kind":"code","text":"`SKErrorUnknown`"},{"kind":"text","text":" on iOS, "},{"kind":"code","text":"`ERROR`"},{"kind":"text","text":" on Android."}]},"type":{"type":"literal","value":0}}]},{"name":"IAPItemType","kind":8,"children":[{"name":"PURCHASE","kind":16,"comment":{"summary":[{"kind":"text","text":"One time purchase or consumable."}]},"type":{"type":"literal","value":0}},{"name":"SUBSCRIPTION","kind":16,"comment":{"summary":[{"kind":"text","text":"Subscription."}]},"type":{"type":"literal","value":1}}]},{"name":"IAPResponseCode","kind":8,"children":[{"name":"DEFERRED","kind":16,"comment":{"summary":[{"kind":"text","text":"Purchase was deferred."}],"blockTags":[{"tag":"@platform","content":[{"kind":"text","text":"ios"}]}]},"type":{"type":"literal","value":3}},{"name":"ERROR","kind":16,"comment":{"summary":[{"kind":"text","text":"An error occurred. Check the "},{"kind":"code","text":"`errorCode`"},{"kind":"text","text":" for additional details."}]},"type":{"type":"literal","value":2}},{"name":"OK","kind":16,"comment":{"summary":[{"kind":"text","text":"Response returned successfully."}]},"type":{"type":"literal","value":0}},{"name":"USER_CANCELED","kind":16,"comment":{"summary":[{"kind":"text","text":"User canceled the purchase."}]},"type":{"type":"literal","value":1}}]},{"name":"InAppPurchaseState","kind":8,"children":[{"name":"DEFERRED","kind":16,"comment":{"summary":[{"kind":"text","text":"The transaction has been received, but its final status is pending external\naction such as the Ask to Buy feature where a child initiates a new purchase and has to wait\nfor the family organizer's approval. Update your UI to show the deferred state, and wait for\nanother callback that indicates the final status."}],"blockTags":[{"tag":"@platform","content":[{"kind":"text","text":"ios"}]}]},"type":{"type":"literal","value":4}},{"name":"FAILED","kind":16,"comment":{"summary":[{"kind":"text","text":"The transaction failed."}]},"type":{"type":"literal","value":2}},{"name":"PURCHASED","kind":16,"comment":{"summary":[{"kind":"text","text":"The App Store successfully processed payment."}]},"type":{"type":"literal","value":1}},{"name":"PURCHASING","kind":16,"comment":{"summary":[{"kind":"text","text":"The transaction is being processed."}]},"type":{"type":"literal","value":0}},{"name":"RESTORED","kind":16,"comment":{"summary":[{"kind":"text","text":"This transaction restores content previously purchased by the user. Read the\n"},{"kind":"code","text":"`originalTransaction`"},{"kind":"text","text":" properties to obtain information about the original purchase."}],"blockTags":[{"tag":"@platform","content":[{"kind":"text","text":"ios"}]}]},"type":{"type":"literal","value":3}}]},{"name":"IAPItemDetails","kind":256,"comment":{"summary":[{"kind":"text","text":"Details about the purchasable item that you inputted in App Store Connect and Google Play Console."}]},"children":[{"name":"description","kind":1024,"comment":{"summary":[{"kind":"text","text":"User facing description about the item."}],"blockTags":[{"tag":"@example","content":[{"kind":"code","text":"`Currency used to trade for items in the game`"}]}]},"type":{"type":"intrinsic","name":"string"}},{"name":"price","kind":1024,"comment":{"summary":[{"kind":"text","text":"The price formatted with the local currency symbol. Use this to display the price, not to make\ncalculations."}],"blockTags":[{"tag":"@example","content":[{"kind":"code","text":"`$1.99`"}]}]},"type":{"type":"intrinsic","name":"string"}},{"name":"priceAmountMicros","kind":1024,"comment":{"summary":[{"kind":"text","text":"The price in micro-units, where 1,000,000 micro-units equal one unit of the currency. Use this\nfor calculations."}],"blockTags":[{"tag":"@example","content":[{"kind":"code","text":"`1990000`"}]}]},"type":{"type":"intrinsic","name":"number"}},{"name":"priceCurrencyCode","kind":1024,"comment":{"summary":[{"kind":"text","text":"The local currency code from the ISO 4217 code list."}],"blockTags":[{"tag":"@example","content":[{"kind":"code","text":"`USD`"},{"kind":"text","text":", "},{"kind":"code","text":"`CAN`"},{"kind":"text","text":", "},{"kind":"code","text":"`RUB`"}]}]},"type":{"type":"intrinsic","name":"string"}},{"name":"productId","kind":1024,"comment":{"summary":[{"kind":"text","text":"The product ID representing an item inputted in App Store Connect and Google Play Console."}],"blockTags":[{"tag":"@example","content":[{"kind":"code","text":"`gold`"}]}]},"type":{"type":"intrinsic","name":"string"}},{"name":"subscriptionPeriod","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"The length of a subscription period specified in ISO 8601 format. In-app purchases return "},{"kind":"code","text":"`P0D`"},{"kind":"text","text":".\nOn iOS, non-renewable subscriptions also return "},{"kind":"code","text":"`P0D`"},{"kind":"text","text":"."}],"blockTags":[{"tag":"@example","content":[{"kind":"code","text":"`P0D`"},{"kind":"text","text":", "},{"kind":"code","text":"`P6W`"},{"kind":"text","text":", "},{"kind":"code","text":"`P3M`"},{"kind":"text","text":", "},{"kind":"code","text":"`P6M`"},{"kind":"text","text":", "},{"kind":"code","text":"`P1Y`"}]}]},"type":{"type":"intrinsic","name":"string"}},{"name":"title","kind":1024,"comment":{"summary":[{"kind":"text","text":"The title of the purchasable item. This should be displayed to the user and may be different\nfrom the "},{"kind":"code","text":"`productId`"},{"kind":"text","text":"."}],"blockTags":[{"tag":"@example","content":[{"kind":"code","text":"`Gold Coin`"}]}]},"type":{"type":"intrinsic","name":"string"}},{"name":"type","kind":1024,"comment":{"summary":[{"kind":"text","text":"The type of the purchase. Note that this is not very accurate on iOS as this data is only\navailable on iOS 11.2 and higher and non-renewable subscriptions always return\n"},{"kind":"code","text":"`IAPItemType.PURCHASE`"},{"kind":"text","text":"."}]},"type":{"type":"reference","name":"IAPItemType"}}]},{"name":"IAPPurchaseItemOptions","kind":256,"comment":{"summary":[{"kind":"text","text":"The "},{"kind":"code","text":"`purchaseItemAsync`"},{"kind":"text","text":" billing context on Android."}],"blockTags":[{"tag":"@platform","content":[{"kind":"text","text":"android"}]}]},"children":[{"name":"accountIdentifiers","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"Account identifiers, both need to be provided to work with Google Play Store."}]},"type":{"type":"reflection","declaration":{"name":"__type","kind":65536,"children":[{"name":"obfuscatedAccountId","kind":1024,"comment":{"summary":[{"kind":"text","text":"The obfuscated account id of the user's Google Play account."}]},"type":{"type":"intrinsic","name":"string"}},{"name":"obfuscatedProfileId","kind":1024,"comment":{"summary":[{"kind":"text","text":"The obfuscated profile id of the user's Google Play account."}]},"type":{"type":"intrinsic","name":"string"}}]}}},{"name":"isVrPurchaseFlow","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"Whether the purchase is happening in a VR context."}]},"type":{"type":"intrinsic","name":"boolean"}},{"name":"oldPurchaseToken","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"The "},{"kind":"code","text":"`purchaseToken`"},{"kind":"text","text":" of the purchase that the user is upgrading or downgrading from.\nThis is mandatory for replacing an old subscription such as when a user\nupgrades from a monthly subscription to a yearly one that provides the same content. You can\nget the purchase token from ["},{"kind":"code","text":"`getPurchaseHistoryAsync`"},{"kind":"text","text":"](#inapppurchasesgetpurchasehistoryasyncoptions)."}]},"type":{"type":"intrinsic","name":"string"}}]},{"name":"IAPQueryResponse","kind":256,"comment":{"summary":[{"kind":"text","text":"The response type for queries and purchases."}]},"children":[{"name":"errorCode","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"code","text":"`IAPErrorCode`"},{"kind":"text","text":" that provides more detail on why an error occurred. "},{"kind":"code","text":"`null`"},{"kind":"text","text":" unless "},{"kind":"code","text":"`responseCode`"},{"kind":"text","text":"\nis "},{"kind":"code","text":"`IAPResponseCode.ERROR`"},{"kind":"text","text":"."}]},"type":{"type":"reference","name":"IAPErrorCode"}},{"name":"responseCode","kind":1024,"comment":{"summary":[{"kind":"text","text":"The response code from a query or purchase."}]},"type":{"type":"reference","name":"IAPResponseCode"}},{"name":"results","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"The array containing the "},{"kind":"code","text":"`InAppPurchase`"},{"kind":"text","text":" or "},{"kind":"code","text":"`IAPItemDetails`"},{"kind":"text","text":" objects requested depending on\nthe method."}]},"type":{"type":"array","elementType":{"type":"reference","name":"QueryResult"}}}],"typeParameters":[{"name":"QueryResult","kind":131072}]},{"name":"InAppPurchase","kind":256,"children":[{"name":"acknowledged","kind":1024,"comment":{"summary":[{"kind":"text","text":"Boolean indicating whether this item has been \"acknowledged\" via "},{"kind":"code","text":"`finishTransactionAsync`"},{"kind":"text","text":"."}]},"type":{"type":"intrinsic","name":"boolean"}},{"name":"orderId","kind":1024,"comment":{"summary":[{"kind":"text","text":"A string that uniquely identifies a successful payment transaction."}]},"type":{"type":"intrinsic","name":"string"}},{"name":"originalOrderId","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"Represents the original order ID for restored purchases."}],"blockTags":[{"tag":"@platform","content":[{"kind":"text","text":"ios"}]}]},"type":{"type":"intrinsic","name":"string"}},{"name":"originalPurchaseTime","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"Represents the original purchase time for restored purchases."}],"blockTags":[{"tag":"@platform","content":[{"kind":"text","text":"ios"}]}]},"type":{"type":"intrinsic","name":"string"}},{"name":"packageName","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"The application package from which the purchase originated."}],"blockTags":[{"tag":"@platform","content":[{"kind":"text","text":"android"}]},{"tag":"@example","content":[{"kind":"code","text":"`com.example.myapp`"}]}]},"type":{"type":"intrinsic","name":"string"}},{"name":"productId","kind":1024,"comment":{"summary":[{"kind":"text","text":"The product ID representing an item inputted in Google Play Console and App Store Connect."}],"blockTags":[{"tag":"@example","content":[{"kind":"code","text":"`gold`"}]}]},"type":{"type":"intrinsic","name":"string"}},{"name":"purchaseState","kind":1024,"comment":{"summary":[{"kind":"text","text":"The state of the purchase."}]},"type":{"type":"reference","name":"InAppPurchaseState"}},{"name":"purchaseTime","kind":1024,"comment":{"summary":[{"kind":"text","text":"The time the product was purchased, in milliseconds since the epoch (Jan 1, 1970)."}]},"type":{"type":"intrinsic","name":"number"}},{"name":"purchaseToken","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"A token that uniquely identifies a purchase for a given item and user pair."}],"blockTags":[{"tag":"@platform","content":[{"kind":"text","text":"android"}]}]},"type":{"type":"intrinsic","name":"string"}},{"name":"transactionReceipt","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"The App Store receipt found in the main bundle encoded as a Base64 String."}],"blockTags":[{"tag":"@platform","content":[{"kind":"text","text":"ios"}]}]},"type":{"type":"intrinsic","name":"string"}}]},{"name":"IAPPurchaseHistoryOptions","kind":4194304,"type":{"type":"reflection","declaration":{"name":"__type","kind":65536,"children":[{"name":"useGooglePlayCache","kind":1024,"comment":{"summary":[{"kind":"text","text":"A boolean that indicates whether or not you want to make a network request\nto sync expired/consumed purchases and those on other devices.\n\n- If set to "},{"kind":"code","text":"`true`"},{"kind":"text","text":", this method returns purchase details **only** for the user's currently\n owned items (active subscriptions and non-consumed one-time purchases). If set to "},{"kind":"code","text":"`false`"},{"kind":"text","text":", it\n will make a network request and return the most recent purchase made by the user for each\n product, even if that purchase is expired, canceled, or consumed.\n- The return type if this is "},{"kind":"code","text":"`false`"},{"kind":"text","text":" is actually a subset of when it's "},{"kind":"code","text":"`true`"},{"kind":"text","text":". This is because\n Android returns a ["},{"kind":"code","text":"`PurchaseHistoryRecord`"},{"kind":"text","text":"](https://developer.android.com/reference/com/android/billingclient/api/PurchaseHistoryRecord)\n which only contains the purchase time, purchase token, and product ID, rather than all of the\n attributes found in the ["},{"kind":"code","text":"`InAppPurchase`"},{"kind":"text","text":"](#inapppurchase) type."}],"blockTags":[{"tag":"@platform","content":[{"kind":"text","text":"android"}]},{"tag":"@default","content":[{"kind":"text","text":"true"}]}]},"type":{"type":"intrinsic","name":"boolean"}}]}}},{"name":"QueryResult","kind":4194304,"type":{"type":"union","types":[{"type":"reference","name":"InAppPurchase"},{"type":"reference","name":"IAPItemDetails"}]}},{"name":"connectAsync","kind":64,"signatures":[{"name":"connectAsync","kind":4096,"comment":{"summary":[{"kind":"text","text":"Connects to the app store and performs all of the necessary initialization to prepare the module\nto accept payments. This method must be called before anything else, otherwise an error will be\nthrown."}],"blockTags":[{"tag":"@returns","content":[{"kind":"text","text":"Returns a Promise that fulfills when connection is established."}]}]},"type":{"type":"reference","typeArguments":[{"type":"intrinsic","name":"void"}],"name":"Promise","qualifiedName":"Promise","package":"typescript"}}]},{"name":"disconnectAsync","kind":64,"signatures":[{"name":"disconnectAsync","kind":4096,"comment":{"summary":[{"kind":"text","text":"Disconnects from the app store and cleans up memory internally. Call this when you are done using\nthe In-App Purchases API in your app.\n\nNo other methods can be used until the next time you call "},{"kind":"code","text":"`connectAsync`"},{"kind":"text","text":"."}],"blockTags":[{"tag":"@returns","content":[{"kind":"text","text":"Returns a Promise that fulfils when disconnecting process is finished."}]}]},"type":{"type":"reference","typeArguments":[{"type":"intrinsic","name":"void"}],"name":"Promise","qualifiedName":"Promise","package":"typescript"}}]},{"name":"finishTransactionAsync","kind":64,"signatures":[{"name":"finishTransactionAsync","kind":4096,"comment":{"summary":[{"kind":"text","text":"Marks a transaction as completed. This _must_ be called on successful purchases only after you\nhave verified the transaction and unlocked the functionality purchased by the user.\n\nOn Android, this will either \"acknowledge\" or \"consume\" the purchase depending on the value of\n"},{"kind":"code","text":"`consumeItem`"},{"kind":"text","text":". Acknowledging indicates that this is a one time purchase (e.g. premium upgrade),\nwhereas consuming a purchase allows it to be bought more than once. You cannot buy an item again\nuntil it's consumed. Both consuming and acknowledging let Google know that you are done\nprocessing the transaction. If you do not acknowledge or consume a purchase within three days,\nthe user automatically receives a refund, and Google Play revokes the purchase.\n\nOn iOS, this will [mark the transaction as\nfinished](https://developer.apple.com/documentation/storekit/skpaymentqueue/1506003-finishtransaction)\nand prevent it from reappearing in the purchase listener callback. It will also let the user know\ntheir purchase was successful.\n\n"},{"kind":"code","text":"`consumeItem`"},{"kind":"text","text":" is ignored on iOS because you must specify whether an item is a consumable or\nnon-consumable in its product entry in App Store Connect, whereas on Android you indicate an item\nis consumable at runtime.\n\n> Make sure that you verify each purchase to prevent faulty transactions and protect against\n> fraud _before_ you call "},{"kind":"code","text":"`finishTransactionAsync`"},{"kind":"text","text":". On iOS, you can validate the purchase's\n> "},{"kind":"code","text":"`transactionReceipt`"},{"kind":"text","text":" with the App Store as described\n> [here](https://developer.apple.com/documentation/storekit/in-app_purchase/original_api_for_in-app_purchase/validating_receipts_with_the_app_store?language=objc).\n> On Android, you can verify your purchase using the Google Play Developer API as described\n> [here](https://developer.android.com/google/play/billing/security#validating-purchase)."}],"blockTags":[{"tag":"@example","content":[{"kind":"code","text":"```ts\nif (!purchase.acknowledged) {\n await finishTransactionAsync(purchase, false); // or true for consumables\n}\n```"}]}]},"parameters":[{"name":"purchase","kind":32768,"comment":{"summary":[{"kind":"text","text":"The purchase you want to mark as completed."}]},"type":{"type":"reference","name":"InAppPurchase"}},{"name":"consumeItem","kind":32768,"comment":{"summary":[{"kind":"text","text":"__Android Only.__ A boolean indicating whether or not the item is a\nconsumable."}]},"type":{"type":"intrinsic","name":"boolean"}}],"type":{"type":"reference","typeArguments":[{"type":"intrinsic","name":"void"}],"name":"Promise","qualifiedName":"Promise","package":"typescript"}}]},{"name":"getBillingResponseCodeAsync","kind":64,"signatures":[{"name":"getBillingResponseCodeAsync","kind":4096,"comment":{"summary":[{"kind":"text","text":"Returns the last response code. This is more descriptive on Android since there is native support\nfor retrieving the billing response code.\n\nOn Android, this will return "},{"kind":"code","text":"`IAPResponseCode.ERROR`"},{"kind":"text","text":" if you are not connected or one of the\nbilling response codes found\n[here](https://developer.android.com/reference/com/android/billingclient/api/BillingClient.BillingResponseCode)\nif you are.\n\nOn iOS, this will return "},{"kind":"code","text":"`IAPResponseCode.OK`"},{"kind":"text","text":" if you are connected or "},{"kind":"code","text":"`IAPResponseCode.ERROR`"},{"kind":"text","text":" if\nyou are not. Therefore, it's a good way to test whether or not you are connected and it's safe to\nuse the other methods."}],"blockTags":[{"tag":"@returns","content":[{"kind":"text","text":"Returns a Promise that fulfils with an number representing the "},{"kind":"code","text":"`IAPResponseCode`"},{"kind":"text","text":"."}]},{"tag":"@example","content":[{"kind":"code","text":"```ts\nconst responseCode = await getBillingResponseCodeAsync();\n if (responseCode !== IAPResponseCode.OK) {\n // Either we're not connected or the last response returned an error (Android)\n}\n```"}]}]},"type":{"type":"reference","typeArguments":[{"type":"reference","name":"IAPResponseCode"}],"name":"Promise","qualifiedName":"Promise","package":"typescript"}}]},{"name":"getProductsAsync","kind":64,"signatures":[{"name":"getProductsAsync","kind":4096,"comment":{"summary":[{"kind":"text","text":"Retrieves the product details (price, description, title, etc) for each item that you inputted in\nthe Google Play Console and App Store Connect. These products are associated with your app's\nspecific Application/Bundle ID and cannot be retrieved from other apps. This queries both in-app\nproducts and subscriptions so there's no need to pass those in separately.\n\nYou must retrieve an item's details before you attempt to purchase it via "},{"kind":"code","text":"`purchaseItemAsync`"},{"kind":"text","text":".\nThis is a prerequisite to buying a product even if you have the item details bundled in your app\nor on your own servers.\n\nIf any of the product IDs passed in are invalid and don't exist, you will not receive an\n"},{"kind":"code","text":"`IAPItemDetails`"},{"kind":"text","text":" object corresponding to that ID. For example, if you pass in four product IDs in\nbut one of them has a typo, you will only get three response objects back."}],"blockTags":[{"tag":"@returns","content":[{"kind":"text","text":"Returns a Promise that resolves with an "},{"kind":"code","text":"`IAPQueryResponse`"},{"kind":"text","text":" containing "},{"kind":"code","text":"`IAPItemDetails`"},{"kind":"text","text":"\nobjects in the "},{"kind":"code","text":"`results`"},{"kind":"text","text":" array."}]},{"tag":"@example","content":[{"kind":"code","text":"```ts\n// These product IDs must match the item entries you created in the App Store Connect and Google Play Console.\n// If you want to add more or edit their attributes you can do so there.\n\nconst items = Platform.select({\n ios: [\n 'dev.products.gas',\n 'dev.products.premium',\n 'dev.products.gold_monthly',\n 'dev.products.gold_yearly',\n ],\n android: ['gas', 'premium', 'gold_monthly', 'gold_yearly'],\n});\n\n // Retrieve product details\nconst { responseCode, results } = await getProductsAsync(items);\nif (responseCode === IAPResponseCode.OK) {\n this.setState({ items: results });\n}\n```"}]}]},"parameters":[{"name":"itemList","kind":32768,"comment":{"summary":[{"kind":"text","text":"The list of product IDs whose details you want to query from the app store."}]},"type":{"type":"array","elementType":{"type":"intrinsic","name":"string"}}}],"type":{"type":"reference","typeArguments":[{"type":"reference","typeArguments":[{"type":"reference","name":"IAPItemDetails"}],"name":"IAPQueryResponse"}],"name":"Promise","qualifiedName":"Promise","package":"typescript"}}]},{"name":"getPurchaseHistoryAsync","kind":64,"signatures":[{"name":"getPurchaseHistoryAsync","kind":4096,"comment":{"summary":[{"kind":"text","text":"Retrieves the user's purchase history.\n\nPlease note that on iOS, StoreKit actually creates a new transaction object every time you\nrestore completed transactions, therefore the "},{"kind":"code","text":"`purchaseTime`"},{"kind":"text","text":" and "},{"kind":"code","text":"`orderId`"},{"kind":"text","text":" may be inaccurate if\nit's a restored purchase. If you need the original transaction's information you can use\n"},{"kind":"code","text":"`originalPurchaseTime`"},{"kind":"text","text":" and "},{"kind":"code","text":"`originalOrderId`"},{"kind":"text","text":", but those will be 0 and an empty string\nrespectively if it is the original transaction.\n\nYou should not call this method on launch because restoring purchases on iOS prompts for the\nuser’s App Store credentials, which could interrupt the flow of your app."}],"blockTags":[{"tag":"@returns","content":[{"kind":"text","text":"Returns a "},{"kind":"code","text":"`Promise`"},{"kind":"text","text":" that fulfills with an "},{"kind":"code","text":"`IAPQueryResponse`"},{"kind":"text","text":" that contains an array of\n"},{"kind":"code","text":"`InAppPurchase`"},{"kind":"text","text":" objects."}]}]},"parameters":[{"name":"options","kind":32768,"comment":{"summary":[{"kind":"text","text":"An optional "},{"kind":"code","text":"`PurchaseHistoryOptions`"},{"kind":"text","text":" object."}]},"type":{"type":"reference","name":"IAPPurchaseHistoryOptions"},"defaultValue":"..."}],"type":{"type":"reference","typeArguments":[{"type":"reference","typeArguments":[{"type":"reference","name":"InAppPurchase"}],"name":"IAPQueryResponse"}],"name":"Promise","qualifiedName":"Promise","package":"typescript"}}]},{"name":"purchaseItemAsync","kind":64,"signatures":[{"name":"purchaseItemAsync","kind":4096,"comment":{"summary":[{"kind":"text","text":"Initiates the purchase flow to buy the item associated with this "},{"kind":"code","text":"`productId`"},{"kind":"text","text":". This will display a\nprompt to the user that will allow them to either buy the item or cancel the purchase. When the\npurchase completes, the result must be handled in the callback that you passed in to\n["},{"kind":"code","text":"`setPurchaseListener`"},{"kind":"text","text":"](#setpurchaselistener).\n\nRemember, you have to query an item's details via "},{"kind":"code","text":"`getProductsAsync`"},{"kind":"text","text":" and set the purchase\nlistener before you attempt to buy an item.\n\n[Apple](https://developer.apple.com/documentation/storekit/in-app_purchase/original_api_for_in-app_purchase/subscriptions_and_offers)\nand [Google](https://developer.android.com/google/play/billing/subscriptions) both have\ntheir own workflows for dealing with subscriptions. In general, you can deal with them in the\nsame way you do one-time purchases but there are caveats including if a user decides to cancel\nbefore the expiration date. To check the status of a subscription, you can use the [Google Play\nDeveloper](https://developers.google.com/android-publisher/api-ref/rest/v3/purchases.subscriptions/get)\nAPI on Android and the [Status Update\nNotifications](https://developer.apple.com/documentation/storekit/in-app_purchase/original_api_for_in-app_purchase/subscriptions_and_offers/enabling_app_store_server_notifications)\nservice on iOS."}],"blockTags":[{"tag":"@returns","content":[{"kind":"text","text":"Returns a "},{"kind":"code","text":"`Promise`"},{"kind":"text","text":" that resolves when the purchase is done processing. To get the actual\nresult of the purchase, you must handle purchase events inside the "},{"kind":"code","text":"`setPurchaseListener`"},{"kind":"text","text":"\ncallback."}]}]},"parameters":[{"name":"itemId","kind":32768,"comment":{"summary":[{"kind":"text","text":"The product ID of the item you want to buy."}]},"type":{"type":"intrinsic","name":"string"}},{"name":"details","kind":32768,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"__Android Only.__ Details for billing flow."}]},"type":{"type":"reference","name":"IAPPurchaseItemOptions"}}],"type":{"type":"reference","typeArguments":[{"type":"intrinsic","name":"void"}],"name":"Promise","qualifiedName":"Promise","package":"typescript"}}]},{"name":"setPurchaseListener","kind":64,"signatures":[{"name":"setPurchaseListener","kind":4096,"comment":{"summary":[{"kind":"text","text":"Sets a callback that handles incoming purchases. This must be done before any calls to\n"},{"kind":"code","text":"`purchaseItemAsync`"},{"kind":"text","text":" are made, otherwise those transactions will be lost. You should **set the\npurchase listener globally**, and not inside a specific screen, to ensure that you receive\nincomplete transactions, subscriptions, and deferred transactions.\n\nPurchases can either be instantiated by the user (via "},{"kind":"code","text":"`purchaseItemAsync`"},{"kind":"text","text":") or they can come from\nsubscription renewals or unfinished transactions on iOS (e.g. if your app exits before\n"},{"kind":"code","text":"`finishTransactionAsync`"},{"kind":"text","text":" was called).\n\nNote that on iOS, the results array will only contain one item: the one that was just\npurchased. On Android, it will return both finished and unfinished purchases, hence the array\nreturn type. This is because the Google Play Billing API detects purchase updates but doesn't\ndifferentiate which item was just purchased, therefore there's no good way to tell but in general\nit will be whichever purchase has "},{"kind":"code","text":"`acknowledged`"},{"kind":"text","text":" set to "},{"kind":"code","text":"`false`"},{"kind":"text","text":", so those are the ones that you\nhave to handle in the response. Consumed items will not be returned however, so if you consume an\nitem that record will be gone and no longer appear in the results array when a new purchase is\nmade."}],"blockTags":[{"tag":"@example","content":[{"kind":"code","text":"```ts\n// Set purchase listener\n setPurchaseListener(({ responseCode, results, errorCode }) => {\n // Purchase was successful\n if (responseCode === IAPResponseCode.OK) {\n results.forEach(purchase => {\n if (!purchase.acknowledged) {\n console.log(`Successfully purchased ${purchase.productId}`);\n // Process transaction here and unlock content...\n\n // Then when you're done\n finishTransactionAsync(purchase, true);\n }\n });\n } else if (responseCode === IAPResponseCode.USER_CANCELED) {\n console.log('User canceled the transaction');\n } else if (responseCode === IAPResponseCode.DEFERRED) {\n console.log('User does not have permissions to buy but requested parental approval (iOS only)');\n } else {\n console.warn(`Something went wrong with the purchase. Received errorCode ${errorCode}`);\n }\n});\n```"}]}]},"parameters":[{"name":"callback","kind":32768,"comment":{"summary":[{"kind":"text","text":"The callback function you want to run when there is an update to the purchases."}]},"type":{"type":"reflection","declaration":{"name":"__type","kind":65536,"signatures":[{"name":"__type","kind":4096,"parameters":[{"name":"result","kind":32768,"type":{"type":"reference","typeArguments":[{"type":"reference","name":"InAppPurchase"}],"name":"IAPQueryResponse"}}],"type":{"type":"intrinsic","name":"void"}}]}}}],"type":{"type":"intrinsic","name":"void"}}]}]}
\ No newline at end of file
diff --git a/docs/public/static/data/v49.0.0/expo-intent-launcher.json b/docs/public/static/data/v49.0.0/expo-intent-launcher.json
new file mode 100644
index 0000000000000..4d248d2da3460
--- /dev/null
+++ b/docs/public/static/data/v49.0.0/expo-intent-launcher.json
@@ -0,0 +1 @@
+{"name":"expo-intent-launcher","kind":1,"children":[{"name":"ActivityAction","kind":8,"comment":{"summary":[{"kind":"text","text":"Constants are from the source code of [Settings provider](https://developer.android.com/reference/android/provider/Settings)."}]},"children":[{"name":"ACCESSIBILITY_SETTINGS","kind":16,"type":{"type":"literal","value":"android.settings.ACCESSIBILITY_SETTINGS"}},{"name":"ADD_ACCOUNT_SETTINGS","kind":16,"type":{"type":"literal","value":"android.settings.ADD_ACCOUNT_SETTINGS"}},{"name":"AIRPLANE_MODE_SETTINGS","kind":16,"type":{"type":"literal","value":"android.settings.AIRPLANE_MODE_SETTINGS"}},{"name":"APN_SETTINGS","kind":16,"type":{"type":"literal","value":"android.settings.APN_SETTINGS"}},{"name":"APPLICATION_DETAILS_SETTINGS","kind":16,"type":{"type":"literal","value":"android.settings.APPLICATION_DETAILS_SETTINGS"}},{"name":"APPLICATION_DEVELOPMENT_SETTINGS","kind":16,"type":{"type":"literal","value":"android.settings.APPLICATION_DEVELOPMENT_SETTINGS"}},{"name":"APPLICATION_SETTINGS","kind":16,"type":{"type":"literal","value":"android.settings.APPLICATION_SETTINGS"}},{"name":"APP_NOTIFICATION_REDACTION","kind":16,"type":{"type":"literal","value":"android.settings.ACTION_APP_NOTIFICATION_REDACTION"}},{"name":"APP_NOTIFICATION_SETTINGS","kind":16,"type":{"type":"literal","value":"android.settings.APP_NOTIFICATION_SETTINGS"}},{"name":"APP_OPS_SETTINGS","kind":16,"type":{"type":"literal","value":"android.settings.APP_OPS_SETTINGS"}},{"name":"BATTERY_SAVER_SETTINGS","kind":16,"type":{"type":"literal","value":"android.settings.BATTERY_SAVER_SETTINGS"}},{"name":"BLUETOOTH_SETTINGS","kind":16,"type":{"type":"literal","value":"android.settings.BLUETOOTH_SETTINGS"}},{"name":"CAPTIONING_SETTINGS","kind":16,"type":{"type":"literal","value":"android.settings.CAPTIONING_SETTINGS"}},{"name":"CAST_SETTINGS","kind":16,"type":{"type":"literal","value":"android.settings.CAST_SETTINGS"}},{"name":"CONDITION_PROVIDER_SETTINGS","kind":16,"type":{"type":"literal","value":"android.settings.ACTION_CONDITION_PROVIDER_SETTINGS"}},{"name":"DATA_ROAMING_SETTINGS","kind":16,"type":{"type":"literal","value":"android.settings.DATA_ROAMING_SETTINGS"}},{"name":"DATE_SETTINGS","kind":16,"type":{"type":"literal","value":"android.settings.DATE_SETTINGS"}},{"name":"DEVICE_INFO_SETTINGS","kind":16,"type":{"type":"literal","value":"android.settings.DEVICE_INFO_SETTINGS"}},{"name":"DEVICE_NAME","kind":16,"type":{"type":"literal","value":"android.settings.DEVICE_NAME"}},{"name":"DISPLAY_SETTINGS","kind":16,"type":{"type":"literal","value":"android.settings.DISPLAY_SETTINGS"}},{"name":"DREAM_SETTINGS","kind":16,"type":{"type":"literal","value":"android.settings.DREAM_SETTINGS"}},{"name":"HARD_KEYBOARD_SETTINGS","kind":16,"type":{"type":"literal","value":"android.settings.HARD_KEYBOARD_SETTINGS"}},{"name":"HOME_SETTINGS","kind":16,"type":{"type":"literal","value":"android.settings.HOME_SETTINGS"}},{"name":"IGNORE_BACKGROUND_DATA_RESTRICTIONS_SETTINGS","kind":16,"type":{"type":"literal","value":"android.settings.IGNORE_BACKGROUND_DATA_RESTRICTIONS_SETTINGS"}},{"name":"IGNORE_BATTERY_OPTIMIZATION_SETTINGS","kind":16,"type":{"type":"literal","value":"android.settings.IGNORE_BATTERY_OPTIMIZATION_SETTINGS"}},{"name":"INPUT_METHOD_SETTINGS","kind":16,"type":{"type":"literal","value":"android.settings.INPUT_METHOD_SETTINGS"}},{"name":"INPUT_METHOD_SUBTYPE_SETTINGS","kind":16,"type":{"type":"literal","value":"android.settings.INPUT_METHOD_SUBTYPE_SETTINGS"}},{"name":"INTERNAL_STORAGE_SETTINGS","kind":16,"type":{"type":"literal","value":"android.settings.INTERNAL_STORAGE_SETTINGS"}},{"name":"LOCALE_SETTINGS","kind":16,"type":{"type":"literal","value":"android.settings.LOCALE_SETTINGS"}},{"name":"LOCATION_SOURCE_SETTINGS","kind":16,"type":{"type":"literal","value":"android.settings.LOCATION_SOURCE_SETTINGS"}},{"name":"MANAGE_ALL_APPLICATIONS_SETTINGS","kind":16,"type":{"type":"literal","value":"android.settings.MANAGE_ALL_APPLICATIONS_SETTINGS"}},{"name":"MANAGE_APPLICATIONS_SETTINGS","kind":16,"type":{"type":"literal","value":"android.settings.MANAGE_APPLICATIONS_SETTINGS"}},{"name":"MANAGE_DEFAULT_APPS_SETTINGS","kind":16,"type":{"type":"literal","value":"android.settings.MANAGE_DEFAULT_APPS_SETTINGS"}},{"name":"MEMORY_CARD_SETTINGS","kind":16,"type":{"type":"literal","value":"android.settings.MEMORY_CARD_SETTINGS"}},{"name":"MONITORING_CERT_INFO","kind":16,"type":{"type":"literal","value":"android.settings.MONITORING_CERT_INFO"}},{"name":"NETWORK_OPERATOR_SETTINGS","kind":16,"type":{"type":"literal","value":"android.settings.NETWORK_OPERATOR_SETTINGS"}},{"name":"NFCSHARING_SETTINGS","kind":16,"type":{"type":"literal","value":"android.settings.NFCSHARING_SETTINGS"}},{"name":"NFC_PAYMENT_SETTINGS","kind":16,"type":{"type":"literal","value":"android.settings.NFC_PAYMENT_SETTINGS"}},{"name":"NFC_SETTINGS","kind":16,"type":{"type":"literal","value":"android.settings.NFC_SETTINGS"}},{"name":"NIGHT_DISPLAY_SETTINGS","kind":16,"type":{"type":"literal","value":"android.settings.NIGHT_DISPLAY_SETTINGS"}},{"name":"NOTIFICATION_LISTENER_SETTINGS","kind":16,"type":{"type":"literal","value":"android.settings.ACTION_NOTIFICATION_LISTENER_SETTINGS"}},{"name":"NOTIFICATION_POLICY_ACCESS_SETTINGS","kind":16,"type":{"type":"literal","value":"android.settings.NOTIFICATION_POLICY_ACCESS_SETTINGS"}},{"name":"NOTIFICATION_SETTINGS","kind":16,"type":{"type":"literal","value":"android.settings.NOTIFICATION_SETTINGS"}},{"name":"PAIRING_SETTINGS","kind":16,"type":{"type":"literal","value":"android.settings.PAIRING_SETTINGS"}},{"name":"PRINT_SETTINGS","kind":16,"type":{"type":"literal","value":"android.settings.ACTION_PRINT_SETTINGS"}},{"name":"PRIVACY_SETTINGS","kind":16,"type":{"type":"literal","value":"android.settings.PRIVACY_SETTINGS"}},{"name":"QUICK_LAUNCH_SETTINGS","kind":16,"type":{"type":"literal","value":"android.settings.QUICK_LAUNCH_SETTINGS"}},{"name":"REQUEST_IGNORE_BATTERY_OPTIMIZATIONS","kind":16,"type":{"type":"literal","value":"android.settings.REQUEST_IGNORE_BATTERY_OPTIMIZATIONS"}},{"name":"SECURITY_SETTINGS","kind":16,"type":{"type":"literal","value":"android.settings.SECURITY_SETTINGS"}},{"name":"SETTINGS","kind":16,"type":{"type":"literal","value":"android.settings.SETTINGS"}},{"name":"SHOW_ADMIN_SUPPORT_DETAILS","kind":16,"type":{"type":"literal","value":"android.settings.SHOW_ADMIN_SUPPORT_DETAILS"}},{"name":"SHOW_INPUT_METHOD_PICKER","kind":16,"type":{"type":"literal","value":"android.settings.SHOW_INPUT_METHOD_PICKER"}},{"name":"SHOW_REGULATORY_INFO","kind":16,"type":{"type":"literal","value":"android.settings.SHOW_REGULATORY_INFO"}},{"name":"SHOW_REMOTE_BUGREPORT_DIALOG","kind":16,"type":{"type":"literal","value":"android.settings.SHOW_REMOTE_BUGREPORT_DIALOG"}},{"name":"SOUND_SETTINGS","kind":16,"type":{"type":"literal","value":"android.settings.SOUND_SETTINGS"}},{"name":"STORAGE_MANAGER_SETTINGS","kind":16,"type":{"type":"literal","value":"android.settings.STORAGE_MANAGER_SETTINGS"}},{"name":"SYNC_SETTINGS","kind":16,"type":{"type":"literal","value":"android.settings.SYNC_SETTINGS"}},{"name":"SYSTEM_UPDATE_SETTINGS","kind":16,"type":{"type":"literal","value":"android.settings.SYSTEM_UPDATE_SETTINGS"}},{"name":"TETHER_PROVISIONING_UI","kind":16,"type":{"type":"literal","value":"android.settings.TETHER_PROVISIONING_UI"}},{"name":"TRUSTED_CREDENTIALS_USER","kind":16,"type":{"type":"literal","value":"android.settings.TRUSTED_CREDENTIALS_USER"}},{"name":"USAGE_ACCESS_SETTINGS","kind":16,"type":{"type":"literal","value":"android.settings.USAGE_ACCESS_SETTINGS"}},{"name":"USER_DICTIONARY_INSERT","kind":16,"type":{"type":"literal","value":"android.settings.USER_DICTIONARY_INSERT"}},{"name":"USER_DICTIONARY_SETTINGS","kind":16,"type":{"type":"literal","value":"android.settings.USER_DICTIONARY_SETTINGS"}},{"name":"USER_SETTINGS","kind":16,"type":{"type":"literal","value":"android.settings.USER_SETTINGS"}},{"name":"VOICE_CONTROL_AIRPLANE_MODE","kind":16,"type":{"type":"literal","value":"android.settings.VOICE_CONTROL_AIRPLANE_MODE"}},{"name":"VOICE_CONTROL_BATTERY_SAVER_MODE","kind":16,"type":{"type":"literal","value":"android.settings.VOICE_CONTROL_BATTERY_SAVER_MODE"}},{"name":"VOICE_CONTROL_DO_NOT_DISTURB_MODE","kind":16,"type":{"type":"literal","value":"android.settings.VOICE_CONTROL_DO_NOT_DISTURB_MODE"}},{"name":"VOICE_INPUT_SETTINGS","kind":16,"type":{"type":"literal","value":"android.settings.VOICE_INPUT_SETTINGS"}},{"name":"VPN_SETTINGS","kind":16,"type":{"type":"literal","value":"android.settings.VPN_SETTINGS"}},{"name":"VR_LISTENER_SETTINGS","kind":16,"type":{"type":"literal","value":"android.settings.VR_LISTENER_SETTINGS"}},{"name":"WEBVIEW_SETTINGS","kind":16,"type":{"type":"literal","value":"android.settings.WEBVIEW_SETTINGS"}},{"name":"WIFI_IP_SETTINGS","kind":16,"type":{"type":"literal","value":"android.settings.WIFI_IP_SETTINGS"}},{"name":"WIFI_SETTINGS","kind":16,"type":{"type":"literal","value":"android.settings.WIFI_SETTINGS"}},{"name":"WIRELESS_SETTINGS","kind":16,"type":{"type":"literal","value":"android.settings.WIRELESS_SETTINGS"}},{"name":"ZEN_MODE_AUTOMATION_SETTINGS","kind":16,"type":{"type":"literal","value":"android.settings.ZEN_MODE_AUTOMATION_SETTINGS"}},{"name":"ZEN_MODE_EVENT_RULE_SETTINGS","kind":16,"type":{"type":"literal","value":"android.settings.ZEN_MODE_EVENT_RULE_SETTINGS"}},{"name":"ZEN_MODE_EXTERNAL_RULE_SETTINGS","kind":16,"type":{"type":"literal","value":"android.settings.ZEN_MODE_EXTERNAL_RULE_SETTINGS"}},{"name":"ZEN_MODE_PRIORITY_SETTINGS","kind":16,"type":{"type":"literal","value":"android.settings.ZEN_MODE_PRIORITY_SETTINGS"}},{"name":"ZEN_MODE_SCHEDULE_RULE_SETTINGS","kind":16,"type":{"type":"literal","value":"android.settings.ZEN_MODE_SCHEDULE_RULE_SETTINGS"}},{"name":"ZEN_MODE_SETTINGS","kind":16,"type":{"type":"literal","value":"android.settings.ZEN_MODE_SETTINGS"}}]},{"name":"ResultCode","kind":8,"children":[{"name":"Canceled","kind":16,"comment":{"summary":[{"kind":"text","text":"Means that the activity was canceled, e.g. by tapping on the back button."}]},"type":{"type":"literal","value":0}},{"name":"FirstUser","kind":16,"comment":{"summary":[{"kind":"text","text":"First custom, user-defined value that can be returned by the activity."}]},"type":{"type":"literal","value":1}},{"name":"Success","kind":16,"comment":{"summary":[{"kind":"text","text":"Indicates that the activity operation succeeded."}]},"type":{"type":"literal","value":-1}}]},{"name":"IntentLauncherParams","kind":256,"children":[{"name":"category","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"Category provides more details about the action the intent performs. See [Intent.addCategory](https://developer.android.com/reference/android/content/Intent.html#addCategory(java.lang.String))."}]},"type":{"type":"intrinsic","name":"string"}},{"name":"className","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"Class name of the ComponentName."}]},"type":{"type":"intrinsic","name":"string"}},{"name":"data","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"A URI specifying the data that the intent should operate upon. (_Note:_ Android requires the URI\nscheme to be lowercase, unlike the formal RFC.)"}]},"type":{"type":"intrinsic","name":"string"}},{"name":"extra","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"A map specifying additional key-value pairs which are passed with the intent as "},{"kind":"code","text":"`extras`"},{"kind":"text","text":".\nThe keys must include a package prefix, for example the app "},{"kind":"code","text":"`com.android.contacts`"},{"kind":"text","text":" would use\nnames like "},{"kind":"code","text":"`com.android.contacts.ShowAll`"},{"kind":"text","text":"."}]},"type":{"type":"reference","typeArguments":[{"type":"intrinsic","name":"string"},{"type":"intrinsic","name":"any"}],"name":"Record","qualifiedName":"Record","package":"typescript"}},{"name":"flags","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"Bitmask of flags to be used. See [Intent.setFlags]() for more details."}]},"type":{"type":"intrinsic","name":"number"}},{"name":"packageName","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"Package name used as an identifier of ComponentName. Set this only if you want to explicitly\nset the component to handle the intent."}]},"type":{"type":"intrinsic","name":"string"}},{"name":"type","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"A string specifying the MIME type of the data represented by the data parameter. Ignore this\nargument to allow Android to infer the correct MIME type."}]},"type":{"type":"intrinsic","name":"string"}}]},{"name":"IntentLauncherResult","kind":256,"children":[{"name":"data","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"Optional data URI that can be returned by the activity."}]},"type":{"type":"intrinsic","name":"string"}},{"name":"extra","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"Optional extras object that can be returned by the activity."}]},"type":{"type":"intrinsic","name":"object"}},{"name":"resultCode","kind":1024,"comment":{"summary":[{"kind":"text","text":"Result code returned by the activity."}]},"type":{"type":"reference","name":"ResultCode"}}]},{"name":"startActivityAsync","kind":64,"signatures":[{"name":"startActivityAsync","kind":4096,"comment":{"summary":[{"kind":"text","text":"Starts the specified activity. The method will return a promise which resolves when the user\nreturns to the app."}],"blockTags":[{"tag":"@returns","content":[{"kind":"text","text":"A promise which fulfils with "},{"kind":"code","text":"`IntentLauncherResult`"},{"kind":"text","text":" object."}]}]},"parameters":[{"name":"activityAction","kind":32768,"comment":{"summary":[{"kind":"text","text":"The action to be performed, e.g. "},{"kind":"code","text":"`IntentLauncher.ActivityAction.WIRELESS_SETTINGS`"},{"kind":"text","text":".\nThere are a few pre-defined constants you can use for this parameter.\nYou can find them at [expo-intent-launcher/src/IntentLauncher.ts](https://github.com/expo/expo/blob/main/packages/expo-intent-launcher/src/IntentLauncher.ts)."}]},"type":{"type":"intrinsic","name":"string"}},{"name":"params","kind":32768,"comment":{"summary":[{"kind":"text","text":"An object of intent parameters."}]},"type":{"type":"reference","name":"IntentLauncherParams"},"defaultValue":"{}"}],"type":{"type":"reference","typeArguments":[{"type":"reference","name":"IntentLauncherResult"}],"name":"Promise","qualifiedName":"Promise","package":"typescript"}}]}]}
\ No newline at end of file
diff --git a/docs/public/static/data/v49.0.0/expo-keep-awake.json b/docs/public/static/data/v49.0.0/expo-keep-awake.json
new file mode 100644
index 0000000000000..b475020fee53c
--- /dev/null
+++ b/docs/public/static/data/v49.0.0/expo-keep-awake.json
@@ -0,0 +1 @@
+{"name":"expo-keep-awake","kind":1,"children":[{"name":"KeepAwakeEventState","kind":8,"children":[{"name":"RELEASE","kind":16,"type":{"type":"literal","value":"release"}}]},{"name":"KeepAwakeEvent","kind":4194304,"type":{"type":"reflection","declaration":{"name":"__type","kind":65536,"children":[{"name":"state","kind":1024,"comment":{"summary":[{"kind":"text","text":"Keep awake state."}]},"type":{"type":"reference","name":"KeepAwakeEventState"}}]}}},{"name":"KeepAwakeListener","kind":4194304,"type":{"type":"reflection","declaration":{"name":"__type","kind":65536,"signatures":[{"name":"__type","kind":4096,"parameters":[{"name":"event","kind":32768,"type":{"type":"reference","name":"KeepAwakeEvent"}}],"type":{"type":"intrinsic","name":"void"}}]}}},{"name":"KeepAwakeOptions","kind":4194304,"type":{"type":"reflection","declaration":{"name":"__type","kind":65536,"children":[{"name":"listener","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"A callback that is invoked when the keep-awake state changes."}],"blockTags":[{"tag":"@platform","content":[{"kind":"text","text":"web"}]}]},"type":{"type":"reference","name":"KeepAwakeListener"}},{"name":"suppressDeactivateWarnings","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"The call will throw an unhandled promise rejection on Android when the original Activity is dead or deactivated.\nSet the value to "},{"kind":"code","text":"`true`"},{"kind":"text","text":" for suppressing the uncaught exception."}]},"type":{"type":"intrinsic","name":"boolean"}}]}}},{"name":"ExpoKeepAwakeTag","kind":32,"flags":{"isConst":true},"comment":{"summary":[{"kind":"text","text":"Default tag, used when no tag has been specified in keep awake method calls."}]},"type":{"type":"literal","value":"ExpoKeepAwakeDefaultTag"},"defaultValue":"'ExpoKeepAwakeDefaultTag'"},{"name":"activateKeepAwake","kind":64,"signatures":[{"name":"activateKeepAwake","kind":4096,"comment":{"summary":[{"kind":"text","text":"Prevents the screen from sleeping until "},{"kind":"code","text":"`deactivateKeepAwake`"},{"kind":"text","text":" is called with the same "},{"kind":"code","text":"`tag`"},{"kind":"text","text":" value.\n\nIf the "},{"kind":"code","text":"`tag`"},{"kind":"text","text":" argument is specified, the screen will not sleep until you call "},{"kind":"code","text":"`deactivateKeepAwake`"},{"kind":"text","text":"\nwith the same "},{"kind":"code","text":"`tag`"},{"kind":"text","text":" argument. When using multiple "},{"kind":"code","text":"`tags`"},{"kind":"text","text":" for activation you'll have to deactivate\neach one in order to re-enable screen sleep. If tag is unspecified, the default "},{"kind":"code","text":"`tag`"},{"kind":"text","text":" is used.\n\nWeb support [is limited](https://caniuse.com/wake-lock)."}],"blockTags":[{"tag":"@deprecated","content":[{"kind":"text","text":"use "},{"kind":"code","text":"`activateKeepAwakeAsync`"},{"kind":"text","text":" instead."}]}]},"parameters":[{"name":"tag","kind":32768,"comment":{"summary":[{"kind":"text","text":"Tag to lock screen sleep prevention. If not provided, the default tag is used."}]},"type":{"type":"intrinsic","name":"string"},"defaultValue":"ExpoKeepAwakeTag"}],"type":{"type":"reference","typeArguments":[{"type":"intrinsic","name":"void"}],"name":"Promise","qualifiedName":"Promise","package":"typescript"}}]},{"name":"activateKeepAwakeAsync","kind":64,"signatures":[{"name":"activateKeepAwakeAsync","kind":4096,"comment":{"summary":[{"kind":"text","text":"Prevents the screen from sleeping until "},{"kind":"code","text":"`deactivateKeepAwake`"},{"kind":"text","text":" is called with the same "},{"kind":"code","text":"`tag`"},{"kind":"text","text":" value.\n\nIf the "},{"kind":"code","text":"`tag`"},{"kind":"text","text":" argument is specified, the screen will not sleep until you call "},{"kind":"code","text":"`deactivateKeepAwake`"},{"kind":"text","text":"\nwith the same "},{"kind":"code","text":"`tag`"},{"kind":"text","text":" argument. When using multiple "},{"kind":"code","text":"`tags`"},{"kind":"text","text":" for activation you'll have to deactivate\neach one in order to re-enable screen sleep. If tag is unspecified, the default "},{"kind":"code","text":"`tag`"},{"kind":"text","text":" is used.\n\nWeb support [is limited](https://caniuse.com/wake-lock)."}]},"parameters":[{"name":"tag","kind":32768,"comment":{"summary":[{"kind":"text","text":"Tag to lock screen sleep prevention. If not provided, the default tag is used."}]},"type":{"type":"intrinsic","name":"string"},"defaultValue":"ExpoKeepAwakeTag"}],"type":{"type":"reference","typeArguments":[{"type":"intrinsic","name":"void"}],"name":"Promise","qualifiedName":"Promise","package":"typescript"}}]},{"name":"addListener","kind":64,"signatures":[{"name":"addListener","kind":4096,"comment":{"summary":[{"kind":"text","text":"Observe changes to the keep awake timer.\nOn web, this changes when navigating away from the active window/tab. No-op on native."}],"blockTags":[{"tag":"@platform","content":[{"kind":"text","text":"web"}]},{"tag":"@example","content":[{"kind":"code","text":"```ts\nKeepAwake.addListener(({ state }) => {\n // ...\n});\n```"}]}]},"parameters":[{"name":"tagOrListener","kind":32768,"type":{"type":"union","types":[{"type":"intrinsic","name":"string"},{"type":"reference","name":"KeepAwakeListener"}]}},{"name":"listener","kind":32768,"flags":{"isOptional":true},"type":{"type":"reference","name":"KeepAwakeListener"}}],"type":{"type":"reference","name":"Subscription"}}]},{"name":"deactivateKeepAwake","kind":64,"signatures":[{"name":"deactivateKeepAwake","kind":4096,"comment":{"summary":[{"kind":"text","text":"Releases the lock on screen-sleep prevention associated with the given "},{"kind":"code","text":"`tag`"},{"kind":"text","text":" value. If "},{"kind":"code","text":"`tag`"},{"kind":"text","text":"\nis unspecified, it defaults to the same default tag that "},{"kind":"code","text":"`activateKeepAwake`"},{"kind":"text","text":" uses."}]},"parameters":[{"name":"tag","kind":32768,"comment":{"summary":[{"kind":"text","text":"Tag to release the lock on screen sleep prevention. If not provided,\nthe default tag is used."}]},"type":{"type":"intrinsic","name":"string"},"defaultValue":"ExpoKeepAwakeTag"}],"type":{"type":"reference","typeArguments":[{"type":"intrinsic","name":"void"}],"name":"Promise","qualifiedName":"Promise","package":"typescript"}}]},{"name":"isAvailableAsync","kind":64,"signatures":[{"name":"isAvailableAsync","kind":4096,"comment":{"summary":[],"blockTags":[{"tag":"@returns","content":[{"kind":"code","text":"`true`"},{"kind":"text","text":" on all platforms except [unsupported web browsers](https://caniuse.com/wake-lock)."}]}]},"type":{"type":"reference","typeArguments":[{"type":"intrinsic","name":"boolean"}],"name":"Promise","qualifiedName":"Promise","package":"typescript"}}]},{"name":"useKeepAwake","kind":64,"signatures":[{"name":"useKeepAwake","kind":4096,"comment":{"summary":[{"kind":"text","text":"A React hook to keep the screen awake for as long as the owner component is mounted.\nThe optionally provided "},{"kind":"code","text":"`tag`"},{"kind":"text","text":" argument is used when activating and deactivating the keep-awake\nfeature. If unspecified, the default "},{"kind":"code","text":"`tag`"},{"kind":"text","text":" is used. See the documentation for "},{"kind":"code","text":"`activateKeepAwakeAsync`"},{"kind":"text","text":"\nbelow to learn more about the "},{"kind":"code","text":"`tag`"},{"kind":"text","text":" argument."}]},"parameters":[{"name":"tag","kind":32768,"comment":{"summary":[{"kind":"text","text":"Tag to lock screen sleep prevention. If not provided, the default tag is used."}]},"type":{"type":"intrinsic","name":"string"},"defaultValue":"ExpoKeepAwakeTag"},{"name":"options","kind":32768,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"Additional options for the keep awake hook."}]},"type":{"type":"reference","name":"KeepAwakeOptions"}}],"type":{"type":"intrinsic","name":"void"}}]}]}
\ No newline at end of file
diff --git a/docs/public/static/data/v49.0.0/expo-light-sensor.json b/docs/public/static/data/v49.0.0/expo-light-sensor.json
new file mode 100644
index 0000000000000..5b6a033d208b4
--- /dev/null
+++ b/docs/public/static/data/v49.0.0/expo-light-sensor.json
@@ -0,0 +1 @@
+{"name":"expo-light-sensor","kind":1,"children":[{"name":"default","kind":128,"comment":{"summary":[{"kind":"text","text":"A base class for subscribable sensors. The events emitted by this class are measurements\nspecified by the parameter type "},{"kind":"code","text":"`Measurement`"},{"kind":"text","text":"."}]},"children":[{"name":"constructor","kind":512,"signatures":[{"name":"new default","kind":16384,"typeParameter":[{"name":"Measurement","kind":131072}],"parameters":[{"name":"nativeSensorModule","kind":32768,"type":{"type":"intrinsic","name":"any"}},{"name":"nativeEventName","kind":32768,"type":{"type":"intrinsic","name":"string"}}],"type":{"type":"reference","typeArguments":[{"type":"reference","name":"Measurement"}],"name":"default"}}]},{"name":"_listenerCount","kind":1024,"type":{"type":"intrinsic","name":"number"}},{"name":"_nativeEmitter","kind":1024,"type":{"type":"reference","name":"EventEmitter"}},{"name":"_nativeEventName","kind":1024,"type":{"type":"intrinsic","name":"string"}},{"name":"_nativeModule","kind":1024,"type":{"type":"intrinsic","name":"any"}},{"name":"addListener","kind":2048,"signatures":[{"name":"addListener","kind":4096,"parameters":[{"name":"listener","kind":32768,"type":{"type":"reference","typeArguments":[{"type":"reference","name":"Measurement"}],"name":"Listener"}}],"type":{"type":"reference","name":"Subscription"}}]},{"name":"getListenerCount","kind":2048,"signatures":[{"name":"getListenerCount","kind":4096,"comment":{"summary":[{"kind":"text","text":"Returns the registered listeners count."}]},"type":{"type":"intrinsic","name":"number"}}]},{"name":"getPermissionsAsync","kind":2048,"signatures":[{"name":"getPermissionsAsync","kind":4096,"comment":{"summary":[{"kind":"text","text":"Checks user's permissions for accessing sensor."}]},"type":{"type":"reference","typeArguments":[{"type":"reference","name":"PermissionResponse"}],"name":"Promise","qualifiedName":"Promise","package":"typescript"}}]},{"name":"hasListeners","kind":2048,"signatures":[{"name":"hasListeners","kind":4096,"comment":{"summary":[{"kind":"text","text":"Returns boolean which signifies if sensor has any listeners registered."}]},"type":{"type":"intrinsic","name":"boolean"}}]},{"name":"isAvailableAsync","kind":2048,"signatures":[{"name":"isAvailableAsync","kind":4096,"comment":{"summary":[{"kind":"text","text":"> **info** You should always check the sensor availability before attempting to use it."}],"blockTags":[{"tag":"@returns","content":[{"kind":"text","text":"A promise that resolves to a "},{"kind":"code","text":"`boolean`"},{"kind":"text","text":" denoting the availability of the sensor."}]}]},"type":{"type":"reference","typeArguments":[{"type":"intrinsic","name":"boolean"}],"name":"Promise","qualifiedName":"Promise","package":"typescript"}}]},{"name":"removeAllListeners","kind":2048,"signatures":[{"name":"removeAllListeners","kind":4096,"comment":{"summary":[{"kind":"text","text":"Removes all registered listeners."}]},"type":{"type":"intrinsic","name":"void"}}]},{"name":"removeSubscription","kind":2048,"signatures":[{"name":"removeSubscription","kind":4096,"comment":{"summary":[{"kind":"text","text":"Removes the given subscription."}]},"parameters":[{"name":"subscription","kind":32768,"comment":{"summary":[{"kind":"text","text":"A subscription to remove."}]},"type":{"type":"reference","name":"Subscription"}}],"type":{"type":"intrinsic","name":"void"}}]},{"name":"requestPermissionsAsync","kind":2048,"signatures":[{"name":"requestPermissionsAsync","kind":4096,"comment":{"summary":[{"kind":"text","text":"Asks the user to grant permissions for accessing sensor."}]},"type":{"type":"reference","typeArguments":[{"type":"reference","name":"PermissionResponse"}],"name":"Promise","qualifiedName":"Promise","package":"typescript"}}]},{"name":"setUpdateInterval","kind":2048,"signatures":[{"name":"setUpdateInterval","kind":4096,"comment":{"summary":[{"kind":"text","text":"Set the sensor update interval."}]},"parameters":[{"name":"intervalMs","kind":32768,"comment":{"summary":[{"kind":"text","text":"Desired interval in milliseconds between sensor updates.\n> Starting from Android 12 (API level 31), the system has a 200ms limit for each sensor updates.\n>\n> If you need an update interval less than 200ms, you should:\n> * add "},{"kind":"code","text":"`android.permission.HIGH_SAMPLING_RATE_SENSORS`"},{"kind":"text","text":" to [**app.json** "},{"kind":"code","text":"`permissions`"},{"kind":"text","text":" field](/versions/latest/config/app/#permissions)\n> * or if you are using bare workflow, add "},{"kind":"code","text":"``"},{"kind":"text","text":" to **AndroidManifest.xml**."}]},"type":{"type":"intrinsic","name":"number"}}],"type":{"type":"intrinsic","name":"void"}}]}],"typeParameters":[{"name":"Measurement","kind":131072}],"extendedBy":[{"type":"reference","name":"LightSensor"}]},{"name":"default","kind":32,"type":{"type":"reference","name":"LightSensor"}},{"name":"LightSensor","kind":128,"comment":{"summary":[],"blockTags":[{"tag":"@platform","content":[{"kind":"text","text":"android"}]}]},"children":[{"name":"constructor","kind":512,"signatures":[{"name":"new LightSensor","kind":16384,"parameters":[{"name":"nativeSensorModule","kind":32768,"type":{"type":"intrinsic","name":"any"}},{"name":"nativeEventName","kind":32768,"type":{"type":"intrinsic","name":"string"}}],"type":{"type":"reference","name":"LightSensor"},"inheritedFrom":{"type":"reference","name":"default.constructor"}}],"inheritedFrom":{"type":"reference","name":"default.constructor"}},{"name":"_listenerCount","kind":1024,"type":{"type":"intrinsic","name":"number"},"inheritedFrom":{"type":"reference","name":"default._listenerCount"}},{"name":"_nativeEmitter","kind":1024,"type":{"type":"reference","name":"EventEmitter"},"inheritedFrom":{"type":"reference","name":"default._nativeEmitter"}},{"name":"_nativeEventName","kind":1024,"type":{"type":"intrinsic","name":"string"},"inheritedFrom":{"type":"reference","name":"default._nativeEventName"}},{"name":"_nativeModule","kind":1024,"type":{"type":"intrinsic","name":"any"},"inheritedFrom":{"type":"reference","name":"default._nativeModule"}},{"name":"addListener","kind":2048,"signatures":[{"name":"addListener","kind":4096,"comment":{"summary":[{"kind":"text","text":"Subscribe for updates to the light sensor."}],"blockTags":[{"tag":"@returns","content":[{"kind":"text","text":"A subscription that you can call "},{"kind":"code","text":"`remove()`"},{"kind":"text","text":" on when you would like to unsubscribe the listener."}]}]},"parameters":[{"name":"listener","kind":32768,"comment":{"summary":[{"kind":"text","text":"A callback that is invoked when a LightSensor update is available. When invoked,\nthe listener is provided a single argument that is the illuminance value."}]},"type":{"type":"reference","typeArguments":[{"type":"reference","name":"LightSensorMeasurement"}],"name":"Listener"}}],"type":{"type":"reference","name":"Subscription"},"overwrites":{"type":"reference","name":"default.addListener"}}],"overwrites":{"type":"reference","name":"default.addListener"}},{"name":"getListenerCount","kind":2048,"signatures":[{"name":"getListenerCount","kind":4096,"comment":{"summary":[{"kind":"text","text":"Returns the registered listeners count."}]},"type":{"type":"intrinsic","name":"number"},"inheritedFrom":{"type":"reference","name":"default.getListenerCount"}}],"inheritedFrom":{"type":"reference","name":"default.getListenerCount"}},{"name":"getPermissionsAsync","kind":2048,"signatures":[{"name":"getPermissionsAsync","kind":4096,"comment":{"summary":[{"kind":"text","text":"Checks user's permissions for accessing sensor."}]},"type":{"type":"reference","typeArguments":[{"type":"reference","name":"PermissionResponse"}],"name":"Promise","qualifiedName":"Promise","package":"typescript"},"inheritedFrom":{"type":"reference","name":"default.getPermissionsAsync"}}],"inheritedFrom":{"type":"reference","name":"default.getPermissionsAsync"}},{"name":"hasListeners","kind":2048,"signatures":[{"name":"hasListeners","kind":4096,"comment":{"summary":[{"kind":"text","text":"Returns boolean which signifies if sensor has any listeners registered."}]},"type":{"type":"intrinsic","name":"boolean"},"inheritedFrom":{"type":"reference","name":"default.hasListeners"}}],"inheritedFrom":{"type":"reference","name":"default.hasListeners"}},{"name":"isAvailableAsync","kind":2048,"signatures":[{"name":"isAvailableAsync","kind":4096,"comment":{"summary":[{"kind":"text","text":"> **info** You should always check the sensor availability before attempting to use it.\n\nReturns whether the light sensor is available and enabled on the device. Requires at least Android 2.3 (API Level 9)."}],"blockTags":[{"tag":"@returns","content":[{"kind":"text","text":"A promise that resolves to a "},{"kind":"code","text":"`boolean`"},{"kind":"text","text":" denoting the availability of the light sensor."}]}]},"type":{"type":"reference","typeArguments":[{"type":"intrinsic","name":"boolean"}],"name":"Promise","qualifiedName":"Promise","package":"typescript"},"overwrites":{"type":"reference","name":"default.isAvailableAsync"}}],"overwrites":{"type":"reference","name":"default.isAvailableAsync"}},{"name":"removeAllListeners","kind":2048,"signatures":[{"name":"removeAllListeners","kind":4096,"comment":{"summary":[{"kind":"text","text":"Removes all registered listeners."}]},"type":{"type":"intrinsic","name":"void"},"inheritedFrom":{"type":"reference","name":"default.removeAllListeners"}}],"inheritedFrom":{"type":"reference","name":"default.removeAllListeners"}},{"name":"removeSubscription","kind":2048,"signatures":[{"name":"removeSubscription","kind":4096,"comment":{"summary":[{"kind":"text","text":"Removes the given subscription."}]},"parameters":[{"name":"subscription","kind":32768,"comment":{"summary":[{"kind":"text","text":"A subscription to remove."}]},"type":{"type":"reference","name":"Subscription"}}],"type":{"type":"intrinsic","name":"void"},"inheritedFrom":{"type":"reference","name":"default.removeSubscription"}}],"inheritedFrom":{"type":"reference","name":"default.removeSubscription"}},{"name":"requestPermissionsAsync","kind":2048,"signatures":[{"name":"requestPermissionsAsync","kind":4096,"comment":{"summary":[{"kind":"text","text":"Asks the user to grant permissions for accessing sensor."}]},"type":{"type":"reference","typeArguments":[{"type":"reference","name":"PermissionResponse"}],"name":"Promise","qualifiedName":"Promise","package":"typescript"},"inheritedFrom":{"type":"reference","name":"default.requestPermissionsAsync"}}],"inheritedFrom":{"type":"reference","name":"default.requestPermissionsAsync"}},{"name":"setUpdateInterval","kind":2048,"signatures":[{"name":"setUpdateInterval","kind":4096,"comment":{"summary":[{"kind":"text","text":"Set the sensor update interval."}]},"parameters":[{"name":"intervalMs","kind":32768,"comment":{"summary":[{"kind":"text","text":"Desired interval in milliseconds between sensor updates.\n> Starting from Android 12 (API level 31), the system has a 200ms limit for each sensor updates.\n>\n> If you need an update interval less than 200ms, you should:\n> * add "},{"kind":"code","text":"`android.permission.HIGH_SAMPLING_RATE_SENSORS`"},{"kind":"text","text":" to [**app.json** "},{"kind":"code","text":"`permissions`"},{"kind":"text","text":" field](/versions/latest/config/app/#permissions)\n> * or if you are using bare workflow, add "},{"kind":"code","text":"``"},{"kind":"text","text":" to **AndroidManifest.xml**."}]},"type":{"type":"intrinsic","name":"number"}}],"type":{"type":"intrinsic","name":"void"},"inheritedFrom":{"type":"reference","name":"default.setUpdateInterval"}}],"inheritedFrom":{"type":"reference","name":"default.setUpdateInterval"}}],"extendedTypes":[{"type":"reference","typeArguments":[{"type":"reference","name":"LightSensorMeasurement"}],"name":"default"}]},{"name":"LightSensorMeasurement","kind":4194304,"type":{"type":"reflection","declaration":{"name":"__type","kind":65536,"children":[{"name":"illuminance","kind":1024,"comment":{"summary":[{"kind":"text","text":"Ambient light level registered by the device measured in lux (lx)."}]},"type":{"type":"intrinsic","name":"number"}}]}}},{"name":"PermissionExpiration","kind":4194304,"comment":{"summary":[{"kind":"text","text":"Permission expiration time. Currently, all permissions are granted permanently."}]},"type":{"type":"union","types":[{"type":"literal","value":"never"},{"type":"intrinsic","name":"number"}]}},{"name":"PermissionResponse","kind":256,"comment":{"summary":[{"kind":"text","text":"An object obtained by permissions get and request functions."}]},"children":[{"name":"canAskAgain","kind":1024,"comment":{"summary":[{"kind":"text","text":"Indicates if user can be asked again for specific permission.\nIf not, one should be directed to the Settings app\nin order to enable/disable the permission."}]},"type":{"type":"intrinsic","name":"boolean"}},{"name":"expires","kind":1024,"comment":{"summary":[{"kind":"text","text":"Determines time when the permission expires."}]},"type":{"type":"reference","name":"PermissionExpiration"}},{"name":"granted","kind":1024,"comment":{"summary":[{"kind":"text","text":"A convenience boolean that indicates if the permission is granted."}]},"type":{"type":"intrinsic","name":"boolean"}},{"name":"status","kind":1024,"comment":{"summary":[{"kind":"text","text":"Determines the status of the permission."}]},"type":{"type":"reference","name":"PermissionStatus"}}]},{"name":"PermissionStatus","kind":8,"children":[{"name":"DENIED","kind":16,"comment":{"summary":[{"kind":"text","text":"User has denied the permission."}]},"type":{"type":"literal","value":"denied"}},{"name":"GRANTED","kind":16,"comment":{"summary":[{"kind":"text","text":"User has granted the permission."}]},"type":{"type":"literal","value":"granted"}},{"name":"UNDETERMINED","kind":16,"comment":{"summary":[{"kind":"text","text":"User hasn't granted or denied the permission yet."}]},"type":{"type":"literal","value":"undetermined"}}]},{"name":"Subscription","kind":4194304,"type":{"type":"reflection","declaration":{"name":"__type","kind":65536,"children":[{"name":"remove","kind":1024,"type":{"type":"reflection","declaration":{"name":"__type","kind":65536,"signatures":[{"name":"__type","kind":4096,"comment":{"summary":[{"kind":"text","text":"A method to unsubscribe the listener."}]},"type":{"type":"intrinsic","name":"void"}}]}}}]}}}]}
\ No newline at end of file
diff --git a/docs/public/static/data/v49.0.0/expo-linear-gradient.json b/docs/public/static/data/v49.0.0/expo-linear-gradient.json
new file mode 100644
index 0000000000000..babc6c1ec706a
--- /dev/null
+++ b/docs/public/static/data/v49.0.0/expo-linear-gradient.json
@@ -0,0 +1 @@
+{"name":"expo-linear-gradient","kind":1,"children":[{"name":"LinearGradient","kind":128,"comment":{"summary":[{"kind":"text","text":"Renders a native view that transitions between multiple colors in a linear direction."}]},"children":[{"name":"constructor","kind":512,"flags":{"isExternal":true},"signatures":[{"name":"new LinearGradient","kind":16384,"flags":{"isExternal":true},"parameters":[{"name":"props","kind":32768,"flags":{"isExternal":true},"type":{"type":"union","types":[{"type":"reference","name":"LinearGradientProps"},{"type":"reference","typeArguments":[{"type":"reference","name":"LinearGradientProps"}],"name":"Readonly","qualifiedName":"Readonly","package":"typescript"}]}}],"type":{"type":"reference","name":"LinearGradient"},"inheritedFrom":{"type":"reference","name":"React.Component.constructor"}},{"name":"new LinearGradient","kind":16384,"flags":{"isExternal":true},"comment":{"summary":[],"blockTags":[{"tag":"@deprecated","content":[]},{"tag":"@see","content":[{"kind":"text","text":"https://reactjs.org/docs/legacy-context.html"}]}]},"parameters":[{"name":"props","kind":32768,"flags":{"isExternal":true},"type":{"type":"reference","name":"LinearGradientProps"}},{"name":"context","kind":32768,"flags":{"isExternal":true},"type":{"type":"intrinsic","name":"any"}}],"type":{"type":"reference","name":"LinearGradient"},"inheritedFrom":{"type":"reference","name":"React.Component.constructor"}}],"inheritedFrom":{"type":"reference","name":"React.Component.constructor"}},{"name":"render","kind":2048,"signatures":[{"name":"render","kind":4096,"type":{"type":"reference","name":"Element","qualifiedName":"global.JSX.Element","package":"@types/react"},"overwrites":{"type":"reference","name":"React.Component.render"}}],"overwrites":{"type":"reference","name":"React.Component.render"}}],"extendedTypes":[{"type":"reference","typeArguments":[{"type":"reference","name":"LinearGradientProps"}],"name":"Component","qualifiedName":"React.Component","package":"@types/react"}]},{"name":"LinearGradientPoint","kind":4194304,"comment":{"summary":[{"kind":"text","text":"An object "},{"kind":"code","text":"`{ x: number; y: number }`"},{"kind":"text","text":" or array "},{"kind":"code","text":"`[x, y]`"},{"kind":"text","text":" that represents the point\nat which the gradient starts or ends, as a fraction of the overall size of the gradient ranging\nfrom "},{"kind":"code","text":"`0`"},{"kind":"text","text":" to "},{"kind":"code","text":"`1`"},{"kind":"text","text":", inclusive."}]},"type":{"type":"union","types":[{"type":"reflection","declaration":{"name":"__type","kind":65536,"children":[{"name":"x","kind":1024,"comment":{"summary":[{"kind":"text","text":"A number ranging from "},{"kind":"code","text":"`0`"},{"kind":"text","text":" to "},{"kind":"code","text":"`1`"},{"kind":"text","text":", representing the position of gradient transformation."}]},"type":{"type":"intrinsic","name":"number"}},{"name":"y","kind":1024,"comment":{"summary":[{"kind":"text","text":"A number ranging from "},{"kind":"code","text":"`0`"},{"kind":"text","text":" to "},{"kind":"code","text":"`1`"},{"kind":"text","text":", representing the position of gradient transformation."}]},"type":{"type":"intrinsic","name":"number"}}]}},{"type":"reference","name":"NativeLinearGradientPoint"}]}},{"name":"LinearGradientProps","kind":4194304,"type":{"type":"intersection","types":[{"type":"reference","name":"ViewProps","qualifiedName":"ViewProps","package":"react-native"},{"type":"reflection","declaration":{"name":"__type","kind":65536,"children":[{"name":"colors","kind":1024,"comment":{"summary":[{"kind":"text","text":"An array of colors that represent stops in the gradient. At least two colors are required\n(for a single-color background, use the "},{"kind":"code","text":"`style.backgroundColor`"},{"kind":"text","text":" prop on a "},{"kind":"code","text":"`View`"},{"kind":"text","text":" component)."}]},"type":{"type":"array","elementType":{"type":"intrinsic","name":"string"}}},{"name":"end","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"For example, "},{"kind":"code","text":"`{ x: 0.1, y: 0.2 }`"},{"kind":"text","text":" means that the gradient will end "},{"kind":"code","text":"`10%`"},{"kind":"text","text":" from the left and "},{"kind":"code","text":"`20%`"},{"kind":"text","text":" from the bottom.\n\n**On web**, this only changes the angle of the gradient because CSS gradients don't support changing the end position."}],"blockTags":[{"tag":"@default","content":[]}]},"type":{"type":"union","types":[{"type":"reference","name":"LinearGradientPoint"},{"type":"literal","value":null}]}},{"name":"locations","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"An array that contains "},{"kind":"code","text":"`number`"},{"kind":"text","text":"s ranging from "},{"kind":"code","text":"`0`"},{"kind":"text","text":" to "},{"kind":"code","text":"`1`"},{"kind":"text","text":", inclusive, and is the same length as the "},{"kind":"code","text":"`colors`"},{"kind":"text","text":" property.\nEach number indicates a color-stop location where each respective color should be located.\nIf not specified, the colors will be distributed evenly across the gradient.\n\nFor example, "},{"kind":"code","text":"`[0.5, 0.8]`"},{"kind":"text","text":" would render:\n- the first color, solid, from the beginning of the gradient view to 50% through (the middle);\n- a gradient from the first color to the second from the 50% point to the 80% point; and\n- the second color, solid, from the 80% point to the end of the gradient view.\n\n> The color-stop locations must be ascending from least to greatest."}],"blockTags":[{"tag":"@default","content":[{"kind":"text","text":"[]"}]}]},"type":{"type":"union","types":[{"type":"array","elementType":{"type":"intrinsic","name":"number"}},{"type":"literal","value":null}]}},{"name":"start","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"For example, "},{"kind":"code","text":"`{ x: 0.1, y: 0.2 }`"},{"kind":"text","text":" means that the gradient will start "},{"kind":"code","text":"`10%`"},{"kind":"text","text":" from the left and "},{"kind":"code","text":"`20%`"},{"kind":"text","text":" from the top.\n\n**On web**, this only changes the angle of the gradient because CSS gradients don't support changing the starting position."}],"blockTags":[{"tag":"@default","content":[]}]},"type":{"type":"union","types":[{"type":"reference","name":"LinearGradientPoint"},{"type":"literal","value":null}]}}]}}]}}]}
\ No newline at end of file
diff --git a/docs/public/static/data/v49.0.0/expo-linking.json b/docs/public/static/data/v49.0.0/expo-linking.json
new file mode 100644
index 0000000000000..9cb2787684959
--- /dev/null
+++ b/docs/public/static/data/v49.0.0/expo-linking.json
@@ -0,0 +1 @@
+{"name":"expo-linking","kind":1,"children":[{"name":"CreateURLOptions","kind":4194304,"type":{"type":"reflection","declaration":{"name":"__type","kind":65536,"children":[{"name":"isTripleSlashed","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"Should the URI be triple slashed "},{"kind":"code","text":"`scheme:///path`"},{"kind":"text","text":" or double slashed "},{"kind":"code","text":"`scheme://path`"},{"kind":"text","text":"."}]},"type":{"type":"intrinsic","name":"boolean"}},{"name":"queryParams","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"An object of parameters that will be converted into a query string."}]},"type":{"type":"reference","name":"QueryParams"}},{"name":"scheme","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"URI protocol "},{"kind":"code","text":"`://`"},{"kind":"text","text":" that must be built into your native app."}]},"type":{"type":"intrinsic","name":"string"}}]}}},{"name":"EventType","kind":4194304,"type":{"type":"reflection","declaration":{"name":"__type","kind":65536,"children":[{"name":"nativeEvent","kind":1024,"flags":{"isOptional":true},"type":{"type":"reference","name":"MessageEvent","qualifiedName":"MessageEvent","package":"typescript"}},{"name":"url","kind":1024,"type":{"type":"intrinsic","name":"string"}}]}}},{"name":"NativeURLListener","kind":4194304,"type":{"type":"reflection","declaration":{"name":"__type","kind":65536,"signatures":[{"name":"__type","kind":4096,"parameters":[{"name":"nativeEvent","kind":32768,"type":{"type":"reference","name":"MessageEvent","qualifiedName":"MessageEvent","package":"typescript"}}],"type":{"type":"intrinsic","name":"void"}}]}}},{"name":"ParsedURL","kind":4194304,"type":{"type":"reflection","declaration":{"name":"__type","kind":65536,"children":[{"name":"hostname","kind":1024,"type":{"type":"union","types":[{"type":"intrinsic","name":"string"},{"type":"literal","value":null}]}},{"name":"path","kind":1024,"comment":{"summary":[{"kind":"text","text":"The path into the app specified by the URL."}]},"type":{"type":"union","types":[{"type":"intrinsic","name":"string"},{"type":"literal","value":null}]}},{"name":"queryParams","kind":1024,"comment":{"summary":[{"kind":"text","text":"The set of query parameters specified by the query string of the url used to open the app."}]},"type":{"type":"union","types":[{"type":"reference","name":"QueryParams"},{"type":"literal","value":null}]}},{"name":"scheme","kind":1024,"type":{"type":"union","types":[{"type":"intrinsic","name":"string"},{"type":"literal","value":null}]}}]}}},{"name":"QueryParams","kind":4194304,"type":{"type":"reference","name":"ParsedQs","qualifiedName":"QueryString.ParsedQs","package":"@types/qs"}},{"name":"SendIntentExtras","kind":4194304,"type":{"type":"reflection","declaration":{"name":"__type","kind":65536,"children":[{"name":"key","kind":1024,"type":{"type":"intrinsic","name":"string"}},{"name":"value","kind":1024,"type":{"type":"union","types":[{"type":"intrinsic","name":"string"},{"type":"intrinsic","name":"number"},{"type":"intrinsic","name":"boolean"}]}}]}}},{"name":"URLListener","kind":4194304,"type":{"type":"reflection","declaration":{"name":"__type","kind":65536,"signatures":[{"name":"__type","kind":4096,"parameters":[{"name":"event","kind":32768,"type":{"type":"reference","name":"EventType"}}],"type":{"type":"intrinsic","name":"void"}}]}}},{"name":"addEventListener","kind":64,"signatures":[{"name":"addEventListener","kind":4096,"comment":{"summary":[{"kind":"text","text":"Add a handler to "},{"kind":"code","text":"`Linking`"},{"kind":"text","text":" changes by listening to the "},{"kind":"code","text":"`url`"},{"kind":"text","text":" event type and providing the handler.\nIt is recommended to use the ["},{"kind":"code","text":"`useURL()`"},{"kind":"text","text":"](#useurl) hook instead."}],"blockTags":[{"tag":"@returns","content":[{"kind":"text","text":"An EmitterSubscription that has the remove method from EventSubscription"}]},{"tag":"@see","content":[{"kind":"text","text":"[React Native Docs Linking page](https://reactnative.dev/docs/linking#addeventlistener)."}]}]},"parameters":[{"name":"type","kind":32768,"comment":{"summary":[{"kind":"text","text":"The only valid type is "},{"kind":"code","text":"`'url'`"},{"kind":"text","text":"."}]},"type":{"type":"literal","value":"url"}},{"name":"handler","kind":32768,"comment":{"summary":[{"kind":"text","text":"An ["},{"kind":"code","text":"`URLListener`"},{"kind":"text","text":"](#urllistener) function that takes an "},{"kind":"code","text":"`event`"},{"kind":"text","text":" object of the type\n["},{"kind":"code","text":"`EventType`"},{"kind":"text","text":"](#eventype)."}]},"type":{"type":"reference","name":"URLListener"}}],"type":{"type":"reference","name":"EmitterSubscription","qualifiedName":"EmitterSubscription","package":"react-native"}}]},{"name":"canOpenURL","kind":64,"signatures":[{"name":"canOpenURL","kind":4096,"comment":{"summary":[{"kind":"text","text":"Determine whether or not an installed app can handle a given URL.\nOn web this always returns "},{"kind":"code","text":"`true`"},{"kind":"text","text":" because there is no API for detecting what URLs can be opened."}],"blockTags":[{"tag":"@returns","content":[{"kind":"text","text":"A "},{"kind":"code","text":"`Promise`"},{"kind":"text","text":" object that is fulfilled with "},{"kind":"code","text":"`true`"},{"kind":"text","text":" if the URL can be handled, otherwise it\n"},{"kind":"code","text":"`false`"},{"kind":"text","text":" if not.\n\nThe "},{"kind":"code","text":"`Promise`"},{"kind":"text","text":" will reject on Android if it was impossible to check if the URL can be opened, and\non iOS if you didn't [add the specific scheme in the "},{"kind":"code","text":"`LSApplicationQueriesSchemes`"},{"kind":"text","text":" key inside **Info.plist**](/guides/linking#linking-from-your-app)."}]}]},"parameters":[{"name":"url","kind":32768,"comment":{"summary":[{"kind":"text","text":"The URL that you want to test can be opened."}]},"type":{"type":"intrinsic","name":"string"}}],"type":{"type":"reference","typeArguments":[{"type":"intrinsic","name":"boolean"}],"name":"Promise","qualifiedName":"Promise","package":"typescript"}}]},{"name":"collectManifestSchemes","kind":64,"signatures":[{"name":"collectManifestSchemes","kind":4096,"comment":{"summary":[{"kind":"text","text":"Collect a list of platform schemes from the manifest.\n\nThis method is based on the "},{"kind":"code","text":"`Scheme`"},{"kind":"text","text":" modules from "},{"kind":"code","text":"`@expo/config-plugins`"},{"kind":"text","text":"\nwhich are used for collecting the schemes before prebuilding a native app.\n\n- iOS: scheme -> ios.scheme -> ios.bundleIdentifier\n- Android: scheme -> android.scheme -> android.package"}]},"type":{"type":"array","elementType":{"type":"intrinsic","name":"string"}}}]},{"name":"createURL","kind":64,"signatures":[{"name":"createURL","kind":4096,"comment":{"summary":[{"kind":"text","text":"Helper method for constructing a deep link into your app, given an optional path and set of query\nparameters. Creates a URI scheme with two slashes by default.\n\nThe scheme in bare and standalone must be defined in the Expo config ("},{"kind":"code","text":"`app.config.js`"},{"kind":"text","text":" or "},{"kind":"code","text":"`app.json`"},{"kind":"text","text":")\nunder "},{"kind":"code","text":"`expo.scheme`"},{"kind":"text","text":".\n\n# Examples\n- Bare: "},{"kind":"code","text":"`://path`"},{"kind":"text","text":" - uses provided scheme or scheme from Expo config "},{"kind":"code","text":"`scheme`"},{"kind":"text","text":".\n- Standalone, Custom: "},{"kind":"code","text":"`yourscheme://path`"},{"kind":"text","text":"\n- Web (dev): "},{"kind":"code","text":"`https://localhost:19006/path`"},{"kind":"text","text":"\n- Web (prod): "},{"kind":"code","text":"`https://myapp.com/path`"},{"kind":"text","text":"\n- Expo Client (dev): "},{"kind":"code","text":"`exp://128.0.0.1:8081/--/path`"},{"kind":"text","text":"\n- Expo Client (prod): "},{"kind":"code","text":"`exp://exp.host/@yourname/your-app/--/path`"}],"blockTags":[{"tag":"@returns","content":[{"kind":"text","text":"A URL string which points to your app with the given deep link information."}]}]},"parameters":[{"name":"path","kind":32768,"comment":{"summary":[{"kind":"text","text":"Addition path components to append to the base URL."}]},"type":{"type":"intrinsic","name":"string"}},{"name":"namedParameters","kind":32768,"comment":{"summary":[{"kind":"text","text":"Additional options object."}]},"type":{"type":"reference","name":"CreateURLOptions"},"defaultValue":"{}"}],"type":{"type":"intrinsic","name":"string"}}]},{"name":"getInitialURL","kind":64,"signatures":[{"name":"getInitialURL","kind":4096,"comment":{"summary":[{"kind":"text","text":"Get the URL that was used to launch the app if it was launched by a link."}],"blockTags":[{"tag":"@returns","content":[{"kind":"text","text":"The URL string that launched your app, or "},{"kind":"code","text":"`null`"},{"kind":"text","text":"."}]}]},"type":{"type":"reference","typeArguments":[{"type":"union","types":[{"type":"intrinsic","name":"string"},{"type":"literal","value":null}]}],"name":"Promise","qualifiedName":"Promise","package":"typescript"}}]},{"name":"hasConstantsManifest","kind":64,"signatures":[{"name":"hasConstantsManifest","kind":4096,"comment":{"summary":[{"kind":"text","text":"Ensure the user has linked the expo-constants manifest in bare workflow."}]},"type":{"type":"intrinsic","name":"boolean"}}]},{"name":"hasCustomScheme","kind":64,"signatures":[{"name":"hasCustomScheme","kind":4096,"type":{"type":"intrinsic","name":"boolean"}}]},{"name":"makeUrl","kind":64,"signatures":[{"name":"makeUrl","kind":4096,"comment":{"summary":[{"kind":"text","text":"Create a URL that works for the environment the app is currently running in.\nThe scheme in bare and standalone must be defined in the app.json under "},{"kind":"code","text":"`expo.scheme`"},{"kind":"text","text":".\n\n# Examples\n- Bare: empty string\n- Standalone, Custom: "},{"kind":"code","text":"`yourscheme:///path`"},{"kind":"text","text":"\n- Web (dev): "},{"kind":"code","text":"`https://localhost:19006/path`"},{"kind":"text","text":"\n- Web (prod): "},{"kind":"code","text":"`https://myapp.com/path`"},{"kind":"text","text":"\n- Expo Client (dev): "},{"kind":"code","text":"`exp://128.0.0.1:8081/--/path`"},{"kind":"text","text":"\n- Expo Client (prod): "},{"kind":"code","text":"`exp://exp.host/@yourname/your-app/--/path`"}],"blockTags":[{"tag":"@returns","content":[{"kind":"text","text":"A URL string which points to your app with the given deep link information."}]},{"tag":"@deprecated","content":[{"kind":"text","text":"An alias for ["},{"kind":"code","text":"`createURL()`"},{"kind":"text","text":"](#linkingcreateurlpath-namedparameters). This method is\ndeprecated and will be removed in a future SDK version."}]}]},"parameters":[{"name":"path","kind":32768,"comment":{"summary":[{"kind":"text","text":"addition path components to append to the base URL."}]},"type":{"type":"intrinsic","name":"string"},"defaultValue":"''"},{"name":"queryParams","kind":32768,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"An object with a set of query parameters. These will be merged with any\nExpo-specific parameters that are needed (e.g. release channel) and then appended to the URL\nas a query string."}]},"type":{"type":"reference","name":"ParsedQs","qualifiedName":"QueryString.ParsedQs","package":"@types/qs"}},{"name":"scheme","kind":32768,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"Optional URI protocol to use in the URL "},{"kind":"code","text":"`:///`"},{"kind":"text","text":", when "},{"kind":"code","text":"`undefined`"},{"kind":"text","text":" the scheme\nwill be chosen from the Expo config ("},{"kind":"code","text":"`app.config.js`"},{"kind":"text","text":" or "},{"kind":"code","text":"`app.json`"},{"kind":"text","text":")."}]},"type":{"type":"intrinsic","name":"string"}}],"type":{"type":"intrinsic","name":"string"}}]},{"name":"openSettings","kind":64,"signatures":[{"name":"openSettings","kind":4096,"comment":{"summary":[{"kind":"text","text":"Open the operating system settings app and displays the app’s custom settings, if it has any."}]},"type":{"type":"reference","typeArguments":[{"type":"intrinsic","name":"void"}],"name":"Promise","qualifiedName":"Promise","package":"typescript"}}]},{"name":"openURL","kind":64,"signatures":[{"name":"openURL","kind":4096,"comment":{"summary":[{"kind":"text","text":"Attempt to open the given URL with an installed app. See the [Linking guide](/guides/linking)\nfor more information."}],"blockTags":[{"tag":"@returns","content":[{"kind":"text","text":"A "},{"kind":"code","text":"`Promise`"},{"kind":"text","text":" that is fulfilled with "},{"kind":"code","text":"`true`"},{"kind":"text","text":" if the link is opened operating system\nautomatically or the user confirms the prompt to open the link. The "},{"kind":"code","text":"`Promise`"},{"kind":"text","text":" rejects if there\nare no applications registered for the URL or the user cancels the dialog."}]}]},"parameters":[{"name":"url","kind":32768,"comment":{"summary":[{"kind":"text","text":"A URL for the operating system to open, eg: "},{"kind":"code","text":"`tel:5555555`"},{"kind":"text","text":", "},{"kind":"code","text":"`exp://`"},{"kind":"text","text":"."}]},"type":{"type":"intrinsic","name":"string"}}],"type":{"type":"reference","typeArguments":[{"type":"literal","value":true}],"name":"Promise","qualifiedName":"Promise","package":"typescript"}}]},{"name":"parse","kind":64,"signatures":[{"name":"parse","kind":4096,"comment":{"summary":[{"kind":"text","text":"Helper method for parsing out deep link information from a URL."}],"blockTags":[{"tag":"@returns","content":[{"kind":"text","text":"A "},{"kind":"code","text":"`ParsedURL`"},{"kind":"text","text":" object."}]}]},"parameters":[{"name":"url","kind":32768,"comment":{"summary":[{"kind":"text","text":"A URL that points to the currently running experience (e.g. an output of "},{"kind":"code","text":"`Linking.createURL()`"},{"kind":"text","text":")."}]},"type":{"type":"intrinsic","name":"string"}}],"type":{"type":"reference","name":"ParsedURL"}}]},{"name":"parseInitialURLAsync","kind":64,"signatures":[{"name":"parseInitialURLAsync","kind":4096,"comment":{"summary":[{"kind":"text","text":"Helper method which wraps React Native's "},{"kind":"code","text":"`Linking.getInitialURL()`"},{"kind":"text","text":" in "},{"kind":"code","text":"`Linking.parse()`"},{"kind":"text","text":".\nParses the deep link information out of the URL used to open the experience initially.\nIf no link opened the app, all the fields will be "},{"kind":"code","text":"`null`"},{"kind":"text","text":".\n> On the web it parses the current window URL."}],"blockTags":[{"tag":"@returns","content":[{"kind":"text","text":"A promise that resolves with "},{"kind":"code","text":"`ParsedURL`"},{"kind":"text","text":" object."}]}]},"type":{"type":"reference","typeArguments":[{"type":"reference","name":"ParsedURL"}],"name":"Promise","qualifiedName":"Promise","package":"typescript"}}]},{"name":"resolveScheme","kind":64,"signatures":[{"name":"resolveScheme","kind":4096,"parameters":[{"name":"options","kind":32768,"type":{"type":"reflection","declaration":{"name":"__type","kind":65536,"children":[{"name":"isSilent","kind":1024,"flags":{"isOptional":true},"type":{"type":"intrinsic","name":"boolean"}},{"name":"scheme","kind":1024,"flags":{"isOptional":true},"type":{"type":"intrinsic","name":"string"}}]}}}],"type":{"type":"intrinsic","name":"string"}}]},{"name":"sendIntent","kind":64,"signatures":[{"name":"sendIntent","kind":4096,"comment":{"summary":[{"kind":"text","text":"Launch an Android intent with extras.\n> Use [IntentLauncher](./intent-launcher) instead, "},{"kind":"code","text":"`sendIntent`"},{"kind":"text","text":" is only included in\n> "},{"kind":"code","text":"`Linking`"},{"kind":"text","text":" for API compatibility with React Native's Linking API."}],"blockTags":[{"tag":"@platform","content":[{"kind":"text","text":"android"}]}]},"parameters":[{"name":"action","kind":32768,"type":{"type":"intrinsic","name":"string"}},{"name":"extras","kind":32768,"flags":{"isOptional":true},"type":{"type":"array","elementType":{"type":"reference","name":"SendIntentExtras"}}}],"type":{"type":"reference","typeArguments":[{"type":"intrinsic","name":"void"}],"name":"Promise","qualifiedName":"Promise","package":"typescript"}}]},{"name":"useURL","kind":64,"signatures":[{"name":"useURL","kind":4096,"comment":{"summary":[{"kind":"text","text":"Returns the initial URL followed by any subsequent changes to the URL."}],"blockTags":[{"tag":"@returns","content":[{"kind":"text","text":"Returns the initial URL or "},{"kind":"code","text":"`null`"},{"kind":"text","text":"."}]}]},"type":{"type":"union","types":[{"type":"intrinsic","name":"string"},{"type":"literal","value":null}]}}]}]}
\ No newline at end of file
diff --git a/docs/public/static/data/v49.0.0/expo-local-authentication.json b/docs/public/static/data/v49.0.0/expo-local-authentication.json
new file mode 100644
index 0000000000000..5b776d214bf63
--- /dev/null
+++ b/docs/public/static/data/v49.0.0/expo-local-authentication.json
@@ -0,0 +1 @@
+{"name":"expo-local-authentication","kind":1,"children":[{"name":"AuthenticationType","kind":8,"children":[{"name":"FACIAL_RECOGNITION","kind":16,"comment":{"summary":[{"kind":"text","text":"Indicates facial recognition support."}]},"type":{"type":"literal","value":2}},{"name":"FINGERPRINT","kind":16,"comment":{"summary":[{"kind":"text","text":"Indicates fingerprint support."}]},"type":{"type":"literal","value":1}},{"name":"IRIS","kind":16,"comment":{"summary":[{"kind":"text","text":"Indicates iris recognition support."}],"blockTags":[{"tag":"@platform","content":[{"kind":"text","text":"android"}]}]},"type":{"type":"literal","value":3}}]},{"name":"SecurityLevel","kind":8,"children":[{"name":"BIOMETRIC","kind":16,"comment":{"summary":[{"kind":"text","text":"Indicates biometric authentication."}]},"type":{"type":"literal","value":2}},{"name":"NONE","kind":16,"comment":{"summary":[{"kind":"text","text":"Indicates no enrolled authentication."}]},"type":{"type":"literal","value":0}},{"name":"SECRET","kind":16,"comment":{"summary":[{"kind":"text","text":"Indicates non-biometric authentication (e.g. PIN, Pattern)."}]},"type":{"type":"literal","value":1}}]},{"name":"LocalAuthenticationOptions","kind":4194304,"type":{"type":"reflection","declaration":{"name":"__type","kind":65536,"children":[{"name":"cancelLabel","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"Allows to customize the default "},{"kind":"code","text":"`Cancel`"},{"kind":"text","text":" label shown."}]},"type":{"type":"intrinsic","name":"string"}},{"name":"disableDeviceFallback","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"After several failed attempts the system will fallback to the device passcode. This setting\nallows you to disable this option and instead handle the fallback yourself. This can be\npreferable in certain custom authentication workflows. This behaviour maps to using the iOS\n[LAPolicyDeviceOwnerAuthenticationWithBiometrics](https://developer.apple.com/documentation/localauthentication/lapolicy/lapolicydeviceownerauthenticationwithbiometrics?language=objc)\npolicy rather than the [LAPolicyDeviceOwnerAuthentication](https://developer.apple.com/documentation/localauthentication/lapolicy/lapolicydeviceownerauthentication?language=objc)\npolicy. Defaults to "},{"kind":"code","text":"`false`"},{"kind":"text","text":"."}]},"type":{"type":"intrinsic","name":"boolean"}},{"name":"fallbackLabel","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"Allows to customize the default "},{"kind":"code","text":"`Use Passcode`"},{"kind":"text","text":" label shown after several failed\nauthentication attempts. Setting this option to an empty string disables this button from\nshowing in the prompt."}],"blockTags":[{"tag":"@platform","content":[{"kind":"text","text":"ios"}]}]},"type":{"type":"intrinsic","name":"string"}},{"name":"promptMessage","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"A message that is shown alongside the TouchID or FaceID prompt."}]},"type":{"type":"intrinsic","name":"string"}},{"name":"requireConfirmation","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"Sets a hint to the system for whether to require user confirmation after authentication.\nThis may be ignored by the system if the user has disabled implicit authentication in Settings\nor if it does not apply to a particular biometric modality. Defaults to "},{"kind":"code","text":"`true`"},{"kind":"text","text":"."}],"blockTags":[{"tag":"@platform","content":[{"kind":"text","text":"android"}]}]},"type":{"type":"intrinsic","name":"boolean"}}]}}},{"name":"LocalAuthenticationResult","kind":4194304,"type":{"type":"union","types":[{"type":"reflection","declaration":{"name":"__type","kind":65536,"children":[{"name":"success","kind":1024,"type":{"type":"literal","value":true}}]}},{"type":"reflection","declaration":{"name":"__type","kind":65536,"children":[{"name":"error","kind":1024,"type":{"type":"intrinsic","name":"string"}},{"name":"success","kind":1024,"type":{"type":"literal","value":false}},{"name":"warning","kind":1024,"flags":{"isOptional":true},"type":{"type":"intrinsic","name":"string"}}]}}]}},{"name":"authenticateAsync","kind":64,"signatures":[{"name":"authenticateAsync","kind":4096,"comment":{"summary":[{"kind":"text","text":"Attempts to authenticate via Fingerprint/TouchID (or FaceID if available on the device).\n> **Note:** Apple requires apps which use FaceID to provide a description of why they use this API.\nIf you try to use FaceID on an iPhone with FaceID without providing "},{"kind":"code","text":"`infoPlist.NSFaceIDUsageDescription`"},{"kind":"text","text":"\nin "},{"kind":"code","text":"`app.json`"},{"kind":"text","text":", the module will authenticate using device passcode. For more information about\nusage descriptions on iOS, see [permissions guide](/guides/permissions/#ios)."}],"blockTags":[{"tag":"@returns","content":[{"kind":"text","text":"Returns a promise which fulfils with ["},{"kind":"code","text":"`LocalAuthenticationResult`"},{"kind":"text","text":"](#localauthenticationresult)."}]}]},"parameters":[{"name":"options","kind":32768,"type":{"type":"reference","name":"LocalAuthenticationOptions"},"defaultValue":"{}"}],"type":{"type":"reference","typeArguments":[{"type":"reference","name":"LocalAuthenticationResult"}],"name":"Promise","qualifiedName":"Promise","package":"typescript"}}]},{"name":"cancelAuthenticate","kind":64,"signatures":[{"name":"cancelAuthenticate","kind":4096,"comment":{"summary":[{"kind":"text","text":"Cancels authentication flow."}],"blockTags":[{"tag":"@platform","content":[{"kind":"text","text":"android"}]}]},"type":{"type":"reference","typeArguments":[{"type":"intrinsic","name":"void"}],"name":"Promise","qualifiedName":"Promise","package":"typescript"}}]},{"name":"getEnrolledLevelAsync","kind":64,"signatures":[{"name":"getEnrolledLevelAsync","kind":4096,"comment":{"summary":[{"kind":"text","text":"Determine what kind of authentication is enrolled on the device."}],"blockTags":[{"tag":"@returns","content":[{"kind":"text","text":"Returns a promise which fulfils with ["},{"kind":"code","text":"`SecurityLevel`"},{"kind":"text","text":"](#securitylevel).\n> **Note:** On Android devices prior to M, "},{"kind":"code","text":"`SECRET`"},{"kind":"text","text":" can be returned if only the SIM lock has been\nenrolled, which is not the method that ["},{"kind":"code","text":"`authenticateAsync`"},{"kind":"text","text":"](#localauthenticationauthenticateasyncoptions)\nprompts."}]}]},"type":{"type":"reference","typeArguments":[{"type":"reference","name":"SecurityLevel"}],"name":"Promise","qualifiedName":"Promise","package":"typescript"}}]},{"name":"hasHardwareAsync","kind":64,"signatures":[{"name":"hasHardwareAsync","kind":4096,"comment":{"summary":[{"kind":"text","text":"Determine whether a face or fingerprint scanner is available on the device."}],"blockTags":[{"tag":"@returns","content":[{"kind":"text","text":"Returns a promise which fulfils with a "},{"kind":"code","text":"`boolean`"},{"kind":"text","text":" value indicating whether a face or\nfingerprint scanner is available on this device."}]}]},"type":{"type":"reference","typeArguments":[{"type":"intrinsic","name":"boolean"}],"name":"Promise","qualifiedName":"Promise","package":"typescript"}}]},{"name":"isEnrolledAsync","kind":64,"signatures":[{"name":"isEnrolledAsync","kind":4096,"comment":{"summary":[{"kind":"text","text":"Determine whether the device has saved fingerprints or facial data to use for authentication."}],"blockTags":[{"tag":"@returns","content":[{"kind":"text","text":"Returns a promise which fulfils to "},{"kind":"code","text":"`boolean`"},{"kind":"text","text":" value indicating whether the device has\nsaved fingerprints or facial data for authentication."}]}]},"type":{"type":"reference","typeArguments":[{"type":"intrinsic","name":"boolean"}],"name":"Promise","qualifiedName":"Promise","package":"typescript"}}]},{"name":"supportedAuthenticationTypesAsync","kind":64,"signatures":[{"name":"supportedAuthenticationTypesAsync","kind":4096,"comment":{"summary":[{"kind":"text","text":"Determine what kinds of authentications are available on the device."}],"blockTags":[{"tag":"@returns","content":[{"kind":"text","text":"Returns a promise which fulfils to an array containing ["},{"kind":"code","text":"`AuthenticationType`"},{"kind":"text","text":"s](#authenticationtype).\n\nDevices can support multiple authentication methods- i.e. "},{"kind":"code","text":"`[1,2]`"},{"kind":"text","text":" means the device supports both\nfingerprint and facial recognition. If none are supported, this method returns an empty array."}]}]},"type":{"type":"reference","typeArguments":[{"type":"array","elementType":{"type":"reference","name":"AuthenticationType"}}],"name":"Promise","qualifiedName":"Promise","package":"typescript"}}]}]}
\ No newline at end of file
diff --git a/docs/public/static/data/v49.0.0/expo-localization.json b/docs/public/static/data/v49.0.0/expo-localization.json
new file mode 100644
index 0000000000000..5651c378983c7
--- /dev/null
+++ b/docs/public/static/data/v49.0.0/expo-localization.json
@@ -0,0 +1 @@
+{"name":"expo-localization","kind":1,"children":[{"name":"CalendarIdentifier","kind":8,"comment":{"summary":[{"kind":"text","text":"The calendar identifier, one of [Unicode calendar types](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Intl/Locale/calendar).\nGregorian calendar is aliased and can be referred to as both "},{"kind":"code","text":"`CalendarIdentifier.GREGORIAN`"},{"kind":"text","text":" and "},{"kind":"code","text":"`CalendarIdentifier.GREGORY`"},{"kind":"text","text":"."}]},"children":[{"name":"BUDDHIST","kind":16,"comment":{"summary":[{"kind":"text","text":"Thai Buddhist calendar"}]},"type":{"type":"literal","value":"buddhist"}},{"name":"CHINESE","kind":16,"comment":{"summary":[{"kind":"text","text":"Traditional Chinese calendar"}]},"type":{"type":"literal","value":"chinese"}},{"name":"COPTIC","kind":16,"comment":{"summary":[{"kind":"text","text":"Coptic calendar"}]},"type":{"type":"literal","value":"coptic"}},{"name":"DANGI","kind":16,"comment":{"summary":[{"kind":"text","text":"Traditional Korean calendar"}]},"type":{"type":"literal","value":"dangi"}},{"name":"ETHIOAA","kind":16,"comment":{"summary":[{"kind":"text","text":"Ethiopic calendar, Amete Alem (epoch approx. 5493 B.C.E)"}]},"type":{"type":"literal","value":"ethioaa"}},{"name":"ETHIOPIC","kind":16,"comment":{"summary":[{"kind":"text","text":"Ethiopic calendar, Amete Mihret (epoch approx, 8 C.E.)"}]},"type":{"type":"literal","value":"ethiopic"}},{"name":"GREGORIAN","kind":16,"comment":{"summary":[{"kind":"text","text":"Gregorian calendar (alias)"}]},"type":{"type":"literal","value":"gregory"}},{"name":"GREGORY","kind":16,"comment":{"summary":[{"kind":"text","text":"Gregorian calendar"}]},"type":{"type":"literal","value":"gregory"}},{"name":"HEBREW","kind":16,"comment":{"summary":[{"kind":"text","text":"Traditional Hebrew calendar"}]},"type":{"type":"literal","value":"hebrew"}},{"name":"INDIAN","kind":16,"comment":{"summary":[{"kind":"text","text":"Indian calendar"}]},"type":{"type":"literal","value":"indian"}},{"name":"ISLAMIC","kind":16,"comment":{"summary":[{"kind":"text","text":"Islamic calendar"}]},"type":{"type":"literal","value":"islamic"}},{"name":"ISLAMIC_CIVIL","kind":16,"comment":{"summary":[{"kind":"text","text":"Islamic calendar, tabular (intercalary years [2,5,7,10,13,16,18,21,24,26,29] - civil epoch)"}]},"type":{"type":"literal","value":"islamic-civil"}},{"name":"ISLAMIC_RGSA","kind":16,"comment":{"summary":[{"kind":"text","text":"Islamic calendar, Saudi Arabia sighting"}]},"type":{"type":"literal","value":"islamic-rgsa"}},{"name":"ISLAMIC_TBLA","kind":16,"comment":{"summary":[{"kind":"text","text":"Islamic calendar, tabular (intercalary years [2,5,7,10,13,16,18,21,24,26,29] - astronomical epoch)"}]},"type":{"type":"literal","value":"islamic-tbla"}},{"name":"ISLAMIC_UMALQURA","kind":16,"comment":{"summary":[{"kind":"text","text":"Islamic calendar, Umm al-Qura"}]},"type":{"type":"literal","value":"islamic-umalqura"}},{"name":"ISO8601","kind":16,"comment":{"summary":[{"kind":"text","text":"ISO calendar (Gregorian calendar using the ISO 8601 calendar week rules)"}]},"type":{"type":"literal","value":"iso8601"}},{"name":"JAPANESE","kind":16,"comment":{"summary":[{"kind":"text","text":"Japanese imperial calendar"}]},"type":{"type":"literal","value":"japanese"}},{"name":"PERSIAN","kind":16,"comment":{"summary":[{"kind":"text","text":"Persian calendar"}]},"type":{"type":"literal","value":"persian"}},{"name":"ROC","kind":16,"comment":{"summary":[{"kind":"text","text":"Civil (algorithmic) Arabic calendar"}]},"type":{"type":"literal","value":"roc"}}]},{"name":"Weekday","kind":8,"comment":{"summary":[{"kind":"text","text":"An enum mapping days of the week in Gregorian calendar to their index as returned by the "},{"kind":"code","text":"`firstWeekday`"},{"kind":"text","text":" property."}]},"children":[{"name":"FRIDAY","kind":16,"type":{"type":"literal","value":6}},{"name":"MONDAY","kind":16,"type":{"type":"literal","value":2}},{"name":"SATURDAY","kind":16,"type":{"type":"literal","value":7}},{"name":"SUNDAY","kind":16,"type":{"type":"literal","value":1}},{"name":"THURSDAY","kind":16,"type":{"type":"literal","value":5}},{"name":"TUESDAY","kind":16,"type":{"type":"literal","value":3}},{"name":"WEDNESDAY","kind":16,"type":{"type":"literal","value":4}}]},{"name":"Calendar","kind":4194304,"type":{"type":"reflection","declaration":{"name":"__type","kind":65536,"children":[{"name":"calendar","kind":1024,"comment":{"summary":[{"kind":"text","text":"The calendar identifier, one of [Unicode calendar types](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Intl/Locale/calendar).\n\nOn Android is limited to one of device's [available calendar types](https://developer.android.com/reference/java/util/Calendar#getAvailableCalendarTypes()).\n\nOn iOS uses [calendar identifiers](https://developer.apple.com/documentation/foundation/calendar/identifier), but maps them to the corresponding Unicode types, will also never contain "},{"kind":"code","text":"`'dangi'`"},{"kind":"text","text":" or "},{"kind":"code","text":"`'islamic-rgsa'`"},{"kind":"text","text":" due to it not being implemented on iOS."}]},"type":{"type":"union","types":[{"type":"reference","name":"CalendarIdentifier"},{"type":"literal","value":null}]}},{"name":"firstWeekday","kind":1024,"comment":{"summary":[{"kind":"text","text":"The first day of the week. For most calendars Sunday is numbered "},{"kind":"code","text":"`1`"},{"kind":"text","text":", with Saturday being number "},{"kind":"code","text":"`7`"},{"kind":"text","text":".\nCan be null on some browsers that don't support the [weekInfo](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Intl/Locale/weekInfo) property in [Intl](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Intl) API."}],"blockTags":[{"tag":"@example","content":[{"kind":"code","text":"`1`"},{"kind":"text","text":", "},{"kind":"code","text":"`7`"},{"kind":"text","text":"."}]}]},"type":{"type":"union","types":[{"type":"reference","name":"Weekday"},{"type":"literal","value":null}]}},{"name":"timeZone","kind":1024,"comment":{"summary":[{"kind":"text","text":"Time zone for the calendar. Can be "},{"kind":"code","text":"`null`"},{"kind":"text","text":" on Web."}],"blockTags":[{"tag":"@example","content":[{"kind":"code","text":"`'America/Los_Angeles'`"},{"kind":"text","text":", "},{"kind":"code","text":"`'Europe/Warsaw'`"},{"kind":"text","text":", "},{"kind":"code","text":"`'GMT+1'`"},{"kind":"text","text":"."}]}]},"type":{"type":"union","types":[{"type":"intrinsic","name":"string"},{"type":"literal","value":null}]}},{"name":"uses24hourClock","kind":1024,"comment":{"summary":[{"kind":"text","text":"True when current device settings use 24 hour time format.\nCan be null on some browsers that don't support the [hourCycle](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Intl/Locale/hourCycle) property in [Intl](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Intl) API."}]},"type":{"type":"union","types":[{"type":"intrinsic","name":"boolean"},{"type":"literal","value":null}]}}]}}},{"name":"Locale","kind":4194304,"type":{"type":"reflection","declaration":{"name":"__type","kind":65536,"children":[{"name":"currencyCode","kind":1024,"comment":{"summary":[{"kind":"text","text":"Currency code for the locale.\nIs "},{"kind":"code","text":"`null`"},{"kind":"text","text":" on Web, use a table lookup based on region instead."}],"blockTags":[{"tag":"@example","content":[{"kind":"code","text":"`'USD'`"},{"kind":"text","text":", "},{"kind":"code","text":"`'EUR'`"},{"kind":"text","text":", "},{"kind":"code","text":"`'PLN'`"},{"kind":"text","text":"."}]}]},"type":{"type":"union","types":[{"type":"intrinsic","name":"string"},{"type":"literal","value":null}]}},{"name":"currencySymbol","kind":1024,"comment":{"summary":[{"kind":"text","text":"Currency symbol for the locale.\nIs "},{"kind":"code","text":"`null`"},{"kind":"text","text":" on Web, use a table lookup based on region (if available) instead."}],"blockTags":[{"tag":"@example","content":[{"kind":"code","text":"`'$'`"},{"kind":"text","text":", "},{"kind":"code","text":"`'€'`"},{"kind":"text","text":", "},{"kind":"code","text":"`'zł'`"},{"kind":"text","text":"."}]}]},"type":{"type":"union","types":[{"type":"intrinsic","name":"string"},{"type":"literal","value":null}]}},{"name":"decimalSeparator","kind":1024,"comment":{"summary":[{"kind":"text","text":"Decimal separator used for formatting numbers with fractional parts."}],"blockTags":[{"tag":"@example","content":[{"kind":"code","text":"`'.'`"},{"kind":"text","text":", "},{"kind":"code","text":"`','`"},{"kind":"text","text":"."}]}]},"type":{"type":"union","types":[{"type":"intrinsic","name":"string"},{"type":"literal","value":null}]}},{"name":"digitGroupingSeparator","kind":1024,"comment":{"summary":[{"kind":"text","text":"Digit grouping separator used for formatting large numbers."}],"blockTags":[{"tag":"@example","content":[{"kind":"code","text":"`'.'`"},{"kind":"text","text":", "},{"kind":"code","text":"`','`"},{"kind":"text","text":"."}]}]},"type":{"type":"union","types":[{"type":"intrinsic","name":"string"},{"type":"literal","value":null}]}},{"name":"languageCode","kind":1024,"comment":{"summary":[{"kind":"text","text":"An [IETF BCP 47 language tag](https://en.wikipedia.org/wiki/IETF_language_tag) without the region code."}],"blockTags":[{"tag":"@example","content":[{"kind":"code","text":"`'en'`"},{"kind":"text","text":", "},{"kind":"code","text":"`'es'`"},{"kind":"text","text":", "},{"kind":"code","text":"`'pl'`"},{"kind":"text","text":"."}]}]},"type":{"type":"intrinsic","name":"string"}},{"name":"languageTag","kind":1024,"comment":{"summary":[{"kind":"text","text":"An [IETF BCP 47 language tag](https://en.wikipedia.org/wiki/IETF_language_tag) with a region code."}],"blockTags":[{"tag":"@example","content":[{"kind":"code","text":"`'en-US'`"},{"kind":"text","text":", "},{"kind":"code","text":"`'es-419'`"},{"kind":"text","text":", "},{"kind":"code","text":"`'pl-PL'`"},{"kind":"text","text":"."}]}]},"type":{"type":"intrinsic","name":"string"}},{"name":"measurementSystem","kind":1024,"comment":{"summary":[{"kind":"text","text":"The measurement system used in the locale.\nIs "},{"kind":"code","text":"`null`"},{"kind":"text","text":" on Web, as user chosen measurement system is not exposed on the web and using locale to determine measurement systems is unreliable.\nAsk for user preferences if possible."}]},"type":{"type":"union","types":[{"type":"literal","value":"metric"},{"type":"literal","value":"us"},{"type":"literal","value":"uk"},{"type":"literal","value":null}]}},{"name":"regionCode","kind":1024,"comment":{"summary":[{"kind":"text","text":"The region code for your device that comes from the Region setting under Language & Region on iOS, Region settings on Android and is parsed from locale on Web (can be "},{"kind":"code","text":"`null`"},{"kind":"text","text":" on Web)."}]},"type":{"type":"union","types":[{"type":"intrinsic","name":"string"},{"type":"literal","value":null}]}},{"name":"textDirection","kind":1024,"comment":{"summary":[{"kind":"text","text":"Text direction for the locale. One of: "},{"kind":"code","text":"`'ltr'`"},{"kind":"text","text":", "},{"kind":"code","text":"`'rtl'`"},{"kind":"text","text":", but can also be "},{"kind":"code","text":"`null`"},{"kind":"text","text":" on some browsers without support for the [textInfo](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Intl/Locale/textInfo) property in [Intl](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Intl) API."}]},"type":{"type":"union","types":[{"type":"literal","value":"ltr"},{"type":"literal","value":"rtl"},{"type":"literal","value":null}]}}]}}},{"name":"Localization","kind":4194304,"type":{"type":"reflection","declaration":{"name":"__type","kind":65536,"children":[{"name":"currency","kind":1024,"comment":{"summary":[{"kind":"text","text":"Three-character ISO 4217 currency code. Returns "},{"kind":"code","text":"`null`"},{"kind":"text","text":" on web."}],"blockTags":[{"tag":"@example","content":[{"kind":"code","text":"`'USD'`"},{"kind":"text","text":", "},{"kind":"code","text":"`'EUR'`"},{"kind":"text","text":", "},{"kind":"code","text":"`'CNY'`"},{"kind":"text","text":", "},{"kind":"code","text":"`null`"}]}]},"type":{"type":"union","types":[{"type":"intrinsic","name":"string"},{"type":"literal","value":null}]}},{"name":"decimalSeparator","kind":1024,"comment":{"summary":[{"kind":"text","text":"Decimal separator used for formatting numbers."}],"blockTags":[{"tag":"@example","content":[{"kind":"code","text":"`','`"},{"kind":"text","text":", "},{"kind":"code","text":"`'.'`"}]}]},"type":{"type":"intrinsic","name":"string"}},{"name":"digitGroupingSeparator","kind":1024,"comment":{"summary":[{"kind":"text","text":"Digit grouping separator used when formatting numbers larger than 1000."}],"blockTags":[{"tag":"@example","content":[{"kind":"code","text":"`'.'`"},{"kind":"text","text":", "},{"kind":"code","text":"`''`"},{"kind":"text","text":", "},{"kind":"code","text":"`','`"}]}]},"type":{"type":"intrinsic","name":"string"}},{"name":"isMetric","kind":1024,"comment":{"summary":[{"kind":"text","text":"Boolean value that indicates whether the system uses the metric system.\nOn Android and web, this is inferred from the current region."}]},"type":{"type":"intrinsic","name":"boolean"}},{"name":"isRTL","kind":1024,"comment":{"summary":[{"kind":"text","text":"Returns if the system's language is written from Right-to-Left.\nThis can be used to build features like [bidirectional icons](https://material.io/design/usability/bidirectionality.html).\n\nReturns "},{"kind":"code","text":"`false`"},{"kind":"text","text":" in Server Side Rendering (SSR) environments."}]},"type":{"type":"intrinsic","name":"boolean"}},{"name":"isoCurrencyCodes","kind":1024,"comment":{"summary":[{"kind":"text","text":"A list of all the supported language ISO codes."}]},"type":{"type":"array","elementType":{"type":"intrinsic","name":"string"}}},{"name":"locale","kind":1024,"comment":{"summary":[{"kind":"text","text":"An [IETF BCP 47 language tag](https://en.wikipedia.org/wiki/IETF_language_tag),\nconsisting of a two-character language code and optional script, region and variant codes."}],"blockTags":[{"tag":"@example","content":[{"kind":"code","text":"`'en'`"},{"kind":"text","text":", "},{"kind":"code","text":"`'en-US'`"},{"kind":"text","text":", "},{"kind":"code","text":"`'zh-Hans'`"},{"kind":"text","text":", "},{"kind":"code","text":"`'zh-Hans-CN'`"},{"kind":"text","text":", "},{"kind":"code","text":"`'en-emodeng'`"}]}]},"type":{"type":"intrinsic","name":"string"}},{"name":"locales","kind":1024,"comment":{"summary":[{"kind":"text","text":"List of all the native languages provided by the user settings.\nThese are returned in the order that the user defined in the device settings."}],"blockTags":[{"tag":"@example","content":[{"kind":"code","text":"`['en', 'en-US', 'zh-Hans', 'zh-Hans-CN', 'en-emodeng']`"}]}]},"type":{"type":"array","elementType":{"type":"intrinsic","name":"string"}}},{"name":"region","kind":1024,"comment":{"summary":[{"kind":"text","text":"The region code for your device that comes from the Region setting under Language & Region on iOS.\nThis value is always available on iOS, but might return "},{"kind":"code","text":"`null`"},{"kind":"text","text":" on Android or web."}],"blockTags":[{"tag":"@example","content":[{"kind":"code","text":"`'US'`"},{"kind":"text","text":", "},{"kind":"code","text":"`'NZ'`"},{"kind":"text","text":", "},{"kind":"code","text":"`null`"}]}]},"type":{"type":"union","types":[{"type":"intrinsic","name":"string"},{"type":"literal","value":null}]}},{"name":"timezone","kind":1024,"comment":{"summary":[{"kind":"text","text":"The current time zone in display format.\nOn Web time zone is calculated with Intl.DateTimeFormat().resolvedOptions().timeZone. For a\nbetter estimation you could use the moment-timezone package but it will add significant bloat to\nyour website's bundle size."}],"blockTags":[{"tag":"@example","content":[{"kind":"code","text":"`'America/Los_Angeles'`"}]}]},"type":{"type":"intrinsic","name":"string"}}]}}},{"name":"currency","kind":32,"flags":{"isConst":true},"comment":{"summary":[],"blockTags":[{"tag":"@deprecated","content":[{"kind":"text","text":"Use Localization.getLocales() instead.\nThree-character ISO 4217 currency code. Returns "},{"kind":"code","text":"`null`"},{"kind":"text","text":" on web."}]},{"tag":"@example","content":[{"kind":"code","text":"`'USD'`"},{"kind":"text","text":", "},{"kind":"code","text":"`'EUR'`"},{"kind":"text","text":", "},{"kind":"code","text":"`'CNY'`"},{"kind":"text","text":", "},{"kind":"code","text":"`null`"}]}]},"type":{"type":"union","types":[{"type":"literal","value":null},{"type":"intrinsic","name":"string"}]},"defaultValue":"ExpoLocalization.currency"},{"name":"decimalSeparator","kind":32,"flags":{"isConst":true},"comment":{"summary":[],"blockTags":[{"tag":"@deprecated","content":[{"kind":"text","text":"Use Localization.getLocales() instead.\nDecimal separator used for formatting numbers."}]},{"tag":"@example","content":[{"kind":"code","text":"`','`"},{"kind":"text","text":", "},{"kind":"code","text":"`'.'`"}]}]},"type":{"type":"intrinsic","name":"string"},"defaultValue":"ExpoLocalization.decimalSeparator"},{"name":"digitGroupingSeparator","kind":32,"flags":{"isConst":true},"comment":{"summary":[],"blockTags":[{"tag":"@deprecated","content":[{"kind":"text","text":"Use Localization.getLocales() instead.\nDigit grouping separator used when formatting numbers larger than 1000."}]},{"tag":"@example","content":[{"kind":"code","text":"`'.'`"},{"kind":"text","text":", "},{"kind":"code","text":"`''`"},{"kind":"text","text":", "},{"kind":"code","text":"`','`"}]}]},"type":{"type":"intrinsic","name":"string"},"defaultValue":"ExpoLocalization.digitGroupingSeparator"},{"name":"isMetric","kind":32,"flags":{"isConst":true},"comment":{"summary":[],"blockTags":[{"tag":"@deprecated","content":[{"kind":"text","text":"Use Localization.getLocales() instead.\nBoolean value that indicates whether the system uses the metric system.\nOn Android and web, this is inferred from the current region."}]}]},"type":{"type":"intrinsic","name":"boolean"},"defaultValue":"ExpoLocalization.isMetric"},{"name":"isRTL","kind":32,"flags":{"isConst":true},"comment":{"summary":[],"blockTags":[{"tag":"@deprecated","content":[{"kind":"text","text":"Use Localization.getLocales() instead.\nReturns if the system's language is written from Right-to-Left.\nThis can be used to build features like [bidirectional icons](https://material.io/design/usability/bidirectionality.html).\n\nReturns "},{"kind":"code","text":"`false`"},{"kind":"text","text":" in Server Side Rendering (SSR) environments."}]}]},"type":{"type":"intrinsic","name":"boolean"},"defaultValue":"ExpoLocalization.isRTL"},{"name":"isoCurrencyCodes","kind":32,"flags":{"isConst":true},"comment":{"summary":[],"blockTags":[{"tag":"@deprecated","content":[{"kind":"text","text":"Use Localization.getLocales() instead.\nA list of all the supported language ISO codes."}]}]},"type":{"type":"array","elementType":{"type":"intrinsic","name":"string"}},"defaultValue":"ExpoLocalization.isoCurrencyCodes"},{"name":"locale","kind":32,"flags":{"isConst":true},"comment":{"summary":[{"kind":"text","text":"Consider using Localization.getLocales() for a list of user preferred locales instead.\nAn [IETF BCP 47 language tag](https://en.wikipedia.org/wiki/IETF_language_tag),\nconsisting of a two-character language code and optional script, region and variant codes."}],"blockTags":[{"tag":"@example","content":[{"kind":"code","text":"`'en'`"},{"kind":"text","text":", "},{"kind":"code","text":"`'en-US'`"},{"kind":"text","text":", "},{"kind":"code","text":"`'zh-Hans'`"},{"kind":"text","text":", "},{"kind":"code","text":"`'zh-Hans-CN'`"},{"kind":"text","text":", "},{"kind":"code","text":"`'en-emodeng'`"}]}]},"type":{"type":"intrinsic","name":"string"},"defaultValue":"ExpoLocalization.locale"},{"name":"locales","kind":32,"flags":{"isConst":true},"comment":{"summary":[],"blockTags":[{"tag":"@deprecated","content":[{"kind":"text","text":"Use Localization.getLocales() instead.\nList of all the native languages provided by the user settings.\nThese are returned in the order the user defines in their device settings."}]},{"tag":"@example","content":[{"kind":"code","text":"`['en', 'en-US', 'zh-Hans', 'zh-Hans-CN', 'en-emodeng']`"}]}]},"type":{"type":"array","elementType":{"type":"intrinsic","name":"string"}},"defaultValue":"ExpoLocalization.locales"},{"name":"region","kind":32,"flags":{"isConst":true},"comment":{"summary":[],"blockTags":[{"tag":"@deprecated","content":[{"kind":"text","text":"Use Localization.getLocales() instead.\nThe region code for your device that comes from the Region setting under Language & Region on iOS.\nThis value is always available on iOS, but might return "},{"kind":"code","text":"`null`"},{"kind":"text","text":" on Android or web."}]},{"tag":"@example","content":[{"kind":"code","text":"`'US'`"},{"kind":"text","text":", "},{"kind":"code","text":"`'NZ'`"},{"kind":"text","text":", "},{"kind":"code","text":"`null`"}]}]},"type":{"type":"union","types":[{"type":"literal","value":null},{"type":"intrinsic","name":"string"}]},"defaultValue":"ExpoLocalization.region"},{"name":"timezone","kind":32,"flags":{"isConst":true},"comment":{"summary":[],"blockTags":[{"tag":"@deprecated","content":[{"kind":"text","text":"Use Localization.getLocales() instead.\nThe current time zone in display format.\nOn Web time zone is calculated with Intl.DateTimeFormat().resolvedOptions().timeZone. For a\nbetter estimation you could use the moment-timezone package but it will add significant bloat to\nyour website's bundle size."}]},{"tag":"@example","content":[{"kind":"code","text":"`'America/Los_Angeles'`"}]}]},"type":{"type":"intrinsic","name":"string"},"defaultValue":"ExpoLocalization.timezone"},{"name":"getCalendars","kind":64,"signatures":[{"name":"getCalendars","kind":4096,"comment":{"summary":[{"kind":"text","text":"List of user's preferred calendars, returned as an array of objects of type "},{"kind":"code","text":"`Calendar`"},{"kind":"text","text":".\nGuaranteed to contain at least 1 element.\nFor now always returns a single element, but it's likely to return a user preference list on some platforms in the future."}],"blockTags":[{"tag":"@example","content":[{"kind":"code","text":"`[\n {\n \"calendar\": \"gregory\",\n \"timeZone\": \"Europe/Warsaw\",\n \"uses24hourClock\": true,\n \"firstWeekday\": 1\n }\n ]`"}]}]},"type":{"type":"array","elementType":{"type":"reference","name":"Calendar"}}}]},{"name":"getLocales","kind":64,"signatures":[{"name":"getLocales","kind":4096,"comment":{"summary":[{"kind":"text","text":"List of user's locales, returned as an array of objects of type "},{"kind":"code","text":"`Locale`"},{"kind":"text","text":".\nGuaranteed to contain at least 1 element.\nThese are returned in the order the user defines in their device settings.\nOn the web currency and measurements systems are not provided, instead returned as null.\nIf needed, you can infer them from the current region using a lookup table."}],"blockTags":[{"tag":"@example","content":[{"kind":"code","text":"`[{\n \"languageTag\": \"pl-PL\",\n \"languageCode\": \"pl\",\n \"textDirection\": \"ltr\",\n \"digitGroupingSeparator\": \" \",\n \"decimalSeparator\": \",\",\n \"measurementSystem\": \"metric\",\n \"currencyCode\": \"PLN\",\n \"currencySymbol\": \"zł\",\n \"regionCode\": \"PL\"\n }]`"}]}]},"type":{"type":"array","elementType":{"type":"reference","name":"Locale"}}}]},{"name":"getLocalizationAsync","kind":64,"signatures":[{"name":"getLocalizationAsync","kind":4096,"comment":{"summary":[{"kind":"text","text":"Get the latest native values from the device. Locale can be changed on some Android devices\nwithout resetting the app.\n> On iOS, changing the locale will cause the device to reset meaning the constants will always be\ncorrect."}],"blockTags":[{"tag":"@example","content":[{"kind":"code","text":"```ts\n// When the app returns from the background on Android...\n\nconst { locale } = await Localization.getLocalizationAsync();\n```"}]},{"tag":"@deprecated","content":[{"kind":"text","text":"Use Localization.getLocales() or Localization.getCalendars() instead."}]}]},"type":{"type":"reference","typeArguments":[{"type":"reference","name":"Localization"}],"name":"Promise","qualifiedName":"Promise","package":"typescript"}}]},{"name":"useCalendars","kind":64,"signatures":[{"name":"useCalendars","kind":4096,"comment":{"summary":[{"kind":"text","text":"A hook providing a list of user's preferred calendars, returned as an array of objects of type "},{"kind":"code","text":"`Calendar`"},{"kind":"text","text":".\nGuaranteed to contain at least 1 element.\nFor now always returns a single element, but it's likely to return a user preference list on some platforms in the future.\nIf the OS settings change, the hook will rerender with a new list of calendars."}],"blockTags":[{"tag":"@example","content":[{"kind":"code","text":"`[\n {\n \"calendar\": \"gregory\",\n \"timeZone\": \"Europe/Warsaw\",\n \"uses24hourClock\": true,\n \"firstWeekday\": 1\n }\n ]`"}]}]},"type":{"type":"array","elementType":{"type":"reference","name":"Calendar"}}}]},{"name":"useLocales","kind":64,"signatures":[{"name":"useLocales","kind":4096,"comment":{"summary":[{"kind":"text","text":"A hook providing a list of user's locales, returned as an array of objects of type "},{"kind":"code","text":"`Locale`"},{"kind":"text","text":".\nGuaranteed to contain at least 1 element.\nThese are returned in the order the user defines in their device settings.\nOn the web currency and measurements systems are not provided, instead returned as null.\nIf needed, you can infer them from the current region using a lookup table.\nIf the OS settings change, the hook will rerender with a new list of locales."}],"blockTags":[{"tag":"@example","content":[{"kind":"code","text":"`[{\n \"languageTag\": \"pl-PL\",\n \"languageCode\": \"pl\",\n \"textDirection\": \"ltr\",\n \"digitGroupingSeparator\": \" \",\n \"decimalSeparator\": \",\",\n \"measurementSystem\": \"metric\",\n \"currencyCode\": \"PLN\",\n \"currencySymbol\": \"zł\",\n \"regionCode\": \"PL\"\n }]`"}]}]},"type":{"type":"array","elementType":{"type":"reference","name":"Locale"}}}]}]}
\ No newline at end of file
diff --git a/docs/public/static/data/v49.0.0/expo-location.json b/docs/public/static/data/v49.0.0/expo-location.json
new file mode 100644
index 0000000000000..4947b592d35cc
--- /dev/null
+++ b/docs/public/static/data/v49.0.0/expo-location.json
@@ -0,0 +1 @@
+{"name":"expo-location","kind":1,"children":[{"name":"LocationAccuracy","kind":8388608},{"name":"LocationActivityType","kind":8388608},{"name":"LocationGeofencingEventType","kind":8388608},{"name":"LocationGeofencingRegionState","kind":8388608},{"name":"Accuracy","kind":8,"comment":{"summary":[{"kind":"text","text":"Enum with available location accuracies."}]},"children":[{"name":"Balanced","kind":16,"comment":{"summary":[{"kind":"text","text":"Accurate to within one hundred meters."}]},"type":{"type":"literal","value":3}},{"name":"BestForNavigation","kind":16,"comment":{"summary":[{"kind":"text","text":"The highest possible accuracy that uses additional sensor data to facilitate navigation apps."}]},"type":{"type":"literal","value":6}},{"name":"High","kind":16,"comment":{"summary":[{"kind":"text","text":"Accurate to within ten meters of the desired target."}]},"type":{"type":"literal","value":4}},{"name":"Highest","kind":16,"comment":{"summary":[{"kind":"text","text":"The best level of accuracy available."}]},"type":{"type":"literal","value":5}},{"name":"Low","kind":16,"comment":{"summary":[{"kind":"text","text":"Accurate to the nearest kilometer."}]},"type":{"type":"literal","value":2}},{"name":"Lowest","kind":16,"comment":{"summary":[{"kind":"text","text":"Accurate to the nearest three kilometers."}]},"type":{"type":"literal","value":1}}]},{"name":"ActivityType","kind":8,"comment":{"summary":[{"kind":"text","text":"Enum with available activity types of background location tracking."}]},"children":[{"name":"Airborne","kind":16,"comment":{"summary":[{"kind":"text","text":"Intended for airborne activities. Fall backs to "},{"kind":"code","text":"`ActivityType.Other`"},{"kind":"text","text":" if\nunsupported."}],"blockTags":[{"tag":"@platform","content":[{"kind":"text","text":"ios 12+"}]}]},"type":{"type":"literal","value":5}},{"name":"AutomotiveNavigation","kind":16,"comment":{"summary":[{"kind":"text","text":"Location updates are being used specifically during vehicular navigation to track location\nchanges to the automobile."}]},"type":{"type":"literal","value":2}},{"name":"Fitness","kind":16,"comment":{"summary":[{"kind":"text","text":"Use this activity type if you track fitness activities such as walking, running, cycling,\nand so on."}]},"type":{"type":"literal","value":3}},{"name":"Other","kind":16,"comment":{"summary":[{"kind":"text","text":"Default activity type. Use it if there is no other type that matches the activity you track."}]},"type":{"type":"literal","value":1}},{"name":"OtherNavigation","kind":16,"comment":{"summary":[{"kind":"text","text":"Activity type for movements for other types of vehicular navigation that are not automobile\nrelated."}]},"type":{"type":"literal","value":4}}]},{"name":"GeofencingEventType","kind":8,"comment":{"summary":[{"kind":"text","text":"A type of the event that geofencing task can receive."}]},"children":[{"name":"Enter","kind":16,"comment":{"summary":[{"kind":"text","text":"Emitted when the device entered observed region."}]},"type":{"type":"literal","value":1}},{"name":"Exit","kind":16,"comment":{"summary":[{"kind":"text","text":"Occurs as soon as the device left observed region"}]},"type":{"type":"literal","value":2}}]},{"name":"GeofencingRegionState","kind":8,"comment":{"summary":[{"kind":"text","text":"State of the geofencing region that you receive through the geofencing task."}]},"children":[{"name":"Inside","kind":16,"comment":{"summary":[{"kind":"text","text":"Indicates that the device is inside the region."}]},"type":{"type":"literal","value":1}},{"name":"Outside","kind":16,"comment":{"summary":[{"kind":"text","text":"Inverse of inside state."}]},"type":{"type":"literal","value":2}},{"name":"Unknown","kind":16,"comment":{"summary":[{"kind":"text","text":"Indicates that the device position related to the region is unknown."}]},"type":{"type":"literal","value":0}}]},{"name":"PermissionStatus","kind":8,"children":[{"name":"DENIED","kind":16,"comment":{"summary":[{"kind":"text","text":"User has denied the permission."}]},"type":{"type":"literal","value":"denied"}},{"name":"GRANTED","kind":16,"comment":{"summary":[{"kind":"text","text":"User has granted the permission."}]},"type":{"type":"literal","value":"granted"}},{"name":"UNDETERMINED","kind":16,"comment":{"summary":[{"kind":"text","text":"User hasn't granted or denied the permission yet."}]},"type":{"type":"literal","value":"undetermined"}}]},{"name":"PermissionResponse","kind":256,"comment":{"summary":[{"kind":"text","text":"An object obtained by permissions get and request functions."}]},"children":[{"name":"canAskAgain","kind":1024,"comment":{"summary":[{"kind":"text","text":"Indicates if user can be asked again for specific permission.\nIf not, one should be directed to the Settings app\nin order to enable/disable the permission."}]},"type":{"type":"intrinsic","name":"boolean"}},{"name":"expires","kind":1024,"comment":{"summary":[{"kind":"text","text":"Determines time when the permission expires."}]},"type":{"type":"reference","name":"PermissionExpiration"}},{"name":"granted","kind":1024,"comment":{"summary":[{"kind":"text","text":"A convenience boolean that indicates if the permission is granted."}]},"type":{"type":"intrinsic","name":"boolean"}},{"name":"status","kind":1024,"comment":{"summary":[{"kind":"text","text":"Determines the status of the permission."}]},"type":{"type":"reference","name":"PermissionStatus"}}]},{"name":"LocationCallback","kind":4194304,"type":{"type":"reflection","declaration":{"name":"__type","kind":65536,"signatures":[{"name":"__type","kind":4096,"comment":{"summary":[{"kind":"text","text":"Represents "},{"kind":"code","text":"`watchPositionAsync`"},{"kind":"text","text":" callback."}]},"parameters":[{"name":"location","kind":32768,"type":{"type":"reference","name":"LocationObject"}}],"type":{"type":"intrinsic","name":"any"}}]}}},{"name":"LocationGeocodedAddress","kind":4194304,"comment":{"summary":[{"kind":"text","text":"Type representing a result of "},{"kind":"code","text":"`reverseGeocodeAsync`"},{"kind":"text","text":"."}]},"type":{"type":"reflection","declaration":{"name":"__type","kind":65536,"children":[{"name":"city","kind":1024,"comment":{"summary":[{"kind":"text","text":"City name of the address."}]},"type":{"type":"union","types":[{"type":"intrinsic","name":"string"},{"type":"literal","value":null}]}},{"name":"country","kind":1024,"comment":{"summary":[{"kind":"text","text":"Localized country name of the address."}]},"type":{"type":"union","types":[{"type":"intrinsic","name":"string"},{"type":"literal","value":null}]}},{"name":"district","kind":1024,"comment":{"summary":[{"kind":"text","text":"Additional city-level information like district name."}]},"type":{"type":"union","types":[{"type":"intrinsic","name":"string"},{"type":"literal","value":null}]}},{"name":"isoCountryCode","kind":1024,"comment":{"summary":[{"kind":"text","text":"Localized (ISO) country code of the address, if available."}]},"type":{"type":"union","types":[{"type":"intrinsic","name":"string"},{"type":"literal","value":null}]}},{"name":"name","kind":1024,"comment":{"summary":[{"kind":"text","text":"The name of the placemark, for example, \"Tower Bridge\"."}]},"type":{"type":"union","types":[{"type":"intrinsic","name":"string"},{"type":"literal","value":null}]}},{"name":"postalCode","kind":1024,"comment":{"summary":[{"kind":"text","text":"Postal code of the address."}]},"type":{"type":"union","types":[{"type":"intrinsic","name":"string"},{"type":"literal","value":null}]}},{"name":"region","kind":1024,"comment":{"summary":[{"kind":"text","text":"The state or province associated with the address."}]},"type":{"type":"union","types":[{"type":"intrinsic","name":"string"},{"type":"literal","value":null}]}},{"name":"street","kind":1024,"comment":{"summary":[{"kind":"text","text":"Street name of the address."}]},"type":{"type":"union","types":[{"type":"intrinsic","name":"string"},{"type":"literal","value":null}]}},{"name":"streetNumber","kind":1024,"comment":{"summary":[{"kind":"text","text":"Street number of the address."}]},"type":{"type":"union","types":[{"type":"intrinsic","name":"string"},{"type":"literal","value":null}]}},{"name":"subregion","kind":1024,"comment":{"summary":[{"kind":"text","text":"Additional information about administrative area."}]},"type":{"type":"union","types":[{"type":"intrinsic","name":"string"},{"type":"literal","value":null}]}},{"name":"timezone","kind":1024,"comment":{"summary":[{"kind":"text","text":"The timezone identifier associated with the address."}],"blockTags":[{"tag":"@platform","content":[{"kind":"text","text":"ios"}]}]},"type":{"type":"union","types":[{"type":"intrinsic","name":"string"},{"type":"literal","value":null}]}}]}}},{"name":"LocationGeocodedLocation","kind":4194304,"comment":{"summary":[{"kind":"text","text":"Type representing a result of "},{"kind":"code","text":"`geocodeAsync`"},{"kind":"text","text":"."}]},"type":{"type":"reflection","declaration":{"name":"__type","kind":65536,"children":[{"name":"accuracy","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"The radius of uncertainty for the location, measured in meters."}]},"type":{"type":"intrinsic","name":"number"}},{"name":"altitude","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"The altitude in meters above the WGS 84 reference ellipsoid."}]},"type":{"type":"intrinsic","name":"number"}},{"name":"latitude","kind":1024,"comment":{"summary":[{"kind":"text","text":"The latitude in degrees."}]},"type":{"type":"intrinsic","name":"number"}},{"name":"longitude","kind":1024,"comment":{"summary":[{"kind":"text","text":"The longitude in degrees."}]},"type":{"type":"intrinsic","name":"number"}}]}}},{"name":"LocationGeocodingOptions","kind":4194304,"comment":{"summary":[{"kind":"text","text":"An object of options for forward and reverse geocoding."}]},"type":{"type":"reflection","declaration":{"name":"__type","kind":65536,"children":[{"name":"useGoogleMaps","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"Whether to force using Google Maps API instead of the native implementation.\nUsed by default only on Web platform. Requires providing an API key by "},{"kind":"code","text":"`setGoogleApiKey`"},{"kind":"text","text":"."}]},"type":{"type":"intrinsic","name":"boolean"}}]}}},{"name":"LocationHeadingCallback","kind":4194304,"type":{"type":"reflection","declaration":{"name":"__type","kind":65536,"signatures":[{"name":"__type","kind":4096,"comment":{"summary":[{"kind":"text","text":"Represents "},{"kind":"code","text":"`watchHeadingAsync`"},{"kind":"text","text":" callback."}]},"parameters":[{"name":"location","kind":32768,"type":{"type":"reference","name":"LocationHeadingObject"}}],"type":{"type":"intrinsic","name":"any"}}]}}},{"name":"LocationHeadingObject","kind":4194304,"comment":{"summary":[{"kind":"text","text":"Type of the object containing heading details and provided by "},{"kind":"code","text":"`watchHeadingAsync`"},{"kind":"text","text":" callback."}]},"type":{"type":"reflection","declaration":{"name":"__type","kind":65536,"children":[{"name":"accuracy","kind":1024,"comment":{"summary":[{"kind":"text","text":"Level of calibration of compass.\n- "},{"kind":"code","text":"`3`"},{"kind":"text","text":": high accuracy, "},{"kind":"code","text":"`2`"},{"kind":"text","text":": medium accuracy, "},{"kind":"code","text":"`1`"},{"kind":"text","text":": low accuracy, "},{"kind":"code","text":"`0`"},{"kind":"text","text":": none\nReference for iOS:\n- "},{"kind":"code","text":"`3`"},{"kind":"text","text":": < 20 degrees uncertainty, "},{"kind":"code","text":"`2`"},{"kind":"text","text":": < 35 degrees, "},{"kind":"code","text":"`1`"},{"kind":"text","text":": < 50 degrees, "},{"kind":"code","text":"`0`"},{"kind":"text","text":": > 50 degrees"}]},"type":{"type":"intrinsic","name":"number"}},{"name":"magHeading","kind":1024,"comment":{"summary":[{"kind":"text","text":"Measure of magnetic north in degrees."}]},"type":{"type":"intrinsic","name":"number"}},{"name":"trueHeading","kind":1024,"comment":{"summary":[{"kind":"text","text":"Measure of true north in degrees (needs location permissions, will return "},{"kind":"code","text":"`-1`"},{"kind":"text","text":" if not given)."}]},"type":{"type":"intrinsic","name":"number"}}]}}},{"name":"LocationLastKnownOptions","kind":4194304,"comment":{"summary":[{"kind":"text","text":"Type representing options object that can be passed to "},{"kind":"code","text":"`getLastKnownPositionAsync`"},{"kind":"text","text":"."}]},"type":{"type":"reflection","declaration":{"name":"__type","kind":65536,"children":[{"name":"maxAge","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"A number of milliseconds after which the last known location starts to be invalid and thus\n"},{"kind":"code","text":"`null`"},{"kind":"text","text":" is returned."}]},"type":{"type":"intrinsic","name":"number"}},{"name":"requiredAccuracy","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"The maximum radius of uncertainty for the location, measured in meters. If the last known\nlocation's accuracy radius is bigger (less accurate) then "},{"kind":"code","text":"`null`"},{"kind":"text","text":" is returned."}]},"type":{"type":"intrinsic","name":"number"}}]}}},{"name":"LocationObject","kind":4194304,"comment":{"summary":[{"kind":"text","text":"Type representing the location object."}]},"type":{"type":"reflection","declaration":{"name":"__type","kind":65536,"children":[{"name":"coords","kind":1024,"comment":{"summary":[{"kind":"text","text":"The coordinates of the position."}]},"type":{"type":"reference","name":"LocationObjectCoords"}},{"name":"mocked","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"Whether the location coordinates is mocked or not."}],"blockTags":[{"tag":"@platform","content":[{"kind":"text","text":"android"}]}]},"type":{"type":"intrinsic","name":"boolean"}},{"name":"timestamp","kind":1024,"comment":{"summary":[{"kind":"text","text":"The time at which this position information was obtained, in milliseconds since epoch."}]},"type":{"type":"intrinsic","name":"number"}}]}}},{"name":"LocationObjectCoords","kind":4194304,"comment":{"summary":[{"kind":"text","text":"Type representing the location GPS related data."}]},"type":{"type":"reflection","declaration":{"name":"__type","kind":65536,"children":[{"name":"accuracy","kind":1024,"comment":{"summary":[{"kind":"text","text":"The radius of uncertainty for the location, measured in meters. Can be "},{"kind":"code","text":"`null`"},{"kind":"text","text":" on Web if it's not available."}]},"type":{"type":"union","types":[{"type":"intrinsic","name":"number"},{"type":"literal","value":null}]}},{"name":"altitude","kind":1024,"comment":{"summary":[{"kind":"text","text":"The altitude in meters above the WGS 84 reference ellipsoid. Can be "},{"kind":"code","text":"`null`"},{"kind":"text","text":" on Web if it's not available."}]},"type":{"type":"union","types":[{"type":"intrinsic","name":"number"},{"type":"literal","value":null}]}},{"name":"altitudeAccuracy","kind":1024,"comment":{"summary":[{"kind":"text","text":"The accuracy of the altitude value, in meters. Can be "},{"kind":"code","text":"`null`"},{"kind":"text","text":" on Web if it's not available."}]},"type":{"type":"union","types":[{"type":"intrinsic","name":"number"},{"type":"literal","value":null}]}},{"name":"heading","kind":1024,"comment":{"summary":[{"kind":"text","text":"Horizontal direction of travel of this device, measured in degrees starting at due north and\ncontinuing clockwise around the compass. Thus, north is 0 degrees, east is 90 degrees, south is\n180 degrees, and so on. Can be "},{"kind":"code","text":"`null`"},{"kind":"text","text":" on Web if it's not available."}]},"type":{"type":"union","types":[{"type":"intrinsic","name":"number"},{"type":"literal","value":null}]}},{"name":"latitude","kind":1024,"comment":{"summary":[{"kind":"text","text":"The latitude in degrees."}]},"type":{"type":"intrinsic","name":"number"}},{"name":"longitude","kind":1024,"comment":{"summary":[{"kind":"text","text":"The longitude in degrees."}]},"type":{"type":"intrinsic","name":"number"}},{"name":"speed","kind":1024,"comment":{"summary":[{"kind":"text","text":"The instantaneous speed of the device in meters per second. Can be "},{"kind":"code","text":"`null`"},{"kind":"text","text":" on Web if it's not available."}]},"type":{"type":"union","types":[{"type":"intrinsic","name":"number"},{"type":"literal","value":null}]}}]}}},{"name":"LocationOptions","kind":4194304,"comment":{"summary":[{"kind":"text","text":"Type representing options argument in "},{"kind":"code","text":"`getCurrentPositionAsync`"},{"kind":"text","text":"."}]},"type":{"type":"reflection","declaration":{"name":"__type","kind":65536,"children":[{"name":"accuracy","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"Location manager accuracy. Pass one of "},{"kind":"code","text":"`Accuracy`"},{"kind":"text","text":" enum values.\nFor low-accuracies the implementation can avoid geolocation providers\nthat consume a significant amount of power (such as GPS)."}]},"type":{"type":"reference","name":"LocationAccuracy"}},{"name":"distanceInterval","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"Receive updates only when the location has changed by at least this distance in meters.\nDefault value may depend on "},{"kind":"code","text":"`accuracy`"},{"kind":"text","text":" option."}]},"type":{"type":"intrinsic","name":"number"}},{"name":"mayShowUserSettingsDialog","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"Specifies whether to ask the user to turn on improved accuracy location mode\nwhich uses Wi-Fi, cell networks and GPS sensor."}],"blockTags":[{"tag":"@default","content":[{"kind":"text","text":"true"}]},{"tag":"@platform","content":[{"kind":"text","text":"android"}]}]},"type":{"type":"intrinsic","name":"boolean"}},{"name":"timeInterval","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"Minimum time to wait between each update in milliseconds.\nDefault value may depend on "},{"kind":"code","text":"`accuracy`"},{"kind":"text","text":" option."}],"blockTags":[{"tag":"@platform","content":[{"kind":"text","text":"android"}]}]},"type":{"type":"intrinsic","name":"number"}}]}}},{"name":"LocationPermissionResponse","kind":4194304,"comment":{"summary":[{"kind":"code","text":"`LocationPermissionResponse`"},{"kind":"text","text":" extends [PermissionResponse](#permissionresponse)\ntype exported by "},{"kind":"code","text":"`expo-modules-core`"},{"kind":"text","text":" and contains additional platform-specific fields."}]},"type":{"type":"intersection","types":[{"type":"reference","name":"PermissionResponse"},{"type":"reflection","declaration":{"name":"__type","kind":65536,"children":[{"name":"android","kind":1024,"flags":{"isOptional":true},"type":{"type":"reference","name":"PermissionDetailsLocationAndroid"}},{"name":"ios","kind":1024,"flags":{"isOptional":true},"type":{"type":"reference","name":"PermissionDetailsLocationIOS"}}]}}]}},{"name":"LocationProviderStatus","kind":4194304,"comment":{"summary":[{"kind":"text","text":"Represents the object containing details about location provider."}]},"type":{"type":"reflection","declaration":{"name":"__type","kind":65536,"children":[{"name":"backgroundModeEnabled","kind":1024,"type":{"type":"intrinsic","name":"boolean"}},{"name":"gpsAvailable","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"Whether the GPS provider is available. If "},{"kind":"code","text":"`true`"},{"kind":"text","text":" the location data will come\nfrom GPS, especially for requests with high accuracy."}],"blockTags":[{"tag":"@platform","content":[{"kind":"text","text":"android"}]}]},"type":{"type":"intrinsic","name":"boolean"}},{"name":"locationServicesEnabled","kind":1024,"comment":{"summary":[{"kind":"text","text":"Whether location services are enabled. See [Location.hasServicesEnabledAsync](#locationhasservicesenabledasync)\nfor a more convenient solution to get this value."}]},"type":{"type":"intrinsic","name":"boolean"}},{"name":"networkAvailable","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"Whether the network provider is available. If "},{"kind":"code","text":"`true`"},{"kind":"text","text":" the location data will\ncome from cellular network, especially for requests with low accuracy."}],"blockTags":[{"tag":"@platform","content":[{"kind":"text","text":"android"}]}]},"type":{"type":"intrinsic","name":"boolean"}},{"name":"passiveAvailable","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"Whether the passive provider is available. If "},{"kind":"code","text":"`true`"},{"kind":"text","text":" the location data will\nbe determined passively."}],"blockTags":[{"tag":"@platform","content":[{"kind":"text","text":"android"}]}]},"type":{"type":"intrinsic","name":"boolean"}}]}}},{"name":"LocationRegion","kind":4194304,"comment":{"summary":[{"kind":"text","text":"Type representing geofencing region object."}]},"type":{"type":"reflection","declaration":{"name":"__type","kind":65536,"children":[{"name":"identifier","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"The identifier of the region object. Defaults to auto-generated UUID hash."}]},"type":{"type":"intrinsic","name":"string"}},{"name":"latitude","kind":1024,"comment":{"summary":[{"kind":"text","text":"The latitude in degrees of region's center point."}]},"type":{"type":"intrinsic","name":"number"}},{"name":"longitude","kind":1024,"comment":{"summary":[{"kind":"text","text":"The longitude in degrees of region's center point."}]},"type":{"type":"intrinsic","name":"number"}},{"name":"notifyOnEnter","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"Boolean value whether to call the task if the device enters the region."}],"blockTags":[{"tag":"@default","content":[{"kind":"text","text":"true"}]}]},"type":{"type":"intrinsic","name":"boolean"}},{"name":"notifyOnExit","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"Boolean value whether to call the task if the device exits the region."}],"blockTags":[{"tag":"@default","content":[{"kind":"text","text":"true"}]}]},"type":{"type":"intrinsic","name":"boolean"}},{"name":"radius","kind":1024,"comment":{"summary":[{"kind":"text","text":"The radius measured in meters that defines the region's outer boundary."}]},"type":{"type":"intrinsic","name":"number"}},{"name":"state","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"One of [GeofencingRegionState](#geofencingregionstate) region state. Determines whether the\ndevice is inside or outside a region."}]},"type":{"type":"reference","name":"LocationGeofencingRegionState"}}]}}},{"name":"LocationSubscription","kind":4194304,"comment":{"summary":[{"kind":"text","text":"Represents subscription object returned by methods watching for new locations or headings."}]},"type":{"type":"reflection","declaration":{"name":"__type","kind":65536,"children":[{"name":"remove","kind":1024,"type":{"type":"reflection","declaration":{"name":"__type","kind":65536,"signatures":[{"name":"__type","kind":4096,"comment":{"summary":[{"kind":"text","text":"Call this function with no arguments to remove this subscription. The callback will no longer\nbe called for location updates."}]},"type":{"type":"intrinsic","name":"void"}}]}}}]}}},{"name":"LocationTaskOptions","kind":4194304,"comment":{"summary":[{"kind":"text","text":"Type representing background location task options."}]},"type":{"type":"intersection","types":[{"type":"reference","name":"LocationOptions"},{"type":"reflection","declaration":{"name":"__type","kind":65536,"children":[{"name":"activityType","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"The type of user activity associated with the location updates."}],"blockTags":[{"tag":"@see","content":[{"kind":"text","text":"See [Apple docs](https://developer.apple.com/documentation/corelocation/cllocationmanager/1620567-activitytype) for more details."}]},{"tag":"@default","content":[{"kind":"text","text":"ActivityType.Other"}]},{"tag":"@platform","content":[{"kind":"text","text":"ios"}]}]},"type":{"type":"reference","name":"LocationActivityType"}},{"name":"deferredUpdatesDistance","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"The distance in meters that must occur between last reported location and the current location\nbefore deferred locations are reported."}],"blockTags":[{"tag":"@default","content":[{"kind":"text","text":"0"}]}]},"type":{"type":"intrinsic","name":"number"}},{"name":"deferredUpdatesInterval","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"Minimum time interval in milliseconds that must pass since last reported location before all\nlater locations are reported in a batched update"}],"blockTags":[{"tag":"@default","content":[{"kind":"text","text":"0"}]}]},"type":{"type":"intrinsic","name":"number"}},{"name":"deferredUpdatesTimeout","kind":1024,"flags":{"isOptional":true},"type":{"type":"intrinsic","name":"number"}},{"name":"foregroundService","kind":1024,"flags":{"isOptional":true},"type":{"type":"reference","name":"LocationTaskServiceOptions"}},{"name":"pausesUpdatesAutomatically","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"A boolean value indicating whether the location manager can pause location\nupdates to improve battery life without sacrificing location data. When this option is set to\n"},{"kind":"code","text":"`true`"},{"kind":"text","text":", the location manager pauses updates (and powers down the appropriate hardware) at times\nwhen the location data is unlikely to change. You can help the determination of when to pause\nlocation updates by assigning a value to the "},{"kind":"code","text":"`activityType`"},{"kind":"text","text":" property."}],"blockTags":[{"tag":"@default","content":[{"kind":"text","text":"false"}]},{"tag":"@platform","content":[{"kind":"text","text":"ios"}]}]},"type":{"type":"intrinsic","name":"boolean"}},{"name":"showsBackgroundLocationIndicator","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"A boolean indicating whether the status bar changes its appearance when\nlocation services are used in the background."}],"blockTags":[{"tag":"@default","content":[{"kind":"text","text":"false"}]},{"tag":"@platform","content":[{"kind":"text","text":"ios 11+"}]}]},"type":{"type":"intrinsic","name":"boolean"}}]}}]}},{"name":"LocationTaskServiceOptions","kind":4194304,"type":{"type":"reflection","declaration":{"name":"__type","kind":65536,"children":[{"name":"killServiceOnDestroy","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"Boolean value whether to destroy the foreground service if the app is killed."}]},"type":{"type":"intrinsic","name":"boolean"}},{"name":"notificationBody","kind":1024,"comment":{"summary":[{"kind":"text","text":"Subtitle of the foreground service notification."}]},"type":{"type":"intrinsic","name":"string"}},{"name":"notificationColor","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"Color of the foreground service notification. Accepts "},{"kind":"code","text":"`#RRGGBB`"},{"kind":"text","text":" and "},{"kind":"code","text":"`#AARRGGBB`"},{"kind":"text","text":" hex formats."}]},"type":{"type":"intrinsic","name":"string"}},{"name":"notificationTitle","kind":1024,"comment":{"summary":[{"kind":"text","text":"Title of the foreground service notification."}]},"type":{"type":"intrinsic","name":"string"}}]}}},{"name":"PermissionDetailsLocationAndroid","kind":4194304,"type":{"type":"reflection","declaration":{"name":"__type","kind":65536,"children":[{"name":"accuracy","kind":1024,"comment":{"summary":[{"kind":"text","text":"Indicates the type of location provider."}]},"type":{"type":"union","types":[{"type":"literal","value":"fine"},{"type":"literal","value":"coarse"},{"type":"literal","value":"none"}]}},{"name":"scope","kind":1024,"comment":{"summary":[],"blockTags":[{"tag":"@deprecated","content":[{"kind":"text","text":"Use "},{"kind":"code","text":"`accuracy`"},{"kind":"text","text":" field instead."}]}]},"type":{"type":"union","types":[{"type":"literal","value":"fine"},{"type":"literal","value":"coarse"},{"type":"literal","value":"none"}]}}]}}},{"name":"PermissionDetailsLocationIOS","kind":4194304,"type":{"type":"reflection","declaration":{"name":"__type","kind":65536,"children":[{"name":"scope","kind":1024,"comment":{"summary":[{"kind":"text","text":"The scope of granted permission. Indicates when it's possible to use location."}]},"type":{"type":"union","types":[{"type":"literal","value":"whenInUse"},{"type":"literal","value":"always"},{"type":"literal","value":"none"}]}}]}}},{"name":"PermissionHookOptions","kind":4194304,"typeParameters":[{"name":"Options","kind":131072,"type":{"type":"intrinsic","name":"object"}}],"type":{"type":"intersection","types":[{"type":"reference","name":"PermissionHookBehavior"},{"type":"reference","name":"Options"}]}},{"name":"EventEmitter","kind":32,"flags":{"isConst":true},"type":{"type":"reference","name":"EventEmitter"},"defaultValue":"..."},{"name":"enableNetworkProviderAsync","kind":64,"signatures":[{"name":"enableNetworkProviderAsync","kind":4096,"comment":{"summary":[{"kind":"text","text":"Asks the user to turn on high accuracy location mode which enables network provider that uses\nGoogle Play services to improve location accuracy and location-based services."}],"blockTags":[{"tag":"@returns","content":[{"kind":"text","text":"A promise resolving as soon as the user accepts the dialog. Rejects if denied."}]}]},"type":{"type":"reference","typeArguments":[{"type":"intrinsic","name":"void"}],"name":"Promise","qualifiedName":"Promise","package":"typescript"}}]},{"name":"geocodeAsync","kind":64,"signatures":[{"name":"geocodeAsync","kind":4096,"comment":{"summary":[{"kind":"text","text":"Geocode an address string to latitude-longitude location.\n> **Note**: Using the Geocoding web api is no longer supported. Use [Place Autocomplete](https://developers.google.com/maps/documentation/places/web-service/autocomplete) instead.\n\n> **Note**: Geocoding is resource consuming and has to be used reasonably. Creating too many\n> requests at a time can result in an error, so they have to be managed properly.\n> It's also discouraged to use geocoding while the app is in the background and its results won't\n> be shown to the user immediately.\n\n> On Android, you must request a location permission ("},{"kind":"code","text":"`Permissions.LOCATION`"},{"kind":"text","text":") from the user\n> before geocoding can be used."}],"blockTags":[{"tag":"@returns","content":[{"kind":"text","text":"A promise which fulfills with an array (in most cases its size is 1) of ["},{"kind":"code","text":"`LocationGeocodedLocation`"},{"kind":"text","text":"](#locationgeocodedlocation) objects."}]}]},"parameters":[{"name":"address","kind":32768,"comment":{"summary":[{"kind":"text","text":"A string representing address, eg. "},{"kind":"code","text":"`\"Baker Street London\"`"},{"kind":"text","text":"."}]},"type":{"type":"intrinsic","name":"string"}},{"name":"options","kind":32768,"flags":{"isOptional":true},"type":{"type":"reference","name":"LocationGeocodingOptions"}}],"type":{"type":"reference","typeArguments":[{"type":"array","elementType":{"type":"reference","name":"LocationGeocodedLocation"}}],"name":"Promise","qualifiedName":"Promise","package":"typescript"}}]},{"name":"getBackgroundPermissionsAsync","kind":64,"signatures":[{"name":"getBackgroundPermissionsAsync","kind":4096,"comment":{"summary":[{"kind":"text","text":"Checks user's permissions for accessing location while the app is in the background."}],"blockTags":[{"tag":"@returns","content":[{"kind":"text","text":"A promise that fulfills with an object of type [PermissionResponse](#permissionresponse)."}]}]},"type":{"type":"reference","typeArguments":[{"type":"reference","name":"PermissionResponse"}],"name":"Promise","qualifiedName":"Promise","package":"typescript"}}]},{"name":"getCurrentPositionAsync","kind":64,"signatures":[{"name":"getCurrentPositionAsync","kind":4096,"comment":{"summary":[{"kind":"text","text":"Requests for one-time delivery of the user's current location.\nDepending on given "},{"kind":"code","text":"`accuracy`"},{"kind":"text","text":" option it may take some time to resolve,\nespecially when you're inside a building.\n> __Note:__ Calling it causes the location manager to obtain a location fix which may take several\n> seconds. Consider using ["},{"kind":"code","text":"`Location.getLastKnownPositionAsync`"},{"kind":"text","text":"](#locationgetlastknownpositionasyncoptions)\n> if you expect to get a quick response and high accuracy is not required."}],"blockTags":[{"tag":"@returns","content":[{"kind":"text","text":"A promise which fulfills with an object of type ["},{"kind":"code","text":"`LocationObject`"},{"kind":"text","text":"](#locationobject)."}]}]},"parameters":[{"name":"options","kind":32768,"type":{"type":"reference","name":"LocationOptions"},"defaultValue":"{}"}],"type":{"type":"reference","typeArguments":[{"type":"reference","name":"LocationObject"}],"name":"Promise","qualifiedName":"Promise","package":"typescript"}}]},{"name":"getForegroundPermissionsAsync","kind":64,"signatures":[{"name":"getForegroundPermissionsAsync","kind":4096,"comment":{"summary":[{"kind":"text","text":"Checks user's permissions for accessing location while the app is in the foreground."}],"blockTags":[{"tag":"@returns","content":[{"kind":"text","text":"A promise that fulfills with an object of type [PermissionResponse](#permissionresponse)."}]}]},"type":{"type":"reference","typeArguments":[{"type":"reference","name":"LocationPermissionResponse"}],"name":"Promise","qualifiedName":"Promise","package":"typescript"}}]},{"name":"getHeadingAsync","kind":64,"signatures":[{"name":"getHeadingAsync","kind":4096,"comment":{"summary":[{"kind":"text","text":"Gets the current heading information from the device. To simplify, it calls "},{"kind":"code","text":"`watchHeadingAsync`"},{"kind":"text","text":"\nand waits for a couple of updates, and then returns the one that is accurate enough."}],"blockTags":[{"tag":"@returns","content":[{"kind":"text","text":"A promise which fulfills with an object of type [LocationHeadingObject](#locationheadingobject)."}]}]},"type":{"type":"reference","typeArguments":[{"type":"reference","name":"LocationHeadingObject"}],"name":"Promise","qualifiedName":"Promise","package":"typescript"}}]},{"name":"getLastKnownPositionAsync","kind":64,"signatures":[{"name":"getLastKnownPositionAsync","kind":4096,"comment":{"summary":[{"kind":"text","text":"Gets the last known position of the device or "},{"kind":"code","text":"`null`"},{"kind":"text","text":" if it's not available or doesn't match given\nrequirements such as maximum age or required accuracy.\nIt's considered to be faster than "},{"kind":"code","text":"`getCurrentPositionAsync`"},{"kind":"text","text":" as it doesn't request for the current\nlocation, but keep in mind the returned location may not be up-to-date."}],"blockTags":[{"tag":"@returns","content":[{"kind":"text","text":"A promise which fulfills with an object of type [LocationObject](#locationobject) or\n"},{"kind":"code","text":"`null`"},{"kind":"text","text":" if it's not available or doesn't match given requirements such as maximum age or required\naccuracy."}]}]},"parameters":[{"name":"options","kind":32768,"type":{"type":"reference","name":"LocationLastKnownOptions"},"defaultValue":"{}"}],"type":{"type":"reference","typeArguments":[{"type":"union","types":[{"type":"reference","name":"LocationObject"},{"type":"literal","value":null}]}],"name":"Promise","qualifiedName":"Promise","package":"typescript"}}]},{"name":"getPermissionsAsync","kind":64,"signatures":[{"name":"getPermissionsAsync","kind":4096,"comment":{"summary":[{"kind":"text","text":"Checks user's permissions for accessing location."}],"blockTags":[{"tag":"@returns","content":[{"kind":"text","text":"A promise that fulfills with an object of type [LocationPermissionResponse](#locationpermissionresponse)."}]},{"tag":"@deprecated","content":[{"kind":"text","text":"Use ["},{"kind":"code","text":"`getForegroundPermissionsAsync`"},{"kind":"text","text":"](#locationgetforegroundpermissionsasync) or ["},{"kind":"code","text":"`getBackgroundPermissionsAsync`"},{"kind":"text","text":"](#locationgetbackgroundpermissionsasync) instead."}]}]},"type":{"type":"reference","typeArguments":[{"type":"reference","name":"LocationPermissionResponse"}],"name":"Promise","qualifiedName":"Promise","package":"typescript"}}]},{"name":"getProviderStatusAsync","kind":64,"signatures":[{"name":"getProviderStatusAsync","kind":4096,"comment":{"summary":[{"kind":"text","text":"Check status of location providers."}],"blockTags":[{"tag":"@returns","content":[{"kind":"text","text":"A promise which fulfills with an object of type [LocationProviderStatus](#locationproviderstatus)."}]}]},"type":{"type":"reference","typeArguments":[{"type":"reference","name":"LocationProviderStatus"}],"name":"Promise","qualifiedName":"Promise","package":"typescript"}}]},{"name":"hasServicesEnabledAsync","kind":64,"signatures":[{"name":"hasServicesEnabledAsync","kind":4096,"comment":{"summary":[{"kind":"text","text":"Checks whether location services are enabled by the user."}],"blockTags":[{"tag":"@returns","content":[{"kind":"text","text":"A promise which fulfills to "},{"kind":"code","text":"`true`"},{"kind":"text","text":" if location services are enabled on the device,\nor "},{"kind":"code","text":"`false`"},{"kind":"text","text":" if not."}]}]},"type":{"type":"reference","typeArguments":[{"type":"intrinsic","name":"boolean"}],"name":"Promise","qualifiedName":"Promise","package":"typescript"}}]},{"name":"hasStartedGeofencingAsync","kind":64,"signatures":[{"name":"hasStartedGeofencingAsync","kind":4096,"comment":{"summary":[],"blockTags":[{"tag":"@returns","content":[{"kind":"text","text":"A promise which fulfills with boolean value indicating whether the geofencing task is\nstarted or not."}]}]},"parameters":[{"name":"taskName","kind":32768,"comment":{"summary":[{"kind":"text","text":"Name of the geofencing task to check."}]},"type":{"type":"intrinsic","name":"string"}}],"type":{"type":"reference","typeArguments":[{"type":"intrinsic","name":"boolean"}],"name":"Promise","qualifiedName":"Promise","package":"typescript"}}]},{"name":"hasStartedLocationUpdatesAsync","kind":64,"signatures":[{"name":"hasStartedLocationUpdatesAsync","kind":4096,"comment":{"summary":[],"blockTags":[{"tag":"@returns","content":[{"kind":"text","text":"A promise which fulfills with boolean value indicating whether the location task is\nstarted or not."}]}]},"parameters":[{"name":"taskName","kind":32768,"comment":{"summary":[{"kind":"text","text":"Name of the location task to check."}]},"type":{"type":"intrinsic","name":"string"}}],"type":{"type":"reference","typeArguments":[{"type":"intrinsic","name":"boolean"}],"name":"Promise","qualifiedName":"Promise","package":"typescript"}}]},{"name":"installWebGeolocationPolyfill","kind":64,"signatures":[{"name":"installWebGeolocationPolyfill","kind":4096,"comment":{"summary":[{"kind":"text","text":"Polyfills "},{"kind":"code","text":"`navigator.geolocation`"},{"kind":"text","text":" for interop with the core React Native and Web API approach to geolocation."}]},"type":{"type":"intrinsic","name":"void"}}]},{"name":"isBackgroundLocationAvailableAsync","kind":64,"signatures":[{"name":"isBackgroundLocationAvailableAsync","kind":4096,"type":{"type":"reference","typeArguments":[{"type":"intrinsic","name":"boolean"}],"name":"Promise","qualifiedName":"Promise","package":"typescript"}}]},{"name":"requestBackgroundPermissionsAsync","kind":64,"signatures":[{"name":"requestBackgroundPermissionsAsync","kind":4096,"comment":{"summary":[{"kind":"text","text":"Asks the user to grant permissions for location while the app is in the background.\nOn __Android 11 or higher__: this method will open the system settings page - before that happens\nyou should explain to the user why your application needs background location permission.\nFor example, you can use "},{"kind":"code","text":"`Modal`"},{"kind":"text","text":" component from "},{"kind":"code","text":"`react-native`"},{"kind":"text","text":" to do that.\n> __Note__: Foreground permissions should be granted before asking for the background permissions\n(your app can't obtain background permission without foreground permission)."}],"blockTags":[{"tag":"@returns","content":[{"kind":"text","text":"A promise that fulfills with an object of type [PermissionResponse](#permissionresponse)."}]}]},"type":{"type":"reference","typeArguments":[{"type":"reference","name":"PermissionResponse"}],"name":"Promise","qualifiedName":"Promise","package":"typescript"}}]},{"name":"requestForegroundPermissionsAsync","kind":64,"signatures":[{"name":"requestForegroundPermissionsAsync","kind":4096,"comment":{"summary":[{"kind":"text","text":"Asks the user to grant permissions for location while the app is in the foreground."}],"blockTags":[{"tag":"@returns","content":[{"kind":"text","text":"A promise that fulfills with an object of type [PermissionResponse](#permissionresponse)."}]}]},"type":{"type":"reference","typeArguments":[{"type":"reference","name":"LocationPermissionResponse"}],"name":"Promise","qualifiedName":"Promise","package":"typescript"}}]},{"name":"requestPermissionsAsync","kind":64,"signatures":[{"name":"requestPermissionsAsync","kind":4096,"comment":{"summary":[{"kind":"text","text":"Asks the user to grant permissions for location."}],"blockTags":[{"tag":"@returns","content":[{"kind":"text","text":"A promise that fulfills with an object of type [LocationPermissionResponse](#locationpermissionresponse)."}]},{"tag":"@deprecated","content":[{"kind":"text","text":"Use ["},{"kind":"code","text":"`requestForegroundPermissionsAsync`"},{"kind":"text","text":"](#locationrequestforegroundpermissionsasync) or ["},{"kind":"code","text":"`requestBackgroundPermissionsAsync`"},{"kind":"text","text":"](#locationrequestbackgroundpermissionsasync) instead."}]}]},"type":{"type":"reference","typeArguments":[{"type":"reference","name":"LocationPermissionResponse"}],"name":"Promise","qualifiedName":"Promise","package":"typescript"}}]},{"name":"reverseGeocodeAsync","kind":64,"signatures":[{"name":"reverseGeocodeAsync","kind":4096,"comment":{"summary":[{"kind":"text","text":"Reverse geocode a location to postal address.\n> **Note**: Using the Geocoding web api is no longer supported. Use [Place Autocomplete](https://developers.google.com/maps/documentation/places/web-service/autocomplete) instead.\n\n> **Note**: Geocoding is resource consuming and has to be used reasonably. Creating too many\n> requests at a time can result in an error, so they have to be managed properly.\n> It's also discouraged to use geocoding while the app is in the background and its results won't\n> be shown to the user immediately.\n\n> On Android, you must request a location permission ("},{"kind":"code","text":"`Permissions.LOCATION`"},{"kind":"text","text":") from the user\n> before geocoding can be used."}],"blockTags":[{"tag":"@returns","content":[{"kind":"text","text":"A promise which fulfills with an array (in most cases its size is 1) of ["},{"kind":"code","text":"`LocationGeocodedAddress`"},{"kind":"text","text":"](#locationgeocodedaddress) objects."}]}]},"parameters":[{"name":"location","kind":32768,"comment":{"summary":[{"kind":"text","text":"An object representing a location."}]},"type":{"type":"reference","typeArguments":[{"type":"reference","name":"LocationGeocodedLocation"},{"type":"union","types":[{"type":"literal","value":"latitude"},{"type":"literal","value":"longitude"}]}],"name":"Pick","qualifiedName":"Pick","package":"typescript"}},{"name":"options","kind":32768,"flags":{"isOptional":true},"type":{"type":"reference","name":"LocationGeocodingOptions"}}],"type":{"type":"reference","typeArguments":[{"type":"array","elementType":{"type":"reference","name":"LocationGeocodedAddress"}}],"name":"Promise","qualifiedName":"Promise","package":"typescript"}}]},{"name":"setGoogleApiKey","kind":64,"signatures":[{"name":"setGoogleApiKey","kind":4096,"comment":{"summary":[],"blockTags":[{"tag":"@deprecated","content":[{"kind":"text","text":"The Geocoding web api is no longer available from SDK 49 onwards. Use [Place Autocomplete](https://developers.google.com/maps/documentation/places/web-service/autocomplete) instead."}]}]},"parameters":[{"name":"_apiKey","kind":32768,"type":{"type":"intrinsic","name":"string"}}],"type":{"type":"intrinsic","name":"void"}}]},{"name":"startGeofencingAsync","kind":64,"signatures":[{"name":"startGeofencingAsync","kind":4096,"comment":{"summary":[{"kind":"text","text":"Starts geofencing for given regions. When the new event comes, the task with specified name will\nbe called with the region that the device enter to or exit from.\nIf you want to add or remove regions from already running geofencing task, you can just call\n"},{"kind":"code","text":"`startGeofencingAsync`"},{"kind":"text","text":" again with the new array of regions.\n\n# Task parameters\n\nGeofencing task will be receiving following data:\n - "},{"kind":"code","text":"`eventType`"},{"kind":"text","text":" - Indicates the reason for calling the task, which can be triggered by entering or exiting the region.\n See [GeofencingEventType](#geofencingeventtype).\n - "},{"kind":"code","text":"`region`"},{"kind":"text","text":" - Object containing details about updated region. See [LocationRegion](#locationregion) for more details."}],"blockTags":[{"tag":"@returns","content":[{"kind":"text","text":"A promise resolving as soon as the task is registered."}]},{"tag":"@example","content":[{"kind":"code","text":"```ts\nimport { GeofencingEventType } from 'expo-location';\nimport * as TaskManager from 'expo-task-manager';\n\n TaskManager.defineTask(YOUR_TASK_NAME, ({ data: { eventType, region }, error }) => {\n if (error) {\n // check `error.message` for more details.\n return;\n }\n if (eventType === GeofencingEventType.Enter) {\n console.log(\"You've entered region:\", region);\n } else if (eventType === GeofencingEventType.Exit) {\n console.log(\"You've left region:\", region);\n }\n});\n```"}]}]},"parameters":[{"name":"taskName","kind":32768,"comment":{"summary":[{"kind":"text","text":"Name of the task that will be called when the device enters or exits from specified regions."}]},"type":{"type":"intrinsic","name":"string"}},{"name":"regions","kind":32768,"comment":{"summary":[{"kind":"text","text":"Array of region objects to be geofenced."}]},"type":{"type":"array","elementType":{"type":"reference","name":"LocationRegion"}},"defaultValue":"[]"}],"type":{"type":"reference","typeArguments":[{"type":"intrinsic","name":"void"}],"name":"Promise","qualifiedName":"Promise","package":"typescript"}}]},{"name":"startLocationUpdatesAsync","kind":64,"signatures":[{"name":"startLocationUpdatesAsync","kind":4096,"comment":{"summary":[{"kind":"text","text":"Registers for receiving location updates that can also come when the app is in the background.\n\n# Task parameters\n\nBackground location task will be receiving following data:\n- "},{"kind":"code","text":"`locations`"},{"kind":"text","text":" - An array of the new locations.\n\n"},{"kind":"code","text":"```ts\nimport * as TaskManager from 'expo-task-manager';\n\nTaskManager.defineTask(YOUR_TASK_NAME, ({ data: { locations }, error }) => {\n if (error) {\n // check `error.message` for more details.\n return;\n }\n console.log('Received new locations', locations);\n});\n```"}],"blockTags":[{"tag":"@returns","content":[{"kind":"text","text":"A promise resolving once the task with location updates is registered."}]}]},"parameters":[{"name":"taskName","kind":32768,"comment":{"summary":[{"kind":"text","text":"Name of the task receiving location updates."}]},"type":{"type":"intrinsic","name":"string"}},{"name":"options","kind":32768,"comment":{"summary":[{"kind":"text","text":"An object of options passed to the location manager."}]},"type":{"type":"reference","name":"LocationTaskOptions"},"defaultValue":"..."}],"type":{"type":"reference","typeArguments":[{"type":"intrinsic","name":"void"}],"name":"Promise","qualifiedName":"Promise","package":"typescript"}}]},{"name":"stopGeofencingAsync","kind":64,"signatures":[{"name":"stopGeofencingAsync","kind":4096,"comment":{"summary":[{"kind":"text","text":"Stops geofencing for specified task. It unregisters the background task so the app will not be\nreceiving any updates, especially in the background."}],"blockTags":[{"tag":"@returns","content":[{"kind":"text","text":"A promise resolving as soon as the task is unregistered."}]}]},"parameters":[{"name":"taskName","kind":32768,"comment":{"summary":[{"kind":"text","text":"Name of the task to unregister."}]},"type":{"type":"intrinsic","name":"string"}}],"type":{"type":"reference","typeArguments":[{"type":"intrinsic","name":"void"}],"name":"Promise","qualifiedName":"Promise","package":"typescript"}}]},{"name":"stopLocationUpdatesAsync","kind":64,"signatures":[{"name":"stopLocationUpdatesAsync","kind":4096,"comment":{"summary":[{"kind":"text","text":"Stops geofencing for specified task."}],"blockTags":[{"tag":"@returns","content":[{"kind":"text","text":"A promise resolving as soon as the task is unregistered."}]}]},"parameters":[{"name":"taskName","kind":32768,"comment":{"summary":[{"kind":"text","text":"Name of the background location task to stop."}]},"type":{"type":"intrinsic","name":"string"}}],"type":{"type":"reference","typeArguments":[{"type":"intrinsic","name":"void"}],"name":"Promise","qualifiedName":"Promise","package":"typescript"}}]},{"name":"useBackgroundPermissions","kind":64,"signatures":[{"name":"useBackgroundPermissions","kind":4096,"comment":{"summary":[{"kind":"text","text":"Check or request permissions for the background location.\nThis uses both "},{"kind":"code","text":"`requestBackgroundPermissionsAsync`"},{"kind":"text","text":" and "},{"kind":"code","text":"`getBackgroundPermissionsAsync`"},{"kind":"text","text":" to\ninteract with the permissions."}],"blockTags":[{"tag":"@example","content":[{"kind":"code","text":"```ts\nconst [status, requestPermission] = Location.useBackgroundPermissions();\n```"}]}]},"parameters":[{"name":"options","kind":32768,"flags":{"isOptional":true},"type":{"type":"reference","typeArguments":[{"type":"intrinsic","name":"object"}],"name":"PermissionHookOptions"}}],"type":{"type":"tuple","elements":[{"type":"union","types":[{"type":"literal","value":null},{"type":"reference","name":"PermissionResponse"}]},{"type":"reference","typeArguments":[{"type":"reference","name":"PermissionResponse"}],"name":"RequestPermissionMethod"},{"type":"reference","typeArguments":[{"type":"reference","name":"PermissionResponse"}],"name":"GetPermissionMethod"}]}}]},{"name":"useForegroundPermissions","kind":64,"signatures":[{"name":"useForegroundPermissions","kind":4096,"comment":{"summary":[{"kind":"text","text":"Check or request permissions for the foreground location.\nThis uses both "},{"kind":"code","text":"`requestForegroundPermissionsAsync`"},{"kind":"text","text":" and "},{"kind":"code","text":"`getForegroundPermissionsAsync`"},{"kind":"text","text":" to interact with the permissions."}],"blockTags":[{"tag":"@example","content":[{"kind":"code","text":"```ts\nconst [status, requestPermission] = Location.useForegroundPermissions();\n```"}]}]},"parameters":[{"name":"options","kind":32768,"flags":{"isOptional":true},"type":{"type":"reference","typeArguments":[{"type":"intrinsic","name":"object"}],"name":"PermissionHookOptions"}}],"type":{"type":"tuple","elements":[{"type":"union","types":[{"type":"literal","value":null},{"type":"reference","name":"LocationPermissionResponse"}]},{"type":"reference","typeArguments":[{"type":"reference","name":"LocationPermissionResponse"}],"name":"RequestPermissionMethod"},{"type":"reference","typeArguments":[{"type":"reference","name":"LocationPermissionResponse"}],"name":"GetPermissionMethod"}]}}]},{"name":"watchHeadingAsync","kind":64,"signatures":[{"name":"watchHeadingAsync","kind":4096,"comment":{"summary":[{"kind":"text","text":"Subscribe to compass updates from the device."}],"blockTags":[{"tag":"@returns","content":[{"kind":"text","text":"A promise which fulfills with a ["},{"kind":"code","text":"`LocationSubscription`"},{"kind":"text","text":"](#locationsubscription) object."}]}]},"parameters":[{"name":"callback","kind":32768,"comment":{"summary":[{"kind":"text","text":"This function is called on each compass update. It receives an object of type\n[LocationHeadingObject](#locationheadingobject) as the first argument."}]},"type":{"type":"reference","name":"LocationHeadingCallback"}}],"type":{"type":"reference","typeArguments":[{"type":"reference","name":"LocationSubscription"}],"name":"Promise","qualifiedName":"Promise","package":"typescript"}}]},{"name":"watchPositionAsync","kind":64,"signatures":[{"name":"watchPositionAsync","kind":4096,"comment":{"summary":[{"kind":"text","text":"Subscribe to location updates from the device. Please note that updates will only occur while the\napplication is in the foreground. To get location updates while in background you'll need to use\n[Location.startLocationUpdatesAsync](#locationstartlocationupdatesasynctaskname-options)."}],"blockTags":[{"tag":"@returns","content":[{"kind":"text","text":"A promise which fulfills with a ["},{"kind":"code","text":"`LocationSubscription`"},{"kind":"text","text":"](#locationsubscription) object."}]}]},"parameters":[{"name":"options","kind":32768,"type":{"type":"reference","name":"LocationOptions"}},{"name":"callback","kind":32768,"comment":{"summary":[{"kind":"text","text":"This function is called on each location update. It receives an object of type\n["},{"kind":"code","text":"`LocationObject`"},{"kind":"text","text":"](#locationobject) as the first argument."}]},"type":{"type":"reference","name":"LocationCallback"}}],"type":{"type":"reference","typeArguments":[{"type":"reference","name":"LocationSubscription"}],"name":"Promise","qualifiedName":"Promise","package":"typescript"}}]}]}
\ No newline at end of file
diff --git a/docs/public/static/data/v49.0.0/expo-magnetometer.json b/docs/public/static/data/v49.0.0/expo-magnetometer.json
new file mode 100644
index 0000000000000..22cc2348106de
--- /dev/null
+++ b/docs/public/static/data/v49.0.0/expo-magnetometer.json
@@ -0,0 +1 @@
+{"name":"expo-magnetometer","kind":1,"children":[{"name":"default","kind":128,"comment":{"summary":[{"kind":"text","text":"A base class for subscribable sensors. The events emitted by this class are measurements\nspecified by the parameter type "},{"kind":"code","text":"`Measurement`"},{"kind":"text","text":"."}]},"children":[{"name":"constructor","kind":512,"signatures":[{"name":"new default","kind":16384,"typeParameter":[{"name":"Measurement","kind":131072}],"parameters":[{"name":"nativeSensorModule","kind":32768,"type":{"type":"intrinsic","name":"any"}},{"name":"nativeEventName","kind":32768,"type":{"type":"intrinsic","name":"string"}}],"type":{"type":"reference","typeArguments":[{"type":"reference","name":"Measurement"}],"name":"default"}}]},{"name":"_listenerCount","kind":1024,"type":{"type":"intrinsic","name":"number"}},{"name":"_nativeEmitter","kind":1024,"type":{"type":"reference","name":"EventEmitter"}},{"name":"_nativeEventName","kind":1024,"type":{"type":"intrinsic","name":"string"}},{"name":"_nativeModule","kind":1024,"type":{"type":"intrinsic","name":"any"}},{"name":"addListener","kind":2048,"signatures":[{"name":"addListener","kind":4096,"parameters":[{"name":"listener","kind":32768,"type":{"type":"reference","typeArguments":[{"type":"reference","name":"Measurement"}],"name":"Listener"}}],"type":{"type":"reference","name":"Subscription"}}]},{"name":"getListenerCount","kind":2048,"signatures":[{"name":"getListenerCount","kind":4096,"comment":{"summary":[{"kind":"text","text":"Returns the registered listeners count."}]},"type":{"type":"intrinsic","name":"number"}}]},{"name":"getPermissionsAsync","kind":2048,"signatures":[{"name":"getPermissionsAsync","kind":4096,"comment":{"summary":[{"kind":"text","text":"Checks user's permissions for accessing sensor."}]},"type":{"type":"reference","typeArguments":[{"type":"reference","name":"PermissionResponse"}],"name":"Promise","qualifiedName":"Promise","package":"typescript"}}]},{"name":"hasListeners","kind":2048,"signatures":[{"name":"hasListeners","kind":4096,"comment":{"summary":[{"kind":"text","text":"Returns boolean which signifies if sensor has any listeners registered."}]},"type":{"type":"intrinsic","name":"boolean"}}]},{"name":"isAvailableAsync","kind":2048,"signatures":[{"name":"isAvailableAsync","kind":4096,"comment":{"summary":[{"kind":"text","text":"> **info** You should always check the sensor availability before attempting to use it."}],"blockTags":[{"tag":"@returns","content":[{"kind":"text","text":"A promise that resolves to a "},{"kind":"code","text":"`boolean`"},{"kind":"text","text":" denoting the availability of the sensor."}]}]},"type":{"type":"reference","typeArguments":[{"type":"intrinsic","name":"boolean"}],"name":"Promise","qualifiedName":"Promise","package":"typescript"}}]},{"name":"removeAllListeners","kind":2048,"signatures":[{"name":"removeAllListeners","kind":4096,"comment":{"summary":[{"kind":"text","text":"Removes all registered listeners."}]},"type":{"type":"intrinsic","name":"void"}}]},{"name":"removeSubscription","kind":2048,"signatures":[{"name":"removeSubscription","kind":4096,"comment":{"summary":[{"kind":"text","text":"Removes the given subscription."}]},"parameters":[{"name":"subscription","kind":32768,"comment":{"summary":[{"kind":"text","text":"A subscription to remove."}]},"type":{"type":"reference","name":"Subscription"}}],"type":{"type":"intrinsic","name":"void"}}]},{"name":"requestPermissionsAsync","kind":2048,"signatures":[{"name":"requestPermissionsAsync","kind":4096,"comment":{"summary":[{"kind":"text","text":"Asks the user to grant permissions for accessing sensor."}]},"type":{"type":"reference","typeArguments":[{"type":"reference","name":"PermissionResponse"}],"name":"Promise","qualifiedName":"Promise","package":"typescript"}}]},{"name":"setUpdateInterval","kind":2048,"signatures":[{"name":"setUpdateInterval","kind":4096,"comment":{"summary":[{"kind":"text","text":"Set the sensor update interval."}]},"parameters":[{"name":"intervalMs","kind":32768,"comment":{"summary":[{"kind":"text","text":"Desired interval in milliseconds between sensor updates.\n> Starting from Android 12 (API level 31), the system has a 200ms limit for each sensor updates.\n>\n> If you need an update interval less than 200ms, you should:\n> * add "},{"kind":"code","text":"`android.permission.HIGH_SAMPLING_RATE_SENSORS`"},{"kind":"text","text":" to [**app.json** "},{"kind":"code","text":"`permissions`"},{"kind":"text","text":" field](/versions/latest/config/app/#permissions)\n> * or if you are using bare workflow, add "},{"kind":"code","text":"``"},{"kind":"text","text":" to **AndroidManifest.xml**."}]},"type":{"type":"intrinsic","name":"number"}}],"type":{"type":"intrinsic","name":"void"}}]}],"typeParameters":[{"name":"Measurement","kind":131072}],"extendedBy":[{"type":"reference","name":"MagnetometerSensor"}]},{"name":"default","kind":32,"type":{"type":"reference","name":"MagnetometerSensor"}},{"name":"MagnetometerMeasurement","kind":4194304,"comment":{"summary":[{"kind":"text","text":"Each of these keys represents the strength of magnetic field along that particular axis measured in microteslas ("},{"kind":"code","text":"`μT`"},{"kind":"text","text":")."}]},"type":{"type":"reflection","declaration":{"name":"__type","kind":65536,"children":[{"name":"x","kind":1024,"comment":{"summary":[{"kind":"text","text":"Value representing strength of magnetic field recorded in X axis."}]},"type":{"type":"intrinsic","name":"number"}},{"name":"y","kind":1024,"comment":{"summary":[{"kind":"text","text":"Value representing strength of magnetic field recorded in Y axis."}]},"type":{"type":"intrinsic","name":"number"}},{"name":"z","kind":1024,"comment":{"summary":[{"kind":"text","text":"Value representing strength of magnetic field recorded in Z axis."}]},"type":{"type":"intrinsic","name":"number"}}]}}},{"name":"MagnetometerSensor","kind":128,"comment":{"summary":[],"blockTags":[{"tag":"@platform","content":[{"kind":"text","text":"android"}]},{"tag":"@platform","content":[{"kind":"text","text":"ios"}]}]},"children":[{"name":"constructor","kind":512,"signatures":[{"name":"new MagnetometerSensor","kind":16384,"parameters":[{"name":"nativeSensorModule","kind":32768,"type":{"type":"intrinsic","name":"any"}},{"name":"nativeEventName","kind":32768,"type":{"type":"intrinsic","name":"string"}}],"type":{"type":"reference","name":"MagnetometerSensor"},"inheritedFrom":{"type":"reference","name":"default.constructor"}}],"inheritedFrom":{"type":"reference","name":"default.constructor"}},{"name":"_listenerCount","kind":1024,"type":{"type":"intrinsic","name":"number"},"inheritedFrom":{"type":"reference","name":"default._listenerCount"}},{"name":"_nativeEmitter","kind":1024,"type":{"type":"reference","name":"EventEmitter"},"inheritedFrom":{"type":"reference","name":"default._nativeEmitter"}},{"name":"_nativeEventName","kind":1024,"type":{"type":"intrinsic","name":"string"},"inheritedFrom":{"type":"reference","name":"default._nativeEventName"}},{"name":"_nativeModule","kind":1024,"type":{"type":"intrinsic","name":"any"},"inheritedFrom":{"type":"reference","name":"default._nativeModule"}},{"name":"addListener","kind":2048,"signatures":[{"name":"addListener","kind":4096,"comment":{"summary":[{"kind":"text","text":"Subscribe for updates to the magnetometer."}],"blockTags":[{"tag":"@returns","content":[{"kind":"text","text":"A subscription that you can call "},{"kind":"code","text":"`remove()`"},{"kind":"text","text":" on when you would like to unsubscribe the listener."}]}]},"parameters":[{"name":"listener","kind":32768,"comment":{"summary":[{"kind":"text","text":"A callback that is invoked when a barometer update is available. When invoked, the listener is provided with a single argument that is "},{"kind":"code","text":"`MagnetometerMeasurement`"},{"kind":"text","text":"."}]},"type":{"type":"reference","typeArguments":[{"type":"reference","name":"MagnetometerMeasurement"}],"name":"Listener"}}],"type":{"type":"reference","name":"Subscription"},"overwrites":{"type":"reference","name":"default.addListener"}}],"overwrites":{"type":"reference","name":"default.addListener"}},{"name":"getListenerCount","kind":2048,"signatures":[{"name":"getListenerCount","kind":4096,"comment":{"summary":[{"kind":"text","text":"Returns the registered listeners count."}]},"type":{"type":"intrinsic","name":"number"},"inheritedFrom":{"type":"reference","name":"default.getListenerCount"}}],"inheritedFrom":{"type":"reference","name":"default.getListenerCount"}},{"name":"getPermissionsAsync","kind":2048,"signatures":[{"name":"getPermissionsAsync","kind":4096,"comment":{"summary":[{"kind":"text","text":"Checks user's permissions for accessing sensor."}]},"type":{"type":"reference","typeArguments":[{"type":"reference","name":"PermissionResponse"}],"name":"Promise","qualifiedName":"Promise","package":"typescript"},"inheritedFrom":{"type":"reference","name":"default.getPermissionsAsync"}}],"inheritedFrom":{"type":"reference","name":"default.getPermissionsAsync"}},{"name":"hasListeners","kind":2048,"signatures":[{"name":"hasListeners","kind":4096,"comment":{"summary":[{"kind":"text","text":"Returns boolean which signifies if sensor has any listeners registered."}]},"type":{"type":"intrinsic","name":"boolean"},"inheritedFrom":{"type":"reference","name":"default.hasListeners"}}],"inheritedFrom":{"type":"reference","name":"default.hasListeners"}},{"name":"isAvailableAsync","kind":2048,"signatures":[{"name":"isAvailableAsync","kind":4096,"comment":{"summary":[{"kind":"text","text":"> **info** You should always check the sensor availability before attempting to use it.\n\nCheck the availability of the device magnetometer. Requires at least Android 2.3 (API Level 9) and iOS 8."}],"blockTags":[{"tag":"@returns","content":[{"kind":"text","text":"A promise that resolves to a "},{"kind":"code","text":"`boolean`"},{"kind":"text","text":" denoting the availability of the sensor."}]}]},"type":{"type":"reference","typeArguments":[{"type":"intrinsic","name":"boolean"}],"name":"Promise","qualifiedName":"Promise","package":"typescript"},"overwrites":{"type":"reference","name":"default.isAvailableAsync"}}],"overwrites":{"type":"reference","name":"default.isAvailableAsync"}},{"name":"removeAllListeners","kind":2048,"signatures":[{"name":"removeAllListeners","kind":4096,"comment":{"summary":[{"kind":"text","text":"Removes all registered listeners."}]},"type":{"type":"intrinsic","name":"void"},"inheritedFrom":{"type":"reference","name":"default.removeAllListeners"}}],"inheritedFrom":{"type":"reference","name":"default.removeAllListeners"}},{"name":"removeSubscription","kind":2048,"signatures":[{"name":"removeSubscription","kind":4096,"comment":{"summary":[{"kind":"text","text":"Removes the given subscription."}]},"parameters":[{"name":"subscription","kind":32768,"comment":{"summary":[{"kind":"text","text":"A subscription to remove."}]},"type":{"type":"reference","name":"Subscription"}}],"type":{"type":"intrinsic","name":"void"},"inheritedFrom":{"type":"reference","name":"default.removeSubscription"}}],"inheritedFrom":{"type":"reference","name":"default.removeSubscription"}},{"name":"requestPermissionsAsync","kind":2048,"signatures":[{"name":"requestPermissionsAsync","kind":4096,"comment":{"summary":[{"kind":"text","text":"Asks the user to grant permissions for accessing sensor."}]},"type":{"type":"reference","typeArguments":[{"type":"reference","name":"PermissionResponse"}],"name":"Promise","qualifiedName":"Promise","package":"typescript"},"inheritedFrom":{"type":"reference","name":"default.requestPermissionsAsync"}}],"inheritedFrom":{"type":"reference","name":"default.requestPermissionsAsync"}},{"name":"setUpdateInterval","kind":2048,"signatures":[{"name":"setUpdateInterval","kind":4096,"comment":{"summary":[{"kind":"text","text":"Set the sensor update interval."}]},"parameters":[{"name":"intervalMs","kind":32768,"comment":{"summary":[{"kind":"text","text":"Desired interval in milliseconds between sensor updates.\n> Starting from Android 12 (API level 31), the system has a 200ms limit for each sensor updates.\n>\n> If you need an update interval less than 200ms, you should:\n> * add "},{"kind":"code","text":"`android.permission.HIGH_SAMPLING_RATE_SENSORS`"},{"kind":"text","text":" to [**app.json** "},{"kind":"code","text":"`permissions`"},{"kind":"text","text":" field](/versions/latest/config/app/#permissions)\n> * or if you are using bare workflow, add "},{"kind":"code","text":"``"},{"kind":"text","text":" to **AndroidManifest.xml**."}]},"type":{"type":"intrinsic","name":"number"}}],"type":{"type":"intrinsic","name":"void"},"inheritedFrom":{"type":"reference","name":"default.setUpdateInterval"}}],"inheritedFrom":{"type":"reference","name":"default.setUpdateInterval"}}],"extendedTypes":[{"type":"reference","typeArguments":[{"type":"reference","name":"MagnetometerMeasurement"}],"name":"default"}]},{"name":"PermissionExpiration","kind":4194304,"comment":{"summary":[{"kind":"text","text":"Permission expiration time. Currently, all permissions are granted permanently."}]},"type":{"type":"union","types":[{"type":"literal","value":"never"},{"type":"intrinsic","name":"number"}]}},{"name":"PermissionResponse","kind":256,"comment":{"summary":[{"kind":"text","text":"An object obtained by permissions get and request functions."}]},"children":[{"name":"canAskAgain","kind":1024,"comment":{"summary":[{"kind":"text","text":"Indicates if user can be asked again for specific permission.\nIf not, one should be directed to the Settings app\nin order to enable/disable the permission."}]},"type":{"type":"intrinsic","name":"boolean"}},{"name":"expires","kind":1024,"comment":{"summary":[{"kind":"text","text":"Determines time when the permission expires."}]},"type":{"type":"reference","name":"PermissionExpiration"}},{"name":"granted","kind":1024,"comment":{"summary":[{"kind":"text","text":"A convenience boolean that indicates if the permission is granted."}]},"type":{"type":"intrinsic","name":"boolean"}},{"name":"status","kind":1024,"comment":{"summary":[{"kind":"text","text":"Determines the status of the permission."}]},"type":{"type":"reference","name":"PermissionStatus"}}]},{"name":"PermissionStatus","kind":8,"children":[{"name":"DENIED","kind":16,"comment":{"summary":[{"kind":"text","text":"User has denied the permission."}]},"type":{"type":"literal","value":"denied"}},{"name":"GRANTED","kind":16,"comment":{"summary":[{"kind":"text","text":"User has granted the permission."}]},"type":{"type":"literal","value":"granted"}},{"name":"UNDETERMINED","kind":16,"comment":{"summary":[{"kind":"text","text":"User hasn't granted or denied the permission yet."}]},"type":{"type":"literal","value":"undetermined"}}]},{"name":"Subscription","kind":4194304,"type":{"type":"reflection","declaration":{"name":"__type","kind":65536,"children":[{"name":"remove","kind":1024,"type":{"type":"reflection","declaration":{"name":"__type","kind":65536,"signatures":[{"name":"__type","kind":4096,"comment":{"summary":[{"kind":"text","text":"A method to unsubscribe the listener."}]},"type":{"type":"intrinsic","name":"void"}}]}}}]}}}]}
\ No newline at end of file
diff --git a/docs/public/static/data/v49.0.0/expo-mail-composer.json b/docs/public/static/data/v49.0.0/expo-mail-composer.json
new file mode 100644
index 0000000000000..95b97780ed259
--- /dev/null
+++ b/docs/public/static/data/v49.0.0/expo-mail-composer.json
@@ -0,0 +1 @@
+{"name":"expo-mail-composer","kind":1,"children":[{"name":"MailComposerStatus","kind":8,"children":[{"name":"CANCELLED","kind":16,"type":{"type":"literal","value":"cancelled"}},{"name":"SAVED","kind":16,"type":{"type":"literal","value":"saved"}},{"name":"SENT","kind":16,"type":{"type":"literal","value":"sent"}},{"name":"UNDETERMINED","kind":16,"type":{"type":"literal","value":"undetermined"}}]},{"name":"MailComposerOptions","kind":4194304,"comment":{"summary":[{"kind":"text","text":"A map defining the data to fill the mail."}]},"type":{"type":"reflection","declaration":{"name":"__type","kind":65536,"children":[{"name":"attachments","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"An array of app's internal file URIs to attach."}]},"type":{"type":"array","elementType":{"type":"intrinsic","name":"string"}}},{"name":"bccRecipients","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"An array of e-mail addresses of the BCC recipients."}]},"type":{"type":"array","elementType":{"type":"intrinsic","name":"string"}}},{"name":"body","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"Body of the e-mail."}]},"type":{"type":"intrinsic","name":"string"}},{"name":"ccRecipients","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"An array of e-mail addresses of the CC recipients."}]},"type":{"type":"array","elementType":{"type":"intrinsic","name":"string"}}},{"name":"isHtml","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"Whether the body contains HTML tags so it could be formatted properly.\nNot working perfectly on Android."}]},"type":{"type":"intrinsic","name":"boolean"}},{"name":"recipients","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"An array of e-mail addresses of the recipients."}]},"type":{"type":"array","elementType":{"type":"intrinsic","name":"string"}}},{"name":"subject","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"Subject of the e-mail."}]},"type":{"type":"intrinsic","name":"string"}}]}}},{"name":"MailComposerResult","kind":4194304,"type":{"type":"reflection","declaration":{"name":"__type","kind":65536,"children":[{"name":"status","kind":1024,"type":{"type":"reference","name":"MailComposerStatus"}}]}}},{"name":"composeAsync","kind":64,"signatures":[{"name":"composeAsync","kind":4096,"comment":{"summary":[{"kind":"text","text":"Opens a mail modal for iOS and a mail app intent for Android and fills the fields with provided\ndata. On iOS you will need to be signed into the Mail app."}],"blockTags":[{"tag":"@returns","content":[{"kind":"text","text":"A promise fulfilled with an object containing a "},{"kind":"code","text":"`status`"},{"kind":"text","text":" field that specifies whether an\nemail was sent, saved, or cancelled. Android does not provide this info, so the status is always\nset as if the email were sent."}]}]},"parameters":[{"name":"options","kind":32768,"type":{"type":"reference","name":"MailComposerOptions"}}],"type":{"type":"reference","typeArguments":[{"type":"reference","name":"MailComposerResult"}],"name":"Promise","qualifiedName":"Promise","package":"typescript"}}]},{"name":"isAvailableAsync","kind":64,"signatures":[{"name":"isAvailableAsync","kind":4096,"comment":{"summary":[{"kind":"text","text":"Determine if the "},{"kind":"code","text":"`MailComposer`"},{"kind":"text","text":" API can be used in this app."}],"blockTags":[{"tag":"@returns","content":[{"kind":"text","text":"A promise resolves to "},{"kind":"code","text":"`true`"},{"kind":"text","text":" if the API can be used, and "},{"kind":"code","text":"`false`"},{"kind":"text","text":" otherwise.\n- Returns "},{"kind":"code","text":"`true`"},{"kind":"text","text":" on iOS when the device has a default email setup for sending mail.\n- Can return "},{"kind":"code","text":"`false`"},{"kind":"text","text":" on iOS if an MDM profile is setup to block outgoing mail. If this is the\ncase, you may want to use the Linking API instead.\n- Always returns "},{"kind":"code","text":"`true`"},{"kind":"text","text":" in the browser and on Android."}]}]},"type":{"type":"reference","typeArguments":[{"type":"intrinsic","name":"boolean"}],"name":"Promise","qualifiedName":"Promise","package":"typescript"}}]}]}
\ No newline at end of file
diff --git a/docs/public/static/data/v49.0.0/expo-media-library.json b/docs/public/static/data/v49.0.0/expo-media-library.json
new file mode 100644
index 0000000000000..fd7b94ff4baf3
--- /dev/null
+++ b/docs/public/static/data/v49.0.0/expo-media-library.json
@@ -0,0 +1 @@
+{"name":"expo-media-library","kind":1,"children":[{"name":"PermissionStatus","kind":8,"children":[{"name":"DENIED","kind":16,"comment":{"summary":[{"kind":"text","text":"User has denied the permission."}]},"type":{"type":"literal","value":"denied"}},{"name":"GRANTED","kind":16,"comment":{"summary":[{"kind":"text","text":"User has granted the permission."}]},"type":{"type":"literal","value":"granted"}},{"name":"UNDETERMINED","kind":16,"comment":{"summary":[{"kind":"text","text":"User hasn't granted or denied the permission yet."}]},"type":{"type":"literal","value":"undetermined"}}]},{"name":"EXPermissionResponse","kind":256,"comment":{"summary":[{"kind":"text","text":"An object obtained by permissions get and request functions."}]},"children":[{"name":"canAskAgain","kind":1024,"comment":{"summary":[{"kind":"text","text":"Indicates if user can be asked again for specific permission.\nIf not, one should be directed to the Settings app\nin order to enable/disable the permission."}]},"type":{"type":"intrinsic","name":"boolean"}},{"name":"expires","kind":1024,"comment":{"summary":[{"kind":"text","text":"Determines time when the permission expires."}]},"type":{"type":"reference","name":"PermissionExpiration"}},{"name":"granted","kind":1024,"comment":{"summary":[{"kind":"text","text":"A convenience boolean that indicates if the permission is granted."}]},"type":{"type":"intrinsic","name":"boolean"}},{"name":"status","kind":1024,"comment":{"summary":[{"kind":"text","text":"Determines the status of the permission."}]},"type":{"type":"reference","name":"PermissionStatus"}}]},{"name":"Album","kind":4194304,"type":{"type":"reflection","declaration":{"name":"__type","kind":65536,"children":[{"name":"approximateLocation","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"Apply only to albums whose type is "},{"kind":"code","text":"`'moment'`"},{"kind":"text","text":". Approximated location of all\nassets in the moment."}],"blockTags":[{"tag":"@platform","content":[{"kind":"text","text":"ios"}]}]},"type":{"type":"reference","name":"Location"}},{"name":"assetCount","kind":1024,"comment":{"summary":[{"kind":"text","text":"Estimated number of assets in the album."}]},"type":{"type":"intrinsic","name":"number"}},{"name":"endTime","kind":1024,"comment":{"summary":[{"kind":"text","text":"Apply only to albums whose type is "},{"kind":"code","text":"`'moment'`"},{"kind":"text","text":". Latest creation timestamp of all\nassets in the moment."}],"blockTags":[{"tag":"@platform","content":[{"kind":"text","text":"ios"}]}]},"type":{"type":"intrinsic","name":"number"}},{"name":"id","kind":1024,"comment":{"summary":[{"kind":"text","text":"Album ID."}]},"type":{"type":"intrinsic","name":"string"}},{"name":"locationNames","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"Apply only to albums whose type is "},{"kind":"code","text":"`'moment'`"},{"kind":"text","text":". Names of locations grouped\nin the moment."}],"blockTags":[{"tag":"@platform","content":[{"kind":"text","text":"ios"}]}]},"type":{"type":"array","elementType":{"type":"intrinsic","name":"string"}}},{"name":"startTime","kind":1024,"comment":{"summary":[{"kind":"text","text":"Apply only to albums whose type is "},{"kind":"code","text":"`'moment'`"},{"kind":"text","text":". Earliest creation timestamp of all\nassets in the moment."}],"blockTags":[{"tag":"@platform","content":[{"kind":"text","text":"ios"}]}]},"type":{"type":"intrinsic","name":"number"}},{"name":"title","kind":1024,"comment":{"summary":[{"kind":"text","text":"Album title."}]},"type":{"type":"intrinsic","name":"string"}},{"name":"type","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"The type of the assets album."}],"blockTags":[{"tag":"@platform","content":[{"kind":"text","text":"ios"}]}]},"type":{"type":"reference","name":"AlbumType"}}]}}},{"name":"AlbumRef","kind":4194304,"type":{"type":"union","types":[{"type":"reference","name":"Album"},{"type":"intrinsic","name":"string"}]}},{"name":"AlbumType","kind":4194304,"type":{"type":"union","types":[{"type":"literal","value":"album"},{"type":"literal","value":"moment"},{"type":"literal","value":"smartAlbum"}]}},{"name":"AlbumsOptions","kind":4194304,"type":{"type":"reflection","declaration":{"name":"__type","kind":65536,"children":[{"name":"includeSmartAlbums","kind":1024,"flags":{"isOptional":true},"type":{"type":"intrinsic","name":"boolean"}}]}}},{"name":"Asset","kind":4194304,"type":{"type":"reflection","declaration":{"name":"__type","kind":65536,"children":[{"name":"albumId","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"Album ID that the asset belongs to."}],"blockTags":[{"tag":"@platform","content":[{"kind":"text","text":"android"}]}]},"type":{"type":"intrinsic","name":"string"}},{"name":"creationTime","kind":1024,"comment":{"summary":[{"kind":"text","text":"File creation timestamp."}]},"type":{"type":"intrinsic","name":"number"}},{"name":"duration","kind":1024,"comment":{"summary":[{"kind":"text","text":"Duration of the video or audio asset in seconds."}]},"type":{"type":"intrinsic","name":"number"}},{"name":"filename","kind":1024,"comment":{"summary":[{"kind":"text","text":"Filename of the asset."}]},"type":{"type":"intrinsic","name":"string"}},{"name":"height","kind":1024,"comment":{"summary":[{"kind":"text","text":"Height of the image or video."}]},"type":{"type":"intrinsic","name":"number"}},{"name":"id","kind":1024,"comment":{"summary":[{"kind":"text","text":"Internal ID that represents an asset."}]},"type":{"type":"intrinsic","name":"string"}},{"name":"mediaSubtypes","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"An array of media subtypes."}],"blockTags":[{"tag":"@platform","content":[{"kind":"text","text":"ios"}]}]},"type":{"type":"array","elementType":{"type":"reference","name":"MediaSubtype"}}},{"name":"mediaType","kind":1024,"comment":{"summary":[{"kind":"text","text":"Media type."}]},"type":{"type":"reference","name":"MediaTypeValue"}},{"name":"modificationTime","kind":1024,"comment":{"summary":[{"kind":"text","text":"Last modification timestamp."}]},"type":{"type":"intrinsic","name":"number"}},{"name":"uri","kind":1024,"comment":{"summary":[{"kind":"text","text":"URI that points to the asset. "},{"kind":"code","text":"`assets://*`"},{"kind":"text","text":" (iOS), "},{"kind":"code","text":"`file://*`"},{"kind":"text","text":" (Android)"}]},"type":{"type":"intrinsic","name":"string"}},{"name":"width","kind":1024,"comment":{"summary":[{"kind":"text","text":"Width of the image or video."}]},"type":{"type":"intrinsic","name":"number"}}]}}},{"name":"AssetInfo","kind":4194304,"type":{"type":"intersection","types":[{"type":"reference","name":"Asset"},{"type":"reflection","declaration":{"name":"__type","kind":65536,"children":[{"name":"exif","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"EXIF metadata associated with the image."}]},"type":{"type":"intrinsic","name":"object"}},{"name":"isFavorite","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"Whether the asset is marked as favorite."}],"blockTags":[{"tag":"@platform","content":[{"kind":"text","text":"ios"}]}]},"type":{"type":"intrinsic","name":"boolean"}},{"name":"isNetworkAsset","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"This field is available only if flag "},{"kind":"code","text":"`shouldDownloadFromNetwork`"},{"kind":"text","text":" is set to "},{"kind":"code","text":"`false`"},{"kind":"text","text":".\nWhether the asset is stored on the network (iCloud on iOS)."}],"blockTags":[{"tag":"@platform","content":[{"kind":"text","text":"ios"}]}]},"type":{"type":"intrinsic","name":"boolean"}},{"name":"localUri","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"Local URI for the asset."}]},"type":{"type":"intrinsic","name":"string"}},{"name":"location","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"GPS location if available."}]},"type":{"type":"reference","name":"Location"}},{"name":"orientation","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"Display orientation of the image. Orientation is available only for assets whose\n"},{"kind":"code","text":"`mediaType`"},{"kind":"text","text":" is "},{"kind":"code","text":"`MediaType.photo`"},{"kind":"text","text":". Value will range from 1 to 8, see [EXIF orientation specification](http://sylvana.net/jpegcrop/exif_orientation.html)\nfor more details."}],"blockTags":[{"tag":"@platform","content":[{"kind":"text","text":"ios"}]}]},"type":{"type":"intrinsic","name":"number"}}]}}]}},{"name":"AssetRef","kind":4194304,"type":{"type":"union","types":[{"type":"reference","name":"Asset"},{"type":"intrinsic","name":"string"}]}},{"name":"AssetsOptions","kind":4194304,"type":{"type":"reflection","declaration":{"name":"__type","kind":65536,"children":[{"name":"after","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"Asset ID of the last item returned on the previous page."}]},"type":{"type":"reference","name":"AssetRef"}},{"name":"album","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"[Album](#album) or its ID to get assets from specific album."}]},"type":{"type":"reference","name":"AlbumRef"}},{"name":"createdAfter","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"code","text":"`Date`"},{"kind":"text","text":" object or Unix timestamp in milliseconds limiting returned assets only to those that\nwere created after this date."}]},"type":{"type":"union","types":[{"type":"reference","name":"Date","qualifiedName":"Date","package":"typescript"},{"type":"intrinsic","name":"number"}]}},{"name":"createdBefore","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"Similarly as "},{"kind":"code","text":"`createdAfter`"},{"kind":"text","text":", but limits assets only to those that were created before specified\ndate."}]},"type":{"type":"union","types":[{"type":"reference","name":"Date","qualifiedName":"Date","package":"typescript"},{"type":"intrinsic","name":"number"}]}},{"name":"first","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"The maximum number of items on a single page."}],"blockTags":[{"tag":"@default","content":[{"kind":"text","text":"20"}]}]},"type":{"type":"intrinsic","name":"number"}},{"name":"mediaType","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"An array of [MediaTypeValue](#expomedialibrarymediatypevalue)s or a single "},{"kind":"code","text":"`MediaTypeValue`"},{"kind":"text","text":"."}],"blockTags":[{"tag":"@default","content":[{"kind":"text","text":"MediaType.photo"}]}]},"type":{"type":"union","types":[{"type":"array","elementType":{"type":"reference","name":"MediaTypeValue"}},{"type":"reference","name":"MediaTypeValue"}]}},{"name":"sortBy","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"An array of ["},{"kind":"code","text":"`SortByValue`"},{"kind":"text","text":"](#sortbyvalue)s or a single "},{"kind":"code","text":"`SortByValue`"},{"kind":"text","text":" value. By default, all\nkeys are sorted in descending order, however you can also pass a pair "},{"kind":"code","text":"`[key, ascending]`"},{"kind":"text","text":" where\nthe second item is a "},{"kind":"code","text":"`boolean`"},{"kind":"text","text":" value that means whether to use ascending order. Note that if\nthe "},{"kind":"code","text":"`SortBy.default`"},{"kind":"text","text":" key is used, then "},{"kind":"code","text":"`ascending`"},{"kind":"text","text":" argument will not matter. Earlier items have\nhigher priority when sorting out the results.\nIf empty, this method will use the default sorting that is provided by the platform."}]},"type":{"type":"union","types":[{"type":"array","elementType":{"type":"reference","name":"SortByValue"}},{"type":"reference","name":"SortByValue"}]}}]}}},{"name":"Location","kind":4194304,"type":{"type":"reflection","declaration":{"name":"__type","kind":65536,"children":[{"name":"latitude","kind":1024,"type":{"type":"intrinsic","name":"number"}},{"name":"longitude","kind":1024,"type":{"type":"intrinsic","name":"number"}}]}}},{"name":"MediaLibraryAssetInfoQueryOptions","kind":4194304,"type":{"type":"reflection","declaration":{"name":"__type","kind":65536,"children":[{"name":"shouldDownloadFromNetwork","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"Whether allow the asset to be downloaded from network. Only available in iOS with iCloud assets."}],"blockTags":[{"tag":"@default","content":[{"kind":"text","text":"true"}]}]},"type":{"type":"intrinsic","name":"boolean"}}]}}},{"name":"MediaLibraryAssetsChangeEvent","kind":4194304,"type":{"type":"reflection","declaration":{"name":"__type","kind":65536,"children":[{"name":"deletedAssets","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"Available only if "},{"kind":"code","text":"`hasIncrementalChanges`"},{"kind":"text","text":" is "},{"kind":"code","text":"`true`"},{"kind":"text","text":".\nArray of ["},{"kind":"code","text":"`Asset`"},{"kind":"text","text":"](#asset)s that have been deleted from the library."}]},"type":{"type":"array","elementType":{"type":"reference","name":"Asset"}}},{"name":"hasIncrementalChanges","kind":1024,"comment":{"summary":[{"kind":"text","text":"Whether the media library's changes could be described as \"incremental changes\".\n"},{"kind":"code","text":"`true`"},{"kind":"text","text":" indicates the changes are described by the "},{"kind":"code","text":"`insertedAssets`"},{"kind":"text","text":", "},{"kind":"code","text":"`deletedAssets`"},{"kind":"text","text":" and\n"},{"kind":"code","text":"`updatedAssets`"},{"kind":"text","text":" values. "},{"kind":"code","text":"`false`"},{"kind":"text","text":" indicates that the scope of changes is too large and you\nshould perform a full assets reload (eg. a user has changed access to individual assets in the\nmedia library)."}]},"type":{"type":"intrinsic","name":"boolean"}},{"name":"insertedAssets","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"Available only if "},{"kind":"code","text":"`hasIncrementalChanges`"},{"kind":"text","text":" is "},{"kind":"code","text":"`true`"},{"kind":"text","text":".\nArray of ["},{"kind":"code","text":"`Asset`"},{"kind":"text","text":"](#asset)s that have been inserted to the library."}]},"type":{"type":"array","elementType":{"type":"reference","name":"Asset"}}},{"name":"updatedAssets","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"Available only if "},{"kind":"code","text":"`hasIncrementalChanges`"},{"kind":"text","text":" is "},{"kind":"code","text":"`true`"},{"kind":"text","text":".\nArray of ["},{"kind":"code","text":"`Asset`"},{"kind":"text","text":"](#asset)s that have been updated or completed downloading from network\nstorage (iCloud on iOS)."}]},"type":{"type":"array","elementType":{"type":"reference","name":"Asset"}}}]}}},{"name":"MediaSubtype","kind":4194304,"type":{"type":"union","types":[{"type":"literal","value":"depthEffect"},{"type":"literal","value":"hdr"},{"type":"literal","value":"highFrameRate"},{"type":"literal","value":"livePhoto"},{"type":"literal","value":"panorama"},{"type":"literal","value":"screenshot"},{"type":"literal","value":"stream"},{"type":"literal","value":"timelapse"}]}},{"name":"MediaTypeObject","kind":4194304,"type":{"type":"reflection","declaration":{"name":"__type","kind":65536,"children":[{"name":"audio","kind":1024,"type":{"type":"literal","value":"audio"}},{"name":"photo","kind":1024,"type":{"type":"literal","value":"photo"}},{"name":"unknown","kind":1024,"type":{"type":"literal","value":"unknown"}},{"name":"video","kind":1024,"type":{"type":"literal","value":"video"}}]}}},{"name":"MediaTypeValue","kind":4194304,"type":{"type":"union","types":[{"type":"literal","value":"audio"},{"type":"literal","value":"photo"},{"type":"literal","value":"video"},{"type":"literal","value":"unknown"}]}},{"name":"PagedInfo","kind":4194304,"typeParameters":[{"name":"T","kind":131072}],"type":{"type":"reflection","declaration":{"name":"__type","kind":65536,"children":[{"name":"assets","kind":1024,"comment":{"summary":[{"kind":"text","text":"A page of ["},{"kind":"code","text":"`Asset`"},{"kind":"text","text":"](#asset)s fetched by the query."}]},"type":{"type":"array","elementType":{"type":"reference","name":"T"}}},{"name":"endCursor","kind":1024,"comment":{"summary":[{"kind":"text","text":"ID of the last fetched asset. It should be passed as "},{"kind":"code","text":"`after`"},{"kind":"text","text":" option in order to get the\nnext page."}]},"type":{"type":"intrinsic","name":"string"}},{"name":"hasNextPage","kind":1024,"comment":{"summary":[{"kind":"text","text":"Whether there are more assets to fetch."}]},"type":{"type":"intrinsic","name":"boolean"}},{"name":"totalCount","kind":1024,"comment":{"summary":[{"kind":"text","text":"Estimated total number of assets that match the query."}]},"type":{"type":"intrinsic","name":"number"}}]}}},{"name":"PermissionExpiration","kind":4194304,"comment":{"summary":[{"kind":"text","text":"Permission expiration time. Currently, all permissions are granted permanently."}]},"type":{"type":"union","types":[{"type":"literal","value":"never"},{"type":"intrinsic","name":"number"}]}},{"name":"PermissionHookOptions","kind":4194304,"typeParameters":[{"name":"Options","kind":131072,"type":{"type":"intrinsic","name":"object"}}],"type":{"type":"intersection","types":[{"type":"reference","name":"PermissionHookBehavior"},{"type":"reference","name":"Options"}]}},{"name":"PermissionResponse","kind":4194304,"type":{"type":"intersection","types":[{"type":"reference","name":"EXPermissionResponse"},{"type":"reflection","declaration":{"name":"__type","kind":65536,"children":[{"name":"accessPrivileges","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"Indicates if your app has access to the whole or only part of the photo library. Possible values are:\n- "},{"kind":"code","text":"`'all'`"},{"kind":"text","text":" if the user granted your app access to the whole photo library\n- "},{"kind":"code","text":"`'limited'`"},{"kind":"text","text":" if the user granted your app access only to selected photos (only available on iOS 14.0+)\n- "},{"kind":"code","text":"`'none'`"},{"kind":"text","text":" if user denied or hasn't yet granted the permission"}]},"type":{"type":"union","types":[{"type":"literal","value":"all"},{"type":"literal","value":"limited"},{"type":"literal","value":"none"}]}}]}}]}},{"name":"SortByKey","kind":4194304,"type":{"type":"union","types":[{"type":"literal","value":"default"},{"type":"literal","value":"mediaType"},{"type":"literal","value":"width"},{"type":"literal","value":"height"},{"type":"literal","value":"creationTime"},{"type":"literal","value":"modificationTime"},{"type":"literal","value":"duration"}]}},{"name":"SortByObject","kind":4194304,"type":{"type":"reflection","declaration":{"name":"__type","kind":65536,"children":[{"name":"creationTime","kind":1024,"type":{"type":"literal","value":"creationTime"}},{"name":"default","kind":1024,"type":{"type":"literal","value":"default"}},{"name":"duration","kind":1024,"type":{"type":"literal","value":"duration"}},{"name":"height","kind":1024,"type":{"type":"literal","value":"height"}},{"name":"mediaType","kind":1024,"type":{"type":"literal","value":"mediaType"}},{"name":"modificationTime","kind":1024,"type":{"type":"literal","value":"modificationTime"}},{"name":"width","kind":1024,"type":{"type":"literal","value":"width"}}]}}},{"name":"SortByValue","kind":4194304,"type":{"type":"union","types":[{"type":"tuple","elements":[{"type":"reference","name":"SortByKey"},{"type":"intrinsic","name":"boolean"}]},{"type":"reference","name":"SortByKey"}]}},{"name":"Subscription","kind":4194304,"type":{"type":"reflection","declaration":{"name":"__type","kind":65536,"children":[{"name":"remove","kind":1024,"type":{"type":"reflection","declaration":{"name":"__type","kind":65536,"signatures":[{"name":"__type","kind":4096,"comment":{"summary":[{"kind":"text","text":"A method to unsubscribe the listener."}]},"type":{"type":"intrinsic","name":"void"}}]}}}]}}},{"name":"MediaType","kind":32,"flags":{"isConst":true},"comment":{"summary":[{"kind":"text","text":"Possible media types."}]},"type":{"type":"reference","name":"MediaTypeObject"},"defaultValue":"MediaLibrary.MediaType"},{"name":"SortBy","kind":32,"flags":{"isConst":true},"comment":{"summary":[{"kind":"text","text":"Supported keys that can be used to sort "},{"kind":"code","text":"`getAssetsAsync`"},{"kind":"text","text":" results."}]},"type":{"type":"reference","name":"SortByObject"},"defaultValue":"MediaLibrary.SortBy"},{"name":"addAssetsToAlbumAsync","kind":64,"signatures":[{"name":"addAssetsToAlbumAsync","kind":4096,"comment":{"summary":[{"kind":"text","text":"Adds array of assets to the album.\n\nOn Android, by default it copies assets from the current album to provided one, however it's also\npossible to move them by passing "},{"kind":"code","text":"`false`"},{"kind":"text","text":" as "},{"kind":"code","text":"`copyAssets`"},{"kind":"text","text":" argument.In case they're copied you\nshould keep in mind that "},{"kind":"code","text":"`getAssetsAsync`"},{"kind":"text","text":" will return duplicated assets."}],"blockTags":[{"tag":"@returns","content":[{"kind":"text","text":"Returns promise which fulfils with "},{"kind":"code","text":"`true`"},{"kind":"text","text":" if the assets were successfully added to\nthe album."}]}]},"parameters":[{"name":"assets","kind":32768,"comment":{"summary":[{"kind":"text","text":"An array of [Asset](#asset) or their IDs."}]},"type":{"type":"union","types":[{"type":"reference","name":"AssetRef"},{"type":"array","elementType":{"type":"reference","name":"AssetRef"}}]}},{"name":"album","kind":32768,"comment":{"summary":[{"kind":"text","text":"An [Album](#album) or its ID."}]},"type":{"type":"reference","name":"AlbumRef"}},{"name":"copy","kind":32768,"comment":{"summary":[{"kind":"text","text":"__Android only.__ Whether to copy assets to the new album instead of move them.\nDefaults to "},{"kind":"code","text":"`true`"},{"kind":"text","text":"."}]},"type":{"type":"intrinsic","name":"boolean"},"defaultValue":"true"}],"type":{"type":"reference","typeArguments":[{"type":"intrinsic","name":"boolean"}],"name":"Promise","qualifiedName":"Promise","package":"typescript"}}]},{"name":"addListener","kind":64,"signatures":[{"name":"addListener","kind":4096,"comment":{"summary":[{"kind":"text","text":"Subscribes for updates in user's media library."}],"blockTags":[{"tag":"@returns","content":[{"kind":"text","text":"An ["},{"kind":"code","text":"`Subscription`"},{"kind":"text","text":"](#subscription) object that you can call "},{"kind":"code","text":"`remove()`"},{"kind":"text","text":" on when you would\nlike to unsubscribe the listener."}]}]},"parameters":[{"name":"listener","kind":32768,"comment":{"summary":[{"kind":"text","text":"A callback that is fired when any assets have been inserted or deleted from the\nlibrary, or when the user changes which assets they're allowing access to. On Android it's\ninvoked with an empty object. On iOS it's invoked with ["},{"kind":"code","text":"`MediaLibraryAssetsChangeEvent`"},{"kind":"text","text":"](#medialibraryassetschangeevent)\nobject."}]},"type":{"type":"reflection","declaration":{"name":"__type","kind":65536,"signatures":[{"name":"__type","kind":4096,"parameters":[{"name":"event","kind":32768,"type":{"type":"reference","name":"MediaLibraryAssetsChangeEvent"}}],"type":{"type":"intrinsic","name":"void"}}]}}}],"type":{"type":"reference","name":"Subscription"}}]},{"name":"albumNeedsMigrationAsync","kind":64,"signatures":[{"name":"albumNeedsMigrationAsync","kind":4096,"comment":{"summary":[{"kind":"text","text":"Checks if the album should be migrated to a different location. In other words, it checks if the\napplication has the write permission to the album folder. If not, it returns "},{"kind":"code","text":"`true`"},{"kind":"text","text":", otherwise "},{"kind":"code","text":"`false`"},{"kind":"text","text":".\n> Note: For **Android below R**, **web** or **iOS**, this function always returns "},{"kind":"code","text":"`false`"},{"kind":"text","text":"."}],"blockTags":[{"tag":"@returns","content":[{"kind":"text","text":"Returns a promise which fulfils with "},{"kind":"code","text":"`true`"},{"kind":"text","text":" if the album should be migrated."}]}]},"parameters":[{"name":"album","kind":32768,"comment":{"summary":[{"kind":"text","text":"An [Album](#album) or its ID."}]},"type":{"type":"reference","name":"AlbumRef"}}],"type":{"type":"reference","typeArguments":[{"type":"intrinsic","name":"boolean"}],"name":"Promise","qualifiedName":"Promise","package":"typescript"}}]},{"name":"createAlbumAsync","kind":64,"signatures":[{"name":"createAlbumAsync","kind":4096,"comment":{"summary":[{"kind":"text","text":"Creates an album with given name and initial asset. The asset parameter is required on Android,\nsince it's not possible to create empty album on this platform. On Android, by default it copies\ngiven asset from the current album to the new one, however it's also possible to move it by\npassing "},{"kind":"code","text":"`false`"},{"kind":"text","text":" as "},{"kind":"code","text":"`copyAsset`"},{"kind":"text","text":" argument.\nIn case it's copied you should keep in mind that "},{"kind":"code","text":"`getAssetsAsync`"},{"kind":"text","text":" will return duplicated asset."}],"blockTags":[{"tag":"@returns","content":[{"kind":"text","text":"Newly created ["},{"kind":"code","text":"`Album`"},{"kind":"text","text":"](#album)."}]}]},"parameters":[{"name":"albumName","kind":32768,"comment":{"summary":[{"kind":"text","text":"Name of the album to create."}]},"type":{"type":"intrinsic","name":"string"}},{"name":"asset","kind":32768,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"An [Asset](#asset) or its ID (required on Android)."}]},"type":{"type":"reference","name":"AssetRef"}},{"name":"copyAsset","kind":32768,"comment":{"summary":[{"kind":"text","text":"__Android Only.__ Whether to copy asset to the new album instead of move it.\nDefaults to "},{"kind":"code","text":"`true`"},{"kind":"text","text":"."}]},"type":{"type":"intrinsic","name":"boolean"},"defaultValue":"true"}],"type":{"type":"reference","typeArguments":[{"type":"reference","name":"Album"}],"name":"Promise","qualifiedName":"Promise","package":"typescript"}}]},{"name":"createAssetAsync","kind":64,"signatures":[{"name":"createAssetAsync","kind":4096,"comment":{"summary":[{"kind":"text","text":"Creates an asset from existing file. The most common use case is to save a picture taken by [Camera](./camera).\nThis method requires "},{"kind":"code","text":"`CAMERA_ROLL`"},{"kind":"text","text":" permission."}],"blockTags":[{"tag":"@example","content":[{"kind":"code","text":"```js\nconst { uri } = await Camera.takePictureAsync();\nconst asset = await MediaLibrary.createAssetAsync(uri);\n```"}]},{"tag":"@returns","content":[{"kind":"text","text":"A promise which fulfils with an object representing an ["},{"kind":"code","text":"`Asset`"},{"kind":"text","text":"](#asset)."}]}]},"parameters":[{"name":"localUri","kind":32768,"comment":{"summary":[{"kind":"text","text":"A URI to the image or video file. It must contain an extension. On Android it\nmust be a local path, so it must start with "},{"kind":"code","text":"`file:///`"}]},"type":{"type":"intrinsic","name":"string"}}],"type":{"type":"reference","typeArguments":[{"type":"reference","name":"Asset"}],"name":"Promise","qualifiedName":"Promise","package":"typescript"}}]},{"name":"deleteAlbumsAsync","kind":64,"signatures":[{"name":"deleteAlbumsAsync","kind":4096,"comment":{"summary":[{"kind":"text","text":"Deletes given albums from the library. On Android by default it deletes assets belonging to given\nalbums from the library. On iOS it doesn't delete these assets, however it's possible to do by\npassing "},{"kind":"code","text":"`true`"},{"kind":"text","text":" as "},{"kind":"code","text":"`deleteAssets`"},{"kind":"text","text":"."}],"blockTags":[{"tag":"@returns","content":[{"kind":"text","text":"Returns a promise which fulfils with "},{"kind":"code","text":"`true`"},{"kind":"text","text":" if the albums were successfully deleted from\nthe library."}]}]},"parameters":[{"name":"albums","kind":32768,"comment":{"summary":[{"kind":"text","text":"An array of ["},{"kind":"code","text":"`Album`"},{"kind":"text","text":"](#asset)s or their IDs."}]},"type":{"type":"union","types":[{"type":"reference","name":"AlbumRef"},{"type":"array","elementType":{"type":"reference","name":"AlbumRef"}}]}},{"name":"assetRemove","kind":32768,"comment":{"summary":[{"kind":"text","text":"__iOS Only.__ Whether to also delete assets belonging to given albums.\nDefaults to "},{"kind":"code","text":"`false`"},{"kind":"text","text":"."}]},"type":{"type":"intrinsic","name":"boolean"},"defaultValue":"false"}],"type":{"type":"reference","typeArguments":[{"type":"intrinsic","name":"boolean"}],"name":"Promise","qualifiedName":"Promise","package":"typescript"}}]},{"name":"deleteAssetsAsync","kind":64,"signatures":[{"name":"deleteAssetsAsync","kind":4096,"comment":{"summary":[{"kind":"text","text":"Deletes assets from the library. On iOS it deletes assets from all albums they belong to, while\non Android it keeps all copies of them (album is strictly connected to the asset). Also, there is\nadditional dialog on iOS that requires user to confirm this action."}],"blockTags":[{"tag":"@returns","content":[{"kind":"text","text":"Returns promise which fulfils with "},{"kind":"code","text":"`true`"},{"kind":"text","text":" if the assets were successfully deleted."}]}]},"parameters":[{"name":"assets","kind":32768,"comment":{"summary":[{"kind":"text","text":"An array of [Asset](#asset) or their IDs."}]},"type":{"type":"union","types":[{"type":"reference","name":"AssetRef"},{"type":"array","elementType":{"type":"reference","name":"AssetRef"}}]}}],"type":{"type":"reference","typeArguments":[{"type":"intrinsic","name":"boolean"}],"name":"Promise","qualifiedName":"Promise","package":"typescript"}}]},{"name":"getAlbumAsync","kind":64,"signatures":[{"name":"getAlbumAsync","kind":4096,"comment":{"summary":[{"kind":"text","text":"Queries for an album with a specific name."}],"blockTags":[{"tag":"@returns","content":[{"kind":"text","text":"An object representing an ["},{"kind":"code","text":"`Album`"},{"kind":"text","text":"](#album), if album with given name exists, otherwise\nreturns "},{"kind":"code","text":"`null`"},{"kind":"text","text":"."}]}]},"parameters":[{"name":"title","kind":32768,"comment":{"summary":[{"kind":"text","text":"Name of the album to look for."}]},"type":{"type":"intrinsic","name":"string"}}],"type":{"type":"reference","typeArguments":[{"type":"reference","name":"Album"}],"name":"Promise","qualifiedName":"Promise","package":"typescript"}}]},{"name":"getAlbumsAsync","kind":64,"signatures":[{"name":"getAlbumsAsync","kind":4096,"comment":{"summary":[{"kind":"text","text":"Queries for user-created albums in media gallery."}],"blockTags":[{"tag":"@returns","content":[{"kind":"text","text":"A promise which fulfils with an array of ["},{"kind":"code","text":"`Album`"},{"kind":"text","text":"](#asset)s. Depending on Android version,\nroot directory of your storage may be listed as album titled "},{"kind":"code","text":"`\"0\"`"},{"kind":"text","text":" or unlisted at all."}]}]},"parameters":[{"name":"__namedParameters","kind":32768,"type":{"type":"reference","name":"AlbumsOptions"},"defaultValue":"{}"}],"type":{"type":"reference","typeArguments":[{"type":"array","elementType":{"type":"reference","name":"Album"}}],"name":"Promise","qualifiedName":"Promise","package":"typescript"}}]},{"name":"getAssetInfoAsync","kind":64,"signatures":[{"name":"getAssetInfoAsync","kind":4096,"comment":{"summary":[{"kind":"text","text":"Provides more information about an asset, including GPS location, local URI and EXIF metadata."}],"blockTags":[{"tag":"@returns","content":[{"kind":"text","text":"An [AssetInfo](#assetinfo) object, which is an "},{"kind":"code","text":"`Asset`"},{"kind":"text","text":" extended by an additional fields."}]}]},"parameters":[{"name":"asset","kind":32768,"comment":{"summary":[{"kind":"text","text":"An [Asset](#asset) or its ID."}]},"type":{"type":"reference","name":"AssetRef"}},{"name":"options","kind":32768,"type":{"type":"reference","name":"MediaLibraryAssetInfoQueryOptions"},"defaultValue":"..."}],"type":{"type":"reference","typeArguments":[{"type":"reference","name":"AssetInfo"}],"name":"Promise","qualifiedName":"Promise","package":"typescript"}}]},{"name":"getAssetsAsync","kind":64,"signatures":[{"name":"getAssetsAsync","kind":4096,"comment":{"summary":[{"kind":"text","text":"Fetches a page of assets matching the provided criteria."}],"blockTags":[{"tag":"@returns","content":[{"kind":"text","text":"A promise that fulfils with to ["},{"kind":"code","text":"`PagedInfo`"},{"kind":"text","text":"](#pagedinfo) object with array of ["},{"kind":"code","text":"`Asset`"},{"kind":"text","text":"](#asset)s."}]}]},"parameters":[{"name":"assetsOptions","kind":32768,"type":{"type":"reference","name":"AssetsOptions"},"defaultValue":"{}"}],"type":{"type":"reference","typeArguments":[{"type":"reference","typeArguments":[{"type":"reference","name":"Asset"}],"name":"PagedInfo"}],"name":"Promise","qualifiedName":"Promise","package":"typescript"}}]},{"name":"getMomentsAsync","kind":64,"signatures":[{"name":"getMomentsAsync","kind":4096,"comment":{"summary":[{"kind":"text","text":"Fetches a list of moments, which is a group of assets taken around the same place\nand time."}],"blockTags":[{"tag":"@returns","content":[{"kind":"text","text":"An array of [albums](#album) whose type is "},{"kind":"code","text":"`moment`"},{"kind":"text","text":"."}]},{"tag":"@platform","content":[{"kind":"text","text":"ios"}]}]},"type":{"type":"reference","typeArguments":[{"type":"intrinsic","name":"any"}],"name":"Promise","qualifiedName":"Promise","package":"typescript"}}]},{"name":"getPermissionsAsync","kind":64,"signatures":[{"name":"getPermissionsAsync","kind":4096,"comment":{"summary":[{"kind":"text","text":"Checks user's permissions for accessing media library."}],"blockTags":[{"tag":"@returns","content":[{"kind":"text","text":"A promise that fulfils with ["},{"kind":"code","text":"`PermissionResponse`"},{"kind":"text","text":"](#permissionresponse) object."}]}]},"parameters":[{"name":"writeOnly","kind":32768,"type":{"type":"intrinsic","name":"boolean"},"defaultValue":"false"}],"type":{"type":"reference","typeArguments":[{"type":"reference","name":"PermissionResponse"}],"name":"Promise","qualifiedName":"Promise","package":"typescript"}}]},{"name":"isAvailableAsync","kind":64,"signatures":[{"name":"isAvailableAsync","kind":4096,"comment":{"summary":[{"kind":"text","text":"Returns whether the Media Library API is enabled on the current device."}],"blockTags":[{"tag":"@returns","content":[{"kind":"text","text":"A promise which fulfils with a "},{"kind":"code","text":"`boolean`"},{"kind":"text","text":", indicating whether the Media Library API is\navailable on the current device."}]}]},"type":{"type":"reference","typeArguments":[{"type":"intrinsic","name":"boolean"}],"name":"Promise","qualifiedName":"Promise","package":"typescript"}}]},{"name":"migrateAlbumIfNeededAsync","kind":64,"signatures":[{"name":"migrateAlbumIfNeededAsync","kind":4096,"comment":{"summary":[{"kind":"text","text":"Moves album content to the special media directories on **Android R** or **above** if needed.\nThose new locations are in line with the Android "},{"kind":"code","text":"`scoped storage`"},{"kind":"text","text":" - so your application won't\nlose write permission to those directories in the future.\n\nThis method does nothing if:\n- app is running on **iOS**, **web** or **Android below R**\n- app has **write permission** to the album folder\n\nThe migration is possible when the album contains only compatible files types.\nFor instance, movies and pictures are compatible with each other, but music and pictures are not.\nIf automatic migration isn't possible, the function will be rejected.\nIn that case, you can use methods from the "},{"kind":"code","text":"`expo-file-system`"},{"kind":"text","text":" to migrate all your files manually.\n\n# Why do you need to migrate files?\n__Android R__ introduced a lot of changes in the storage system. Now applications can't save\nanything to the root directory. The only available locations are from the "},{"kind":"code","text":"`MediaStore`"},{"kind":"text","text":" API.\nUnfortunately, the media library stored albums in folders for which, because of those changes,\nthe application doesn't have permissions anymore. However, it doesn't mean you need to migrate\nall your albums. If your application doesn't add assets to albums, you don't have to migrate.\nEverything will work as it used to. You can read more about scoped storage in [the Android documentation](https://developer.android.com/about/versions/11/privacy/storage)."}],"blockTags":[{"tag":"@returns","content":[{"kind":"text","text":"A promise which fulfils to "},{"kind":"code","text":"`void`"},{"kind":"text","text":"."}]}]},"parameters":[{"name":"album","kind":32768,"comment":{"summary":[{"kind":"text","text":"An [Album](#album) or its ID."}]},"type":{"type":"reference","name":"AlbumRef"}}],"type":{"type":"reference","typeArguments":[{"type":"intrinsic","name":"void"}],"name":"Promise","qualifiedName":"Promise","package":"typescript"}}]},{"name":"presentPermissionsPickerAsync","kind":64,"signatures":[{"name":"presentPermissionsPickerAsync","kind":4096,"comment":{"summary":[{"kind":"text","text":"__Available only on iOS >= 14.__ Allows the user to update the assets that your app has access to.\nThe system modal is only displayed if the user originally allowed only "},{"kind":"code","text":"`limited`"},{"kind":"text","text":" access to their\nmedia library, otherwise this method is a no-op."}],"blockTags":[{"tag":"@returns","content":[{"kind":"text","text":"A promise that either rejects if the method is unavailable (meaning the device is not\nrunning iOS >= 14), or resolves to "},{"kind":"code","text":"`void`"},{"kind":"text","text":".\n> __Note:__ This method doesn't inform you if the user changes which assets your app has access to.\nFor that information, you need to subscribe for updates to the user's media library using [addListener(listener)](#medialibraryaddlistenerlistener).\nIf "},{"kind":"code","text":"`hasIncrementalChanges`"},{"kind":"text","text":" is "},{"kind":"code","text":"`false`"},{"kind":"text","text":", the user changed their permissions."}]}]},"type":{"type":"reference","typeArguments":[{"type":"intrinsic","name":"void"}],"name":"Promise","qualifiedName":"Promise","package":"typescript"}}]},{"name":"removeAllListeners","kind":64,"signatures":[{"name":"removeAllListeners","kind":4096,"comment":{"summary":[{"kind":"text","text":"Removes all listeners."}]},"type":{"type":"intrinsic","name":"void"}}]},{"name":"removeAssetsFromAlbumAsync","kind":64,"signatures":[{"name":"removeAssetsFromAlbumAsync","kind":4096,"comment":{"summary":[{"kind":"text","text":"Removes given assets from album.\n\nOn Android, album will be automatically deleted if there are no more assets inside."}],"blockTags":[{"tag":"@returns","content":[{"kind":"text","text":"Returns promise which fulfils with "},{"kind":"code","text":"`true`"},{"kind":"text","text":" if the assets were successfully removed from\nthe album."}]}]},"parameters":[{"name":"assets","kind":32768,"comment":{"summary":[{"kind":"text","text":"An array of [Asset](#asset) or their IDs."}]},"type":{"type":"union","types":[{"type":"reference","name":"AssetRef"},{"type":"array","elementType":{"type":"reference","name":"AssetRef"}}]}},{"name":"album","kind":32768,"comment":{"summary":[{"kind":"text","text":"An [Album](#album) or its ID."}]},"type":{"type":"reference","name":"AlbumRef"}}],"type":{"type":"reference","typeArguments":[{"type":"intrinsic","name":"boolean"}],"name":"Promise","qualifiedName":"Promise","package":"typescript"}}]},{"name":"removeSubscription","kind":64,"signatures":[{"name":"removeSubscription","kind":4096,"parameters":[{"name":"subscription","kind":32768,"type":{"type":"reference","name":"Subscription"}}],"type":{"type":"intrinsic","name":"void"}}]},{"name":"requestPermissionsAsync","kind":64,"signatures":[{"name":"requestPermissionsAsync","kind":4096,"comment":{"summary":[{"kind":"text","text":"Asks the user to grant permissions for accessing media in user's media library."}],"blockTags":[{"tag":"@returns","content":[{"kind":"text","text":"A promise that fulfils with ["},{"kind":"code","text":"`PermissionResponse`"},{"kind":"text","text":"](#permissionresponse) object."}]}]},"parameters":[{"name":"writeOnly","kind":32768,"type":{"type":"intrinsic","name":"boolean"},"defaultValue":"false"}],"type":{"type":"reference","typeArguments":[{"type":"reference","name":"PermissionResponse"}],"name":"Promise","qualifiedName":"Promise","package":"typescript"}}]},{"name":"saveToLibraryAsync","kind":64,"signatures":[{"name":"saveToLibraryAsync","kind":4096,"comment":{"summary":[{"kind":"text","text":"Saves the file at given "},{"kind":"code","text":"`localUri`"},{"kind":"text","text":" to the user's media library. Unlike ["},{"kind":"code","text":"`createAssetAsync()`"},{"kind":"text","text":"](#medialibrarycreateassetasynclocaluri),\nThis method doesn't return created asset.\nOn __iOS 11+__, it's possible to use this method without asking for "},{"kind":"code","text":"`CAMERA_ROLL`"},{"kind":"text","text":" permission,\nhowever then yours "},{"kind":"code","text":"`Info.plist`"},{"kind":"text","text":" should have "},{"kind":"code","text":"`NSPhotoLibraryAddUsageDescription`"},{"kind":"text","text":" key."}]},"parameters":[{"name":"localUri","kind":32768,"comment":{"summary":[{"kind":"text","text":"A URI to the image or video file. It must contain an extension. On Android it\nmust be a local path, so it must start with "},{"kind":"code","text":"`file:///`"},{"kind":"text","text":"."}]},"type":{"type":"intrinsic","name":"string"}}],"type":{"type":"reference","typeArguments":[{"type":"intrinsic","name":"void"}],"name":"Promise","qualifiedName":"Promise","package":"typescript"}}]},{"name":"usePermissions","kind":64,"signatures":[{"name":"usePermissions","kind":4096,"comment":{"summary":[{"kind":"text","text":"Check or request permissions to access the media library.\nThis uses both "},{"kind":"code","text":"`requestPermissionsAsync`"},{"kind":"text","text":" and "},{"kind":"code","text":"`getPermissionsAsync`"},{"kind":"text","text":" to interact with the permissions."}],"blockTags":[{"tag":"@example","content":[{"kind":"code","text":"```ts\nconst [permissionResponse, requestPermission] = MediaLibrary.usePermissions();\n```"}]}]},"parameters":[{"name":"options","kind":32768,"flags":{"isOptional":true},"type":{"type":"reference","typeArguments":[{"type":"reflection","declaration":{"name":"__type","kind":65536,"children":[{"name":"writeOnly","kind":1024,"flags":{"isOptional":true},"type":{"type":"intrinsic","name":"boolean"}}]}}],"name":"PermissionHookOptions"}}],"type":{"type":"tuple","elements":[{"type":"union","types":[{"type":"literal","value":null},{"type":"reference","name":"PermissionResponse"}]},{"type":"reference","typeArguments":[{"type":"reference","name":"PermissionResponse"}],"name":"RequestPermissionMethod"},{"type":"reference","typeArguments":[{"type":"reference","name":"PermissionResponse"}],"name":"GetPermissionMethod"}]}}]}]}
\ No newline at end of file
diff --git a/docs/public/static/data/v49.0.0/expo-navigation-bar.json b/docs/public/static/data/v49.0.0/expo-navigation-bar.json
new file mode 100644
index 0000000000000..02fa7a4673959
--- /dev/null
+++ b/docs/public/static/data/v49.0.0/expo-navigation-bar.json
@@ -0,0 +1 @@
+{"name":"expo-navigation-bar","kind":1,"children":[{"name":"NavigationBarBehavior","kind":4194304,"comment":{"summary":[{"kind":"text","text":"Interaction behavior for the system navigation bar."}]},"type":{"type":"union","types":[{"type":"literal","value":"overlay-swipe"},{"type":"literal","value":"inset-swipe"},{"type":"literal","value":"inset-touch"}]}},{"name":"NavigationBarButtonStyle","kind":4194304,"comment":{"summary":[{"kind":"text","text":"Appearance of the foreground elements in the navigation bar, i.e. the color of the menu, back, home button icons.\n\n- "},{"kind":"code","text":"`dark`"},{"kind":"text","text":" makes buttons **darker** to adjust for a mostly light nav bar.\n- "},{"kind":"code","text":"`light`"},{"kind":"text","text":" makes buttons **lighter** to adjust for a mostly dark nav bar."}]},"type":{"type":"union","types":[{"type":"literal","value":"light"},{"type":"literal","value":"dark"}]}},{"name":"NavigationBarPosition","kind":4194304,"comment":{"summary":[{"kind":"text","text":"Navigation bar positional mode."}]},"type":{"type":"union","types":[{"type":"literal","value":"relative"},{"type":"literal","value":"absolute"}]}},{"name":"NavigationBarVisibility","kind":4194304,"comment":{"summary":[{"kind":"text","text":"Visibility of the navigation bar."}]},"type":{"type":"union","types":[{"type":"literal","value":"visible"},{"type":"literal","value":"hidden"}]}},{"name":"NavigationBarVisibilityEvent","kind":4194304,"comment":{"summary":[{"kind":"text","text":"Current system UI visibility state. Due to platform constraints, this will return when the status bar visibility changes as well as the navigation bar."}]},"type":{"type":"reflection","declaration":{"name":"__type","kind":65536,"children":[{"name":"rawVisibility","kind":1024,"comment":{"summary":[{"kind":"text","text":"Native Android system UI visibility state, returned from the native Android "},{"kind":"code","text":"`setOnSystemUiVisibilityChangeListener`"},{"kind":"text","text":" API."}]},"type":{"type":"intrinsic","name":"number"}},{"name":"visibility","kind":1024,"comment":{"summary":[{"kind":"text","text":"Current navigation bar visibility."}]},"type":{"type":"reference","name":"NavigationBarVisibility"}}]}}},{"name":"addVisibilityListener","kind":64,"signatures":[{"name":"addVisibilityListener","kind":4096,"comment":{"summary":[{"kind":"text","text":"Observe changes to the system navigation bar.\nDue to platform constraints, this callback will also be triggered when the status bar visibility changes."}],"blockTags":[{"tag":"@example","content":[{"kind":"code","text":"```ts\nNavigationBar.addVisibilityListener(({ visibility }) => {\n // ...\n});\n```"}]}]},"parameters":[{"name":"listener","kind":32768,"type":{"type":"reflection","declaration":{"name":"__type","kind":65536,"signatures":[{"name":"__type","kind":4096,"parameters":[{"name":"event","kind":32768,"type":{"type":"reference","name":"NavigationBarVisibilityEvent"}}],"type":{"type":"intrinsic","name":"void"}}]}}}],"type":{"type":"reference","name":"Subscription"}}]},{"name":"getBackgroundColorAsync","kind":64,"signatures":[{"name":"getBackgroundColorAsync","kind":4096,"comment":{"summary":[{"kind":"text","text":"Gets the navigation bar's background color."}],"blockTags":[{"tag":"@example","content":[{"kind":"code","text":"```ts\nconst color = await NavigationBar.getBackgroundColorAsync();\n```"}]},{"tag":"@returns","content":[{"kind":"text","text":"Current navigation bar color in hex format. Returns "},{"kind":"code","text":"`#00000000`"},{"kind":"text","text":" (transparent) on unsupported platforms (iOS, web)."}]}]},"type":{"type":"reference","typeArguments":[{"type":"reference","name":"ColorValue","qualifiedName":"ColorValue","package":"react-native"}],"name":"Promise","qualifiedName":"Promise","package":"typescript"}}]},{"name":"getBehaviorAsync","kind":64,"signatures":[{"name":"getBehaviorAsync","kind":4096,"comment":{"summary":[{"kind":"text","text":"Gets the behavior of the status and navigation bars when the user swipes or touches the screen."}],"blockTags":[{"tag":"@example","content":[{"kind":"code","text":"```ts\nawait NavigationBar.getBehaviorAsync()\n```"}]},{"tag":"@returns","content":[{"kind":"text","text":"Navigation bar interaction behavior. Returns "},{"kind":"code","text":"`inset-touch`"},{"kind":"text","text":" on unsupported platforms (iOS, web)."}]}]},"type":{"type":"reference","typeArguments":[{"type":"reference","name":"NavigationBarBehavior"}],"name":"Promise","qualifiedName":"Promise","package":"typescript"}}]},{"name":"getBorderColorAsync","kind":64,"signatures":[{"name":"getBorderColorAsync","kind":4096,"comment":{"summary":[{"kind":"text","text":"Gets the navigation bar's top border color, also known as the \"divider color\"."}],"blockTags":[{"tag":"@example","content":[{"kind":"code","text":"```ts\nconst color = await NavigationBar.getBorderColorAsync();\n```"}]},{"tag":"@returns","content":[{"kind":"text","text":"Navigation bar top border color in hex format. Returns "},{"kind":"code","text":"`#00000000`"},{"kind":"text","text":" (transparent) on unsupported platforms (iOS, web)."}]}]},"type":{"type":"reference","typeArguments":[{"type":"reference","name":"ColorValue","qualifiedName":"ColorValue","package":"react-native"}],"name":"Promise","qualifiedName":"Promise","package":"typescript"}}]},{"name":"getButtonStyleAsync","kind":64,"signatures":[{"name":"getButtonStyleAsync","kind":4096,"comment":{"summary":[{"kind":"text","text":"Gets the navigation bar's button color styles."}],"blockTags":[{"tag":"@example","content":[{"kind":"code","text":"```ts\nconst style = await NavigationBar.getButtonStyleAsync();\n```"}]},{"tag":"@returns","content":[{"kind":"text","text":"Navigation bar foreground element color settings. Returns "},{"kind":"code","text":"`light`"},{"kind":"text","text":" on unsupported platforms (iOS, web)."}]}]},"type":{"type":"reference","typeArguments":[{"type":"reference","name":"NavigationBarButtonStyle"}],"name":"Promise","qualifiedName":"Promise","package":"typescript"}}]},{"name":"getVisibilityAsync","kind":64,"signatures":[{"name":"getVisibilityAsync","kind":4096,"comment":{"summary":[{"kind":"text","text":"Get the navigation bar's visibility."}],"blockTags":[{"tag":"@example","content":[{"kind":"code","text":"```ts\nconst visibility = await NavigationBar.getVisibilityAsync(\"hidden\");\n```"}]},{"tag":"@returns","content":[{"kind":"text","text":"Navigation bar's current visibility status. Returns "},{"kind":"code","text":"`hidden`"},{"kind":"text","text":" on unsupported platforms (iOS, web)."}]}]},"type":{"type":"reference","typeArguments":[{"type":"reference","name":"NavigationBarVisibility"}],"name":"Promise","qualifiedName":"Promise","package":"typescript"}}]},{"name":"setBackgroundColorAsync","kind":64,"signatures":[{"name":"setBackgroundColorAsync","kind":4096,"comment":{"summary":[{"kind":"text","text":"Changes the navigation bar's background color."}],"blockTags":[{"tag":"@example","content":[{"kind":"code","text":"```ts\nNavigationBar.setBackgroundColorAsync(\"white\");\n```"}]}]},"parameters":[{"name":"color","kind":32768,"comment":{"summary":[{"kind":"text","text":"Any valid [CSS 3 (SVG) color](http://www.w3.org/TR/css3-color/#svg-color)."}]},"type":{"type":"reference","name":"ColorValue","qualifiedName":"ColorValue","package":"react-native"}}],"type":{"type":"reference","typeArguments":[{"type":"intrinsic","name":"void"}],"name":"Promise","qualifiedName":"Promise","package":"typescript"}}]},{"name":"setBehaviorAsync","kind":64,"signatures":[{"name":"setBehaviorAsync","kind":4096,"comment":{"summary":[{"kind":"text","text":"Sets the behavior of the status bar and navigation bar when they are hidden and the user wants to reveal them.\n\nFor example, if the navigation bar is hidden ("},{"kind":"code","text":"`setVisibilityAsync(false)`"},{"kind":"text","text":") and the behavior\nis "},{"kind":"code","text":"`'overlay-swipe'`"},{"kind":"text","text":", the user can swipe from the bottom of the screen to temporarily reveal the navigation bar.\n\n- "},{"kind":"code","text":"`'overlay-swipe'`"},{"kind":"text","text":": Temporarily reveals the System UI after a swipe gesture (bottom or top) without insetting your App's content.\n- "},{"kind":"code","text":"`'inset-swipe'`"},{"kind":"text","text":": Reveals the System UI after a swipe gesture (bottom or top) and insets your App's content (Safe Area). The System UI is visible until you explicitly hide it again.\n- "},{"kind":"code","text":"`'inset-touch'`"},{"kind":"text","text":": Reveals the System UI after a touch anywhere on the screen and insets your App's content (Safe Area). The System UI is visible until you explicitly hide it again."}],"blockTags":[{"tag":"@example","content":[{"kind":"code","text":"```ts\nawait NavigationBar.setBehaviorAsync('overlay-swipe')\n```"}]}]},"parameters":[{"name":"behavior","kind":32768,"comment":{"summary":[{"kind":"text","text":"Dictates the interaction behavior of the navigation bar."}]},"type":{"type":"reference","name":"NavigationBarBehavior"}}],"type":{"type":"reference","typeArguments":[{"type":"intrinsic","name":"void"}],"name":"Promise","qualifiedName":"Promise","package":"typescript"}}]},{"name":"setBorderColorAsync","kind":64,"signatures":[{"name":"setBorderColorAsync","kind":4096,"comment":{"summary":[{"kind":"text","text":"Changes the navigation bar's border color."}],"blockTags":[{"tag":"@example","content":[{"kind":"code","text":"```ts\nNavigationBar.setBorderColorAsync(\"red\");\n```"}]}]},"parameters":[{"name":"color","kind":32768,"comment":{"summary":[{"kind":"text","text":"Any valid [CSS 3 (SVG) color](http://www.w3.org/TR/css3-color/#svg-color)."}]},"type":{"type":"reference","name":"ColorValue","qualifiedName":"ColorValue","package":"react-native"}}],"type":{"type":"reference","typeArguments":[{"type":"intrinsic","name":"void"}],"name":"Promise","qualifiedName":"Promise","package":"typescript"}}]},{"name":"setButtonStyleAsync","kind":64,"signatures":[{"name":"setButtonStyleAsync","kind":4096,"comment":{"summary":[{"kind":"text","text":"Changes the navigation bar's button colors between white ("},{"kind":"code","text":"`light`"},{"kind":"text","text":") and a dark gray color ("},{"kind":"code","text":"`dark`"},{"kind":"text","text":")."}],"blockTags":[{"tag":"@example","content":[{"kind":"code","text":"```ts\nNavigationBar.setButtonStyleAsync(\"light\");\n```"}]}]},"parameters":[{"name":"style","kind":32768,"comment":{"summary":[{"kind":"text","text":"Dictates the color of the foreground element color."}]},"type":{"type":"reference","name":"NavigationBarButtonStyle"}}],"type":{"type":"reference","typeArguments":[{"type":"intrinsic","name":"void"}],"name":"Promise","qualifiedName":"Promise","package":"typescript"}}]},{"name":"setPositionAsync","kind":64,"signatures":[{"name":"setPositionAsync","kind":4096,"comment":{"summary":[{"kind":"text","text":"Sets positioning method used for the navigation bar (and status bar).\nSetting position "},{"kind":"code","text":"`absolute`"},{"kind":"text","text":" will float the navigation bar above the content,\nwhereas position "},{"kind":"code","text":"`relative`"},{"kind":"text","text":" will shrink the screen to inline the navigation bar.\n\nWhen drawing behind the status and navigation bars, ensure the safe area insets are adjusted accordingly."}],"blockTags":[{"tag":"@example","content":[{"kind":"code","text":"```ts\n// enables edge-to-edge mode\nawait NavigationBar.setPositionAsync('absolute')\n// transparent backgrounds to see through\nawait NavigationBar.setBackgroundColorAsync('#ffffff00')\n```"}]}]},"parameters":[{"name":"position","kind":32768,"comment":{"summary":[{"kind":"text","text":"Based on CSS position property."}]},"type":{"type":"reference","name":"NavigationBarPosition"}}],"type":{"type":"reference","typeArguments":[{"type":"intrinsic","name":"void"}],"name":"Promise","qualifiedName":"Promise","package":"typescript"}}]},{"name":"setVisibilityAsync","kind":64,"signatures":[{"name":"setVisibilityAsync","kind":4096,"comment":{"summary":[{"kind":"text","text":"Set the navigation bar's visibility."}],"blockTags":[{"tag":"@example","content":[{"kind":"code","text":"```ts\nNavigationBar.setVisibilityAsync(\"hidden\");\n```"}]}]},"parameters":[{"name":"visibility","kind":32768,"type":{"type":"reference","name":"NavigationBarVisibility"}}],"type":{"type":"reference","typeArguments":[{"type":"intrinsic","name":"void"}],"name":"Promise","qualifiedName":"Promise","package":"typescript"}}]},{"name":"unstable_getPositionAsync","kind":64,"signatures":[{"name":"unstable_getPositionAsync","kind":4096,"comment":{"summary":[{"kind":"text","text":"Whether the navigation and status bars float above the app (absolute) or sit inline with it (relative).\nThis value can be incorrect if "},{"kind":"code","text":"`androidNavigationBar.visible`"},{"kind":"text","text":" is used instead of the config plugin "},{"kind":"code","text":"`position`"},{"kind":"text","text":" property.\n\nThis method is unstable because the position can be set via another native module and get out of sync.\nAlternatively, you can get the position by measuring the insets returned by "},{"kind":"code","text":"`react-native-safe-area-context`"},{"kind":"text","text":"."}],"blockTags":[{"tag":"@example","content":[{"kind":"code","text":"```ts\nawait NavigationBar.unstable_getPositionAsync()\n```"}]},{"tag":"@returns","content":[{"kind":"text","text":"Navigation bar positional rendering mode. Returns "},{"kind":"code","text":"`relative`"},{"kind":"text","text":" on unsupported platforms (iOS, web)."}]}]},"type":{"type":"reference","typeArguments":[{"type":"reference","name":"NavigationBarPosition"}],"name":"Promise","qualifiedName":"Promise","package":"typescript"}}]},{"name":"useVisibility","kind":64,"signatures":[{"name":"useVisibility","kind":4096,"comment":{"summary":[{"kind":"text","text":"React hook that statefully updates with the visibility of the system navigation bar."}],"blockTags":[{"tag":"@example","content":[{"kind":"code","text":"```ts\nfunction App() {\n const visibility = NavigationBar.useVisibility()\n // React Component...\n}\n```"}]},{"tag":"@returns","content":[{"kind":"text","text":"Visibility of the navigation bar, "},{"kind":"code","text":"`null`"},{"kind":"text","text":" during async initialization."}]}]},"type":{"type":"union","types":[{"type":"reference","name":"NavigationBarVisibility"},{"type":"literal","value":null}]}}]}]}
\ No newline at end of file
diff --git a/docs/public/static/data/v49.0.0/expo-network.json b/docs/public/static/data/v49.0.0/expo-network.json
new file mode 100644
index 0000000000000..5f950854efc41
--- /dev/null
+++ b/docs/public/static/data/v49.0.0/expo-network.json
@@ -0,0 +1 @@
+{"name":"expo-network","kind":1,"children":[{"name":"NetworkStateType","kind":8,"comment":{"summary":[{"kind":"text","text":"An enum of the different types of devices supported by Expo."}]},"children":[{"name":"BLUETOOTH","kind":16,"comment":{"summary":[{"kind":"text","text":"Active network connection over Bluetooth."}]},"type":{"type":"literal","value":"BLUETOOTH"}},{"name":"CELLULAR","kind":16,"comment":{"summary":[{"kind":"text","text":"Active network connection over mobile data or ["},{"kind":"code","text":"`DUN-specific`"},{"kind":"text","text":"](https://developer.android.com/reference/android/net/ConnectivityManager#TYPE_MOBILE_DUN)\nmobile connection when setting an upstream connection for tethering."}]},"type":{"type":"literal","value":"CELLULAR"}},{"name":"ETHERNET","kind":16,"comment":{"summary":[{"kind":"text","text":"Active network connection over Ethernet."}]},"type":{"type":"literal","value":"ETHERNET"}},{"name":"NONE","kind":16,"comment":{"summary":[{"kind":"text","text":"No active network connection detected."}]},"type":{"type":"literal","value":"NONE"}},{"name":"OTHER","kind":16,"comment":{"summary":[{"kind":"text","text":"Active network connection over other network connection types."}]},"type":{"type":"literal","value":"OTHER"}},{"name":"UNKNOWN","kind":16,"comment":{"summary":[{"kind":"text","text":"The connection type could not be determined."}]},"type":{"type":"literal","value":"UNKNOWN"}},{"name":"VPN","kind":16,"comment":{"summary":[{"kind":"text","text":"Active network connection over VPN."}]},"type":{"type":"literal","value":"VPN"}},{"name":"WIFI","kind":16,"comment":{"summary":[{"kind":"text","text":"Active network connection over WiFi."}]},"type":{"type":"literal","value":"WIFI"}},{"name":"WIMAX","kind":16,"comment":{"summary":[{"kind":"text","text":"Active network connection over Wimax."}]},"type":{"type":"literal","value":"WIMAX"}}]},{"name":"NetworkState","kind":4194304,"type":{"type":"reflection","declaration":{"name":"__type","kind":65536,"children":[{"name":"isConnected","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"If there is an active network connection. Note that this does not mean that internet is reachable.\nThis field is "},{"kind":"code","text":"`false`"},{"kind":"text","text":" if the type is either "},{"kind":"code","text":"`Network.NetworkStateType.NONE`"},{"kind":"text","text":" or "},{"kind":"code","text":"`Network.NetworkStateType.UNKNOWN`"},{"kind":"text","text":",\n"},{"kind":"code","text":"`true`"},{"kind":"text","text":" otherwise."}]},"type":{"type":"intrinsic","name":"boolean"}},{"name":"isInternetReachable","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"If the internet is reachable with the currently active network connection. On Android, this\ndepends on "},{"kind":"code","text":"`NetInfo.isConnected()`"},{"kind":"text","text":" (API level < 29) or "},{"kind":"code","text":"`ConnectivityManager.getActiveNetwork()`"},{"kind":"text","text":"\n(API level >= 29). On iOS, this value will always be the same as "},{"kind":"code","text":"`isConnected`"},{"kind":"text","text":"."}]},"type":{"type":"intrinsic","name":"boolean"}},{"name":"type","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"A ["},{"kind":"code","text":"`NetworkStateType`"},{"kind":"text","text":"](#networkstatetype) enum value that represents the current network\nconnection type."}]},"type":{"type":"reference","name":"NetworkStateType"}}]}}},{"name":"getIpAddressAsync","kind":64,"signatures":[{"name":"getIpAddressAsync","kind":4096,"comment":{"summary":[{"kind":"text","text":"Gets the device's current IPv4 address. Returns "},{"kind":"code","text":"`0.0.0.0`"},{"kind":"text","text":" if the IP address could not be retrieved.\n\nOn web, this method uses the third-party ["},{"kind":"code","text":"`ipify service`"},{"kind":"text","text":"](https://www.ipify.org/) to get the\npublic IP address of the current device."}],"blockTags":[{"tag":"@returns","content":[{"kind":"text","text":"A "},{"kind":"code","text":"`Promise`"},{"kind":"text","text":" that fulfils with a "},{"kind":"code","text":"`string`"},{"kind":"text","text":" of the current IP address of the device's main\nnetwork interface. Can only be IPv4 address."}]},{"tag":"@example","content":[{"kind":"code","text":"```ts\nawait Network.getIpAddressAsync();\n// \"92.168.32.44\"\n```"}]}]},"type":{"type":"reference","typeArguments":[{"type":"intrinsic","name":"string"}],"name":"Promise","qualifiedName":"Promise","package":"typescript"}}]},{"name":"getMacAddressAsync","kind":64,"signatures":[{"name":"getMacAddressAsync","kind":4096,"comment":{"summary":[{"kind":"text","text":"Gets the specified network interface's MAC address.\n\n> Beginning with iOS 7 and Android 11, non-system applications can no longer access the device's\nMAC address. In SDK 41 and above, this method will always resolve to a predefined value that\nisn't useful.\n\nIf you need to identify the device, use the "},{"kind":"code","text":"`getIosIdForVendorAsync()`"},{"kind":"text","text":" method / "},{"kind":"code","text":"`androidId`"},{"kind":"text","text":"\nproperty of the "},{"kind":"code","text":"`expo-application`"},{"kind":"text","text":" unimodule instead."}],"blockTags":[{"tag":"@deprecated","content":[{"kind":"text","text":"This method is deprecated and will be removed in a future SDK version."}]},{"tag":"@returns","content":[{"kind":"text","text":"A "},{"kind":"code","text":"`Promise`"},{"kind":"text","text":" that fulfils with the value "},{"kind":"code","text":"`'02:00:00:00:00:00'`"},{"kind":"text","text":"."}]}]},"parameters":[{"name":"interfaceName","kind":32768,"comment":{"summary":[{"kind":"text","text":"A string representing interface name ("},{"kind":"code","text":"`eth0`"},{"kind":"text","text":", "},{"kind":"code","text":"`wlan0`"},{"kind":"text","text":") or "},{"kind":"code","text":"`null`"},{"kind":"text","text":" (default),\nmeaning the method should fetch the MAC address of the first available interface."}]},"type":{"type":"union","types":[{"type":"literal","value":null},{"type":"intrinsic","name":"string"}]},"defaultValue":"null"}],"type":{"type":"reference","typeArguments":[{"type":"intrinsic","name":"string"}],"name":"Promise","qualifiedName":"Promise","package":"typescript"}}]},{"name":"getNetworkStateAsync","kind":64,"signatures":[{"name":"getNetworkStateAsync","kind":4096,"comment":{"summary":[{"kind":"text","text":"Gets the device's current network connection state.\n\nOn web, "},{"kind":"code","text":"`navigator.connection.type`"},{"kind":"text","text":" is not available on browsers. So if there is an active\nnetwork connection, the field "},{"kind":"code","text":"`type`"},{"kind":"text","text":" returns "},{"kind":"code","text":"`NetworkStateType.UNKNOWN`"},{"kind":"text","text":". Otherwise, it returns\n"},{"kind":"code","text":"`NetworkStateType.NONE`"},{"kind":"text","text":"."}],"blockTags":[{"tag":"@returns","content":[{"kind":"text","text":"A "},{"kind":"code","text":"`Promise`"},{"kind":"text","text":" that fulfils with a "},{"kind":"code","text":"`NetworkState`"},{"kind":"text","text":" object."}]},{"tag":"@example","content":[{"kind":"code","text":"```ts\nawait Network.getNetworkStateAsync();\n// {\n// type: NetworkStateType.CELLULAR,\n// isConnected: true,\n// isInternetReachable: true,\n// }\n```"}]}]},"type":{"type":"reference","typeArguments":[{"type":"reference","name":"NetworkState"}],"name":"Promise","qualifiedName":"Promise","package":"typescript"}}]},{"name":"isAirplaneModeEnabledAsync","kind":64,"signatures":[{"name":"isAirplaneModeEnabledAsync","kind":4096,"comment":{"summary":[{"kind":"text","text":"Tells if the device is in airplane mode."}],"blockTags":[{"tag":"@returns","content":[{"kind":"text","text":"Returns a "},{"kind":"code","text":"`Promise`"},{"kind":"text","text":" that fulfils with a "},{"kind":"code","text":"`boolean`"},{"kind":"text","text":" value for whether the device is in\nairplane mode or not."}]},{"tag":"@platform","content":[{"kind":"text","text":"android"}]},{"tag":"@example","content":[{"kind":"code","text":"```ts\nawait Network.isAirplaneModeEnabledAsync();\n// false\n```"}]}]},"type":{"type":"reference","typeArguments":[{"type":"intrinsic","name":"boolean"}],"name":"Promise","qualifiedName":"Promise","package":"typescript"}}]}]}
\ No newline at end of file
diff --git a/docs/public/static/data/v49.0.0/expo-notifications.json b/docs/public/static/data/v49.0.0/expo-notifications.json
new file mode 100644
index 0000000000000..4785de02368ba
--- /dev/null
+++ b/docs/public/static/data/v49.0.0/expo-notifications.json
@@ -0,0 +1 @@
+{"name":"expo-notifications","kind":1,"children":[{"name":"AndroidAudioContentType","kind":8,"children":[{"name":"MOVIE","kind":16,"type":{"type":"literal","value":3}},{"name":"MUSIC","kind":16,"type":{"type":"literal","value":2}},{"name":"SONIFICATION","kind":16,"type":{"type":"literal","value":4}},{"name":"SPEECH","kind":16,"type":{"type":"literal","value":1}},{"name":"UNKNOWN","kind":16,"type":{"type":"literal","value":0}}]},{"name":"AndroidAudioUsage","kind":8,"children":[{"name":"ALARM","kind":16,"type":{"type":"literal","value":4}},{"name":"ASSISTANCE_ACCESSIBILITY","kind":16,"type":{"type":"literal","value":11}},{"name":"ASSISTANCE_NAVIGATION_GUIDANCE","kind":16,"type":{"type":"literal","value":12}},{"name":"ASSISTANCE_SONIFICATION","kind":16,"type":{"type":"literal","value":13}},{"name":"GAME","kind":16,"type":{"type":"literal","value":14}},{"name":"MEDIA","kind":16,"type":{"type":"literal","value":1}},{"name":"NOTIFICATION","kind":16,"type":{"type":"literal","value":5}},{"name":"NOTIFICATION_COMMUNICATION_DELAYED","kind":16,"type":{"type":"literal","value":9}},{"name":"NOTIFICATION_COMMUNICATION_INSTANT","kind":16,"type":{"type":"literal","value":8}},{"name":"NOTIFICATION_COMMUNICATION_REQUEST","kind":16,"type":{"type":"literal","value":7}},{"name":"NOTIFICATION_EVENT","kind":16,"type":{"type":"literal","value":10}},{"name":"NOTIFICATION_RINGTONE","kind":16,"type":{"type":"literal","value":6}},{"name":"UNKNOWN","kind":16,"type":{"type":"literal","value":0}},{"name":"VOICE_COMMUNICATION","kind":16,"type":{"type":"literal","value":2}},{"name":"VOICE_COMMUNICATION_SIGNALLING","kind":16,"type":{"type":"literal","value":3}}]},{"name":"AndroidImportance","kind":8,"children":[{"name":"DEEFAULT","kind":16,"comment":{"summary":[],"blockTags":[{"tag":"@deprecated","content":[{"kind":"text","text":"Use "},{"kind":"code","text":"`DEFAULT`"},{"kind":"text","text":" instead."}]}]},"type":{"type":"literal","value":5}},{"name":"DEFAULT","kind":16,"type":{"type":"literal","value":5}},{"name":"HIGH","kind":16,"type":{"type":"literal","value":6}},{"name":"LOW","kind":16,"type":{"type":"literal","value":4}},{"name":"MAX","kind":16,"type":{"type":"literal","value":7}},{"name":"MIN","kind":16,"type":{"type":"literal","value":3}},{"name":"NONE","kind":16,"type":{"type":"literal","value":2}},{"name":"UNKNOWN","kind":16,"type":{"type":"literal","value":0}},{"name":"UNSPECIFIED","kind":16,"type":{"type":"literal","value":1}}]},{"name":"AndroidNotificationPriority","kind":8,"comment":{"summary":[{"kind":"text","text":"An enum corresponding to values appropriate for Android's ["},{"kind":"code","text":"`Notification#priority`"},{"kind":"text","text":"](https://developer.android.com/reference/android/app/Notification#priority) field."}]},"children":[{"name":"DEFAULT","kind":16,"type":{"type":"literal","value":"default"}},{"name":"HIGH","kind":16,"type":{"type":"literal","value":"high"}},{"name":"LOW","kind":16,"type":{"type":"literal","value":"low"}},{"name":"MAX","kind":16,"type":{"type":"literal","value":"max"}},{"name":"MIN","kind":16,"type":{"type":"literal","value":"min"}}]},{"name":"AndroidNotificationVisibility","kind":8,"children":[{"name":"PRIVATE","kind":16,"type":{"type":"literal","value":2}},{"name":"PUBLIC","kind":16,"type":{"type":"literal","value":1}},{"name":"SECRET","kind":16,"type":{"type":"literal","value":3}},{"name":"UNKNOWN","kind":16,"type":{"type":"literal","value":0}}]},{"name":"IosAlertStyle","kind":8,"children":[{"name":"ALERT","kind":16,"type":{"type":"literal","value":2}},{"name":"BANNER","kind":16,"type":{"type":"literal","value":1}},{"name":"NONE","kind":16,"type":{"type":"literal","value":0}}]},{"name":"IosAllowsPreviews","kind":8,"children":[{"name":"ALWAYS","kind":16,"type":{"type":"literal","value":1}},{"name":"NEVER","kind":16,"type":{"type":"literal","value":0}},{"name":"WHEN_AUTHENTICATED","kind":16,"type":{"type":"literal","value":2}}]},{"name":"IosAuthorizationStatus","kind":8,"children":[{"name":"AUTHORIZED","kind":16,"type":{"type":"literal","value":2}},{"name":"DENIED","kind":16,"type":{"type":"literal","value":1}},{"name":"EPHEMERAL","kind":16,"type":{"type":"literal","value":4}},{"name":"NOT_DETERMINED","kind":16,"type":{"type":"literal","value":0}},{"name":"PROVISIONAL","kind":16,"type":{"type":"literal","value":3}}]},{"name":"PermissionStatus","kind":8,"children":[{"name":"DENIED","kind":16,"comment":{"summary":[{"kind":"text","text":"User has denied the permission."}]},"type":{"type":"literal","value":"denied"}},{"name":"GRANTED","kind":16,"comment":{"summary":[{"kind":"text","text":"User has granted the permission."}]},"type":{"type":"literal","value":"granted"}},{"name":"UNDETERMINED","kind":16,"comment":{"summary":[{"kind":"text","text":"User hasn't granted or denied the permission yet."}]},"type":{"type":"literal","value":"undetermined"}}]},{"name":"AudioAttributes","kind":256,"children":[{"name":"contentType","kind":1024,"type":{"type":"reference","name":"AndroidAudioContentType"}},{"name":"flags","kind":1024,"type":{"type":"reflection","declaration":{"name":"__type","kind":65536,"children":[{"name":"enforceAudibility","kind":1024,"type":{"type":"intrinsic","name":"boolean"}},{"name":"requestHardwareAudioVideoSynchronization","kind":1024,"type":{"type":"intrinsic","name":"boolean"}}]}}},{"name":"usage","kind":1024,"type":{"type":"reference","name":"AndroidAudioUsage"}}]},{"name":"BeaconRegion","kind":256,"comment":{"summary":[{"kind":"text","text":"A region used to detect the presence of iBeacon devices. Based on Core Location ["},{"kind":"code","text":"`CLBeaconRegion`"},{"kind":"text","text":"](https://developer.apple.com/documentation/corelocation/clbeaconregion) class."}],"blockTags":[{"tag":"@platform","content":[{"kind":"text","text":"ios"}]}]},"children":[{"name":"beaconIdentityConstraint","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"The beacon identity constraint that defines the beacon region."}]},"type":{"type":"reflection","declaration":{"name":"__type","kind":65536,"children":[{"name":"major","kind":1024,"type":{"type":"union","types":[{"type":"literal","value":null},{"type":"intrinsic","name":"number"}]}},{"name":"minor","kind":1024,"type":{"type":"union","types":[{"type":"literal","value":null},{"type":"intrinsic","name":"number"}]}},{"name":"uuid","kind":1024,"type":{"type":"intrinsic","name":"string"}}]}}},{"name":"identifier","kind":1024,"comment":{"summary":[{"kind":"text","text":"The identifier for the region object."}]},"type":{"type":"intrinsic","name":"string"},"inheritedFrom":{"type":"reference","name":"Region.identifier"}},{"name":"major","kind":1024,"comment":{"summary":[{"kind":"text","text":"The major value from the beacon identity constraint that defines the beacon region."}]},"type":{"type":"union","types":[{"type":"literal","value":null},{"type":"intrinsic","name":"number"}]}},{"name":"minor","kind":1024,"comment":{"summary":[{"kind":"text","text":"The minor value from the beacon identity constraint that defines the beacon region."}]},"type":{"type":"union","types":[{"type":"literal","value":null},{"type":"intrinsic","name":"number"}]}},{"name":"notifyEntryStateOnDisplay","kind":1024,"comment":{"summary":[{"kind":"text","text":"A Boolean value that indicates whether Core Location sends beacon notifications when the device’s display is on."}]},"type":{"type":"intrinsic","name":"boolean"}},{"name":"notifyOnEntry","kind":1024,"comment":{"summary":[{"kind":"text","text":"A Boolean indicating that notifications are generated upon entry into the region."}]},"type":{"type":"intrinsic","name":"boolean"},"inheritedFrom":{"type":"reference","name":"Region.notifyOnEntry"}},{"name":"notifyOnExit","kind":1024,"comment":{"summary":[{"kind":"text","text":"A Boolean indicating that notifications are generated upon exit from the region."}]},"type":{"type":"intrinsic","name":"boolean"},"inheritedFrom":{"type":"reference","name":"Region.notifyOnExit"}},{"name":"type","kind":1024,"type":{"type":"literal","value":"beacon"},"overwrites":{"type":"reference","name":"Region.type"}},{"name":"uuid","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"The UUID value from the beacon identity constraint that defines the beacon region."}]},"type":{"type":"intrinsic","name":"string"}}],"extendedTypes":[{"type":"reference","name":"Region"}]},{"name":"CalendarNotificationTrigger","kind":256,"comment":{"summary":[{"kind":"text","text":"A trigger related to a ["},{"kind":"code","text":"`UNCalendarNotificationTrigger`"},{"kind":"text","text":"](https://developer.apple.com/documentation/usernotifications/uncalendarnotificationtrigger?language=objc)."}],"blockTags":[{"tag":"@platform","content":[{"kind":"text","text":"ios"}]}]},"children":[{"name":"dateComponents","kind":1024,"type":{"type":"reflection","declaration":{"name":"__type","kind":65536,"children":[{"name":"calendar","kind":1024,"flags":{"isOptional":true},"type":{"type":"intrinsic","name":"string"}},{"name":"day","kind":1024,"flags":{"isOptional":true},"type":{"type":"intrinsic","name":"number"}},{"name":"era","kind":1024,"flags":{"isOptional":true},"type":{"type":"intrinsic","name":"number"}},{"name":"hour","kind":1024,"flags":{"isOptional":true},"type":{"type":"intrinsic","name":"number"}},{"name":"isLeapMonth","kind":1024,"type":{"type":"intrinsic","name":"boolean"}},{"name":"minute","kind":1024,"flags":{"isOptional":true},"type":{"type":"intrinsic","name":"number"}},{"name":"month","kind":1024,"flags":{"isOptional":true},"type":{"type":"intrinsic","name":"number"}},{"name":"nanosecond","kind":1024,"flags":{"isOptional":true},"type":{"type":"intrinsic","name":"number"}},{"name":"quarter","kind":1024,"flags":{"isOptional":true},"type":{"type":"intrinsic","name":"number"}},{"name":"second","kind":1024,"flags":{"isOptional":true},"type":{"type":"intrinsic","name":"number"}},{"name":"timeZone","kind":1024,"flags":{"isOptional":true},"type":{"type":"intrinsic","name":"string"}},{"name":"weekOfMonth","kind":1024,"flags":{"isOptional":true},"type":{"type":"intrinsic","name":"number"}},{"name":"weekOfYear","kind":1024,"flags":{"isOptional":true},"type":{"type":"intrinsic","name":"number"}},{"name":"weekday","kind":1024,"flags":{"isOptional":true},"type":{"type":"intrinsic","name":"number"}},{"name":"weekdayOrdinal","kind":1024,"flags":{"isOptional":true},"type":{"type":"intrinsic","name":"number"}},{"name":"year","kind":1024,"flags":{"isOptional":true},"type":{"type":"intrinsic","name":"number"}},{"name":"yearForWeekOfYear","kind":1024,"flags":{"isOptional":true},"type":{"type":"intrinsic","name":"number"}}]}}},{"name":"repeats","kind":1024,"type":{"type":"intrinsic","name":"boolean"}},{"name":"type","kind":1024,"type":{"type":"literal","value":"calendar"}}]},{"name":"CircularRegion","kind":256,"comment":{"summary":[{"kind":"text","text":"A circular geographic region, specified as a center point and radius. Based on Core Location ["},{"kind":"code","text":"`CLCircularRegion`"},{"kind":"text","text":"](https://developer.apple.com/documentation/corelocation/clcircularregion) class."}],"blockTags":[{"tag":"@platform","content":[{"kind":"text","text":"ios"}]}]},"children":[{"name":"center","kind":1024,"comment":{"summary":[{"kind":"text","text":"The center point of the geographic area."}]},"type":{"type":"reflection","declaration":{"name":"__type","kind":65536,"children":[{"name":"latitude","kind":1024,"type":{"type":"intrinsic","name":"number"}},{"name":"longitude","kind":1024,"type":{"type":"intrinsic","name":"number"}}]}}},{"name":"identifier","kind":1024,"comment":{"summary":[{"kind":"text","text":"The identifier for the region object."}]},"type":{"type":"intrinsic","name":"string"},"inheritedFrom":{"type":"reference","name":"Region.identifier"}},{"name":"notifyOnEntry","kind":1024,"comment":{"summary":[{"kind":"text","text":"A Boolean indicating that notifications are generated upon entry into the region."}]},"type":{"type":"intrinsic","name":"boolean"},"inheritedFrom":{"type":"reference","name":"Region.notifyOnEntry"}},{"name":"notifyOnExit","kind":1024,"comment":{"summary":[{"kind":"text","text":"A Boolean indicating that notifications are generated upon exit from the region."}]},"type":{"type":"intrinsic","name":"boolean"},"inheritedFrom":{"type":"reference","name":"Region.notifyOnExit"}},{"name":"radius","kind":1024,"comment":{"summary":[{"kind":"text","text":"The radius (measured in meters) that defines the geographic area’s outer boundary."}]},"type":{"type":"intrinsic","name":"number"}},{"name":"type","kind":1024,"type":{"type":"literal","value":"circular"},"overwrites":{"type":"reference","name":"Region.type"}}],"extendedTypes":[{"type":"reference","name":"Region"}]},{"name":"DailyNotificationTrigger","kind":256,"comment":{"summary":[{"kind":"text","text":"A trigger related to a daily notification.\n> The same functionality will be achieved on iOS with a "},{"kind":"code","text":"`CalendarNotificationTrigger`"},{"kind":"text","text":"."}],"blockTags":[{"tag":"@platform","content":[{"kind":"text","text":"android"}]}]},"children":[{"name":"hour","kind":1024,"type":{"type":"intrinsic","name":"number"}},{"name":"minute","kind":1024,"type":{"type":"intrinsic","name":"number"}},{"name":"type","kind":1024,"type":{"type":"literal","value":"daily"}}]},{"name":"DailyTriggerInput","kind":256,"comment":{"summary":[{"kind":"text","text":"A trigger that will cause the notification to be delivered once per day."}]},"children":[{"name":"channelId","kind":1024,"flags":{"isOptional":true},"type":{"type":"intrinsic","name":"string"}},{"name":"hour","kind":1024,"type":{"type":"intrinsic","name":"number"}},{"name":"minute","kind":1024,"type":{"type":"intrinsic","name":"number"}},{"name":"repeats","kind":1024,"type":{"type":"literal","value":true}}]},{"name":"ExpoPushToken","kind":256,"comment":{"summary":[{"kind":"text","text":"Borrowing structure from "},{"kind":"code","text":"`DevicePushToken`"},{"kind":"text","text":" a little. You can use the "},{"kind":"code","text":"`data`"},{"kind":"text","text":" value to send notifications via Expo Notifications service."}]},"children":[{"name":"data","kind":1024,"comment":{"summary":[{"kind":"text","text":"The acquired push token."}]},"type":{"type":"intrinsic","name":"string"}},{"name":"type","kind":1024,"comment":{"summary":[{"kind":"text","text":"Always set to "},{"kind":"code","text":"`\"expo\"`"},{"kind":"text","text":"."}]},"type":{"type":"literal","value":"expo"}}]},{"name":"ExpoPushTokenOptions","kind":256,"children":[{"name":"applicationId","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"The ID of the application to which the token should be attributed.\nDefaults to ["},{"kind":"code","text":"`Application.applicationId`"},{"kind":"text","text":"](./application/#applicationapplicationid) exposed by "},{"kind":"code","text":"`expo-application`"},{"kind":"text","text":"."}]},"type":{"type":"intrinsic","name":"string"}},{"name":"baseUrl","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"Endpoint URL override."}]},"type":{"type":"intrinsic","name":"string"}},{"name":"development","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"Makes sense only on iOS, where there are two push notification services: \"sandbox\" and \"production\".\nThis defines whether the push token is supposed to be used with the sandbox platform notification service.\nDefaults to ["},{"kind":"code","text":"`Application.getIosPushNotificationServiceEnvironmentAsync()`"},{"kind":"text","text":"](./application/#applicationgetiospushnotificationserviceenvironmentasync)\nexposed by "},{"kind":"code","text":"`expo-application`"},{"kind":"text","text":" or "},{"kind":"code","text":"`false`"},{"kind":"text","text":". Most probably you won't need to customize that.\nYou may want to customize that if you don't want to install "},{"kind":"code","text":"`expo-application`"},{"kind":"text","text":" and still use the sandbox APNs."}],"blockTags":[{"tag":"@platform","content":[{"kind":"text","text":"ios"}]}]},"type":{"type":"intrinsic","name":"boolean"}},{"name":"deviceId","kind":1024,"flags":{"isOptional":true},"type":{"type":"intrinsic","name":"string"}},{"name":"devicePushToken","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"The device push token with which to register at the backend.\nDefaults to a token fetched with ["},{"kind":"code","text":"`getDevicePushTokenAsync()`"},{"kind":"text","text":"](#getdevicepushtokenasync)."}]},"type":{"type":"reference","name":"DevicePushToken"}},{"name":"projectId","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"The ID of the project to which the token should be attributed.\nDefaults to ["},{"kind":"code","text":"`Constants.expoConfig.extra.eas.projectId`"},{"kind":"text","text":"](./constants/#easconfig) exposed by "},{"kind":"code","text":"`expo-constants`"},{"kind":"text","text":".\n\nWhen using EAS Build, this value is automatically set. However, it is\n**recommended** to set it manually. Once you have EAS Build configured, you can find\nthe value in **app.json** under "},{"kind":"code","text":"`extra.eas.projectId`"},{"kind":"text","text":". You can copy and paste it into your code.\nIf you are not using EAS Build, it will fallback to ["},{"kind":"code","text":"`Constants.expoConfig?.extra?.eas?.projectId`"},{"kind":"text","text":"](./constants/#manifest)."}]},"type":{"type":"intrinsic","name":"string"}},{"name":"type","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"Request body override."}]},"type":{"type":"intrinsic","name":"string"}},{"name":"url","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"Request URL override."}]},"type":{"type":"intrinsic","name":"string"}}]},{"name":"FirebaseRemoteMessage","kind":256,"comment":{"summary":[{"kind":"text","text":"A Firebase "},{"kind":"code","text":"`RemoteMessage`"},{"kind":"text","text":" that caused the notification to be delivered to the app."}]},"children":[{"name":"collapseKey","kind":1024,"type":{"type":"union","types":[{"type":"literal","value":null},{"type":"intrinsic","name":"string"}]}},{"name":"data","kind":1024,"type":{"type":"reflection","declaration":{"name":"__type","kind":65536,"indexSignature":{"name":"__index","kind":8192,"parameters":[{"name":"key","kind":32768,"type":{"type":"intrinsic","name":"string"}}],"type":{"type":"intrinsic","name":"string"}}}}},{"name":"from","kind":1024,"type":{"type":"union","types":[{"type":"literal","value":null},{"type":"intrinsic","name":"string"}]}},{"name":"messageId","kind":1024,"type":{"type":"union","types":[{"type":"literal","value":null},{"type":"intrinsic","name":"string"}]}},{"name":"messageType","kind":1024,"type":{"type":"union","types":[{"type":"literal","value":null},{"type":"intrinsic","name":"string"}]}},{"name":"notification","kind":1024,"type":{"type":"union","types":[{"type":"literal","value":null},{"type":"reference","name":"FirebaseRemoteMessageNotification"}]}},{"name":"originalPriority","kind":1024,"type":{"type":"intrinsic","name":"number"}},{"name":"priority","kind":1024,"type":{"type":"intrinsic","name":"number"}},{"name":"sentTime","kind":1024,"type":{"type":"intrinsic","name":"number"}},{"name":"to","kind":1024,"type":{"type":"union","types":[{"type":"literal","value":null},{"type":"intrinsic","name":"string"}]}},{"name":"ttl","kind":1024,"type":{"type":"intrinsic","name":"number"}}]},{"name":"FirebaseRemoteMessageNotification","kind":256,"children":[{"name":"body","kind":1024,"type":{"type":"union","types":[{"type":"literal","value":null},{"type":"intrinsic","name":"string"}]}},{"name":"bodyLocalizationArgs","kind":1024,"type":{"type":"union","types":[{"type":"literal","value":null},{"type":"array","elementType":{"type":"intrinsic","name":"string"}}]}},{"name":"bodyLocalizationKey","kind":1024,"type":{"type":"union","types":[{"type":"literal","value":null},{"type":"intrinsic","name":"string"}]}},{"name":"channelId","kind":1024,"type":{"type":"union","types":[{"type":"literal","value":null},{"type":"intrinsic","name":"string"}]}},{"name":"clickAction","kind":1024,"type":{"type":"union","types":[{"type":"literal","value":null},{"type":"intrinsic","name":"string"}]}},{"name":"color","kind":1024,"type":{"type":"union","types":[{"type":"literal","value":null},{"type":"intrinsic","name":"string"}]}},{"name":"eventTime","kind":1024,"type":{"type":"union","types":[{"type":"literal","value":null},{"type":"intrinsic","name":"number"}]}},{"name":"icon","kind":1024,"type":{"type":"union","types":[{"type":"literal","value":null},{"type":"intrinsic","name":"string"}]}},{"name":"imageUrl","kind":1024,"type":{"type":"union","types":[{"type":"literal","value":null},{"type":"intrinsic","name":"string"}]}},{"name":"lightSettings","kind":1024,"type":{"type":"union","types":[{"type":"literal","value":null},{"type":"array","elementType":{"type":"intrinsic","name":"number"}}]}},{"name":"link","kind":1024,"type":{"type":"union","types":[{"type":"literal","value":null},{"type":"intrinsic","name":"string"}]}},{"name":"localOnly","kind":1024,"type":{"type":"intrinsic","name":"boolean"}},{"name":"notificationCount","kind":1024,"type":{"type":"union","types":[{"type":"literal","value":null},{"type":"intrinsic","name":"number"}]}},{"name":"notificationPriority","kind":1024,"type":{"type":"union","types":[{"type":"literal","value":null},{"type":"intrinsic","name":"number"}]}},{"name":"sound","kind":1024,"type":{"type":"union","types":[{"type":"literal","value":null},{"type":"intrinsic","name":"string"}]}},{"name":"sticky","kind":1024,"type":{"type":"intrinsic","name":"boolean"}},{"name":"tag","kind":1024,"type":{"type":"union","types":[{"type":"literal","value":null},{"type":"intrinsic","name":"string"}]}},{"name":"ticker","kind":1024,"type":{"type":"union","types":[{"type":"literal","value":null},{"type":"intrinsic","name":"string"}]}},{"name":"title","kind":1024,"type":{"type":"union","types":[{"type":"literal","value":null},{"type":"intrinsic","name":"string"}]}},{"name":"titleLocalizationArgs","kind":1024,"type":{"type":"union","types":[{"type":"literal","value":null},{"type":"array","elementType":{"type":"intrinsic","name":"string"}}]}},{"name":"titleLocalizationKey","kind":1024,"type":{"type":"union","types":[{"type":"literal","value":null},{"type":"intrinsic","name":"string"}]}},{"name":"usesDefaultLightSettings","kind":1024,"type":{"type":"intrinsic","name":"boolean"}},{"name":"usesDefaultSound","kind":1024,"type":{"type":"intrinsic","name":"boolean"}},{"name":"usesDefaultVibrateSettings","kind":1024,"type":{"type":"intrinsic","name":"boolean"}},{"name":"vibrateTimings","kind":1024,"type":{"type":"union","types":[{"type":"literal","value":null},{"type":"array","elementType":{"type":"intrinsic","name":"number"}}]}},{"name":"visibility","kind":1024,"type":{"type":"union","types":[{"type":"literal","value":null},{"type":"intrinsic","name":"number"}]}}]},{"name":"IosNotificationPermissionsRequest","kind":256,"comment":{"summary":[{"kind":"text","text":"Available configuration for permission request on iOS platform.\nSee Apple documentation for ["},{"kind":"code","text":"`UNAuthorizationOptions`"},{"kind":"text","text":"](https://developer.apple.com/documentation/usernotifications/unauthorizationoptions) to learn more."}]},"children":[{"name":"allowAlert","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"The ability to display alerts."}]},"type":{"type":"intrinsic","name":"boolean"}},{"name":"allowAnnouncements","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"The ability for Siri to automatically read out messages over AirPods."}],"blockTags":[{"tag":"@deprecated","content":[]}]},"type":{"type":"intrinsic","name":"boolean"}},{"name":"allowBadge","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"The ability to update the app’s badge."}]},"type":{"type":"intrinsic","name":"boolean"}},{"name":"allowCriticalAlerts","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"The ability to play sounds for critical alerts."}]},"type":{"type":"intrinsic","name":"boolean"}},{"name":"allowDisplayInCarPlay","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"The ability to display notifications in a CarPlay environment."}]},"type":{"type":"intrinsic","name":"boolean"}},{"name":"allowProvisional","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"The ability to post noninterrupting notifications provisionally to the Notification Center."}]},"type":{"type":"intrinsic","name":"boolean"}},{"name":"allowSound","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"The ability to play sounds."}]},"type":{"type":"intrinsic","name":"boolean"}},{"name":"provideAppNotificationSettings","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"An option indicating the system should display a button for in-app notification settings."}]},"type":{"type":"intrinsic","name":"boolean"}}]},{"name":"LocationNotificationTrigger","kind":256,"comment":{"summary":[{"kind":"text","text":"A trigger related to a ["},{"kind":"code","text":"`UNLocationNotificationTrigger`"},{"kind":"text","text":"](https://developer.apple.com/documentation/usernotifications/unlocationnotificationtrigger?language=objc)."}],"blockTags":[{"tag":"@platform","content":[{"kind":"text","text":"ios"}]}]},"children":[{"name":"region","kind":1024,"type":{"type":"union","types":[{"type":"reference","name":"CircularRegion"},{"type":"reference","name":"BeaconRegion"}]}},{"name":"repeats","kind":1024,"type":{"type":"intrinsic","name":"boolean"}},{"name":"type","kind":1024,"type":{"type":"literal","value":"location"}}]},{"name":"NativeDevicePushToken","kind":256,"children":[{"name":"data","kind":1024,"type":{"type":"intrinsic","name":"string"}},{"name":"type","kind":1024,"type":{"type":"union","types":[{"type":"literal","value":"ios"},{"type":"literal","value":"android"}]}}]},{"name":"Notification","kind":256,"comment":{"summary":[{"kind":"text","text":"An object represents a single notification that has been triggered by some request (["},{"kind":"code","text":"`NotificationRequest`"},{"kind":"text","text":"](#notificationrequest)) at some point in time."}]},"children":[{"name":"date","kind":1024,"type":{"type":"intrinsic","name":"number"}},{"name":"request","kind":1024,"type":{"type":"reference","name":"NotificationRequest"}}]},{"name":"NotificationAction","kind":256,"children":[{"name":"buttonTitle","kind":1024,"comment":{"summary":[{"kind":"text","text":"The title of the button triggering this action."}]},"type":{"type":"intrinsic","name":"string"}},{"name":"identifier","kind":1024,"comment":{"summary":[{"kind":"text","text":"A unique string that identifies this action. If a user takes this action (for example, selects this button in the system's Notification UI),\nyour app will receive this "},{"kind":"code","text":"`actionIdentifier`"},{"kind":"text","text":" via the ["},{"kind":"code","text":"`NotificationResponseReceivedListener`"},{"kind":"text","text":"](#addnotificationresponsereceivedlistenerlistener)."}]},"type":{"type":"intrinsic","name":"string"}},{"name":"options","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"Object representing the additional configuration options."}]},"type":{"type":"reflection","declaration":{"name":"__type","kind":65536,"children":[{"name":"isAuthenticationRequired","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"Boolean indicating whether triggering the action will require authentication from the user."}],"blockTags":[{"tag":"@platform","content":[{"kind":"text","text":"ios"}]}]},"type":{"type":"intrinsic","name":"boolean"}},{"name":"isDestructive","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"Boolean indicating whether the button title will be highlighted a different color (usually red).\nThis usually signifies a destructive action such as deleting data."}],"blockTags":[{"tag":"@platform","content":[{"kind":"text","text":"ios"}]}]},"type":{"type":"intrinsic","name":"boolean"}},{"name":"opensAppToForeground","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"Boolean indicating whether triggering this action foregrounds the app.\nIf "},{"kind":"code","text":"`false`"},{"kind":"text","text":" and your app is killed (not just backgrounded), ["},{"kind":"code","text":"`NotificationResponseReceived`"},{"kind":"text","text":" listeners](#addnotificationresponsereceivedlistenerlistener)\nwill not be triggered when a user selects this action."}],"blockTags":[{"tag":"@default","content":[{"kind":"text","text":"true"}]}]},"type":{"type":"intrinsic","name":"boolean"}}]}}},{"name":"textInput","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"Object which, if provided, will result in a button that prompts the user for a text response."}]},"type":{"type":"reflection","declaration":{"name":"__type","kind":65536,"children":[{"name":"placeholder","kind":1024,"comment":{"summary":[{"kind":"text","text":"A string that serves as a placeholder until the user begins typing. Defaults to no placeholder string."}]},"type":{"type":"intrinsic","name":"string"}},{"name":"submitButtonTitle","kind":1024,"comment":{"summary":[{"kind":"text","text":"A string which will be used as the title for the button used for submitting the text response."}],"blockTags":[{"tag":"@platform","content":[{"kind":"text","text":"ios"}]}]},"type":{"type":"intrinsic","name":"string"}}]}}}]},{"name":"NotificationBehavior","kind":256,"comment":{"summary":[{"kind":"text","text":"An object represents behavior that should be applied to the incoming notification.\n> On Android, setting "},{"kind":"code","text":"`shouldPlaySound: false`"},{"kind":"text","text":" will result in the drop-down notification alert **not** showing, no matter what the priority is.\n> This setting will also override any channel-specific sounds you may have configured."}]},"children":[{"name":"priority","kind":1024,"flags":{"isOptional":true},"type":{"type":"reference","name":"AndroidNotificationPriority"}},{"name":"shouldPlaySound","kind":1024,"type":{"type":"intrinsic","name":"boolean"}},{"name":"shouldSetBadge","kind":1024,"type":{"type":"intrinsic","name":"boolean"}},{"name":"shouldShowAlert","kind":1024,"type":{"type":"intrinsic","name":"boolean"}}]},{"name":"NotificationCategory","kind":256,"children":[{"name":"actions","kind":1024,"type":{"type":"array","elementType":{"type":"reference","name":"NotificationAction"}}},{"name":"identifier","kind":1024,"type":{"type":"intrinsic","name":"string"}},{"name":"options","kind":1024,"flags":{"isOptional":true},"type":{"type":"reference","name":"NotificationCategoryOptions"}}]},{"name":"NotificationChannel","kind":256,"comment":{"summary":[{"kind":"text","text":"An object represents a notification channel."}],"blockTags":[{"tag":"@platform","content":[{"kind":"text","text":"android"}]}]},"children":[{"name":"audioAttributes","kind":1024,"type":{"type":"reference","name":"AudioAttributes"}},{"name":"bypassDnd","kind":1024,"type":{"type":"intrinsic","name":"boolean"}},{"name":"description","kind":1024,"type":{"type":"union","types":[{"type":"literal","value":null},{"type":"intrinsic","name":"string"}]}},{"name":"enableLights","kind":1024,"type":{"type":"intrinsic","name":"boolean"}},{"name":"enableVibrate","kind":1024,"type":{"type":"intrinsic","name":"boolean"}},{"name":"groupId","kind":1024,"flags":{"isOptional":true},"type":{"type":"union","types":[{"type":"literal","value":null},{"type":"intrinsic","name":"string"}]}},{"name":"id","kind":1024,"type":{"type":"intrinsic","name":"string"}},{"name":"importance","kind":1024,"type":{"type":"reference","name":"AndroidImportance"}},{"name":"lightColor","kind":1024,"type":{"type":"intrinsic","name":"string"}},{"name":"lockscreenVisibility","kind":1024,"type":{"type":"reference","name":"AndroidNotificationVisibility"}},{"name":"name","kind":1024,"type":{"type":"union","types":[{"type":"literal","value":null},{"type":"intrinsic","name":"string"}]}},{"name":"showBadge","kind":1024,"type":{"type":"intrinsic","name":"boolean"}},{"name":"sound","kind":1024,"type":{"type":"union","types":[{"type":"literal","value":null},{"type":"literal","value":"default"},{"type":"literal","value":"custom"}]}},{"name":"vibrationPattern","kind":1024,"type":{"type":"union","types":[{"type":"literal","value":null},{"type":"array","elementType":{"type":"intrinsic","name":"number"}}]}}]},{"name":"NotificationChannelGroup","kind":256,"comment":{"summary":[{"kind":"text","text":"An object represents a notification channel group."}],"blockTags":[{"tag":"@platform","content":[{"kind":"text","text":"android"}]}]},"children":[{"name":"channels","kind":1024,"type":{"type":"array","elementType":{"type":"reference","name":"NotificationChannel"}}},{"name":"description","kind":1024,"flags":{"isOptional":true},"type":{"type":"union","types":[{"type":"literal","value":null},{"type":"intrinsic","name":"string"}]}},{"name":"id","kind":1024,"type":{"type":"intrinsic","name":"string"}},{"name":"isBlocked","kind":1024,"flags":{"isOptional":true},"type":{"type":"intrinsic","name":"boolean"}},{"name":"name","kind":1024,"type":{"type":"union","types":[{"type":"literal","value":null},{"type":"intrinsic","name":"string"}]}}]},{"name":"NotificationChannelGroupInput","kind":256,"comment":{"summary":[{"kind":"text","text":"An object represents a notification channel group to be set."}],"blockTags":[{"tag":"@platform","content":[{"kind":"text","text":"android"}]}]},"children":[{"name":"description","kind":1024,"flags":{"isOptional":true},"type":{"type":"union","types":[{"type":"literal","value":null},{"type":"intrinsic","name":"string"}]}},{"name":"name","kind":1024,"type":{"type":"union","types":[{"type":"literal","value":null},{"type":"intrinsic","name":"string"}]}}]},{"name":"NotificationChannelGroupManager","kind":256,"children":[{"name":"addListener","kind":1024,"type":{"type":"reflection","declaration":{"name":"__type","kind":65536,"signatures":[{"name":"__type","kind":4096,"parameters":[{"name":"eventName","kind":32768,"type":{"type":"intrinsic","name":"string"}}],"type":{"type":"intrinsic","name":"void"}}]}},"inheritedFrom":{"type":"reference","name":"ProxyNativeModule.addListener"}},{"name":"deleteNotificationChannelGroupAsync","kind":1024,"flags":{"isOptional":true},"type":{"type":"reflection","declaration":{"name":"__type","kind":65536,"signatures":[{"name":"__type","kind":4096,"parameters":[{"name":"groupId","kind":32768,"type":{"type":"intrinsic","name":"string"}}],"type":{"type":"reference","typeArguments":[{"type":"intrinsic","name":"void"}],"name":"Promise","qualifiedName":"Promise","package":"typescript"}}]}}},{"name":"getNotificationChannelGroupAsync","kind":1024,"flags":{"isOptional":true},"type":{"type":"reflection","declaration":{"name":"__type","kind":65536,"signatures":[{"name":"__type","kind":4096,"parameters":[{"name":"groupId","kind":32768,"type":{"type":"intrinsic","name":"string"}}],"type":{"type":"reference","typeArguments":[{"type":"union","types":[{"type":"literal","value":null},{"type":"reference","name":"NotificationChannelGroup"}]}],"name":"Promise","qualifiedName":"Promise","package":"typescript"}}]}}},{"name":"getNotificationChannelGroupsAsync","kind":1024,"flags":{"isOptional":true},"type":{"type":"reflection","declaration":{"name":"__type","kind":65536,"signatures":[{"name":"__type","kind":4096,"type":{"type":"reference","typeArguments":[{"type":"array","elementType":{"type":"reference","name":"NotificationChannelGroup"}}],"name":"Promise","qualifiedName":"Promise","package":"typescript"}}]}}},{"name":"removeListeners","kind":1024,"type":{"type":"reflection","declaration":{"name":"__type","kind":65536,"signatures":[{"name":"__type","kind":4096,"parameters":[{"name":"count","kind":32768,"type":{"type":"intrinsic","name":"number"}}],"type":{"type":"intrinsic","name":"void"}}]}},"inheritedFrom":{"type":"reference","name":"ProxyNativeModule.removeListeners"}},{"name":"setNotificationChannelGroupAsync","kind":1024,"flags":{"isOptional":true},"type":{"type":"reflection","declaration":{"name":"__type","kind":65536,"signatures":[{"name":"__type","kind":4096,"parameters":[{"name":"groupId","kind":32768,"type":{"type":"intrinsic","name":"string"}},{"name":"group","kind":32768,"type":{"type":"reference","name":"NotificationChannelGroupInput"}}],"type":{"type":"reference","typeArguments":[{"type":"union","types":[{"type":"literal","value":null},{"type":"reference","name":"NotificationChannelGroup"}]}],"name":"Promise","qualifiedName":"Promise","package":"typescript"}}]}}}],"extendedTypes":[{"type":"reference","name":"ProxyNativeModule"}]},{"name":"NotificationChannelManager","kind":256,"children":[{"name":"addListener","kind":1024,"type":{"type":"reflection","declaration":{"name":"__type","kind":65536,"signatures":[{"name":"__type","kind":4096,"parameters":[{"name":"eventName","kind":32768,"type":{"type":"intrinsic","name":"string"}}],"type":{"type":"intrinsic","name":"void"}}]}},"inheritedFrom":{"type":"reference","name":"ProxyNativeModule.addListener"}},{"name":"deleteNotificationChannelAsync","kind":1024,"flags":{"isOptional":true},"type":{"type":"reflection","declaration":{"name":"__type","kind":65536,"signatures":[{"name":"__type","kind":4096,"parameters":[{"name":"channelId","kind":32768,"type":{"type":"intrinsic","name":"string"}}],"type":{"type":"reference","typeArguments":[{"type":"intrinsic","name":"void"}],"name":"Promise","qualifiedName":"Promise","package":"typescript"}}]}}},{"name":"getNotificationChannelAsync","kind":1024,"flags":{"isOptional":true},"type":{"type":"reflection","declaration":{"name":"__type","kind":65536,"signatures":[{"name":"__type","kind":4096,"parameters":[{"name":"channelId","kind":32768,"type":{"type":"intrinsic","name":"string"}}],"type":{"type":"reference","typeArguments":[{"type":"union","types":[{"type":"literal","value":null},{"type":"reference","name":"NotificationChannel"}]}],"name":"Promise","qualifiedName":"Promise","package":"typescript"}}]}}},{"name":"getNotificationChannelsAsync","kind":1024,"flags":{"isOptional":true},"type":{"type":"reflection","declaration":{"name":"__type","kind":65536,"signatures":[{"name":"__type","kind":4096,"type":{"type":"reference","typeArguments":[{"type":"union","types":[{"type":"literal","value":null},{"type":"array","elementType":{"type":"reference","name":"NotificationChannel"}}]}],"name":"Promise","qualifiedName":"Promise","package":"typescript"}}]}}},{"name":"removeListeners","kind":1024,"type":{"type":"reflection","declaration":{"name":"__type","kind":65536,"signatures":[{"name":"__type","kind":4096,"parameters":[{"name":"count","kind":32768,"type":{"type":"intrinsic","name":"number"}}],"type":{"type":"intrinsic","name":"void"}}]}},"inheritedFrom":{"type":"reference","name":"ProxyNativeModule.removeListeners"}},{"name":"setNotificationChannelAsync","kind":1024,"flags":{"isOptional":true},"type":{"type":"reflection","declaration":{"name":"__type","kind":65536,"signatures":[{"name":"__type","kind":4096,"parameters":[{"name":"channelId","kind":32768,"type":{"type":"intrinsic","name":"string"}},{"name":"channelConfiguration","kind":32768,"type":{"type":"reference","name":"NotificationChannelInput"}}],"type":{"type":"reference","typeArguments":[{"type":"union","types":[{"type":"literal","value":null},{"type":"reference","name":"NotificationChannel"}]}],"name":"Promise","qualifiedName":"Promise","package":"typescript"}}]}}}],"extendedTypes":[{"type":"reference","name":"ProxyNativeModule"}]},{"name":"NotificationHandler","kind":256,"children":[{"name":"handleError","kind":1024,"flags":{"isOptional":true},"type":{"type":"reflection","declaration":{"name":"__type","kind":65536,"signatures":[{"name":"__type","kind":4096,"comment":{"summary":[{"kind":"text","text":"A function called whenever handling of an incoming notification fails."}]},"parameters":[{"name":"notificationId","kind":32768,"comment":{"summary":[{"kind":"text","text":"Identifier of the notification."}]},"type":{"type":"intrinsic","name":"string"}},{"name":"error","kind":32768,"comment":{"summary":[{"kind":"text","text":"An error which occurred in form of "},{"kind":"code","text":"`NotificationHandlingError`"},{"kind":"text","text":" object."}]},"type":{"type":"reference","name":"NotificationHandlingError"}}],"type":{"type":"intrinsic","name":"void"}}]}}},{"name":"handleNotification","kind":1024,"type":{"type":"reflection","declaration":{"name":"__type","kind":65536,"signatures":[{"name":"__type","kind":4096,"comment":{"summary":[{"kind":"text","text":"A function accepting an incoming notification returning a "},{"kind":"code","text":"`Promise`"},{"kind":"text","text":" resolving to a behavior (["},{"kind":"code","text":"`NotificationBehavior`"},{"kind":"text","text":"](#notificationbehavior))\napplicable to the notification"}]},"parameters":[{"name":"notification","kind":32768,"comment":{"summary":[{"kind":"text","text":"An object representing the notification."}]},"type":{"type":"reference","name":"Notification"}}],"type":{"type":"reference","typeArguments":[{"type":"reference","name":"NotificationBehavior"}],"name":"Promise","qualifiedName":"Promise","package":"typescript"}}]}}},{"name":"handleSuccess","kind":1024,"flags":{"isOptional":true},"type":{"type":"reflection","declaration":{"name":"__type","kind":65536,"signatures":[{"name":"__type","kind":4096,"comment":{"summary":[{"kind":"text","text":"A function called whenever an incoming notification is handled successfully."}]},"parameters":[{"name":"notificationId","kind":32768,"comment":{"summary":[{"kind":"text","text":"Identifier of the notification."}]},"type":{"type":"intrinsic","name":"string"}}],"type":{"type":"intrinsic","name":"void"}}]}}}]},{"name":"NotificationPermissionsRequest","kind":256,"comment":{"summary":[{"kind":"text","text":"An interface representing the permissions request scope configuration.\nEach option corresponds to a different native platform authorization option."}]},"children":[{"name":"android","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"On Android, all available permissions are granted by default, and if a user declines any permission, an app cannot prompt the user to change."}]},"type":{"type":"intrinsic","name":"object"}},{"name":"ios","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"Available configuration for permission request on iOS platform."}]},"type":{"type":"reference","name":"IosNotificationPermissionsRequest"}}]},{"name":"NotificationPermissionsStatus","kind":256,"comment":{"summary":[{"kind":"text","text":"An object obtained by permissions get and request functions."}]},"children":[{"name":"android","kind":1024,"flags":{"isOptional":true},"type":{"type":"reflection","declaration":{"name":"__type","kind":65536,"children":[{"name":"importance","kind":1024,"type":{"type":"intrinsic","name":"number"}},{"name":"interruptionFilter","kind":1024,"flags":{"isOptional":true},"type":{"type":"intrinsic","name":"number"}}]}}},{"name":"canAskAgain","kind":1024,"comment":{"summary":[{"kind":"text","text":"Indicates if user can be asked again for specific permission.\nIf not, one should be directed to the Settings app\nin order to enable/disable the permission."}]},"type":{"type":"intrinsic","name":"boolean"},"inheritedFrom":{"type":"reference","name":"PermissionResponse.canAskAgain"}},{"name":"expires","kind":1024,"comment":{"summary":[{"kind":"text","text":"Determines time when the permission expires."}]},"type":{"type":"reference","name":"PermissionExpiration"},"inheritedFrom":{"type":"reference","name":"PermissionResponse.expires"}},{"name":"granted","kind":1024,"comment":{"summary":[{"kind":"text","text":"A convenience boolean that indicates if the permission is granted."}]},"type":{"type":"intrinsic","name":"boolean"},"inheritedFrom":{"type":"reference","name":"PermissionResponse.granted"}},{"name":"ios","kind":1024,"flags":{"isOptional":true},"type":{"type":"reflection","declaration":{"name":"__type","kind":65536,"children":[{"name":"alertStyle","kind":1024,"type":{"type":"reference","name":"IosAlertStyle"}},{"name":"allowsAlert","kind":1024,"type":{"type":"union","types":[{"type":"literal","value":null},{"type":"intrinsic","name":"boolean"}]}},{"name":"allowsAnnouncements","kind":1024,"flags":{"isOptional":true},"type":{"type":"union","types":[{"type":"literal","value":null},{"type":"intrinsic","name":"boolean"}]}},{"name":"allowsBadge","kind":1024,"type":{"type":"union","types":[{"type":"literal","value":null},{"type":"intrinsic","name":"boolean"}]}},{"name":"allowsCriticalAlerts","kind":1024,"flags":{"isOptional":true},"type":{"type":"union","types":[{"type":"literal","value":null},{"type":"intrinsic","name":"boolean"}]}},{"name":"allowsDisplayInCarPlay","kind":1024,"type":{"type":"union","types":[{"type":"literal","value":null},{"type":"intrinsic","name":"boolean"}]}},{"name":"allowsDisplayInNotificationCenter","kind":1024,"type":{"type":"union","types":[{"type":"literal","value":null},{"type":"intrinsic","name":"boolean"}]}},{"name":"allowsDisplayOnLockScreen","kind":1024,"type":{"type":"union","types":[{"type":"literal","value":null},{"type":"intrinsic","name":"boolean"}]}},{"name":"allowsPreviews","kind":1024,"flags":{"isOptional":true},"type":{"type":"reference","name":"IosAllowsPreviews"}},{"name":"allowsSound","kind":1024,"type":{"type":"union","types":[{"type":"literal","value":null},{"type":"intrinsic","name":"boolean"}]}},{"name":"providesAppNotificationSettings","kind":1024,"flags":{"isOptional":true},"type":{"type":"intrinsic","name":"boolean"}},{"name":"status","kind":1024,"type":{"type":"reference","name":"IosAuthorizationStatus"}}]}}},{"name":"status","kind":1024,"comment":{"summary":[{"kind":"text","text":"Determines the status of the permission."}]},"type":{"type":"reference","name":"PermissionStatus"},"inheritedFrom":{"type":"reference","name":"PermissionResponse.status"}}],"extendedTypes":[{"type":"reference","name":"PermissionResponse"}]},{"name":"NotificationRequest","kind":256,"comment":{"summary":[{"kind":"text","text":"An object represents a request to present a notification. It has content — how it's being represented, and a trigger — what triggers the notification.\nMany notifications (["},{"kind":"code","text":"`Notification`"},{"kind":"text","text":"](#notification)) may be triggered with the same request (for example, a repeating notification)."}]},"children":[{"name":"content","kind":1024,"type":{"type":"reference","name":"NotificationContent"}},{"name":"identifier","kind":1024,"type":{"type":"intrinsic","name":"string"}},{"name":"trigger","kind":1024,"type":{"type":"reference","name":"NotificationTrigger"}}]},{"name":"NotificationRequestInput","kind":256,"comment":{"summary":[{"kind":"text","text":"An object represents a notification request you can pass into "},{"kind":"code","text":"`scheduleNotificationAsync`"},{"kind":"text","text":"."}]},"children":[{"name":"content","kind":1024,"type":{"type":"reference","name":"NotificationContentInput"}},{"name":"identifier","kind":1024,"flags":{"isOptional":true},"type":{"type":"intrinsic","name":"string"}},{"name":"trigger","kind":1024,"type":{"type":"reference","name":"NotificationTriggerInput"}}]},{"name":"NotificationResponse","kind":256,"comment":{"summary":[{"kind":"text","text":"An object represents user's interaction with the notification.\n> **Note:** If the user taps on a notification "},{"kind":"code","text":"`actionIdentifier`"},{"kind":"text","text":" will be equal to ["},{"kind":"code","text":"`Notifications.DEFAULT_ACTION_IDENTIFIER`"},{"kind":"text","text":"](#notificationsdefault_action_identifier)."}]},"children":[{"name":"actionIdentifier","kind":1024,"type":{"type":"intrinsic","name":"string"}},{"name":"notification","kind":1024,"type":{"type":"reference","name":"Notification"}},{"name":"userText","kind":1024,"flags":{"isOptional":true},"type":{"type":"intrinsic","name":"string"}}]},{"name":"PermissionResponse","kind":256,"comment":{"summary":[{"kind":"text","text":"An object obtained by permissions get and request functions."}]},"children":[{"name":"canAskAgain","kind":1024,"comment":{"summary":[{"kind":"text","text":"Indicates if user can be asked again for specific permission.\nIf not, one should be directed to the Settings app\nin order to enable/disable the permission."}]},"type":{"type":"intrinsic","name":"boolean"}},{"name":"expires","kind":1024,"comment":{"summary":[{"kind":"text","text":"Determines time when the permission expires."}]},"type":{"type":"reference","name":"PermissionExpiration"}},{"name":"granted","kind":1024,"comment":{"summary":[{"kind":"text","text":"A convenience boolean that indicates if the permission is granted."}]},"type":{"type":"intrinsic","name":"boolean"}},{"name":"status","kind":1024,"comment":{"summary":[{"kind":"text","text":"Determines the status of the permission."}]},"type":{"type":"reference","name":"PermissionStatus"}}],"extendedBy":[{"type":"reference","name":"NotificationPermissionsStatus"}]},{"name":"TimeIntervalNotificationTrigger","kind":256,"comment":{"summary":[{"kind":"text","text":"A trigger related to an elapsed time interval. May be repeating (see "},{"kind":"code","text":"`repeats`"},{"kind":"text","text":" field)."}]},"children":[{"name":"repeats","kind":1024,"type":{"type":"intrinsic","name":"boolean"}},{"name":"seconds","kind":1024,"type":{"type":"intrinsic","name":"number"}},{"name":"type","kind":1024,"type":{"type":"literal","value":"timeInterval"}}]},{"name":"TimeIntervalTriggerInput","kind":256,"comment":{"summary":[{"kind":"text","text":"A trigger that will cause the notification to be delivered once or many times (depends on the "},{"kind":"code","text":"`repeats`"},{"kind":"text","text":" field) after "},{"kind":"code","text":"`seconds`"},{"kind":"text","text":" time elapse.\n> **On iOS**, when "},{"kind":"code","text":"`repeats`"},{"kind":"text","text":" is "},{"kind":"code","text":"`true`"},{"kind":"text","text":", the time interval must be 60 seconds or greater. Otherwise, the notification won't be triggered."}]},"children":[{"name":"channelId","kind":1024,"flags":{"isOptional":true},"type":{"type":"intrinsic","name":"string"}},{"name":"repeats","kind":1024,"flags":{"isOptional":true},"type":{"type":"intrinsic","name":"boolean"}},{"name":"seconds","kind":1024,"type":{"type":"intrinsic","name":"number"}}]},{"name":"UnknownNotificationTrigger","kind":256,"comment":{"summary":[{"kind":"text","text":"Represents a notification trigger that is unknown to "},{"kind":"code","text":"`expo-notifications`"},{"kind":"text","text":" and that it didn't know how to serialize for JS."}]},"children":[{"name":"type","kind":1024,"type":{"type":"literal","value":"unknown"}}]},{"name":"WebDevicePushToken","kind":256,"children":[{"name":"data","kind":1024,"type":{"type":"reflection","declaration":{"name":"__type","kind":65536,"children":[{"name":"endpoint","kind":1024,"type":{"type":"intrinsic","name":"string"}},{"name":"keys","kind":1024,"type":{"type":"reflection","declaration":{"name":"__type","kind":65536,"children":[{"name":"auth","kind":1024,"type":{"type":"intrinsic","name":"string"}},{"name":"p256dh","kind":1024,"type":{"type":"intrinsic","name":"string"}}]}}}]}}},{"name":"type","kind":1024,"type":{"type":"literal","value":"web"}}]},{"name":"WeeklyNotificationTrigger","kind":256,"comment":{"summary":[{"kind":"text","text":"A trigger related to a weekly notification.\n> The same functionality will be achieved on iOS with a "},{"kind":"code","text":"`CalendarNotificationTrigger`"},{"kind":"text","text":"."}],"blockTags":[{"tag":"@platform","content":[{"kind":"text","text":"android"}]}]},"children":[{"name":"hour","kind":1024,"type":{"type":"intrinsic","name":"number"}},{"name":"minute","kind":1024,"type":{"type":"intrinsic","name":"number"}},{"name":"type","kind":1024,"type":{"type":"literal","value":"weekly"}},{"name":"weekday","kind":1024,"type":{"type":"intrinsic","name":"number"}}]},{"name":"WeeklyTriggerInput","kind":256,"comment":{"summary":[{"kind":"text","text":"A trigger that will cause the notification to be delivered once every week.\n> **Note:** Weekdays are specified with a number from "},{"kind":"code","text":"`1`"},{"kind":"text","text":" through "},{"kind":"code","text":"`7`"},{"kind":"text","text":", with "},{"kind":"code","text":"`1`"},{"kind":"text","text":" indicating Sunday."}]},"children":[{"name":"channelId","kind":1024,"flags":{"isOptional":true},"type":{"type":"intrinsic","name":"string"}},{"name":"hour","kind":1024,"type":{"type":"intrinsic","name":"number"}},{"name":"minute","kind":1024,"type":{"type":"intrinsic","name":"number"}},{"name":"repeats","kind":1024,"type":{"type":"literal","value":true}},{"name":"weekday","kind":1024,"type":{"type":"intrinsic","name":"number"}}]},{"name":"YearlyNotificationTrigger","kind":256,"comment":{"summary":[{"kind":"text","text":"A trigger related to a yearly notification.\n> The same functionality will be achieved on iOS with a "},{"kind":"code","text":"`CalendarNotificationTrigger`"},{"kind":"text","text":"."}],"blockTags":[{"tag":"@platform","content":[{"kind":"text","text":"android"}]}]},"children":[{"name":"day","kind":1024,"type":{"type":"intrinsic","name":"number"}},{"name":"hour","kind":1024,"type":{"type":"intrinsic","name":"number"}},{"name":"minute","kind":1024,"type":{"type":"intrinsic","name":"number"}},{"name":"month","kind":1024,"type":{"type":"intrinsic","name":"number"}},{"name":"type","kind":1024,"type":{"type":"literal","value":"yearly"}}]},{"name":"YearlyTriggerInput","kind":256,"comment":{"summary":[{"kind":"text","text":"A trigger that will cause the notification to be delivered once every year.\n> **Note:** all properties are specified in JavaScript Date's ranges."}]},"children":[{"name":"channelId","kind":1024,"flags":{"isOptional":true},"type":{"type":"intrinsic","name":"string"}},{"name":"day","kind":1024,"type":{"type":"intrinsic","name":"number"}},{"name":"hour","kind":1024,"type":{"type":"intrinsic","name":"number"}},{"name":"minute","kind":1024,"type":{"type":"intrinsic","name":"number"}},{"name":"month","kind":1024,"type":{"type":"intrinsic","name":"number"}},{"name":"repeats","kind":1024,"type":{"type":"literal","value":true}}]},{"name":"AudioAttributesInput","kind":4194304,"type":{"type":"reference","typeArguments":[{"type":"reference","name":"AudioAttributes"}],"name":"Partial","qualifiedName":"Partial","package":"typescript"}},{"name":"CalendarTriggerInput","kind":4194304,"comment":{"summary":[{"kind":"text","text":"A trigger that will cause the notification to be delivered once or many times when the date components match the specified values.\nCorresponds to native ["},{"kind":"code","text":"`UNCalendarNotificationTrigger`"},{"kind":"text","text":"](https://developer.apple.com/documentation/usernotifications/uncalendarnotificationtrigger?language=objc)."}],"blockTags":[{"tag":"@platform","content":[{"kind":"text","text":"ios"}]}]},"type":{"type":"intersection","types":[{"type":"indexedAccess","indexType":{"type":"literal","value":"value"},"objectType":{"type":"reference","name":"NativeCalendarTriggerInput"}},{"type":"reflection","declaration":{"name":"__type","kind":65536,"children":[{"name":"channelId","kind":1024,"flags":{"isOptional":true},"type":{"type":"intrinsic","name":"string"}},{"name":"repeats","kind":1024,"flags":{"isOptional":true},"type":{"type":"intrinsic","name":"boolean"}}]}}]}},{"name":"ChannelAwareTriggerInput","kind":4194304,"comment":{"summary":[{"kind":"text","text":"A trigger that will cause the notification to be delivered immediately."}]},"type":{"type":"reflection","declaration":{"name":"__type","kind":65536,"children":[{"name":"channelId","kind":1024,"type":{"type":"intrinsic","name":"string"}}]}}},{"name":"DateTriggerInput","kind":4194304,"comment":{"summary":[{"kind":"text","text":"A trigger that will cause the notification to be delivered once at the specified "},{"kind":"code","text":"`Date`"},{"kind":"text","text":".\nIf you pass in a "},{"kind":"code","text":"`number`"},{"kind":"text","text":" it will be interpreted as a Unix timestamp."}]},"type":{"type":"union","types":[{"type":"reference","name":"Date","qualifiedName":"Date","package":"typescript"},{"type":"intrinsic","name":"number"},{"type":"reflection","declaration":{"name":"__type","kind":65536,"children":[{"name":"channelId","kind":1024,"flags":{"isOptional":true},"type":{"type":"intrinsic","name":"string"}},{"name":"date","kind":1024,"type":{"type":"union","types":[{"type":"reference","name":"Date","qualifiedName":"Date","package":"typescript"},{"type":"intrinsic","name":"number"}]}}]}}]}},{"name":"DevicePushToken","kind":4194304,"comment":{"summary":[{"kind":"text","text":"In simple terms, an object of "},{"kind":"code","text":"`type: Platform.OS`"},{"kind":"text","text":" and "},{"kind":"code","text":"`data: any`"},{"kind":"text","text":". The "},{"kind":"code","text":"`data`"},{"kind":"text","text":" type depends on the environment - on a native device it will be a string,\nwhich you can then use to send notifications via Firebase Cloud Messaging (Android) or APNs (iOS); on web it will be a registration object (VAPID)."}]},"type":{"type":"union","types":[{"type":"reference","name":"ExplicitlySupportedDevicePushToken"},{"type":"reference","name":"ImplicitlySupportedDevicePushToken"}]}},{"name":"NativeNotificationPermissionsRequest","kind":4194304,"type":{"type":"union","types":[{"type":"reference","name":"IosNotificationPermissionsRequest"},{"type":"intrinsic","name":"object"}]}},{"name":"NotificationCategoryOptions","kind":4194304,"comment":{"summary":[],"blockTags":[{"tag":"@platform","content":[{"kind":"text","text":"ios"}]}]},"type":{"type":"reflection","declaration":{"name":"__type","kind":65536,"children":[{"name":"allowAnnouncement","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"A boolean indicating whether to allow notifications to be automatically read by Siri when the user is using AirPods."}],"blockTags":[{"tag":"@default","content":[{"kind":"text","text":"false"}]}]},"type":{"type":"intrinsic","name":"boolean"}},{"name":"allowInCarPlay","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"A boolean indicating whether to allow CarPlay to display notifications of this type. **Apps must be approved for CarPlay to make use of this feature.**"}],"blockTags":[{"tag":"@default","content":[{"kind":"text","text":"false"}]}]},"type":{"type":"intrinsic","name":"boolean"}},{"name":"categorySummaryFormat","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"A format string for the summary description used when the system groups the category’s notifications."}]},"type":{"type":"intrinsic","name":"string"}},{"name":"customDismissAction","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"A boolean indicating whether to send actions for handling when the notification is dismissed (the user must explicitly dismiss\nthe notification interface - ignoring a notification or flicking away a notification banner does not trigger this action)."}],"blockTags":[{"tag":"@default","content":[{"kind":"text","text":"false"}]}]},"type":{"type":"intrinsic","name":"boolean"}},{"name":"intentIdentifiers","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"Array of [Intent Class Identifiers](https://developer.apple.com/documentation/sirikit/intent_class_identifiers). When a notification is delivered,\nthe presence of an intent identifier lets the system know that the notification is potentially related to the handling of a request made through Siri."}],"blockTags":[{"tag":"@default","content":[{"kind":"text","text":"[]"}]}]},"type":{"type":"array","elementType":{"type":"intrinsic","name":"string"}}},{"name":"previewPlaceholder","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"Customizable placeholder for the notification preview text. This is shown if the user has disabled notification previews for the app.\nDefaults to the localized iOS system default placeholder ("},{"kind":"code","text":"`Notification`"},{"kind":"text","text":")."}]},"type":{"type":"intrinsic","name":"string"}},{"name":"showSubtitle","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"A boolean indicating whether to show the notification's subtitle, even if the user has disabled notification previews for the app."}],"blockTags":[{"tag":"@default","content":[{"kind":"text","text":"false"}]}]},"type":{"type":"intrinsic","name":"boolean"}},{"name":"showTitle","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"A boolean indicating whether to show the notification's title, even if the user has disabled notification previews for the app."}],"blockTags":[{"tag":"@default","content":[{"kind":"text","text":"false"}]}]},"type":{"type":"intrinsic","name":"boolean"}}]}}},{"name":"NotificationChannelInput","kind":4194304,"comment":{"summary":[{"kind":"text","text":"An object represents a notification channel to be set."}],"blockTags":[{"tag":"@platform","content":[{"kind":"text","text":"android"}]}]},"type":{"type":"reference","typeArguments":[{"type":"intersection","types":[{"type":"reference","typeArguments":[{"type":"reference","name":"NotificationChannel"},{"type":"union","types":[{"type":"literal","value":"id"},{"type":"literal","value":"audioAttributes"},{"type":"literal","value":"sound"}]}],"name":"Omit","qualifiedName":"Omit","package":"typescript"},{"type":"reflection","declaration":{"name":"__type","kind":65536,"children":[{"name":"audioAttributes","kind":1024,"flags":{"isOptional":true},"type":{"type":"reference","name":"AudioAttributesInput"}},{"name":"sound","kind":1024,"flags":{"isOptional":true},"type":{"type":"union","types":[{"type":"intrinsic","name":"string"},{"type":"literal","value":null}]}}]}}]},{"type":"union","types":[{"type":"literal","value":"name"},{"type":"literal","value":"importance"}]}],"name":"RequiredBy"}},{"name":"NotificationContent","kind":4194304,"comment":{"summary":[{"kind":"text","text":"An object represents notification's content."}]},"type":{"type":"intersection","types":[{"type":"reflection","declaration":{"name":"__type","kind":65536,"children":[{"name":"body","kind":1024,"comment":{"summary":[{"kind":"text","text":"Notification body - the main content of the notification."}]},"type":{"type":"union","types":[{"type":"intrinsic","name":"string"},{"type":"literal","value":null}]}},{"name":"data","kind":1024,"comment":{"summary":[{"kind":"text","text":"Data associated with the notification, not displayed"}]},"type":{"type":"reference","typeArguments":[{"type":"intrinsic","name":"string"},{"type":"intrinsic","name":"any"}],"name":"Record","qualifiedName":"Record","package":"typescript"}},{"name":"sound","kind":1024,"type":{"type":"union","types":[{"type":"literal","value":"default"},{"type":"literal","value":"defaultCritical"},{"type":"literal","value":"custom"},{"type":"literal","value":null}]}},{"name":"subtitle","kind":1024,"comment":{"summary":[{"kind":"text","text":"On Android: "},{"kind":"code","text":"`subText`"},{"kind":"text","text":" - the display depends on the device.\n\nOn iOS: "},{"kind":"code","text":"`subtitle`"},{"kind":"text","text":" - the bold text displayed between title and the rest of the content."}]},"type":{"type":"union","types":[{"type":"intrinsic","name":"string"},{"type":"literal","value":null}]}},{"name":"title","kind":1024,"comment":{"summary":[{"kind":"text","text":"Notification title - the bold text displayed above the rest of the content."}]},"type":{"type":"union","types":[{"type":"intrinsic","name":"string"},{"type":"literal","value":null}]}}]}},{"type":"union","types":[{"type":"reference","name":"NotificationContentIos"},{"type":"reference","name":"NotificationContentAndroid"}]}]}},{"name":"NotificationContentAndroid","kind":4194304,"comment":{"summary":[{"kind":"text","text":"See [Android developer documentation](https://developer.android.com/reference/android/app/Notification#fields) for more information on specific fields."}]},"type":{"type":"reflection","declaration":{"name":"__type","kind":65536,"children":[{"name":"badge","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"Application badge number associated with the notification."}]},"type":{"type":"intrinsic","name":"number"}},{"name":"color","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"Accent color (in "},{"kind":"code","text":"`#AARRGGBB`"},{"kind":"text","text":" or "},{"kind":"code","text":"`#RRGGBB`"},{"kind":"text","text":" format) to be applied by the standard Style templates when presenting this notification."}]},"type":{"type":"intrinsic","name":"string"}},{"name":"priority","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"Relative priority for this notification. Priority is an indication of how much of the user's valuable attention should be consumed by this notification.\nLow-priority notifications may be hidden from the user in certain situations, while the user might be interrupted for a higher-priority notification.\nThe system will make a determination about how to interpret this priority when presenting the notification."}]},"type":{"type":"reference","name":"AndroidNotificationPriority"}},{"name":"vibrationPattern","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"The pattern with which to vibrate."}]},"type":{"type":"array","elementType":{"type":"intrinsic","name":"number"}}}]}}},{"name":"NotificationContentAttachmentIos","kind":4194304,"comment":{"summary":[],"blockTags":[{"tag":"@platform","content":[{"kind":"text","text":"ios"}]}]},"type":{"type":"reflection","declaration":{"name":"__type","kind":65536,"children":[{"name":"hideThumbnail","kind":1024,"flags":{"isOptional":true},"type":{"type":"intrinsic","name":"boolean"}},{"name":"identifier","kind":1024,"type":{"type":"union","types":[{"type":"intrinsic","name":"string"},{"type":"literal","value":null}]}},{"name":"thumbnailClipArea","kind":1024,"flags":{"isOptional":true},"type":{"type":"reflection","declaration":{"name":"__type","kind":65536,"children":[{"name":"height","kind":1024,"type":{"type":"intrinsic","name":"number"}},{"name":"width","kind":1024,"type":{"type":"intrinsic","name":"number"}},{"name":"x","kind":1024,"type":{"type":"intrinsic","name":"number"}},{"name":"y","kind":1024,"type":{"type":"intrinsic","name":"number"}}]}}},{"name":"thumbnailTime","kind":1024,"flags":{"isOptional":true},"type":{"type":"intrinsic","name":"number"}},{"name":"type","kind":1024,"type":{"type":"union","types":[{"type":"intrinsic","name":"string"},{"type":"literal","value":null}]}},{"name":"typeHint","kind":1024,"flags":{"isOptional":true},"type":{"type":"intrinsic","name":"string"}},{"name":"url","kind":1024,"type":{"type":"union","types":[{"type":"intrinsic","name":"string"},{"type":"literal","value":null}]}}]}}},{"name":"NotificationContentInput","kind":4194304,"comment":{"summary":[{"kind":"text","text":"An object represents notification content that you pass in to "},{"kind":"code","text":"`presentNotificationAsync`"},{"kind":"text","text":" or as a part of "},{"kind":"code","text":"`NotificationRequestInput`"},{"kind":"text","text":"."}]},"type":{"type":"reflection","declaration":{"name":"__type","kind":65536,"children":[{"name":"attachments","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"The visual and audio attachments to display alongside the notification’s main content."}],"blockTags":[{"tag":"@platform","content":[{"kind":"text","text":"ios"}]}]},"type":{"type":"array","elementType":{"type":"reference","name":"NotificationContentAttachmentIos"}}},{"name":"autoDismiss","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"If set to "},{"kind":"code","text":"`true`"},{"kind":"text","text":", the notification cannot be dismissed by swipe. This setting defaults\nto "},{"kind":"code","text":"`false`"},{"kind":"text","text":" if not provided or is invalid. Corresponds directly do Android's "},{"kind":"code","text":"`isOngoing`"},{"kind":"text","text":" behavior.\nSee [Android developer documentation](https://developer.android.com/reference/android/app/Notification.Builder#setOngoing(boolean))\nfor more details."}],"blockTags":[{"tag":"@platform","content":[{"kind":"text","text":"android"}]}]},"type":{"type":"intrinsic","name":"boolean"}},{"name":"badge","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"Application badge number associated with the notification."}]},"type":{"type":"intrinsic","name":"number"}},{"name":"body","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"The main content of the notification."}]},"type":{"type":"union","types":[{"type":"intrinsic","name":"string"},{"type":"literal","value":null}]}},{"name":"categoryIdentifier","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"The identifier of the notification’s category."}],"blockTags":[{"tag":"@platform","content":[{"kind":"text","text":"ios"}]}]},"type":{"type":"intrinsic","name":"string"}},{"name":"color","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"Accent color (in "},{"kind":"code","text":"`#AARRGGBB`"},{"kind":"text","text":" or "},{"kind":"code","text":"`#RRGGBB`"},{"kind":"text","text":" format) to be applied by the standard Style templates when presenting this notification."}],"blockTags":[{"tag":"@platform","content":[{"kind":"text","text":"android"}]}]},"type":{"type":"intrinsic","name":"string"}},{"name":"data","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"Data associated with the notification, not displayed."}]},"type":{"type":"reference","typeArguments":[{"type":"intrinsic","name":"string"},{"type":"intrinsic","name":"any"}],"name":"Record","qualifiedName":"Record","package":"typescript"}},{"name":"launchImageName","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"The name of the image or storyboard to use when your app launches because of the notification."}]},"type":{"type":"intrinsic","name":"string"}},{"name":"priority","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"Relative priority for this notification. Priority is an indication of how much of the user's valuable attention should be consumed by this notification.\nLow-priority notifications may be hidden from the user in certain situations, while the user might be interrupted for a higher-priority notification.\nThe system will make a determination about how to interpret this priority when presenting the notification."}],"blockTags":[{"tag":"@platform","content":[{"kind":"text","text":"android"}]}]},"type":{"type":"intrinsic","name":"string"}},{"name":"sound","kind":1024,"flags":{"isOptional":true},"type":{"type":"union","types":[{"type":"intrinsic","name":"boolean"},{"type":"intrinsic","name":"string"}]}},{"name":"sticky","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"If set to "},{"kind":"code","text":"`false`"},{"kind":"text","text":", the notification will not be automatically dismissed when clicked.\nthe setting used when the value is not provided or is invalid is "},{"kind":"code","text":"`true`"},{"kind":"text","text":" (the notification\nwill be dismissed automatically). Corresponds directly to Android's "},{"kind":"code","text":"`setAutoCancel`"},{"kind":"text","text":"\nbehavior. In Firebase terms this property of a notification is called "},{"kind":"code","text":"`sticky`"},{"kind":"text","text":".\n\nSee [Android developer documentation](https://developer.android.com/reference/android/app/Notification.Builder#setAutoCancel(boolean))\nand [Firebase documentation](https://firebase.google.com/docs/reference/fcm/rest/v1/projects.messages#AndroidNotification.FIELDS.sticky)\nfor more details."}],"blockTags":[{"tag":"@platform","content":[{"kind":"text","text":"android"}]}]},"type":{"type":"intrinsic","name":"boolean"}},{"name":"subtitle","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"On Android: "},{"kind":"code","text":"`subText`"},{"kind":"text","text":" - the display depends on the device.\n\nOn iOS: "},{"kind":"code","text":"`subtitle`"},{"kind":"text","text":" - the bold text displayed between title and the rest of the content."}]},"type":{"type":"union","types":[{"type":"intrinsic","name":"string"},{"type":"literal","value":null}]}},{"name":"title","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"Notification title - the bold text displayed above the rest of the content."}]},"type":{"type":"union","types":[{"type":"intrinsic","name":"string"},{"type":"literal","value":null}]}},{"name":"vibrate","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"The pattern with which to vibrate."}],"blockTags":[{"tag":"@platform","content":[{"kind":"text","text":"android"}]}]},"type":{"type":"array","elementType":{"type":"intrinsic","name":"number"}}}]}}},{"name":"NotificationContentIos","kind":4194304,"comment":{"summary":[{"kind":"text","text":"See [Apple documentation](https://developer.apple.com/documentation/usernotifications/unnotificationcontent?language=objc) for more information on specific fields."}]},"type":{"type":"reflection","declaration":{"name":"__type","kind":65536,"children":[{"name":"attachments","kind":1024,"comment":{"summary":[{"kind":"text","text":"The visual and audio attachments to display alongside the notification’s main content."}]},"type":{"type":"array","elementType":{"type":"reference","name":"NotificationContentAttachmentIos"}}},{"name":"badge","kind":1024,"comment":{"summary":[{"kind":"text","text":"The number that your app’s icon displays."}]},"type":{"type":"union","types":[{"type":"intrinsic","name":"number"},{"type":"literal","value":null}]}},{"name":"categoryIdentifier","kind":1024,"comment":{"summary":[{"kind":"text","text":"The identifier of the notification’s category."}]},"type":{"type":"union","types":[{"type":"intrinsic","name":"string"},{"type":"literal","value":null}]}},{"name":"launchImageName","kind":1024,"comment":{"summary":[{"kind":"text","text":"The name of the image or storyboard to use when your app launches because of the notification."}]},"type":{"type":"union","types":[{"type":"intrinsic","name":"string"},{"type":"literal","value":null}]}},{"name":"summaryArgument","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"The text the system adds to the notification summary to provide additional context."}]},"type":{"type":"union","types":[{"type":"intrinsic","name":"string"},{"type":"literal","value":null}]}},{"name":"summaryArgumentCount","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"The number the system adds to the notification summary when the notification represents multiple items."}]},"type":{"type":"intrinsic","name":"number"}},{"name":"targetContentIdentifier","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"The value your app uses to determine which scene to display to handle the notification."}]},"type":{"type":"intrinsic","name":"string"}},{"name":"threadIdentifier","kind":1024,"comment":{"summary":[{"kind":"text","text":"The identifier that groups related notifications."}]},"type":{"type":"union","types":[{"type":"intrinsic","name":"string"},{"type":"literal","value":null}]}}]}}},{"name":"NotificationHandlingError","kind":4194304,"type":{"type":"union","types":[{"type":"reference","name":"NotificationTimeoutError"},{"type":"reference","name":"Error","qualifiedName":"Error","package":"typescript"}]}},{"name":"NotificationTrigger","kind":4194304,"comment":{"summary":[{"kind":"text","text":"A union type containing different triggers which may cause the notification to be delivered to the application."}]},"type":{"type":"union","types":[{"type":"reference","name":"PushNotificationTrigger"},{"type":"reference","name":"CalendarNotificationTrigger"},{"type":"reference","name":"LocationNotificationTrigger"},{"type":"reference","name":"TimeIntervalNotificationTrigger"},{"type":"reference","name":"DailyNotificationTrigger"},{"type":"reference","name":"WeeklyNotificationTrigger"},{"type":"reference","name":"YearlyNotificationTrigger"},{"type":"reference","name":"UnknownNotificationTrigger"}]}},{"name":"NotificationTriggerInput","kind":4194304,"comment":{"summary":[{"kind":"text","text":"A type represents possible triggers with which you can schedule notifications.\nA "},{"kind":"code","text":"`null`"},{"kind":"text","text":" trigger means that the notification should be scheduled for delivery immediately."}]},"type":{"type":"union","types":[{"type":"literal","value":null},{"type":"reference","name":"ChannelAwareTriggerInput"},{"type":"reference","name":"SchedulableNotificationTriggerInput"}]}},{"name":"PermissionExpiration","kind":4194304,"comment":{"summary":[{"kind":"text","text":"Permission expiration time. Currently, all permissions are granted permanently."}]},"type":{"type":"union","types":[{"type":"literal","value":"never"},{"type":"intrinsic","name":"number"}]}},{"name":"PermissionHookOptions","kind":4194304,"typeParameters":[{"name":"Options","kind":131072,"type":{"type":"intrinsic","name":"object"}}],"type":{"type":"intersection","types":[{"type":"reference","name":"PermissionHookBehavior"},{"type":"reference","name":"Options"}]}},{"name":"PushNotificationTrigger","kind":4194304,"comment":{"summary":[{"kind":"text","text":"An object represents a notification delivered by a push notification system.\n\nOn Android under "},{"kind":"code","text":"`remoteMessage`"},{"kind":"text","text":" field a JS version of the Firebase "},{"kind":"code","text":"`RemoteMessage`"},{"kind":"text","text":" may be accessed.\nOn iOS under "},{"kind":"code","text":"`payload`"},{"kind":"text","text":" you may find full contents of ["},{"kind":"code","text":"`UNNotificationContent`"},{"kind":"text","text":"'s](https://developer.apple.com/documentation/usernotifications/unnotificationcontent?language=objc) ["},{"kind":"code","text":"`userInfo`"},{"kind":"text","text":"](https://developer.apple.com/documentation/usernotifications/unnotificationcontent/1649869-userinfo?language=objc), for example [remote notification payload](https://developer.apple.com/library/archive/documentation/NetworkingInternet/Conceptual/RemoteNotificationsPG/CreatingtheNotificationPayload.html)\nOn web there is no extra data."}]},"type":{"type":"reflection","declaration":{"name":"__type","kind":65536,"children":[{"name":"payload","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[],"blockTags":[{"tag":"@platform","content":[{"kind":"text","text":"ios"}]}]},"type":{"type":"reference","typeArguments":[{"type":"intrinsic","name":"string"},{"type":"intrinsic","name":"unknown"}],"name":"Record","qualifiedName":"Record","package":"typescript"}},{"name":"remoteMessage","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[],"blockTags":[{"tag":"@platform","content":[{"kind":"text","text":"android"}]}]},"type":{"type":"reference","name":"FirebaseRemoteMessage"}},{"name":"type","kind":1024,"type":{"type":"literal","value":"push"}}]}}},{"name":"PushTokenListener","kind":4194304,"type":{"type":"reflection","declaration":{"name":"__type","kind":65536,"signatures":[{"name":"__type","kind":4096,"comment":{"summary":[{"kind":"text","text":"A function accepting a device push token (["},{"kind":"code","text":"`DevicePushToken`"},{"kind":"text","text":"](#devicepushtoken)) as an argument.\n> **Note:** You should not call "},{"kind":"code","text":"`getDevicePushTokenAsync`"},{"kind":"text","text":" inside this function, as it triggers the listener and may lead to an infinite loop."}],"blockTags":[{"tag":"@header","content":[{"kind":"text","text":"fetch"}]}]},"parameters":[{"name":"token","kind":32768,"type":{"type":"reference","name":"DevicePushToken"}}],"type":{"type":"intrinsic","name":"void"}}]}}},{"name":"SchedulableNotificationTriggerInput","kind":4194304,"comment":{"summary":[{"kind":"text","text":"A type represents time-based, schedulable triggers. For these triggers you can check the next trigger date\nwith ["},{"kind":"code","text":"`getNextTriggerDateAsync`"},{"kind":"text","text":"](#notificationsgetnexttriggerdateasynctrigger)."}]},"type":{"type":"union","types":[{"type":"reference","name":"DateTriggerInput"},{"type":"reference","name":"TimeIntervalTriggerInput"},{"type":"reference","name":"DailyTriggerInput"},{"type":"reference","name":"WeeklyTriggerInput"},{"type":"reference","name":"YearlyTriggerInput"},{"type":"reference","name":"CalendarTriggerInput"}]}},{"name":"Subscription","kind":4194304,"type":{"type":"reflection","declaration":{"name":"__type","kind":65536,"children":[{"name":"remove","kind":1024,"type":{"type":"reflection","declaration":{"name":"__type","kind":65536,"signatures":[{"name":"__type","kind":4096,"comment":{"summary":[{"kind":"text","text":"A method to unsubscribe the listener."}]},"type":{"type":"intrinsic","name":"void"}}]}}}]}}},{"name":"DEFAULT_ACTION_IDENTIFIER","kind":32,"flags":{"isConst":true},"type":{"type":"literal","value":"expo.modules.notifications.actions.DEFAULT"},"defaultValue":"'expo.modules.notifications.actions.DEFAULT'"},{"name":"addNotificationReceivedListener","kind":64,"signatures":[{"name":"addNotificationReceivedListener","kind":4096,"comment":{"summary":[{"kind":"text","text":"Listeners registered by this method will be called whenever a notification is received while the app is running."}],"blockTags":[{"tag":"@returns","content":[{"kind":"text","text":"A ["},{"kind":"code","text":"`Subscription`"},{"kind":"text","text":"](#subscription) object represents the subscription of the provided listener."}]},{"tag":"@example","content":[{"kind":"text","text":"Registering a notification listener using a React hook:\n"},{"kind":"code","text":"```jsx\nimport React from 'react';\nimport * as Notifications from 'expo-notifications';\n\nexport default function App() {\n React.useEffect(() => {\n const subscription = Notifications.addNotificationReceivedListener(notification => {\n console.log(notification);\n });\n return () => subscription.remove();\n }, []);\n\n return (\n // Your app content\n );\n}\n```"}]},{"tag":"@header","content":[{"kind":"text","text":"listen"}]}]},"parameters":[{"name":"listener","kind":32768,"comment":{"summary":[{"kind":"text","text":"A function accepting a notification (["},{"kind":"code","text":"`Notification`"},{"kind":"text","text":"](#notification)) as an argument."}]},"type":{"type":"reflection","declaration":{"name":"__type","kind":65536,"signatures":[{"name":"__type","kind":4096,"parameters":[{"name":"event","kind":32768,"type":{"type":"reference","name":"Notification"}}],"type":{"type":"intrinsic","name":"void"}}]}}}],"type":{"type":"reference","name":"Subscription"}}]},{"name":"addNotificationResponseReceivedListener","kind":64,"signatures":[{"name":"addNotificationResponseReceivedListener","kind":4096,"comment":{"summary":[{"kind":"text","text":"Listeners registered by this method will be called whenever a user interacts with a notification (for example, taps on it)."}],"blockTags":[{"tag":"@returns","content":[{"kind":"text","text":"A ["},{"kind":"code","text":"`Subscription`"},{"kind":"text","text":"](#subscription) object represents the subscription of the provided listener."}]},{"tag":"@example","content":[{"kind":"text","text":"Register a notification responder listener:\n"},{"kind":"code","text":"```jsx\nimport React from 'react';\nimport { Linking } from 'react-native';\nimport * as Notifications from 'expo-notifications';\n\nexport default function Container() {\n React.useEffect(() => {\n const subscription = Notifications.addNotificationResponseReceivedListener(response => {\n const url = response.notification.request.content.data.url;\n Linking.openURL(url);\n });\n return () => subscription.remove();\n }, []);\n\n return (\n // Your app content\n );\n}\n```"}]},{"tag":"@header","content":[{"kind":"text","text":"listen"}]}]},"parameters":[{"name":"listener","kind":32768,"comment":{"summary":[{"kind":"text","text":"A function accepting notification response (["},{"kind":"code","text":"`NotificationResponse`"},{"kind":"text","text":"](#notificationresponse)) as an argument."}]},"type":{"type":"reflection","declaration":{"name":"__type","kind":65536,"signatures":[{"name":"__type","kind":4096,"parameters":[{"name":"event","kind":32768,"type":{"type":"reference","name":"NotificationResponse"}}],"type":{"type":"intrinsic","name":"void"}}]}}}],"type":{"type":"reference","name":"Subscription"}}]},{"name":"addNotificationsDroppedListener","kind":64,"signatures":[{"name":"addNotificationsDroppedListener","kind":4096,"comment":{"summary":[{"kind":"text","text":"Listeners registered by this method will be called whenever some notifications have been dropped by the server.\nApplicable only to Firebase Cloud Messaging which we use as a notifications service on Android. It corresponds to "},{"kind":"code","text":"`onDeletedMessages()`"},{"kind":"text","text":" callback.\nMore information can be found in [Firebase docs](https://firebase.google.com/docs/cloud-messaging/android/receive#override-ondeletedmessages)."}],"blockTags":[{"tag":"@returns","content":[{"kind":"text","text":"A ["},{"kind":"code","text":"`Subscription`"},{"kind":"text","text":"](#subscription) object represents the subscription of the provided listener."}]},{"tag":"@header","content":[{"kind":"text","text":"listen"}]}]},"parameters":[{"name":"listener","kind":32768,"comment":{"summary":[{"kind":"text","text":"A callback function."}]},"type":{"type":"reflection","declaration":{"name":"__type","kind":65536,"signatures":[{"name":"__type","kind":4096,"type":{"type":"intrinsic","name":"void"}}]}}}],"type":{"type":"reference","name":"Subscription"}}]},{"name":"addPushTokenListener","kind":64,"signatures":[{"name":"addPushTokenListener","kind":4096,"comment":{"summary":[{"kind":"text","text":"In rare situations, a push token may be changed by the push notification service while the app is running.\nWhen a token is rolled, the old one becomes invalid and sending notifications to it will fail.\nA push token listener will let you handle this situation gracefully by registering the new token with your backend right away."}],"blockTags":[{"tag":"@returns","content":[{"kind":"text","text":"A ["},{"kind":"code","text":"`Subscription`"},{"kind":"text","text":"](#subscription) object represents the subscription of the provided listener."}]},{"tag":"@header","content":[{"kind":"text","text":"fetch"}]},{"tag":"@example","content":[{"kind":"text","text":"Registering a push token listener using a React hook.\n"},{"kind":"code","text":"```jsx\nimport React from 'react';\nimport * as Notifications from 'expo-notifications';\n\nimport { registerDevicePushTokenAsync } from '../api';\n\nexport default function App() {\n React.useEffect(() => {\n const subscription = Notifications.addPushTokenListener(registerDevicePushTokenAsync);\n return () => subscription.remove();\n }, []);\n\n return (\n // Your app content\n );\n}\n```"}]}]},"parameters":[{"name":"listener","kind":32768,"comment":{"summary":[{"kind":"text","text":"A function accepting a push token as an argument, it will be called whenever the push token changes."}]},"type":{"type":"reference","name":"PushTokenListener"}}],"type":{"type":"reference","name":"Subscription"}}]},{"name":"cancelAllScheduledNotificationsAsync","kind":64,"signatures":[{"name":"cancelAllScheduledNotificationsAsync","kind":4096,"comment":{"summary":[{"kind":"text","text":"Cancels all scheduled notifications."}],"blockTags":[{"tag":"@returns","content":[{"kind":"text","text":"A Promise that resolves once all the scheduled notifications are successfully canceled, or if there are no scheduled notifications."}]},{"tag":"@header","content":[{"kind":"text","text":"schedule"}]}]},"type":{"type":"reference","typeArguments":[{"type":"intrinsic","name":"void"}],"name":"Promise","qualifiedName":"Promise","package":"typescript"}}]},{"name":"cancelScheduledNotificationAsync","kind":64,"signatures":[{"name":"cancelScheduledNotificationAsync","kind":4096,"comment":{"summary":[{"kind":"text","text":"Cancels a single scheduled notification. The scheduled notification of given ID will not trigger."}],"blockTags":[{"tag":"@returns","content":[{"kind":"text","text":"A Promise resolves once the scheduled notification is successfully canceled or if there is no scheduled notification for a given identifier."}]},{"tag":"@example","content":[{"kind":"text","text":"Schedule and then cancel the notification:\n"},{"kind":"code","text":"```ts\nimport * as Notifications from 'expo-notifications';\n\nasync function scheduleAndCancel() {\n const identifier = await Notifications.scheduleNotificationAsync({\n content: {\n title: 'Hey!',\n },\n trigger: { seconds: 60, repeats: true },\n });\n await Notifications.cancelScheduledNotificationAsync(identifier);\n}\n```"}]},{"tag":"@header","content":[{"kind":"text","text":"schedule"}]}]},"parameters":[{"name":"identifier","kind":32768,"comment":{"summary":[{"kind":"text","text":"The notification identifier with which "},{"kind":"code","text":"`scheduleNotificationAsync`"},{"kind":"text","text":" method resolved when the notification has been scheduled."}]},"type":{"type":"intrinsic","name":"string"}}],"type":{"type":"reference","typeArguments":[{"type":"intrinsic","name":"void"}],"name":"Promise","qualifiedName":"Promise","package":"typescript"}}]},{"name":"deleteNotificationCategoryAsync","kind":64,"signatures":[{"name":"deleteNotificationCategoryAsync","kind":4096,"comment":{"summary":[{"kind":"text","text":"Deletes the category associated with the provided identifier."}],"blockTags":[{"tag":"@returns","content":[{"kind":"text","text":"A Promise which resolves to "},{"kind":"code","text":"`true`"},{"kind":"text","text":" if the category was successfully deleted, or "},{"kind":"code","text":"`false`"},{"kind":"text","text":" if it was not.\nAn example of when this method would return "},{"kind":"code","text":"`false`"},{"kind":"text","text":" is if you try to delete a category that doesn't exist."}]},{"tag":"@platform","content":[{"kind":"text","text":"android"}]},{"tag":"@platform","content":[{"kind":"text","text":"ios"}]},{"tag":"@header","content":[{"kind":"text","text":"categories"}]}]},"parameters":[{"name":"identifier","kind":32768,"comment":{"summary":[{"kind":"text","text":"Identifier initially provided to "},{"kind":"code","text":"`setNotificationCategoryAsync`"},{"kind":"text","text":" when creating the category."}]},"type":{"type":"intrinsic","name":"string"}}],"type":{"type":"reference","typeArguments":[{"type":"intrinsic","name":"boolean"}],"name":"Promise","qualifiedName":"Promise","package":"typescript"}}]},{"name":"deleteNotificationChannelAsync","kind":64,"signatures":[{"name":"deleteNotificationChannelAsync","kind":4096,"comment":{"summary":[{"kind":"text","text":"Removes the notification channel."}],"blockTags":[{"tag":"@returns","content":[{"kind":"text","text":"A Promise which resolving once the channel is removed (or if there was no channel for given identifier)."}]},{"tag":"@platform","content":[{"kind":"text","text":"android"}]},{"tag":"@header","content":[{"kind":"text","text":"channels"}]}]},"parameters":[{"name":"channelId","kind":32768,"comment":{"summary":[{"kind":"text","text":"The channel identifier."}]},"type":{"type":"intrinsic","name":"string"}}],"type":{"type":"reference","typeArguments":[{"type":"intrinsic","name":"void"}],"name":"Promise","qualifiedName":"Promise","package":"typescript"}}]},{"name":"deleteNotificationChannelGroupAsync","kind":64,"signatures":[{"name":"deleteNotificationChannelGroupAsync","kind":4096,"comment":{"summary":[{"kind":"text","text":"Removes the notification channel group and all notification channels that belong to it."}],"blockTags":[{"tag":"@returns","content":[{"kind":"text","text":"A Promise which resolves once the channel group is removed (or if there was no channel group for given identifier)."}]},{"tag":"@platform","content":[{"kind":"text","text":"android"}]},{"tag":"@header","content":[{"kind":"text","text":"channels"}]}]},"parameters":[{"name":"groupId","kind":32768,"comment":{"summary":[{"kind":"text","text":"The channel group identifier."}]},"type":{"type":"intrinsic","name":"string"}}],"type":{"type":"reference","typeArguments":[{"type":"intrinsic","name":"void"}],"name":"Promise","qualifiedName":"Promise","package":"typescript"}}]},{"name":"dismissAllNotificationsAsync","kind":64,"signatures":[{"name":"dismissAllNotificationsAsync","kind":4096,"comment":{"summary":[{"kind":"text","text":"Removes all application's notifications displayed in the notification tray (Notification Center)."}],"blockTags":[{"tag":"@returns","content":[{"kind":"text","text":"A Promise which resolves once the request to dismiss the notifications is successfully dispatched to the notifications manager."}]},{"tag":"@header","content":[{"kind":"text","text":"dismiss"}]}]},"type":{"type":"reference","typeArguments":[{"type":"intrinsic","name":"void"}],"name":"Promise","qualifiedName":"Promise","package":"typescript"}}]},{"name":"dismissNotificationAsync","kind":64,"signatures":[{"name":"dismissNotificationAsync","kind":4096,"comment":{"summary":[{"kind":"text","text":"Removes notification displayed in the notification tray (Notification Center)."}],"blockTags":[{"tag":"@returns","content":[{"kind":"text","text":"A Promise which resolves once the request to dismiss the notification is successfully dispatched to the notifications manager."}]},{"tag":"@header","content":[{"kind":"text","text":"dismiss"}]}]},"parameters":[{"name":"notificationIdentifier","kind":32768,"comment":{"summary":[{"kind":"text","text":"The notification identifier, obtained either via "},{"kind":"code","text":"`setNotificationHandler`"},{"kind":"text","text":" method or in the listener added with "},{"kind":"code","text":"`addNotificationReceivedListener`"},{"kind":"text","text":"."}]},"type":{"type":"intrinsic","name":"string"}}],"type":{"type":"reference","typeArguments":[{"type":"intrinsic","name":"void"}],"name":"Promise","qualifiedName":"Promise","package":"typescript"}}]},{"name":"getAllScheduledNotificationsAsync","kind":64,"signatures":[{"name":"getAllScheduledNotificationsAsync","kind":4096,"comment":{"summary":[{"kind":"text","text":"Fetches information about all scheduled notifications."}],"blockTags":[{"tag":"@returns","content":[{"kind":"text","text":"Returns a Promise resolving to an array of objects conforming to the ["},{"kind":"code","text":"`Notification`"},{"kind":"text","text":"](#notification) interface."}]},{"tag":"@header","content":[{"kind":"text","text":"schedule"}]}]},"type":{"type":"reference","typeArguments":[{"type":"array","elementType":{"type":"reference","name":"NotificationRequest"}}],"name":"Promise","qualifiedName":"Promise","package":"typescript"}}]},{"name":"getBadgeCountAsync","kind":64,"signatures":[{"name":"getBadgeCountAsync","kind":4096,"comment":{"summary":[{"kind":"text","text":"Fetches the number currently set as the badge of the app icon on device's home screen. A "},{"kind":"code","text":"`0`"},{"kind":"text","text":" value means that the badge is not displayed.\n> **Note:** Not all Android launchers support application badges. If the launcher does not support icon badges, the method will always resolve to "},{"kind":"code","text":"`0`"},{"kind":"text","text":"."}],"blockTags":[{"tag":"@returns","content":[{"kind":"text","text":"Returns a Promise resolving to a number that represents the current badge of the app icon."}]},{"tag":"@header","content":[{"kind":"text","text":"badge"}]}]},"type":{"type":"reference","typeArguments":[{"type":"intrinsic","name":"number"}],"name":"Promise","qualifiedName":"Promise","package":"typescript"}}]},{"name":"getDevicePushTokenAsync","kind":64,"signatures":[{"name":"getDevicePushTokenAsync","kind":4096,"comment":{"summary":[{"kind":"text","text":"Returns a native FCM, APNs token or a ["},{"kind":"code","text":"`PushSubscription`"},{"kind":"text","text":" data](https://developer.mozilla.org/en-US/docs/Web/API/PushSubscription)\nthat can be used with another push notification service."}],"blockTags":[{"tag":"@header","content":[{"kind":"text","text":"fetch"}]}]},"type":{"type":"reference","typeArguments":[{"type":"reference","name":"DevicePushToken"}],"name":"Promise","qualifiedName":"Promise","package":"typescript"}}]},{"name":"getExpoPushTokenAsync","kind":64,"signatures":[{"name":"getExpoPushTokenAsync","kind":4096,"comment":{"summary":[{"kind":"text","text":"Returns an Expo token that can be used to send a push notification to the device using Expo's push notifications service.\n\nThis method makes requests to the Expo's servers. It can get rejected in cases where the request itself fails\n(for example, due to the device being offline, experiencing a network timeout, or other HTTPS request failures).\nTo provide offline support to your users, you should "},{"kind":"code","text":"`try/catch`"},{"kind":"text","text":" this method and implement retry logic to attempt\nto get the push token later, once the device is back online.\n\n> For Expo's backend to be able to send notifications to your app, you will need to provide it with push notification keys.\nFor more information, see [credentials](/push-notifications/push-notifications-setup/#get-credentials-for-development-builds) in the push notifications setup."}],"blockTags":[{"tag":"@returns","content":[{"kind":"text","text":"Returns a "},{"kind":"code","text":"`Promise`"},{"kind":"text","text":" that resolves to an object representing acquired push token."}]},{"tag":"@header","content":[{"kind":"text","text":"fetch"}]},{"tag":"@example","content":[{"kind":"code","text":"```ts\nimport * as Notifications from 'expo-notifications';\n\nexport async function registerForPushNotificationsAsync(userId: string) {\n const expoPushToken = await Notifications.getExpoPushTokenAsync({\n projectId: 'your-project-id',\n });\n\n await fetch('https://example.com/', {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify({\n userId,\n expoPushToken,\n }),\n });\n}\n```"}]}]},"parameters":[{"name":"options","kind":32768,"comment":{"summary":[{"kind":"text","text":"Object allowing you to pass in push notification configuration."}]},"type":{"type":"reference","name":"ExpoPushTokenOptions"},"defaultValue":"{}"}],"type":{"type":"reference","typeArguments":[{"type":"reference","name":"ExpoPushToken"}],"name":"Promise","qualifiedName":"Promise","package":"typescript"}}]},{"name":"getLastNotificationResponseAsync","kind":64,"signatures":[{"name":"getLastNotificationResponseAsync","kind":4096,"comment":{"summary":[],"blockTags":[{"tag":"@header","content":[{"kind":"text","text":"listen"}]}]},"type":{"type":"reference","typeArguments":[{"type":"union","types":[{"type":"reference","name":"NotificationResponse"},{"type":"literal","value":null}]}],"name":"Promise","qualifiedName":"Promise","package":"typescript"}}]},{"name":"getNextTriggerDateAsync","kind":64,"signatures":[{"name":"getNextTriggerDateAsync","kind":4096,"comment":{"summary":[{"kind":"text","text":"Allows you to check what will be the next trigger date for given notification trigger input."}],"blockTags":[{"tag":"@returns","content":[{"kind":"text","text":"If the return value is "},{"kind":"code","text":"`null`"},{"kind":"text","text":", the notification won't be triggered. Otherwise, the return value is the Unix timestamp in milliseconds\nat which the notification will be triggered."}]},{"tag":"@example","content":[{"kind":"text","text":"Calculate next trigger date for a notification trigger:\n"},{"kind":"code","text":"```ts\nimport * as Notifications from 'expo-notifications';\n\nasync function logNextTriggerDate() {\n try {\n const nextTriggerDate = await Notifications.getNextTriggerDateAsync({\n hour: 9,\n minute: 0,\n });\n console.log(nextTriggerDate === null ? 'No next trigger date' : new Date(nextTriggerDate));\n } catch (e) {\n console.warn(`Couldn't have calculated next trigger date: ${e}`);\n }\n}\n```"}]},{"tag":"@header","content":[{"kind":"text","text":"schedule"}]}]},"parameters":[{"name":"trigger","kind":32768,"comment":{"summary":[{"kind":"text","text":"The schedulable notification trigger you would like to check next trigger date for (of type ["},{"kind":"code","text":"`SchedulableNotificationTriggerInput`"},{"kind":"text","text":"](#schedulablenotificationtriggerinput))."}]},"type":{"type":"reference","name":"SchedulableNotificationTriggerInput"}}],"type":{"type":"reference","typeArguments":[{"type":"union","types":[{"type":"intrinsic","name":"number"},{"type":"literal","value":null}]}],"name":"Promise","qualifiedName":"Promise","package":"typescript"}}]},{"name":"getNotificationCategoriesAsync","kind":64,"signatures":[{"name":"getNotificationCategoriesAsync","kind":4096,"comment":{"summary":[{"kind":"text","text":"Fetches information about all known notification categories."}],"blockTags":[{"tag":"@returns","content":[{"kind":"text","text":"A Promise which resolves to an array of "},{"kind":"code","text":"`NotificationCategory`"},{"kind":"text","text":"s. On platforms that do not support notification channels,\nit will always resolve to an empty array."}]},{"tag":"@platform","content":[{"kind":"text","text":"android"}]},{"tag":"@platform","content":[{"kind":"text","text":"ios"}]},{"tag":"@header","content":[{"kind":"text","text":"categories"}]}]},"type":{"type":"reference","typeArguments":[{"type":"array","elementType":{"type":"reference","name":"NotificationCategory"}}],"name":"Promise","qualifiedName":"Promise","package":"typescript"}}]},{"name":"getNotificationChannelAsync","kind":64,"signatures":[{"name":"getNotificationChannelAsync","kind":4096,"comment":{"summary":[{"kind":"text","text":"Fetches information about a single notification channel."}],"blockTags":[{"tag":"@returns","content":[{"kind":"text","text":"A Promise which resolves to the channel object (of type ["},{"kind":"code","text":"`NotificationChannel`"},{"kind":"text","text":"](#notificationchannel)) or to "},{"kind":"code","text":"`null`"},{"kind":"text","text":"\nif there was no channel found for this identifier. On platforms that do not support notification channels, it will always resolve to "},{"kind":"code","text":"`null`"},{"kind":"text","text":"."}]},{"tag":"@platform","content":[{"kind":"text","text":"android"}]},{"tag":"@header","content":[{"kind":"text","text":"channels"}]}]},"parameters":[{"name":"channelId","kind":32768,"comment":{"summary":[{"kind":"text","text":"The channel's identifier."}]},"type":{"type":"intrinsic","name":"string"}}],"type":{"type":"reference","typeArguments":[{"type":"union","types":[{"type":"reference","name":"NotificationChannel"},{"type":"literal","value":null}]}],"name":"Promise","qualifiedName":"Promise","package":"typescript"}}]},{"name":"getNotificationChannelGroupAsync","kind":64,"signatures":[{"name":"getNotificationChannelGroupAsync","kind":4096,"comment":{"summary":[{"kind":"text","text":"Fetches information about a single notification channel group."}],"blockTags":[{"tag":"@returns","content":[{"kind":"text","text":"A Promise which resolves to the channel group object (of type ["},{"kind":"code","text":"`NotificationChannelGroup`"},{"kind":"text","text":"](#notificationchannelgroup))\nor to "},{"kind":"code","text":"`null`"},{"kind":"text","text":" if there was no channel group found for this identifier. On platforms that do not support notification channels,\nit will always resolve to "},{"kind":"code","text":"`null`"},{"kind":"text","text":"."}]},{"tag":"@platform","content":[{"kind":"text","text":"android"}]},{"tag":"@header","content":[{"kind":"text","text":"channels"}]}]},"parameters":[{"name":"groupId","kind":32768,"comment":{"summary":[{"kind":"text","text":"The channel group's identifier."}]},"type":{"type":"intrinsic","name":"string"}}],"type":{"type":"reference","typeArguments":[{"type":"union","types":[{"type":"reference","name":"NotificationChannelGroup"},{"type":"literal","value":null}]}],"name":"Promise","qualifiedName":"Promise","package":"typescript"}}]},{"name":"getNotificationChannelGroupsAsync","kind":64,"signatures":[{"name":"getNotificationChannelGroupsAsync","kind":4096,"comment":{"summary":[{"kind":"text","text":"Fetches information about all known notification channel groups."}],"blockTags":[{"tag":"@returns","content":[{"kind":"text","text":"A Promise which resoles to an array of channel groups. On platforms that do not support notification channel groups,\nit will always resolve to an empty array."}]},{"tag":"@platform","content":[{"kind":"text","text":"android"}]},{"tag":"@header","content":[{"kind":"text","text":"channels"}]}]},"type":{"type":"reference","typeArguments":[{"type":"array","elementType":{"type":"reference","name":"NotificationChannelGroup"}}],"name":"Promise","qualifiedName":"Promise","package":"typescript"}}]},{"name":"getNotificationChannelsAsync","kind":64,"signatures":[{"name":"getNotificationChannelsAsync","kind":4096,"comment":{"summary":[{"kind":"text","text":"Fetches information about all known notification channels."}],"blockTags":[{"tag":"@returns","content":[{"kind":"text","text":"A Promise which resolves to an array of channels. On platforms that do not support notification channels,\nit will always resolve to an empty array."}]},{"tag":"@platform","content":[{"kind":"text","text":"android"}]},{"tag":"@header","content":[{"kind":"text","text":"channels"}]}]},"type":{"type":"reference","typeArguments":[{"type":"array","elementType":{"type":"reference","name":"NotificationChannel"}}],"name":"Promise","qualifiedName":"Promise","package":"typescript"}}]},{"name":"getPermissionsAsync","kind":64,"signatures":[{"name":"getPermissionsAsync","kind":4096,"comment":{"summary":[{"kind":"text","text":"Calling this function checks current permissions settings related to notifications.\nIt lets you verify whether the app is currently allowed to display alerts, play sounds, etc.\nThere is no user-facing effect of calling this."}],"blockTags":[{"tag":"@returns","content":[{"kind":"text","text":"It returns a "},{"kind":"code","text":"`Promise`"},{"kind":"text","text":" resolving to an object represents permission settings (["},{"kind":"code","text":"`NotificationPermissionsStatus`"},{"kind":"text","text":"](#notificationpermissionsstatus)).\nOn iOS, make sure you [properly interpret the permissions response](#interpreting-the-ios-permissions-response)."}]},{"tag":"@example","content":[{"kind":"text","text":"Check if the app is allowed to send any type of notifications (interrupting and non-interrupting–provisional on iOS).\n"},{"kind":"code","text":"```ts\nimport * as Notifications from 'expo-notifications';\n\nexport async function allowsNotificationsAsync() {\n const settings = await Notifications.getPermissionsAsync();\n return (\n settings.granted || settings.ios?.status === Notifications.IosAuthorizationStatus.PROVISIONAL\n );\n}\n```"}]},{"tag":"@header","content":[{"kind":"text","text":"permissions"}]}]},"type":{"type":"reference","typeArguments":[{"type":"reference","name":"NotificationPermissionsStatus"}],"name":"Promise","qualifiedName":"Promise","package":"typescript"}}]},{"name":"getPresentedNotificationsAsync","kind":64,"signatures":[{"name":"getPresentedNotificationsAsync","kind":4096,"comment":{"summary":[{"kind":"text","text":"Fetches information about all notifications present in the notification tray (Notification Center).\n> This method is not supported on Android below 6.0 (API level 23) – on these devices it will resolve to an empty array."}],"blockTags":[{"tag":"@returns","content":[{"kind":"text","text":"A Promise which resolves with a list of notifications (["},{"kind":"code","text":"`Notification`"},{"kind":"text","text":"](#notification)) currently present in the notification tray (Notification Center)."}]},{"tag":"@header","content":[{"kind":"text","text":"dismiss"}]}]},"type":{"type":"reference","typeArguments":[{"type":"array","elementType":{"type":"reference","name":"Notification"}}],"name":"Promise","qualifiedName":"Promise","package":"typescript"}}]},{"name":"presentNotificationAsync","kind":64,"signatures":[{"name":"presentNotificationAsync","kind":4096,"comment":{"summary":[{"kind":"text","text":"Schedules a notification for immediate trigger."}],"blockTags":[{"tag":"@returns","content":[{"kind":"text","text":"It returns a Promise resolving with the notification's identifier once the notification is successfully scheduled for immediate display."}]},{"tag":"@header","content":[{"kind":"text","text":"schedule"}]},{"tag":"@deprecated","content":[{"kind":"text","text":"This method has been deprecated in favor of using an explicit "},{"kind":"code","text":"`NotificationHandler`"},{"kind":"text","text":" and the ["},{"kind":"code","text":"`scheduleNotificationAsync`"},{"kind":"text","text":"](#notificationsschedulenotificationasyncrequest) method. More information can be found in our [FYI document](https://expo.fyi/presenting-notifications-deprecated)."}]}]},"parameters":[{"name":"content","kind":32768,"comment":{"summary":[{"kind":"text","text":"An object representing the notification content."}]},"type":{"type":"reference","name":"NotificationContentInput"}},{"name":"identifier","kind":32768,"type":{"type":"intrinsic","name":"string"},"defaultValue":"..."}],"type":{"type":"reference","typeArguments":[{"type":"intrinsic","name":"string"}],"name":"Promise","qualifiedName":"Promise","package":"typescript"}}]},{"name":"registerTaskAsync","kind":64,"signatures":[{"name":"registerTaskAsync","kind":4096,"comment":{"summary":[{"kind":"text","text":"When a notification is received while the app is backgrounded, using this function you can set a callback that will be run in response to that notification.\nUnder the hood, this function is run using "},{"kind":"code","text":"`expo-task-manager`"},{"kind":"text","text":". You **must** define the task first, with ["},{"kind":"code","text":"`TaskManager.defineTask`"},{"kind":"text","text":"](/task-manager#taskmanagerdefinetasktaskname-taskexecutor).\nMake sure you define it in the global scope.\n\nThe callback function you define with "},{"kind":"code","text":"`TaskManager.defineTask`"},{"kind":"text","text":" will receive an object with the following fields:\n- "},{"kind":"code","text":"`data`"},{"kind":"text","text":": The remote payload delivered by either FCM (Android) or APNs (iOS). [See here for details](#pushnotificationtrigger).\n- "},{"kind":"code","text":"`error`"},{"kind":"text","text":": The error (if any) that occurred during execution of the task.\n- "},{"kind":"code","text":"`executionInfo`"},{"kind":"text","text":": JSON object of additional info related to the task, including the "},{"kind":"code","text":"`taskName`"},{"kind":"text","text":"."}],"blockTags":[{"tag":"@example","content":[{"kind":"code","text":"```ts\nimport * as TaskManager from 'expo-task-manager';\nimport * as Notifications from 'expo-notifications';\n\nconst BACKGROUND_NOTIFICATION_TASK = 'BACKGROUND-NOTIFICATION-TASK';\n\nTaskManager.defineTask(BACKGROUND_NOTIFICATION_TASK, ({ data, error, executionInfo }) => {\n console.log('Received a notification in the background!');\n // Do something with the notification data\n});\n\nNotifications.registerTaskAsync(BACKGROUND_NOTIFICATION_TASK);\n```"}]},{"tag":"@header","content":[{"kind":"text","text":"inBackground"}]}]},"parameters":[{"name":"taskName","kind":32768,"comment":{"summary":[{"kind":"text","text":"The string you passed to "},{"kind":"code","text":"`TaskManager.defineTask`"},{"kind":"text","text":" as the "},{"kind":"code","text":"`taskName`"},{"kind":"text","text":" parameter."}]},"type":{"type":"intrinsic","name":"string"}}],"type":{"type":"reference","typeArguments":[{"type":"literal","value":null}],"name":"Promise","qualifiedName":"Promise","package":"typescript"}}]},{"name":"removeNotificationSubscription","kind":64,"signatures":[{"name":"removeNotificationSubscription","kind":4096,"comment":{"summary":[{"kind":"text","text":"Removes a notification subscription returned by an "},{"kind":"code","text":"`addNotificationListener`"},{"kind":"text","text":" call."}],"blockTags":[{"tag":"@header","content":[{"kind":"text","text":"listen"}]}]},"parameters":[{"name":"subscription","kind":32768,"comment":{"summary":[{"kind":"text","text":"A subscription returned by "},{"kind":"code","text":"`addNotificationListener`"},{"kind":"text","text":" method."}]},"type":{"type":"reference","name":"Subscription"}}],"type":{"type":"intrinsic","name":"void"}}]},{"name":"removePushTokenSubscription","kind":64,"signatures":[{"name":"removePushTokenSubscription","kind":4096,"comment":{"summary":[{"kind":"text","text":"Removes a push token subscription returned by an "},{"kind":"code","text":"`addPushTokenListener`"},{"kind":"text","text":" call."}],"blockTags":[{"tag":"@header","content":[{"kind":"text","text":"fetch"}]}]},"parameters":[{"name":"subscription","kind":32768,"comment":{"summary":[{"kind":"text","text":"A subscription returned by "},{"kind":"code","text":"`addPushTokenListener`"},{"kind":"text","text":" method."}]},"type":{"type":"reference","name":"Subscription"}}],"type":{"type":"intrinsic","name":"void"}}]},{"name":"requestPermissionsAsync","kind":64,"signatures":[{"name":"requestPermissionsAsync","kind":4096,"comment":{"summary":[{"kind":"text","text":"Prompts the user for notification permissions according to request. **Request defaults to asking the user to allow displaying alerts,\nsetting badge count and playing sounds**."}],"blockTags":[{"tag":"@returns","content":[{"kind":"text","text":"It returns a Promise resolving to an object represents permission settings (["},{"kind":"code","text":"`NotificationPermissionsStatus`"},{"kind":"text","text":"](#notificationpermissionsstatus)).\nOn iOS, make sure you [properly interpret the permissions response](#interpreting-the-ios-permissions-response)."}]},{"tag":"@example","content":[{"kind":"text","text":"Prompts the user to allow the app to show alerts, play sounds, set badge count and let Siri read out messages through AirPods.\n"},{"kind":"code","text":"```ts\nimport * as Notifications from 'expo-notifications';\n\nexport function requestPermissionsAsync() {\n return await Notifications.requestPermissionsAsync({\n ios: {\n allowAlert: true,\n allowBadge: true,\n allowSound: true,\n allowAnnouncements: true,\n },\n });\n}\n```"}]},{"tag":"@header","content":[{"kind":"text","text":"permissions"}]}]},"parameters":[{"name":"permissions","kind":32768,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"An object representing configuration for the request scope."}]},"type":{"type":"reference","name":"NotificationPermissionsRequest"}}],"type":{"type":"reference","typeArguments":[{"type":"reference","name":"NotificationPermissionsStatus"}],"name":"Promise","qualifiedName":"Promise","package":"typescript"}}]},{"name":"scheduleNotificationAsync","kind":64,"signatures":[{"name":"scheduleNotificationAsync","kind":4096,"comment":{"summary":[{"kind":"text","text":"Schedules a notification to be triggered in the future.\n> **Note:** Please note that this does not mean that the notification will be presented when it is triggered.\nFor the notification to be presented you have to set a notification handler with ["},{"kind":"code","text":"`setNotificationHandler`"},{"kind":"text","text":"](#notificationssetnotificationhandlerhandler)\nthat will return an appropriate notification behavior. For more information see the example below."}],"blockTags":[{"tag":"@returns","content":[{"kind":"text","text":"Returns a Promise resolving to a string which is a notification identifier you can later use to cancel the notification or to identify an incoming notification."}]},{"tag":"@example","content":[{"kind":"text","text":"# Schedule the notification that will trigger once, in one minute from now\n"},{"kind":"code","text":"```ts\nimport * as Notifications from 'expo-notifications';\n\nNotifications.scheduleNotificationAsync({\n content: {\n title: \"Time's up!\",\n body: 'Change sides!',\n },\n trigger: {\n seconds: 60,\n },\n});\n```"},{"kind":"text","text":"\n\n# Schedule the notification that will trigger repeatedly, every 20 minutes\n"},{"kind":"code","text":"```ts\nimport * as Notifications from 'expo-notifications';\n\nNotifications.scheduleNotificationAsync({\n content: {\n title: 'Remember to drink water!',\n },\n trigger: {\n seconds: 60 * 20,\n repeats: true,\n },\n});\n```"},{"kind":"text","text":"\n\n# Schedule the notification that will trigger once, at the beginning of next hour\n"},{"kind":"code","text":"```ts\nimport * as Notifications from 'expo-notifications';\n\nconst trigger = new Date(Date.now() + 60 * 60 * 1000);\ntrigger.setMinutes(0);\ntrigger.setSeconds(0);\n\nNotifications.scheduleNotificationAsync({\n content: {\n title: 'Happy new hour!',\n },\n trigger,\n});\n```"}]},{"tag":"@header","content":[{"kind":"text","text":"schedule"}]}]},"parameters":[{"name":"request","kind":32768,"comment":{"summary":[{"kind":"text","text":"An object describing the notification to be triggered."}]},"type":{"type":"reference","name":"NotificationRequestInput"}}],"type":{"type":"reference","typeArguments":[{"type":"intrinsic","name":"string"}],"name":"Promise","qualifiedName":"Promise","package":"typescript"}}]},{"name":"setAutoServerRegistrationEnabledAsync","kind":64,"signatures":[{"name":"setAutoServerRegistrationEnabledAsync","kind":4096,"comment":{"summary":[{"kind":"text","text":"Sets the registration information so that the device push token gets pushed\nto the given registration endpoint"}]},"parameters":[{"name":"enabled","kind":32768,"type":{"type":"intrinsic","name":"boolean"}}],"type":{"type":"reference","typeArguments":[{"type":"intrinsic","name":"void"}],"name":"Promise","qualifiedName":"Promise","package":"typescript"}}]},{"name":"setBadgeCountAsync","kind":64,"signatures":[{"name":"setBadgeCountAsync","kind":4096,"comment":{"summary":[{"kind":"text","text":"Sets the badge of the app's icon to the specified number. Setting it to "},{"kind":"code","text":"`0`"},{"kind":"text","text":" clears the badge. On iOS, this method requires that you have requested\nthe user's permission for "},{"kind":"code","text":"`allowBadge`"},{"kind":"text","text":" via ["},{"kind":"code","text":"`requestPermissionsAsync`"},{"kind":"text","text":"](#notificationsrequestpermissionsasyncpermissions),\notherwise it will automatically return "},{"kind":"code","text":"`false`"},{"kind":"text","text":".\n> **Note:** Not all Android launchers support application badges. If the launcher does not support icon badges, the method will resolve to "},{"kind":"code","text":"`false`"},{"kind":"text","text":"."}],"blockTags":[{"tag":"@returns","content":[{"kind":"text","text":"It returns a Promise resolving to a boolean representing whether the setting of the badge succeeded."}]},{"tag":"@header","content":[{"kind":"text","text":"badge"}]}]},"parameters":[{"name":"badgeCount","kind":32768,"comment":{"summary":[{"kind":"text","text":"The count which should appear on the badge. A value of "},{"kind":"code","text":"`0`"},{"kind":"text","text":" will clear the badge."}]},"type":{"type":"intrinsic","name":"number"}},{"name":"options","kind":32768,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"An object of options configuring behavior applied in Web environment."}]},"type":{"type":"reference","name":"SetBadgeCountOptions"}}],"type":{"type":"reference","typeArguments":[{"type":"intrinsic","name":"boolean"}],"name":"Promise","qualifiedName":"Promise","package":"typescript"}}]},{"name":"setNotificationCategoryAsync","kind":64,"signatures":[{"name":"setNotificationCategoryAsync","kind":4096,"comment":{"summary":[{"kind":"text","text":"Sets the new notification category."}],"blockTags":[{"tag":"@returns","content":[{"kind":"text","text":"A Promise which resolves to the category you just have created."}]},{"tag":"@platform","content":[{"kind":"text","text":"android"}]},{"tag":"@platform","content":[{"kind":"text","text":"ios"}]},{"tag":"@header","content":[{"kind":"text","text":"categories"}]}]},"parameters":[{"name":"identifier","kind":32768,"comment":{"summary":[{"kind":"text","text":"A string to associate as the ID of this category. You will pass this string in as the "},{"kind":"code","text":"`categoryIdentifier`"},{"kind":"text","text":"\nin your ["},{"kind":"code","text":"`NotificationContent`"},{"kind":"text","text":"](#notificationcontent) to associate a notification with this category.\n> Don't use the characters "},{"kind":"code","text":"`:`"},{"kind":"text","text":" or "},{"kind":"code","text":"`-`"},{"kind":"text","text":" in your category identifier. If you do, categories might not work as expected."}]},"type":{"type":"intrinsic","name":"string"}},{"name":"actions","kind":32768,"comment":{"summary":[{"kind":"text","text":"An array of ["},{"kind":"code","text":"`NotificationAction`"},{"kind":"text","text":"s](#notificationaction), which describe the actions associated with this category."}]},"type":{"type":"array","elementType":{"type":"reference","name":"NotificationAction"}}},{"name":"options","kind":32768,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"An optional object of additional configuration options for your category."}]},"type":{"type":"reference","name":"NotificationCategoryOptions"}}],"type":{"type":"reference","typeArguments":[{"type":"reference","name":"NotificationCategory"}],"name":"Promise","qualifiedName":"Promise","package":"typescript"}}]},{"name":"setNotificationChannelAsync","kind":64,"signatures":[{"name":"setNotificationChannelAsync","kind":4096,"comment":{"summary":[{"kind":"text","text":"Assigns the channel configuration to a channel of a specified name (creating it if need be).\nThis method lets you assign given notification channel to a notification channel group.\n\n> **Note:** For some settings to be applied on all Android versions, it may be necessary to duplicate the configuration across both\n> a single notification and its respective notification channel.\n\nFor example, for a notification to play a custom sound on Android versions **below** 8.0,\nthe custom notification sound has to be set on the notification (through the ["},{"kind":"code","text":"`NotificationContentInput`"},{"kind":"text","text":"](#notificationcontentinput)),\nand for the custom sound to play on Android versions **above** 8.0, the relevant notification channel must have the custom sound configured\n(through the ["},{"kind":"code","text":"`NotificationChannelInput`"},{"kind":"text","text":"](#notificationchannelinput)). For more information,\nsee [\"Setting custom notification sounds on Android\"](#setting-custom-notification-sounds-on-android)."}],"blockTags":[{"tag":"@returns","content":[{"kind":"text","text":"A Promise which resolving to the object (of type ["},{"kind":"code","text":"`NotificationChannel`"},{"kind":"text","text":"](#notificationchannel)) describing the modified channel\nor to "},{"kind":"code","text":"`null`"},{"kind":"text","text":" if the platform does not support notification channels."}]},{"tag":"@platform","content":[{"kind":"text","text":"android"}]},{"tag":"@header","content":[{"kind":"text","text":"channels"}]}]},"parameters":[{"name":"channelId","kind":32768,"comment":{"summary":[{"kind":"text","text":"The channel identifier."}]},"type":{"type":"intrinsic","name":"string"}},{"name":"channel","kind":32768,"comment":{"summary":[{"kind":"text","text":"Object representing the channel's configuration."}]},"type":{"type":"reference","name":"NotificationChannelInput"}}],"type":{"type":"reference","typeArguments":[{"type":"union","types":[{"type":"reference","name":"NotificationChannel"},{"type":"literal","value":null}]}],"name":"Promise","qualifiedName":"Promise","package":"typescript"}}]},{"name":"setNotificationChannelGroupAsync","kind":64,"signatures":[{"name":"setNotificationChannelGroupAsync","kind":4096,"comment":{"summary":[{"kind":"text","text":"Assigns the channel group configuration to a channel group of a specified name (creating it if need be)."}],"blockTags":[{"tag":"@returns","content":[{"kind":"text","text":"A "},{"kind":"code","text":"`Promise`"},{"kind":"text","text":" resolving to the object (of type ["},{"kind":"code","text":"`NotificationChannelGroup`"},{"kind":"text","text":"](#notificationchannelgroup))\ndescribing the modified channel group or to "},{"kind":"code","text":"`null`"},{"kind":"text","text":" if the platform does not support notification channels."}]},{"tag":"@platform","content":[{"kind":"text","text":"android"}]},{"tag":"@header","content":[{"kind":"text","text":"channels"}]}]},"parameters":[{"name":"groupId","kind":32768,"comment":{"summary":[{"kind":"text","text":"The channel group's identifier."}]},"type":{"type":"intrinsic","name":"string"}},{"name":"group","kind":32768,"comment":{"summary":[{"kind":"text","text":"Object representing the channel group configuration."}]},"type":{"type":"reference","name":"NotificationChannelGroupInput"}}],"type":{"type":"reference","typeArguments":[{"type":"union","types":[{"type":"reference","name":"NotificationChannelGroup"},{"type":"literal","value":null}]}],"name":"Promise","qualifiedName":"Promise","package":"typescript"}}]},{"name":"setNotificationHandler","kind":64,"signatures":[{"name":"setNotificationHandler","kind":4096,"comment":{"summary":[{"kind":"text","text":"When a notification is received while the app is running, using this function you can set a callback that will decide\nwhether the notification should be shown to the user or not.\n\nWhen a notification is received, "},{"kind":"code","text":"`handleNotification`"},{"kind":"text","text":" is called with the incoming notification as an argument.\nThe function should respond with a behavior object within 3 seconds, otherwise, the notification will be discarded.\nIf the notification is handled successfully, "},{"kind":"code","text":"`handleSuccess`"},{"kind":"text","text":" is called with the identifier of the notification,\notherwise (or on timeout) "},{"kind":"code","text":"`handleError`"},{"kind":"text","text":" will be called.\n\nThe default behavior when the handler is not set or does not respond in time is not to show the notification."}],"blockTags":[{"tag":"@example","content":[{"kind":"text","text":"Implementing a notification handler that always shows the notification when it is received.\n"},{"kind":"code","text":"```jsx\nimport * as Notifications from 'expo-notifications';\n\nNotifications.setNotificationHandler({\n handleNotification: async () => ({\n shouldShowAlert: true,\n shouldPlaySound: false,\n shouldSetBadge: false,\n }),\n});\n```"}]},{"tag":"@header","content":[{"kind":"text","text":"inForeground"}]}]},"parameters":[{"name":"handler","kind":32768,"comment":{"summary":[{"kind":"text","text":"A single parameter which should be either "},{"kind":"code","text":"`null`"},{"kind":"text","text":" (if you want to clear the handler) or a ["},{"kind":"code","text":"`NotificationHandler`"},{"kind":"text","text":"](#notificationhandler) object."}]},"type":{"type":"union","types":[{"type":"literal","value":null},{"type":"reference","name":"NotificationHandler"}]}}],"type":{"type":"intrinsic","name":"void"}}]},{"name":"unregisterForNotificationsAsync","kind":64,"signatures":[{"name":"unregisterForNotificationsAsync","kind":4096,"type":{"type":"reference","typeArguments":[{"type":"intrinsic","name":"void"}],"name":"Promise","qualifiedName":"Promise","package":"typescript"}}]},{"name":"unregisterTaskAsync","kind":64,"signatures":[{"name":"unregisterTaskAsync","kind":4096,"comment":{"summary":[{"kind":"text","text":"Used to unregister tasks registered with "},{"kind":"code","text":"`registerTaskAsync`"},{"kind":"text","text":" method."}],"blockTags":[{"tag":"@header","content":[{"kind":"text","text":"inBackground"}]}]},"parameters":[{"name":"taskName","kind":32768,"comment":{"summary":[{"kind":"text","text":"The string you passed to "},{"kind":"code","text":"`registerTaskAsync`"},{"kind":"text","text":" as the "},{"kind":"code","text":"`taskName`"},{"kind":"text","text":" parameter."}]},"type":{"type":"intrinsic","name":"string"}}],"type":{"type":"reference","typeArguments":[{"type":"literal","value":null}],"name":"Promise","qualifiedName":"Promise","package":"typescript"}}]},{"name":"useLastNotificationResponse","kind":64,"signatures":[{"name":"useLastNotificationResponse","kind":4096,"comment":{"summary":[{"kind":"text","text":"A React hook always returns the notification response that was received most recently\n(a notification response designates an interaction with a notification, such as tapping on it).\n\n> If you don't want to use a hook, you can use "},{"kind":"code","text":"`Notifications.getLastNotificationResponseAsync()`"},{"kind":"text","text":" instead."}],"blockTags":[{"tag":"@returns","content":[{"kind":"text","text":"The hook may return one of these three types/values:\n- "},{"kind":"code","text":"`undefined`"},{"kind":"text","text":" - until we're sure of what to return,\n- "},{"kind":"code","text":"`null`"},{"kind":"text","text":" - if no notification response has been received yet,\n- a ["},{"kind":"code","text":"`NotificationResponse`"},{"kind":"text","text":"](#notificationresponse) object - if a notification response was received."}]},{"tag":"@example","content":[{"kind":"text","text":"Responding to a notification tap by opening a URL that could be put into the notification's "},{"kind":"code","text":"`data`"},{"kind":"text","text":"\n(opening the URL is your responsibility and is not a part of the "},{"kind":"code","text":"`expo-notifications`"},{"kind":"text","text":" API):\n"},{"kind":"code","text":"```jsx\nimport * as Notifications from 'expo-notifications';\nimport { Linking } from 'react-native';\n\nexport default function App() {\n const lastNotificationResponse = Notifications.useLastNotificationResponse();\n React.useEffect(() => {\n if (\n lastNotificationResponse &&\n lastNotificationResponse.notification.request.content.data.url &&\n lastNotificationResponse.actionIdentifier === Notifications.DEFAULT_ACTION_IDENTIFIER\n ) {\n Linking.openURL(lastNotificationResponse.notification.request.content.data.url);\n }\n }, [lastNotificationResponse]);\n return (\n // Your app content\n );\n}\n```"}]},{"tag":"@header","content":[{"kind":"text","text":"listen"}]}]},"type":{"type":"union","types":[{"type":"intrinsic","name":"undefined"},{"type":"literal","value":null},{"type":"reference","name":"NotificationResponse"}]}}]},{"name":"usePermissions","kind":64,"signatures":[{"name":"usePermissions","kind":4096,"comment":{"summary":[{"kind":"text","text":"Check or request permissions to send and receive push notifications.\nThis uses both "},{"kind":"code","text":"`requestPermissionsAsync`"},{"kind":"text","text":" and "},{"kind":"code","text":"`getPermissionsAsync`"},{"kind":"text","text":" to interact with the permissions."}],"blockTags":[{"tag":"@example","content":[{"kind":"code","text":"```ts\nconst [permissionResponse, requestPermission] = Notifications.usePermissions();\n```"}]},{"tag":"@header","content":[{"kind":"text","text":"permission"}]}]},"parameters":[{"name":"options","kind":32768,"flags":{"isOptional":true},"type":{"type":"reference","typeArguments":[{"type":"reference","name":"NotificationPermissionsRequest"}],"name":"PermissionHookOptions"}}],"type":{"type":"tuple","elements":[{"type":"union","types":[{"type":"literal","value":null},{"type":"reference","name":"NotificationPermissionsStatus"}]},{"type":"reference","typeArguments":[{"type":"reference","name":"NotificationPermissionsStatus"}],"name":"RequestPermissionMethod"},{"type":"reference","typeArguments":[{"type":"reference","name":"NotificationPermissionsStatus"}],"name":"GetPermissionMethod"}]}}]}]}
\ No newline at end of file
diff --git a/docs/public/static/data/v49.0.0/expo-pedometer.json b/docs/public/static/data/v49.0.0/expo-pedometer.json
new file mode 100644
index 0000000000000..36c3bffd25d8a
--- /dev/null
+++ b/docs/public/static/data/v49.0.0/expo-pedometer.json
@@ -0,0 +1 @@
+{"name":"expo-pedometer","kind":1,"children":[{"name":"PermissionStatus","kind":8,"children":[{"name":"DENIED","kind":16,"comment":{"summary":[{"kind":"text","text":"User has denied the permission."}]},"type":{"type":"literal","value":"denied"}},{"name":"GRANTED","kind":16,"comment":{"summary":[{"kind":"text","text":"User has granted the permission."}]},"type":{"type":"literal","value":"granted"}},{"name":"UNDETERMINED","kind":16,"comment":{"summary":[{"kind":"text","text":"User hasn't granted or denied the permission yet."}]},"type":{"type":"literal","value":"undetermined"}}]},{"name":"PermissionResponse","kind":256,"comment":{"summary":[{"kind":"text","text":"An object obtained by permissions get and request functions."}]},"children":[{"name":"canAskAgain","kind":1024,"comment":{"summary":[{"kind":"text","text":"Indicates if user can be asked again for specific permission.\nIf not, one should be directed to the Settings app\nin order to enable/disable the permission."}]},"type":{"type":"intrinsic","name":"boolean"}},{"name":"expires","kind":1024,"comment":{"summary":[{"kind":"text","text":"Determines time when the permission expires."}]},"type":{"type":"reference","name":"PermissionExpiration"}},{"name":"granted","kind":1024,"comment":{"summary":[{"kind":"text","text":"A convenience boolean that indicates if the permission is granted."}]},"type":{"type":"intrinsic","name":"boolean"}},{"name":"status","kind":1024,"comment":{"summary":[{"kind":"text","text":"Determines the status of the permission."}]},"type":{"type":"reference","name":"PermissionStatus"}}]},{"name":"PedometerResult","kind":4194304,"type":{"type":"reflection","declaration":{"name":"__type","kind":65536,"children":[{"name":"steps","kind":1024,"comment":{"summary":[{"kind":"text","text":"Number of steps taken between the given dates."}]},"type":{"type":"intrinsic","name":"number"}}]}}},{"name":"PedometerUpdateCallback","kind":4194304,"type":{"type":"reflection","declaration":{"name":"__type","kind":65536,"signatures":[{"name":"__type","kind":4096,"comment":{"summary":[{"kind":"text","text":"Callback function providing event result as an argument."}]},"parameters":[{"name":"result","kind":32768,"type":{"type":"reference","name":"PedometerResult"}}],"type":{"type":"intrinsic","name":"void"}}]}}},{"name":"PermissionExpiration","kind":4194304,"comment":{"summary":[{"kind":"text","text":"Permission expiration time. Currently, all permissions are granted permanently."}]},"type":{"type":"union","types":[{"type":"literal","value":"never"},{"type":"intrinsic","name":"number"}]}},{"name":"Subscription","kind":4194304,"type":{"type":"reflection","declaration":{"name":"__type","kind":65536,"children":[{"name":"remove","kind":1024,"type":{"type":"reflection","declaration":{"name":"__type","kind":65536,"signatures":[{"name":"__type","kind":4096,"comment":{"summary":[{"kind":"text","text":"A method to unsubscribe the listener."}]},"type":{"type":"intrinsic","name":"void"}}]}}}]}}},{"name":"getPermissionsAsync","kind":64,"signatures":[{"name":"getPermissionsAsync","kind":4096,"comment":{"summary":[{"kind":"text","text":"Checks user's permissions for accessing pedometer."}]},"type":{"type":"reference","typeArguments":[{"type":"reference","name":"PermissionResponse"}],"name":"Promise","qualifiedName":"Promise","package":"typescript"}}]},{"name":"getStepCountAsync","kind":64,"signatures":[{"name":"getStepCountAsync","kind":4096,"comment":{"summary":[{"kind":"text","text":"Get the step count between two dates."}],"blockTags":[{"tag":"@returns","content":[{"kind":"text","text":"Returns a promise that fulfills with a ["},{"kind":"code","text":"`PedometerResult`"},{"kind":"text","text":"](#pedometerresult).\n\nAs [Apple documentation states](https://developer.apple.com/documentation/coremotion/cmpedometer/1613946-querypedometerdatafromdate?language=objc):\n> Only the past seven days worth of data is stored and available for you to retrieve. Specifying\n> a start date that is more than seven days in the past returns only the available data."}]},{"tag":"@platform","content":[{"kind":"text","text":"ios"}]}]},"parameters":[{"name":"start","kind":32768,"comment":{"summary":[{"kind":"text","text":"A date indicating the start of the range over which to measure steps."}]},"type":{"type":"reference","name":"Date","qualifiedName":"Date","package":"typescript"}},{"name":"end","kind":32768,"comment":{"summary":[{"kind":"text","text":"A date indicating the end of the range over which to measure steps."}]},"type":{"type":"reference","name":"Date","qualifiedName":"Date","package":"typescript"}}],"type":{"type":"reference","typeArguments":[{"type":"reference","name":"PedometerResult"}],"name":"Promise","qualifiedName":"Promise","package":"typescript"}}]},{"name":"isAvailableAsync","kind":64,"signatures":[{"name":"isAvailableAsync","kind":4096,"comment":{"summary":[{"kind":"text","text":"Returns whether the pedometer is enabled on the device."}],"blockTags":[{"tag":"@returns","content":[{"kind":"text","text":"Returns a promise that fulfills with a "},{"kind":"code","text":"`boolean`"},{"kind":"text","text":", indicating whether the pedometer is\navailable on this device."}]}]},"type":{"type":"reference","typeArguments":[{"type":"intrinsic","name":"boolean"}],"name":"Promise","qualifiedName":"Promise","package":"typescript"}}]},{"name":"requestPermissionsAsync","kind":64,"signatures":[{"name":"requestPermissionsAsync","kind":4096,"comment":{"summary":[{"kind":"text","text":"Asks the user to grant permissions for accessing pedometer."}]},"type":{"type":"reference","typeArguments":[{"type":"reference","name":"PermissionResponse"}],"name":"Promise","qualifiedName":"Promise","package":"typescript"}}]},{"name":"watchStepCount","kind":64,"signatures":[{"name":"watchStepCount","kind":4096,"comment":{"summary":[{"kind":"text","text":"Subscribe to pedometer updates."}],"blockTags":[{"tag":"@returns","content":[{"kind":"text","text":"Returns a ["},{"kind":"code","text":"`Subscription`"},{"kind":"text","text":"](#subscription) that enables you to call\n"},{"kind":"code","text":"`remove()`"},{"kind":"text","text":" when you would like to unsubscribe the listener."}]}]},"parameters":[{"name":"callback","kind":32768,"comment":{"summary":[{"kind":"text","text":"A callback that is invoked when new step count data is available. The callback is\nprovided with a single argument that is ["},{"kind":"code","text":"`PedometerResult`"},{"kind":"text","text":"](#pedometerresult)."}]},"type":{"type":"reference","name":"PedometerUpdateCallback"}}],"type":{"type":"reference","name":"Subscription"}}]}]}
\ No newline at end of file
diff --git a/docs/public/static/data/v49.0.0/expo-print.json b/docs/public/static/data/v49.0.0/expo-print.json
new file mode 100644
index 0000000000000..8bb860ed2db50
--- /dev/null
+++ b/docs/public/static/data/v49.0.0/expo-print.json
@@ -0,0 +1 @@
+{"name":"expo-print","kind":1,"children":[{"name":"OrientationType","kind":256,"comment":{"summary":[{"kind":"text","text":"The possible values of orientation for the printed content."}]},"children":[{"name":"landscape","kind":1024,"type":{"type":"intrinsic","name":"string"}},{"name":"portrait","kind":1024,"type":{"type":"intrinsic","name":"string"}}]},{"name":"FilePrintOptions","kind":4194304,"type":{"type":"reflection","declaration":{"name":"__type","kind":65536,"children":[{"name":"base64","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"Whether to include base64 encoded string of the file in the returned object."}]},"type":{"type":"intrinsic","name":"boolean"}},{"name":"height","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"Height of the single page in pixels. Defaults to "},{"kind":"code","text":"`792`"},{"kind":"text","text":" which is a height of US Letter paper\nformat with 72 PPI."}]},"type":{"type":"intrinsic","name":"number"}},{"name":"html","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"HTML string to print into PDF file."}]},"type":{"type":"intrinsic","name":"string"}},{"name":"margins","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"Page margins for the printed document."}],"blockTags":[{"tag":"@platform","content":[{"kind":"text","text":"ios"}]}]},"type":{"type":"reference","name":"PageMargins"}},{"name":"useMarkupFormatter","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"Alternative to default option that uses [UIMarkupTextPrintFormatter](https://developer.apple.com/documentation/uikit/uimarkuptextprintformatter)\ninstead of WebView, but it doesn't display images."}],"blockTags":[{"tag":"@platform","content":[{"kind":"text","text":"ios"}]}]},"type":{"type":"intrinsic","name":"boolean"}},{"name":"width","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"Width of the single page in pixels. Defaults to "},{"kind":"code","text":"`612`"},{"kind":"text","text":" which is a width of US Letter paper\nformat with 72 PPI."}]},"type":{"type":"intrinsic","name":"number"}}]}}},{"name":"FilePrintResult","kind":4194304,"type":{"type":"reflection","declaration":{"name":"__type","kind":65536,"children":[{"name":"base64","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"Base64 encoded string containing the data of the PDF file. **Available only if "},{"kind":"code","text":"`base64`"},{"kind":"text","text":"\noption is truthy**. It doesn't include data URI prefix "},{"kind":"code","text":"`data:application/pdf;base64,`"},{"kind":"text","text":"."}]},"type":{"type":"intrinsic","name":"string"}},{"name":"numberOfPages","kind":1024,"comment":{"summary":[{"kind":"text","text":"Number of pages that were needed to render given content."}]},"type":{"type":"intrinsic","name":"number"}},{"name":"uri","kind":1024,"comment":{"summary":[{"kind":"text","text":"A URI to the printed PDF file."}]},"type":{"type":"intrinsic","name":"string"}}]}}},{"name":"PrintOptions","kind":4194304,"type":{"type":"reflection","declaration":{"name":"__type","kind":65536,"children":[{"name":"height","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"Height of the single page in pixels. Defaults to "},{"kind":"code","text":"`792`"},{"kind":"text","text":" which is a height of US Letter paper\nformat with 72 PPI. **Available only with "},{"kind":"code","text":"`html`"},{"kind":"text","text":" option.**"}]},"type":{"type":"intrinsic","name":"number"}},{"name":"html","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"HTML string to print."}],"blockTags":[{"tag":"@platform","content":[{"kind":"text","text":"android"}]},{"tag":"@platform","content":[{"kind":"text","text":"ios"}]}]},"type":{"type":"intrinsic","name":"string"}},{"name":"margins","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"Page margins for the printed document."}],"blockTags":[{"tag":"@platform","content":[{"kind":"text","text":"ios"}]}]},"type":{"type":"reference","name":"PageMargins"}},{"name":"markupFormatterIOS","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[],"blockTags":[{"tag":"@deprecated","content":[{"kind":"text","text":"This argument is deprecated, use "},{"kind":"code","text":"`useMarkupFormatter`"},{"kind":"text","text":" instead.\nMight be removed in the future releases."}]},{"tag":"@platform","content":[{"kind":"text","text":"ios"}]}]},"type":{"type":"intrinsic","name":"string"}},{"name":"orientation","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"The orientation of the printed content, "},{"kind":"code","text":"`Print.Orientation.portrait`"},{"kind":"text","text":"\nor "},{"kind":"code","text":"`Print.Orientation.landscape`"},{"kind":"text","text":"."}],"blockTags":[{"tag":"@platform","content":[{"kind":"text","text":"ios"}]}]},"type":{"type":"union","types":[{"type":"indexedAccess","indexType":{"type":"literal","value":"portrait"},"objectType":{"type":"reference","name":"OrientationType"}},{"type":"indexedAccess","indexType":{"type":"literal","value":"landscape"},"objectType":{"type":"reference","name":"OrientationType"}}]}},{"name":"printerUrl","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"URL of the printer to use. Returned from "},{"kind":"code","text":"`selectPrinterAsync`"},{"kind":"text","text":"."}],"blockTags":[{"tag":"@platform","content":[{"kind":"text","text":"ios"}]}]},"type":{"type":"intrinsic","name":"string"}},{"name":"uri","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"URI of a PDF file to print. Remote, local (ex. selected via "},{"kind":"code","text":"`DocumentPicker`"},{"kind":"text","text":") or base64 data URI\nstarting with "},{"kind":"code","text":"`data:application/pdf;base64,`"},{"kind":"text","text":". This only supports PDF, not other types of\ndocument (e.g. images)."}]},"type":{"type":"intrinsic","name":"string"}},{"name":"useMarkupFormatter","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"Alternative to default option that uses [UIMarkupTextPrintFormatter](https://developer.apple.com/documentation/uikit/uimarkuptextprintformatter)\ninstead of WebView, but it doesn't display images."}],"blockTags":[{"tag":"@platform","content":[{"kind":"text","text":"ios"}]}]},"type":{"type":"intrinsic","name":"boolean"}},{"name":"width","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"Width of the single page in pixels. Defaults to "},{"kind":"code","text":"`612`"},{"kind":"text","text":" which is a width of US Letter paper\nformat with 72 PPI. **Available only with "},{"kind":"code","text":"`html`"},{"kind":"text","text":" option.**"}]},"type":{"type":"intrinsic","name":"number"}}]}}},{"name":"Printer","kind":4194304,"type":{"type":"reflection","declaration":{"name":"__type","kind":65536,"children":[{"name":"name","kind":1024,"comment":{"summary":[{"kind":"text","text":"Name of the printer."}]},"type":{"type":"intrinsic","name":"string"}},{"name":"url","kind":1024,"comment":{"summary":[{"kind":"text","text":"URL of the printer."}]},"type":{"type":"intrinsic","name":"string"}}]}}},{"name":"Orientation","kind":32,"flags":{"isConst":true},"comment":{"summary":[{"kind":"text","text":"The orientation of the printed content."}]},"type":{"type":"reference","name":"OrientationType"},"defaultValue":"ExponentPrint.Orientation"},{"name":"printAsync","kind":64,"signatures":[{"name":"printAsync","kind":4096,"comment":{"summary":[{"kind":"text","text":"Prints a document or HTML, on web this prints the HTML from the page.\n> Note: On iOS, printing from HTML source doesn't support local asset URLs (due to "},{"kind":"code","text":"`WKWebView`"},{"kind":"text","text":"\n> limitations). As a workaround you can use inlined base64-encoded strings.\n> See [this comment](https://github.com/expo/expo/issues/7940#issuecomment-657111033) for more details.\n\n> Note: on iOS, when printing without providing a "},{"kind":"code","text":"`PrintOptions.printerUrl`"},{"kind":"text","text":" the "},{"kind":"code","text":"`Promise`"},{"kind":"text","text":" will be\n> resolved once printing is started in the native print window and rejected if the window is closed without\n> starting the print. On Android the "},{"kind":"code","text":"`Promise`"},{"kind":"text","text":" will be resolved immediately after displaying the native print window\n> and won't be rejected if the window is closed without starting the print."}],"blockTags":[{"tag":"@returns","content":[{"kind":"text","text":"Resolves to an empty "},{"kind":"code","text":"`Promise`"},{"kind":"text","text":" if printing started."}]}]},"parameters":[{"name":"options","kind":32768,"comment":{"summary":[{"kind":"text","text":"A map defining what should be printed."}]},"type":{"type":"reference","name":"PrintOptions"}}],"type":{"type":"reference","typeArguments":[{"type":"intrinsic","name":"void"}],"name":"Promise","qualifiedName":"Promise","package":"typescript"}}]},{"name":"printToFileAsync","kind":64,"signatures":[{"name":"printToFileAsync","kind":4096,"comment":{"summary":[{"kind":"text","text":"Prints HTML to PDF file and saves it to [app's cache directory](./filesystem/#filesystemcachedirectory).\nOn Web this method opens the print dialog."}]},"parameters":[{"name":"options","kind":32768,"comment":{"summary":[{"kind":"text","text":"A map of print options."}]},"type":{"type":"reference","name":"FilePrintOptions"},"defaultValue":"{}"}],"type":{"type":"reference","typeArguments":[{"type":"reference","name":"FilePrintResult"}],"name":"Promise","qualifiedName":"Promise","package":"typescript"}}]},{"name":"selectPrinterAsync","kind":64,"signatures":[{"name":"selectPrinterAsync","kind":4096,"comment":{"summary":[{"kind":"text","text":"Chooses a printer that can be later used in "},{"kind":"code","text":"`printAsync`"}],"blockTags":[{"tag":"@returns","content":[{"kind":"text","text":"A promise which fulfils with an object containing "},{"kind":"code","text":"`name`"},{"kind":"text","text":" and "},{"kind":"code","text":"`url`"},{"kind":"text","text":" of the selected printer."}]},{"tag":"@platform","content":[{"kind":"text","text":"ios"}]}]},"type":{"type":"reference","typeArguments":[{"type":"reference","name":"Printer"}],"name":"Promise","qualifiedName":"Promise","package":"typescript"}}]}]}
\ No newline at end of file
diff --git a/docs/public/static/data/v49.0.0/expo-random.json b/docs/public/static/data/v49.0.0/expo-random.json
new file mode 100644
index 0000000000000..822957b3e395c
--- /dev/null
+++ b/docs/public/static/data/v49.0.0/expo-random.json
@@ -0,0 +1 @@
+{"name":"expo-random","kind":1,"children":[{"name":"getRandomBytes","kind":64,"signatures":[{"name":"getRandomBytes","kind":4096,"comment":{"summary":[{"kind":"text","text":"Generates completely random bytes using native implementations. The "},{"kind":"code","text":"`byteCount`"},{"kind":"text","text":" property\nis a "},{"kind":"code","text":"`number`"},{"kind":"text","text":" indicating the number of bytes to generate in the form of a "},{"kind":"code","text":"`Uint8Array`"},{"kind":"text","text":".\nFalls back to "},{"kind":"code","text":"`Math.random`"},{"kind":"text","text":" during development to prevent issues with React Native Debugger."}],"blockTags":[{"tag":"@returns","content":[{"kind":"text","text":"An array of random bytes with the same length as the "},{"kind":"code","text":"`byteCount`"},{"kind":"text","text":"."}]}]},"parameters":[{"name":"byteCount","kind":32768,"comment":{"summary":[{"kind":"text","text":"A number within the range from "},{"kind":"code","text":"`0`"},{"kind":"text","text":" to "},{"kind":"code","text":"`1024`"},{"kind":"text","text":". Anything else will throw a "},{"kind":"code","text":"`TypeError`"},{"kind":"text","text":"."}]},"type":{"type":"intrinsic","name":"number"}}],"type":{"type":"reference","name":"Uint8Array","qualifiedName":"Uint8Array","package":"typescript"}}]},{"name":"getRandomBytesAsync","kind":64,"signatures":[{"name":"getRandomBytesAsync","kind":4096,"comment":{"summary":[{"kind":"text","text":"Generates completely random bytes using native implementations. The "},{"kind":"code","text":"`byteCount`"},{"kind":"text","text":" property\nis a "},{"kind":"code","text":"`number`"},{"kind":"text","text":" indicating the number of bytes to generate in the form of a "},{"kind":"code","text":"`Uint8Array`"},{"kind":"text","text":"."}],"blockTags":[{"tag":"@returns","content":[{"kind":"text","text":"A promise that fulfills with an array of random bytes with the same length as the "},{"kind":"code","text":"`byteCount`"},{"kind":"text","text":"."}]}]},"parameters":[{"name":"byteCount","kind":32768,"comment":{"summary":[{"kind":"text","text":"A number within the range from "},{"kind":"code","text":"`0`"},{"kind":"text","text":" to "},{"kind":"code","text":"`1024`"},{"kind":"text","text":". Anything else will throw a "},{"kind":"code","text":"`TypeError`"},{"kind":"text","text":"."}]},"type":{"type":"intrinsic","name":"number"}}],"type":{"type":"reference","typeArguments":[{"type":"reference","name":"Uint8Array","qualifiedName":"Uint8Array","package":"typescript"}],"name":"Promise","qualifiedName":"Promise","package":"typescript"}}]}]}
\ No newline at end of file
diff --git a/docs/public/static/data/v49.0.0/expo-screen-capture.json b/docs/public/static/data/v49.0.0/expo-screen-capture.json
new file mode 100644
index 0000000000000..b9b4d9a0c84db
--- /dev/null
+++ b/docs/public/static/data/v49.0.0/expo-screen-capture.json
@@ -0,0 +1 @@
+{"name":"expo-screen-capture","kind":1,"children":[{"name":"Subscription","kind":4194304,"type":{"type":"reflection","declaration":{"name":"__type","kind":65536,"children":[{"name":"remove","kind":1024,"type":{"type":"reflection","declaration":{"name":"__type","kind":65536,"signatures":[{"name":"__type","kind":4096,"comment":{"summary":[{"kind":"text","text":"A method to unsubscribe the listener."}]},"type":{"type":"intrinsic","name":"void"}}]}}}]}}},{"name":"addScreenshotListener","kind":64,"signatures":[{"name":"addScreenshotListener","kind":4096,"comment":{"summary":[{"kind":"text","text":"Adds a listener that will fire whenever the user takes a screenshot while the app is foregrounded.\nOn Android, this method requires the "},{"kind":"code","text":"`READ_EXTERNAL_STORAGE`"},{"kind":"text","text":" permission. You can request this\nwith ["},{"kind":"code","text":"`MediaLibrary.requestPermissionsAsync()`"},{"kind":"text","text":"](./media-library/#medialibraryrequestpermissionsasync)."}],"blockTags":[{"tag":"@returns","content":[{"kind":"text","text":"A "},{"kind":"code","text":"`Subscription`"},{"kind":"text","text":" object that you can use to unregister the listener, either by calling\n"},{"kind":"code","text":"`remove()`"},{"kind":"text","text":" or passing it to "},{"kind":"code","text":"`removeScreenshotListener`"},{"kind":"text","text":"."}]}]},"parameters":[{"name":"listener","kind":32768,"comment":{"summary":[{"kind":"text","text":"The function that will be executed when the user takes a screenshot.\nThis function accepts no arguments."}]},"type":{"type":"reflection","declaration":{"name":"__type","kind":65536,"signatures":[{"name":"__type","kind":4096,"type":{"type":"intrinsic","name":"void"}}]}}}],"type":{"type":"reference","name":"Subscription"}}]},{"name":"allowScreenCaptureAsync","kind":64,"signatures":[{"name":"allowScreenCaptureAsync","kind":4096,"comment":{"summary":[{"kind":"text","text":"Re-allows the user to screen record or screenshot your app. If you haven't called\n"},{"kind":"code","text":"`preventScreenCapture()`"},{"kind":"text","text":" yet, this method does nothing."}]},"parameters":[{"name":"key","kind":32768,"comment":{"summary":[{"kind":"text","text":"This will prevent multiple instances of the "},{"kind":"code","text":"`preventScreenCaptureAsync`"},{"kind":"text","text":" and\n"},{"kind":"code","text":"`allowScreenCaptureAsync`"},{"kind":"text","text":" methods from conflicting with each other. If provided, the value must\nbe the same as the key passed to "},{"kind":"code","text":"`preventScreenCaptureAsync`"},{"kind":"text","text":" in order to re-enable screen\ncapturing. Defaults to 'default'."}]},"type":{"type":"intrinsic","name":"string"},"defaultValue":"'default'"}],"type":{"type":"reference","typeArguments":[{"type":"intrinsic","name":"void"}],"name":"Promise","qualifiedName":"Promise","package":"typescript"}}]},{"name":"isAvailableAsync","kind":64,"signatures":[{"name":"isAvailableAsync","kind":4096,"comment":{"summary":[{"kind":"text","text":"Returns whether the Screen Capture API is available on the current device."}],"blockTags":[{"tag":"@returns","content":[{"kind":"text","text":"A promise that resolves to a "},{"kind":"code","text":"`boolean`"},{"kind":"text","text":" indicating whether the Screen Capture API is available on the current\ndevice. Currently, this resolves to "},{"kind":"code","text":"`true`"},{"kind":"text","text":" on Android and iOS only."}]}]},"type":{"type":"reference","typeArguments":[{"type":"intrinsic","name":"boolean"}],"name":"Promise","qualifiedName":"Promise","package":"typescript"}}]},{"name":"preventScreenCaptureAsync","kind":64,"signatures":[{"name":"preventScreenCaptureAsync","kind":4096,"comment":{"summary":[{"kind":"text","text":"Prevents screenshots and screen recordings until "},{"kind":"code","text":"`allowScreenCaptureAsync`"},{"kind":"text","text":" is called or the app is restarted. If you are\nalready preventing screen capture, this method does nothing (unless you pass a new and unique "},{"kind":"code","text":"`key`"},{"kind":"text","text":").\n\n> Please note that on iOS, this will only prevent screen recordings, and is only available on\niOS 11 and newer. On older iOS versions, this method does nothing."}]},"parameters":[{"name":"key","kind":32768,"comment":{"summary":[{"kind":"text","text":"Optional. If provided, this will help prevent multiple instances of the "},{"kind":"code","text":"`preventScreenCaptureAsync`"},{"kind":"text","text":"\nand "},{"kind":"code","text":"`allowScreenCaptureAsync`"},{"kind":"text","text":" methods (and "},{"kind":"code","text":"`usePreventScreenCapture`"},{"kind":"text","text":" hook) from conflicting with each other.\nWhen using multiple keys, you'll have to re-allow each one in order to re-enable screen capturing.\nDefaults to "},{"kind":"code","text":"`'default'`"},{"kind":"text","text":"."}]},"type":{"type":"intrinsic","name":"string"},"defaultValue":"'default'"}],"type":{"type":"reference","typeArguments":[{"type":"intrinsic","name":"void"}],"name":"Promise","qualifiedName":"Promise","package":"typescript"}}]},{"name":"removeScreenshotListener","kind":64,"signatures":[{"name":"removeScreenshotListener","kind":4096,"comment":{"summary":[{"kind":"text","text":"Removes the subscription you provide, so that you are no longer listening for screenshots.\n\nIf you prefer, you can also call "},{"kind":"code","text":"`remove()`"},{"kind":"text","text":" on that "},{"kind":"code","text":"`Subscription`"},{"kind":"text","text":" object, for example:\n\n"},{"kind":"code","text":"```ts\nlet mySubscription = addScreenshotListener(() => {\n console.log(\"You took a screenshot!\");\n});\n...\nmySubscription.remove();\n// OR\nremoveScreenshotListener(mySubscription);\n```"}]},"parameters":[{"name":"subscription","kind":32768,"comment":{"summary":[{"kind":"text","text":"Subscription returned by "},{"kind":"code","text":"`addScreenshotListener`"},{"kind":"text","text":"."}]},"type":{"type":"reference","name":"Subscription"}}],"type":{"type":"intrinsic","name":"void"}}]},{"name":"usePreventScreenCapture","kind":64,"signatures":[{"name":"usePreventScreenCapture","kind":4096,"comment":{"summary":[{"kind":"text","text":"A React hook to prevent screen capturing for as long as the owner component is mounted."}]},"parameters":[{"name":"key","kind":32768,"type":{"type":"intrinsic","name":"string"},"defaultValue":"'default'"}],"type":{"type":"intrinsic","name":"void"}}]}]}
\ No newline at end of file
diff --git a/docs/public/static/data/v49.0.0/expo-screen-orientation.json b/docs/public/static/data/v49.0.0/expo-screen-orientation.json
new file mode 100644
index 0000000000000..6522ada55371b
--- /dev/null
+++ b/docs/public/static/data/v49.0.0/expo-screen-orientation.json
@@ -0,0 +1 @@
+{"name":"expo-screen-orientation","kind":1,"children":[{"name":"Orientation","kind":8,"children":[{"name":"LANDSCAPE_LEFT","kind":16,"comment":{"summary":[{"kind":"text","text":"Left landscape interface orientation."}]},"type":{"type":"literal","value":3}},{"name":"LANDSCAPE_RIGHT","kind":16,"comment":{"summary":[{"kind":"text","text":"Right landscape interface orientation."}]},"type":{"type":"literal","value":4}},{"name":"PORTRAIT_DOWN","kind":16,"comment":{"summary":[{"kind":"text","text":"Upside down portrait interface orientation."}]},"type":{"type":"literal","value":2}},{"name":"PORTRAIT_UP","kind":16,"comment":{"summary":[{"kind":"text","text":"Right-side up portrait interface orientation."}]},"type":{"type":"literal","value":1}},{"name":"UNKNOWN","kind":16,"comment":{"summary":[{"kind":"text","text":"An unknown screen orientation. For example, the device is flat, perhaps on a table."}]},"type":{"type":"literal","value":0}}]},{"name":"OrientationLock","kind":8,"comment":{"summary":[{"kind":"text","text":"An enum whose values can be passed to the ["},{"kind":"code","text":"`lockAsync`"},{"kind":"text","text":"](#screenorientationlockasyncorientationlock)\nmethod.\n> __Note:__ "},{"kind":"code","text":"`OrientationLock.ALL`"},{"kind":"text","text":" and "},{"kind":"code","text":"`OrientationLock.PORTRAIT`"},{"kind":"text","text":" are invalid on devices which\n> don't support "},{"kind":"code","text":"`OrientationLock.PORTRAIT_DOWN`"},{"kind":"text","text":"."}]},"children":[{"name":"ALL","kind":16,"comment":{"summary":[{"kind":"text","text":"All four possible orientations"}]},"type":{"type":"literal","value":1}},{"name":"DEFAULT","kind":16,"comment":{"summary":[{"kind":"text","text":"The default orientation. On iOS, this will allow all orientations except "},{"kind":"code","text":"`Orientation.PORTRAIT_DOWN`"},{"kind":"text","text":".\nOn Android, this lets the system decide the best orientation."}]},"type":{"type":"literal","value":0}},{"name":"LANDSCAPE","kind":16,"comment":{"summary":[{"kind":"text","text":"Any landscape orientation."}]},"type":{"type":"literal","value":5}},{"name":"LANDSCAPE_LEFT","kind":16,"comment":{"summary":[{"kind":"text","text":"Left landscape only."}]},"type":{"type":"literal","value":6}},{"name":"LANDSCAPE_RIGHT","kind":16,"comment":{"summary":[{"kind":"text","text":"Right landscape only."}]},"type":{"type":"literal","value":7}},{"name":"OTHER","kind":16,"comment":{"summary":[{"kind":"text","text":"A platform specific orientation. This is not a valid policy that can be applied in ["},{"kind":"code","text":"`lockAsync`"},{"kind":"text","text":"](#screenorientationlockasyncorientationlock)."}]},"type":{"type":"literal","value":8}},{"name":"PORTRAIT","kind":16,"comment":{"summary":[{"kind":"text","text":"Any portrait orientation."}]},"type":{"type":"literal","value":2}},{"name":"PORTRAIT_DOWN","kind":16,"comment":{"summary":[{"kind":"text","text":"Upside down portrait only."}]},"type":{"type":"literal","value":4}},{"name":"PORTRAIT_UP","kind":16,"comment":{"summary":[{"kind":"text","text":"Right-side up portrait only."}]},"type":{"type":"literal","value":3}},{"name":"UNKNOWN","kind":16,"comment":{"summary":[{"kind":"text","text":"An unknown screen orientation lock. This is not a valid policy that can be applied in ["},{"kind":"code","text":"`lockAsync`"},{"kind":"text","text":"](#screenorientationlockasyncorientationlock)."}]},"type":{"type":"literal","value":9}}]},{"name":"SizeClassIOS","kind":8,"comment":{"summary":[{"kind":"text","text":"Each iOS device has a default set of [size classes](https://developer.apple.com/library/archive/featuredarticles/ViewControllerPGforiPhoneOS/TheAdaptiveModel.html)\nthat you can use as a guide when designing your interface."}]},"children":[{"name":"COMPACT","kind":16,"type":{"type":"literal","value":1}},{"name":"REGULAR","kind":16,"type":{"type":"literal","value":0}},{"name":"UNKNOWN","kind":16,"type":{"type":"literal","value":2}}]},{"name":"WebOrientation","kind":8,"children":[{"name":"LANDSCAPE_PRIMARY","kind":16,"type":{"type":"literal","value":"landscape-primary"}},{"name":"LANDSCAPE_SECONDARY","kind":16,"type":{"type":"literal","value":"landscape-secondary"}},{"name":"PORTRAIT_PRIMARY","kind":16,"type":{"type":"literal","value":"portrait-primary"}},{"name":"PORTRAIT_SECONDARY","kind":16,"type":{"type":"literal","value":"portrait-secondary"}}]},{"name":"WebOrientationLock","kind":8,"comment":{"summary":[{"kind":"text","text":"An enum representing the lock policies that can be applied on the web platform, modelled after\nthe [W3C specification](https://w3c.github.io/screen-orientation/#dom-orientationlocktype).\nThese values can be applied through the ["},{"kind":"code","text":"`lockPlatformAsync`"},{"kind":"text","text":"](#screenorientationlockplatformasyncoptions)\nmethod."}]},"children":[{"name":"ANY","kind":16,"type":{"type":"literal","value":"any"}},{"name":"LANDSCAPE","kind":16,"type":{"type":"literal","value":"landscape"}},{"name":"LANDSCAPE_PRIMARY","kind":16,"type":{"type":"literal","value":"landscape-primary"}},{"name":"LANDSCAPE_SECONDARY","kind":16,"type":{"type":"literal","value":"landscape-secondary"}},{"name":"NATURAL","kind":16,"type":{"type":"literal","value":"natural"}},{"name":"PORTRAIT","kind":16,"type":{"type":"literal","value":"portrait"}},{"name":"PORTRAIT_PRIMARY","kind":16,"type":{"type":"literal","value":"portrait-primary"}},{"name":"PORTRAIT_SECONDARY","kind":16,"type":{"type":"literal","value":"portrait-secondary"}},{"name":"UNKNOWN","kind":16,"type":{"type":"literal","value":"unknown"}}]},{"name":"OrientationChangeEvent","kind":4194304,"type":{"type":"reflection","declaration":{"name":"__type","kind":65536,"children":[{"name":"orientationInfo","kind":1024,"comment":{"summary":[{"kind":"text","text":"The current "},{"kind":"code","text":"`ScreenOrientationInfo`"},{"kind":"text","text":" of the device."}]},"type":{"type":"reference","name":"ScreenOrientationInfo"}},{"name":"orientationLock","kind":1024,"comment":{"summary":[{"kind":"text","text":"The current "},{"kind":"code","text":"`OrientationLock`"},{"kind":"text","text":" of the device."}]},"type":{"type":"reference","name":"OrientationLock"}}]}}},{"name":"OrientationChangeListener","kind":4194304,"type":{"type":"reflection","declaration":{"name":"__type","kind":65536,"signatures":[{"name":"__type","kind":4096,"parameters":[{"name":"event","kind":32768,"type":{"type":"reference","name":"OrientationChangeEvent"}}],"type":{"type":"intrinsic","name":"void"}}]}}},{"name":"PlatformOrientationInfo","kind":4194304,"type":{"type":"reflection","declaration":{"name":"__type","kind":65536,"children":[{"name":"screenOrientationArrayIOS","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"An array of orientations to allow on the iOS platform."}],"blockTags":[{"tag":"@platform","content":[{"kind":"text","text":"ios"}]}]},"type":{"type":"array","elementType":{"type":"reference","name":"Orientation"}}},{"name":"screenOrientationConstantAndroid","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"A constant to set using the Android native [API](https://developer.android.com/reference/android/R.attr.html#screenOrientation).\nFor example, in order to set the lock policy to [unspecified](https://developer.android.com/reference/android/content/pm/ActivityInfo.html#SCREEN_ORIENTATION_UNSPECIFIED),\n"},{"kind":"code","text":"`-1`"},{"kind":"text","text":" should be passed in."}],"blockTags":[{"tag":"@platform","content":[{"kind":"text","text":"android"}]}]},"type":{"type":"intrinsic","name":"number"}},{"name":"screenOrientationLockWeb","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"A web orientation lock to apply in the browser."}],"blockTags":[{"tag":"@platform","content":[{"kind":"text","text":"web"}]}]},"type":{"type":"reference","name":"WebOrientationLock"}}]}}},{"name":"ScreenOrientationInfo","kind":4194304,"type":{"type":"reflection","declaration":{"name":"__type","kind":65536,"children":[{"name":"horizontalSizeClass","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"The [horizontal size class](https://developer.apple.com/library/archive/featuredarticles/ViewControllerPGforiPhoneOS/TheAdaptiveModel.html)\nof the device."}],"blockTags":[{"tag":"@platform","content":[{"kind":"text","text":"ios"}]}]},"type":{"type":"reference","name":"SizeClassIOS"}},{"name":"orientation","kind":1024,"comment":{"summary":[{"kind":"text","text":"The current orientation of the device."}]},"type":{"type":"reference","name":"Orientation"}},{"name":"verticalSizeClass","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"The [vertical size class](https://developer.apple.com/library/archive/featuredarticles/ViewControllerPGforiPhoneOS/TheAdaptiveModel.html)\nof the device."}],"blockTags":[{"tag":"@platform","content":[{"kind":"text","text":"ios"}]}]},"type":{"type":"reference","name":"SizeClassIOS"}}]}}},{"name":"Subscription","kind":4194304,"type":{"type":"reflection","declaration":{"name":"__type","kind":65536,"children":[{"name":"remove","kind":1024,"type":{"type":"reflection","declaration":{"name":"__type","kind":65536,"signatures":[{"name":"__type","kind":4096,"comment":{"summary":[{"kind":"text","text":"A method to unsubscribe the listener."}]},"type":{"type":"intrinsic","name":"void"}}]}}}]}}},{"name":"addOrientationChangeListener","kind":64,"signatures":[{"name":"addOrientationChangeListener","kind":4096,"comment":{"summary":[{"kind":"text","text":"Invokes the "},{"kind":"code","text":"`listener`"},{"kind":"text","text":" function when the screen orientation changes from "},{"kind":"code","text":"`portrait`"},{"kind":"text","text":" to "},{"kind":"code","text":"`landscape`"},{"kind":"text","text":"\nor from "},{"kind":"code","text":"`landscape`"},{"kind":"text","text":" to "},{"kind":"code","text":"`portrait`"},{"kind":"text","text":". For example, it won't be invoked when screen orientation\nchange from "},{"kind":"code","text":"`portrait up`"},{"kind":"text","text":" to "},{"kind":"code","text":"`portrait down`"},{"kind":"text","text":", but it will be called when there was a change from\n"},{"kind":"code","text":"`portrait up`"},{"kind":"text","text":" to "},{"kind":"code","text":"`landscape left`"},{"kind":"text","text":"."}]},"parameters":[{"name":"listener","kind":32768,"comment":{"summary":[{"kind":"text","text":"Each orientation update will pass an object with the new ["},{"kind":"code","text":"`OrientationChangeEvent`"},{"kind":"text","text":"](#orientationchangeevent)\nto the listener."}]},"type":{"type":"reference","name":"OrientationChangeListener"}}],"type":{"type":"reference","name":"Subscription"}}]},{"name":"getOrientationAsync","kind":64,"signatures":[{"name":"getOrientationAsync","kind":4096,"comment":{"summary":[{"kind":"text","text":"Gets the current screen orientation."}],"blockTags":[{"tag":"@returns","content":[{"kind":"text","text":"Returns a promise that fulfils with an ["},{"kind":"code","text":"`Orientation`"},{"kind":"text","text":"](#screenorientationorientation)\nvalue that reflects the current screen orientation."}]}]},"type":{"type":"reference","typeArguments":[{"type":"reference","name":"Orientation"}],"name":"Promise","qualifiedName":"Promise","package":"typescript"}}]},{"name":"getOrientationLockAsync","kind":64,"signatures":[{"name":"getOrientationLockAsync","kind":4096,"comment":{"summary":[{"kind":"text","text":"Gets the current screen orientation lock type."}],"blockTags":[{"tag":"@returns","content":[{"kind":"text","text":"Returns a promise which fulfils with an ["},{"kind":"code","text":"`OrientationLock`"},{"kind":"text","text":"](#orientationlock)\nvalue."}]}]},"type":{"type":"reference","typeArguments":[{"type":"reference","name":"OrientationLock"}],"name":"Promise","qualifiedName":"Promise","package":"typescript"}}]},{"name":"getPlatformOrientationLockAsync","kind":64,"signatures":[{"name":"getPlatformOrientationLockAsync","kind":4096,"comment":{"summary":[{"kind":"text","text":"Gets the platform specific screen orientation lock type."}],"blockTags":[{"tag":"@returns","content":[{"kind":"text","text":"Returns a promise which fulfils with a ["},{"kind":"code","text":"`PlatformOrientationInfo`"},{"kind":"text","text":"](#platformorientationinfo)\nvalue."}]}]},"type":{"type":"reference","typeArguments":[{"type":"reference","name":"PlatformOrientationInfo"}],"name":"Promise","qualifiedName":"Promise","package":"typescript"}}]},{"name":"lockAsync","kind":64,"signatures":[{"name":"lockAsync","kind":4096,"comment":{"summary":[{"kind":"text","text":"Lock the screen orientation to a particular "},{"kind":"code","text":"`OrientationLock`"},{"kind":"text","text":"."}],"blockTags":[{"tag":"@returns","content":[{"kind":"text","text":"Returns a promise with "},{"kind":"code","text":"`void`"},{"kind":"text","text":" value, which fulfils when the orientation is set."}]},{"tag":"@example","content":[{"kind":"code","text":"```ts\nasync function changeScreenOrientation() {\n await ScreenOrientation.lockAsync(ScreenOrientation.OrientationLock.LANDSCAPE_LEFT);\n}\n```"}]}]},"parameters":[{"name":"orientationLock","kind":32768,"comment":{"summary":[{"kind":"text","text":"The orientation lock to apply. See the ["},{"kind":"code","text":"`OrientationLock`"},{"kind":"text","text":"](#orientationlock)\nenum for possible values."}]},"type":{"type":"reference","name":"OrientationLock"}}],"type":{"type":"reference","typeArguments":[{"type":"intrinsic","name":"void"}],"name":"Promise","qualifiedName":"Promise","package":"typescript"}}]},{"name":"lockPlatformAsync","kind":64,"signatures":[{"name":"lockPlatformAsync","kind":4096,"comment":{"summary":[],"blockTags":[{"tag":"@returns","content":[{"kind":"text","text":"Returns a promise with "},{"kind":"code","text":"`void`"},{"kind":"text","text":" value, resolving when the orientation is set and rejecting\nif an invalid option or value is passed."}]}]},"parameters":[{"name":"options","kind":32768,"comment":{"summary":[{"kind":"text","text":"The platform specific lock to apply. See the ["},{"kind":"code","text":"`PlatformOrientationInfo`"},{"kind":"text","text":"](#platformorientationinfo)\nobject type for the different platform formats."}]},"type":{"type":"reference","name":"PlatformOrientationInfo"}}],"type":{"type":"reference","typeArguments":[{"type":"intrinsic","name":"void"}],"name":"Promise","qualifiedName":"Promise","package":"typescript"}}]},{"name":"removeOrientationChangeListener","kind":64,"signatures":[{"name":"removeOrientationChangeListener","kind":4096,"comment":{"summary":[{"kind":"text","text":"Unsubscribes the listener associated with the "},{"kind":"code","text":"`Subscription`"},{"kind":"text","text":" object from all orientation change\nupdates."}]},"parameters":[{"name":"subscription","kind":32768,"comment":{"summary":[{"kind":"text","text":"A subscription object that manages the updates passed to a listener function\non an orientation change."}]},"type":{"type":"reference","name":"Subscription"}}],"type":{"type":"intrinsic","name":"void"}}]},{"name":"removeOrientationChangeListeners","kind":64,"signatures":[{"name":"removeOrientationChangeListeners","kind":4096,"comment":{"summary":[{"kind":"text","text":"Removes all listeners subscribed to orientation change updates."}]},"type":{"type":"intrinsic","name":"void"}}]},{"name":"supportsOrientationLockAsync","kind":64,"signatures":[{"name":"supportsOrientationLockAsync","kind":4096,"comment":{"summary":[{"kind":"text","text":"Returns whether the ["},{"kind":"code","text":"`OrientationLock`"},{"kind":"text","text":"](#orientationlock) policy is supported on\nthe device."}],"blockTags":[{"tag":"@returns","content":[{"kind":"text","text":"Returns a promise that resolves to a "},{"kind":"code","text":"`boolean`"},{"kind":"text","text":" value that reflects whether or not the\norientationLock is supported."}]}]},"parameters":[{"name":"orientationLock","kind":32768,"type":{"type":"reference","name":"OrientationLock"}}],"type":{"type":"reference","typeArguments":[{"type":"intrinsic","name":"boolean"}],"name":"Promise","qualifiedName":"Promise","package":"typescript"}}]},{"name":"unlockAsync","kind":64,"signatures":[{"name":"unlockAsync","kind":4096,"comment":{"summary":[{"kind":"text","text":"Sets the screen orientation back to the "},{"kind":"code","text":"`OrientationLock.DEFAULT`"},{"kind":"text","text":" policy."}],"blockTags":[{"tag":"@returns","content":[{"kind":"text","text":"Returns a promise with "},{"kind":"code","text":"`void`"},{"kind":"text","text":" value, which fulfils when the orientation is set."}]}]},"type":{"type":"reference","typeArguments":[{"type":"intrinsic","name":"void"}],"name":"Promise","qualifiedName":"Promise","package":"typescript"}}]}]}
\ No newline at end of file
diff --git a/docs/public/static/data/v49.0.0/expo-secure-store.json b/docs/public/static/data/v49.0.0/expo-secure-store.json
new file mode 100644
index 0000000000000..39e2ac84b01bb
--- /dev/null
+++ b/docs/public/static/data/v49.0.0/expo-secure-store.json
@@ -0,0 +1 @@
+{"name":"expo-secure-store","kind":1,"children":[{"name":"KeychainAccessibilityConstant","kind":4194304,"type":{"type":"intrinsic","name":"number"}},{"name":"SecureStoreOptions","kind":4194304,"type":{"type":"reflection","declaration":{"name":"__type","kind":65536,"children":[{"name":"authenticationPrompt","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"Custom message displayed to the user while "},{"kind":"code","text":"`requireAuthentication`"},{"kind":"text","text":" option is turned on."}]},"type":{"type":"intrinsic","name":"string"}},{"name":"keychainAccessible","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"Specifies when the stored entry is accessible, using iOS's "},{"kind":"code","text":"`kSecAttrAccessible`"},{"kind":"text","text":" property."}],"blockTags":[{"tag":"@see","content":[{"kind":"text","text":"Apple's documentation on [keychain item accessibility](https://developer.apple.com/documentation/security/ksecattraccessible/)."}]},{"tag":"@default","content":[{"kind":"text","text":"SecureStore.WHEN_UNLOCKED"}]},{"tag":"@platform","content":[{"kind":"text","text":"ios"}]}]},"type":{"type":"reference","name":"KeychainAccessibilityConstant"}},{"name":"keychainService","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"- Android: Equivalent of the public/private key pair "},{"kind":"code","text":"`Alias`"},{"kind":"text","text":".\n- iOS: The item's service, equivalent to ["},{"kind":"code","text":"`kSecAttrService`"},{"kind":"text","text":"](https://developer.apple.com/documentation/security/ksecattrservice/).\n> If the item is set with the "},{"kind":"code","text":"`keychainService`"},{"kind":"text","text":" option, it will be required to later fetch the value."}]},"type":{"type":"intrinsic","name":"string"}},{"name":"requireAuthentication","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"Option responsible for enabling the usage of the user authentication methods available on the device while\naccessing data stored in SecureStore.\n- Android: Equivalent to ["},{"kind":"code","text":"`setUserAuthenticationRequired(true)`"},{"kind":"text","text":"](https://developer.android.com/reference/android/security/keystore/KeyGenParameterSpec.Builder#setUserAuthenticationRequired(boolean))\n (requires API 23).\n- iOS: Equivalent to ["},{"kind":"code","text":"`kSecAccessControlBiometryCurrentSet`"},{"kind":"text","text":"](https://developer.apple.com/documentation/security/secaccesscontrolcreateflags/ksecaccesscontrolbiometrycurrentset/).\nComplete functionality is unlocked only with a freshly generated key - this would not work in tandem with the "},{"kind":"code","text":"`keychainService`"},{"kind":"text","text":"\nvalue used for the others non-authenticated operations."}]},"type":{"type":"intrinsic","name":"boolean"}}]}}},{"name":"AFTER_FIRST_UNLOCK","kind":32,"flags":{"isConst":true},"comment":{"summary":[{"kind":"text","text":"The data in the keychain item cannot be accessed after a restart until the device has been\nunlocked once by the user. This may be useful if you need to access the item when the phone\nis locked."}]},"type":{"type":"reference","name":"KeychainAccessibilityConstant"},"defaultValue":"ExpoSecureStore.AFTER_FIRST_UNLOCK"},{"name":"AFTER_FIRST_UNLOCK_THIS_DEVICE_ONLY","kind":32,"flags":{"isConst":true},"comment":{"summary":[{"kind":"text","text":"Similar to "},{"kind":"code","text":"`AFTER_FIRST_UNLOCK`"},{"kind":"text","text":", except the entry is not migrated to a new device when restoring\nfrom a backup."}]},"type":{"type":"reference","name":"KeychainAccessibilityConstant"},"defaultValue":"ExpoSecureStore.AFTER_FIRST_UNLOCK_THIS_DEVICE_ONLY"},{"name":"ALWAYS","kind":32,"flags":{"isConst":true},"comment":{"summary":[{"kind":"text","text":"The data in the keychain item can always be accessed regardless of whether the device is locked.\nThis is the least secure option."}]},"type":{"type":"reference","name":"KeychainAccessibilityConstant"},"defaultValue":"ExpoSecureStore.ALWAYS"},{"name":"ALWAYS_THIS_DEVICE_ONLY","kind":32,"flags":{"isConst":true},"comment":{"summary":[{"kind":"text","text":"Similar to "},{"kind":"code","text":"`ALWAYS`"},{"kind":"text","text":", except the entry is not migrated to a new device when restoring from a backup."}]},"type":{"type":"reference","name":"KeychainAccessibilityConstant"},"defaultValue":"ExpoSecureStore.ALWAYS_THIS_DEVICE_ONLY"},{"name":"WHEN_PASSCODE_SET_THIS_DEVICE_ONLY","kind":32,"flags":{"isConst":true},"comment":{"summary":[{"kind":"text","text":"Similar to "},{"kind":"code","text":"`WHEN_UNLOCKED_THIS_DEVICE_ONLY`"},{"kind":"text","text":", except the user must have set a passcode in order to\nstore an entry. If the user removes their passcode, the entry will be deleted."}]},"type":{"type":"reference","name":"KeychainAccessibilityConstant"},"defaultValue":"ExpoSecureStore.WHEN_PASSCODE_SET_THIS_DEVICE_ONLY"},{"name":"WHEN_UNLOCKED","kind":32,"flags":{"isConst":true},"comment":{"summary":[{"kind":"text","text":"The data in the keychain item can be accessed only while the device is unlocked by the user."}]},"type":{"type":"reference","name":"KeychainAccessibilityConstant"},"defaultValue":"ExpoSecureStore.WHEN_UNLOCKED"},{"name":"WHEN_UNLOCKED_THIS_DEVICE_ONLY","kind":32,"flags":{"isConst":true},"comment":{"summary":[{"kind":"text","text":"Similar to "},{"kind":"code","text":"`WHEN_UNLOCKED`"},{"kind":"text","text":", except the entry is not migrated to a new device when restoring from\na backup."}]},"type":{"type":"reference","name":"KeychainAccessibilityConstant"},"defaultValue":"ExpoSecureStore.WHEN_UNLOCKED_THIS_DEVICE_ONLY"},{"name":"deleteItemAsync","kind":64,"signatures":[{"name":"deleteItemAsync","kind":4096,"comment":{"summary":[{"kind":"text","text":"Delete the value associated with the provided key."}],"blockTags":[{"tag":"@returns","content":[{"kind":"text","text":"A promise that will reject if the value couldn't be deleted."}]}]},"parameters":[{"name":"key","kind":32768,"comment":{"summary":[{"kind":"text","text":"The key that was used to store the associated value."}]},"type":{"type":"intrinsic","name":"string"}},{"name":"options","kind":32768,"comment":{"summary":[{"kind":"text","text":"An ["},{"kind":"code","text":"`SecureStoreOptions`"},{"kind":"text","text":"](#securestoreoptions) object."}]},"type":{"type":"reference","name":"SecureStoreOptions"},"defaultValue":"{}"}],"type":{"type":"reference","typeArguments":[{"type":"intrinsic","name":"void"}],"name":"Promise","qualifiedName":"Promise","package":"typescript"}}]},{"name":"getItemAsync","kind":64,"signatures":[{"name":"getItemAsync","kind":4096,"comment":{"summary":[{"kind":"text","text":"Fetch the stored value associated with the provided key."}],"blockTags":[{"tag":"@returns","content":[{"kind":"text","text":"A promise that resolves to the previously stored value. It will return "},{"kind":"code","text":"`null`"},{"kind":"text","text":" if there is no entry\nfor the given key or if the key has been invalidated. It will reject if an error occurs while retrieving the value.\n\n> Keys are invalidated by the system when biometrics change, such as adding a new fingerprint or changing the face profile used for face recognition.\n> After a key has been invalidated, it becomes impossible to read its value.\n> This only applies to values stored with "},{"kind":"code","text":"`requireAuthentication`"},{"kind":"text","text":" set to "},{"kind":"code","text":"`true`"},{"kind":"text","text":"."}]}]},"parameters":[{"name":"key","kind":32768,"comment":{"summary":[{"kind":"text","text":"The key that was used to store the associated value."}]},"type":{"type":"intrinsic","name":"string"}},{"name":"options","kind":32768,"comment":{"summary":[{"kind":"text","text":"An ["},{"kind":"code","text":"`SecureStoreOptions`"},{"kind":"text","text":"](#securestoreoptions) object."}]},"type":{"type":"reference","name":"SecureStoreOptions"},"defaultValue":"{}"}],"type":{"type":"reference","typeArguments":[{"type":"union","types":[{"type":"intrinsic","name":"string"},{"type":"literal","value":null}]}],"name":"Promise","qualifiedName":"Promise","package":"typescript"}}]},{"name":"isAvailableAsync","kind":64,"signatures":[{"name":"isAvailableAsync","kind":4096,"comment":{"summary":[{"kind":"text","text":"Returns whether the SecureStore API is enabled on the current device. This does not check the app\npermissions."}],"blockTags":[{"tag":"@returns","content":[{"kind":"text","text":"Promise which fulfils witch "},{"kind":"code","text":"`boolean`"},{"kind":"text","text":", indicating whether the SecureStore API is available\non the current device. Currently, this resolves "},{"kind":"code","text":"`true`"},{"kind":"text","text":" on Android and iOS only."}]}]},"type":{"type":"reference","typeArguments":[{"type":"intrinsic","name":"boolean"}],"name":"Promise","qualifiedName":"Promise","package":"typescript"}}]},{"name":"setItemAsync","kind":64,"signatures":[{"name":"setItemAsync","kind":4096,"comment":{"summary":[{"kind":"text","text":"Store a key–value pair."}],"blockTags":[{"tag":"@returns","content":[{"kind":"text","text":"A promise that will reject if value cannot be stored on the device."}]}]},"parameters":[{"name":"key","kind":32768,"comment":{"summary":[{"kind":"text","text":"The key to associate with the stored value. Keys may contain alphanumeric characters\n"},{"kind":"code","text":"`.`"},{"kind":"text","text":", "},{"kind":"code","text":"`-`"},{"kind":"text","text":", and "},{"kind":"code","text":"`_`"},{"kind":"text","text":"."}]},"type":{"type":"intrinsic","name":"string"}},{"name":"value","kind":32768,"comment":{"summary":[{"kind":"text","text":"The value to store. Size limit is 2048 bytes."}]},"type":{"type":"intrinsic","name":"string"}},{"name":"options","kind":32768,"comment":{"summary":[{"kind":"text","text":"An ["},{"kind":"code","text":"`SecureStoreOptions`"},{"kind":"text","text":"](#securestoreoptions) object."}]},"type":{"type":"reference","name":"SecureStoreOptions"},"defaultValue":"{}"}],"type":{"type":"reference","typeArguments":[{"type":"intrinsic","name":"void"}],"name":"Promise","qualifiedName":"Promise","package":"typescript"}}]}]}
\ No newline at end of file
diff --git a/docs/public/static/data/v49.0.0/expo-sharing.json b/docs/public/static/data/v49.0.0/expo-sharing.json
new file mode 100644
index 0000000000000..03661285f32ec
--- /dev/null
+++ b/docs/public/static/data/v49.0.0/expo-sharing.json
@@ -0,0 +1 @@
+{"name":"expo-sharing","kind":1,"children":[{"name":"SharingOptions","kind":4194304,"type":{"type":"reflection","declaration":{"name":"__type","kind":65536,"children":[{"name":"UTI","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"[Uniform Type Identifier](https://developer.apple.com/library/archive/documentation/FileManagement/Conceptual/understanding_utis/understand_utis_conc/understand_utis_conc.html)\n - the type of the target file."}],"blockTags":[{"tag":"@platform","content":[{"kind":"text","text":"ios"}]}]},"type":{"type":"intrinsic","name":"string"}},{"name":"dialogTitle","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"Sets share dialog title."}],"blockTags":[{"tag":"@platform","content":[{"kind":"text","text":"android"}]},{"tag":"@platform","content":[{"kind":"text","text":"web"}]}]},"type":{"type":"intrinsic","name":"string"}},{"name":"mimeType","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"Sets "},{"kind":"code","text":"`mimeType`"},{"kind":"text","text":" for "},{"kind":"code","text":"`Intent`"},{"kind":"text","text":"."}],"blockTags":[{"tag":"@platform","content":[{"kind":"text","text":"android"}]}]},"type":{"type":"intrinsic","name":"string"}}]}}},{"name":"isAvailableAsync","kind":64,"signatures":[{"name":"isAvailableAsync","kind":4096,"comment":{"summary":[{"kind":"text","text":"Determine if the sharing API can be used in this app."}],"blockTags":[{"tag":"@returns","content":[{"kind":"text","text":"A promise that fulfills with "},{"kind":"code","text":"`true`"},{"kind":"text","text":" if the sharing API can be used, and "},{"kind":"code","text":"`false`"},{"kind":"text","text":" otherwise."}]}]},"type":{"type":"reference","typeArguments":[{"type":"intrinsic","name":"boolean"}],"name":"Promise","qualifiedName":"Promise","package":"typescript"}}]},{"name":"shareAsync","kind":64,"signatures":[{"name":"shareAsync","kind":4096,"comment":{"summary":[{"kind":"text","text":"Opens action sheet to share file to different applications which can handle this type of file."}]},"parameters":[{"name":"url","kind":32768,"comment":{"summary":[{"kind":"text","text":"Local file URL to share."}]},"type":{"type":"intrinsic","name":"string"}},{"name":"options","kind":32768,"comment":{"summary":[{"kind":"text","text":"A map of share options."}]},"type":{"type":"reference","name":"SharingOptions"},"defaultValue":"{}"}],"type":{"type":"reference","typeArguments":[{"type":"intrinsic","name":"void"}],"name":"Promise","qualifiedName":"Promise","package":"typescript"}}]}]}
\ No newline at end of file
diff --git a/docs/public/static/data/v49.0.0/expo-sms.json b/docs/public/static/data/v49.0.0/expo-sms.json
new file mode 100644
index 0000000000000..4109f48efec4e
--- /dev/null
+++ b/docs/public/static/data/v49.0.0/expo-sms.json
@@ -0,0 +1 @@
+{"name":"expo-sms","kind":1,"children":[{"name":"SMSAttachment","kind":4194304,"comment":{"summary":[{"kind":"text","text":"An object that is used to describe an attachment that is included with a SMS message."}]},"type":{"type":"reflection","declaration":{"name":"__type","kind":65536,"children":[{"name":"filename","kind":1024,"comment":{"summary":[{"kind":"text","text":"The filename of the attachment."}]},"type":{"type":"intrinsic","name":"string"}},{"name":"mimeType","kind":1024,"comment":{"summary":[{"kind":"text","text":"The mime type of the attachment such as "},{"kind":"code","text":"`image/png`"},{"kind":"text","text":"."}]},"type":{"type":"intrinsic","name":"string"}},{"name":"uri","kind":1024,"comment":{"summary":[{"kind":"text","text":"The content URI of the attachment. The URI needs be a content URI so that it can be accessed by\nother applications outside of Expo. See [FileSystem.getContentUriAsync](./filesystem/#filesystemgetcontenturiasyncfileuri))."}]},"type":{"type":"intrinsic","name":"string"}}]}}},{"name":"SMSOptions","kind":4194304,"type":{"type":"reflection","declaration":{"name":"__type","kind":65536,"children":[{"name":"attachments","kind":1024,"flags":{"isOptional":true},"type":{"type":"union","types":[{"type":"reference","name":"SMSAttachment"},{"type":"array","elementType":{"type":"reference","name":"SMSAttachment"}}]}}]}}},{"name":"SMSResponse","kind":4194304,"type":{"type":"reflection","declaration":{"name":"__type","kind":65536,"children":[{"name":"result","kind":1024,"comment":{"summary":[{"kind":"text","text":"Status of SMS action invoked by the user."}]},"type":{"type":"union","types":[{"type":"literal","value":"unknown"},{"type":"literal","value":"sent"},{"type":"literal","value":"cancelled"}]}}]}}},{"name":"isAvailableAsync","kind":64,"signatures":[{"name":"isAvailableAsync","kind":4096,"comment":{"summary":[{"kind":"text","text":"Determines whether SMS is available. Always returns "},{"kind":"code","text":"`false`"},{"kind":"text","text":" in the iOS simulator, and in browser."}],"blockTags":[{"tag":"@returns","content":[{"kind":"text","text":"Returns a promise that fulfils with a "},{"kind":"code","text":"`boolean`"},{"kind":"text","text":", indicating whether SMS is available on this device."}]},{"tag":"@example","content":[{"kind":"code","text":"```ts\nconst isAvailable = await SMS.isAvailableAsync();\nif (isAvailable) {\n // do your SMS stuff here\n} else {\n // misfortune... there's no SMS available on this device\n}\n```"}]}]},"type":{"type":"reference","typeArguments":[{"type":"intrinsic","name":"boolean"}],"name":"Promise","qualifiedName":"Promise","package":"typescript"}}]},{"name":"sendSMSAsync","kind":64,"signatures":[{"name":"sendSMSAsync","kind":4096,"comment":{"summary":[{"kind":"text","text":"Opens the default UI/app for sending SMS messages with prefilled addresses and message."}],"blockTags":[{"tag":"@returns","content":[{"kind":"text","text":"Returns a Promise that fulfils with the SMS action is invoked by the user, with corresponding result:\n- If the user cancelled the SMS sending process: "},{"kind":"code","text":"`{ result: 'cancelled' }`"},{"kind":"text","text":".\n- If the user has sent/scheduled message for sending: "},{"kind":"code","text":"`{ result: 'sent' }`"},{"kind":"text","text":".\n- If the status of the SMS message cannot be determined: "},{"kind":"code","text":"`{ result: 'unknown' }`"},{"kind":"text","text":".\n\nAndroid does not provide information about the status of the SMS message, so on Android devices\nthe Promise will always resolve with "},{"kind":"code","text":"`{ result: 'unknown' }`"},{"kind":"text","text":".\n\n> Note: The only feedback collected by this module is whether any message has been sent. That\nmeans we do not check actual content of message nor recipients list."}]},{"tag":"@example","content":[{"kind":"code","text":"```ts\nconst { result } = await SMS.sendSMSAsync(\n ['0123456789', '9876543210'],\n 'My sample HelloWorld message',\n {\n attachments: {\n uri: 'path/myfile.png',\n mimeType: 'image/png',\n filename: 'myfile.png',\n },\n }\n);\n```"}]}]},"parameters":[{"name":"addresses","kind":32768,"comment":{"summary":[{"kind":"text","text":"An array of addresses (phone numbers) or single address passed as strings. Those\nwould appear as recipients of the prepared message."}]},"type":{"type":"union","types":[{"type":"intrinsic","name":"string"},{"type":"array","elementType":{"type":"intrinsic","name":"string"}}]}},{"name":"message","kind":32768,"comment":{"summary":[{"kind":"text","text":"Message to be sent."}]},"type":{"type":"intrinsic","name":"string"}},{"name":"options","kind":32768,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"A "},{"kind":"code","text":"`SMSOptions`"},{"kind":"text","text":" object defining additional SMS configuration options."}]},"type":{"type":"reference","name":"SMSOptions"}}],"type":{"type":"reference","typeArguments":[{"type":"reference","name":"SMSResponse"}],"name":"Promise","qualifiedName":"Promise","package":"typescript"}}]}]}
\ No newline at end of file
diff --git a/docs/public/static/data/v49.0.0/expo-speech.json b/docs/public/static/data/v49.0.0/expo-speech.json
new file mode 100644
index 0000000000000..9bede466a5806
--- /dev/null
+++ b/docs/public/static/data/v49.0.0/expo-speech.json
@@ -0,0 +1 @@
+{"name":"expo-speech","kind":1,"children":[{"name":"VoiceQuality","kind":8,"comment":{"summary":[{"kind":"text","text":"Enum representing the voice quality."}]},"children":[{"name":"Default","kind":16,"type":{"type":"literal","value":"Default"}},{"name":"Enhanced","kind":16,"type":{"type":"literal","value":"Enhanced"}}]},{"name":"SpeechEventCallback","kind":4194304,"type":{"type":"reflection","declaration":{"name":"__type","kind":65536,"signatures":[{"name":"__type","kind":4096,"parameters":[{"name":"this","kind":32768,"type":{"type":"reference","name":"SpeechSynthesisUtterance","qualifiedName":"SpeechSynthesisUtterance","package":"typescript"}},{"name":"ev","kind":32768,"type":{"type":"reference","name":"SpeechSynthesisEvent","qualifiedName":"SpeechSynthesisEvent","package":"typescript"}}],"type":{"type":"intrinsic","name":"any"}}]}}},{"name":"SpeechOptions","kind":4194304,"type":{"type":"reflection","declaration":{"name":"__type","kind":65536,"children":[{"name":"_voiceIndex","kind":1024,"flags":{"isOptional":true},"type":{"type":"intrinsic","name":"number"}},{"name":"language","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"The code of a language that should be used to read the "},{"kind":"code","text":"`text`"},{"kind":"text","text":", refer to IETF BCP 47 to see\nvalid codes."}]},"type":{"type":"intrinsic","name":"string"}},{"name":"onBoundary","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"A callback that is invoked when the spoken utterance reaches a word."}]},"type":{"type":"union","types":[{"type":"reference","name":"NativeBoundaryEventCallback"},{"type":"reference","name":"SpeechEventCallback"},{"type":"literal","value":null}]}},{"name":"onDone","kind":1024,"flags":{"isOptional":true},"type":{"type":"reflection","declaration":{"name":"__type","kind":65536,"signatures":[{"name":"__type","kind":4096,"comment":{"summary":[{"kind":"text","text":"A callback that is invoked when speaking finishes."}]},"type":{"type":"union","types":[{"type":"intrinsic","name":"void"},{"type":"reference","name":"SpeechEventCallback"}]}}]}}},{"name":"onError","kind":1024,"flags":{"isOptional":true},"type":{"type":"reflection","declaration":{"name":"__type","kind":65536,"signatures":[{"name":"__type","kind":4096,"comment":{"summary":[{"kind":"text","text":"A callback that is invoked when an error occurred while speaking."}],"blockTags":[{"tag":"@platform","content":[{"kind":"text","text":"android"}]},{"tag":"@platform","content":[{"kind":"text","text":"ios"}]}]},"parameters":[{"name":"error","kind":32768,"type":{"type":"reference","name":"Error","qualifiedName":"Error","package":"typescript"}}],"type":{"type":"union","types":[{"type":"intrinsic","name":"void"},{"type":"reference","name":"SpeechEventCallback"}]}}]}}},{"name":"onMark","kind":1024,"flags":{"isOptional":true},"type":{"type":"union","types":[{"type":"reference","name":"SpeechEventCallback"},{"type":"literal","value":null}]}},{"name":"onPause","kind":1024,"flags":{"isOptional":true},"type":{"type":"union","types":[{"type":"reference","name":"SpeechEventCallback"},{"type":"literal","value":null}]}},{"name":"onResume","kind":1024,"flags":{"isOptional":true},"type":{"type":"union","types":[{"type":"reference","name":"SpeechEventCallback"},{"type":"literal","value":null}]}},{"name":"onStart","kind":1024,"flags":{"isOptional":true},"type":{"type":"reflection","declaration":{"name":"__type","kind":65536,"signatures":[{"name":"__type","kind":4096,"comment":{"summary":[{"kind":"text","text":"A callback that is invoked when speaking starts."}]},"type":{"type":"union","types":[{"type":"intrinsic","name":"void"},{"type":"reference","name":"SpeechEventCallback"}]}}]}}},{"name":"onStopped","kind":1024,"flags":{"isOptional":true},"type":{"type":"reflection","declaration":{"name":"__type","kind":65536,"signatures":[{"name":"__type","kind":4096,"comment":{"summary":[{"kind":"text","text":"A callback that is invoked when speaking is stopped by calling "},{"kind":"code","text":"`Speech.stop()`"},{"kind":"text","text":"."}]},"type":{"type":"union","types":[{"type":"intrinsic","name":"void"},{"type":"reference","name":"SpeechEventCallback"}]}}]}}},{"name":"pitch","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"Pitch of the voice to speak "},{"kind":"code","text":"`text`"},{"kind":"text","text":". "},{"kind":"code","text":"`1.0`"},{"kind":"text","text":" is the normal pitch."}]},"type":{"type":"intrinsic","name":"number"}},{"name":"rate","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"Rate of the voice to speak "},{"kind":"code","text":"`text`"},{"kind":"text","text":". "},{"kind":"code","text":"`1.0`"},{"kind":"text","text":" is the normal rate."}]},"type":{"type":"intrinsic","name":"number"}},{"name":"voice","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"Voice identifier."}]},"type":{"type":"intrinsic","name":"string"}},{"name":"volume","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"Volume of the voice to speak "},{"kind":"code","text":"`text`"},{"kind":"text","text":". A number between "},{"kind":"code","text":"`0.0`"},{"kind":"text","text":" (muted) and "},{"kind":"code","text":"`1.0`"},{"kind":"text","text":" (max volume)"}],"blockTags":[{"tag":"@default","content":[{"kind":"text","text":"1.0"}]},{"tag":"@platform","content":[{"kind":"text","text":"web"}]}]},"type":{"type":"intrinsic","name":"number"}}]}}},{"name":"Voice","kind":4194304,"comment":{"summary":[{"kind":"text","text":"Object describing the available voices on the device."}]},"type":{"type":"reflection","declaration":{"name":"__type","kind":65536,"children":[{"name":"identifier","kind":1024,"comment":{"summary":[{"kind":"text","text":"Voice unique identifier."}]},"type":{"type":"intrinsic","name":"string"}},{"name":"language","kind":1024,"comment":{"summary":[{"kind":"text","text":"Voice language."}]},"type":{"type":"intrinsic","name":"string"}},{"name":"name","kind":1024,"comment":{"summary":[{"kind":"text","text":"Voice name."}]},"type":{"type":"intrinsic","name":"string"}},{"name":"quality","kind":1024,"comment":{"summary":[{"kind":"text","text":"Voice quality."}]},"type":{"type":"reference","name":"VoiceQuality"}}]}}},{"name":"WebVoice","kind":4194304,"type":{"type":"intersection","types":[{"type":"reference","name":"Voice"},{"type":"reflection","declaration":{"name":"__type","kind":65536,"children":[{"name":"isDefault","kind":1024,"type":{"type":"intrinsic","name":"boolean"}},{"name":"localService","kind":1024,"type":{"type":"intrinsic","name":"boolean"}},{"name":"name","kind":1024,"type":{"type":"intrinsic","name":"string"}},{"name":"voiceURI","kind":1024,"type":{"type":"intrinsic","name":"string"}}]}}]}},{"name":"maxSpeechInputLength","kind":32,"flags":{"isConst":true},"comment":{"summary":[{"kind":"text","text":"Maximum possible text length acceptable by "},{"kind":"code","text":"`Speech.speak()`"},{"kind":"text","text":" method. It is platform-dependent.\nOn iOS, this returns "},{"kind":"code","text":"`Number.MAX_VALUE`"},{"kind":"text","text":"."}]},"type":{"type":"intrinsic","name":"number"},"defaultValue":"..."},{"name":"getAvailableVoicesAsync","kind":64,"signatures":[{"name":"getAvailableVoicesAsync","kind":4096,"comment":{"summary":[{"kind":"text","text":"Returns list of all available voices."}],"blockTags":[{"tag":"@returns","content":[{"kind":"text","text":"List of "},{"kind":"code","text":"`Voice`"},{"kind":"text","text":" objects."}]}]},"type":{"type":"reference","typeArguments":[{"type":"array","elementType":{"type":"reference","name":"Voice"}}],"name":"Promise","qualifiedName":"Promise","package":"typescript"}}]},{"name":"isSpeakingAsync","kind":64,"signatures":[{"name":"isSpeakingAsync","kind":4096,"comment":{"summary":[{"kind":"text","text":"Determine whether the Text-to-speech utility is currently speaking. Will return "},{"kind":"code","text":"`true`"},{"kind":"text","text":" if speaker\nis paused."}],"blockTags":[{"tag":"@returns","content":[{"kind":"text","text":"Returns a Promise that fulfils with a boolean, "},{"kind":"code","text":"`true`"},{"kind":"text","text":" if speaking, "},{"kind":"code","text":"`false`"},{"kind":"text","text":" if not."}]}]},"type":{"type":"reference","typeArguments":[{"type":"intrinsic","name":"boolean"}],"name":"Promise","qualifiedName":"Promise","package":"typescript"}}]},{"name":"pause","kind":64,"signatures":[{"name":"pause","kind":4096,"comment":{"summary":[{"kind":"text","text":"Pauses current speech. This method is not available on Android."}]},"type":{"type":"reference","typeArguments":[{"type":"intrinsic","name":"void"}],"name":"Promise","qualifiedName":"Promise","package":"typescript"}}]},{"name":"resume","kind":64,"signatures":[{"name":"resume","kind":4096,"comment":{"summary":[{"kind":"text","text":"Resumes speaking previously paused speech or does nothing if there's none. This method is not\navailable on Android."}]},"type":{"type":"reference","typeArguments":[{"type":"intrinsic","name":"void"}],"name":"Promise","qualifiedName":"Promise","package":"typescript"}}]},{"name":"speak","kind":64,"signatures":[{"name":"speak","kind":4096,"comment":{"summary":[{"kind":"text","text":"Speak out loud the text given options. Calling this when another text is being spoken adds\nan utterance to queue."}]},"parameters":[{"name":"text","kind":32768,"comment":{"summary":[{"kind":"text","text":"The text to be spoken. Cannot be longer than ["},{"kind":"code","text":"`Speech.maxSpeechInputLength`"},{"kind":"text","text":"](#speechmaxspeechinputlength)."}]},"type":{"type":"intrinsic","name":"string"}},{"name":"options","kind":32768,"comment":{"summary":[{"kind":"text","text":"A "},{"kind":"code","text":"`SpeechOptions`"},{"kind":"text","text":" object."}]},"type":{"type":"reference","name":"SpeechOptions"},"defaultValue":"{}"}],"type":{"type":"intrinsic","name":"void"}}]},{"name":"stop","kind":64,"signatures":[{"name":"stop","kind":4096,"comment":{"summary":[{"kind":"text","text":"Interrupts current speech and deletes all in queue."}]},"type":{"type":"reference","typeArguments":[{"type":"intrinsic","name":"void"}],"name":"Promise","qualifiedName":"Promise","package":"typescript"}}]}]}
\ No newline at end of file
diff --git a/docs/public/static/data/v49.0.0/expo-splash-screen.json b/docs/public/static/data/v49.0.0/expo-splash-screen.json
new file mode 100644
index 0000000000000..89d1ac6c4a7db
--- /dev/null
+++ b/docs/public/static/data/v49.0.0/expo-splash-screen.json
@@ -0,0 +1 @@
+{"name":"expo-splash-screen","kind":1,"children":[{"name":"hideAsync","kind":64,"signatures":[{"name":"hideAsync","kind":4096,"comment":{"summary":[{"kind":"text","text":"Hides the native splash screen immediately. Be careful to ensure that your app has content ready\nto display when you hide the splash screen, or you may see a blank screen briefly. See the\n[\"Usage\"](#usage) section for an example."}]},"type":{"type":"reference","typeArguments":[{"type":"intrinsic","name":"boolean"}],"name":"Promise","qualifiedName":"Promise","package":"typescript"}}]},{"name":"preventAutoHideAsync","kind":64,"signatures":[{"name":"preventAutoHideAsync","kind":4096,"comment":{"summary":[{"kind":"text","text":"Makes the native splash screen (configured in "},{"kind":"code","text":"`app.json`"},{"kind":"text","text":") remain visible until "},{"kind":"code","text":"`hideAsync`"},{"kind":"text","text":" is called.\n\n> **Important note**: It is recommended to call this in global scope without awaiting, rather than\n> inside React components or hooks, because otherwise this might be called too late,\n> when the splash screen is already hidden."}],"blockTags":[{"tag":"@example","content":[{"kind":"code","text":"```ts\nimport * as SplashScreen from 'expo-splash-screen';\n\nSplashScreen.preventAutoHideAsync();\n\nexport default function App() {\n // ...\n}\n```"}]}]},"type":{"type":"reference","typeArguments":[{"type":"intrinsic","name":"boolean"}],"name":"Promise","qualifiedName":"Promise","package":"typescript"}}]}]}
\ No newline at end of file
diff --git a/docs/public/static/data/v49.0.0/expo-sqlite.json b/docs/public/static/data/v49.0.0/expo-sqlite.json
new file mode 100644
index 0000000000000..d4ed559796beb
--- /dev/null
+++ b/docs/public/static/data/v49.0.0/expo-sqlite.json
@@ -0,0 +1 @@
+{"name":"expo-sqlite","kind":1,"children":[{"name":"SQLError","kind":128,"children":[{"name":"constructor","kind":512,"signatures":[{"name":"new SQLError","kind":16384,"type":{"type":"reference","name":"SQLError"}}]},{"name":"code","kind":1024,"type":{"type":"intrinsic","name":"number"}},{"name":"message","kind":1024,"type":{"type":"intrinsic","name":"string"}},{"name":"CONSTRAINT_ERR","kind":1024,"flags":{"isStatic":true},"type":{"type":"intrinsic","name":"number"}},{"name":"DATABASE_ERR","kind":1024,"flags":{"isStatic":true},"type":{"type":"intrinsic","name":"number"}},{"name":"QUOTA_ERR","kind":1024,"flags":{"isStatic":true},"type":{"type":"intrinsic","name":"number"}},{"name":"SYNTAX_ERR","kind":1024,"flags":{"isStatic":true},"type":{"type":"intrinsic","name":"number"}},{"name":"TIMEOUT_ERR","kind":1024,"flags":{"isStatic":true},"type":{"type":"intrinsic","name":"number"}},{"name":"TOO_LARGE_ERR","kind":1024,"flags":{"isStatic":true},"type":{"type":"intrinsic","name":"number"}},{"name":"UNKNOWN_ERR","kind":1024,"flags":{"isStatic":true},"type":{"type":"intrinsic","name":"number"}},{"name":"VERSION_ERR","kind":1024,"flags":{"isStatic":true},"type":{"type":"intrinsic","name":"number"}}]},{"name":"Database","kind":256,"comment":{"summary":[{"kind":"code","text":"`Database`"},{"kind":"text","text":" objects are returned by calls to "},{"kind":"code","text":"`SQLite.openDatabase()`"},{"kind":"text","text":". Such an object represents a\nconnection to a database on your device."}]},"children":[{"name":"version","kind":1024,"type":{"type":"intrinsic","name":"string"}},{"name":"readTransaction","kind":2048,"signatures":[{"name":"readTransaction","kind":4096,"parameters":[{"name":"callback","kind":32768,"type":{"type":"reference","name":"SQLTransactionCallback"}},{"name":"errorCallback","kind":32768,"flags":{"isOptional":true},"type":{"type":"reference","name":"SQLTransactionErrorCallback"}},{"name":"successCallback","kind":32768,"flags":{"isOptional":true},"type":{"type":"reflection","declaration":{"name":"__type","kind":65536,"signatures":[{"name":"__type","kind":4096,"type":{"type":"intrinsic","name":"void"}}]}}}],"type":{"type":"intrinsic","name":"void"}}]},{"name":"transaction","kind":2048,"signatures":[{"name":"transaction","kind":4096,"comment":{"summary":[{"kind":"text","text":"Execute a database transaction."}]},"parameters":[{"name":"callback","kind":32768,"comment":{"summary":[{"kind":"text","text":"A function representing the transaction to perform. Takes a Transaction\n(see below) as its only parameter, on which it can add SQL statements to execute."}]},"type":{"type":"reference","name":"SQLTransactionCallback"}},{"name":"errorCallback","kind":32768,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"Called if an error occurred processing this transaction. Takes a single\nparameter describing the error."}]},"type":{"type":"reference","name":"SQLTransactionErrorCallback"}},{"name":"successCallback","kind":32768,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"Called when the transaction has completed executing on the database."}]},"type":{"type":"reflection","declaration":{"name":"__type","kind":65536,"signatures":[{"name":"__type","kind":4096,"type":{"type":"intrinsic","name":"void"}}]}}}],"type":{"type":"intrinsic","name":"void"}}]}],"extendedBy":[{"type":"reference","name":"WebSQLDatabase"}]},{"name":"SQLResultSetRowList","kind":256,"children":[{"name":"_array","kind":1024,"comment":{"summary":[{"kind":"text","text":"The actual array of rows returned by the query. Can be used directly instead of\ngetting rows through rows.item()."}]},"type":{"type":"array","elementType":{"type":"intrinsic","name":"any"}}},{"name":"length","kind":1024,"comment":{"summary":[{"kind":"text","text":"The number of rows returned by the query."}]},"type":{"type":"intrinsic","name":"number"}},{"name":"item","kind":2048,"signatures":[{"name":"item","kind":4096,"comment":{"summary":[{"kind":"text","text":"Returns the row with the given "},{"kind":"code","text":"`index`"},{"kind":"text","text":". If there is no such row, returns "},{"kind":"code","text":"`null`"},{"kind":"text","text":"."}]},"parameters":[{"name":"index","kind":32768,"comment":{"summary":[{"kind":"text","text":"Index of row to get."}]},"type":{"type":"intrinsic","name":"number"}}],"type":{"type":"intrinsic","name":"any"}}]}]},{"name":"SQLTransaction","kind":256,"comment":{"summary":[{"kind":"text","text":"A "},{"kind":"code","text":"`SQLTransaction`"},{"kind":"text","text":" object is passed in as a parameter to the "},{"kind":"code","text":"`callback`"},{"kind":"text","text":" parameter for the\n"},{"kind":"code","text":"`db.transaction()`"},{"kind":"text","text":" method on a "},{"kind":"code","text":"`Database`"},{"kind":"text","text":" (see above). It allows enqueuing SQL statements to\nperform in a database transaction."}]},"children":[{"name":"executeSql","kind":2048,"signatures":[{"name":"executeSql","kind":4096,"comment":{"summary":[{"kind":"text","text":"Enqueue a SQL statement to execute in the transaction. Authors are strongly recommended to make\nuse of the "},{"kind":"code","text":"`?`"},{"kind":"text","text":" placeholder feature of the method to avoid against SQL injection attacks, and to\nnever construct SQL statements on the fly."}]},"parameters":[{"name":"sqlStatement","kind":32768,"comment":{"summary":[{"kind":"text","text":"A string containing a database query to execute expressed as SQL. The string\nmay contain "},{"kind":"code","text":"`?`"},{"kind":"text","text":" placeholders, with values to be substituted listed in the "},{"kind":"code","text":"`arguments`"},{"kind":"text","text":" parameter."}]},"type":{"type":"intrinsic","name":"string"}},{"name":"args","kind":32768,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"An array of values (numbers, strings or nulls) to substitute for "},{"kind":"code","text":"`?`"},{"kind":"text","text":" placeholders in the\nSQL statement."}]},"type":{"type":"array","elementType":{"type":"union","types":[{"type":"literal","value":null},{"type":"intrinsic","name":"string"},{"type":"intrinsic","name":"number"}]}}},{"name":"callback","kind":32768,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"Called when the query is successfully completed during the transaction. Takes\ntwo parameters: the transaction itself, and a "},{"kind":"code","text":"`ResultSet`"},{"kind":"text","text":" object (see below) with the results\nof the query."}]},"type":{"type":"reference","name":"SQLStatementCallback"}},{"name":"errorCallback","kind":32768,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"Called if an error occurred executing this particular query in the\ntransaction. Takes two parameters: the transaction itself, and the error object."}]},"type":{"type":"reference","name":"SQLStatementErrorCallback"}}],"type":{"type":"intrinsic","name":"void"}}]}]},{"name":"WebSQLDatabase","kind":256,"comment":{"summary":[{"kind":"code","text":"`Database`"},{"kind":"text","text":" objects are returned by calls to "},{"kind":"code","text":"`SQLite.openDatabase()`"},{"kind":"text","text":". Such an object represents a\nconnection to a database on your device."}]},"children":[{"name":"version","kind":1024,"type":{"type":"intrinsic","name":"string"},"inheritedFrom":{"type":"reference","name":"Database.version"}},{"name":"closeAsync","kind":2048,"signatures":[{"name":"closeAsync","kind":4096,"comment":{"summary":[{"kind":"text","text":"Close the database."}]},"type":{"type":"intrinsic","name":"void"}}]},{"name":"deleteAsync","kind":2048,"signatures":[{"name":"deleteAsync","kind":4096,"comment":{"summary":[{"kind":"text","text":"Delete the database file.\n> The database has to be closed prior to deletion."}]},"type":{"type":"reference","typeArguments":[{"type":"intrinsic","name":"void"}],"name":"Promise","qualifiedName":"Promise","package":"typescript"}}]},{"name":"exec","kind":2048,"signatures":[{"name":"exec","kind":4096,"parameters":[{"name":"queries","kind":32768,"type":{"type":"array","elementType":{"type":"reference","name":"Query"}}},{"name":"readOnly","kind":32768,"type":{"type":"intrinsic","name":"boolean"}},{"name":"callback","kind":32768,"type":{"type":"reference","name":"SQLiteCallback"}}],"type":{"type":"intrinsic","name":"void"}}]},{"name":"readTransaction","kind":2048,"signatures":[{"name":"readTransaction","kind":4096,"parameters":[{"name":"callback","kind":32768,"type":{"type":"reference","name":"SQLTransactionCallback"}},{"name":"errorCallback","kind":32768,"flags":{"isOptional":true},"type":{"type":"reference","name":"SQLTransactionErrorCallback"}},{"name":"successCallback","kind":32768,"flags":{"isOptional":true},"type":{"type":"reflection","declaration":{"name":"__type","kind":65536,"signatures":[{"name":"__type","kind":4096,"type":{"type":"intrinsic","name":"void"}}]}}}],"type":{"type":"intrinsic","name":"void"},"inheritedFrom":{"type":"reference","name":"Database.readTransaction"}}],"inheritedFrom":{"type":"reference","name":"Database.readTransaction"}},{"name":"transaction","kind":2048,"signatures":[{"name":"transaction","kind":4096,"comment":{"summary":[{"kind":"text","text":"Execute a database transaction."}]},"parameters":[{"name":"callback","kind":32768,"comment":{"summary":[{"kind":"text","text":"A function representing the transaction to perform. Takes a Transaction\n(see below) as its only parameter, on which it can add SQL statements to execute."}]},"type":{"type":"reference","name":"SQLTransactionCallback"}},{"name":"errorCallback","kind":32768,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"Called if an error occurred processing this transaction. Takes a single\nparameter describing the error."}]},"type":{"type":"reference","name":"SQLTransactionErrorCallback"}},{"name":"successCallback","kind":32768,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"Called when the transaction has completed executing on the database."}]},"type":{"type":"reflection","declaration":{"name":"__type","kind":65536,"signatures":[{"name":"__type","kind":4096,"type":{"type":"intrinsic","name":"void"}}]}}}],"type":{"type":"intrinsic","name":"void"},"inheritedFrom":{"type":"reference","name":"Database.transaction"}}],"inheritedFrom":{"type":"reference","name":"Database.transaction"}}],"extendedTypes":[{"type":"reference","name":"Database"}]},{"name":"Window","kind":256,"children":[{"name":"openDatabase","kind":1024,"flags":{"isOptional":true},"type":{"type":"reflection","declaration":{"name":"__type","kind":65536,"signatures":[{"name":"__type","kind":4096,"parameters":[{"name":"name","kind":32768,"type":{"type":"intrinsic","name":"string"}},{"name":"version","kind":32768,"type":{"type":"intrinsic","name":"string"}},{"name":"displayName","kind":32768,"type":{"type":"intrinsic","name":"string"}},{"name":"estimatedSize","kind":32768,"type":{"type":"intrinsic","name":"number"}},{"name":"creationCallback","kind":32768,"flags":{"isOptional":true},"type":{"type":"reference","name":"DatabaseCallback"}}],"type":{"type":"reference","name":"Database"}}]}}}]},{"name":"DatabaseCallback","kind":4194304,"type":{"type":"reflection","declaration":{"name":"__type","kind":65536,"signatures":[{"name":"__type","kind":4096,"parameters":[{"name":"database","kind":32768,"type":{"type":"reference","name":"Database"}}],"type":{"type":"intrinsic","name":"void"}}]}}},{"name":"Query","kind":4194304,"type":{"type":"reflection","declaration":{"name":"__type","kind":65536,"children":[{"name":"args","kind":1024,"type":{"type":"array","elementType":{"type":"intrinsic","name":"unknown"}}},{"name":"sql","kind":1024,"type":{"type":"intrinsic","name":"string"}}]}}},{"name":"ResultSet","kind":4194304,"comment":{"summary":[{"kind":"code","text":"`ResultSet`"},{"kind":"text","text":" objects are returned through second parameter of the "},{"kind":"code","text":"`success`"},{"kind":"text","text":" callback for the\n"},{"kind":"code","text":"`tx.executeSql()`"},{"kind":"text","text":" method on a "},{"kind":"code","text":"`SQLTransaction`"},{"kind":"text","text":" (see above)."}]},"type":{"type":"reflection","declaration":{"name":"__type","kind":65536,"children":[{"name":"insertId","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"The row ID of the row that the SQL statement inserted into the database, if a row was inserted."}]},"type":{"type":"intrinsic","name":"number"}},{"name":"rows","kind":1024,"type":{"type":"array","elementType":{"type":"reflection","declaration":{"name":"__type","kind":65536,"indexSignature":{"name":"__index","kind":8192,"parameters":[{"name":"column","kind":32768,"type":{"type":"intrinsic","name":"string"}}],"type":{"type":"intrinsic","name":"any"}}}}}},{"name":"rowsAffected","kind":1024,"comment":{"summary":[{"kind":"text","text":"The number of rows that were changed by the SQL statement."}]},"type":{"type":"intrinsic","name":"number"}}]}}},{"name":"ResultSetError","kind":4194304,"type":{"type":"reflection","declaration":{"name":"__type","kind":65536,"children":[{"name":"error","kind":1024,"type":{"type":"reference","name":"Error","qualifiedName":"Error","package":"typescript"}}]}}},{"name":"SQLResultSet","kind":4194304,"type":{"type":"reflection","declaration":{"name":"__type","kind":65536,"children":[{"name":"insertId","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"The row ID of the row that the SQL statement inserted into the database, if a row was inserted."}]},"type":{"type":"intrinsic","name":"number"}},{"name":"rows","kind":1024,"type":{"type":"reference","name":"SQLResultSetRowList"}},{"name":"rowsAffected","kind":1024,"comment":{"summary":[{"kind":"text","text":"The number of rows that were changed by the SQL statement."}]},"type":{"type":"intrinsic","name":"number"}}]}}},{"name":"SQLStatementCallback","kind":4194304,"type":{"type":"reflection","declaration":{"name":"__type","kind":65536,"signatures":[{"name":"__type","kind":4096,"parameters":[{"name":"transaction","kind":32768,"type":{"type":"reference","name":"SQLTransaction"}},{"name":"resultSet","kind":32768,"type":{"type":"reference","name":"SQLResultSet"}}],"type":{"type":"intrinsic","name":"void"}}]}}},{"name":"SQLStatementErrorCallback","kind":4194304,"type":{"type":"reflection","declaration":{"name":"__type","kind":65536,"signatures":[{"name":"__type","kind":4096,"parameters":[{"name":"transaction","kind":32768,"type":{"type":"reference","name":"SQLTransaction"}},{"name":"error","kind":32768,"type":{"type":"reference","name":"SQLError"}}],"type":{"type":"intrinsic","name":"boolean"}}]}}},{"name":"SQLTransactionCallback","kind":4194304,"type":{"type":"reflection","declaration":{"name":"__type","kind":65536,"signatures":[{"name":"__type","kind":4096,"parameters":[{"name":"transaction","kind":32768,"type":{"type":"reference","name":"SQLTransaction"}}],"type":{"type":"intrinsic","name":"void"}}]}}},{"name":"SQLTransactionErrorCallback","kind":4194304,"type":{"type":"reflection","declaration":{"name":"__type","kind":65536,"signatures":[{"name":"__type","kind":4096,"parameters":[{"name":"error","kind":32768,"type":{"type":"reference","name":"SQLError"}}],"type":{"type":"intrinsic","name":"void"}}]}}},{"name":"SQLiteCallback","kind":4194304,"type":{"type":"reflection","declaration":{"name":"__type","kind":65536,"signatures":[{"name":"__type","kind":4096,"parameters":[{"name":"error","kind":32768,"flags":{"isOptional":true},"type":{"type":"union","types":[{"type":"reference","name":"Error","qualifiedName":"Error","package":"typescript"},{"type":"literal","value":null}]}},{"name":"resultSet","kind":32768,"flags":{"isOptional":true},"type":{"type":"array","elementType":{"type":"union","types":[{"type":"reference","name":"ResultSetError"},{"type":"reference","name":"ResultSet"}]}}}],"type":{"type":"intrinsic","name":"void"}}]}}},{"name":"openDatabase","kind":64,"signatures":[{"name":"openDatabase","kind":4096,"comment":{"summary":[{"kind":"text","text":"Open a database, creating it if it doesn't exist, and return a "},{"kind":"code","text":"`Database`"},{"kind":"text","text":" object. On disk,\nthe database will be created under the app's [documents directory](./filesystem), i.e.\n"},{"kind":"code","text":"`${FileSystem.documentDirectory}/SQLite/${name}`"},{"kind":"text","text":".\n> The "},{"kind":"code","text":"`version`"},{"kind":"text","text":", "},{"kind":"code","text":"`description`"},{"kind":"text","text":" and "},{"kind":"code","text":"`size`"},{"kind":"text","text":" arguments are ignored, but are accepted by the function\nfor compatibility with the WebSQL specification."}],"blockTags":[{"tag":"@returns","content":[]}]},"parameters":[{"name":"name","kind":32768,"comment":{"summary":[{"kind":"text","text":"Name of the database file to open."}]},"type":{"type":"intrinsic","name":"string"}},{"name":"version","kind":32768,"type":{"type":"intrinsic","name":"string"},"defaultValue":"'1.0'"},{"name":"description","kind":32768,"type":{"type":"intrinsic","name":"string"},"defaultValue":"name"},{"name":"size","kind":32768,"type":{"type":"intrinsic","name":"number"},"defaultValue":"1"},{"name":"callback","kind":32768,"flags":{"isOptional":true},"type":{"type":"reflection","declaration":{"name":"__type","kind":65536,"signatures":[{"name":"__type","kind":4096,"parameters":[{"name":"db","kind":32768,"type":{"type":"reference","name":"WebSQLDatabase"}}],"type":{"type":"intrinsic","name":"void"}}]}}}],"type":{"type":"reference","name":"WebSQLDatabase"}}]}]}
\ No newline at end of file
diff --git a/docs/public/static/data/v49.0.0/expo-status-bar.json b/docs/public/static/data/v49.0.0/expo-status-bar.json
new file mode 100644
index 0000000000000..ae285e3dedb49
--- /dev/null
+++ b/docs/public/static/data/v49.0.0/expo-status-bar.json
@@ -0,0 +1 @@
+{"name":"expo-status-bar","kind":1,"children":[{"name":"StatusBarAnimation","kind":4194304,"type":{"type":"union","types":[{"type":"literal","value":"none"},{"type":"literal","value":"fade"},{"type":"literal","value":"slide"}]}},{"name":"StatusBarProps","kind":4194304,"type":{"type":"reflection","declaration":{"name":"__type","kind":65536,"children":[{"name":"animated","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"If the transition between status bar property changes should be\nanimated. Supported for "},{"kind":"code","text":"`backgroundColor`"},{"kind":"text","text":", "},{"kind":"code","text":"`barStyle`"},{"kind":"text","text":" and "},{"kind":"code","text":"`hidden`"},{"kind":"text","text":"."}]},"type":{"type":"intrinsic","name":"boolean"}},{"name":"backgroundColor","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"The background color of the status bar."}],"blockTags":[{"tag":"@platform","content":[{"kind":"text","text":"android"}]}]},"type":{"type":"intrinsic","name":"string"}},{"name":"hidden","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"If the status bar is hidden."}]},"type":{"type":"intrinsic","name":"boolean"}},{"name":"hideTransitionAnimation","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"The transition effect when showing and hiding the status bar using\nthe hidden prop."}],"blockTags":[{"tag":"@default","content":[{"kind":"text","text":"'fade'"}]},{"tag":"@platform","content":[{"kind":"text","text":"ios"}]}]},"type":{"type":"reference","name":"StatusBarAnimation"}},{"name":"networkActivityIndicatorVisible","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"If the network activity indicator should be visible."}],"blockTags":[{"tag":"@platform","content":[{"kind":"text","text":"ios"}]}]},"type":{"type":"intrinsic","name":"boolean"}},{"name":"style","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"Sets the color of the status bar text. Default value is "},{"kind":"code","text":"`\"auto\"`"},{"kind":"text","text":" which\npicks the appropriate value according to the active color scheme, eg:\nif your app is dark mode, the style will be "},{"kind":"code","text":"`\"light\"`"},{"kind":"text","text":"."}],"blockTags":[{"tag":"@default","content":[{"kind":"text","text":"'auto'"}]}]},"type":{"type":"reference","name":"StatusBarStyle"}},{"name":"translucent","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"If the status bar is translucent. When translucent is set to "},{"kind":"code","text":"`true`"},{"kind":"text","text":",\nthe app will draw under the status bar. This is the default behaviour in\nprojects created with Expo tools because it is consistent with iOS."}],"blockTags":[{"tag":"@platform","content":[{"kind":"text","text":"android"}]}]},"type":{"type":"intrinsic","name":"boolean"}}]}}},{"name":"StatusBarStyle","kind":4194304,"type":{"type":"union","types":[{"type":"literal","value":"auto"},{"type":"literal","value":"inverted"},{"type":"literal","value":"light"},{"type":"literal","value":"dark"}]}},{"name":"StatusBar","kind":64,"signatures":[{"name":"StatusBar","kind":4096,"comment":{"summary":[{"kind":"text","text":"A component that allows you to configure your status bar without directly calling imperative\nmethods like "},{"kind":"code","text":"`setBarStyle`"},{"kind":"text","text":".\n\nYou will likely have multiple "},{"kind":"code","text":"`StatusBar`"},{"kind":"text","text":" components mounted in the same app at the same time.\nFor example, if you have multiple screens in your app, you may end up using one per screen.\nThe props of each "},{"kind":"code","text":"`StatusBar`"},{"kind":"text","text":" component will be merged in the order that they were mounted.\nThis component is built on top of the [StatusBar](https://reactnative.dev/docs/statusbar)\ncomponent exported from React Native, and it provides defaults that work better for Expo users."}]},"parameters":[{"name":"props","kind":32768,"type":{"type":"reference","name":"StatusBarProps"}}],"type":{"type":"literal","value":null}}]},{"name":"setStatusBarBackgroundColor","kind":64,"signatures":[{"name":"setStatusBarBackgroundColor","kind":4096,"comment":{"summary":[{"kind":"text","text":"Set the background color of the status bar."}],"blockTags":[{"tag":"@platform","content":[{"kind":"text","text":"android"}]}]},"parameters":[{"name":"backgroundColor","kind":32768,"comment":{"summary":[{"kind":"text","text":"The background color of the status bar."}]},"type":{"type":"intrinsic","name":"string"}},{"name":"animated","kind":32768,"comment":{"summary":[{"kind":"code","text":"`true`"},{"kind":"text","text":" to animate the background color change, "},{"kind":"code","text":"`false`"},{"kind":"text","text":" to change immediately."}]},"type":{"type":"intrinsic","name":"boolean"}}],"type":{"type":"intrinsic","name":"void"}}]},{"name":"setStatusBarHidden","kind":64,"signatures":[{"name":"setStatusBarHidden","kind":4096,"comment":{"summary":[{"kind":"text","text":"Toggle visibility of the status bar."}]},"parameters":[{"name":"hidden","kind":32768,"comment":{"summary":[{"kind":"text","text":"If the status bar should be hidden."}]},"type":{"type":"intrinsic","name":"boolean"}},{"name":"animation","kind":32768,"comment":{"summary":[{"kind":"text","text":"Animation to use when toggling hidden, defaults to "},{"kind":"code","text":"`'none'`"},{"kind":"text","text":"."}]},"type":{"type":"reference","name":"StatusBarAnimation"}}],"type":{"type":"intrinsic","name":"void"}}]},{"name":"setStatusBarNetworkActivityIndicatorVisible","kind":64,"signatures":[{"name":"setStatusBarNetworkActivityIndicatorVisible","kind":4096,"comment":{"summary":[{"kind":"text","text":"Toggle visibility of the network activity indicator."}],"blockTags":[{"tag":"@platform","content":[{"kind":"text","text":"ios"}]}]},"parameters":[{"name":"visible","kind":32768,"comment":{"summary":[{"kind":"text","text":"If the network activity indicator should be visible."}]},"type":{"type":"intrinsic","name":"boolean"}}],"type":{"type":"intrinsic","name":"void"}}]},{"name":"setStatusBarStyle","kind":64,"signatures":[{"name":"setStatusBarStyle","kind":4096,"comment":{"summary":[{"kind":"text","text":"Set the bar style of the status bar."}]},"parameters":[{"name":"style","kind":32768,"comment":{"summary":[{"kind":"text","text":"The color of the status bar text."}]},"type":{"type":"reference","name":"StatusBarStyle"}}],"type":{"type":"intrinsic","name":"void"}}]},{"name":"setStatusBarTranslucent","kind":64,"signatures":[{"name":"setStatusBarTranslucent","kind":4096,"comment":{"summary":[{"kind":"text","text":"Set the translucency of the status bar."}],"blockTags":[{"tag":"@platform","content":[{"kind":"text","text":"android"}]}]},"parameters":[{"name":"translucent","kind":32768,"comment":{"summary":[{"kind":"text","text":"Whether the app can draw under the status bar. When "},{"kind":"code","text":"`true`"},{"kind":"text","text":", content will be\nrendered under the status bar. This is always "},{"kind":"code","text":"`true`"},{"kind":"text","text":" on iOS and cannot be changed."}]},"type":{"type":"intrinsic","name":"boolean"}}],"type":{"type":"intrinsic","name":"void"}}]}]}
\ No newline at end of file
diff --git a/docs/public/static/data/v49.0.0/expo-store-review.json b/docs/public/static/data/v49.0.0/expo-store-review.json
new file mode 100644
index 0000000000000..2491d26345734
--- /dev/null
+++ b/docs/public/static/data/v49.0.0/expo-store-review.json
@@ -0,0 +1 @@
+{"name":"expo-store-review","kind":1,"children":[{"name":"hasAction","kind":64,"signatures":[{"name":"hasAction","kind":4096,"comment":{"summary":[],"blockTags":[{"tag":"@returns","content":[{"kind":"text","text":"This returns a promise that fulfills to "},{"kind":"code","text":"`true`"},{"kind":"text","text":" if "},{"kind":"code","text":"`StoreReview.requestReview()`"},{"kind":"text","text":" is capable\ndirecting the user to some kind of store review flow. If the app config ("},{"kind":"code","text":"`app.json`"},{"kind":"text","text":") does not\ncontain store URLs and native store review capabilities are not available then the promise\nwill fulfill to "},{"kind":"code","text":"`false`"},{"kind":"text","text":"."}]},{"tag":"@example","content":[{"kind":"code","text":"```ts\nif (await StoreReview.hasAction()) {\n // you can call StoreReview.requestReview()\n}\n```"}]}]},"type":{"type":"reference","typeArguments":[{"type":"intrinsic","name":"boolean"}],"name":"Promise","qualifiedName":"Promise","package":"typescript"}}]},{"name":"isAvailableAsync","kind":64,"signatures":[{"name":"isAvailableAsync","kind":4096,"comment":{"summary":[{"kind":"text","text":"Determines if the platform has the capabilities to use "},{"kind":"code","text":"`StoreReview.requestReview()`"},{"kind":"text","text":"."}],"blockTags":[{"tag":"@returns","content":[{"kind":"text","text":"This returns a promise fulfills with "},{"kind":"code","text":"`boolean`"},{"kind":"text","text":", depending on the platform:\n- On iOS, it will always resolve to "},{"kind":"code","text":"`true`"},{"kind":"text","text":".\n- On Android, it will resolve to "},{"kind":"code","text":"`true`"},{"kind":"text","text":" if the device is running Android 5.0+.\n- On Web, it will resolve to "},{"kind":"code","text":"`false`"},{"kind":"text","text":"."}]}]},"type":{"type":"reference","typeArguments":[{"type":"intrinsic","name":"boolean"}],"name":"Promise","qualifiedName":"Promise","package":"typescript"}}]},{"name":"requestReview","kind":64,"signatures":[{"name":"requestReview","kind":4096,"comment":{"summary":[{"kind":"text","text":"In ideal circumstances this will open a native modal and allow the user to select a star rating\nthat will then be applied to the App Store, without leaving the app. If the device is running\na version of Android lower than 5.0, this will attempt to get the store URL and link the user to it."}]},"type":{"type":"reference","typeArguments":[{"type":"intrinsic","name":"void"}],"name":"Promise","qualifiedName":"Promise","package":"typescript"}}]},{"name":"storeUrl","kind":64,"signatures":[{"name":"storeUrl","kind":4096,"comment":{"summary":[{"kind":"text","text":"This uses the "},{"kind":"code","text":"`Constants`"},{"kind":"text","text":" API to get the "},{"kind":"code","text":"`Constants.expoConfig.ios.appStoreUrl`"},{"kind":"text","text":" on iOS, or the\n"},{"kind":"code","text":"`Constants.expoConfig.android.playStoreUrl`"},{"kind":"text","text":" on Android.\n\nOn Web this will return "},{"kind":"code","text":"`null`"},{"kind":"text","text":"."}]},"type":{"type":"union","types":[{"type":"intrinsic","name":"string"},{"type":"literal","value":null}]}}]}]}
\ No newline at end of file
diff --git a/docs/public/static/data/v49.0.0/expo-system-ui.json b/docs/public/static/data/v49.0.0/expo-system-ui.json
new file mode 100644
index 0000000000000..e3bd27a710777
--- /dev/null
+++ b/docs/public/static/data/v49.0.0/expo-system-ui.json
@@ -0,0 +1 @@
+{"name":"expo-system-ui","kind":1,"children":[{"name":"getBackgroundColorAsync","kind":64,"signatures":[{"name":"getBackgroundColorAsync","kind":4096,"comment":{"summary":[{"kind":"text","text":"Gets the root view background color."}],"blockTags":[{"tag":"@example","content":[{"kind":"code","text":"```ts\nconst color = await SystemUI.getBackgroundColorAsync();\n```"}]},{"tag":"@returns","content":[{"kind":"text","text":"Current root view background color in hex format. Returns "},{"kind":"code","text":"`null`"},{"kind":"text","text":" if the background color is not set."}]}]},"type":{"type":"reference","typeArguments":[{"type":"union","types":[{"type":"reference","name":"ColorValue","qualifiedName":"ColorValue","package":"react-native"},{"type":"literal","value":null}]}],"name":"Promise","qualifiedName":"Promise","package":"typescript"}}]},{"name":"setBackgroundColorAsync","kind":64,"signatures":[{"name":"setBackgroundColorAsync","kind":4096,"comment":{"summary":[{"kind":"text","text":"Changes the root view background color.\nCall this function in the root file outside of you component."}],"blockTags":[{"tag":"@example","content":[{"kind":"code","text":"```ts\nSystemUI.setBackgroundColorAsync(\"black\");\n```"}]}]},"parameters":[{"name":"color","kind":32768,"comment":{"summary":[{"kind":"text","text":"Any valid [CSS 3 (SVG) color](http://www.w3.org/TR/css3-color/#svg-color)."}]},"type":{"type":"union","types":[{"type":"literal","value":null},{"type":"reference","name":"ColorValue","qualifiedName":"ColorValue","package":"react-native"}]}}],"type":{"type":"reference","typeArguments":[{"type":"intrinsic","name":"void"}],"name":"Promise","qualifiedName":"Promise","package":"typescript"}}]}]}
\ No newline at end of file
diff --git a/docs/public/static/data/v49.0.0/expo-task-manager.json b/docs/public/static/data/v49.0.0/expo-task-manager.json
new file mode 100644
index 0000000000000..5e47445959db9
--- /dev/null
+++ b/docs/public/static/data/v49.0.0/expo-task-manager.json
@@ -0,0 +1 @@
+{"name":"expo-task-manager","kind":1,"children":[{"name":"TaskManagerError","kind":256,"comment":{"summary":[{"kind":"text","text":"Error object that can be received through ["},{"kind":"code","text":"`TaskManagerTaskBody`"},{"kind":"text","text":"](#taskmanagertaskbody) when the\ntask fails."}]},"children":[{"name":"code","kind":1024,"type":{"type":"union","types":[{"type":"intrinsic","name":"string"},{"type":"intrinsic","name":"number"}]}},{"name":"message","kind":1024,"type":{"type":"intrinsic","name":"string"}}]},{"name":"TaskManagerTask","kind":256,"comment":{"summary":[{"kind":"text","text":"Represents an already registered task."}]},"children":[{"name":"options","kind":1024,"comment":{"summary":[{"kind":"text","text":"Provides "},{"kind":"code","text":"`options`"},{"kind":"text","text":" that the task was registered with."}]},"type":{"type":"intrinsic","name":"any"}},{"name":"taskName","kind":1024,"comment":{"summary":[{"kind":"text","text":"Name that the task is registered with."}]},"type":{"type":"intrinsic","name":"string"}},{"name":"taskType","kind":1024,"comment":{"summary":[{"kind":"text","text":"Type of the task which depends on how the task was registered."}]},"type":{"type":"intrinsic","name":"string"}}]},{"name":"TaskManagerTaskBody","kind":256,"comment":{"summary":[{"kind":"text","text":"Represents the object that is passed to the task executor."}]},"children":[{"name":"data","kind":1024,"comment":{"summary":[{"kind":"text","text":"An object of data passed to the task executor. Its properties depends on the type of the task."}]},"type":{"type":"reference","name":"T"}},{"name":"error","kind":1024,"comment":{"summary":[{"kind":"text","text":"Error object if the task failed or "},{"kind":"code","text":"`null`"},{"kind":"text","text":" otherwise."}]},"type":{"type":"union","types":[{"type":"literal","value":null},{"type":"reference","name":"TaskManagerError"}]}},{"name":"executionInfo","kind":1024,"comment":{"summary":[{"kind":"text","text":"Additional details containing unique ID of task event and name of the task."}]},"type":{"type":"reference","name":"TaskManagerTaskBodyExecutionInfo"}}],"typeParameters":[{"name":"T","kind":131072,"default":{"type":"intrinsic","name":"unknown"}}]},{"name":"TaskManagerTaskBodyExecutionInfo","kind":256,"comment":{"summary":[{"kind":"text","text":"Additional details about execution provided in "},{"kind":"code","text":"`TaskManagerTaskBody`"},{"kind":"text","text":"."}]},"children":[{"name":"appState","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"State of the application."}],"blockTags":[{"tag":"@platform","content":[{"kind":"text","text":"ios"}]}]},"type":{"type":"union","types":[{"type":"literal","value":"active"},{"type":"literal","value":"background"},{"type":"literal","value":"inactive"}]}},{"name":"eventId","kind":1024,"comment":{"summary":[{"kind":"text","text":"Unique ID of task event."}]},"type":{"type":"intrinsic","name":"string"}},{"name":"taskName","kind":1024,"comment":{"summary":[{"kind":"text","text":"Name of the task."}]},"type":{"type":"intrinsic","name":"string"}}]},{"name":"TaskManagerTaskExecutor","kind":4194304,"typeParameters":[{"name":"T","kind":131072,"default":{"type":"intrinsic","name":"unknown"}}],"type":{"type":"reflection","declaration":{"name":"__type","kind":65536,"signatures":[{"name":"__type","kind":4096,"comment":{"summary":[{"kind":"text","text":"Type of task executor – a function that handles the task."}]},"parameters":[{"name":"body","kind":32768,"type":{"type":"reference","typeArguments":[{"type":"reference","name":"T"}],"name":"TaskManagerTaskBody"}}],"type":{"type":"intrinsic","name":"void"}}]}}},{"name":"defineTask","kind":64,"signatures":[{"name":"defineTask","kind":4096,"comment":{"summary":[{"kind":"text","text":"Defines task function. It must be called in the global scope of your JavaScript bundle.\nIn particular, it cannot be called in any of React lifecycle methods like "},{"kind":"code","text":"`componentDidMount`"},{"kind":"text","text":".\nThis limitation is due to the fact that when the application is launched in the background,\nwe need to spin up your JavaScript app, run your task and then shut down — no views are mounted\nin this scenario."}]},"typeParameter":[{"name":"T","kind":131072,"default":{"type":"intrinsic","name":"unknown"}}],"parameters":[{"name":"taskName","kind":32768,"comment":{"summary":[{"kind":"text","text":"Name of the task. It must be the same as the name you provided when registering the task."}]},"type":{"type":"intrinsic","name":"string"}},{"name":"taskExecutor","kind":32768,"comment":{"summary":[{"kind":"text","text":"A function that will be invoked when the task with given "},{"kind":"code","text":"`taskName`"},{"kind":"text","text":" is executed."}]},"type":{"type":"reference","typeArguments":[{"type":"reference","name":"T"}],"name":"TaskManagerTaskExecutor"}}],"type":{"type":"intrinsic","name":"void"}}]},{"name":"getRegisteredTasksAsync","kind":64,"signatures":[{"name":"getRegisteredTasksAsync","kind":4096,"comment":{"summary":[{"kind":"text","text":"Provides information about tasks registered in the app."}],"blockTags":[{"tag":"@returns","content":[{"kind":"text","text":"A promise which fulfills with an array of tasks registered in the app. Example:\n"},{"kind":"code","text":"```json\n[\n {\n taskName: 'location-updates-task-name',\n taskType: 'location',\n options: {\n accuracy: Location.Accuracy.High,\n showsBackgroundLocationIndicator: false,\n },\n },\n {\n taskName: 'geofencing-task-name',\n taskType: 'geofencing',\n options: {\n regions: [...],\n },\n },\n]\n```"}]}]},"type":{"type":"reference","typeArguments":[{"type":"array","elementType":{"type":"reference","name":"TaskManagerTask"}}],"name":"Promise","qualifiedName":"Promise","package":"typescript"}}]},{"name":"getTaskOptionsAsync","kind":64,"signatures":[{"name":"getTaskOptionsAsync","kind":4096,"comment":{"summary":[{"kind":"text","text":"Retrieves "},{"kind":"code","text":"`options`"},{"kind":"text","text":" associated with the task, that were passed to the function registering the task\n(eg. "},{"kind":"code","text":"`Location.startLocationUpdatesAsync`"},{"kind":"text","text":")."}],"blockTags":[{"tag":"@returns","content":[{"kind":"text","text":"A promise which fulfills with the "},{"kind":"code","text":"`options`"},{"kind":"text","text":" object that was passed while registering task\nwith given name or "},{"kind":"code","text":"`null`"},{"kind":"text","text":" if task couldn't be found."}]}]},"typeParameter":[{"name":"TaskOptions","kind":131072}],"parameters":[{"name":"taskName","kind":32768,"comment":{"summary":[{"kind":"text","text":"Name of the task."}]},"type":{"type":"intrinsic","name":"string"}}],"type":{"type":"reference","typeArguments":[{"type":"reference","name":"TaskOptions"}],"name":"Promise","qualifiedName":"Promise","package":"typescript"}}]},{"name":"isAvailableAsync","kind":64,"signatures":[{"name":"isAvailableAsync","kind":4096,"comment":{"summary":[{"kind":"text","text":"Determine if the "},{"kind":"code","text":"`TaskManager`"},{"kind":"text","text":" API can be used in this app."}],"blockTags":[{"tag":"@returns","content":[{"kind":"text","text":"A promise fulfills with "},{"kind":"code","text":"`true`"},{"kind":"text","text":" if the API can be used, and "},{"kind":"code","text":"`false`"},{"kind":"text","text":" otherwise.\nOn the web it always returns "},{"kind":"code","text":"`false`"},{"kind":"text","text":"."}]}]},"type":{"type":"reference","typeArguments":[{"type":"intrinsic","name":"boolean"}],"name":"Promise","qualifiedName":"Promise","package":"typescript"}}]},{"name":"isTaskDefined","kind":64,"signatures":[{"name":"isTaskDefined","kind":4096,"comment":{"summary":[{"kind":"text","text":"Checks whether the task is already defined."}]},"parameters":[{"name":"taskName","kind":32768,"comment":{"summary":[{"kind":"text","text":"Name of the task."}]},"type":{"type":"intrinsic","name":"string"}}],"type":{"type":"intrinsic","name":"boolean"}}]},{"name":"isTaskRegisteredAsync","kind":64,"signatures":[{"name":"isTaskRegisteredAsync","kind":4096,"comment":{"summary":[{"kind":"text","text":"Determine whether the task is registered. Registered tasks are stored in a persistent storage and\npreserved between sessions."}],"blockTags":[{"tag":"@returns","content":[{"kind":"text","text":"A promise which fulfills with a "},{"kind":"code","text":"`boolean`"},{"kind":"text","text":" value whether or not the task with given name\nis already registered."}]}]},"parameters":[{"name":"taskName","kind":32768,"comment":{"summary":[{"kind":"text","text":"Name of the task."}]},"type":{"type":"intrinsic","name":"string"}}],"type":{"type":"reference","typeArguments":[{"type":"intrinsic","name":"boolean"}],"name":"Promise","qualifiedName":"Promise","package":"typescript"}}]},{"name":"unregisterAllTasksAsync","kind":64,"signatures":[{"name":"unregisterAllTasksAsync","kind":4096,"comment":{"summary":[{"kind":"text","text":"Unregisters all tasks registered for the running app. You may want to call this when the user is\nsigning out and you no longer need to track his location or run any other background tasks."}],"blockTags":[{"tag":"@returns","content":[{"kind":"text","text":"A promise which fulfills as soon as all tasks are completely unregistered."}]}]},"type":{"type":"reference","typeArguments":[{"type":"intrinsic","name":"void"}],"name":"Promise","qualifiedName":"Promise","package":"typescript"}}]},{"name":"unregisterTaskAsync","kind":64,"signatures":[{"name":"unregisterTaskAsync","kind":4096,"comment":{"summary":[{"kind":"text","text":"Unregisters task from the app, so the app will not be receiving updates for that task anymore.\n_It is recommended to use methods specialized by modules that registered the task, eg.\n["},{"kind":"code","text":"`Location.stopLocationUpdatesAsync`"},{"kind":"text","text":"](./location/#expolocationstoplocationupdatesasynctaskname)._"}],"blockTags":[{"tag":"@returns","content":[{"kind":"text","text":"A promise which fulfills as soon as the task is unregistered."}]}]},"parameters":[{"name":"taskName","kind":32768,"comment":{"summary":[{"kind":"text","text":"Name of the task to unregister."}]},"type":{"type":"intrinsic","name":"string"}}],"type":{"type":"reference","typeArguments":[{"type":"intrinsic","name":"void"}],"name":"Promise","qualifiedName":"Promise","package":"typescript"}}]}]}
\ No newline at end of file
diff --git a/docs/public/static/data/v49.0.0/expo-tracking-transparency.json b/docs/public/static/data/v49.0.0/expo-tracking-transparency.json
new file mode 100644
index 0000000000000..0c35249f4f008
--- /dev/null
+++ b/docs/public/static/data/v49.0.0/expo-tracking-transparency.json
@@ -0,0 +1 @@
+{"name":"expo-tracking-transparency","kind":1,"children":[{"name":"PermissionStatus","kind":8,"children":[{"name":"DENIED","kind":16,"comment":{"summary":[{"kind":"text","text":"User has denied the permission."}]},"type":{"type":"literal","value":"denied"}},{"name":"GRANTED","kind":16,"comment":{"summary":[{"kind":"text","text":"User has granted the permission."}]},"type":{"type":"literal","value":"granted"}},{"name":"UNDETERMINED","kind":16,"comment":{"summary":[{"kind":"text","text":"User hasn't granted or denied the permission yet."}]},"type":{"type":"literal","value":"undetermined"}}]},{"name":"PermissionResponse","kind":256,"comment":{"summary":[{"kind":"text","text":"An object obtained by permissions get and request functions."}]},"children":[{"name":"canAskAgain","kind":1024,"comment":{"summary":[{"kind":"text","text":"Indicates if user can be asked again for specific permission.\nIf not, one should be directed to the Settings app\nin order to enable/disable the permission."}]},"type":{"type":"intrinsic","name":"boolean"}},{"name":"expires","kind":1024,"comment":{"summary":[{"kind":"text","text":"Determines time when the permission expires."}]},"type":{"type":"reference","name":"PermissionExpiration"}},{"name":"granted","kind":1024,"comment":{"summary":[{"kind":"text","text":"A convenience boolean that indicates if the permission is granted."}]},"type":{"type":"intrinsic","name":"boolean"}},{"name":"status","kind":1024,"comment":{"summary":[{"kind":"text","text":"Determines the status of the permission."}]},"type":{"type":"reference","name":"PermissionStatus"}}]},{"name":"PermissionExpiration","kind":4194304,"comment":{"summary":[{"kind":"text","text":"Permission expiration time. Currently, all permissions are granted permanently."}]},"type":{"type":"union","types":[{"type":"literal","value":"never"},{"type":"intrinsic","name":"number"}]}},{"name":"PermissionHookOptions","kind":4194304,"typeParameters":[{"name":"Options","kind":131072,"type":{"type":"intrinsic","name":"object"}}],"type":{"type":"intersection","types":[{"type":"reference","name":"PermissionHookBehavior"},{"type":"reference","name":"Options"}]}},{"name":"getTrackingPermissionsAsync","kind":64,"signatures":[{"name":"getTrackingPermissionsAsync","kind":4096,"comment":{"summary":[{"kind":"text","text":"Checks whether or not the user has authorized the app to access app-related data that can be used\nfor tracking the user or the device. See "},{"kind":"code","text":"`requestTrackingPermissionsAsync`"},{"kind":"text","text":" for more details.\n\nOn Android, web, and iOS 13 and below, this method always returns that the permission was\ngranted."}],"blockTags":[{"tag":"@example","content":[{"kind":"code","text":"```typescript\nconst { granted } = await getTrackingPermissionsAsync();\n\nif (granted) {\n // Your app is authorized to track the user or their device\n}\n```"}]}]},"type":{"type":"reference","typeArguments":[{"type":"reference","name":"PermissionResponse"}],"name":"Promise","qualifiedName":"Promise","package":"typescript"}}]},{"name":"isAvailable","kind":64,"signatures":[{"name":"isAvailable","kind":4096,"comment":{"summary":[{"kind":"text","text":"Returns whether the TrackingTransparency API is available on the current device."}],"blockTags":[{"tag":"@returns","content":[{"kind":"text","text":"Currently this is "},{"kind":"code","text":"`true`"},{"kind":"text","text":" on iOS 14 and above only. On devices where the\nTracking Transparency API is unavailable, the get and request permissions methods will always\nresolve to "},{"kind":"code","text":"`granted`"},{"kind":"text","text":"."}]}]},"type":{"type":"intrinsic","name":"boolean"}}]},{"name":"requestTrackingPermissionsAsync","kind":64,"signatures":[{"name":"requestTrackingPermissionsAsync","kind":4096,"comment":{"summary":[{"kind":"text","text":"Requests the user to authorize or deny access to app-related data that can be used for tracking\nthe user or the device. Examples of data used for tracking include email address, device ID,\nadvertising ID, etc. On iOS 14.5 and above, if the user denies this permission, any attempt to\ncollect the IDFA will return a string of 0s.\n\nThe system remembers the user’s choice and doesn’t prompt again unless a user uninstalls and then\nreinstalls the app on the device.\n\nOn Android, web, and iOS 13 and below, this method always returns that the permission was\ngranted."}],"blockTags":[{"tag":"@example","content":[{"kind":"code","text":"```typescript\nconst { granted } = await requestTrackingPermissionsAsync();\n\nif (granted) {\n // Your app is authorized to track the user or their device\n}\n```"}]}]},"type":{"type":"reference","typeArguments":[{"type":"reference","name":"PermissionResponse"}],"name":"Promise","qualifiedName":"Promise","package":"typescript"}}]},{"name":"useTrackingPermissions","kind":64,"signatures":[{"name":"useTrackingPermissions","kind":4096,"comment":{"summary":[{"kind":"text","text":"Check or request the user to authorize or deny access to app-related data that can be used for tracking\nthe user or the device. Examples of data used for tracking include email address, device ID,\nadvertising ID, etc. On iOS 14.5 and above, if the user denies this permission, any attempt to\ncollect the IDFA will return a string of 0s.\n\nThe system remembers the user’s choice and doesn’t prompt again unless a user uninstalls and then\nreinstalls the app on the device.\n\nOn Android, web, and iOS 13 and below, this method always returns that the permission was\ngranted."}],"blockTags":[{"tag":"@example","content":[{"kind":"code","text":"```ts\nconst [status, requestPermission] = useTrackingPermissions();\n```"}]}]},"parameters":[{"name":"options","kind":32768,"flags":{"isOptional":true},"type":{"type":"reference","typeArguments":[{"type":"intrinsic","name":"object"}],"name":"PermissionHookOptions"}}],"type":{"type":"tuple","elements":[{"type":"union","types":[{"type":"literal","value":null},{"type":"reference","name":"PermissionResponse"}]},{"type":"reference","typeArguments":[{"type":"reference","name":"PermissionResponse"}],"name":"RequestPermissionMethod"},{"type":"reference","typeArguments":[{"type":"reference","name":"PermissionResponse"}],"name":"GetPermissionMethod"}]}}]}]}
\ No newline at end of file
diff --git a/docs/public/static/data/v49.0.0/expo-updates.json b/docs/public/static/data/v49.0.0/expo-updates.json
new file mode 100644
index 0000000000000..2468118693697
--- /dev/null
+++ b/docs/public/static/data/v49.0.0/expo-updates.json
@@ -0,0 +1 @@
+{"name":"expo-updates","kind":1,"children":[{"name":"UpdateEventType","kind":8,"comment":{"summary":[{"kind":"text","text":"The types of update-related events."}]},"children":[{"name":"ERROR","kind":16,"comment":{"summary":[{"kind":"text","text":"An error occurred trying to fetch the latest update."}]},"type":{"type":"literal","value":"error"}},{"name":"NO_UPDATE_AVAILABLE","kind":16,"comment":{"summary":[{"kind":"text","text":"No updates are available, and the most up-to-date update is already running."}]},"type":{"type":"literal","value":"noUpdateAvailable"}},{"name":"UPDATE_AVAILABLE","kind":16,"comment":{"summary":[{"kind":"text","text":"A new update has finished downloading to local storage. If you would like to start using this\nupdate at any point before the user closes and restarts the app on their own, you can call\n["},{"kind":"code","text":"`Updates.reloadAsync()`"},{"kind":"text","text":"](#reloadasync) to launch this new update."}]},"type":{"type":"literal","value":"updateAvailable"}}]},{"name":"UpdatesCheckAutomaticallyValue","kind":8,"comment":{"summary":[{"kind":"text","text":"The possible settings that determine if expo-updates will check for updates on app startup.\nBy default, Expo will check for updates every time the app is loaded. Set this to "},{"kind":"code","text":"`ON_ERROR_RECOVERY`"},{"kind":"text","text":" to disable automatic checking unless recovering from an error. Set this to "},{"kind":"code","text":"`NEVER`"},{"kind":"text","text":" to completely disable automatic checking. Must be one of "},{"kind":"code","text":"`ON_LOAD`"},{"kind":"text","text":" (default value), "},{"kind":"code","text":"`ON_ERROR_RECOVERY`"},{"kind":"text","text":", "},{"kind":"code","text":"`WIFI_ONLY`"},{"kind":"text","text":", or "},{"kind":"code","text":"`NEVER`"}]},"children":[{"name":"NEVER","kind":16,"comment":{"summary":[{"kind":"text","text":"Automatic update checks are off, and update checks must be done through the JS API."}]},"type":{"type":"literal","value":"NEVER"}},{"name":"ON_ERROR_RECOVERY","kind":16,"comment":{"summary":[{"kind":"text","text":"Only checks for updates when the app starts up after an error recovery."}]},"type":{"type":"literal","value":"ON_ERROR_RECOVERY"}},{"name":"ON_LOAD","kind":16,"comment":{"summary":[{"kind":"text","text":"Checks for updates whenever the app is loaded. This is the default setting."}]},"type":{"type":"literal","value":"ON_LOAD"}},{"name":"WIFI_ONLY","kind":16,"comment":{"summary":[{"kind":"text","text":"Only checks for updates when the app starts and has a WiFi connection."}]},"type":{"type":"literal","value":"WIFI_ONLY"}}]},{"name":"UpdatesLogEntryCode","kind":8,"comment":{"summary":[{"kind":"text","text":"The possible code values for expo-updates log entries"}]},"children":[{"name":"ASSETS_FAILED_TO_LOAD","kind":16,"type":{"type":"literal","value":"AssetsFailedToLoad"}},{"name":"JS_RUNTIME_ERROR","kind":16,"type":{"type":"literal","value":"JSRuntimeError"}},{"name":"NONE","kind":16,"type":{"type":"literal","value":"None"}},{"name":"NO_UPDATES_AVAILABLE","kind":16,"type":{"type":"literal","value":"NoUpdatesAvailable"}},{"name":"UNKNOWN","kind":16,"type":{"type":"literal","value":"Unknown"}},{"name":"UPDATE_ASSETS_NOT_AVAILABLE","kind":16,"type":{"type":"literal","value":"UpdateAssetsNotAvailable"}},{"name":"UPDATE_CODE_SIGNING_ERROR","kind":16,"type":{"type":"literal","value":"UpdateCodeSigningError"}},{"name":"UPDATE_FAILED_TO_LOAD","kind":16,"type":{"type":"literal","value":"UpdateFailedToLoad"}},{"name":"UPDATE_HAS_INVALID_SIGNATURE","kind":16,"type":{"type":"literal","value":"UpdateHasInvalidSignature"}},{"name":"UPDATE_SERVER_UNREACHABLE","kind":16,"type":{"type":"literal","value":"UpdateServerUnreachable"}}]},{"name":"UpdatesLogEntryLevel","kind":8,"comment":{"summary":[{"kind":"text","text":"The possible log levels for expo-updates log entries"}]},"children":[{"name":"DEBUG","kind":16,"type":{"type":"literal","value":"debug"}},{"name":"ERROR","kind":16,"type":{"type":"literal","value":"error"}},{"name":"FATAL","kind":16,"type":{"type":"literal","value":"fatal"}},{"name":"INFO","kind":16,"type":{"type":"literal","value":"info"}},{"name":"TRACE","kind":16,"type":{"type":"literal","value":"trace"}},{"name":"WARN","kind":16,"type":{"type":"literal","value":"warn"}}]},{"name":"UpdateCheckResult","kind":4194304,"comment":{"summary":[{"kind":"text","text":"The result of checking for a new update."}]},"type":{"type":"union","types":[{"type":"reference","name":"UpdateCheckResultRollBackToEmbedded"},{"type":"reference","name":"UpdateCheckResultSuccess"},{"type":"reference","name":"UpdateCheckResultFailure"}]}},{"name":"UpdateCheckResultFailure","kind":4194304,"comment":{"summary":[{"kind":"text","text":"The failed result of checking for a new update."}]},"type":{"type":"reflection","declaration":{"name":"__type","kind":65536,"children":[{"name":"isAvailable","kind":1024,"comment":{"summary":[{"kind":"text","text":"Signifies that the app is already running the latest available update."}]},"type":{"type":"literal","value":false}},{"name":"isRollBackToEmbedded","kind":1024,"comment":{"summary":[{"kind":"text","text":"Signifies that no roll back update is available."}]},"type":{"type":"literal","value":false}},{"name":"manifest","kind":1024,"comment":{"summary":[{"kind":"text","text":"No manifest, since the app is already running the latest available version."}]},"type":{"type":"intrinsic","name":"undefined"}}]}}},{"name":"UpdateCheckResultSuccess","kind":4194304,"comment":{"summary":[{"kind":"text","text":"The successful result of checking for a new update."}]},"type":{"type":"reflection","declaration":{"name":"__type","kind":65536,"children":[{"name":"isAvailable","kind":1024,"comment":{"summary":[{"kind":"text","text":"Signifies that an update is available."}]},"type":{"type":"literal","value":true}},{"name":"isRollBackToEmbedded","kind":1024,"comment":{"summary":[{"kind":"text","text":"This property is false for a new update."}]},"type":{"type":"literal","value":false}},{"name":"manifest","kind":1024,"comment":{"summary":[{"kind":"text","text":"The manifest of the available update."}]},"type":{"type":"reference","name":"Manifest"}}]}}},{"name":"UpdateEvent","kind":4194304,"comment":{"summary":[{"kind":"text","text":"An object that is passed into each event listener when an auto-update check occurs."}]},"type":{"type":"reflection","declaration":{"name":"__type","kind":65536,"children":[{"name":"manifest","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"If "},{"kind":"code","text":"`type`"},{"kind":"text","text":" is "},{"kind":"code","text":"`Updates.UpdateEventType.UPDATE_AVAILABLE`"},{"kind":"text","text":", the manifest of the newly downloaded\nupdate, and "},{"kind":"code","text":"`undefined`"},{"kind":"text","text":" otherwise."}]},"type":{"type":"reference","name":"Manifest"}},{"name":"message","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"If "},{"kind":"code","text":"`type`"},{"kind":"text","text":" is "},{"kind":"code","text":"`Updates.UpdateEventType.ERROR`"},{"kind":"text","text":", the error message, and "},{"kind":"code","text":"`undefined`"},{"kind":"text","text":" otherwise."}]},"type":{"type":"intrinsic","name":"string"}},{"name":"type","kind":1024,"comment":{"summary":[{"kind":"text","text":"Type of the event."}]},"type":{"type":"reference","name":"UpdateEventType"}}]}}},{"name":"UpdateFetchResult","kind":4194304,"comment":{"summary":[{"kind":"text","text":"The result of fetching a new update."}]},"type":{"type":"union","types":[{"type":"reference","name":"UpdateFetchResultSuccess"},{"type":"reference","name":"UpdateFetchResultFailure"},{"type":"reference","name":"UpdateFetchResultRollbackToEmbedded"}]}},{"name":"UpdateFetchResultFailure","kind":4194304,"comment":{"summary":[{"kind":"text","text":"The failed result of fetching a new update."}]},"type":{"type":"reflection","declaration":{"name":"__type","kind":65536,"children":[{"name":"isNew","kind":1024,"comment":{"summary":[{"kind":"text","text":"Signifies that the fetched bundle is the same as version which is currently running."}]},"type":{"type":"literal","value":false}},{"name":"manifest","kind":1024,"comment":{"summary":[{"kind":"text","text":"No manifest, since there is no update."}]},"type":{"type":"intrinsic","name":"undefined"}}]}}},{"name":"UpdateFetchResultSuccess","kind":4194304,"comment":{"summary":[{"kind":"text","text":"The successful result of fetching a new update."}]},"type":{"type":"reflection","declaration":{"name":"__type","kind":65536,"children":[{"name":"isNew","kind":1024,"comment":{"summary":[{"kind":"text","text":"Signifies that the fetched bundle is new (that is, a different version than what's currently\nrunning)."}]},"type":{"type":"literal","value":true}},{"name":"manifest","kind":1024,"comment":{"summary":[{"kind":"text","text":"The manifest of the newly downloaded update."}]},"type":{"type":"reference","name":"Manifest"}}]}}},{"name":"UpdatesLogEntry","kind":4194304,"comment":{"summary":[{"kind":"text","text":"An object representing a single log entry from expo-updates logging on the client."}]},"type":{"type":"reflection","declaration":{"name":"__type","kind":65536,"children":[{"name":"assetId","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"If present, the unique ID or hash of an asset associated with this log entry."}]},"type":{"type":"intrinsic","name":"string"}},{"name":"code","kind":1024,"comment":{"summary":[{"kind":"text","text":"One of the defined code values for expo-updates log entries."}]},"type":{"type":"reference","name":"UpdatesLogEntryCode"}},{"name":"level","kind":1024,"comment":{"summary":[{"kind":"text","text":"One of the defined log level or severity values."}]},"type":{"type":"reference","name":"UpdatesLogEntryLevel"}},{"name":"message","kind":1024,"comment":{"summary":[{"kind":"text","text":"The log entry message."}]},"type":{"type":"intrinsic","name":"string"}},{"name":"stacktrace","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"If present, an iOS or Android native stack trace associated with this log entry."}]},"type":{"type":"array","elementType":{"type":"intrinsic","name":"string"}}},{"name":"timestamp","kind":1024,"comment":{"summary":[{"kind":"text","text":"The time the log was written, in milliseconds since Jan 1 1970 UTC."}]},"type":{"type":"intrinsic","name":"number"}},{"name":"updateId","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"If present, the unique ID of an update associated with this log entry."}]},"type":{"type":"intrinsic","name":"string"}}]}}},{"name":"channel","kind":32,"flags":{"isConst":true},"comment":{"summary":[{"kind":"text","text":"The channel name of the current build, if configured for use with EAS Update. Null otherwise."}]},"type":{"type":"union","types":[{"type":"intrinsic","name":"string"},{"type":"literal","value":null}]},"defaultValue":"..."},{"name":"checkAutomatically","kind":32,"flags":{"isConst":true},"comment":{"summary":[{"kind":"text","text":"Determines if and when expo-updates checks for and downloads updates automatically on startup."}]},"type":{"type":"union","types":[{"type":"reference","name":"UpdatesCheckAutomaticallyValue"},{"type":"literal","value":null}]},"defaultValue":"..."},{"name":"createdAt","kind":32,"flags":{"isConst":true},"comment":{"summary":[{"kind":"text","text":"If "},{"kind":"code","text":"`expo-updates`"},{"kind":"text","text":" is enabled, this is a "},{"kind":"code","text":"`Date`"},{"kind":"text","text":" object representing the creation time of the update that's currently running (whether it was embedded or downloaded at runtime).\n\nIn development mode, or any other environment in which "},{"kind":"code","text":"`expo-updates`"},{"kind":"text","text":" is disabled, this value is\nnull."}]},"type":{"type":"union","types":[{"type":"reference","name":"Date","qualifiedName":"Date","package":"typescript"},{"type":"literal","value":null}]},"defaultValue":"..."},{"name":"isEmbeddedLaunch","kind":32,"flags":{"isConst":true},"comment":{"summary":[{"kind":"text","text":"This will be true if the currently running update is the one embedded in the build,\nand not one downloaded from the updates server."}]},"type":{"type":"intrinsic","name":"boolean"},"defaultValue":"..."},{"name":"isEmergencyLaunch","kind":32,"flags":{"isConst":true},"comment":{"summary":[{"kind":"code","text":"`expo-updates`"},{"kind":"text","text":" does its very best to always launch monotonically newer versions of your app so\nyou don't need to worry about backwards compatibility when you put out an update. In very rare\ncases, it's possible that "},{"kind":"code","text":"`expo-updates`"},{"kind":"text","text":" may need to fall back to the update that's embedded in\nthe app binary, even after newer updates have been downloaded and run (an \"emergency launch\").\nThis boolean will be "},{"kind":"code","text":"`true`"},{"kind":"text","text":" if the app is launching under this fallback mechanism and "},{"kind":"code","text":"`false`"},{"kind":"text","text":"\notherwise. If you are concerned about backwards compatibility of future updates to your app, you\ncan use this constant to provide special behavior for this rare case."}]},"type":{"type":"intrinsic","name":"boolean"},"defaultValue":"..."},{"name":"manifest","kind":32,"flags":{"isConst":true},"comment":{"summary":[{"kind":"text","text":"If "},{"kind":"code","text":"`expo-updates`"},{"kind":"text","text":" is enabled, this is the\n[manifest](/versions/latest/sdk/constants/#manifest) (or\n[classic manifest](/versions/latest/sdk/constants/#appmanifest))\nobject for the update that's currently running.\n\nIn development mode, or any other environment in which "},{"kind":"code","text":"`expo-updates`"},{"kind":"text","text":" is disabled, this object is\nempty."}]},"type":{"type":"reference","typeArguments":[{"type":"reference","name":"Manifest"}],"name":"Partial","qualifiedName":"Partial","package":"typescript"},"defaultValue":"..."},{"name":"releaseChannel","kind":32,"flags":{"isConst":true},"comment":{"summary":[{"kind":"text","text":"The name of the release channel currently configured in this standalone or bare app when using\nclassic updates. When using Expo Updates, the value of this field is always "},{"kind":"code","text":"`\"default\"`"},{"kind":"text","text":"."}]},"type":{"type":"intrinsic","name":"string"},"defaultValue":"..."},{"name":"runtimeVersion","kind":32,"flags":{"isConst":true},"comment":{"summary":[{"kind":"text","text":"The runtime version of the current build."}]},"type":{"type":"union","types":[{"type":"intrinsic","name":"string"},{"type":"literal","value":null}]},"defaultValue":"..."},{"name":"updateId","kind":32,"flags":{"isConst":true},"comment":{"summary":[{"kind":"text","text":"The UUID that uniquely identifies the currently running update if "},{"kind":"code","text":"`expo-updates`"},{"kind":"text","text":" is enabled. The\nUUID is represented in its canonical string form ("},{"kind":"code","text":"`xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx`"},{"kind":"text","text":") and\nwill always use lowercase letters. In development mode, or any other environment in which\n"},{"kind":"code","text":"`expo-updates`"},{"kind":"text","text":" is disabled, this value is "},{"kind":"code","text":"`null`"},{"kind":"text","text":"."}]},"type":{"type":"union","types":[{"type":"intrinsic","name":"string"},{"type":"literal","value":null}]},"defaultValue":"..."},{"name":"addListener","kind":64,"signatures":[{"name":"addListener","kind":4096,"comment":{"summary":[{"kind":"text","text":"Adds a callback to be invoked when updates-related events occur (such as upon the initial app\nload) due to auto-update settings chosen at build-time. See also the\n["},{"kind":"code","text":"`useUpdateEvents`"},{"kind":"text","text":"](#useupdateeventslistener) React hook."}],"blockTags":[{"tag":"@returns","content":[{"kind":"text","text":"An "},{"kind":"code","text":"`EventSubscription`"},{"kind":"text","text":" object on which you can call "},{"kind":"code","text":"`remove()`"},{"kind":"text","text":" to unsubscribe the\nlistener."}]}]},"parameters":[{"name":"listener","kind":32768,"comment":{"summary":[{"kind":"text","text":"A function that will be invoked with an ["},{"kind":"code","text":"`UpdateEvent`"},{"kind":"text","text":"](#updateevent) instance\nand should not return any value."}]},"type":{"type":"reflection","declaration":{"name":"__type","kind":65536,"signatures":[{"name":"__type","kind":4096,"parameters":[{"name":"event","kind":32768,"type":{"type":"reference","name":"UpdateEvent"}}],"type":{"type":"intrinsic","name":"void"}}]}}}],"type":{"type":"reference","name":"EventSubscription","qualifiedName":"EventSubscription","package":"@types/fbemitter"}}]},{"name":"checkForUpdateAsync","kind":64,"signatures":[{"name":"checkForUpdateAsync","kind":4096,"comment":{"summary":[{"kind":"text","text":"Checks the server to see if a newly deployed update to your project is available. Does not\nactually download the update. This method cannot be used in development mode, and the returned\npromise will be rejected if you try to do so.\n\nChecking for an update uses a device's bandwidth and battery life like any network call.\nAdditionally, updates served by Expo may be rate limited. A good rule of thumb to check for\nupdates judiciously is to check when the user launches or foregrounds the app. Avoid polling for\nupdates in a frequent loop."}],"blockTags":[{"tag":"@returns","content":[{"kind":"text","text":"A promise that fulfills with an ["},{"kind":"code","text":"`UpdateCheckResult`"},{"kind":"text","text":"](#updatecheckresult) object.\n\nThe promise rejects if the app is in development mode, or if there is an unexpected error or\ntimeout communicating with the server."}]}]},"type":{"type":"reference","typeArguments":[{"type":"reference","name":"UpdateCheckResult"}],"name":"Promise","qualifiedName":"Promise","package":"typescript"}}]},{"name":"clearLogEntriesAsync","kind":64,"signatures":[{"name":"clearLogEntriesAsync","kind":4096,"comment":{"summary":[{"kind":"text","text":"Clears existing expo-updates log entries.\n\n> For now, this operation does nothing on the client. Once log persistence has been\n> implemented, this operation will actually remove existing logs."}],"blockTags":[{"tag":"@returns","content":[{"kind":"text","text":"A promise that fulfills if the clear operation was successful.\n\nThe promise rejects if there is an unexpected error in clearing the logs."}]}]},"type":{"type":"reference","typeArguments":[{"type":"intrinsic","name":"void"}],"name":"Promise","qualifiedName":"Promise","package":"typescript"}}]},{"name":"fetchUpdateAsync","kind":64,"signatures":[{"name":"fetchUpdateAsync","kind":4096,"comment":{"summary":[{"kind":"text","text":"Downloads the most recently deployed update to your project from server to the device's local\nstorage. This method cannot be used in development mode, and the returned promise will be\nrejected if you try to do so."}],"blockTags":[{"tag":"@returns","content":[{"kind":"text","text":"A promise that fulfills with an ["},{"kind":"code","text":"`UpdateFetchResult`"},{"kind":"text","text":"](#updatefetchresult) object.\n\nThe promise rejects if the app is in development mode, or if there is an unexpected error or\ntimeout communicating with the server."}]}]},"type":{"type":"reference","typeArguments":[{"type":"reference","name":"UpdateFetchResult"}],"name":"Promise","qualifiedName":"Promise","package":"typescript"}}]},{"name":"getExtraParamsAsync","kind":64,"signatures":[{"name":"getExtraParamsAsync","kind":4096,"comment":{"summary":[{"kind":"text","text":"Retrieves the current extra params."}]},"type":{"type":"reference","typeArguments":[{"type":"reflection","declaration":{"name":"__type","kind":65536,"indexSignature":{"name":"__index","kind":8192,"parameters":[{"name":"key","kind":32768,"type":{"type":"intrinsic","name":"string"}}],"type":{"type":"intrinsic","name":"string"}}}}],"name":"Promise","qualifiedName":"Promise","package":"typescript"}}]},{"name":"readLogEntriesAsync","kind":64,"signatures":[{"name":"readLogEntriesAsync","kind":4096,"comment":{"summary":[{"kind":"text","text":"Retrieves the most recent expo-updates log entries."}],"blockTags":[{"tag":"@returns","content":[{"kind":"text","text":"A promise that fulfills with an array of ["},{"kind":"code","text":"`UpdatesLogEntry`"},{"kind":"text","text":"](#updateslogentry) objects;\n\nThe promise rejects if there is an unexpected error in retrieving the logs."}]}]},"parameters":[{"name":"maxAge","kind":32768,"comment":{"summary":[{"kind":"text","text":"Sets the max age of retrieved log entries in milliseconds. Default to 3600000 ms (1 hour)."}]},"type":{"type":"intrinsic","name":"number"},"defaultValue":"3600000"}],"type":{"type":"reference","typeArguments":[{"type":"array","elementType":{"type":"reference","name":"UpdatesLogEntry"}}],"name":"Promise","qualifiedName":"Promise","package":"typescript"}}]},{"name":"reloadAsync","kind":64,"signatures":[{"name":"reloadAsync","kind":4096,"comment":{"summary":[{"kind":"text","text":"Instructs the app to reload using the most recently downloaded version. This is useful for\ntriggering a newly downloaded update to launch without the user needing to manually restart the\napp.\n\nIt is not recommended to place any meaningful logic after a call to "},{"kind":"code","text":"`await\nUpdates.reloadAsync()`"},{"kind":"text","text":". This is because the promise is resolved after verifying that the app can\nbe reloaded, and immediately before posting an asynchronous task to the main thread to actually\nreload the app. It is unsafe to make any assumptions about whether any more JS code will be\nexecuted after the "},{"kind":"code","text":"`Updates.reloadAsync`"},{"kind":"text","text":" method call resolves, since that depends on the OS and\nthe state of the native module and main threads.\n\nThis method cannot be used in development mode, and the returned promise will be rejected if you\ntry to do so."}],"blockTags":[{"tag":"@returns","content":[{"kind":"text","text":"A promise that fulfills right before the reload instruction is sent to the JS runtime, or\nrejects if it cannot find a reference to the JS runtime. If the promise is rejected in production\nmode, it most likely means you have installed the module incorrectly. Double check you've\nfollowed the installation instructions. In particular, on iOS ensure that you set the "},{"kind":"code","text":"`bridge`"},{"kind":"text","text":"\nproperty on "},{"kind":"code","text":"`EXUpdatesAppController`"},{"kind":"text","text":" with a pointer to the "},{"kind":"code","text":"`RCTBridge`"},{"kind":"text","text":" you want to reload, and on\nAndroid ensure you either call "},{"kind":"code","text":"`UpdatesController.initialize`"},{"kind":"text","text":" with the instance of\n"},{"kind":"code","text":"`ReactApplication`"},{"kind":"text","text":" you want to reload, or call "},{"kind":"code","text":"`UpdatesController.setReactNativeHost`"},{"kind":"text","text":" with the\nproper instance of "},{"kind":"code","text":"`ReactNativeHost`"},{"kind":"text","text":"."}]}]},"type":{"type":"reference","typeArguments":[{"type":"intrinsic","name":"void"}],"name":"Promise","qualifiedName":"Promise","package":"typescript"}}]},{"name":"setExtraParamAsync","kind":64,"signatures":[{"name":"setExtraParamAsync","kind":4096,"comment":{"summary":[{"kind":"text","text":"Sets an extra param if value is non-null, otherwise unsets the param.\nExtra params are sent in a header of update requests.\nThe update server may use these params when evaluating logic to determine which update to serve.\nEAS Update merges these params into the fields used to evaluate channel–branch mapping logic."}],"blockTags":[{"tag":"@example","content":[{"kind":"text","text":"An app may want to add a feature where users can opt-in to beta updates. In this instance,\nextra params could be set to "},{"kind":"code","text":"`{userType: 'beta'}`"},{"kind":"text","text":", and then the server can use this information\nwhen deciding which update to serve. If using EAS Update, the channel-branch mapping can be set to\ndiscriminate branches based on the "},{"kind":"code","text":"`userType`"},{"kind":"text","text":"."}]}]},"parameters":[{"name":"key","kind":32768,"type":{"type":"intrinsic","name":"string"}},{"name":"value","kind":32768,"type":{"type":"union","types":[{"type":"intrinsic","name":"undefined"},{"type":"literal","value":null},{"type":"intrinsic","name":"string"}]}}],"type":{"type":"reference","typeArguments":[{"type":"intrinsic","name":"void"}],"name":"Promise","qualifiedName":"Promise","package":"typescript"}}]},{"name":"useUpdateEvents","kind":64,"signatures":[{"name":"useUpdateEvents","kind":4096,"comment":{"summary":[{"kind":"text","text":"React hook to create an ["},{"kind":"code","text":"`UpdateEvent`"},{"kind":"text","text":"](#updateevent) listener subscription on mount, using\n["},{"kind":"code","text":"`addListener`"},{"kind":"text","text":"](#updatesaddlistenerlistener). It calls "},{"kind":"code","text":"`remove()`"},{"kind":"text","text":" on the subscription during unmount."}],"blockTags":[{"tag":"@example","content":[{"kind":"code","text":"```ts\nfunction App() {\n const eventListener = (event) => {\n if (event.type === Updates.UpdateEventType.ERROR) {\n // Handle error\n } else if (event.type === Updates.UpdateEventType.NO_UPDATE_AVAILABLE) {\n // Handle no update available\n } else if (event.type === Updates.UpdateEventType.UPDATE_AVAILABLE) {\n // Handle update available\n }\n };\n Updates.useUpdateEvents(eventListener);\n // React Component...\n}\n```"}]}]},"parameters":[{"name":"listener","kind":32768,"comment":{"summary":[{"kind":"text","text":"A function that will be invoked with an ["},{"kind":"code","text":"`UpdateEvent`"},{"kind":"text","text":"](#updateevent) instance\nand should not return any value."}]},"type":{"type":"reflection","declaration":{"name":"__type","kind":65536,"signatures":[{"name":"__type","kind":4096,"parameters":[{"name":"event","kind":32768,"type":{"type":"reference","name":"UpdateEvent"}}],"type":{"type":"intrinsic","name":"void"}}]}}}],"type":{"type":"intrinsic","name":"void"}}]}]}
\ No newline at end of file
diff --git a/docs/public/static/data/v49.0.0/expo-video-thumbnails.json b/docs/public/static/data/v49.0.0/expo-video-thumbnails.json
new file mode 100644
index 0000000000000..609ff04eb2b34
--- /dev/null
+++ b/docs/public/static/data/v49.0.0/expo-video-thumbnails.json
@@ -0,0 +1 @@
+{"name":"expo-video-thumbnails","kind":1,"children":[{"name":"VideoThumbnailsOptions","kind":4194304,"type":{"type":"reflection","declaration":{"name":"__type","kind":65536,"children":[{"name":"headers","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"In case "},{"kind":"code","text":"`sourceFilename`"},{"kind":"text","text":" is a remote URI, "},{"kind":"code","text":"`headers`"},{"kind":"text","text":" object is passed in a network request."}]},"type":{"type":"reference","typeArguments":[{"type":"intrinsic","name":"string"},{"type":"intrinsic","name":"string"}],"name":"Record","qualifiedName":"Record","package":"typescript"}},{"name":"quality","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"A value in range "},{"kind":"code","text":"`0.0`"},{"kind":"text","text":" - "},{"kind":"code","text":"`1.0`"},{"kind":"text","text":" specifying quality level of the result image. "},{"kind":"code","text":"`1`"},{"kind":"text","text":" means no\ncompression (highest quality) and "},{"kind":"code","text":"`0`"},{"kind":"text","text":" the highest compression (lowest quality)."}]},"type":{"type":"intrinsic","name":"number"}},{"name":"time","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"The time position where the image will be retrieved in ms."}]},"type":{"type":"intrinsic","name":"number"}}]}}},{"name":"VideoThumbnailsResult","kind":4194304,"type":{"type":"reflection","declaration":{"name":"__type","kind":65536,"children":[{"name":"height","kind":1024,"comment":{"summary":[{"kind":"text","text":"Height of the created image."}]},"type":{"type":"intrinsic","name":"number"}},{"name":"uri","kind":1024,"comment":{"summary":[{"kind":"text","text":"URI to the created image (usable as the source for an Image/Video element)."}]},"type":{"type":"intrinsic","name":"string"}},{"name":"width","kind":1024,"comment":{"summary":[{"kind":"text","text":"Width of the created image."}]},"type":{"type":"intrinsic","name":"number"}}]}}},{"name":"getThumbnailAsync","kind":64,"signatures":[{"name":"getThumbnailAsync","kind":4096,"comment":{"summary":[{"kind":"text","text":"Create an image thumbnail from video provided via "},{"kind":"code","text":"`sourceFilename`"},{"kind":"text","text":"."}],"blockTags":[{"tag":"@returns","content":[{"kind":"text","text":"Returns a promise which fulfils with ["},{"kind":"code","text":"`VideoThumbnailsResult`"},{"kind":"text","text":"](#videothumbnailsresult)."}]}]},"parameters":[{"name":"sourceFilename","kind":32768,"comment":{"summary":[{"kind":"text","text":"An URI of the video, local or remote."}]},"type":{"type":"intrinsic","name":"string"}},{"name":"options","kind":32768,"comment":{"summary":[{"kind":"text","text":"A map defining how modified thumbnail should be created."}]},"type":{"type":"reference","name":"VideoThumbnailsOptions"},"defaultValue":"{}"}],"type":{"type":"reference","typeArguments":[{"type":"reference","name":"VideoThumbnailsResult"}],"name":"Promise","qualifiedName":"Promise","package":"typescript"}}]}]}
\ No newline at end of file
diff --git a/docs/public/static/data/v49.0.0/expo-video.json b/docs/public/static/data/v49.0.0/expo-video.json
new file mode 100644
index 0000000000000..5044b6a0e0e78
--- /dev/null
+++ b/docs/public/static/data/v49.0.0/expo-video.json
@@ -0,0 +1 @@
+{"name":"expo-video","kind":1,"children":[{"name":"default","kind":128,"children":[{"name":"constructor","kind":512,"signatures":[{"name":"new default","kind":16384,"parameters":[{"name":"props","kind":32768,"type":{"type":"reference","name":"VideoProps"}}],"type":{"type":"reference","name":"Video"},"overwrites":{"type":"reference","name":"React.Component.constructor"}}],"overwrites":{"type":"reference","name":"React.Component.constructor"}},{"name":"_nativeRef","kind":1024,"type":{"type":"reference","typeArguments":[{"type":"intersection","types":[{"type":"reference","typeArguments":[{"type":"reference","name":"VideoNativeProps"},{"type":"intrinsic","name":"any"},{"type":"intrinsic","name":"any"}],"name":"Component","qualifiedName":"React.Component","package":"@types/react"},{"type":"reference","name":"NativeMethods","qualifiedName":"NativeMethods","package":"react-native"}]}],"name":"RefObject","qualifiedName":"React.RefObject","package":"@types/react"},"defaultValue":"..."},{"name":"_onPlaybackStatusUpdate","kind":1024,"type":{"type":"union","types":[{"type":"literal","value":null},{"type":"reflection","declaration":{"name":"__type","kind":65536,"signatures":[{"name":"__type","kind":4096,"parameters":[{"name":"status","kind":32768,"type":{"type":"reference","name":"AVPlaybackStatus"}}],"type":{"type":"intrinsic","name":"void"}}]}}]},"defaultValue":"null"},{"name":"pauseAsync","kind":1024,"type":{"type":"reflection","declaration":{"name":"__type","kind":65536,"signatures":[{"name":"__type","kind":4096,"type":{"type":"reference","typeArguments":[{"type":"reference","name":"AVPlaybackStatus"}],"name":"Promise","qualifiedName":"Promise","package":"typescript"}}]}},"implementationOf":{"type":"reference","name":"Playback.pauseAsync"}},{"name":"playAsync","kind":1024,"type":{"type":"reflection","declaration":{"name":"__type","kind":65536,"signatures":[{"name":"__type","kind":4096,"type":{"type":"reference","typeArguments":[{"type":"reference","name":"AVPlaybackStatus"}],"name":"Promise","qualifiedName":"Promise","package":"typescript"}}]}},"implementationOf":{"type":"reference","name":"Playback.playAsync"}},{"name":"playFromPositionAsync","kind":1024,"type":{"type":"reflection","declaration":{"name":"__type","kind":65536,"signatures":[{"name":"__type","kind":4096,"parameters":[{"name":"positionMillis","kind":32768,"type":{"type":"intrinsic","name":"number"}},{"name":"tolerances","kind":32768,"flags":{"isOptional":true},"type":{"type":"reference","name":"AVPlaybackTolerance"}}],"type":{"type":"reference","typeArguments":[{"type":"reference","name":"AVPlaybackStatus"}],"name":"Promise","qualifiedName":"Promise","package":"typescript"}}]}},"implementationOf":{"type":"reference","name":"Playback.playFromPositionAsync"}},{"name":"setIsLoopingAsync","kind":1024,"type":{"type":"reflection","declaration":{"name":"__type","kind":65536,"signatures":[{"name":"__type","kind":4096,"parameters":[{"name":"isLooping","kind":32768,"type":{"type":"intrinsic","name":"boolean"}}],"type":{"type":"reference","typeArguments":[{"type":"reference","name":"AVPlaybackStatus"}],"name":"Promise","qualifiedName":"Promise","package":"typescript"}}]}},"implementationOf":{"type":"reference","name":"Playback.setIsLoopingAsync"}},{"name":"setIsMutedAsync","kind":1024,"type":{"type":"reflection","declaration":{"name":"__type","kind":65536,"signatures":[{"name":"__type","kind":4096,"parameters":[{"name":"isMuted","kind":32768,"type":{"type":"intrinsic","name":"boolean"}}],"type":{"type":"reference","typeArguments":[{"type":"reference","name":"AVPlaybackStatus"}],"name":"Promise","qualifiedName":"Promise","package":"typescript"}}]}},"implementationOf":{"type":"reference","name":"Playback.setIsMutedAsync"}},{"name":"setPositionAsync","kind":1024,"type":{"type":"reflection","declaration":{"name":"__type","kind":65536,"signatures":[{"name":"__type","kind":4096,"parameters":[{"name":"positionMillis","kind":32768,"type":{"type":"intrinsic","name":"number"}},{"name":"tolerances","kind":32768,"flags":{"isOptional":true},"type":{"type":"reference","name":"AVPlaybackTolerance"}}],"type":{"type":"reference","typeArguments":[{"type":"reference","name":"AVPlaybackStatus"}],"name":"Promise","qualifiedName":"Promise","package":"typescript"}}]}},"implementationOf":{"type":"reference","name":"Playback.setPositionAsync"}},{"name":"setProgressUpdateIntervalAsync","kind":1024,"type":{"type":"reflection","declaration":{"name":"__type","kind":65536,"signatures":[{"name":"__type","kind":4096,"parameters":[{"name":"progressUpdateIntervalMillis","kind":32768,"type":{"type":"intrinsic","name":"number"}}],"type":{"type":"reference","typeArguments":[{"type":"reference","name":"AVPlaybackStatus"}],"name":"Promise","qualifiedName":"Promise","package":"typescript"}}]}},"implementationOf":{"type":"reference","name":"Playback.setProgressUpdateIntervalAsync"}},{"name":"setRateAsync","kind":1024,"type":{"type":"reflection","declaration":{"name":"__type","kind":65536,"signatures":[{"name":"__type","kind":4096,"parameters":[{"name":"rate","kind":32768,"type":{"type":"intrinsic","name":"number"}},{"name":"shouldCorrectPitch","kind":32768,"type":{"type":"intrinsic","name":"boolean"}}],"type":{"type":"reference","typeArguments":[{"type":"reference","name":"AVPlaybackStatus"}],"name":"Promise","qualifiedName":"Promise","package":"typescript"}}]}},"implementationOf":{"type":"reference","name":"Playback.setRateAsync"}},{"name":"setVolumeAsync","kind":1024,"type":{"type":"reflection","declaration":{"name":"__type","kind":65536,"signatures":[{"name":"__type","kind":4096,"parameters":[{"name":"volume","kind":32768,"type":{"type":"intrinsic","name":"number"}},{"name":"audioPan","kind":32768,"flags":{"isOptional":true},"type":{"type":"intrinsic","name":"number"}}],"type":{"type":"reference","typeArguments":[{"type":"reference","name":"AVPlaybackStatus"}],"name":"Promise","qualifiedName":"Promise","package":"typescript"}}]}},"implementationOf":{"type":"reference","name":"Playback.setVolumeAsync"}},{"name":"stopAsync","kind":1024,"type":{"type":"reflection","declaration":{"name":"__type","kind":65536,"signatures":[{"name":"__type","kind":4096,"type":{"type":"reference","typeArguments":[{"type":"reference","name":"AVPlaybackStatus"}],"name":"Promise","qualifiedName":"Promise","package":"typescript"}}]}},"implementationOf":{"type":"reference","name":"Playback.stopAsync"}},{"name":"_handleNewStatus","kind":2048,"signatures":[{"name":"_handleNewStatus","kind":4096,"parameters":[{"name":"status","kind":32768,"type":{"type":"reference","name":"AVPlaybackStatus"}}],"type":{"type":"intrinsic","name":"void"}}]},{"name":"_nativeOnError","kind":2048,"signatures":[{"name":"_nativeOnError","kind":4096,"parameters":[{"name":"event","kind":32768,"type":{"type":"reflection","declaration":{"name":"__type","kind":65536,"children":[{"name":"nativeEvent","kind":1024,"type":{"type":"reflection","declaration":{"name":"__type","kind":65536,"children":[{"name":"error","kind":1024,"type":{"type":"intrinsic","name":"string"}}]}}}]}}}],"type":{"type":"intrinsic","name":"void"}}]},{"name":"_nativeOnFullscreenUpdate","kind":2048,"signatures":[{"name":"_nativeOnFullscreenUpdate","kind":4096,"parameters":[{"name":"event","kind":32768,"type":{"type":"reflection","declaration":{"name":"__type","kind":65536,"children":[{"name":"nativeEvent","kind":1024,"type":{"type":"reference","name":"VideoFullscreenUpdateEvent"}}]}}}],"type":{"type":"intrinsic","name":"void"}}]},{"name":"_nativeOnLoad","kind":2048,"signatures":[{"name":"_nativeOnLoad","kind":4096,"parameters":[{"name":"event","kind":32768,"type":{"type":"reflection","declaration":{"name":"__type","kind":65536,"children":[{"name":"nativeEvent","kind":1024,"type":{"type":"reference","name":"AVPlaybackStatus"}}]}}}],"type":{"type":"intrinsic","name":"void"}}]},{"name":"_nativeOnLoadStart","kind":2048,"signatures":[{"name":"_nativeOnLoadStart","kind":4096,"type":{"type":"intrinsic","name":"void"}}]},{"name":"_nativeOnPlaybackStatusUpdate","kind":2048,"signatures":[{"name":"_nativeOnPlaybackStatusUpdate","kind":4096,"parameters":[{"name":"event","kind":32768,"type":{"type":"reflection","declaration":{"name":"__type","kind":65536,"children":[{"name":"nativeEvent","kind":1024,"type":{"type":"reference","name":"AVPlaybackStatus"}}]}}}],"type":{"type":"intrinsic","name":"void"}}]},{"name":"_nativeOnReadyForDisplay","kind":2048,"signatures":[{"name":"_nativeOnReadyForDisplay","kind":4096,"parameters":[{"name":"event","kind":32768,"type":{"type":"reflection","declaration":{"name":"__type","kind":65536,"children":[{"name":"nativeEvent","kind":1024,"type":{"type":"reference","name":"VideoReadyForDisplayEvent"}}]}}}],"type":{"type":"intrinsic","name":"void"}}]},{"name":"_performOperationAndHandleStatusAsync","kind":2048,"signatures":[{"name":"_performOperationAndHandleStatusAsync","kind":4096,"parameters":[{"name":"operation","kind":32768,"type":{"type":"reflection","declaration":{"name":"__type","kind":65536,"signatures":[{"name":"__type","kind":4096,"parameters":[{"name":"tag","kind":32768,"type":{"type":"intrinsic","name":"number"}}],"type":{"type":"reference","typeArguments":[{"type":"reference","name":"AVPlaybackStatus"}],"name":"Promise","qualifiedName":"Promise","package":"typescript"}}]}}}],"type":{"type":"reference","typeArguments":[{"type":"reference","name":"AVPlaybackStatus"}],"name":"Promise","qualifiedName":"Promise","package":"typescript"}}]},{"name":"_renderPoster","kind":2048,"signatures":[{"name":"_renderPoster","kind":4096,"type":{"type":"union","types":[{"type":"literal","value":null},{"type":"reference","name":"Element","qualifiedName":"global.JSX.Element","package":"@types/react"}]}}]},{"name":"_setFullscreen","kind":2048,"signatures":[{"name":"_setFullscreen","kind":4096,"parameters":[{"name":"value","kind":32768,"type":{"type":"intrinsic","name":"boolean"}}],"type":{"type":"reference","typeArguments":[{"type":"reference","name":"AVPlaybackStatus"}],"name":"Promise","qualifiedName":"Promise","package":"typescript"}}]},{"name":"componentWillUnmount","kind":2048,"signatures":[{"name":"componentWillUnmount","kind":4096,"type":{"type":"intrinsic","name":"void"},"overwrites":{"type":"reference","name":"React.Component.componentWillUnmount"}}],"overwrites":{"type":"reference","name":"React.Component.componentWillUnmount"}},{"name":"dismissFullscreenPlayer","kind":2048,"signatures":[{"name":"dismissFullscreenPlayer","kind":4096,"comment":{"summary":[{"kind":"text","text":"This dismisses the fullscreen video view."}],"blockTags":[{"tag":"@returns","content":[{"kind":"text","text":"A "},{"kind":"code","text":"`Promise`"},{"kind":"text","text":" that is fulfilled with the "},{"kind":"code","text":"`AVPlaybackStatus`"},{"kind":"text","text":" of the video once the fullscreen player has finished dismissing,\nor rejects if there was an error, or if this was called on an Android device."}]}]},"type":{"type":"reference","typeArguments":[{"type":"reference","name":"AVPlaybackStatus"}],"name":"Promise","qualifiedName":"Promise","package":"typescript"}}]},{"name":"presentFullscreenPlayer","kind":2048,"signatures":[{"name":"presentFullscreenPlayer","kind":4096,"comment":{"summary":[{"kind":"text","text":"This presents a fullscreen view of your video component on top of your app's UI. Note that even if "},{"kind":"code","text":"`useNativeControls`"},{"kind":"text","text":" is set to "},{"kind":"code","text":"`false`"},{"kind":"text","text":",\nnative controls will be visible in fullscreen mode."}],"blockTags":[{"tag":"@returns","content":[{"kind":"text","text":"A "},{"kind":"code","text":"`Promise`"},{"kind":"text","text":" that is fulfilled with the "},{"kind":"code","text":"`AVPlaybackStatus`"},{"kind":"text","text":" of the video once the fullscreen player has finished presenting,\nor rejects if there was an error, or if this was called on an Android device."}]}]},"type":{"type":"reference","typeArguments":[{"type":"reference","name":"AVPlaybackStatus"}],"name":"Promise","qualifiedName":"Promise","package":"typescript"}}]},{"name":"render","kind":2048,"signatures":[{"name":"render","kind":4096,"type":{"type":"reference","name":"Element","qualifiedName":"global.JSX.Element","package":"@types/react"},"overwrites":{"type":"reference","name":"React.Component.render"}}],"overwrites":{"type":"reference","name":"React.Component.render"}},{"name":"setOnPlaybackStatusUpdate","kind":2048,"signatures":[{"name":"setOnPlaybackStatusUpdate","kind":4096,"comment":{"summary":[{"kind":"text","text":"Sets a function to be called regularly with the "},{"kind":"code","text":"`AVPlaybackStatus`"},{"kind":"text","text":" of the playback object.\n\n"},{"kind":"code","text":"`onPlaybackStatusUpdate`"},{"kind":"text","text":" will be called whenever a call to the API for this playback object completes\n(such as "},{"kind":"code","text":"`setStatusAsync()`"},{"kind":"text","text":", "},{"kind":"code","text":"`getStatusAsync()`"},{"kind":"text","text":", or "},{"kind":"code","text":"`unloadAsync()`"},{"kind":"text","text":"), nd will also be called at regular intervals\nwhile the media is in the loaded state.\n\nSet "},{"kind":"code","text":"`progressUpdateIntervalMillis`"},{"kind":"text","text":" via "},{"kind":"code","text":"`setStatusAsync()`"},{"kind":"text","text":" or "},{"kind":"code","text":"`setProgressUpdateIntervalAsync()`"},{"kind":"text","text":" to modify\nthe interval with which "},{"kind":"code","text":"`onPlaybackStatusUpdate`"},{"kind":"text","text":" is called while loaded."}]},"parameters":[{"name":"onPlaybackStatusUpdate","kind":32768,"comment":{"summary":[{"kind":"text","text":"A function taking a single parameter "},{"kind":"code","text":"`AVPlaybackStatus`"},{"kind":"text","text":"."}]},"type":{"type":"union","types":[{"type":"literal","value":null},{"type":"reflection","declaration":{"name":"__type","kind":65536,"signatures":[{"name":"__type","kind":4096,"parameters":[{"name":"status","kind":32768,"type":{"type":"reference","name":"AVPlaybackStatus"}}],"type":{"type":"intrinsic","name":"void"}}]}}]}}],"type":{"type":"intrinsic","name":"void"}}]}],"extendedTypes":[{"type":"reference","typeArguments":[{"type":"reference","name":"VideoProps"},{"type":"reference","name":"VideoState"}],"name":"Component","qualifiedName":"React.Component","package":"@types/react"}],"implementedTypes":[{"type":"reference","name":"Playback"}]},{"name":"ResizeMode","kind":8,"children":[{"name":"CONTAIN","kind":16,"comment":{"summary":[{"kind":"text","text":"Fit within component bounds while preserving aspect ratio."}]},"type":{"type":"literal","value":"contain"}},{"name":"COVER","kind":16,"comment":{"summary":[{"kind":"text","text":"Fill component bounds while preserving aspect ratio."}]},"type":{"type":"literal","value":"cover"}},{"name":"STRETCH","kind":16,"comment":{"summary":[{"kind":"text","text":"Stretch to fill component bounds."}]},"type":{"type":"literal","value":"stretch"}}]},{"name":"VideoFullscreenUpdate","kind":8,"children":[{"name":"PLAYER_DID_DISMISS","kind":16,"comment":{"summary":[{"kind":"text","text":"Describing that the fullscreen player just finished dismissing."}]},"type":{"type":"literal","value":3}},{"name":"PLAYER_DID_PRESENT","kind":16,"comment":{"summary":[{"kind":"text","text":"Describing that the fullscreen player just finished presenting."}]},"type":{"type":"literal","value":1}},{"name":"PLAYER_WILL_DISMISS","kind":16,"comment":{"summary":[{"kind":"text","text":"Describing that the fullscreen player is about to dismiss."}]},"type":{"type":"literal","value":2}},{"name":"PLAYER_WILL_PRESENT","kind":16,"comment":{"summary":[{"kind":"text","text":"Describing that the fullscreen player is about to present."}]},"type":{"type":"literal","value":0}}]},{"name":"VideoFullscreenUpdateEvent","kind":4194304,"type":{"type":"reflection","declaration":{"name":"__type","kind":65536,"children":[{"name":"fullscreenUpdate","kind":1024,"comment":{"summary":[{"kind":"text","text":"The kind of the fullscreen update."}]},"type":{"type":"reference","name":"VideoFullscreenUpdate"}},{"name":"status","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"The "},{"kind":"code","text":"`AVPlaybackStatus`"},{"kind":"text","text":" of the video. See the [AV documentation](./av) for further information."}]},"type":{"type":"reference","name":"AVPlaybackStatus"}}]}}},{"name":"VideoNaturalSize","kind":4194304,"type":{"type":"reflection","declaration":{"name":"__type","kind":65536,"children":[{"name":"height","kind":1024,"comment":{"summary":[{"kind":"text","text":"A number describing the height in pixels of the video data."}]},"type":{"type":"intrinsic","name":"number"}},{"name":"orientation","kind":1024,"comment":{"summary":[{"kind":"text","text":"A string describing the natural orientation of the video data."}]},"type":{"type":"union","types":[{"type":"literal","value":"portrait"},{"type":"literal","value":"landscape"}]}},{"name":"width","kind":1024,"comment":{"summary":[{"kind":"text","text":"A number describing the width in pixels of the video data."}]},"type":{"type":"intrinsic","name":"number"}}]}}},{"name":"VideoProps","kind":4194304,"comment":{"summary":[{"kind":"text","text":"The Video component props can be divided into following groups:\n- The "},{"kind":"code","text":"`source`"},{"kind":"text","text":" and "},{"kind":"code","text":"`posterSource`"},{"kind":"text","text":" props customize the source of the video content.\n- The "},{"kind":"code","text":"`useNativeControls`"},{"kind":"text","text":", "},{"kind":"code","text":"`resizeMode`"},{"kind":"text","text":", and "},{"kind":"code","text":"`usePoster`"},{"kind":"text","text":" props customize the UI of the component.\n- The "},{"kind":"code","text":"`onPlaybackStatusUpdate`"},{"kind":"text","text":", "},{"kind":"code","text":"`onReadyForDisplay`"},{"kind":"text","text":", and "},{"kind":"code","text":"`onIOSFullscreenUpdate`"},{"kind":"text","text":" props pass information of the state of the "},{"kind":"code","text":"`Video`"},{"kind":"text","text":" component.\n- The "},{"kind":"code","text":"`onLoadStart`"},{"kind":"text","text":", "},{"kind":"code","text":"`onLoad`"},{"kind":"text","text":", and "},{"kind":"code","text":"`onError`"},{"kind":"text","text":" props are also provided for backwards compatibility with "},{"kind":"code","text":"`Image`"},{"kind":"text","text":"\n (but they are redundant with "},{"kind":"code","text":"`onPlaybackStatusUpdate`"},{"kind":"text","text":").\nFinally, the rest of props are available to control the playback of the video, but we recommend that, for finer control, you use the methods\navailable on the "},{"kind":"code","text":"`ref`"},{"kind":"text","text":" described in the [AV documentation](./av)."}]},"type":{"type":"intersection","types":[{"type":"reflection","declaration":{"name":"__type","kind":65536,"children":[{"name":"PosterComponent","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"A react-native "},{"kind":"code","text":"`Image`"},{"kind":"text","text":" like component to display the poster image."}]},"type":{"type":"reference","typeArguments":[{"type":"reflection","declaration":{"name":"__type","kind":65536,"children":[{"name":"source","kind":1024,"type":{"type":"indexedAccess","indexType":{"type":"literal","value":"source"},"objectType":{"type":"reference","name":"ImageProps","qualifiedName":"ImageProps","package":"react-native"}}},{"name":"style","kind":1024,"type":{"type":"indexedAccess","indexType":{"type":"literal","value":"style"},"objectType":{"type":"reference","name":"ImageProps","qualifiedName":"ImageProps","package":"react-native"}}}]}}],"name":"React.ComponentType","qualifiedName":"React.ComponentType","package":"@types/react"}},{"name":"audioPan","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"The desired audio panning value of the audio for this media. This value must be between "},{"kind":"code","text":"`-1.0`"},{"kind":"text","text":" (full left) and "},{"kind":"code","text":"`1.0`"},{"kind":"text","text":" (full right).\nSee the [AV documentation](./av) for more information."}]},"type":{"type":"intrinsic","name":"number"}},{"name":"isLooping","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"A boolean describing if the media should play once ("},{"kind":"code","text":"`false`"},{"kind":"text","text":") or loop indefinitely ("},{"kind":"code","text":"`true`"},{"kind":"text","text":").\nSee the [AV documentation](./av) for more information."}]},"type":{"type":"intrinsic","name":"boolean"}},{"name":"isMuted","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"A boolean describing if the audio of this media should be muted.\nSee the [AV documentation](./av) for more information."}]},"type":{"type":"intrinsic","name":"boolean"}},{"name":"onError","kind":1024,"flags":{"isOptional":true},"type":{"type":"reflection","declaration":{"name":"__type","kind":65536,"signatures":[{"name":"__type","kind":4096,"comment":{"summary":[{"kind":"text","text":"A function to be called if load or playback have encountered a fatal error. The function is passed a single error message string as a parameter.\nErrors sent here are also set on "},{"kind":"code","text":"`playbackStatus.error`"},{"kind":"text","text":" that are passed into the "},{"kind":"code","text":"`onPlaybackStatusUpdate`"},{"kind":"text","text":" callback."}]},"parameters":[{"name":"error","kind":32768,"type":{"type":"intrinsic","name":"string"}}],"type":{"type":"intrinsic","name":"void"}}]}}},{"name":"onFullscreenUpdate","kind":1024,"flags":{"isOptional":true},"type":{"type":"reflection","declaration":{"name":"__type","kind":65536,"signatures":[{"name":"__type","kind":4096,"comment":{"summary":[{"kind":"text","text":"A function to be called when the state of the native iOS fullscreen view changes (controlled via the "},{"kind":"code","text":"`presentFullscreenPlayer()`"},{"kind":"text","text":"\nand "},{"kind":"code","text":"`dismissFullscreenPlayer()`"},{"kind":"text","text":" methods on the "},{"kind":"code","text":"`Video`"},{"kind":"text","text":"'s "},{"kind":"code","text":"`ref`"},{"kind":"text","text":")."}]},"parameters":[{"name":"event","kind":32768,"type":{"type":"reference","name":"VideoFullscreenUpdateEvent"}}],"type":{"type":"intrinsic","name":"void"}}]}}},{"name":"onLoad","kind":1024,"flags":{"isOptional":true},"type":{"type":"reflection","declaration":{"name":"__type","kind":65536,"signatures":[{"name":"__type","kind":4096,"comment":{"summary":[{"kind":"text","text":"A function to be called once the video has been loaded. The data is streamed so all of it may not have been fetched yet, just enough to render the first frame.\nThe function is called with the "},{"kind":"code","text":"`AVPlaybackStatus`"},{"kind":"text","text":" of the video as its parameter. See the [AV documentation](./av) for further information."}]},"parameters":[{"name":"status","kind":32768,"type":{"type":"reference","name":"AVPlaybackStatus"}}],"type":{"type":"intrinsic","name":"void"}}]}}},{"name":"onLoadStart","kind":1024,"flags":{"isOptional":true},"type":{"type":"reflection","declaration":{"name":"__type","kind":65536,"signatures":[{"name":"__type","kind":4096,"comment":{"summary":[{"kind":"text","text":"A function to be called when the video begins to be loaded into memory. Called without any arguments."}]},"type":{"type":"intrinsic","name":"void"}}]}}},{"name":"onPlaybackStatusUpdate","kind":1024,"flags":{"isOptional":true},"type":{"type":"reflection","declaration":{"name":"__type","kind":65536,"signatures":[{"name":"__type","kind":4096,"comment":{"summary":[{"kind":"text","text":"A function to be called regularly with the "},{"kind":"code","text":"`AVPlaybackStatus`"},{"kind":"text","text":" of the video. You will likely be using this a lot.\nSee the [AV documentation](./av) for further information on "},{"kind":"code","text":"`onPlaybackStatusUpdate`"},{"kind":"text","text":", and the interval at which it is called."}]},"parameters":[{"name":"status","kind":32768,"type":{"type":"reference","name":"AVPlaybackStatus"}}],"type":{"type":"intrinsic","name":"void"}}]}}},{"name":"onReadyForDisplay","kind":1024,"flags":{"isOptional":true},"type":{"type":"reflection","declaration":{"name":"__type","kind":65536,"signatures":[{"name":"__type","kind":4096,"comment":{"summary":[{"kind":"text","text":"A function to be called when the video is ready for display. Note that this function gets called whenever the video's natural size changes."}]},"parameters":[{"name":"event","kind":32768,"type":{"type":"reference","name":"VideoReadyForDisplayEvent"}}],"type":{"type":"intrinsic","name":"void"}}]}}},{"name":"positionMillis","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"The desired position of playback in milliseconds.\nSee the [AV documentation](./av) for more information."}]},"type":{"type":"intrinsic","name":"number"}},{"name":"posterSource","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"The source of an optional image to display over the video while it is loading. The following forms are supported:\n- A dictionary of the form "},{"kind":"code","text":"`{ uri: 'http://path/to/file' }`"},{"kind":"text","text":" with a network URL pointing to an image file on the web.\n- "},{"kind":"code","text":"`require('path/to/file')`"},{"kind":"text","text":" for an image file asset in the source code directory."}]},"type":{"type":"indexedAccess","indexType":{"type":"literal","value":"source"},"objectType":{"type":"reference","name":"ImageProps","qualifiedName":"ImageProps","package":"react-native"}}},{"name":"posterStyle","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"An optional property to pass custom styles to the poster image."}]},"type":{"type":"indexedAccess","indexType":{"type":"literal","value":"style"},"objectType":{"type":"reference","name":"ImageProps","qualifiedName":"ImageProps","package":"react-native"}}},{"name":"progressUpdateIntervalMillis","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"A number describing the new minimum interval in milliseconds between calls of "},{"kind":"code","text":"`onPlaybackStatusUpdate`"},{"kind":"text","text":".\nSee the [AV documentation](./av) for more information."}]},"type":{"type":"intrinsic","name":"number"}},{"name":"rate","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"The desired playback rate of the media. This value must be between "},{"kind":"code","text":"`0.0`"},{"kind":"text","text":" and "},{"kind":"code","text":"`32.0`"},{"kind":"text","text":". Only available on Android API version 23 and later and iOS.\nSee the [AV documentation](./av) for more information."}]},"type":{"type":"intrinsic","name":"number"}},{"name":"resizeMode","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"A string describing how the video should be scaled for display in the component view bounds.\nMust be one of the ["},{"kind":"code","text":"`ResizeMode`"},{"kind":"text","text":"](#resizemode) enum values."}]},"type":{"type":"reference","name":"ResizeMode"}},{"name":"shouldCorrectPitch","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"A boolean describing if we should correct the pitch for a changed rate. If set to "},{"kind":"code","text":"`true`"},{"kind":"text","text":", the pitch of the audio will be corrected\n(so a rate different than "},{"kind":"code","text":"`1.0`"},{"kind":"text","text":" will timestretch the audio).\nSee the [AV documentation](./av) for more information."}]},"type":{"type":"intrinsic","name":"boolean"}},{"name":"shouldPlay","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"A boolean describing if the media is supposed to play. Playback may not start immediately after setting this value for reasons such as buffering.\nMake sure to update your UI based on the "},{"kind":"code","text":"`isPlaying`"},{"kind":"text","text":" and "},{"kind":"code","text":"`isBuffering`"},{"kind":"text","text":" properties of the "},{"kind":"code","text":"`AVPlaybackStatus`"},{"kind":"text","text":".\nSee the [AV documentation](./av) for more information."}]},"type":{"type":"intrinsic","name":"boolean"}},{"name":"source","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"The source of the video data to display. If this prop is "},{"kind":"code","text":"`null`"},{"kind":"text","text":", or left blank, the video component will display nothing.\nNote that this can also be set on the "},{"kind":"code","text":"`ref`"},{"kind":"text","text":" via "},{"kind":"code","text":"`loadAsync()`"},{"kind":"text","text":". See the [AV documentation](./av) for further information."}],"blockTags":[{"tag":"@see","content":[{"kind":"text","text":"- The [Android developer documentation](https://developer.android.com/guide/topics/media/media-formats#video-formats)\nlists of the video formats supported on Android.\n- The [iOS developer documentation](https://developer.apple.com/documentation/coremedia/1564239-video_codec_constants)\nlists of the video formats supported on iOS."}]}]},"type":{"type":"reference","name":"AVPlaybackSource"}},{"name":"status","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"A dictionary setting a new "},{"kind":"code","text":"`AVPlaybackStatusToSet`"},{"kind":"text","text":" on the video.\nSee the [AV documentation](./av#default-initial--avplaybackstatustoset) for more information on "},{"kind":"code","text":"`AVPlaybackStatusToSet`"},{"kind":"text","text":"."}]},"type":{"type":"reference","name":"AVPlaybackStatusToSet"}},{"name":"useNativeControls","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"A boolean which, if set to "},{"kind":"code","text":"`true`"},{"kind":"text","text":", will display native playback controls (such as play and pause) within the "},{"kind":"code","text":"`Video`"},{"kind":"text","text":" component.\nIf you'd prefer to use custom controls, you can write them yourself, and/or check out the ["},{"kind":"code","text":"`VideoPlayer`"},{"kind":"text","text":" component](https://github.com/ihmpavel/expo-video-player)."}]},"type":{"type":"intrinsic","name":"boolean"}},{"name":"usePoster","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"A boolean which, if set to "},{"kind":"code","text":"`true`"},{"kind":"text","text":", will display an image (whose source is set via the prop "},{"kind":"code","text":"`posterSource`"},{"kind":"text","text":") while the video is loading."}]},"type":{"type":"intrinsic","name":"boolean"}},{"name":"videoStyle","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"An optional property to pass custom styles to the internal video component."}]},"type":{"type":"reference","typeArguments":[{"type":"reference","name":"ViewStyle","qualifiedName":"ViewStyle","package":"react-native"}],"name":"StyleProp","qualifiedName":"StyleProp","package":"react-native"}},{"name":"volume","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"The desired volume of the audio for this media. This value must be between "},{"kind":"code","text":"`0.0`"},{"kind":"text","text":" (silence) and "},{"kind":"code","text":"`1.0`"},{"kind":"text","text":" (maximum volume).\nSee the [AV documentation](./av) for more information."}]},"type":{"type":"intrinsic","name":"number"}}]}},{"type":"reference","name":"ViewProps","qualifiedName":"ViewProps","package":"react-native"}]}},{"name":"VideoReadyForDisplayEvent","kind":4194304,"type":{"type":"reflection","declaration":{"name":"__type","kind":65536,"children":[{"name":"naturalSize","kind":1024,"comment":{"summary":[{"kind":"text","text":"An object containing the basic data about video size."}]},"type":{"type":"reference","name":"VideoNaturalSize"}},{"name":"status","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"The "},{"kind":"code","text":"`AVPlaybackStatus`"},{"kind":"text","text":" of the video. See the [AV documentation](./av/#playback-status) for further information."}]},"type":{"type":"reference","name":"AVPlaybackStatus"}}]}}},{"name":"VideoState","kind":4194304,"type":{"type":"reflection","declaration":{"name":"__type","kind":65536,"children":[{"name":"showPoster","kind":1024,"type":{"type":"intrinsic","name":"boolean"}}]}}}]}
\ No newline at end of file
diff --git a/docs/public/static/data/v49.0.0/expo-web-browser.json b/docs/public/static/data/v49.0.0/expo-web-browser.json
new file mode 100644
index 0000000000000..8b660fea8afb2
--- /dev/null
+++ b/docs/public/static/data/v49.0.0/expo-web-browser.json
@@ -0,0 +1 @@
+{"name":"expo-web-browser","kind":1,"children":[{"name":"WebBrowserPresentationStyle","kind":8,"comment":{"summary":[{"kind":"text","text":"A browser presentation style. Its values are directly mapped to the ["},{"kind":"code","text":"`UIModalPresentationStyle`"},{"kind":"text","text":"](https://developer.apple.com/documentation/uikit/uiviewcontroller/1621355-modalpresentationstyle)."}],"blockTags":[{"tag":"@platform","content":[{"kind":"text","text":"ios"}]}]},"children":[{"name":"AUTOMATIC","kind":16,"comment":{"summary":[{"kind":"text","text":"The default presentation style chosen by the system.\nOn older iOS versions, falls back to "},{"kind":"code","text":"`WebBrowserPresentationStyle.FullScreen`"},{"kind":"text","text":"."}],"blockTags":[{"tag":"@platform","content":[{"kind":"text","text":"ios 13+"}]}]},"type":{"type":"literal","value":"automatic"}},{"name":"CURRENT_CONTEXT","kind":16,"comment":{"summary":[{"kind":"text","text":"A presentation style where the browser is displayed over the app's content."}]},"type":{"type":"literal","value":"currentContext"}},{"name":"FORM_SHEET","kind":16,"comment":{"summary":[{"kind":"text","text":"A presentation style that displays the browser centered in the screen."}]},"type":{"type":"literal","value":"formSheet"}},{"name":"FULL_SCREEN","kind":16,"comment":{"summary":[{"kind":"text","text":"A presentation style in which the presented browser covers the screen."}]},"type":{"type":"literal","value":"fullScreen"}},{"name":"OVER_CURRENT_CONTEXT","kind":16,"comment":{"summary":[{"kind":"text","text":"A presentation style where the browser is displayed over the app's content."}]},"type":{"type":"literal","value":"overCurrentContext"}},{"name":"OVER_FULL_SCREEN","kind":16,"comment":{"summary":[{"kind":"text","text":"A presentation style in which the browser view covers the screen."}]},"type":{"type":"literal","value":"overFullScreen"}},{"name":"PAGE_SHEET","kind":16,"comment":{"summary":[{"kind":"text","text":"A presentation style that partially covers the underlying content."}]},"type":{"type":"literal","value":"pageSheet"}},{"name":"POPOVER","kind":16,"comment":{"summary":[{"kind":"text","text":"A presentation style where the browser is displayed in a popover view."}]},"type":{"type":"literal","value":"popover"}}]},{"name":"WebBrowserResultType","kind":8,"children":[{"name":"CANCEL","kind":16,"comment":{"summary":[],"blockTags":[{"tag":"@platform","content":[{"kind":"text","text":"ios"}]}]},"type":{"type":"literal","value":"cancel"}},{"name":"DISMISS","kind":16,"comment":{"summary":[],"blockTags":[{"tag":"@platform","content":[{"kind":"text","text":"ios"}]}]},"type":{"type":"literal","value":"dismiss"}},{"name":"LOCKED","kind":16,"type":{"type":"literal","value":"locked"}},{"name":"OPENED","kind":16,"comment":{"summary":[],"blockTags":[{"tag":"@platform","content":[{"kind":"text","text":"android"}]}]},"type":{"type":"literal","value":"opened"}}]},{"name":"AuthSessionOpenOptions","kind":4194304,"comment":{"summary":[{"kind":"text","text":"If there is no native AuthSession implementation available (which is the case on Android) the params inherited from\n["},{"kind":"code","text":"`WebBrowserOpenOptions`"},{"kind":"text","text":"](#webbrowseropenoptions) will be used in the browser polyfill. Otherwise, the browser parameters will be ignored."}]},"type":{"type":"intersection","types":[{"type":"reference","name":"WebBrowserOpenOptions"},{"type":"reflection","declaration":{"name":"__type","kind":65536,"children":[{"name":"preferEphemeralSession","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"Determines whether the session should ask the browser for a private authentication session.\nSet this to "},{"kind":"code","text":"`true`"},{"kind":"text","text":" to request that the browser doesn’t share cookies or other browsing data between the authentication session and the user’s normal browser session.\nWhether the request is honored depends on the user’s default web browser."}],"blockTags":[{"tag":"@default","content":[{"kind":"text","text":"false"}]},{"tag":"@platform","content":[{"kind":"text","text":"ios 13+"}]}]},"type":{"type":"intrinsic","name":"boolean"}}]}}]}},{"name":"WebBrowserAuthSessionResult","kind":4194304,"type":{"type":"union","types":[{"type":"reference","name":"WebBrowserRedirectResult"},{"type":"reference","name":"WebBrowserResult"}]}},{"name":"WebBrowserCompleteAuthSessionOptions","kind":4194304,"type":{"type":"reflection","declaration":{"name":"__type","kind":65536,"children":[{"name":"skipRedirectCheck","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"Attempt to close the window without checking to see if the auth redirect matches the cached redirect URL."}]},"type":{"type":"intrinsic","name":"boolean"}}]}}},{"name":"WebBrowserCompleteAuthSessionResult","kind":4194304,"type":{"type":"reflection","declaration":{"name":"__type","kind":65536,"children":[{"name":"message","kind":1024,"comment":{"summary":[{"kind":"text","text":"Additional description or reasoning of the result."}]},"type":{"type":"intrinsic","name":"string"}},{"name":"type","kind":1024,"comment":{"summary":[{"kind":"text","text":"Type of the result."}]},"type":{"type":"union","types":[{"type":"literal","value":"success"},{"type":"literal","value":"failed"}]}}]}}},{"name":"WebBrowserCoolDownResult","kind":4194304,"type":{"type":"reference","name":"ServiceActionResult"}},{"name":"WebBrowserCustomTabsResults","kind":4194304,"type":{"type":"reflection","declaration":{"name":"__type","kind":65536,"children":[{"name":"browserPackages","kind":1024,"comment":{"summary":[{"kind":"text","text":"All packages recognized by "},{"kind":"code","text":"`PackageManager`"},{"kind":"text","text":" as capable of handling Custom Tabs. Empty array\nmeans there is no supporting browsers on device."}]},"type":{"type":"array","elementType":{"type":"intrinsic","name":"string"}}},{"name":"defaultBrowserPackage","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"Default package chosen by user, "},{"kind":"code","text":"`null`"},{"kind":"text","text":" if there is no such packages. Also "},{"kind":"code","text":"`null`"},{"kind":"text","text":" usually means,\nthat user will be prompted to choose from available packages."}]},"type":{"type":"intrinsic","name":"string"}},{"name":"preferredBrowserPackage","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"Package preferred by "},{"kind":"code","text":"`CustomTabsClient`"},{"kind":"text","text":" to be used to handle Custom Tabs. It favors browser\nchosen by user as default, as long as it is present on both "},{"kind":"code","text":"`browserPackages`"},{"kind":"text","text":" and\n"},{"kind":"code","text":"`servicePackages`"},{"kind":"text","text":" lists. Only such browsers are considered as fully supporting Custom Tabs.\nIt might be "},{"kind":"code","text":"`null`"},{"kind":"text","text":" when there is no such browser installed or when default browser is not in\n"},{"kind":"code","text":"`servicePackages`"},{"kind":"text","text":" list."}]},"type":{"type":"intrinsic","name":"string"}},{"name":"servicePackages","kind":1024,"comment":{"summary":[{"kind":"text","text":"All packages recognized by "},{"kind":"code","text":"`PackageManager`"},{"kind":"text","text":" as capable of handling Custom Tabs Service.\nThis service is used by ["},{"kind":"code","text":"`warmUpAsync`"},{"kind":"text","text":"](#webbrowserwarmupasyncbrowserpackage), ["},{"kind":"code","text":"`mayInitWithUrlAsync`"},{"kind":"text","text":"](#webbrowsermayinitwithurlasyncurl-browserpackage)\nand ["},{"kind":"code","text":"`coolDownAsync`"},{"kind":"text","text":"](#webbrowsercooldownasyncbrowserpackage)."}]},"type":{"type":"array","elementType":{"type":"intrinsic","name":"string"}}}]}}},{"name":"WebBrowserMayInitWithUrlResult","kind":4194304,"type":{"type":"reference","name":"ServiceActionResult"}},{"name":"WebBrowserOpenOptions","kind":4194304,"type":{"type":"reflection","declaration":{"name":"__type","kind":65536,"children":[{"name":"browserPackage","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"Package name of a browser to be used to handle Custom Tabs. List of\navailable packages is to be queried by ["},{"kind":"code","text":"`getCustomTabsSupportingBrowsers`"},{"kind":"text","text":"](#webbrowsergetcustomtabssupportingbrowsersasync) method."}],"blockTags":[{"tag":"@platform","content":[{"kind":"text","text":"android"}]}]},"type":{"type":"intrinsic","name":"string"}},{"name":"controlsColor","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"Tint color for controls in SKSafariViewController. Supports React Native [color formats](https://reactnative.dev/docs/colors)."}],"blockTags":[{"tag":"@platform","content":[{"kind":"text","text":"ios"}]}]},"type":{"type":"intrinsic","name":"string"}},{"name":"createTask","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"A boolean determining whether the browser should open in a new task or in\nthe same task as your app."}],"blockTags":[{"tag":"@default","content":[{"kind":"text","text":"true"}]},{"tag":"@platform","content":[{"kind":"text","text":"android"}]}]},"type":{"type":"intrinsic","name":"boolean"}},{"name":"dismissButtonStyle","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"The style of the dismiss button. Should be one of: "},{"kind":"code","text":"`done`"},{"kind":"text","text":", "},{"kind":"code","text":"`close`"},{"kind":"text","text":", or "},{"kind":"code","text":"`cancel`"},{"kind":"text","text":"."}],"blockTags":[{"tag":"@platform","content":[{"kind":"text","text":"ios"}]}]},"type":{"type":"union","types":[{"type":"literal","value":"done"},{"type":"literal","value":"close"},{"type":"literal","value":"cancel"}]}},{"name":"enableBarCollapsing","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"A boolean determining whether the toolbar should be hiding when a user scrolls the website."}]},"type":{"type":"intrinsic","name":"boolean"}},{"name":"enableDefaultShareMenuItem","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"A boolean determining whether a default share item should be added to the menu."}],"blockTags":[{"tag":"@platform","content":[{"kind":"text","text":"android"}]}]},"type":{"type":"intrinsic","name":"boolean"}},{"name":"presentationStyle","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"The [presentation style](https://developer.apple.com/documentation/uikit/uiviewcontroller/1621355-modalpresentationstyle)\nof the browser window."}],"blockTags":[{"tag":"@default","content":[{"kind":"text","text":"WebBrowser.WebBrowserPresentationStyle.OverFullScreen"}]},{"tag":"@platform","content":[{"kind":"text","text":"ios"}]}]},"type":{"type":"reference","name":"WebBrowserPresentationStyle"}},{"name":"readerMode","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"A boolean determining whether Safari should enter Reader mode, if it is available."}],"blockTags":[{"tag":"@platform","content":[{"kind":"text","text":"ios"}]}]},"type":{"type":"intrinsic","name":"boolean"}},{"name":"secondaryToolbarColor","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"Color of the secondary toolbar. Supports React Native [color formats](https://reactnative.dev/docs/colors)."}],"blockTags":[{"tag":"@platform","content":[{"kind":"text","text":"android"}]}]},"type":{"type":"intrinsic","name":"string"}},{"name":"showInRecents","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"A boolean determining whether browsed website should be shown as separate\nentry in Android recents/multitasking view. Requires "},{"kind":"code","text":"`createTask`"},{"kind":"text","text":" to be "},{"kind":"code","text":"`true`"},{"kind":"text","text":" (default)."}],"blockTags":[{"tag":"@default","content":[{"kind":"text","text":"false"}]},{"tag":"@platform","content":[{"kind":"text","text":"android"}]}]},"type":{"type":"intrinsic","name":"boolean"}},{"name":"showTitle","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"A boolean determining whether the browser should show the title of website on the toolbar."}],"blockTags":[{"tag":"@platform","content":[{"kind":"text","text":"android"}]}]},"type":{"type":"intrinsic","name":"boolean"}},{"name":"toolbarColor","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"Color of the toolbar. Supports React Native [color formats](https://reactnative.dev/docs/colors)."}]},"type":{"type":"intrinsic","name":"string"}},{"name":"windowFeatures","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"Features to use with "},{"kind":"code","text":"`window.open()`"},{"kind":"text","text":"."}],"blockTags":[{"tag":"@platform","content":[{"kind":"text","text":"web"}]}]},"type":{"type":"union","types":[{"type":"intrinsic","name":"string"},{"type":"reference","name":"WebBrowserWindowFeatures"}]}},{"name":"windowName","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"Name to assign to the popup window."}],"blockTags":[{"tag":"@platform","content":[{"kind":"text","text":"web"}]}]},"type":{"type":"intrinsic","name":"string"}}]}}},{"name":"WebBrowserRedirectResult","kind":4194304,"type":{"type":"reflection","declaration":{"name":"__type","kind":65536,"children":[{"name":"type","kind":1024,"comment":{"summary":[{"kind":"text","text":"Type of the result."}]},"type":{"type":"literal","value":"success"}},{"name":"url","kind":1024,"type":{"type":"intrinsic","name":"string"}}]}}},{"name":"WebBrowserResult","kind":4194304,"type":{"type":"reflection","declaration":{"name":"__type","kind":65536,"children":[{"name":"type","kind":1024,"comment":{"summary":[{"kind":"text","text":"Type of the result."}]},"type":{"type":"reference","name":"WebBrowserResultType"}}]}}},{"name":"WebBrowserWarmUpResult","kind":4194304,"type":{"type":"reference","name":"ServiceActionResult"}},{"name":"WebBrowserWindowFeatures","kind":4194304,"type":{"type":"reference","typeArguments":[{"type":"intrinsic","name":"string"},{"type":"union","types":[{"type":"intrinsic","name":"number"},{"type":"intrinsic","name":"boolean"},{"type":"intrinsic","name":"string"}]}],"name":"Record","qualifiedName":"Record","package":"typescript"}},{"name":"coolDownAsync","kind":64,"signatures":[{"name":"coolDownAsync","kind":4096,"comment":{"summary":[{"kind":"text","text":"This methods removes all bindings to services created by ["},{"kind":"code","text":"`warmUpAsync`"},{"kind":"text","text":"](#webbrowserwarmupasyncbrowserpackage)\nor ["},{"kind":"code","text":"`mayInitWithUrlAsync`"},{"kind":"text","text":"](#webbrowsermayinitwithurlasyncurl-browserpackage). You should call\nthis method once you don't need them to avoid potential memory leaks. However, those binding\nwould be cleared once your application is destroyed, which might be sufficient in most cases."}],"blockTags":[{"tag":"@returns","content":[{"kind":"text","text":"The promise which fulfils with "},{"kind":"code","text":"` WebBrowserCoolDownResult`"},{"kind":"text","text":" when cooling is performed, or\nan empty object when there was no connection to be dismissed."}]},{"tag":"@platform","content":[{"kind":"text","text":"android"}]}]},"parameters":[{"name":"browserPackage","kind":32768,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"Package of browser to be cooled. If not set, preferred browser will be used."}]},"type":{"type":"intrinsic","name":"string"}}],"type":{"type":"reference","typeArguments":[{"type":"reference","name":"WebBrowserCoolDownResult"}],"name":"Promise","qualifiedName":"Promise","package":"typescript"}}]},{"name":"dismissAuthSession","kind":64,"signatures":[{"name":"dismissAuthSession","kind":4096,"type":{"type":"intrinsic","name":"void"}}]},{"name":"dismissBrowser","kind":64,"signatures":[{"name":"dismissBrowser","kind":4096,"comment":{"summary":[{"kind":"text","text":"Dismisses the presented web browser."}],"blockTags":[{"tag":"@returns","content":[{"kind":"text","text":"The "},{"kind":"code","text":"`void`"},{"kind":"text","text":" on successful attempt, or throws error, if dismiss functionality is not avaiable."}]},{"tag":"@platform","content":[{"kind":"text","text":"ios"}]}]},"type":{"type":"intrinsic","name":"void"}}]},{"name":"getCustomTabsSupportingBrowsersAsync","kind":64,"signatures":[{"name":"getCustomTabsSupportingBrowsersAsync","kind":4096,"comment":{"summary":[{"kind":"text","text":"Returns a list of applications package names supporting Custom Tabs, Custom Tabs\nservice, user chosen and preferred one. This may not be fully reliable, since it uses\n"},{"kind":"code","text":"`PackageManager.getResolvingActivities`"},{"kind":"text","text":" under the hood. (For example, some browsers might not be\npresent in browserPackages list once another browser is set to default.)"}],"blockTags":[{"tag":"@returns","content":[{"kind":"text","text":"The promise which fulfils with ["},{"kind":"code","text":"`WebBrowserCustomTabsResults`"},{"kind":"text","text":"](#webbrowsercustomtabsresults) object."}]},{"tag":"@platform","content":[{"kind":"text","text":"android"}]}]},"type":{"type":"reference","typeArguments":[{"type":"reference","name":"WebBrowserCustomTabsResults"}],"name":"Promise","qualifiedName":"Promise","package":"typescript"}}]},{"name":"mayInitWithUrlAsync","kind":64,"signatures":[{"name":"mayInitWithUrlAsync","kind":4096,"comment":{"summary":[{"kind":"text","text":"This method initiates (if needed) [CustomTabsSession](https://developer.android.com/reference/android/support/customtabs/CustomTabsSession.html#maylaunchurl)\nand calls its "},{"kind":"code","text":"`mayLaunchUrl`"},{"kind":"text","text":" method for browser specified by the package."}],"blockTags":[{"tag":"@returns","content":[{"kind":"text","text":"A promise which fulfils with "},{"kind":"code","text":"`WebBrowserMayInitWithUrlResult`"},{"kind":"text","text":" object."}]},{"tag":"@platform","content":[{"kind":"text","text":"android"}]}]},"parameters":[{"name":"url","kind":32768,"comment":{"summary":[{"kind":"text","text":"The url of page that is likely to be loaded first when opening browser."}]},"type":{"type":"intrinsic","name":"string"}},{"name":"browserPackage","kind":32768,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"Package of browser to be informed. If not set, preferred\nbrowser will be used."}]},"type":{"type":"intrinsic","name":"string"}}],"type":{"type":"reference","typeArguments":[{"type":"reference","name":"WebBrowserMayInitWithUrlResult"}],"name":"Promise","qualifiedName":"Promise","package":"typescript"}}]},{"name":"maybeCompleteAuthSession","kind":64,"signatures":[{"name":"maybeCompleteAuthSession","kind":4096,"comment":{"summary":[{"kind":"text","text":"Possibly completes an authentication session on web in a window popup. The method\nshould be invoked on the page that the window redirects to."}],"blockTags":[{"tag":"@returns","content":[{"kind":"text","text":"Returns an object with message about why the redirect failed or succeeded:\n\nIf "},{"kind":"code","text":"`type`"},{"kind":"text","text":" is set to "},{"kind":"code","text":"`failed`"},{"kind":"text","text":", the reason depends on the message:\n- "},{"kind":"code","text":"`Not supported on this platform`"},{"kind":"text","text":": If the platform doesn't support this method (iOS, Android).\n- "},{"kind":"code","text":"`Cannot use expo-web-browser in a non-browser environment`"},{"kind":"text","text":": If the code was executed in an SSR\n or node environment.\n- "},{"kind":"code","text":"`No auth session is currently in progress`"},{"kind":"text","text":": (the cached state wasn't found in local storage).\n This can happen if the window redirects to an origin (website) that is different to the initial\n website origin. If this happens in development, it may be because the auth started on localhost\n and finished on your computer port (Ex: "},{"kind":"code","text":"`128.0.0.*`"},{"kind":"text","text":"). This is controlled by the "},{"kind":"code","text":"`redirectUrl`"},{"kind":"text","text":"\n and "},{"kind":"code","text":"`returnUrl`"},{"kind":"text","text":".\n- "},{"kind":"code","text":"`Current URL \"\" and original redirect URL \"\" do not match`"},{"kind":"text","text":": This can occur when the\n redirect URL doesn't match what was initial defined as the "},{"kind":"code","text":"`returnUrl`"},{"kind":"text","text":". You can skip this test\n in development by passing "},{"kind":"code","text":"`{ skipRedirectCheck: true }`"},{"kind":"text","text":" to the function.\n\nIf "},{"kind":"code","text":"`type`"},{"kind":"text","text":" is set to "},{"kind":"code","text":"`success`"},{"kind":"text","text":", the parent window will attempt to close the child window immediately.\n\nIf the error "},{"kind":"code","text":"`ERR_WEB_BROWSER_REDIRECT`"},{"kind":"text","text":" was thrown, it may mean that the parent window was\nreloaded before the auth was completed. In this case you'll need to close the child window manually."}]},{"tag":"@platform","content":[{"kind":"text","text":"web"}]}]},"parameters":[{"name":"options","kind":32768,"type":{"type":"reference","name":"WebBrowserCompleteAuthSessionOptions"},"defaultValue":"{}"}],"type":{"type":"reference","name":"WebBrowserCompleteAuthSessionResult"}}]},{"name":"openAuthSessionAsync","kind":64,"signatures":[{"name":"openAuthSessionAsync","kind":4096,"comment":{"summary":[{"kind":"text","text":"# On iOS:\nOpens the url with Safari in a modal using "},{"kind":"code","text":"`ASWebAuthenticationSession`"},{"kind":"text","text":". The user will be asked\nwhether to allow the app to authenticate using the given url.\nTo handle redirection back to the mobile application, the redirect URI set in the authentication server\nhas to use the protocol provided as the scheme in **app.json** ["},{"kind":"code","text":"`expo.scheme`"},{"kind":"text","text":"](./../config/app/#scheme)\ne.g. "},{"kind":"code","text":"`demo://`"},{"kind":"text","text":" not "},{"kind":"code","text":"`https://`"},{"kind":"text","text":" protocol.\nUsing "},{"kind":"code","text":"`Linking.addEventListener`"},{"kind":"text","text":" is not needed and can have side effects.\n\n# On Android:\nThis will be done using a \"custom Chrome tabs\" browser, [AppState](../react-native/appstate/),\nand [Linking](./linking/) APIs.\n\n# On web:\n> This API can only be used in a secure environment ("},{"kind":"code","text":"`https`"},{"kind":"text","text":"). You can use expo "},{"kind":"code","text":"`start:web --https`"},{"kind":"text","text":"\nto test this. Otherwise, an error with code ["},{"kind":"code","text":"`ERR_WEB_BROWSER_CRYPTO`"},{"kind":"text","text":"](#errwebbrowsercrypto) will be thrown.\nThis will use the browser's ["},{"kind":"code","text":"`window.open()`"},{"kind":"text","text":"](https://developer.mozilla.org/en-US/docs/Web/API/Window/open) API.\n- _Desktop_: This will create a new web popup window in the browser that can be closed later using "},{"kind":"code","text":"`WebBrowser.maybeCompleteAuthSession()`"},{"kind":"text","text":".\n- _Mobile_: This will open a new tab in the browser which can be closed using "},{"kind":"code","text":"`WebBrowser.maybeCompleteAuthSession()`"},{"kind":"text","text":".\n\nHow this works on web:\n- A crypto state will be created for verifying the redirect.\n - This means you need to run with "},{"kind":"code","text":"`npx expo start --https`"},{"kind":"text","text":"\n- The state will be added to the window's "},{"kind":"code","text":"`localstorage`"},{"kind":"text","text":". This ensures that auth cannot complete\n unless it's done from a page running with the same origin as it was started.\n Ex: if "},{"kind":"code","text":"`openAuthSessionAsync`"},{"kind":"text","text":" is invoked on "},{"kind":"code","text":"`https://localhost:19006`"},{"kind":"text","text":", then "},{"kind":"code","text":"`maybeCompleteAuthSession`"},{"kind":"text","text":"\n must be invoked on a page hosted from the origin "},{"kind":"code","text":"`https://localhost:19006`"},{"kind":"text","text":". Using a different\n website, or even a different host like "},{"kind":"code","text":"`https://128.0.0.*:19006`"},{"kind":"text","text":" for example will not work.\n- A timer will be started to check for every 1000 milliseconds (1 second) to detect if the window\n has been closed by the user. If this happens then a promise will resolve with "},{"kind":"code","text":"`{ type: 'dismiss' }`"},{"kind":"text","text":".\n\n> On mobile web, Chrome and Safari will block any call to ["},{"kind":"code","text":"`window.open()`"},{"kind":"text","text":"](https://developer.mozilla.org/en-US/docs/Web/API/Window/open)\nwhich takes too long to fire after a user interaction. This method must be invoked immediately\nafter a user interaction. If the event is blocked, an error with code ["},{"kind":"code","text":"`ERR_WEB_BROWSER_BLOCKED`"},{"kind":"text","text":"](#errwebbrowserblocked) will be thrown."}],"blockTags":[{"tag":"@returns","content":[{"kind":"text","text":"- If the user does not permit the application to authenticate with the given url, the Promise fulfills with "},{"kind":"code","text":"`{ type: 'cancel' }`"},{"kind":"text","text":" object.\n- If the user closed the web browser, the Promise fulfills with "},{"kind":"code","text":"`{ type: 'cancel' }`"},{"kind":"text","text":" object.\n- If the browser is closed using ["},{"kind":"code","text":"`dismissBrowser`"},{"kind":"text","text":"](#webbrowserdismissbrowser),\nthe Promise fulfills with "},{"kind":"code","text":"`{ type: 'dismiss' }`"},{"kind":"text","text":" object."}]}]},"parameters":[{"name":"url","kind":32768,"comment":{"summary":[{"kind":"text","text":"The url to open in the web browser. This should be a login page."}]},"type":{"type":"intrinsic","name":"string"}},{"name":"redirectUrl","kind":32768,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"_Optional_ - The url to deep link back into your app.\nOn web, this defaults to the output of ["},{"kind":"code","text":"`Linking.createURL(\"\")`"},{"kind":"text","text":"](./linking/#linkingcreateurlpath-namedparameters)."}]},"type":{"type":"union","types":[{"type":"literal","value":null},{"type":"intrinsic","name":"string"}]}},{"name":"options","kind":32768,"comment":{"summary":[{"kind":"text","text":"_Optional_ - An object extending the ["},{"kind":"code","text":"`WebBrowserOpenOptions`"},{"kind":"text","text":"](#webbrowseropenoptions).\nIf there is no native AuthSession implementation available (which is the case on Android)\nthese params will be used in the browser polyfill. If there is a native AuthSession implementation,\nthese params will be ignored."}]},"type":{"type":"reference","name":"AuthSessionOpenOptions"},"defaultValue":"{}"}],"type":{"type":"reference","typeArguments":[{"type":"reference","name":"WebBrowserAuthSessionResult"}],"name":"Promise","qualifiedName":"Promise","package":"typescript"}}]},{"name":"openBrowserAsync","kind":64,"signatures":[{"name":"openBrowserAsync","kind":4096,"comment":{"summary":[{"kind":"text","text":"Opens the url with Safari in a modal on iOS using ["},{"kind":"code","text":"`SFSafariViewController`"},{"kind":"text","text":"](https://developer.apple.com/documentation/safariservices/sfsafariviewcontroller),\nand Chrome in a new [custom tab](https://developer.chrome.com/multidevice/android/customtabs)\non Android. On iOS, the modal Safari will not share cookies with the system Safari. If you need\nthis, use ["},{"kind":"code","text":"`openAuthSessionAsync`"},{"kind":"text","text":"](#webbrowseropenauthsessionasyncurl-redirecturl-browserparams)."}],"blockTags":[{"tag":"@returns","content":[{"kind":"text","text":"The promise behaves differently based on the platform.\nOn Android promise resolves with "},{"kind":"code","text":"`{type: 'opened'}`"},{"kind":"text","text":" if we were able to open browser.\nOn iOS:\n- If the user closed the web browser, the Promise resolves with "},{"kind":"code","text":"`{ type: 'cancel' }`"},{"kind":"text","text":".\n- If the browser is closed using ["},{"kind":"code","text":"`dismissBrowser`"},{"kind":"text","text":"](#webbrowserdismissbrowser), the Promise resolves with "},{"kind":"code","text":"`{ type: 'dismiss' }`"},{"kind":"text","text":"."}]}]},"parameters":[{"name":"url","kind":32768,"comment":{"summary":[{"kind":"text","text":"The url to open in the web browser."}]},"type":{"type":"intrinsic","name":"string"}},{"name":"browserParams","kind":32768,"comment":{"summary":[{"kind":"text","text":"A dictionary of key-value pairs."}]},"type":{"type":"reference","name":"WebBrowserOpenOptions"},"defaultValue":"{}"}],"type":{"type":"reference","typeArguments":[{"type":"reference","name":"WebBrowserResult"}],"name":"Promise","qualifiedName":"Promise","package":"typescript"}}]},{"name":"warmUpAsync","kind":64,"signatures":[{"name":"warmUpAsync","kind":4096,"comment":{"summary":[{"kind":"text","text":"This method calls "},{"kind":"code","text":"`warmUp`"},{"kind":"text","text":" method on [CustomTabsClient](https://developer.android.com/reference/android/support/customtabs/CustomTabsClient.html#warmup(long))\nfor specified package."}],"blockTags":[{"tag":"@returns","content":[{"kind":"text","text":"A promise which fulfils with "},{"kind":"code","text":"`WebBrowserWarmUpResult`"},{"kind":"text","text":" object."}]},{"tag":"@platform","content":[{"kind":"text","text":"android"}]}]},"parameters":[{"name":"browserPackage","kind":32768,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"Package of browser to be warmed up. If not set, preferred browser will be warmed."}]},"type":{"type":"intrinsic","name":"string"}}],"type":{"type":"reference","typeArguments":[{"type":"reference","name":"WebBrowserWarmUpResult"}],"name":"Promise","qualifiedName":"Promise","package":"typescript"}}]}]}
\ No newline at end of file
diff --git a/docs/public/static/examples/v49.0.0/assets/gradientBall.json b/docs/public/static/examples/v49.0.0/assets/gradientBall.json
new file mode 100644
index 0000000000000..793c0b4dae845
--- /dev/null
+++ b/docs/public/static/examples/v49.0.0/assets/gradientBall.json
@@ -0,0 +1 @@
+{"v":"5.4.4","fr":60,"ip":0,"op":240,"w":100,"h":100,"nm":"合成 1","ddd":0,"assets":[],"layers":[{"ddd":0,"ind":1,"ty":4,"nm":"形状图层 1","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":0,"s":[50,26,0],"e":[50,26.004,0],"to":[0,0.001,0],"ti":[0,-0.003,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":1,"s":[50,26.004,0],"e":[50,26.017,0],"to":[0,0.003,0],"ti":[0,-0.006,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":2,"s":[50,26.017,0],"e":[50,26.038,0],"to":[0,0.006,0],"ti":[0,-0.009,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":3,"s":[50,26.038,0],"e":[50,26.069,0],"to":[0,0.009,0],"ti":[0,-0.012,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":4,"s":[50,26.069,0],"e":[50,26.11,0],"to":[0,0.012,0],"ti":[0,-0.015,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":5,"s":[50,26.11,0],"e":[50,26.162,0],"to":[0,0.015,0],"ti":[0,-0.019,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":6,"s":[50,26.162,0],"e":[50,26.224,0],"to":[0,0.019,0],"ti":[0,-0.023,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":7,"s":[50,26.224,0],"e":[50,26.299,0],"to":[0,0.023,0],"ti":[0,-0.027,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":8,"s":[50,26.299,0],"e":[50,26.385,0],"to":[0,0.027,0],"ti":[0,-0.031,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":9,"s":[50,26.385,0],"e":[50,26.485,0],"to":[0,0.031,0],"ti":[0,-0.036,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":10,"s":[50,26.485,0],"e":[50,26.6,0],"to":[0,0.036,0],"ti":[0,-0.041,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":11,"s":[50,26.6,0],"e":[50,26.729,0],"to":[0,0.041,0],"ti":[0,-0.046,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":12,"s":[50,26.729,0],"e":[50,26.874,0],"to":[0,0.046,0],"ti":[0,-0.051,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":13,"s":[50,26.874,0],"e":[50,27.036,0],"to":[0,0.051,0],"ti":[0,-0.057,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":14,"s":[50,27.036,0],"e":[50,27.216,0],"to":[0,0.057,0],"ti":[0,-0.063,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":15,"s":[50,27.216,0],"e":[50,27.415,0],"to":[0,0.063,0],"ti":[0,-0.07,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":16,"s":[50,27.415,0],"e":[50,27.636,0],"to":[0,0.07,0],"ti":[0,-0.077,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":17,"s":[50,27.636,0],"e":[50,27.878,0],"to":[0,0.077,0],"ti":[0,-0.085,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":18,"s":[50,27.878,0],"e":[50,28.145,0],"to":[0,0.085,0],"ti":[0,-0.093,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":19,"s":[50,28.145,0],"e":[50,28.439,0],"to":[0,0.093,0],"ti":[0,-0.103,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":20,"s":[50,28.439,0],"e":[50,28.762,0],"to":[0,0.103,0],"ti":[0,-0.113,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":21,"s":[50,28.762,0],"e":[50,29.117,0],"to":[0,0.113,0],"ti":[0,-0.125,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":22,"s":[50,29.117,0],"e":[50,29.509,0],"to":[0,0.125,0],"ti":[0,-0.137,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":23,"s":[50,29.509,0],"e":[50,29.942,0],"to":[0,0.137,0],"ti":[0,-0.152,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":24,"s":[50,29.942,0],"e":[50,30.419,0],"to":[0,0.152,0],"ti":[0,-0.168,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":25,"s":[50,30.419,0],"e":[50,30.949,0],"to":[0,0.168,0],"ti":[0,-0.186,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":26,"s":[50,30.949,0],"e":[50,31.538,0],"to":[0,0.186,0],"ti":[0,-0.208,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":27,"s":[50,31.538,0],"e":[50,32.197,0],"to":[0,0.208,0],"ti":[0,-0.234,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":28,"s":[50,32.197,0],"e":[50,32.939,0],"to":[0,0.234,0],"ti":[0,-0.264,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":29,"s":[50,32.939,0],"e":[50,33.782,0],"to":[0,0.264,0],"ti":[0,-0.302,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":30,"s":[50,33.782,0],"e":[50,34.749,0],"to":[0,0.302,0],"ti":[0,-0.348,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":31,"s":[50,34.749,0],"e":[50,35.869,0],"to":[0,0.348,0],"ti":[0,-0.407,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":32,"s":[50,35.869,0],"e":[50,37.19,0],"to":[0,0.407,0],"ti":[0,-0.485,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":33,"s":[50,37.19,0],"e":[50,38.779,0],"to":[0,0.485,0],"ti":[0,-0.59,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":34,"s":[50,38.779,0],"e":[50,40.727,0],"to":[0,0.59,0],"ti":[0,-0.721,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":35,"s":[50,40.727,0],"e":[50,43.102,0],"to":[0,0.721,0],"ti":[0,-0.825,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":36,"s":[50,43.102,0],"e":[50,45.675,0],"to":[0,0.825,0],"ti":[0,-0.784,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":37,"s":[50,45.675,0],"e":[50,47.807,0],"to":[0,0.784,0],"ti":[0,-0.586,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":38,"s":[50,47.807,0],"e":[50,49.194,0],"to":[0,0.586,0],"ti":[0,-0.366,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":39,"s":[50,49.194,0],"e":[50,50,0],"to":[0,0.366,0],"ti":[0,-0.186,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":40,"s":[50,50,0],"e":[50,50.311,0],"to":[0,0.186,0],"ti":[0,-0.103,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":41,"s":[50,50.311,0],"e":[50,50.616,0],"to":[0,0.103,0],"ti":[0,-0.101,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":42,"s":[50,50.616,0],"e":[50,50.915,0],"to":[0,0.101,0],"ti":[0,-0.098,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":43,"s":[50,50.915,0],"e":[50,51.206,0],"to":[0,0.098,0],"ti":[0,-0.096,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":44,"s":[50,51.206,0],"e":[50,51.488,0],"to":[0,0.096,0],"ti":[0,-0.093,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":45,"s":[50,51.488,0],"e":[50,51.762,0],"to":[0,0.093,0],"ti":[0,-0.09,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":46,"s":[50,51.762,0],"e":[50,52.027,0],"to":[0,0.09,0],"ti":[0,-0.086,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":47,"s":[50,52.027,0],"e":[50,52.281,0],"to":[0,0.086,0],"ti":[0,-0.083,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":48,"s":[50,52.281,0],"e":[50,52.525,0],"to":[0,0.083,0],"ti":[0,-0.079,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":49,"s":[50,52.525,0],"e":[50,52.758,0],"to":[0,0.079,0],"ti":[0,-0.076,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":50,"s":[50,52.758,0],"e":[50,52.979,0],"to":[0,0.076,0],"ti":[0,-0.072,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":51,"s":[50,52.979,0],"e":[50,53.188,0],"to":[0,0.072,0],"ti":[0,-0.068,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":52,"s":[50,53.188,0],"e":[50,53.385,0],"to":[0,0.068,0],"ti":[0,-0.064,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":53,"s":[50,53.385,0],"e":[50,53.57,0],"to":[0,0.064,0],"ti":[0,-0.059,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":54,"s":[50,53.57,0],"e":[50,53.741,0],"to":[0,0.059,0],"ti":[0,-0.055,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":55,"s":[50,53.741,0],"e":[50,53.899,0],"to":[0,0.055,0],"ti":[0,-0.05,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":56,"s":[50,53.899,0],"e":[50,54.043,0],"to":[0,0.05,0],"ti":[0,-0.046,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":57,"s":[50,54.043,0],"e":[50,54.174,0],"to":[0,0.046,0],"ti":[0,-0.041,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":58,"s":[50,54.174,0],"e":[50,54.291,0],"to":[0,0.041,0],"ti":[0,-0.037,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":59,"s":[50,54.291,0],"e":[50,54.395,0],"to":[0,0.037,0],"ti":[0,-0.032,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":60,"s":[50,54.395,0],"e":[50,54.484,0],"to":[0,0.032,0],"ti":[0,-0.027,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":61,"s":[50,54.484,0],"e":[50,54.559,0],"to":[0,0.027,0],"ti":[0,-0.023,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":62,"s":[50,54.559,0],"e":[50,54.621,0],"to":[0,0.023,0],"ti":[0,-0.018,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":63,"s":[50,54.621,0],"e":[50,54.668,0],"to":[0,0.018,0],"ti":[0,-0.014,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":64,"s":[50,54.668,0],"e":[50,54.702,0],"to":[0,0.014,0],"ti":[0,-0.009,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":65,"s":[50,54.702,0],"e":[50,54.722,0],"to":[0,0.009,0],"ti":[0,-0.004,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":66,"s":[50,54.722,0],"e":[50,54.728,0],"to":[0,0.004,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":67,"s":[50,54.728,0],"e":[50,54.721,0],"to":[0,0,0],"ti":[0,0.004,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":68,"s":[50,54.721,0],"e":[50,54.701,0],"to":[0,-0.004,0],"ti":[0,0.009,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":69,"s":[50,54.701,0],"e":[50,54.669,0],"to":[0,-0.009,0],"ti":[0,0.013,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":70,"s":[50,54.669,0],"e":[50,54.624,0],"to":[0,-0.013,0],"ti":[0,0.017,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":71,"s":[50,54.624,0],"e":[50,54.566,0],"to":[0,-0.017,0],"ti":[0,0.021,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":72,"s":[50,54.566,0],"e":[50,54.497,0],"to":[0,-0.021,0],"ti":[0,0.025,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":73,"s":[50,54.497,0],"e":[50,54.417,0],"to":[0,-0.025,0],"ti":[0,0.029,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":74,"s":[50,54.417,0],"e":[50,54.326,0],"to":[0,-0.029,0],"ti":[0,0.032,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":75,"s":[50,54.326,0],"e":[50,54.224,0],"to":[0,-0.032,0],"ti":[0,0.036,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":76,"s":[50,54.224,0],"e":[50,54.112,0],"to":[0,-0.036,0],"ti":[0,0.039,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":77,"s":[50,54.112,0],"e":[50,53.99,0],"to":[0,-0.039,0],"ti":[0,0.042,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":78,"s":[50,53.99,0],"e":[50,53.859,0],"to":[0,-0.042,0],"ti":[0,0.045,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":79,"s":[50,53.859,0],"e":[50,53.72,0],"to":[0,-0.045,0],"ti":[0,0.048,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":80,"s":[50,53.72,0],"e":[50,53.573,0],"to":[0,-0.048,0],"ti":[0,0.05,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":81,"s":[50,53.573,0],"e":[50,53.418,0],"to":[0,-0.05,0],"ti":[0,0.053,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":82,"s":[50,53.418,0],"e":[50,53.256,0],"to":[0,-0.053,0],"ti":[0,0.055,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":83,"s":[50,53.256,0],"e":[50,53.088,0],"to":[0,-0.055,0],"ti":[0,0.057,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":84,"s":[50,53.088,0],"e":[50,52.913,0],"to":[0,-0.057,0],"ti":[0,0.059,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":85,"s":[50,52.913,0],"e":[50,52.734,0],"to":[0,-0.059,0],"ti":[0,0.061,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":86,"s":[50,52.734,0],"e":[50,52.55,0],"to":[0,-0.061,0],"ti":[0,0.062,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":87,"s":[50,52.55,0],"e":[50,52.362,0],"to":[0,-0.062,0],"ti":[0,0.063,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":88,"s":[50,52.362,0],"e":[50,52.17,0],"to":[0,-0.063,0],"ti":[0,0.064,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":89,"s":[50,52.17,0],"e":[50,51.976,0],"to":[0,-0.064,0],"ti":[0,0.065,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":90,"s":[50,51.976,0],"e":[50,51.779,0],"to":[0,-0.065,0],"ti":[0,0.066,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":91,"s":[50,51.779,0],"e":[50,51.581,0],"to":[0,-0.066,0],"ti":[0,0.066,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":92,"s":[50,51.581,0],"e":[50,51.381,0],"to":[0,-0.066,0],"ti":[0,0.067,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":93,"s":[50,51.381,0],"e":[50,51.181,0],"to":[0,-0.067,0],"ti":[0,0.067,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":94,"s":[50,51.181,0],"e":[50,50.981,0],"to":[0,-0.067,0],"ti":[0,0.067,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":95,"s":[50,50.981,0],"e":[50,50.782,0],"to":[0,-0.067,0],"ti":[0,0.066,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":96,"s":[50,50.782,0],"e":[50,50.583,0],"to":[0,-0.066,0],"ti":[0,0.066,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":97,"s":[50,50.583,0],"e":[50,50.386,0],"to":[0,-0.066,0],"ti":[0,0.065,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":98,"s":[50,50.386,0],"e":[50,50.192,0],"to":[0,-0.065,0],"ti":[0,0.064,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":99,"s":[50,50.192,0],"e":[50,50,0],"to":[0,-0.064,0],"ti":[0,0.063,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":100,"s":[50,50,0],"e":[50,49.811,0],"to":[0,-0.063,0],"ti":[0,0.062,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":101,"s":[50,49.811,0],"e":[50,49.626,0],"to":[0,-0.062,0],"ti":[0,0.061,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":102,"s":[50,49.626,0],"e":[50,49.445,0],"to":[0,-0.061,0],"ti":[0,0.06,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":103,"s":[50,49.445,0],"e":[50,49.269,0],"to":[0,-0.06,0],"ti":[0,0.058,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":104,"s":[50,49.269,0],"e":[50,49.097,0],"to":[0,-0.058,0],"ti":[0,0.056,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":105,"s":[50,49.097,0],"e":[50,48.931,0],"to":[0,-0.056,0],"ti":[0,0.054,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":106,"s":[50,48.931,0],"e":[50,48.771,0],"to":[0,-0.054,0],"ti":[0,0.052,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":107,"s":[50,48.771,0],"e":[50,48.616,0],"to":[0,-0.052,0],"ti":[0,0.05,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":108,"s":[50,48.616,0],"e":[50,48.469,0],"to":[0,-0.05,0],"ti":[0,0.048,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":109,"s":[50,48.469,0],"e":[50,48.327,0],"to":[0,-0.048,0],"ti":[0,0.046,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":110,"s":[50,48.327,0],"e":[50,48.193,0],"to":[0,-0.046,0],"ti":[0,0.044,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":111,"s":[50,48.193,0],"e":[50,48.066,0],"to":[0,-0.044,0],"ti":[0,0.041,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":112,"s":[50,48.066,0],"e":[50,47.947,0],"to":[0,-0.041,0],"ti":[0,0.039,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":113,"s":[50,47.947,0],"e":[50,47.835,0],"to":[0,-0.039,0],"ti":[0,0.036,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":114,"s":[50,47.835,0],"e":[50,47.731,0],"to":[0,-0.036,0],"ti":[0,0.033,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":115,"s":[50,47.731,0],"e":[50,47.635,0],"to":[0,-0.033,0],"ti":[0,0.031,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":116,"s":[50,47.635,0],"e":[50,47.547,0],"to":[0,-0.031,0],"ti":[0,0.028,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":117,"s":[50,47.547,0],"e":[50,47.468,0],"to":[0,-0.028,0],"ti":[0,0.025,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":118,"s":[50,47.468,0],"e":[50,47.397,0],"to":[0,-0.025,0],"ti":[0,0.022,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":119,"s":[50,47.397,0],"e":[50,47.334,0],"to":[0,-0.022,0],"ti":[0,0.019,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":120,"s":[50,47.334,0],"e":[50,47.28,0],"to":[0,-0.019,0],"ti":[0,0.017,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":121,"s":[50,47.28,0],"e":[50,47.235,0],"to":[0,-0.017,0],"ti":[0,0.014,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":122,"s":[50,47.235,0],"e":[50,47.198,0],"to":[0,-0.014,0],"ti":[0,0.011,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":123,"s":[50,47.198,0],"e":[50,47.169,0],"to":[0,-0.011,0],"ti":[0,0.008,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":124,"s":[50,47.169,0],"e":[50,47.148,0],"to":[0,-0.008,0],"ti":[0,0.005,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":125,"s":[50,47.148,0],"e":[50,47.136,0],"to":[0,-0.005,0],"ti":[0,0.003,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":126,"s":[50,47.136,0],"e":[50,47.132,0],"to":[0,-0.003,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":127,"s":[50,47.132,0],"e":[50,47.136,0],"to":[0,0,0],"ti":[0,-0.003,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":128,"s":[50,47.136,0],"e":[50,47.148,0],"to":[0,0.003,0],"ti":[0,-0.005,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":129,"s":[50,47.148,0],"e":[50,47.168,0],"to":[0,0.005,0],"ti":[0,-0.008,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":130,"s":[50,47.168,0],"e":[50,47.196,0],"to":[0,0.008,0],"ti":[0,-0.01,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":131,"s":[50,47.196,0],"e":[50,47.23,0],"to":[0,0.01,0],"ti":[0,-0.013,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":132,"s":[50,47.23,0],"e":[50,47.272,0],"to":[0,0.013,0],"ti":[0,-0.015,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":133,"s":[50,47.272,0],"e":[50,47.321,0],"to":[0,0.015,0],"ti":[0,-0.017,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":134,"s":[50,47.321,0],"e":[50,47.376,0],"to":[0,0.017,0],"ti":[0,-0.02,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":135,"s":[50,47.376,0],"e":[50,47.438,0],"to":[0,0.02,0],"ti":[0,-0.022,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":136,"s":[50,47.438,0],"e":[50,47.506,0],"to":[0,0.022,0],"ti":[0,-0.024,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":137,"s":[50,47.506,0],"e":[50,47.58,0],"to":[0,0.024,0],"ti":[0,-0.026,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":138,"s":[50,47.58,0],"e":[50,47.659,0],"to":[0,0.026,0],"ti":[0,-0.027,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":139,"s":[50,47.659,0],"e":[50,47.744,0],"to":[0,0.027,0],"ti":[0,-0.029,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":140,"s":[50,47.744,0],"e":[50,47.833,0],"to":[0,0.029,0],"ti":[0,-0.031,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":141,"s":[50,47.833,0],"e":[50,47.927,0],"to":[0,0.031,0],"ti":[0,-0.032,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":142,"s":[50,47.927,0],"e":[50,48.025,0],"to":[0,0.032,0],"ti":[0,-0.033,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":143,"s":[50,48.025,0],"e":[50,48.127,0],"to":[0,0.033,0],"ti":[0,-0.035,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":144,"s":[50,48.127,0],"e":[50,48.233,0],"to":[0,0.035,0],"ti":[0,-0.036,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":145,"s":[50,48.233,0],"e":[50,48.342,0],"to":[0,0.036,0],"ti":[0,-0.037,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":146,"s":[50,48.342,0],"e":[50,48.453,0],"to":[0,0.037,0],"ti":[0,-0.038,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":147,"s":[50,48.453,0],"e":[50,48.567,0],"to":[0,0.038,0],"ti":[0,-0.038,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":148,"s":[50,48.567,0],"e":[50,48.684,0],"to":[0,0.038,0],"ti":[0,-0.039,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":149,"s":[50,48.684,0],"e":[50,48.801,0],"to":[0,0.039,0],"ti":[0,-0.04,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":150,"s":[50,48.801,0],"e":[50,48.921,0],"to":[0,0.04,0],"ti":[0,-0.04,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":151,"s":[50,48.921,0],"e":[50,49.041,0],"to":[0,0.04,0],"ti":[0,-0.04,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":152,"s":[50,49.041,0],"e":[50,49.162,0],"to":[0,0.04,0],"ti":[0,-0.04,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":153,"s":[50,49.162,0],"e":[50,49.284,0],"to":[0,0.04,0],"ti":[0,-0.04,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":154,"s":[50,49.284,0],"e":[50,49.405,0],"to":[0,0.04,0],"ti":[0,-0.04,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":155,"s":[50,49.405,0],"e":[50,49.526,0],"to":[0,0.04,0],"ti":[0,-0.04,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":156,"s":[50,49.526,0],"e":[50,49.646,0],"to":[0,0.04,0],"ti":[0,-0.04,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":157,"s":[50,49.646,0],"e":[50,49.766,0],"to":[0,0.04,0],"ti":[0,-0.04,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":158,"s":[50,49.766,0],"e":[50,49.884,0],"to":[0,0.04,0],"ti":[0,-0.039,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":159,"s":[50,49.884,0],"e":[50,50,0],"to":[0,0.039,0],"ti":[0,-0.038,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":160,"s":[50,50,0],"e":[50,50.114,0],"to":[0,0.038,0],"ti":[0,-0.038,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":161,"s":[50,50.114,0],"e":[50,50.227,0],"to":[0,0.038,0],"ti":[0,-0.037,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":162,"s":[50,50.227,0],"e":[50,50.336,0],"to":[0,0.037,0],"ti":[0,-0.036,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":163,"s":[50,50.336,0],"e":[50,50.443,0],"to":[0,0.036,0],"ti":[0,-0.035,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":164,"s":[50,50.443,0],"e":[50,50.548,0],"to":[0,0.035,0],"ti":[0,-0.034,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":165,"s":[50,50.548,0],"e":[50,50.648,0],"to":[0,0.034,0],"ti":[0,-0.033,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":166,"s":[50,50.648,0],"e":[50,50.746,0],"to":[0,0.033,0],"ti":[0,-0.032,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":167,"s":[50,50.746,0],"e":[50,50.839,0],"to":[0,0.032,0],"ti":[0,-0.031,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":168,"s":[50,50.839,0],"e":[50,50.929,0],"to":[0,0.031,0],"ti":[0,-0.029,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":169,"s":[50,50.929,0],"e":[50,51.015,0],"to":[0,0.029,0],"ti":[0,-0.028,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":170,"s":[50,51.015,0],"e":[50,51.096,0],"to":[0,0.028,0],"ti":[0,-0.026,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":171,"s":[50,51.096,0],"e":[50,51.173,0],"to":[0,0.026,0],"ti":[0,-0.025,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":172,"s":[50,51.173,0],"e":[50,51.245,0],"to":[0,0.025,0],"ti":[0,-0.023,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":173,"s":[50,51.245,0],"e":[50,51.313,0],"to":[0,0.023,0],"ti":[0,-0.022,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":174,"s":[50,51.313,0],"e":[50,51.376,0],"to":[0,0.022,0],"ti":[0,-0.02,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":175,"s":[50,51.376,0],"e":[50,51.434,0],"to":[0,0.02,0],"ti":[0,-0.019,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":176,"s":[50,51.434,0],"e":[50,51.488,0],"to":[0,0.019,0],"ti":[0,-0.017,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":177,"s":[50,51.488,0],"e":[50,51.536,0],"to":[0,0.017,0],"ti":[0,-0.015,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":178,"s":[50,51.536,0],"e":[50,51.579,0],"to":[0,0.015,0],"ti":[0,-0.014,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":179,"s":[50,51.579,0],"e":[50,51.617,0],"to":[0,0.014,0],"ti":[0,-0.012,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":180,"s":[50,51.617,0],"e":[50,51.65,0],"to":[0,0.012,0],"ti":[0,-0.01,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":181,"s":[50,51.65,0],"e":[50,51.677,0],"to":[0,0.01,0],"ti":[0,-0.008,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":182,"s":[50,51.677,0],"e":[50,51.7,0],"to":[0,0.008,0],"ti":[0,-0.007,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":183,"s":[50,51.7,0],"e":[50,51.717,0],"to":[0,0.007,0],"ti":[0,-0.005,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":184,"s":[50,51.717,0],"e":[50,51.73,0],"to":[0,0.005,0],"ti":[0,-0.003,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":185,"s":[50,51.73,0],"e":[50,51.737,0],"to":[0,0.003,0],"ti":[0,-0.002,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":186,"s":[50,51.737,0],"e":[50,51.739,0],"to":[0,0.002,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":187,"s":[50,51.739,0],"e":[50,51.737,0],"to":[0,0,0],"ti":[0,0.002,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":188,"s":[50,51.737,0],"e":[50,51.73,0],"to":[0,-0.002,0],"ti":[0,0.003,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":189,"s":[50,51.73,0],"e":[50,51.718,0],"to":[0,-0.003,0],"ti":[0,0.005,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":190,"s":[50,51.718,0],"e":[50,51.701,0],"to":[0,-0.005,0],"ti":[0,0.006,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":191,"s":[50,51.701,0],"e":[50,51.68,0],"to":[0,-0.006,0],"ti":[0,0.008,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":192,"s":[50,51.68,0],"e":[50,51.655,0],"to":[0,-0.008,0],"ti":[0,0.009,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":193,"s":[50,51.655,0],"e":[50,51.625,0],"to":[0,-0.009,0],"ti":[0,0.011,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":194,"s":[50,51.625,0],"e":[50,51.591,0],"to":[0,-0.011,0],"ti":[0,0.012,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":195,"s":[50,51.591,0],"e":[50,51.554,0],"to":[0,-0.012,0],"ti":[0,0.013,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":196,"s":[50,51.554,0],"e":[50,51.513,0],"to":[0,-0.013,0],"ti":[0,0.014,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":197,"s":[50,51.513,0],"e":[50,51.468,0],"to":[0,-0.014,0],"ti":[0,0.015,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":198,"s":[50,51.468,0],"e":[50,51.42,0],"to":[0,-0.015,0],"ti":[0,0.017,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":199,"s":[50,51.42,0],"e":[50,51.369,0],"to":[0,-0.017,0],"ti":[0,0.018,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":200,"s":[50,51.369,0],"e":[50,51.314,0],"to":[0,-0.018,0],"ti":[0,0.019,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":201,"s":[50,51.314,0],"e":[50,51.257,0],"to":[0,-0.019,0],"ti":[0,0.019,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":202,"s":[50,51.257,0],"e":[50,51.198,0],"to":[0,-0.019,0],"ti":[0,0.02,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":203,"s":[50,51.198,0],"e":[50,51.136,0],"to":[0,-0.02,0],"ti":[0,0.021,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":204,"s":[50,51.136,0],"e":[50,51.072,0],"to":[0,-0.021,0],"ti":[0,0.022,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":205,"s":[50,51.072,0],"e":[50,51.006,0],"to":[0,-0.022,0],"ti":[0,0.022,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":206,"s":[50,51.006,0],"e":[50,50.938,0],"to":[0,-0.022,0],"ti":[0,0.023,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":207,"s":[50,50.938,0],"e":[50,50.869,0],"to":[0,-0.023,0],"ti":[0,0.023,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":208,"s":[50,50.869,0],"e":[50,50.798,0],"to":[0,-0.023,0],"ti":[0,0.024,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":209,"s":[50,50.798,0],"e":[50,50.727,0],"to":[0,-0.024,0],"ti":[0,0.024,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":210,"s":[50,50.727,0],"e":[50,50.655,0],"to":[0,-0.024,0],"ti":[0,0.024,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":211,"s":[50,50.655,0],"e":[50,50.582,0],"to":[0,-0.024,0],"ti":[0,0.024,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":212,"s":[50,50.582,0],"e":[50,50.508,0],"to":[0,-0.024,0],"ti":[0,0.025,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":213,"s":[50,50.508,0],"e":[50,50.435,0],"to":[0,-0.025,0],"ti":[0,0.025,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":214,"s":[50,50.435,0],"e":[50,50.361,0],"to":[0,-0.025,0],"ti":[0,0.025,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":215,"s":[50,50.361,0],"e":[50,50.288,0],"to":[0,-0.025,0],"ti":[0,0.024,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":216,"s":[50,50.288,0],"e":[50,50.215,0],"to":[0,-0.024,0],"ti":[0,0.024,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":217,"s":[50,50.215,0],"e":[50,50.142,0],"to":[0,-0.024,0],"ti":[0,0.024,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":218,"s":[50,50.142,0],"e":[50,50.071,0],"to":[0,-0.024,0],"ti":[0,0.024,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":219,"s":[50,50.071,0],"e":[50,50,0],"to":[0,-0.024,0],"ti":[0,0.023,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":220,"s":[50,50,0],"e":[50,49.931,0],"to":[0,-0.023,0],"ti":[0,0.023,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":221,"s":[50,49.931,0],"e":[50,49.862,0],"to":[0,-0.023,0],"ti":[0,0.022,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":222,"s":[50,49.862,0],"e":[50,49.796,0],"to":[0,-0.022,0],"ti":[0,0.022,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":223,"s":[50,49.796,0],"e":[50,49.731,0],"to":[0,-0.022,0],"ti":[0,0.021,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":224,"s":[50,49.731,0],"e":[50,49.668,0],"to":[0,-0.021,0],"ti":[0,0.021,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":225,"s":[50,49.668,0],"e":[50,49.607,0],"to":[0,-0.021,0],"ti":[0,0.02,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":226,"s":[50,49.607,0],"e":[50,49.548,0],"to":[0,-0.02,0],"ti":[0,0.019,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":227,"s":[50,49.548,0],"e":[50,49.491,0],"to":[0,-0.019,0],"ti":[0,0.019,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":228,"s":[50,49.491,0],"e":[50,49.437,0],"to":[0,-0.019,0],"ti":[0,0.018,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":229,"s":[50,49.437,0],"e":[50,49.385,0],"to":[0,-0.018,0],"ti":[0,0.017,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":230,"s":[50,49.385,0],"e":[50,49.335,0],"to":[0,-0.017,0],"ti":[0,0.016,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":231,"s":[50,49.335,0],"e":[50,49.289,0],"to":[0,-0.016,0],"ti":[0,0.015,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":232,"s":[50,49.289,0],"e":[50,49.245,0],"to":[0,-0.015,0],"ti":[0,0.014,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":233,"s":[50,49.245,0],"e":[50,49.204,0],"to":[0,-0.014,0],"ti":[0,0.013,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":234,"s":[50,49.204,0],"e":[50,49.165,0],"to":[0,-0.013,0],"ti":[0,0.012,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":235,"s":[50,49.165,0],"e":[50,49.13,0],"to":[0,-0.012,0],"ti":[0,0.011,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":236,"s":[50,49.13,0],"e":[50,49.098,0],"to":[0,-0.011,0],"ti":[0,0.01,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":237,"s":[50,49.098,0],"e":[50,49.069,0],"to":[0,-0.01,0],"ti":[0,0.009,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":238,"s":[50,49.069,0],"e":[50,49.042,0],"to":[0,-0.009,0],"ti":[0,0.004,0]},{"t":239}],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[80,80,100],"ix":6}},"ao":0,"ef":[{"ty":5,"nm":"位置 - Overshoot","np":3,"mn":"ADBE Slider Control","ix":1,"en":1,"ef":[{"ty":0,"nm":"滑块","mn":"ADBE Slider Control-0001","ix":1,"v":{"a":0,"k":40,"ix":1,"x":"var $bm_rt;\n$bm_rt = clamp(value, 0, 100);"}}]},{"ty":5,"nm":"位置 - Bounce","np":3,"mn":"ADBE Slider Control","ix":2,"en":1,"ef":[{"ty":0,"nm":"滑块","mn":"ADBE Slider Control-0001","ix":1,"v":{"a":0,"k":10,"ix":1,"x":"var $bm_rt;\n$bm_rt = clamp(value, 0, 100);"}}]},{"ty":5,"nm":"位置 - Friction","np":3,"mn":"ADBE Slider Control","ix":3,"en":1,"ef":[{"ty":0,"nm":"滑块","mn":"ADBE Slider Control-0001","ix":1,"v":{"a":0,"k":10,"ix":1,"x":"var $bm_rt;\n$bm_rt = clamp(value, 0, 100);"}}]}],"shapes":[{"d":1,"ty":"el","s":{"a":0,"k":[60,60],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"椭圆路径","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"gf","o":{"a":0,"k":100,"ix":10},"r":1,"bm":0,"g":{"p":2,"k":{"a":0,"k":[0,1,0,0.7843,1,0,1,0.9725],"ix":9}},"s":{"a":1,"k":[{"i":{"x":0.6,"y":1},"o":{"x":0.4,"y":0},"t":0,"s":[-20,-20],"e":[20,-20],"to":[5.991,5.991],"ti":[-9.265,-9.265]},{"i":{"x":0.6,"y":1},"o":{"x":0.4,"y":0},"t":60,"s":[20,-20],"e":[20,20],"to":[1.045,1.045],"ti":[-0.676,-0.676]},{"i":{"x":0.6,"y":1},"o":{"x":0.4,"y":0},"t":120,"s":[20,20],"e":[20,-20],"to":[6.667,6.667],"ti":[-9.265,-9.265]},{"i":{"x":0.6,"y":1},"o":{"x":0.4,"y":0},"t":180,"s":[20,-20],"e":[-20,-20],"to":[1.045,1.045],"ti":[-6.667,-6.667]},{"t":239}],"ix":5},"e":{"a":1,"k":[{"i":{"x":0.6,"y":1},"o":{"x":0.4,"y":0},"t":0,"s":[20,20],"e":[-20,20],"to":[-5.991,-5.991],"ti":[9.265,9.265]},{"i":{"x":0.6,"y":1},"o":{"x":0.4,"y":0},"t":60,"s":[-20,20],"e":[-20,-20],"to":[-1.045,-1.045],"ti":[0.676,0.676]},{"i":{"x":0.6,"y":1},"o":{"x":0.4,"y":0},"t":120,"s":[-20,-20],"e":[-20,20],"to":[-6.667,-6.667],"ti":[9.265,9.265]},{"i":{"x":0.6,"y":1},"o":{"x":0.4,"y":0},"t":180,"s":[-20,20],"e":[20,20],"to":[-1.045,-1.045],"ti":[6.667,6.667]},{"t":239}],"ix":6},"t":1,"nm":"渐变标记","mn":"ADBE Vector Graphic - G-Fill","hd":false}],"ip":0,"op":240,"st":0,"bm":0}],"markers":[]}
\ No newline at end of file
diff --git a/docs/public/static/examples/v49.0.0/filesystem/App.js b/docs/public/static/examples/v49.0.0/filesystem/App.js
new file mode 100644
index 0000000000000..d7e0a9b24648f
--- /dev/null
+++ b/docs/public/static/examples/v49.0.0/filesystem/App.js
@@ -0,0 +1,88 @@
+import * as React from 'react';
+import { Text, View, StyleSheet, Image, Button, Platform } from 'react-native';
+
+import { addMultipleGifs, deleteAllGifs, getSingleGif } from './GifManagement';
+
+// those are Giphy.com ID's - they are hardcoded here,
+// but if you have Giphy API key - you can use findGifs() from gifFetching.ts
+const gifIds = ['YsTs5ltWtEhnq', 'cZ7rmKfFYOvYI', '11BCDu2iUc8Nvhryl7'];
+
+function AppMain() {
+ //download all gifs at startup
+ React.useEffect(() => {
+ (async () => {
+ await addMultipleGifs(gifIds);
+ })();
+
+ //and unload at the end
+ return () => {
+ deleteAllGifs();
+ };
+ }, []);
+
+ //file uri of selected gif
+ const [selectedUri, setUri] = React.useState(null);
+
+ const handleSelect = async id => {
+ try {
+ setUri(await getSingleGif(id));
+ } catch (e) {
+ console.error("Couldn't load gif", e);
+ }
+ };
+
+ const unloadAll = () => {
+ setUri(null);
+ deleteAllGifs();
+ };
+
+ return (
+
+ See contents of gifManagement.ts
+ Select one of the IDs
+
+ {gifIds.map((item, index) => (
+ handleSelect(item)} />
+ ))}
+
+
+
+ Selected URI: {selectedUri || 'none'}
+ {selectedUri != null && }
+
+ );
+}
+
+const styles = StyleSheet.create({
+ container: {
+ flex: 1,
+ paddingTop: 20,
+ justifyContent: 'center',
+ backgroundColor: '#ecf0f1',
+ padding: 8,
+ },
+ header: {
+ margin: 24,
+ fontSize: 18,
+ fontWeight: 'bold',
+ textAlign: 'center',
+ },
+ paragraph: {
+ textAlign: 'center',
+ marginBottom: 15,
+ },
+});
+
+function UnsupportedPlatform() {
+ return (
+
+
+ FileSystem doesn't support web. Run this on Android or iOS
+
+
+ );
+}
+
+export default function App() {
+ return Platform.OS === 'android' || Platform.OS === 'ios' ? : ;
+}
diff --git a/docs/public/static/examples/v49.0.0/filesystem/gifFetching.ts b/docs/public/static/examples/v49.0.0/filesystem/gifFetching.ts
new file mode 100644
index 0000000000000..d10151f1633a6
--- /dev/null
+++ b/docs/public/static/examples/v49.0.0/filesystem/gifFetching.ts
@@ -0,0 +1,39 @@
+/**
+ * If you have Giphy.com API key, you can use this functionality to fetch gif ID's
+ */
+
+const GIPHY_API_KEY = 'your API key for giphy.com';
+
+// this is only partial type
+// see https://developers.giphy.com/docs/api/endpoint
+type GiphyResponse = {
+ data: {
+ id: string;
+ }[];
+};
+
+/**
+ * Queries Giphy.com API to search for GIF files
+ * see https://developers.giphy.com/docs/api/endpoint
+ */
+export async function findGifs(phrase: string) {
+ const searchRequest = {
+ api_key: GIPHY_API_KEY,
+ q: phrase.trim(),
+ };
+
+ try {
+ const response = await fetch('https://api.giphy.com/v1/gifs/search', {
+ method: 'POST',
+ body: JSON.stringify(searchRequest),
+ });
+ const { data }: GiphyResponse = await response.json();
+
+ // this is not the recommended way, but for simplicity we need only GIF IDs
+ // to paste them into content URLs. Normally we should use URLs provided by this response
+ return data.map(item => item.id);
+ } catch (e) {
+ console.error('Unable to search for gifs', e);
+ return [];
+ }
+}
diff --git a/docs/public/static/examples/v49.0.0/filesystem/gifManagement.ts b/docs/public/static/examples/v49.0.0/filesystem/gifManagement.ts
new file mode 100644
index 0000000000000..f7473f9999152
--- /dev/null
+++ b/docs/public/static/examples/v49.0.0/filesystem/gifManagement.ts
@@ -0,0 +1,66 @@
+import * as FileSystem from 'expo-file-system';
+
+const gifDir = FileSystem.cacheDirectory + 'giphy/';
+const gifFileUri = (gifId: string) => gifDir + `gif_${gifId}_200.gif`;
+
+// see https://developers.giphy.com/docs/api/schema#image-object
+const gifUrl = (gifId: string) => `https://media1.giphy.com/media/${gifId}/200.gif`;
+
+/**
+ * Helper function
+ * Checks if gif directory exists. If not, creates it
+ */
+async function ensureDirExists() {
+ const dirInfo = await FileSystem.getInfoAsync(gifDir);
+ if (!dirInfo.exists) {
+ console.log("Gif directory doesn't exist, creating...");
+ await FileSystem.makeDirectoryAsync(gifDir, { intermediates: true });
+ }
+}
+
+/**
+ * Downloads all gifs specified as array of IDs
+ */
+export async function addMultipleGifs(gifIds: string[]) {
+ try {
+ await ensureDirExists();
+
+ console.log('Downloading', gifIds.length, 'gif files...');
+ await Promise.all(gifIds.map(id => FileSystem.downloadAsync(gifUrl(id), gifFileUri(id))));
+ } catch (e) {
+ console.error("Couldn't download gif files:", e);
+ }
+}
+
+/**
+ * Returns URI to our local gif file
+ * If our gif doesn't exist locally, it downloads it
+ */
+export async function getSingleGif(gifId: string) {
+ await ensureDirExists();
+
+ const fileUri = gifFileUri(gifId);
+ const fileInfo = await FileSystem.getInfoAsync(fileUri);
+
+ if (!fileInfo.exists) {
+ console.log("Gif isn't cached locally. Downloading...");
+ await FileSystem.downloadAsync(gifUrl(gifId), fileUri);
+ }
+
+ return fileUri;
+}
+
+/**
+ * Exports shareable URI - it can be shared outside your app
+ */
+export async function getGifContentUri(gifId: string) {
+ return FileSystem.getContentUriAsync(await getSingleGif(gifId));
+}
+
+/**
+ * Deletes whole giphy directory with all its content
+ */
+export async function deleteAllGifs() {
+ console.log('Deleting all GIF files...');
+ await FileSystem.deleteAsync(gifDir);
+}
diff --git a/docs/public/static/examples/v49.0.0/tutorial/01-layout/App.js b/docs/public/static/examples/v49.0.0/tutorial/01-layout/App.js
new file mode 100644
index 0000000000000..5f845dacf5ba5
--- /dev/null
+++ b/docs/public/static/examples/v49.0.0/tutorial/01-layout/App.js
@@ -0,0 +1,38 @@
+import { StatusBar } from 'expo-status-bar';
+import { StyleSheet, View } from 'react-native';
+
+import Button from './components/Button';
+import ImageViewer from './components/ImageViewer';
+
+const PlaceholderImage = require('./assets/images/background-image.png');
+
+export default function App() {
+ return (
+
+
+
+
+
+
+
+
+
+
+ );
+}
+
+const styles = StyleSheet.create({
+ container: {
+ flex: 1,
+ backgroundColor: '#25292e',
+ alignItems: 'center',
+ },
+ imageContainer: {
+ flex:1,
+ paddingTop: 58
+ },
+ footerContainer: {
+ flex: 1 / 3,
+ alignItems: 'center',
+ },
+});
diff --git a/docs/public/static/examples/v49.0.0/tutorial/01-layout/Button.js b/docs/public/static/examples/v49.0.0/tutorial/01-layout/Button.js
new file mode 100644
index 0000000000000..76fa63f529eab
--- /dev/null
+++ b/docs/public/static/examples/v49.0.0/tutorial/01-layout/Button.js
@@ -0,0 +1,55 @@
+import { StyleSheet, View, Pressable, Text } from 'react-native';
+import FontAwesome from '@expo/vector-icons/FontAwesome';
+
+export default function Button({ label, theme }) {
+ if (theme === "primary") {
+ return (
+
+ alert('You pressed a button.')}>
+
+ {label}
+
+
+ );
+ }
+
+ return (
+
+ alert('You pressed a button.')}>
+ {label}
+
+
+ );
+}
+
+const styles = StyleSheet.create({
+ buttonContainer: {
+ width: 320,
+ height: 68,
+ marginHorizontal: 20,
+ alignItems: 'center',
+ justifyContent: 'center',
+ padding: 3,
+ },
+ button: {
+ borderRadius: 10,
+ width: '100%',
+ height: '100%',
+ alignItems: 'center',
+ justifyContent: 'center',
+ flexDirection: 'row',
+ },
+ buttonIcon: {
+ paddingRight: 8,
+ },
+ buttonLabel: {
+ color: '#fff',
+ fontSize: 16,
+ },
+});
diff --git a/docs/public/static/examples/v49.0.0/tutorial/01-layout/ImageViewer.js b/docs/public/static/examples/v49.0.0/tutorial/01-layout/ImageViewer.js
new file mode 100644
index 0000000000000..b29f21c009691
--- /dev/null
+++ b/docs/public/static/examples/v49.0.0/tutorial/01-layout/ImageViewer.js
@@ -0,0 +1,15 @@
+import { StyleSheet, Image } from 'react-native';
+
+export default function ImageViewer({ placeholderImageSource }) {
+ return (
+
+ );
+}
+
+const styles = StyleSheet.create({
+ image: {
+ width: 320,
+ height: 440,
+ borderRadius: 18,
+ },
+});
diff --git a/docs/public/static/examples/v49.0.0/tutorial/02-image-picker/App.js b/docs/public/static/examples/v49.0.0/tutorial/02-image-picker/App.js
new file mode 100644
index 0000000000000..a62af880792b2
--- /dev/null
+++ b/docs/public/static/examples/v49.0.0/tutorial/02-image-picker/App.js
@@ -0,0 +1,55 @@
+import { useState } from 'react';
+import { StatusBar } from 'expo-status-bar';
+import { StyleSheet, View } from 'react-native';
+import * as ImagePicker from 'expo-image-picker';
+
+import Button from './components/Button';
+import ImageViewer from './components/ImageViewer';
+
+const PlaceholderImage = require('./assets/images/background-image.png');
+
+export default function App() {
+ const [selectedImage, setSelectedImage] = useState(null);
+
+ const pickImageAsync = async () => {
+ let result = await ImagePicker.launchImageLibraryAsync({
+ allowsEditing: true,
+ quality: 1,
+ });
+
+ if (!result.canceled) {
+ setSelectedImage(result.assets[0].uri);
+ } else {
+ alert("You did not select any image.");
+ }
+ };
+
+ return (
+
+
+
+
+
+
+
+
+
+
+ );
+}
+
+const styles = StyleSheet.create({
+ container: {
+ flex: 1,
+ backgroundColor: '#25292e',
+ alignItems: 'center',
+ },
+ imageContainer: {
+ flex:1,
+ paddingTop: 58
+ },
+ footerContainer: {
+ flex: 1 / 3,
+ alignItems: 'center',
+ },
+});
diff --git a/docs/public/static/examples/v49.0.0/tutorial/02-image-picker/Button.js b/docs/public/static/examples/v49.0.0/tutorial/02-image-picker/Button.js
new file mode 100644
index 0000000000000..c6766a0572f6b
--- /dev/null
+++ b/docs/public/static/examples/v49.0.0/tutorial/02-image-picker/Button.js
@@ -0,0 +1,53 @@
+import { StyleSheet, View, Pressable, Text } from 'react-native';
+import FontAwesome from '@expo/vector-icons/FontAwesome';
+
+export default function Button({ label, theme, onPress }) {
+ if (theme === "primary") {
+ return (
+
+
+
+ {label}
+
+
+ );
+ }
+
+ return (
+
+ alert('You pressed a button.')}>
+ {label}
+
+
+ );
+}
+
+const styles = StyleSheet.create({
+ buttonContainer: {
+ width: 320,
+ height: 68,
+ marginHorizontal: 20,
+ alignItems: 'center',
+ justifyContent: 'center',
+ padding: 3,
+ },
+ button: {
+ borderRadius: 10,
+ width: '100%',
+ height: '100%',
+ alignItems: 'center',
+ justifyContent: 'center',
+ flexDirection: 'row',
+ },
+ buttonLabel: {
+ color: '#fff',
+ fontSize: 16,
+ },
+ buttonIcon: {
+ paddingRight: 8,
+ },
+});
diff --git a/docs/public/static/examples/v49.0.0/tutorial/02-image-picker/ImageViewer.js b/docs/public/static/examples/v49.0.0/tutorial/02-image-picker/ImageViewer.js
new file mode 100644
index 0000000000000..d0e2149e91744
--- /dev/null
+++ b/docs/public/static/examples/v49.0.0/tutorial/02-image-picker/ImageViewer.js
@@ -0,0 +1,16 @@
+import { StyleSheet, Image } from 'react-native';
+
+export default function ImageViewer({ placeholderImageSource, selectedImage }) {
+ const imageSource =
+ selectedImage !== null ? { uri: selectedImage } : placeholderImageSource;
+
+ return ;
+}
+
+const styles = StyleSheet.create({
+ image: {
+ width: 320,
+ height: 440,
+ borderRadius: 18,
+ },
+});
diff --git a/docs/public/static/examples/v49.0.0/tutorial/03-button-options/App.js b/docs/public/static/examples/v49.0.0/tutorial/03-button-options/App.js
new file mode 100644
index 0000000000000..ef30cd67ee899
--- /dev/null
+++ b/docs/public/static/examples/v49.0.0/tutorial/03-button-options/App.js
@@ -0,0 +1,92 @@
+import { useState } from 'react';
+import { StatusBar } from 'expo-status-bar';
+import { StyleSheet, View } from 'react-native';
+import * as ImagePicker from 'expo-image-picker';
+
+import Button from './components/Button';
+import ImageViewer from './components/ImageViewer';
+import CircleButton from './components/CircleButton';
+import IconButton from './components/IconButton';
+
+const PlaceholderImage = require('./assets/images/background-image.png');
+
+export default function App() {
+ const [showAppOptions, setShowAppOptions] = useState(false);
+ const [selectedImage, setSelectedImage] = useState(null);
+
+ const pickImageAsync = async () => {
+ let result = await ImagePicker.launchImageLibraryAsync({
+ allowsEditing: true,
+ quality: 1,
+ });
+
+ if (!result.canceled) {
+ setSelectedImage(result.assets[0].uri);
+ setShowAppOptions(true);
+ } else {
+ alert("You did not select any image.");
+ }
+ };
+
+ const onReset = () => {
+ setShowAppOptions(false);
+ };
+
+ const onAddSticker = () => {
+ // we will implement this later
+ };
+
+ const onSaveImageAsync = async () => {
+ // we will implement this later
+ };
+
+ return (
+
+
+
+
+ {showAppOptions ? (
+
+
+
+
+
+
+
+ ) : (
+
+
+ setShowAppOptions(true)}
+ />
+
+ )}
+
+
+ );
+}
+
+const styles = StyleSheet.create({
+ container: {
+ flex: 1,
+ backgroundColor: '#25292e',
+ alignItems: 'center',
+ },
+ imageContainer: {
+ flex:1,
+ paddingTop: 58
+ },
+ footerContainer: {
+ flex: 1 / 3,
+ alignItems: 'center',
+ },
+ optionsContainer: {
+ position: "absolute",
+ bottom: 80,
+ },
+ optionsRow: {
+ alignItems: 'center',
+ flexDirection: 'row',
+ },
+});
diff --git a/docs/public/static/examples/v49.0.0/tutorial/03-button-options/Button.js b/docs/public/static/examples/v49.0.0/tutorial/03-button-options/Button.js
new file mode 100644
index 0000000000000..4f909ef9f7521
--- /dev/null
+++ b/docs/public/static/examples/v49.0.0/tutorial/03-button-options/Button.js
@@ -0,0 +1,53 @@
+import { StyleSheet, View, Pressable, Text } from 'react-native';
+import FontAwesome from '@expo/vector-icons/FontAwesome';
+
+export default function Button({ label, theme, onPress }) {
+ if (theme === "primary") {
+ return (
+
+
+
+ {label}
+
+
+ );
+ }
+
+ return (
+
+
+ {label}
+
+
+ );
+}
+
+const styles = StyleSheet.create({
+ buttonContainer: {
+ width: 320,
+ height: 68,
+ marginHorizontal: 20,
+ alignItems: 'center',
+ justifyContent: 'center',
+ padding: 3,
+ },
+ button: {
+ borderRadius: 10,
+ width: '100%',
+ height: '100%',
+ alignItems: 'center',
+ justifyContent: 'center',
+ flexDirection: 'row',
+ },
+ buttonLabel: {
+ color: '#fff',
+ fontSize: 16,
+ },
+ buttonIcon: {
+ paddingRight: 8,
+ },
+});
diff --git a/docs/public/static/examples/v49.0.0/tutorial/03-button-options/CircleButton.js b/docs/public/static/examples/v49.0.0/tutorial/03-button-options/CircleButton.js
new file mode 100644
index 0000000000000..476a07b11b61c
--- /dev/null
+++ b/docs/public/static/examples/v49.0.0/tutorial/03-button-options/CircleButton.js
@@ -0,0 +1,31 @@
+import { View, Pressable, StyleSheet } from 'react-native';
+import MaterialIcons from '@expo/vector-icons/MaterialIcons';
+
+export default function CircleButton({ onPress }) {
+ return (
+
+
+
+
+
+ );
+}
+
+const styles = StyleSheet.create({
+ circleButtonContainer: {
+ width: 84,
+ height: 84,
+ marginHorizontal: 60,
+ borderWidth: 4,
+ borderColor: "#ffd33d",
+ borderRadius: 42,
+ padding: 3,
+ },
+ circleButton: {
+ flex: 1,
+ justifyContent: "center",
+ alignItems: "center",
+ borderRadius: 42,
+ backgroundColor: "#fff",
+ },
+});
diff --git a/docs/public/static/examples/v49.0.0/tutorial/03-button-options/IconButton.js b/docs/public/static/examples/v49.0.0/tutorial/03-button-options/IconButton.js
new file mode 100644
index 0000000000000..f250eb7908875
--- /dev/null
+++ b/docs/public/static/examples/v49.0.0/tutorial/03-button-options/IconButton.js
@@ -0,0 +1,22 @@
+import { Pressable, StyleSheet, Text } from 'react-native';
+import MaterialIcons from '@expo/vector-icons/MaterialIcons';
+
+export default function IconButton({ icon, label, onPress }) {
+ return (
+
+
+ {label}
+
+ );
+}
+
+const styles = StyleSheet.create({
+ iconButton: {
+ justifyContent: 'center',
+ alignItems: 'center',
+ },
+ iconButtonLabel: {
+ color: '#fff',
+ marginTop: 12,
+ },
+});
diff --git a/docs/public/static/examples/v49.0.0/tutorial/04-modal/App.js b/docs/public/static/examples/v49.0.0/tutorial/04-modal/App.js
new file mode 100644
index 0000000000000..db7a04feadbe7
--- /dev/null
+++ b/docs/public/static/examples/v49.0.0/tutorial/04-modal/App.js
@@ -0,0 +1,102 @@
+import { useState } from 'react';
+import { StatusBar } from 'expo-status-bar';
+import { StyleSheet, View } from 'react-native';
+import * as ImagePicker from 'expo-image-picker';
+
+import Button from './components/Button';
+import ImageViewer from './components/ImageViewer';
+import CircleButton from './components/CircleButton';
+import IconButton from './components/IconButton';
+import EmojiPicker from './components/EmojiPicker';
+
+const PlaceholderImage = require('./assets/images/background-image.png');
+
+export default function App() {
+ const [isModalVisible, setIsModalVisible] = useState(false);
+ const [showAppOptions, setShowAppOptions] = useState(false);
+ const [selectedImage, setSelectedImage] = useState(null);
+
+ const pickImageAsync = async () => {
+ let result = await ImagePicker.launchImageLibraryAsync({
+ allowsEditing: true,
+ quality: 1,
+ });
+
+ if (!result.canceled) {
+ setSelectedImage(result.assets[0].uri);
+ setShowAppOptions(true);
+ } else {
+ alert('You did not select any image.');
+ }
+ };
+
+ const onReset = () => {
+ setShowAppOptions(false);
+ };
+
+ const onSaveImageAsync = async () => {
+ // we will implement this later
+ };
+
+ const onAddSticker = () => {
+ setIsModalVisible(true);
+ };
+
+ const onModalClose = () => {
+ setIsModalVisible(false);
+ };
+
+
+ return (
+
+
+
+
+ {showAppOptions ? (
+
+
+
+
+
+
+
+ ) : (
+
+
+ setShowAppOptions(true)}
+ />
+
+ )}
+
+ {/* A list of emoji component will go here */}
+
+
+
+ );
+}
+
+const styles = StyleSheet.create({
+ container: {
+ flex: 1,
+ backgroundColor: '#25292e',
+ alignItems: 'center',
+ },
+ imageContainer: {
+ flex:1,
+ paddingTop: 58
+ },
+ footerContainer: {
+ flex: 1 / 3,
+ alignItems: 'center',
+ },
+ optionsContainer: {
+ position: "absolute",
+ bottom: 80,
+ },
+ optionsRow: {
+ alignItems: 'center',
+ flexDirection: 'row',
+ },
+});
diff --git a/docs/public/static/examples/v49.0.0/tutorial/04-modal/EmojiPicker.js b/docs/public/static/examples/v49.0.0/tutorial/04-modal/EmojiPicker.js
new file mode 100644
index 0000000000000..0672bd20c66a8
--- /dev/null
+++ b/docs/public/static/examples/v49.0.0/tutorial/04-modal/EmojiPicker.js
@@ -0,0 +1,44 @@
+import { Modal, View, Text, Pressable, StyleSheet } from 'react-native';
+import MaterialIcons from '@expo/vector-icons/MaterialIcons';
+
+export default function EmojiPicker({ isVisible, children, onClose }) {
+ return (
+
+
+
+ Choose a sticker
+
+
+
+
+ {children}
+
+
+ );
+}
+
+const styles = StyleSheet.create({
+ modalContent: {
+ height: '25%',
+ width: '100%',
+ backgroundColor: '#25292e',
+ borderTopRightRadius: 18,
+ borderTopLeftRadius: 18,
+ position: 'absolute',
+ bottom: 0,
+ },
+ titleContainer: {
+ height: '16%',
+ backgroundColor: '#464C55',
+ borderTopRightRadius: 10,
+ borderTopLeftRadius: 10,
+ paddingHorizontal: 20,
+ flexDirection: 'row',
+ alignItems: 'center',
+ justifyContent: 'space-between',
+ },
+ title: {
+ color: '#fff',
+ fontSize: 16,
+ },
+});
diff --git a/docs/public/static/examples/v49.0.0/tutorial/05-emoji-list/App.js b/docs/public/static/examples/v49.0.0/tutorial/05-emoji-list/App.js
new file mode 100644
index 0000000000000..0443e06d52d51
--- /dev/null
+++ b/docs/public/static/examples/v49.0.0/tutorial/05-emoji-list/App.js
@@ -0,0 +1,107 @@
+import { useState } from 'react';
+import { StatusBar } from 'expo-status-bar';
+import { StyleSheet, View } from 'react-native';
+import * as ImagePicker from 'expo-image-picker';
+
+import Button from './components/Button';
+import ImageViewer from './components/ImageViewer';
+import CircleButton from './components/CircleButton';
+import IconButton from './components/IconButton';
+import EmojiPicker from './components/EmojiPicker';
+import EmojiList from './components/EmojiList';
+import EmojiSticker from './components/EmojiSticker';
+
+const PlaceholderImage = require('./assets/images/background-image.png');
+
+export default function App() {
+ const [isModalVisible, setIsModalVisible] = useState(false);
+ const [showAppOptions, setShowAppOptions] = useState(false);
+ const [pickedEmoji, setPickedEmoji] = useState(null);
+ const [selectedImage, setSelectedImage] = useState(null);
+
+ const pickImageAsync = async () => {
+ let result = await ImagePicker.launchImageLibraryAsync({
+ allowsEditing: true,
+ quality: 1,
+ });
+
+ if (!result.canceled) {
+ setSelectedImage(result.assets[0].uri);
+ setShowAppOptions(true);
+ } else {
+ alert('You did not select any image.');
+ }
+ };
+
+ const onReset = () => {
+ setShowAppOptions(false);
+ };
+
+
+ const onAddSticker = () => {
+ setIsModalVisible(true);
+ };
+
+ const onModalClose = () => {
+ setIsModalVisible(false);
+ };
+
+ const onSaveImageAsync = async () => {
+ // we will implement this later
+ };
+
+ return (
+
+
+
+ {pickedEmoji !== null ? : null}
+
+ {showAppOptions ? (
+
+
+
+
+
+
+
+ ) : (
+
+
+ setShowAppOptions(true)}
+ />
+
+ )}
+
+
+
+
+
+ );
+}
+
+const styles = StyleSheet.create({
+ container: {
+ flex: 1,
+ backgroundColor: '#25292e',
+ alignItems: 'center',
+ },
+ imageContainer: {
+ flex:1,
+ paddingTop: 58
+ },
+ footerContainer: {
+ flex: 1 / 3,
+ alignItems: 'center',
+ },
+ optionsContainer: {
+ position: 'absolute',
+ bottom: 80,
+ },
+ optionsRow: {
+ alignItems: 'center',
+ flexDirection: 'row',
+ justifyContent: 'center',
+ },
+});
diff --git a/docs/public/static/examples/v49.0.0/tutorial/05-emoji-list/EmojiList.js b/docs/public/static/examples/v49.0.0/tutorial/05-emoji-list/EmojiList.js
new file mode 100644
index 0000000000000..b30f874c69328
--- /dev/null
+++ b/docs/public/static/examples/v49.0.0/tutorial/05-emoji-list/EmojiList.js
@@ -0,0 +1,49 @@
+import { useState } from 'react';
+import { StyleSheet, FlatList, Image, Platform, Pressable } from 'react-native';
+
+export default function EmojiList({ onSelect, onCloseModal }) {
+ const [emoji] = useState([
+ require('../assets/images/emoji1.png'),
+ require('../assets/images/emoji2.png'),
+ require('../assets/images/emoji3.png'),
+ require('../assets/images/emoji4.png'),
+ require('../assets/images/emoji5.png'),
+ require('../assets/images/emoji6.png'),
+ ]);
+
+ return (
+ {
+ return (
+ {
+ onSelect(item);
+ onCloseModal();
+ }}>
+
+
+ );
+ }}
+ />
+ );
+}
+
+const styles = StyleSheet.create({
+ listContainer: {
+ borderTopRightRadius: 10,
+ borderTopLeftRadius: 10,
+ paddingHorizontal: 20,
+ flexDirection: 'row',
+ alignItems: 'center',
+ justifyContent: 'space-between',
+ },
+ image: {
+ width: 100,
+ height: 100,
+ marginRight: 20,
+ },
+});
diff --git a/docs/public/static/examples/v49.0.0/tutorial/05-emoji-list/EmojiSticker.js b/docs/public/static/examples/v49.0.0/tutorial/05-emoji-list/EmojiSticker.js
new file mode 100644
index 0000000000000..af8e7d57610a8
--- /dev/null
+++ b/docs/public/static/examples/v49.0.0/tutorial/05-emoji-list/EmojiSticker.js
@@ -0,0 +1,13 @@
+import { View, Image } from 'react-native';
+
+export default function EmojiSticker({ imageSize, stickerSource }) {
+ return (
+
+
+
+ );
+}
diff --git a/docs/public/static/examples/v49.0.0/tutorial/06-gestures/App.js b/docs/public/static/examples/v49.0.0/tutorial/06-gestures/App.js
new file mode 100644
index 0000000000000..27ee1f6f9a52e
--- /dev/null
+++ b/docs/public/static/examples/v49.0.0/tutorial/06-gestures/App.js
@@ -0,0 +1,106 @@
+import { useState } from 'react';
+import { StatusBar } from 'expo-status-bar';
+import { StyleSheet, View } from 'react-native';
+import * as ImagePicker from 'expo-image-picker';
+import { GestureHandlerRootView } from 'react-native-gesture-handler';
+
+import Button from './components/Button';
+import ImageViewer from './components/ImageViewer';
+import CircleButton from './components/CircleButton';
+import IconButton from './components/IconButton';
+import EmojiPicker from './components/EmojiPicker';
+import EmojiList from './components/EmojiList';
+import EmojiSticker from './components/EmojiSticker';
+
+const PlaceholderImage = require('./assets/images/background-image.png');
+
+export default function App() {
+ const [isModalVisible, setIsModalVisible] = useState(false);
+ const [showAppOptions, setShowAppOptions] = useState(false);
+ const [pickedEmoji, setPickedEmoji] = useState(null);
+ const [selectedImage, setSelectedImage] = useState(null);
+
+ const pickImageAsync = async () => {
+ let result = await ImagePicker.launchImageLibraryAsync({
+ allowsEditing: true,
+ quality: 1,
+ });
+
+ if (!result.canceled) {
+ setSelectedImage(result.assets[0].uri);
+ setShowAppOptions(true);
+ } else {
+ alert('You did not select any image.');
+ }
+ };
+
+ const onReset = () => {
+ setShowAppOptions(false);
+ };
+
+ const onAddSticker = () => {
+ setIsModalVisible(true);
+ };
+
+ const onModalClose = () => {
+ setIsModalVisible(false);
+ };
+
+ const onSaveImageAsync = async () => {
+ // we will implement this later
+ };
+
+ return (
+
+
+
+ {pickedEmoji !== null ? : null}
+
+ {showAppOptions ? (
+
+
+
+
+
+
+
+ ) : (
+
+
+ setShowAppOptions(true)}
+ />
+
+ )}
+
+
+
+
+
+ );
+}
+
+const styles = StyleSheet.create({
+ container: {
+ flex: 1,
+ backgroundColor: '#25292e',
+ alignItems: 'center',
+ },
+ imageContainer: {
+ flex:1,
+ paddingTop: 58
+ },
+ footerContainer: {
+ flex: 1 / 3,
+ alignItems: 'center',
+ },
+ optionsContainer: {
+ position: 'absolute',
+ bottom: 80,
+ },
+ optionsRow: {
+ alignItems: 'center',
+ flexDirection: 'row',
+ justifyContent: 'center',
+ },
+});
diff --git a/docs/public/static/examples/v49.0.0/tutorial/06-gestures/CompleteEmojiSticker.js b/docs/public/static/examples/v49.0.0/tutorial/06-gestures/CompleteEmojiSticker.js
new file mode 100644
index 0000000000000..b164c6eade18d
--- /dev/null
+++ b/docs/public/static/examples/v49.0.0/tutorial/06-gestures/CompleteEmojiSticker.js
@@ -0,0 +1,70 @@
+import { View, Image } from 'react-native';
+import { PanGestureHandler, TapGestureHandler } from 'react-native-gesture-handler';
+import Animated, {
+ useAnimatedStyle,
+ useSharedValue,
+ useAnimatedGestureHandler,
+ withSpring,
+} from 'react-native-reanimated';
+
+const AnimatedImage = Animated.createAnimatedComponent(Image);
+const AnimatedView = Animated.createAnimatedComponent(View);
+
+export default function EmojiSticker({ imageSize, stickerSource }) {
+ const translateX = useSharedValue(0);
+ const translateY = useSharedValue(0);
+ const scaleImage = useSharedValue(imageSize);
+
+ const imageStyle = useAnimatedStyle(() => {
+ return {
+ width: withSpring(scaleImage.value),
+ height: withSpring(scaleImage.value),
+ };
+ });
+
+ const onDoubleTap = useAnimatedGestureHandler({
+ onActive: () => {
+ if (scaleImage.value !== imageSize * 2) {
+ scaleImage.value = scaleImage.value * 2;
+ }
+ },
+ });
+
+ const onDrag = useAnimatedGestureHandler({
+ onStart: (event, context) => {
+ context.translateX = translateX.value;
+ context.translateY = translateY.value;
+ },
+ onActive: (event, context) => {
+ translateX.value = event.translationX + context.translateX;
+ translateY.value = event.translationY + context.translateY;
+ },
+ });
+
+ const containerStyle = useAnimatedStyle(() => {
+ return {
+ transform: [
+ {
+ translateX: translateX.value,
+ },
+ {
+ translateY: translateY.value,
+ },
+ ],
+ };
+ });
+
+ return (
+
+
+
+
+
+
+
+ );
+}
diff --git a/docs/public/static/examples/v49.0.0/tutorial/06-gestures/EmojiSticker.js b/docs/public/static/examples/v49.0.0/tutorial/06-gestures/EmojiSticker.js
new file mode 100644
index 0000000000000..0a5d1e667d8df
--- /dev/null
+++ b/docs/public/static/examples/v49.0.0/tutorial/06-gestures/EmojiSticker.js
@@ -0,0 +1,41 @@
+import { View, Image } from 'react-native';
+import { TapGestureHandler } from 'react-native-gesture-handler';
+import Animated, {
+ useSharedValue,
+ useAnimatedGestureHandler,
+ useAnimatedStyle,
+ withSpring,
+} from 'react-native-reanimated';
+
+const AnimatedImage = Animated.createAnimatedComponent(Image);
+
+export default function EmojiSticker({ imageSize, stickerSource }) {
+ const scaleImage = useSharedValue(imageSize);
+
+ const onDoubleTap = useAnimatedGestureHandler({
+ onActive: () => {
+ if (scaleImage.value !== imageSize * 2) {
+ scaleImage.value = scaleImage.value * 2;
+ }
+ },
+ });
+
+ const imageStyle = useAnimatedStyle(() => {
+ return {
+ width: withSpring(scaleImage.value),
+ height: withSpring(scaleImage.value),
+ };
+ });
+
+ return (
+
+
+
+
+
+ );
+}
diff --git a/docs/public/static/examples/v49.0.0/tutorial/07-screenshot/App.js b/docs/public/static/examples/v49.0.0/tutorial/07-screenshot/App.js
new file mode 100644
index 0000000000000..614e2a99ad952
--- /dev/null
+++ b/docs/public/static/examples/v49.0.0/tutorial/07-screenshot/App.js
@@ -0,0 +1,136 @@
+import { useState, useRef } from 'react';
+import { StatusBar } from 'expo-status-bar';
+import { StyleSheet, View } from 'react-native';
+import * as ImagePicker from 'expo-image-picker';
+import { GestureHandlerRootView } from 'react-native-gesture-handler';
+import * as MediaLibrary from 'expo-media-library';
+import { captureRef } from 'react-native-view-shot';
+
+import Button from './components/Button';
+import ImageViewer from './components/ImageViewer';
+import CircleButton from './components/CircleButton';
+import IconButton from './components/IconButton';
+import EmojiPicker from './components/EmojiPicker';
+import EmojiList from './components/EmojiList';
+import EmojiSticker from './components/EmojiSticker';
+
+const PlaceholderImage = require('./assets/images/background-image.png');
+
+export default function App() {
+ const [isModalVisible, setIsModalVisible] = useState(false);
+ const [showAppOptions, setShowAppOptions] = useState(false);
+ const [pickedEmoji, setPickedEmoji] = useState(null);
+ const [selectedImage, setSelectedImage] = useState(null);
+
+ const [status, requestPermission] = MediaLibrary.usePermissions();
+ const imageRef = useRef();
+
+ if (status === null) {
+ requestPermission();
+ }
+
+ const pickImageAsync = async () => {
+ let result = await ImagePicker.launchImageLibraryAsync({
+ allowsEditing: true,
+ quality: 1,
+ });
+
+ if (!result.canceled) {
+ setSelectedImage(result.assets[0].uri);
+ setShowAppOptions(true);
+ } else {
+ alert('You did not select any image.');
+ }
+ };
+
+ const onReset = () => {
+ setShowAppOptions(false);
+ };
+
+ const onAddSticker = () => {
+ setIsModalVisible(true);
+ };
+
+ const onModalClose = () => {
+ setIsModalVisible(false);
+ };
+
+
+ const onSaveImageAsync = async () => {
+ try {
+ const localUri = await captureRef(imageRef, {
+ height: 440,
+ quality: 1,
+ });
+
+ await MediaLibrary.saveToLibraryAsync(localUri);
+ if (localUri) {
+ alert("Saved!");
+ }
+ } catch (e) {
+ console.log(e);
+ }
+ };
+
+ return (
+
+
+
+
+ {pickedEmoji !== null ? (
+
+ ) : null}
+
+
+ {showAppOptions ? (
+
+
+
+
+
+
+
+ ) : (
+
+
+ setShowAppOptions(true)}
+ />
+
+ )}
+
+
+
+
+
+ );
+}
+
+const styles = StyleSheet.create({
+ container: {
+ flex: 1,
+ backgroundColor: '#25292e',
+ alignItems: 'center',
+ },
+ imageContainer: {
+ flex:1,
+ paddingTop: 58
+ },
+ footerContainer: {
+ flex: 1 / 3,
+ alignItems: 'center',
+ },
+ optionsContainer: {
+ position: 'absolute',
+ bottom: 80,
+ },
+ optionsRow: {
+ alignItems: 'center',
+ flexDirection: 'row',
+ justifyContent: 'center',
+ },
+});
diff --git a/docs/public/static/examples/v49.0.0/tutorial/08-run-on-web/App.js b/docs/public/static/examples/v49.0.0/tutorial/08-run-on-web/App.js
new file mode 100644
index 0000000000000..179796980d5ee
--- /dev/null
+++ b/docs/public/static/examples/v49.0.0/tutorial/08-run-on-web/App.js
@@ -0,0 +1,152 @@
+import { useState, useRef } from 'react';
+import { StatusBar } from 'expo-status-bar';
+import { StyleSheet, View, Platform } from 'react-native';
+import * as ImagePicker from 'expo-image-picker';
+import { GestureHandlerRootView } from 'react-native-gesture-handler';
+import * as MediaLibrary from 'expo-media-library';
+import { captureRef } from 'react-native-view-shot';
+import domtoimage from 'dom-to-image';
+
+import Button from './components/Button';
+import ImageViewer from './components/ImageViewer';
+import CircleButton from './components/CircleButton';
+import IconButton from './components/IconButton';
+import EmojiPicker from './components/EmojiPicker';
+import EmojiList from './components/EmojiList';
+import EmojiSticker from './components/EmojiSticker';
+
+const PlaceholderImage = require('./assets/images/background-image.png');
+
+export default function App() {
+ const [isModalVisible, setIsModalVisible] = useState(false);
+ const [showAppOptions, setShowAppOptions] = useState(false);
+ const [pickedEmoji, setPickedEmoji] = useState(null);
+ const [selectedImage, setSelectedImage] = useState(null);
+
+ const [status, requestPermission] = MediaLibrary.usePermissions();
+ const imageRef = useRef();
+
+ if (status === null) {
+ requestPermission();
+ }
+
+ const pickImageAsync = async () => {
+ let result = await ImagePicker.launchImageLibraryAsync({
+ allowsEditing: true,
+ quality: 1,
+ });
+
+ if (!result.canceled) {
+ setSelectedImage(result.assets[0].uri);
+ setShowAppOptions(true);
+ } else {
+ alert('You did not select any image.');
+ }
+ };
+
+ const onReset = () => {
+ setShowAppOptions(false);
+ };
+
+ const onAddSticker = () => {
+ setIsModalVisible(true);
+ };
+
+ const onModalClose = () => {
+ setIsModalVisible(false);
+ };
+
+ const onSaveImageAsync = async () => {
+ if (Platform.OS !== 'web') {
+ try {
+ const localUri = await captureRef(imageRef, {
+ height: 440,
+ quality: 1,
+ });
+ await MediaLibrary.saveToLibraryAsync(localUri);
+ if (localUri) {
+ alert('Saved!');
+ }
+ } catch (e) {
+ console.log(e);
+ }
+ } else {
+ try {
+ const dataUrl = await domtoimage.toJpeg(imageRef.current, {
+ quality: 0.95,
+ width: 320,
+ height: 440,
+ });
+
+ let link = document.createElement('a');
+ link.download = 'sticker-smash.jpeg';
+ link.href = dataUrl;
+ link.click();
+ } catch (e) {
+ console.log(e);
+ }
+ }
+ };
+
+ return (
+
+
+
+
+ {pickedEmoji !== null ? (
+
+ ) : null}
+
+
+ {showAppOptions ? (
+
+
+
+
+
+
+
+ ) : (
+
+
+ setShowAppOptions(true)}
+ />
+
+ )}
+
+
+
+
+
+ );
+}
+
+const styles = StyleSheet.create({
+ container: {
+ flex: 1,
+ backgroundColor: '#25292e',
+ alignItems: 'center',
+ },
+ imageContainer: {
+ flex: 1,
+ paddingTop: 58
+ },
+ footerContainer: {
+ flex: 1 / 3,
+ alignItems: 'center',
+ },
+ optionsContainer: {
+ position: 'absolute',
+ bottom: 80,
+ },
+ optionsRow: {
+ alignItems: 'center',
+ flexDirection: 'row',
+ justifyContent: 'center',
+ }
+});
diff --git a/docs/public/static/schemas/unversioned/app-config-schema.json b/docs/public/static/schemas/unversioned/app-config-schema.json
index 0bfc8f8f56695..c14f5e6d6425d 100644
--- a/docs/public/static/schemas/unversioned/app-config-schema.json
+++ b/docs/public/static/schemas/unversioned/app-config-schema.json
@@ -1 +1 @@
-{"name":{"description":"The name of your app as it appears both within Expo Go and on your home screen as a standalone app.","type":"string","meta":{"bareWorkflow":"To change the name of your app, edit the 'Display Name' field in Xcode and the `app_name` string in `android/app/src/main/res/values/strings.xml`"}},"description":{"description":"A short description of what your app is and why it is great.","type":"string"},"slug":{"description":"The friendly URL name for publishing. For example, `myAppName` will refer to the `expo.dev/@project-owner/myAppName` project.","type":"string","pattern":"^[a-zA-Z0-9_\\-]+$"},"owner":{"description":"The name of the Expo account that owns the project. This is useful for teams collaborating on a project. If not provided, the owner defaults to the username of the current user.","type":"string","minLength":1},"currentFullName":{"description":"The auto generated Expo account name and slug used for display purposes. It is not meant to be set directly. Formatted like `@username/slug`. When unauthenticated, the username is `@anonymous`. For published projects, this value may change when a project is transferred between accounts or renamed.","type":"string","meta":{"autogenerated":true}},"originalFullName":{"description":"The auto generated Expo account name and slug used for services like Notifications and AuthSession proxy. It is not meant to be set directly. Formatted like `@username/slug`. When unauthenticated, the username is `@anonymous`. For published projects, this value will not change when a project is transferred between accounts or renamed.","type":"string","meta":{"autogenerated":true}},"privacy":{"description":"Defaults to `unlisted`. `unlisted` hides the project from search results. `hidden` restricts access to the project page to only the owner and other users that have been granted access. Valid values: `public`, `unlisted`, `hidden`.","enum":["public","unlisted","hidden"],"type":"string","fallback":"unlisted"},"sdkVersion":{"description":"The Expo sdkVersion to run the project on. This should line up with the version specified in your package.json.","type":"string","pattern":"^(\\d+\\.\\d+\\.\\d+)|(UNVERSIONED)$"},"runtimeVersion":{"description":"**Note: Don't use this property unless you are sure what you're doing** \n\nThe runtime version associated with this manifest.\nSet this to `{\"policy\": \"nativeVersion\"}` to generate it automatically.","tsType":"string | { policy: 'nativeVersion' | 'sdkVersion' | 'appVersion'; }","oneOf":[{"type":"string","pattern":"^[a-zA-Z\\d][a-zA-Z\\d._+()-]{0,254}$","not":{"pattern":"^\\d+\\.\\d*0$"},"meta":{"notHuman":"String beginning with an alphanumeric character followed by any combination of alphanumeric character, \"_\", \"+\", \".\",\"(\", \")\", or \"-\". May not be a decimal ending in a 0. Valid examples: \"1.0.3a+\", \"1.0.0\", \"._+()-0a1\", \"0\".","regexHuman":"String beginning with an alphanumeric character followed by any combination of alphanumeric character, \"_\", \"+\", \".\",\"(\", \")\", or \"-\". May not be a decimal ending in a 0. Valid examples: \"1.0.3a+\", \"1.0.0\", \"._+()-0a1\", \"0\"."}},{"type":"string","pattern":"^exposdk:((\\d+\\.\\d+\\.\\d+)|(UNVERSIONED))$","meta":{"regexHuman":"An 'exposdk:' prefix followed by the SDK version of your project. Example: \"exposdk:44.0.0\"."}},{"type":"object","properties":{"policy":{"type":"string","enum":["nativeVersion","sdkVersion","appVersion"]}},"required":["policy"],"additionalProperties":false}]},"version":{"description":"Your app version. In addition to this field, you'll also use `ios.buildNumber` and `android.versionCode` — read more about how to version your app [here](https://docs.expo.dev/distribution/app-stores/#versioning-your-app). On iOS this corresponds to `CFBundleShortVersionString`, and on Android, this corresponds to `versionName`. The required format can be found [here](https://developer.apple.com/documentation/bundleresources/information_property_list/cfbundleshortversionstring).","type":"string","meta":{"bareWorkflow":"To change your app version, edit the 'Version' field in Xcode and the `versionName` string in `android/app/build.gradle`"}},"platforms":{"description":"Platforms that your project explicitly supports. If not specified, it defaults to `[\"ios\", \"android\"]`.","example":["ios","android","web"],"type":"array","uniqueItems":true,"items":{"type":"string","enum":["android","ios","web"]}},"githubUrl":{"description":"If you would like to share the source code of your app on Github, enter the URL for the repository here and it will be linked to from your Expo project page.","pattern":"^https://github\\.com/","example":"https://github.com/expo/expo","type":["string"]},"orientation":{"description":"Locks your app to a specific orientation with portrait or landscape. Defaults to no lock. Valid values: `default`, `portrait`, `landscape`","enum":["default","portrait","landscape"],"type":"string"},"userInterfaceStyle":{"description":"Configuration to force the app to always use the light or dark user-interface appearance, such as \"dark mode\", or make it automatically adapt to the system preferences. If not provided, defaults to `light`. Requires `expo-system-ui` be installed in your project to work on Android.","type":"string","fallback":"light","enum":["light","dark","automatic"]},"backgroundColor":{"description":"The background color for your app, behind any of your React views. This is also known as the root view background color. Requires `expo-system-ui` be installed in your project to work on iOS.","type":"string","pattern":"^#|(#)\\d{6}$","meta":{"regexHuman":"6 character long hex color string, for example, `'#000000'`. Default is white: `'#ffffff'`"}},"primaryColor":{"description":"On Android, this will determine the color of your app in the multitasker. Currently this is not used on iOS, but it may be used for other purposes in the future.","type":"string","pattern":"^#|(#)\\d{6}$","meta":{"regexHuman":"6 character long hex color string, for example, `'#000000'`"}},"icon":{"description":"Local path or remote URL to an image to use for your app's icon. We recommend that you use a 1024x1024 png file. This icon will appear on the home screen and within the Expo app.","type":"string","meta":{"asset":true,"contentTypePattern":"^image/png$","contentTypeHuman":".png image","square":true,"bareWorkflow":"To change your app's icon, edit or replace the files in `ios//Assets.xcassets/AppIcon.appiconset` (we recommend using Xcode), and `android/app/src/main/res/mipmap-`. Be sure to follow the guidelines for each platform ([iOS](https://developer.apple.com/design/human-interface-guidelines/ios/icons-and-images/app-icon/), [Android 7.1 and below](https://material.io/design/iconography/#icon-treatments), and [Android 8+](https://developer.android.com/guide/practices/ui_guidelines/icon_design_adaptive)) and to provide your new icon in each existing size."}},"notification":{"description":"Configuration for remote (push) notifications.","type":"object","properties":{"icon":{"description":"(Android only) Local path or remote URL to an image to use as the icon for push notifications. 96x96 png grayscale with transparency. We recommend following [Google's design guidelines](https://material.io/design/iconography/product-icons.html#design-principles). If not provided, defaults to your app icon.","type":"string","meta":{"asset":true,"contentTypePattern":"^image/png$","contentTypeHuman":".png image","square":true}},"color":{"description":"(Android only) Tint color for the push notification image when it appears in the notification tray. Defaults to `#ffffff`","type":"string","pattern":"^#|(#)\\d{6}$","meta":{"regexHuman":"6 character long hex color string, for example, `'#000000'`"}},"iosDisplayInForeground":{"description":"Whether or not to display notifications when the app is in the foreground on iOS. `_displayInForeground` option in the individual push notification message overrides this option. [Learn more.](https://docs.expo.dev/push-notifications/receiving-notifications/#foreground-notification-behavior) Defaults to `false`.","type":"boolean"},"androidMode":{"description":"Show each push notification individually (`default`) or collapse into one (`collapse`).","enum":["default","collapse"],"type":"string"},"androidCollapsedTitle":{"description":"If `androidMode` is set to `collapse`, this title is used for the collapsed notification message. For example, `'#{unread_notifications} new interactions'`.","type":"string"}},"additionalProperties":false},"androidStatusBar":{"description":"Configuration for the status bar on Android. For more details please navigate to [Configuring StatusBar](https://docs.expo.dev/guides/configuring-statusbar/).","type":"object","properties":{"barStyle":{"description":"Configures the status bar icons to have a light or dark color. Valid values: `light-content`, `dark-content`. Defaults to `dark-content`","type":"string","enum":["light-content","dark-content"]},"backgroundColor":{"description":"Specifies the background color of the status bar. Defaults to `#00000000` (transparent) for `dark-content` bar style and `#00000088` (semi-transparent black) for `light-content` bar style","type":"string","pattern":"^#|(#)\\d{6}$","meta":{"regexHuman":"6 character long hex color string `'#RRGGBB'`, for example, `'#000000'` for black. Or 8 character long hex color string `'#RRGGBBAA'`, for example, `'#00000088'` for semi-transparent black."}},"hidden":{"description":"Instructs the system whether the status bar should be visible or not. Defaults to `false`","type":"boolean"},"translucent":{"description":"When false, the system status bar pushes the content of your app down (similar to `position: relative`). When true, the status bar floats above the content in your app (similar to `position: absolute`). Defaults to `true` to match the iOS status bar behavior (which can only float above content). Explicitly setting this property to `true` will add `android:windowTranslucentStatus` to `styles.xml` and may cause unexpected keyboard behavior on Android when using the `softwareKeyboardLayoutMode` set to `resize`. In this case you will have to use `KeyboardAvoidingView` to manage the keyboard layout.","type":"boolean"}},"additionalProperties":false},"androidNavigationBar":{"description":"Configuration for the bottom navigation bar on Android. Can be used to configure the `expo-navigation-bar` module in EAS Build.","type":"object","properties":{"visible":{"description":"Determines how and when the navigation bar is shown. [Learn more](https://developer.android.com/training/system-ui/immersive). Requires `expo-navigation-bar` be installed in your project. Valid values: `leanback`, `immersive`, `sticky-immersive` \n\n `leanback` results in the navigation bar being hidden until the first touch gesture is registered. \n\n `immersive` results in the navigation bar being hidden until the user swipes up from the edge where the navigation bar is hidden. \n\n `sticky-immersive` is identical to `'immersive'` except that the navigation bar will be semi-transparent and will be hidden again after a short period of time.","type":"string","enum":["leanback","immersive","sticky-immersive"]},"barStyle":{"description":"Configure the navigation bar icons to have a light or dark color. Supported on Android Oreo and newer. Valid values: `'light-content'`, `'dark-content'`","type":"string","enum":["light-content","dark-content"]},"backgroundColor":{"description":"Specifies the background color of the navigation bar.","type":"string","pattern":"^#|(#)\\d{6}$","meta":{"regexHuman":"6 character long hex color string, for example, `'#000000'`"}}},"additionalProperties":false},"developmentClient":{"description":"Settings that apply specifically to running this app in a development client","type":"object","properties":{"silentLaunch":{"description":"If true, the app will launch in a development client with no additional dialogs or progress indicators, just like in a standalone app.","type":"boolean","fallback":false}},"additionalProperties":false},"scheme":{"description":"**Standalone Apps Only**. URL scheme to link into your app. For example, if we set this to `'demo'`, then demo:// URLs would open your app when tapped.","type":"string","pattern":"^[a-z][a-z0-9+.-]*$","meta":{"regexHuman":"String beginning with a **lowercase** letter followed by any combination of **lowercase** letters, digits, \"+\", \".\" or \"-\"","standaloneOnly":true,"bareWorkflow":"To change your app's scheme, replace all occurrences of the old scheme in `Info.plist` and `AndroidManifest.xml`"}},"extra":{"description":"Any extra fields you want to pass to your experience. Values are accessible via `Constants.expoConfig.extra` ([Learn more](https://docs.expo.dev/versions/latest/sdk/constants/#constantsmanifest))","type":"object","properties":{},"additionalProperties":true},"packagerOpts":{"description":"@deprecated Use a `metro.config.js` file instead. [Learn more](https://docs.expo.dev/guides/customizing-metro/)","meta":{"deprecated":true,"autogenerated":true},"type":"object","properties":{},"additionalProperties":true},"updates":{"description":"Configuration for how and when the app should request OTA JavaScript updates","type":"object","properties":{"enabled":{"description":"If set to false, your standalone app will never download any code, and will only use code bundled locally on the device. In that case, all updates to your app must be submitted through app store review. Defaults to true. (Note: This will not work out of the box with ExpoKit projects)","type":"boolean"},"checkAutomatically":{"description":"By default, Expo will check for updates every time the app is loaded. Set this to `ON_ERROR_RECOVERY` to disable automatic checking unless recovering from an error. Must be one of `ON_LOAD` or `ON_ERROR_RECOVERY`","enum":["ON_ERROR_RECOVERY","ON_LOAD"],"type":"string"},"fallbackToCacheTimeout":{"description":"How long (in ms) to allow for fetching OTA updates before falling back to a cached version of the app. Defaults to 0. Must be between 0 and 300000 (5 minutes).","type":"number","minimum":0,"maximum":300000},"url":{"description":"URL from which expo-updates will fetch update manifests","type":"string"},"codeSigningCertificate":{"description":"Local path of a PEM-formatted X.509 certificate used for requiring and verifying signed Expo updates","type":"string"},"codeSigningMetadata":{"description":"Metadata for `codeSigningCertificate`","type":"object","properties":{"alg":{"description":"Algorithm used to generate manifest code signing signature.","enum":["rsa-v1_5-sha256"],"type":"string"},"keyid":{"description":"Identifier for the key in the certificate. Used to instruct signing mechanisms when signing or verifying signatures.","type":"string"}},"additionalProperties":false},"requestHeaders":{"description":"Extra HTTP headers to include in HTTP requests made by `expo-updates`. These may override preset headers.","type":"object","additionalProperties":true}},"additionalProperties":false},"locales":{"description":"Provide overrides by locale for System Dialog prompts like Permissions Boxes","type":"object","properties":{},"meta":{"bareWorkflow":"To add or change language and localization information in your iOS app, you need to use Xcode."},"additionalProperties":{"type":["string","object"]}},"isDetached":{"description":"Is app detached","type":"boolean","meta":{"autogenerated":true}},"detach":{"description":"Extra fields needed by detached apps","type":"object","properties":{},"meta":{"autogenerated":true},"additionalProperties":true},"assetBundlePatterns":{"description":"An array of file glob strings which point to assets that will be bundled within your standalone app binary. Read more in the [Offline Support guide](https://docs.expo.dev/guides/offline-support/)","type":"array","items":{"type":"string"}},"plugins":{"description":"Config plugins for adding extra functionality to your project. [Learn more](https://docs.expo.dev/guides/config-plugins/).","meta":{"bareWorkflow":"Plugins that add modifications can only be used with [prebuilding](https://expo.fyi/prebuilding) and managed EAS Build"},"type":"array","items":{"anyOf":[{"type":["string"]},{"type":"array","items":[{"type":["string"]},{}],"additionalItems":false}]}},"splash":{"description":"Configuration for loading and splash screen for standalone apps.","type":"object","properties":{"backgroundColor":{"description":"Color to fill the loading screen background","type":"string","pattern":"^#|(#)\\d{6}$","meta":{"regexHuman":"6 character long hex color string, for example, `'#000000'`","bareWorkflow":"For Android, edit the `colorPrimary` item in `android/app/src/main/res/values/colors.xml`"}},"resizeMode":{"description":"Determines how the `image` will be displayed in the splash loading screen. Must be one of `cover` or `contain`, defaults to `contain`.","enum":["cover","contain"],"type":"string"},"image":{"description":"Local path or remote URL to an image to fill the background of the loading screen. Image size and aspect ratio are up to you. Must be a .png.","type":"string","meta":{"asset":true,"contentTypePattern":"^image/png$","contentTypeHuman":".png image"}}},"meta":{"bareWorkflow":"To change your app's icon, edit or replace the files in `ios//Assets.xcassets/AppIcon.appiconset` (we recommend using Xcode), and `android/app/src/main/res/mipmap-` (Android Studio can [generate the appropriate image files for you](https://developer.android.com/studio/write/image-asset-studio)). Be sure to follow the guidelines for each platform ([iOS](https://developer.apple.com/design/human-interface-guidelines/ios/icons-and-images/app-icon/), [Android 7.1 and below](https://material.io/design/iconography/#icon-treatments), and [Android 8+](https://developer.android.com/guide/practices/ui_guidelines/icon_design_adaptive)) and to provide your new icon in each required size."}},"jsEngine":{"description":"Specifies the JavaScript engine for apps. Supported only on EAS Build. Defaults to `hermes`. Valid values: `hermes`, `jsc`.","type":"string","fallback":"jsc","enum":["hermes","jsc"],"meta":{"bareWorkflow":"To change the JavaScript engine, update the `expo.jsEngine` value in `ios/Podfile.properties.json` or `android/gradle.properties`"}},"ios":{"description":"Configuration that is specific to the iOS platform.","type":"object","meta":{"standaloneOnly":true},"properties":{"publishManifestPath":{"description":"The manifest for the iOS version of your app will be written to this path during publish.","type":"string","meta":{"autogenerated":true}},"publishBundlePath":{"description":"The bundle for the iOS version of your app will be written to this path during publish.","type":"string","meta":{"autogenerated":true}},"bundleIdentifier":{"description":"The bundle identifier for your iOS standalone app. You make it up, but it needs to be unique on the App Store. See [this StackOverflow question](http://stackoverflow.com/questions/11347470/what-does-bundle-identifier-mean-in-the-ios-project).","type":"string","pattern":"^[a-zA-Z0-9.-]+$","meta":{"bareWorkflow":"Set this value in `info.plist` under `CFBundleIdentifier`","regexHuman":"iOS bundle identifier notation unique name for your app. For example, `host.exp.expo`, where `exp.host` is our domain and `expo` is our app name."}},"buildNumber":{"description":"Build number for your iOS standalone app. Corresponds to `CFBundleVersion` and must match Apple's [specified format](https://developer.apple.com/documentation/bundleresources/information_property_list/cfbundleversion). (Note: Transporter will pull the value for `Version Number` from `expo.version` and NOT from `expo.ios.buildNumber`.)","type":"string","pattern":"^[A-Za-z0-9\\.]+$","meta":{"bareWorkflow":"Set this value in `info.plist` under `CFBundleVersion`"}},"backgroundColor":{"description":"The background color for your iOS app, behind any of your React views. Overrides the top-level `backgroundColor` key if it is present. Requires `expo-system-ui` be installed in your project to work on iOS.","type":"string","pattern":"^#|(#)\\d{6}$","meta":{"regexHuman":"6 character long hex color string, for example, `'#000000'`"}},"icon":{"description":"Local path or remote URL to an image to use for your app's icon on iOS. If specified, this overrides the top-level `icon` key. Use a 1024x1024 icon which follows Apple's interface guidelines for icons, including color profile and transparency. \n\n Expo will generate the other required sizes. This icon will appear on the home screen and within the Expo app.","type":"string","meta":{"asset":true,"contentTypePattern":"^image/png$","contentTypeHuman":".png image","square":true}},"appStoreUrl":{"description":"URL to your app on the Apple App Store, if you have deployed it there. This is used to link to your store page from your Expo project page if your app is public.","pattern":"^https://(itunes|apps)\\.apple\\.com/.*?\\d+","example":"https://apps.apple.com/us/app/expo-client/id982107779","type":["string"]},"bitcode":{"description":"Enable iOS Bitcode optimizations in the native build. Accepts the name of an iOS build configuration to enable for a single configuration and disable for all others, e.g. Debug, Release. Not available in Expo Go. Defaults to `undefined` which uses the template's predefined settings.","anyOf":[{"type":["boolean"]},{"type":["string"]}]},"config":{"type":"object","description":"Note: This property key is not included in the production manifest and will evaluate to `undefined`. It is used internally only in the build process, because it contains API keys that some may want to keep private.","properties":{"branch":{"description":"[Branch](https://branch.io/) key to hook up Branch linking services.","type":"object","properties":{"apiKey":{"description":"Your Branch API key","type":"string"}},"additionalProperties":false},"usesNonExemptEncryption":{"description":"Sets `ITSAppUsesNonExemptEncryption` in the standalone ipa's Info.plist to the given boolean value.","type":"boolean"},"googleMapsApiKey":{"description":"[Google Maps iOS SDK](https://developers.google.com/maps/documentation/ios-sdk/start) key for your standalone app.","type":"string"},"googleMobileAdsAppId":{"description":"[Google Mobile Ads App ID](https://support.google.com/admob/answer/6232340) Google AdMob App ID. ","type":"string"},"googleMobileAdsAutoInit":{"description":"A boolean indicating whether to initialize Google App Measurement and begin sending user-level event data to Google immediately when the app starts. The default in Expo (Go and in standalone apps) is `false`. [Sets the opposite of the given value to the following key in `Info.plist`.](https://developers.google.com/admob/ios/eu-consent#delay_app_measurement_optional)","type":"boolean","fallback":false}},"additionalProperties":false},"googleServicesFile":{"description":"[Firebase Configuration File](https://support.google.com/firebase/answer/7015592) Location of the `GoogleService-Info.plist` file for configuring Firebase.","type":"string"},"supportsTablet":{"description":"Whether your standalone iOS app supports tablet screen sizes. Defaults to `false`.","type":"boolean","meta":{"bareWorkflow":"Set this value in `info.plist` under `UISupportedInterfaceOrientations~ipad`"}},"isTabletOnly":{"description":"If true, indicates that your standalone iOS app does not support handsets, and only supports tablets.","type":"boolean","meta":{"bareWorkflow":"Set this value in `info.plist` under `UISupportedInterfaceOrientations`"}},"requireFullScreen":{"description":"If true, indicates that your standalone iOS app does not support Slide Over and Split View on iPad. Defaults to `false`","type":"boolean","meta":{"bareWorkflow":"Use Xcode to set `UIRequiresFullScreen`"}},"userInterfaceStyle":{"description":"Configuration to force the app to always use the light or dark user-interface appearance, such as \"dark mode\", or make it automatically adapt to the system preferences. If not provided, defaults to `light`.","type":"string","fallback":"light","enum":["light","dark","automatic"]},"infoPlist":{"description":"Dictionary of arbitrary configuration to add to your standalone app's native Info.plist. Applied prior to all other Expo-specific configuration. No other validation is performed, so use this at your own risk of rejection from the App Store.","type":"object","properties":{},"additionalProperties":true},"entitlements":{"description":"Dictionary of arbitrary configuration to add to your standalone app's native *.entitlements (plist). Applied prior to all other Expo-specific configuration. No other validation is performed, so use this at your own risk of rejection from the App Store.","type":"object","properties":{},"additionalProperties":true},"associatedDomains":{"description":"An array that contains Associated Domains for the standalone app. [Learn more](https://developer.apple.com/documentation/safariservices/supporting_associated_domains).","type":"array","uniqueItems":true,"items":{"type":"string"},"meta":{"regexHuman":"Entries must follow the format `applinks:[:port number]`. [Learn more](https://developer.apple.com/documentation/safariservices/supporting_associated_domains).","bareWorkflow":"Build with EAS, or use Xcode to enable this capability manually. [Learn more](https://developer.apple.com/documentation/safariservices/supporting_associated_domains)."}},"usesIcloudStorage":{"description":"A boolean indicating if the app uses iCloud Storage for `DocumentPicker`. See `DocumentPicker` docs for details.","type":"boolean","meta":{"bareWorkflow":"Use Xcode, or ios.entitlements to configure this."}},"usesAppleSignIn":{"description":"A boolean indicating if the app uses Apple Sign-In. See `AppleAuthentication` docs for details.","type":"boolean","fallback":false},"accessesContactNotes":{"description":"A Boolean value that indicates whether the app may access the notes stored in contacts. You must [receive permission from Apple](https://developer.apple.com/documentation/bundleresources/entitlements/com_apple_developer_contacts_notes) before you can submit your app for review with this capability.","type":"boolean","fallback":false},"splash":{"description":"Configuration for loading and splash screen for standalone iOS apps.","type":"object","properties":{"backgroundColor":{"description":"Color to fill the loading screen background","type":"string","pattern":"^#|(#)\\d{6}$","meta":{"regexHuman":"6 character long hex color string, for example, `'#000000'`"}},"resizeMode":{"description":"Determines how the `image` will be displayed in the splash loading screen. Must be one of `cover` or `contain`, defaults to `contain`.","enum":["cover","contain"],"type":"string"},"image":{"description":"Local path or remote URL to an image to fill the background of the loading screen. Image size and aspect ratio are up to you. Must be a .png.","type":"string","meta":{"asset":true,"contentTypePattern":"^image/png$","contentTypeHuman":".png image"}},"tabletImage":{"description":"Local path or remote URL to an image to fill the background of the loading screen. Image size and aspect ratio are up to you. Must be a .png.","type":"string","meta":{"asset":true,"contentTypePattern":"^image/png$","contentTypeHuman":".png image"}},"dark":{"description":"Configuration for loading and splash screen for standalone iOS apps in dark mode.","type":"object","properties":{"backgroundColor":{"description":"Color to fill the loading screen background","type":"string","pattern":"^#|(#)\\d{6}$","meta":{"regexHuman":"6 character long hex color string, for example, `'#000000'`"}},"resizeMode":{"description":"Determines how the `image` will be displayed in the splash loading screen. Must be one of `cover` or `contain`, defaults to `contain`.","enum":["cover","contain"],"type":"string"},"image":{"description":"Local path or remote URL to an image to fill the background of the loading screen. Image size and aspect ratio are up to you. Must be a .png.","type":"string","meta":{"asset":true,"contentTypePattern":"^image/png$","contentTypeHuman":".png image"}},"tabletImage":{"description":"Local path or remote URL to an image to fill the background of the loading screen. Image size and aspect ratio are up to you. Must be a .png.","type":"string","meta":{"asset":true,"contentTypePattern":"^image/png$","contentTypeHuman":".png image"}}}}}},"jsEngine":{"description":"Specifies the JavaScript engine for iOS apps. Supported only on EAS Build. Defaults to `jsc`. Valid values: `hermes`, `jsc`.","type":"string","fallback":"jsc","enum":["hermes","jsc"],"meta":{"bareWorkflow":"To change the JavaScript engine, update the `expo.jsEngine` value in `ios/Podfile.properties.json`"}},"runtimeVersion":{"description":"**Note: Don't use this property unless you are sure what you're doing** \n\nThe runtime version associated with this manifest for the iOS platform. If provided, this will override the top level runtimeVersion key.\nSet this to `{\"policy\": \"nativeVersion\"}` to generate it automatically.","tsType":"string | { policy: 'nativeVersion' | 'sdkVersion' | 'appVersion'; }","oneOf":[{"type":"string","pattern":"^[a-zA-Z\\d][a-zA-Z\\d._+()-]{0,254}$","not":{"pattern":"^\\d+\\.\\d*0$"},"meta":{"notHuman":"String beginning with an alphanumeric character followed by any combination of alphanumeric character, \"_\", \"+\", \".\",\"(\", \")\", or \"-\". May not be a decimal ending in a 0. Valid examples: \"1.0.3a+\", \"1.0.0\", \"._+()-0a1\", \"0\".","regexHuman":"String beginning with an alphanumeric character followed by any combination of alphanumeric character, \"_\", \"+\", \".\",\"(\", \")\", or \"-\". May not be a decimal ending in a 0. Valid examples: \"1.0.3a+\", \"1.0.0\", \"._+()-0a1\", \"0\"."}},{"type":"string","pattern":"^exposdk:((\\d+\\.\\d+\\.\\d+)|(UNVERSIONED))$","meta":{"regexHuman":"An 'exposdk:' prefix followed by the SDK version of your project. Example: \"exposdk:44.0.0\"."}},{"type":"object","properties":{"policy":{"type":"string","enum":["nativeVersion","sdkVersion","appVersion"]}},"required":["policy"],"additionalProperties":false}]}},"additionalProperties":false},"android":{"description":"Configuration that is specific to the Android platform.","type":"object","meta":{"standaloneOnly":true},"properties":{"publishManifestPath":{"description":"The manifest for the Android version of your app will be written to this path during publish.","type":"string","meta":{"autogenerated":true}},"publishBundlePath":{"description":"The bundle for the Android version of your app will be written to this path during publish.","type":"string","meta":{"autogenerated":true}},"package":{"description":"The package name for your Android standalone app. You make it up, but it needs to be unique on the Play Store. See [this StackOverflow question](http://stackoverflow.com/questions/6273892/android-package-name-convention).","type":"string","pattern":"^[a-zA-Z][a-zA-Z0-9\\_]*(\\.[a-zA-Z][a-zA-Z0-9\\_]*)+$","meta":{"regexHuman":"Reverse DNS notation unique name for your app. Valid Android Application ID. For example, `com.example.app`, where `com.example` is our domain and `app` is our app. The name may only contain lowercase and uppercase letters (a-z, A-Z), numbers (0-9) and underscores (_), separated by periods (.). Each component of the name should start with a lowercase letter.","bareWorkflow":"This is set in `android/app/build.gradle` as `applicationId` as well as in your `AndroidManifest.xml` file (multiple places)."}},"versionCode":{"description":"Version number required by Google Play. Increment by one for each release. Must be a positive integer. [Learn more](https://developer.android.com/studio/publish/versioning.html)","type":"integer","minimum":0,"maximum":2100000000,"meta":{"bareWorkflow":"This is set in `android/app/build.gradle` as `versionCode`"}},"backgroundColor":{"description":"The background color for your Android app, behind any of your React views. Overrides the top-level `backgroundColor` key if it is present.","type":"string","pattern":"^#|(#)\\d{6}$","meta":{"regexHuman":"6 character long hex color string, for example, `'#000000'`","bareWorkflow":"This is set in `android/app/src/main/AndroidManifest.xml` under `android:windowBackground`"}},"userInterfaceStyle":{"description":"Configuration to force the app to always use the light or dark user-interface appearance, such as \"dark mode\", or make it automatically adapt to the system preferences. If not provided, defaults to `light`. Requires `expo-system-ui` be installed in your project to work on Android.","type":"string","fallback":"light","enum":["light","dark","automatic"]},"icon":{"description":"Local path or remote URL to an image to use for your app's icon on Android. If specified, this overrides the top-level `icon` key. We recommend that you use a 1024x1024 png file (transparency is recommended for the Google Play Store). This icon will appear on the home screen and within the Expo app.","type":"string","meta":{"asset":true,"contentTypePattern":"^image/png$","contentTypeHuman":".png image","square":true}},"adaptiveIcon":{"description":"Settings for an Adaptive Launcher Icon on Android. [Learn more](https://developer.android.com/guide/practices/ui_guidelines/icon_design_adaptive)","type":"object","properties":{"foregroundImage":{"description":"Local path or remote URL to an image to use for your app's icon on Android. If specified, this overrides the top-level `icon` and the `android.icon` keys. Should follow the [specified guidelines](https://developer.android.com/guide/practices/ui_guidelines/icon_design_adaptive). This icon will appear on the home screen.","type":"string","meta":{"asset":true,"contentTypePattern":"^image/png$","contentTypeHuman":".png image","square":true}},"monochromeImage":{"description":"Local path or remote URL to an image representing the Android 13+ monochromatic icon. Should follow the [specified guidelines](https://developer.android.com/guide/practices/ui_guidelines/icon_design_adaptive). This icon will appear on the home screen when the user enables 'Themed icons' in system settings on a device running Android 13+.","type":"string","meta":{"asset":true,"contentTypePattern":"^image/png$","contentTypeHuman":".png image","square":true}},"backgroundImage":{"description":"Local path or remote URL to a background image for your app's Adaptive Icon on Android. If specified, this overrides the `backgroundColor` key. Must have the same dimensions as `foregroundImage`, and has no effect if `foregroundImage` is not specified. Should follow the [specified guidelines](https://developer.android.com/guide/practices/ui_guidelines/icon_design_adaptive).","type":"string","meta":{"asset":true,"contentTypePattern":"^image/png$","contentTypeHuman":".png image","square":true}},"backgroundColor":{"description":"Color to use as the background for your app's Adaptive Icon on Android. Defaults to white, `#FFFFFF`. Has no effect if `foregroundImage` is not specified.","type":"string","pattern":"^#|(#)\\d{6}$","meta":{"regexHuman":"6 character long hex color string, for example, `'#000000'`"}}},"additionalProperties":false},"playStoreUrl":{"description":"URL to your app on the Google Play Store, if you have deployed it there. This is used to link to your store page from your Expo project page if your app is public.","pattern":"^https://play\\.google\\.com/","example":"https://play.google.com/store/apps/details?id=host.exp.exponent","type":["string"]},"permissions":{"description":"List of permissions used by the standalone app. \n\n To use ONLY the following minimum necessary permissions and none of the extras supported by Expo in a default managed app, set `permissions` to `[]`. The minimum necessary permissions do not require a Privacy Policy when uploading to Google Play Store and are: \n• receive data from Internet \n• view network connections \n• full network access \n• change your audio settings \n• prevent device from sleeping \n\n To use ALL permissions supported by Expo by default, do not specify the `permissions` key. \n\n To use the minimum necessary permissions ALONG with certain additional permissions, specify those extras in `permissions`, e.g.\n\n `[ \"CAMERA\", \"ACCESS_FINE_LOCATION\" ]`.\n\n You can specify the following permissions depending on what you need:\n\n- `ACCESS_COARSE_LOCATION`\n- `ACCESS_FINE_LOCATION`\n- `ACCESS_BACKGROUND_LOCATION`\n- `CAMERA`\n- `RECORD_AUDIO`\n- `READ_CONTACTS`\n- `WRITE_CONTACTS`\n- `READ_CALENDAR`\n- `WRITE_CALENDAR`\n- `READ_EXTERNAL_STORAGE`\n- `WRITE_EXTERNAL_STORAGE`\n- `USE_FINGERPRINT`\n- `USE_BIOMETRIC`\n- `WRITE_SETTINGS`\n- `VIBRATE`\n- `READ_PHONE_STATE`\n- `FOREGROUND_SERVICE`\n- `WAKE_LOCK`\n- `com.anddoes.launcher.permission.UPDATE_COUNT`\n- `com.android.launcher.permission.INSTALL_SHORTCUT`\n- `com.google.android.c2dm.permission.RECEIVE`\n- `com.google.android.gms.permission.ACTIVITY_RECOGNITION`\n- `com.google.android.providers.gsf.permission.READ_GSERVICES`\n- `com.htc.launcher.permission.READ_SETTINGS`\n- `com.htc.launcher.permission.UPDATE_SHORTCUT`\n- `com.majeur.launcher.permission.UPDATE_BADGE`\n- `com.sec.android.provider.badge.permission.READ`\n- `com.sec.android.provider.badge.permission.WRITE`\n- `com.sonyericsson.home.permission.BROADCAST_BADGE`\n","type":"array","meta":{"bareWorkflow":"To change the permissions your app requests, you'll need to edit `AndroidManifest.xml` manually. To prevent your app from requesting one of the permissions listed below, you'll need to explicitly add it to `AndroidManifest.xml` along with a `tools:node=\"remove\"` tag."},"items":{"type":"string"}},"blockedPermissions":{"description":"List of permissions to block in the final `AndroidManifest.xml`. This is useful for removing permissions that are added by native package `AndroidManifest.xml` files which are merged into the final manifest. Internally this feature uses the `tools:node=\"remove\"` XML attribute to remove permissions. Not available in Expo Go.","type":"array","items":{"type":"string"}},"googleServicesFile":{"description":"[Firebase Configuration File](https://support.google.com/firebase/answer/7015592) Location of the `GoogleService-Info.plist` file for configuring Firebase. Including this key automatically enables FCM in your standalone app.","type":"string","meta":{"bareWorkflow":"Add or edit the file directly at `android/app/google-services.json`"}},"config":{"type":"object","description":"Note: This property key is not included in the production manifest and will evaluate to `undefined`. It is used internally only in the build process, because it contains API keys that some may want to keep private.","properties":{"branch":{"description":"[Branch](https://branch.io/) key to hook up Branch linking services.","type":"object","properties":{"apiKey":{"description":"Your Branch API key","type":"string"}},"additionalProperties":false},"googleMaps":{"description":"[Google Maps Android SDK](https://developers.google.com/maps/documentation/android-api/signup) configuration for your standalone app.","type":"object","properties":{"apiKey":{"description":"Your Google Maps Android SDK API key","type":"string"}},"additionalProperties":false},"googleMobileAdsAppId":{"description":"[Google Mobile Ads App ID](https://support.google.com/admob/answer/6232340) Google AdMob App ID. ","type":"string"},"googleMobileAdsAutoInit":{"description":"A boolean indicating whether to initialize Google App Measurement and begin sending user-level event data to Google immediately when the app starts. The default in Expo (Client and in standalone apps) is `false`. [Sets the opposite of the given value to the following key in `Info.plist`](https://developers.google.com/admob/ios/eu-consent#delay_app_measurement_optional)","type":"boolean","fallback":false}},"additionalProperties":false},"splash":{"description":"Configuration for loading and splash screen for managed and standalone Android apps.","type":"object","properties":{"backgroundColor":{"description":"Color to fill the loading screen background","type":"string","pattern":"^#|(#)\\d{6}$","meta":{"regexHuman":"6 character long hex color string, for example, `'#000000'`"}},"resizeMode":{"description":"Determines how the `image` will be displayed in the splash loading screen. Must be one of `cover`, `contain` or `native`, defaults to `contain`.","enum":["cover","contain","native"],"type":"string"},"image":{"description":"Local path or remote URL to an image to fill the background of the loading screen. Image size and aspect ratio are up to you. Must be a .png.","type":"string","meta":{"asset":true,"contentTypePattern":"^image/png$","contentTypeHuman":".png image"}},"mdpi":{"description":"Local path or remote URL to an image to fill the background of the loading screen in \"native\" mode. Image size and aspect ratio are up to you. [Learn more]( https://developer.android.com/training/multiscreen/screendensities) \n\n `Natural sized image (baseline)`","type":"string","meta":{"asset":true,"contentTypePattern":"^image/png$","contentTypeHuman":".png image"}},"hdpi":{"description":"Local path or remote URL to an image to fill the background of the loading screen in \"native\" mode. Image size and aspect ratio are up to you. [Learn more]( https://developer.android.com/training/multiscreen/screendensities) \n\n `Scale 1.5x`","type":"string","meta":{"asset":true,"contentTypePattern":"^image/png$","contentTypeHuman":".png image"}},"xhdpi":{"description":"Local path or remote URL to an image to fill the background of the loading screen in \"native\" mode. Image size and aspect ratio are up to you. [Learn more]( https://developer.android.com/training/multiscreen/screendensities) \n\n `Scale 2x`","type":"string","meta":{"asset":true,"contentTypePattern":"^image/png$","contentTypeHuman":".png image"}},"xxhdpi":{"description":"Local path or remote URL to an image to fill the background of the loading screen in \"native\" mode. Image size and aspect ratio are up to you. [Learn more]( https://developer.android.com/training/multiscreen/screendensities) \n\n `Scale 3x`","type":"string","meta":{"asset":true,"contentTypePattern":"^image/png$","contentTypeHuman":".png image"}},"xxxhdpi":{"description":"Local path or remote URL to an image to fill the background of the loading screen in \"native\" mode. Image size and aspect ratio are up to you. [Learn more]( https://developer.android.com/training/multiscreen/screendensities) \n\n `Scale 4x`","type":"string","meta":{"asset":true,"contentTypePattern":"^image/png$","contentTypeHuman":".png image"}},"dark":{"description":"Configuration for loading and splash screen for managed and standalone Android apps in dark mode.","type":"object","properties":{"backgroundColor":{"description":"Color to fill the loading screen background","type":"string","pattern":"^#|(#)\\d{6}$","meta":{"regexHuman":"6 character long hex color string, for example, `'#000000'`"}},"resizeMode":{"description":"Determines how the `image` will be displayed in the splash loading screen. Must be one of `cover`, `contain` or `native`, defaults to `contain`.","enum":["cover","contain","native"],"type":"string"},"image":{"description":"Local path or remote URL to an image to fill the background of the loading screen. Image size and aspect ratio are up to you. Must be a .png.","type":"string","meta":{"asset":true,"contentTypePattern":"^image/png$","contentTypeHuman":".png image"}},"mdpi":{"description":"Local path or remote URL to an image to fill the background of the loading screen in \"native\" mode. Image size and aspect ratio are up to you. [Learn more]( https://developer.android.com/training/multiscreen/screendensities) \n\n `Natural sized image (baseline)`","type":"string","meta":{"asset":true,"contentTypePattern":"^image/png$","contentTypeHuman":".png image"}},"hdpi":{"description":"Local path or remote URL to an image to fill the background of the loading screen in \"native\" mode. Image size and aspect ratio are up to you. [Learn more]( https://developer.android.com/training/multiscreen/screendensities) \n\n `Scale 1.5x`","type":"string","meta":{"asset":true,"contentTypePattern":"^image/png$","contentTypeHuman":".png image"}},"xhdpi":{"description":"Local path or remote URL to an image to fill the background of the loading screen in \"native\" mode. Image size and aspect ratio are up to you. [Learn more]( https://developer.android.com/training/multiscreen/screendensities) \n\n `Scale 2x`","type":"string","meta":{"asset":true,"contentTypePattern":"^image/png$","contentTypeHuman":".png image"}},"xxhdpi":{"description":"Local path or remote URL to an image to fill the background of the loading screen in \"native\" mode. Image size and aspect ratio are up to you. [Learn more]( https://developer.android.com/training/multiscreen/screendensities) \n\n `Scale 3x`","type":"string","meta":{"asset":true,"contentTypePattern":"^image/png$","contentTypeHuman":".png image"}},"xxxhdpi":{"description":"Local path or remote URL to an image to fill the background of the loading screen in \"native\" mode. Image size and aspect ratio are up to you. [Learn more]( https://developer.android.com/training/multiscreen/screendensities) \n\n `Scale 4x`","type":"string","meta":{"asset":true,"contentTypePattern":"^image/png$","contentTypeHuman":".png image"}}}}}},"intentFilters":{"description":"Configuration for setting an array of custom intent filters in Android manifest. [Learn more](https://developer.android.com/guide/components/intents-filters)","example":[{"autoVerify":true,"action":"VIEW","data":{"scheme":"https","host":"*.example.com"},"category":["BROWSABLE","DEFAULT"]}],"exampleString":"\n [{ \n \"autoVerify\": true, \n \"action\": \"VIEW\", \n \"data\": { \n \"scheme\": \"https\", \n \"host\": \"*.example.com\" \n }, \n \"category\": [\"BROWSABLE\", \"DEFAULT\"] \n }]","type":"array","uniqueItems":true,"items":{"type":"object","properties":{"autoVerify":{"description":"You may also use an intent filter to set your app as the default handler for links (without showing the user a dialog with options). To do so use `true` and then configure your server to serve a JSON file verifying that you own the domain. [Learn more](https://developer.android.com/training/app-links)","type":"boolean"},"action":{"type":"string"},"data":{"anyOf":[{"type":"object","properties":{"scheme":{"description":"Scheme of the URL, e.g. `https`","type":"string"},"host":{"description":"Hostname, e.g. `myapp.io`","type":"string"},"port":{"description":"Port, e.g. `3000`","type":"string"},"path":{"description":"Exact path for URLs that should be matched by the filter, e.g. `/records`","type":"string"},"pathPattern":{"description":"Pattern for paths that should be matched by the filter, e.g. `.*`. Must begin with `/`","type":"string"},"pathPrefix":{"description":"Prefix for paths that should be matched by the filter, e.g. `/records/` will match `/records/123`","type":"string"},"mimeType":{"description":"MIME type for URLs that should be matched by the filter","type":"string"}},"additionalProperties":false},{"type":["array"],"items":{"type":"object","properties":{"scheme":{"description":"Scheme of the URL, e.g. `https`","type":"string"},"host":{"description":"Hostname, e.g. `myapp.io`","type":"string"},"port":{"description":"Port, e.g. `3000`","type":"string"},"path":{"description":"Exact path for URLs that should be matched by the filter, e.g. `/records`","type":"string"},"pathPattern":{"description":"Pattern for paths that should be matched by the filter, e.g. `.*`. Must begin with `/`","type":"string"},"pathPrefix":{"description":"Prefix for paths that should be matched by the filter, e.g. `/records/` will match `/records/123`","type":"string"},"mimeType":{"description":"MIME type for URLs that should be matched by the filter","type":"string"}},"additionalProperties":false}}]},"category":{"anyOf":[{"type":["string"]},{"type":"array","items":{"type":"string"}}]}},"additionalProperties":false,"required":["action"]},"meta":{"bareWorkflow":"This is set in `AndroidManifest.xml` directly. [Learn more.](https://developer.android.com/guide/components/intents-filters)"}},"allowBackup":{"description":"Allows your user's app data to be automatically backed up to their Google Drive. If this is set to false, no backup or restore of the application will ever be performed (this is useful if your app deals with sensitive information). Defaults to the Android default, which is `true`.","fallback":true,"type":"boolean"},"softwareKeyboardLayoutMode":{"description":"Determines how the software keyboard will impact the layout of your application. This maps to the `android:windowSoftInputMode` property. Defaults to `resize`. Valid values: `resize`, `pan`.","enum":["resize","pan"],"type":"string","fallback":"resize"},"jsEngine":{"description":"Specifies the JavaScript engine for Android apps. Supported only on EAS Build and in Expo Go. Defaults to `jsc`. Valid values: `hermes`, `jsc`.","type":"string","fallback":"jsc","enum":["hermes","jsc"],"meta":{"bareWorkflow":"To change the JavaScript engine, update the `expo.jsEngine` value in `android/gradle.properties`"}},"runtimeVersion":{"description":"**Note: Don't use this property unless you are sure what you're doing** \n\nThe runtime version associated with this manifest for the Android platform. If provided, this will override the top level runtimeVersion key.\nSet this to `{\"policy\": \"nativeVersion\"}` to generate it automatically.","tsType":"string | { policy: 'nativeVersion' | 'sdkVersion' | 'appVersion'; }","oneOf":[{"type":"string","pattern":"^[a-zA-Z\\d][a-zA-Z\\d._+()-]{0,254}$","not":{"pattern":"^\\d+\\.\\d*0$"},"meta":{"notHuman":"String beginning with an alphanumeric character followed by any combination of alphanumeric character, \"_\", \"+\", \".\",\"(\", \")\", or \"-\". May not be a decimal ending in a 0. Valid examples: \"1.0.3a+\", \"1.0.0\", \"._+()-0a1\", \"0\".","regexHuman":"String beginning with an alphanumeric character followed by any combination of alphanumeric character, \"_\", \"+\", \".\",\"(\", \")\", or \"-\". May not be a decimal ending in a 0. Valid examples: \"1.0.3a+\", \"1.0.0\", \"._+()-0a1\", \"0\"."}},{"type":"string","pattern":"^exposdk:((\\d+\\.\\d+\\.\\d+)|(UNVERSIONED))$","meta":{"regexHuman":"An 'exposdk:' prefix followed by the SDK version of your project. Example: \"exposdk:44.0.0\"."}},{"type":"object","properties":{"policy":{"type":"string","enum":["nativeVersion","sdkVersion","appVersion"]}},"required":["policy"],"additionalProperties":false}]}},"additionalProperties":false},"web":{"description":"Configuration that is specific to the web platform.","type":"object","additionalProperties":true,"properties":{"favicon":{"description":"Relative path of an image to use for your app's favicon.","type":"string"},"name":{"description":"Defines the title of the document, defaults to the outer level name","type":"string","meta":{"pwa":"name"}},"shortName":{"description":"A short version of the app's name, 12 characters or fewer. Used in app launcher and new tab pages. Maps to `short_name` in the PWA manifest.json. Defaults to the `name` property.","type":"string","meta":{"pwa":"short_name","regexHuman":"Maximum 12 characters long"}},"lang":{"description":"Specifies the primary language for the values in the name and short_name members. This value is a string containing a single language tag.","type":"string","fallback":"en","meta":{"pwa":"lang"}},"scope":{"description":"Defines the navigation scope of this website's context. This restricts what web pages can be viewed while the manifest is applied. If the user navigates outside the scope, it returns to a normal web page inside a browser tab/window. If the scope is a relative URL, the base URL will be the URL of the manifest.","type":"string","meta":{"pwa":"scope"}},"themeColor":{"description":"Defines the color of the Android tool bar, and may be reflected in the app's preview in task switchers.","type":"string","pattern":"^#|(#)\\d{6}$","meta":{"pwa":"theme_color","html":"theme-color","regexHuman":"6 character long hex color string, for example, `'#000000'`"}},"description":{"description":"Provides a general description of what the pinned website does.","type":"string","meta":{"html":"description","pwa":"description"}},"dir":{"description":"Specifies the primary text direction for the name, short_name, and description members. Together with the lang member, it helps the correct display of right-to-left languages.","enum":["auto","ltr","rtl"],"type":"string","meta":{"pwa":"dir"}},"display":{"description":"Defines the developers’ preferred display mode for the website.","enum":["fullscreen","standalone","minimal-ui","browser"],"type":"string","meta":{"pwa":"display"}},"startUrl":{"description":"The URL that loads when a user launches the application (e.g., when added to home screen), typically the index. Note: This has to be a relative URL, relative to the manifest URL.","type":"string","meta":{"pwa":"start_url"}},"orientation":{"description":"Defines the default orientation for all the website's top level browsing contexts.","enum":["any","natural","landscape","landscape-primary","landscape-secondary","portrait","portrait-primary","portrait-secondary"],"type":"string","meta":{"pwa":"orientation"}},"backgroundColor":{"description":"Defines the expected “background color” for the website. This value repeats what is already available in the site’s CSS, but can be used by browsers to draw the background color of a shortcut when the manifest is available before the stylesheet has loaded. This creates a smooth transition between launching the web application and loading the site's content.","type":"string","pattern":"^#|(#)\\d{6}$","meta":{"pwa":"background_color","regexHuman":"6 character long hex color string, for example, `'#000000'`"}},"barStyle":{"description":"If content is set to default, the status bar appears normal. If set to black, the status bar has a black background. If set to black-translucent, the status bar is black and translucent. If set to default or black, the web content is displayed below the status bar. If set to black-translucent, the web content is displayed on the entire screen, partially obscured by the status bar.","enum":["default","black","black-translucent"],"type":"string","fallback":"black-translucent","meta":{"html":"apple-mobile-web-app-status-bar-style","pwa":"name"}},"preferRelatedApplications":{"description":"Hints for the user agent to indicate to the user that the specified native applications (defined in expo.ios and expo.android) are recommended over the website.","type":"boolean","fallback":true,"meta":{"pwa":"prefer_related_applications"}},"dangerous":{"description":"Experimental features. These will break without deprecation notice.","type":"object","properties":{},"additionalProperties":true},"splash":{"description":"Configuration for PWA splash screens.","type":"object","properties":{"backgroundColor":{"description":"Color to fill the loading screen background","type":"string","pattern":"^#|(#)\\d{6}$","meta":{"regexHuman":"6 character long hex color string, for example, `'#000000'`"}},"resizeMode":{"description":"Determines how the `image` will be displayed in the splash loading screen. Must be one of `cover` or `contain`, defaults to `contain`.","enum":["cover","contain"],"type":"string"},"image":{"description":"Local path or remote URL to an image to fill the background of the loading screen. Image size and aspect ratio are up to you. Must be a .png.","type":"string","meta":{"asset":true,"contentTypePattern":"^image/png$","contentTypeHuman":".png image"}}},"meta":{"bareWorkflow":"Use [expo-splash-screen](https://github.com/expo/expo/tree/main/packages/expo-splash-screen#expo-splash-screen)"}},"config":{"description":"Firebase web configuration. Used by the expo-firebase packages on both web and native. [Learn more](https://firebase.google.com/docs/reference/js/firebase.html#initializeapp)","type":"object","properties":{"firebase":{"type":"object","properties":{"apiKey":{"type":"string"},"authDomain":{"type":"string"},"databaseURL":{"type":"string"},"projectId":{"type":"string"},"storageBucket":{"type":"string"},"messagingSenderId":{"type":"string"},"appId":{"type":"string"},"measurementId":{"type":"string"}}}}},"bundler":{"description":"Sets the bundler to use for the web platform. Only supported in the local CLI `npx expo`.","enum":["webpack","metro"],"fallback":"webpack"}}},"hooks":{"description":"Configuration for scripts to run to hook into the publish process","type":"object","additionalProperties":false,"properties":{"postPublish":{"type":"array","items":{"type":"object","additionalProperties":true,"properties":{"file":{"type":"string"},"config":{"type":"object","additionalProperties":true,"properties":{}}}}},"postExport":{"type":"array","items":{"type":"object","additionalProperties":true,"properties":{"file":{"type":"string"},"config":{"type":"object","additionalProperties":true,"properties":{}}}}}}},"experiments":{"description":"Enable experimental features that may be unstable, unsupported, or removed without deprecation notices.","type":"object","additionalProperties":false,"properties":{"tsconfigPaths":{"description":"Enable tsconfig/jsconfig `compilerOptions.paths` and `compilerOptions.baseUrl` support for import aliases in Metro.","type":"boolean","fallback":false},"turboModules":{"description":"Enables Turbo Modules, which are a type of native modules that use a different way of communicating between JS and platform code. When installing a Turbo Module you will need to enable this experimental option (the library still needs to be a part of Expo SDK already, like react-native-reanimated v2). Turbo Modules do not support remote debugging and enabling this option will disable remote debugging.","type":"boolean","fallback":false}}},"_internal":{"description":"Internal properties for developer tools","type":"object","properties":{"pluginHistory":{"description":"List of plugins already run on the config","type":"object","properties":{},"additionalProperties":true}},"additionalProperties":true,"meta":{"autogenerated":true}}}
\ No newline at end of file
+{"name":{"description":"The name of your app as it appears both within Expo Go and on your home screen as a standalone app.","type":"string","meta":{"bareWorkflow":"To change the name of your app, edit the 'Display Name' field in Xcode and the `app_name` string in `android/app/src/main/res/values/strings.xml`"}},"description":{"description":"A short description of what your app is and why it is great.","type":"string"},"slug":{"description":"The friendly URL name for publishing. For example, `myAppName` will refer to the `expo.dev/@project-owner/myAppName` project.","type":"string","pattern":"^[a-zA-Z0-9_\\-]+$"},"owner":{"description":"The name of the Expo account that owns the project. This is useful for teams collaborating on a project. If not provided, the owner defaults to the username of the current user.","type":"string","minLength":1},"currentFullName":{"description":"The auto generated Expo account name and slug used for display purposes. It is not meant to be set directly. Formatted like `@username/slug`. When unauthenticated, the username is `@anonymous`. For published projects, this value may change when a project is transferred between accounts or renamed.","type":"string","meta":{"autogenerated":true}},"originalFullName":{"description":"The auto generated Expo account name and slug used for services like Notifications and AuthSession proxy. It is not meant to be set directly. Formatted like `@username/slug`. When unauthenticated, the username is `@anonymous`. For published projects, this value will not change when a project is transferred between accounts or renamed.","type":"string","meta":{"autogenerated":true}},"privacy":{"description":"Defaults to `unlisted`. `unlisted` hides the project from search results. `hidden` restricts access to the project page to only the owner and other users that have been granted access. Valid values: `public`, `unlisted`, `hidden`.","enum":["public","unlisted","hidden"],"type":"string","fallback":"unlisted"},"sdkVersion":{"description":"The Expo sdkVersion to run the project on. This should line up with the version specified in your package.json.","type":"string","pattern":"^(\\d+\\.\\d+\\.\\d+)|(UNVERSIONED)$"},"runtimeVersion":{"description":"**Note: Don't use this property unless you are sure what you're doing** \n\nThe runtime version associated with this manifest.\nSet this to `{\"policy\": \"nativeVersion\"}` to generate it automatically.","tsType":"string | { policy: 'nativeVersion' | 'sdkVersion' | 'appVersion'; }","oneOf":[{"type":"string","pattern":"^[a-zA-Z\\d][a-zA-Z\\d._+()-]{0,254}$","meta":{"notHuman":"String beginning with an alphanumeric character followed by any combination of alphanumeric character, \"_\", \"+\", \".\",\"(\", \")\", or \"-\". Valid examples: \"1.0.3a+\", \"1.0.0\", \"0\".","regexHuman":"String beginning with an alphanumeric character followed by any combination of alphanumeric character, \"_\", \"+\", \".\",\"(\", \")\", or \"-\". Valid examples: \"1.0.3a+\", \"1.0.0\", \"0\"."}},{"type":"string","pattern":"^exposdk:((\\d+\\.\\d+\\.\\d+)|(UNVERSIONED))$","meta":{"regexHuman":"An 'exposdk:' prefix followed by the SDK version of your project. Example: \"exposdk:44.0.0\"."}},{"type":"object","properties":{"policy":{"type":"string","enum":["nativeVersion","sdkVersion","appVersion"]}},"required":["policy"],"additionalProperties":false}]},"version":{"description":"Your app version. In addition to this field, you'll also use `ios.buildNumber` and `android.versionCode` — read more about how to version your app [here](https://docs.expo.dev/distribution/app-stores/#versioning-your-app). On iOS this corresponds to `CFBundleShortVersionString`, and on Android, this corresponds to `versionName`. The required format can be found [here](https://developer.apple.com/documentation/bundleresources/information_property_list/cfbundleshortversionstring).","type":"string","meta":{"bareWorkflow":"To change your app version, edit the 'Version' field in Xcode and the `versionName` string in `android/app/build.gradle`"}},"platforms":{"description":"Platforms that your project explicitly supports. If not specified, it defaults to `[\"ios\", \"android\"]`.","example":["ios","android","web"],"type":"array","uniqueItems":true,"items":{"type":"string","enum":["android","ios","web"]}},"githubUrl":{"description":"If you would like to share the source code of your app on Github, enter the URL for the repository here and it will be linked to from your Expo project page.","pattern":"^https://github\\.com/","example":"https://github.com/expo/expo","type":["string"]},"orientation":{"description":"Locks your app to a specific orientation with portrait or landscape. Defaults to no lock. Valid values: `default`, `portrait`, `landscape`","enum":["default","portrait","landscape"],"type":"string"},"userInterfaceStyle":{"description":"Configuration to force the app to always use the light or dark user-interface appearance, such as \"dark mode\", or make it automatically adapt to the system preferences. If not provided, defaults to `light`. Requires `expo-system-ui` be installed in your project to work on Android.","type":"string","fallback":"light","enum":["light","dark","automatic"]},"backgroundColor":{"description":"The background color for your app, behind any of your React views. This is also known as the root view background color. Requires `expo-system-ui` be installed in your project to work on iOS.","type":"string","pattern":"^#|(#)\\d{6}$","meta":{"regexHuman":"6 character long hex color string, for example, `'#000000'`. Default is white: `'#ffffff'`"}},"primaryColor":{"description":"On Android, this will determine the color of your app in the multitasker. Currently this is not used on iOS, but it may be used for other purposes in the future.","type":"string","pattern":"^#|(#)\\d{6}$","meta":{"regexHuman":"6 character long hex color string, for example, `'#000000'`"}},"icon":{"description":"Local path or remote URL to an image to use for your app's icon. We recommend that you use a 1024x1024 png file. This icon will appear on the home screen and within the Expo app.","type":"string","meta":{"asset":true,"contentTypePattern":"^image/png$","contentTypeHuman":".png image","square":true,"bareWorkflow":"To change your app's icon, edit or replace the files in `ios//Assets.xcassets/AppIcon.appiconset` (we recommend using Xcode), and `android/app/src/main/res/mipmap-`. Be sure to follow the guidelines for each platform ([iOS](https://developer.apple.com/design/human-interface-guidelines/ios/icons-and-images/app-icon/), [Android 7.1 and below](https://material.io/design/iconography/#icon-treatments), and [Android 8+](https://developer.android.com/guide/practices/ui_guidelines/icon_design_adaptive)) and to provide your new icon in each existing size."}},"notification":{"description":"Configuration for remote (push) notifications.","type":"object","properties":{"icon":{"description":"(Android only) Local path or remote URL to an image to use as the icon for push notifications. 96x96 png grayscale with transparency. We recommend following [Google's design guidelines](https://material.io/design/iconography/product-icons.html#design-principles). If not provided, defaults to your app icon.","type":"string","meta":{"asset":true,"contentTypePattern":"^image/png$","contentTypeHuman":".png image","square":true}},"color":{"description":"(Android only) Tint color for the push notification image when it appears in the notification tray. Defaults to `#ffffff`","type":"string","pattern":"^#|(#)\\d{6}$","meta":{"regexHuman":"6 character long hex color string, for example, `'#000000'`"}},"iosDisplayInForeground":{"description":"Whether or not to display notifications when the app is in the foreground on iOS. `_displayInForeground` option in the individual push notification message overrides this option. [Learn more.](https://docs.expo.dev/push-notifications/receiving-notifications/#foreground-notification-behavior) Defaults to `false`.","type":"boolean"},"androidMode":{"description":"Show each push notification individually (`default`) or collapse into one (`collapse`).","enum":["default","collapse"],"type":"string"},"androidCollapsedTitle":{"description":"If `androidMode` is set to `collapse`, this title is used for the collapsed notification message. For example, `'#{unread_notifications} new interactions'`.","type":"string"}},"additionalProperties":false},"androidStatusBar":{"description":"Configuration for the status bar on Android. For more details please navigate to [Configuring StatusBar](https://docs.expo.dev/guides/configuring-statusbar/).","type":"object","properties":{"barStyle":{"description":"Configures the status bar icons to have a light or dark color. Valid values: `light-content`, `dark-content`. Defaults to `dark-content`","type":"string","enum":["light-content","dark-content"]},"backgroundColor":{"description":"Specifies the background color of the status bar. Defaults to `#00000000` (transparent) for `dark-content` bar style and `#00000088` (semi-transparent black) for `light-content` bar style","type":"string","pattern":"^#|(#)\\d{6}$","meta":{"regexHuman":"6 character long hex color string `'#RRGGBB'`, for example, `'#000000'` for black. Or 8 character long hex color string `'#RRGGBBAA'`, for example, `'#00000088'` for semi-transparent black."}},"hidden":{"description":"Instructs the system whether the status bar should be visible or not. Defaults to `false`","type":"boolean"},"translucent":{"description":"When false, the system status bar pushes the content of your app down (similar to `position: relative`). When true, the status bar floats above the content in your app (similar to `position: absolute`). Defaults to `true` to match the iOS status bar behavior (which can only float above content). Explicitly setting this property to `true` will add `android:windowTranslucentStatus` to `styles.xml` and may cause unexpected keyboard behavior on Android when using the `softwareKeyboardLayoutMode` set to `resize`. In this case you will have to use `KeyboardAvoidingView` to manage the keyboard layout.","type":"boolean"}},"additionalProperties":false},"androidNavigationBar":{"description":"Configuration for the bottom navigation bar on Android. Can be used to configure the `expo-navigation-bar` module in EAS Build.","type":"object","properties":{"visible":{"description":"Determines how and when the navigation bar is shown. [Learn more](https://developer.android.com/training/system-ui/immersive). Requires `expo-navigation-bar` be installed in your project. Valid values: `leanback`, `immersive`, `sticky-immersive` \n\n `leanback` results in the navigation bar being hidden until the first touch gesture is registered. \n\n `immersive` results in the navigation bar being hidden until the user swipes up from the edge where the navigation bar is hidden. \n\n `sticky-immersive` is identical to `'immersive'` except that the navigation bar will be semi-transparent and will be hidden again after a short period of time.","type":"string","enum":["leanback","immersive","sticky-immersive"]},"barStyle":{"description":"Configure the navigation bar icons to have a light or dark color. Supported on Android Oreo and newer. Valid values: `'light-content'`, `'dark-content'`","type":"string","enum":["light-content","dark-content"]},"backgroundColor":{"description":"Specifies the background color of the navigation bar.","type":"string","pattern":"^#|(#)\\d{6}$","meta":{"regexHuman":"6 character long hex color string, for example, `'#000000'`"}}},"additionalProperties":false},"developmentClient":{"description":"Settings that apply specifically to running this app in a development client","type":"object","properties":{"silentLaunch":{"description":"If true, the app will launch in a development client with no additional dialogs or progress indicators, just like in a standalone app.","type":"boolean","fallback":false}},"additionalProperties":false},"scheme":{"description":"URL scheme(s) to link into your app. For example, if we set this to `'demo'`, then demo:// URLs would open your app when tapped. This is a build-time configuration, it has no effect in Expo Go.","oneOf":[{"type":"string","pattern":"^[a-z][a-z0-9+.-]*$"},{"type":"array","items":{"type":"string","pattern":"^[a-z][a-z0-9+.-]*$"}}],"meta":{"regexHuman":"String beginning with a **lowercase** letter followed by any combination of **lowercase** letters, digits, \"+\", \".\" or \"-\"","standaloneOnly":true,"bareWorkflow":"To change your app's scheme, replace all occurrences of the old scheme in `Info.plist` and `AndroidManifest.xml`"}},"extra":{"description":"Any extra fields you want to pass to your experience. Values are accessible via `Constants.expoConfig.extra` ([Learn more](https://docs.expo.dev/versions/latest/sdk/constants/#constantsmanifest))","type":"object","properties":{},"additionalProperties":true},"packagerOpts":{"description":"@deprecated Use a `metro.config.js` file instead. [Learn more](https://docs.expo.dev/guides/customizing-metro/)","meta":{"deprecated":true,"autogenerated":true},"type":"object","properties":{},"additionalProperties":true},"updates":{"description":"Configuration for how and when the app should request OTA JavaScript updates","type":"object","properties":{"enabled":{"description":"If set to false, your standalone app will never download any code, and will only use code bundled locally on the device. In that case, all updates to your app must be submitted through app store review. Defaults to true. (Note: This will not work out of the box with ExpoKit projects)","type":"boolean"},"checkAutomatically":{"description":"By default, Expo will check for updates every time the app is loaded. Set this to `ON_ERROR_RECOVERY` to disable automatic checking unless recovering from an error. Set this to `NEVER` to completely disable automatic checking. Must be one of `ON_LOAD` (default value), `ON_ERROR_RECOVERY`, `WIFI_ONLY`, or `NEVER`","enum":["ON_ERROR_RECOVERY","ON_LOAD","WIFI_ONLY","NEVER"],"type":"string"},"fallbackToCacheTimeout":{"description":"How long (in ms) to allow for fetching OTA updates before falling back to a cached version of the app. Defaults to 0. Must be between 0 and 300000 (5 minutes).","type":"number","minimum":0,"maximum":300000},"url":{"description":"URL from which expo-updates will fetch update manifests","type":"string"},"codeSigningCertificate":{"description":"Local path of a PEM-formatted X.509 certificate used for requiring and verifying signed Expo updates","type":"string"},"codeSigningMetadata":{"description":"Metadata for `codeSigningCertificate`","type":"object","properties":{"alg":{"description":"Algorithm used to generate manifest code signing signature.","enum":["rsa-v1_5-sha256"],"type":"string"},"keyid":{"description":"Identifier for the key in the certificate. Used to instruct signing mechanisms when signing or verifying signatures.","type":"string"}},"additionalProperties":false},"requestHeaders":{"description":"Extra HTTP headers to include in HTTP requests made by `expo-updates`. These may override preset headers.","type":"object","additionalProperties":true},"useClassicUpdates":{"description":"Whether to use deprecated Classic Updates when developing with the local Expo CLI and creating builds. Omitting this or setting it to false affects the behavior of APIs like `Constants.manifest`. SDK 49 is the last SDK version that supports Classic Updates.","type":"boolean"}},"additionalProperties":false},"locales":{"description":"Provide overrides by locale for System Dialog prompts like Permissions Boxes","type":"object","properties":{},"meta":{"bareWorkflow":"To add or change language and localization information in your iOS app, you need to use Xcode."},"additionalProperties":{"type":["string","object"]}},"assetBundlePatterns":{"description":"An array of file glob strings which point to assets that will be bundled within your standalone app binary. Read more in the [Offline Support guide](https://docs.expo.dev/guides/offline-support/)","type":"array","items":{"type":"string"}},"plugins":{"description":"Config plugins for adding extra functionality to your project. [Learn more](https://docs.expo.dev/guides/config-plugins/).","meta":{"bareWorkflow":"Plugins that add modifications can only be used with [prebuilding](https://expo.fyi/prebuilding) and managed EAS Build"},"type":"array","items":{"anyOf":[{"type":["string"]},{"type":"array","items":[{"type":["string"]},{}],"additionalItems":false}]}},"splash":{"description":"Configuration for loading and splash screen for standalone apps.","type":"object","properties":{"backgroundColor":{"description":"Color to fill the loading screen background","type":"string","pattern":"^#|(#)\\d{6}$","meta":{"regexHuman":"6 character long hex color string, for example, `'#000000'`","bareWorkflow":"For Android, edit the `colorPrimary` item in `android/app/src/main/res/values/colors.xml`"}},"resizeMode":{"description":"Determines how the `image` will be displayed in the splash loading screen. Must be one of `cover` or `contain`, defaults to `contain`.","enum":["cover","contain"],"type":"string"},"image":{"description":"Local path or remote URL to an image to fill the background of the loading screen. Image size and aspect ratio are up to you. Must be a .png.","type":"string","meta":{"asset":true,"contentTypePattern":"^image/png$","contentTypeHuman":".png image"}}},"meta":{"bareWorkflow":"To change your app's icon, edit or replace the files in `ios//Assets.xcassets/AppIcon.appiconset` (we recommend using Xcode), and `android/app/src/main/res/mipmap-` (Android Studio can [generate the appropriate image files for you](https://developer.android.com/studio/write/image-asset-studio)). Be sure to follow the guidelines for each platform ([iOS](https://developer.apple.com/design/human-interface-guidelines/ios/icons-and-images/app-icon/), [Android 7.1 and below](https://material.io/design/iconography/#icon-treatments), and [Android 8+](https://developer.android.com/guide/practices/ui_guidelines/icon_design_adaptive)) and to provide your new icon in each required size."}},"jsEngine":{"description":"Specifies the JavaScript engine for apps. Supported only on EAS Build. Defaults to `hermes`. Valid values: `hermes`, `jsc`.","type":"string","enum":["hermes","jsc"],"meta":{"bareWorkflow":"To change the JavaScript engine, update the `expo.jsEngine` value in `ios/Podfile.properties.json` or `android/gradle.properties`"}},"ios":{"description":"Configuration that is specific to the iOS platform.","type":"object","meta":{"standaloneOnly":true},"properties":{"publishManifestPath":{"description":"The manifest for the iOS version of your app will be written to this path during publish.","type":"string","meta":{"autogenerated":true}},"publishBundlePath":{"description":"The bundle for the iOS version of your app will be written to this path during publish.","type":"string","meta":{"autogenerated":true}},"bundleIdentifier":{"description":"The bundle identifier for your iOS standalone app. You make it up, but it needs to be unique on the App Store. See [this StackOverflow question](http://stackoverflow.com/questions/11347470/what-does-bundle-identifier-mean-in-the-ios-project).","type":"string","pattern":"^[a-zA-Z0-9.-]+$","meta":{"bareWorkflow":"Set this value in `info.plist` under `CFBundleIdentifier`","regexHuman":"iOS bundle identifier notation unique name for your app. For example, `host.exp.expo`, where `exp.host` is our domain and `expo` is our app name."}},"buildNumber":{"description":"Build number for your iOS standalone app. Corresponds to `CFBundleVersion` and must match Apple's [specified format](https://developer.apple.com/documentation/bundleresources/information_property_list/cfbundleversion). (Note: Transporter will pull the value for `Version Number` from `expo.version` and NOT from `expo.ios.buildNumber`.)","type":"string","pattern":"^[A-Za-z0-9\\.]+$","meta":{"bareWorkflow":"Set this value in `info.plist` under `CFBundleVersion`"}},"backgroundColor":{"description":"The background color for your iOS app, behind any of your React views. Overrides the top-level `backgroundColor` key if it is present. Requires `expo-system-ui` be installed in your project to work on iOS.","type":"string","pattern":"^#|(#)\\d{6}$","meta":{"regexHuman":"6 character long hex color string, for example, `'#000000'`"}},"icon":{"description":"Local path or remote URL to an image to use for your app's icon on iOS. If specified, this overrides the top-level `icon` key. Use a 1024x1024 icon which follows Apple's interface guidelines for icons, including color profile and transparency. \n\n Expo will generate the other required sizes. This icon will appear on the home screen and within the Expo app.","type":"string","meta":{"asset":true,"contentTypePattern":"^image/png$","contentTypeHuman":".png image","square":true}},"appStoreUrl":{"description":"URL to your app on the Apple App Store, if you have deployed it there. This is used to link to your store page from your Expo project page if your app is public.","pattern":"^https://(itunes|apps)\\.apple\\.com/.*?\\d+","example":"https://apps.apple.com/us/app/expo-client/id982107779","type":["string"]},"bitcode":{"description":"Enable iOS Bitcode optimizations in the native build. Accepts the name of an iOS build configuration to enable for a single configuration and disable for all others, e.g. Debug, Release. Not available in Expo Go. Defaults to `undefined` which uses the template's predefined settings.","anyOf":[{"type":["boolean"]},{"type":["string"]}]},"config":{"type":"object","description":"Note: This property key is not included in the production manifest and will evaluate to `undefined`. It is used internally only in the build process, because it contains API keys that some may want to keep private.","properties":{"branch":{"description":"[Branch](https://branch.io/) key to hook up Branch linking services.","type":"object","properties":{"apiKey":{"description":"Your Branch API key","type":"string"}},"additionalProperties":false},"usesNonExemptEncryption":{"description":"Sets `ITSAppUsesNonExemptEncryption` in the standalone ipa's Info.plist to the given boolean value.","type":"boolean"},"googleMapsApiKey":{"description":"[Google Maps iOS SDK](https://developers.google.com/maps/documentation/ios-sdk/start) key for your standalone app.","type":"string"},"googleMobileAdsAppId":{"description":"[Google Mobile Ads App ID](https://support.google.com/admob/answer/6232340) Google AdMob App ID. ","type":"string"},"googleMobileAdsAutoInit":{"description":"A boolean indicating whether to initialize Google App Measurement and begin sending user-level event data to Google immediately when the app starts. The default in Expo (Go and in standalone apps) is `false`. [Sets the opposite of the given value to the following key in `Info.plist`.](https://developers.google.com/admob/ios/eu-consent#delay_app_measurement_optional)","type":"boolean","fallback":false}},"additionalProperties":false},"googleServicesFile":{"description":"[Firebase Configuration File](https://support.google.com/firebase/answer/7015592) Location of the `GoogleService-Info.plist` file for configuring Firebase.","type":"string"},"supportsTablet":{"description":"Whether your standalone iOS app supports tablet screen sizes. Defaults to `false`.","type":"boolean","meta":{"bareWorkflow":"Set this value in `info.plist` under `UISupportedInterfaceOrientations~ipad`"}},"isTabletOnly":{"description":"If true, indicates that your standalone iOS app does not support handsets, and only supports tablets.","type":"boolean","meta":{"bareWorkflow":"Set this value in `info.plist` under `UISupportedInterfaceOrientations`"}},"requireFullScreen":{"description":"If true, indicates that your standalone iOS app does not support Slide Over and Split View on iPad. Defaults to `false`","type":"boolean","meta":{"bareWorkflow":"Use Xcode to set `UIRequiresFullScreen`"}},"userInterfaceStyle":{"description":"Configuration to force the app to always use the light or dark user-interface appearance, such as \"dark mode\", or make it automatically adapt to the system preferences. If not provided, defaults to `light`.","type":"string","fallback":"light","enum":["light","dark","automatic"]},"infoPlist":{"description":"Dictionary of arbitrary configuration to add to your standalone app's native Info.plist. Applied prior to all other Expo-specific configuration. No other validation is performed, so use this at your own risk of rejection from the App Store.","type":"object","properties":{},"additionalProperties":true},"entitlements":{"description":"Dictionary of arbitrary configuration to add to your standalone app's native *.entitlements (plist). Applied prior to all other Expo-specific configuration. No other validation is performed, so use this at your own risk of rejection from the App Store.","type":"object","properties":{},"additionalProperties":true},"associatedDomains":{"description":"An array that contains Associated Domains for the standalone app. [Learn more](https://developer.apple.com/documentation/safariservices/supporting_associated_domains).","type":"array","uniqueItems":true,"items":{"type":"string"},"meta":{"regexHuman":"Entries must follow the format `applinks:[:port number]`. [Learn more](https://developer.apple.com/documentation/safariservices/supporting_associated_domains).","bareWorkflow":"Build with EAS, or use Xcode to enable this capability manually. [Learn more](https://developer.apple.com/documentation/safariservices/supporting_associated_domains)."}},"usesIcloudStorage":{"description":"A boolean indicating if the app uses iCloud Storage for `DocumentPicker`. See `DocumentPicker` docs for details.","type":"boolean","meta":{"bareWorkflow":"Use Xcode, or ios.entitlements to configure this."}},"usesAppleSignIn":{"description":"A boolean indicating if the app uses Apple Sign-In. See `AppleAuthentication` docs for details.","type":"boolean","fallback":false},"accessesContactNotes":{"description":"A Boolean value that indicates whether the app may access the notes stored in contacts. You must [receive permission from Apple](https://developer.apple.com/documentation/bundleresources/entitlements/com_apple_developer_contacts_notes) before you can submit your app for review with this capability.","type":"boolean","fallback":false},"splash":{"description":"Configuration for loading and splash screen for standalone iOS apps.","type":"object","properties":{"backgroundColor":{"description":"Color to fill the loading screen background","type":"string","pattern":"^#|(#)\\d{6}$","meta":{"regexHuman":"6 character long hex color string, for example, `'#000000'`"}},"resizeMode":{"description":"Determines how the `image` will be displayed in the splash loading screen. Must be one of `cover` or `contain`, defaults to `contain`.","enum":["cover","contain"],"type":"string"},"image":{"description":"Local path or remote URL to an image to fill the background of the loading screen. Image size and aspect ratio are up to you. Must be a .png.","type":"string","meta":{"asset":true,"contentTypePattern":"^image/png$","contentTypeHuman":".png image"}},"tabletImage":{"description":"Local path or remote URL to an image to fill the background of the loading screen. Image size and aspect ratio are up to you. Must be a .png.","type":"string","meta":{"asset":true,"contentTypePattern":"^image/png$","contentTypeHuman":".png image"}},"dark":{"description":"Configuration for loading and splash screen for standalone iOS apps in dark mode.","type":"object","properties":{"backgroundColor":{"description":"Color to fill the loading screen background","type":"string","pattern":"^#|(#)\\d{6}$","meta":{"regexHuman":"6 character long hex color string, for example, `'#000000'`"}},"resizeMode":{"description":"Determines how the `image` will be displayed in the splash loading screen. Must be one of `cover` or `contain`, defaults to `contain`.","enum":["cover","contain"],"type":"string"},"image":{"description":"Local path or remote URL to an image to fill the background of the loading screen. Image size and aspect ratio are up to you. Must be a .png.","type":"string","meta":{"asset":true,"contentTypePattern":"^image/png$","contentTypeHuman":".png image"}},"tabletImage":{"description":"Local path or remote URL to an image to fill the background of the loading screen. Image size and aspect ratio are up to you. Must be a .png.","type":"string","meta":{"asset":true,"contentTypePattern":"^image/png$","contentTypeHuman":".png image"}}}}}},"jsEngine":{"description":"Specifies the JavaScript engine for iOS apps. Supported only on EAS Build. Defaults to `hermes`. Valid values: `hermes`, `jsc`.","type":"string","enum":["hermes","jsc"],"meta":{"bareWorkflow":"To change the JavaScript engine, update the `expo.jsEngine` value in `ios/Podfile.properties.json`"}},"runtimeVersion":{"description":"**Note: Don't use this property unless you are sure what you're doing** \n\nThe runtime version associated with this manifest for the iOS platform. If provided, this will override the top level runtimeVersion key.\nSet this to `{\"policy\": \"nativeVersion\"}` to generate it automatically.","tsType":"string | { policy: 'nativeVersion' | 'sdkVersion' | 'appVersion'; }","oneOf":[{"type":"string","pattern":"^[a-zA-Z\\d][a-zA-Z\\d._+()-]{0,254}$","meta":{"notHuman":"String beginning with an alphanumeric character followed by any combination of alphanumeric character, \"_\", \"+\", \".\",\"(\", \")\", or \"-\". Valid examples: \"1.0.3a+\", \"1.0.0\", \"0\".","regexHuman":"String beginning with an alphanumeric character followed by any combination of alphanumeric character, \"_\", \"+\", \".\",\"(\", \")\", or \"-\". Valid examples: \"1.0.3a+\", \"1.0.0\", \"0\"."}},{"type":"string","pattern":"^exposdk:((\\d+\\.\\d+\\.\\d+)|(UNVERSIONED))$","meta":{"regexHuman":"An 'exposdk:' prefix followed by the SDK version of your project. Example: \"exposdk:44.0.0\"."}},{"type":"object","properties":{"policy":{"type":"string","enum":["nativeVersion","sdkVersion","appVersion"]}},"required":["policy"],"additionalProperties":false}]}},"additionalProperties":false},"android":{"description":"Configuration that is specific to the Android platform.","type":"object","meta":{"standaloneOnly":true},"properties":{"publishManifestPath":{"description":"The manifest for the Android version of your app will be written to this path during publish.","type":"string","meta":{"autogenerated":true}},"publishBundlePath":{"description":"The bundle for the Android version of your app will be written to this path during publish.","type":"string","meta":{"autogenerated":true}},"package":{"description":"The package name for your Android standalone app. You make it up, but it needs to be unique on the Play Store. See [this StackOverflow question](http://stackoverflow.com/questions/6273892/android-package-name-convention).","type":"string","pattern":"^[a-zA-Z][a-zA-Z0-9\\_]*(\\.[a-zA-Z][a-zA-Z0-9\\_]*)+$","meta":{"regexHuman":"Reverse DNS notation unique name for your app. Valid Android Application ID. For example, `com.example.app`, where `com.example` is our domain and `app` is our app. The name may only contain lowercase and uppercase letters (a-z, A-Z), numbers (0-9) and underscores (_), separated by periods (.). Each component of the name should start with a lowercase letter.","bareWorkflow":"This is set in `android/app/build.gradle` as `applicationId` as well as in your `AndroidManifest.xml` file (multiple places)."}},"versionCode":{"description":"Version number required by Google Play. Increment by one for each release. Must be a positive integer. [Learn more](https://developer.android.com/studio/publish/versioning.html)","type":"integer","minimum":0,"maximum":2100000000,"meta":{"bareWorkflow":"This is set in `android/app/build.gradle` as `versionCode`"}},"backgroundColor":{"description":"The background color for your Android app, behind any of your React views. Overrides the top-level `backgroundColor` key if it is present.","type":"string","pattern":"^#|(#)\\d{6}$","meta":{"regexHuman":"6 character long hex color string, for example, `'#000000'`","bareWorkflow":"This is set in `android/app/src/main/AndroidManifest.xml` under `android:windowBackground`"}},"userInterfaceStyle":{"description":"Configuration to force the app to always use the light or dark user-interface appearance, such as \"dark mode\", or make it automatically adapt to the system preferences. If not provided, defaults to `light`. Requires `expo-system-ui` be installed in your project to work on Android.","type":"string","fallback":"light","enum":["light","dark","automatic"]},"icon":{"description":"Local path or remote URL to an image to use for your app's icon on Android. If specified, this overrides the top-level `icon` key. We recommend that you use a 1024x1024 png file (transparency is recommended for the Google Play Store). This icon will appear on the home screen and within the Expo app.","type":"string","meta":{"asset":true,"contentTypePattern":"^image/png$","contentTypeHuman":".png image","square":true}},"adaptiveIcon":{"description":"Settings for an Adaptive Launcher Icon on Android. [Learn more](https://developer.android.com/guide/practices/ui_guidelines/icon_design_adaptive)","type":"object","properties":{"foregroundImage":{"description":"Local path or remote URL to an image to use for your app's icon on Android. If specified, this overrides the top-level `icon` and the `android.icon` keys. Should follow the [specified guidelines](https://developer.android.com/guide/practices/ui_guidelines/icon_design_adaptive). This icon will appear on the home screen.","type":"string","meta":{"asset":true,"contentTypePattern":"^image/png$","contentTypeHuman":".png image","square":true}},"monochromeImage":{"description":"Local path or remote URL to an image representing the Android 13+ monochromatic icon. Should follow the [specified guidelines](https://developer.android.com/guide/practices/ui_guidelines/icon_design_adaptive). This icon will appear on the home screen when the user enables 'Themed icons' in system settings on a device running Android 13+.","type":"string","meta":{"asset":true,"contentTypePattern":"^image/png$","contentTypeHuman":".png image","square":true}},"backgroundImage":{"description":"Local path or remote URL to a background image for your app's Adaptive Icon on Android. If specified, this overrides the `backgroundColor` key. Must have the same dimensions as `foregroundImage`, and has no effect if `foregroundImage` is not specified. Should follow the [specified guidelines](https://developer.android.com/guide/practices/ui_guidelines/icon_design_adaptive).","type":"string","meta":{"asset":true,"contentTypePattern":"^image/png$","contentTypeHuman":".png image","square":true}},"backgroundColor":{"description":"Color to use as the background for your app's Adaptive Icon on Android. Defaults to white, `#FFFFFF`. Has no effect if `foregroundImage` is not specified.","type":"string","pattern":"^#|(#)\\d{6}$","meta":{"regexHuman":"6 character long hex color string, for example, `'#000000'`"}}},"additionalProperties":false},"playStoreUrl":{"description":"URL to your app on the Google Play Store, if you have deployed it there. This is used to link to your store page from your Expo project page if your app is public.","pattern":"^https://play\\.google\\.com/","example":"https://play.google.com/store/apps/details?id=host.exp.exponent","type":["string"]},"permissions":{"description":"List of permissions used by the standalone app. \n\n To use ONLY the following minimum necessary permissions and none of the extras supported by Expo in a default managed app, set `permissions` to `[]`. The minimum necessary permissions do not require a Privacy Policy when uploading to Google Play Store and are: \n• receive data from Internet \n• view network connections \n• full network access \n• change your audio settings \n• prevent device from sleeping \n\n To use ALL permissions supported by Expo by default, do not specify the `permissions` key. \n\n To use the minimum necessary permissions ALONG with certain additional permissions, specify those extras in `permissions`, e.g.\n\n `[ \"CAMERA\", \"ACCESS_FINE_LOCATION\" ]`.\n\n You can specify the following permissions depending on what you need:\n\n- `ACCESS_COARSE_LOCATION`\n- `ACCESS_FINE_LOCATION`\n- `ACCESS_BACKGROUND_LOCATION`\n- `CAMERA`\n- `RECORD_AUDIO`\n- `READ_CONTACTS`\n- `WRITE_CONTACTS`\n- `READ_CALENDAR`\n- `WRITE_CALENDAR`\n- `READ_EXTERNAL_STORAGE`\n- `WRITE_EXTERNAL_STORAGE`\n- `USE_FINGERPRINT`\n- `USE_BIOMETRIC`\n- `WRITE_SETTINGS`\n- `VIBRATE`\n- `READ_PHONE_STATE`\n- `FOREGROUND_SERVICE`\n- `WAKE_LOCK`\n- `com.anddoes.launcher.permission.UPDATE_COUNT`\n- `com.android.launcher.permission.INSTALL_SHORTCUT`\n- `com.google.android.c2dm.permission.RECEIVE`\n- `com.google.android.gms.permission.ACTIVITY_RECOGNITION`\n- `com.google.android.providers.gsf.permission.READ_GSERVICES`\n- `com.htc.launcher.permission.READ_SETTINGS`\n- `com.htc.launcher.permission.UPDATE_SHORTCUT`\n- `com.majeur.launcher.permission.UPDATE_BADGE`\n- `com.sec.android.provider.badge.permission.READ`\n- `com.sec.android.provider.badge.permission.WRITE`\n- `com.sonyericsson.home.permission.BROADCAST_BADGE`\n","type":"array","meta":{"bareWorkflow":"To change the permissions your app requests, you'll need to edit `AndroidManifest.xml` manually. To prevent your app from requesting one of the permissions listed below, you'll need to explicitly add it to `AndroidManifest.xml` along with a `tools:node=\"remove\"` tag."},"items":{"type":"string"}},"blockedPermissions":{"description":"List of permissions to block in the final `AndroidManifest.xml`. This is useful for removing permissions that are added by native package `AndroidManifest.xml` files which are merged into the final manifest. Internally this feature uses the `tools:node=\"remove\"` XML attribute to remove permissions. Not available in Expo Go.","type":"array","items":{"type":"string"}},"googleServicesFile":{"description":"[Firebase Configuration File](https://support.google.com/firebase/answer/7015592) Location of the `GoogleService-Info.plist` file for configuring Firebase. Including this key automatically enables FCM in your standalone app.","type":"string","meta":{"bareWorkflow":"Add or edit the file directly at `android/app/google-services.json`"}},"config":{"type":"object","description":"Note: This property key is not included in the production manifest and will evaluate to `undefined`. It is used internally only in the build process, because it contains API keys that some may want to keep private.","properties":{"branch":{"description":"[Branch](https://branch.io/) key to hook up Branch linking services.","type":"object","properties":{"apiKey":{"description":"Your Branch API key","type":"string"}},"additionalProperties":false},"googleMaps":{"description":"[Google Maps Android SDK](https://developers.google.com/maps/documentation/android-api/signup) configuration for your standalone app.","type":"object","properties":{"apiKey":{"description":"Your Google Maps Android SDK API key","type":"string"}},"additionalProperties":false},"googleMobileAdsAppId":{"description":"[Google Mobile Ads App ID](https://support.google.com/admob/answer/6232340) Google AdMob App ID. ","type":"string"},"googleMobileAdsAutoInit":{"description":"A boolean indicating whether to initialize Google App Measurement and begin sending user-level event data to Google immediately when the app starts. The default in Expo (Client and in standalone apps) is `false`. [Sets the opposite of the given value to the following key in `Info.plist`](https://developers.google.com/admob/ios/eu-consent#delay_app_measurement_optional)","type":"boolean","fallback":false}},"additionalProperties":false},"splash":{"description":"Configuration for loading and splash screen for managed and standalone Android apps.","type":"object","properties":{"backgroundColor":{"description":"Color to fill the loading screen background","type":"string","pattern":"^#|(#)\\d{6}$","meta":{"regexHuman":"6 character long hex color string, for example, `'#000000'`"}},"resizeMode":{"description":"Determines how the `image` will be displayed in the splash loading screen. Must be one of `cover`, `contain` or `native`, defaults to `contain`.","enum":["cover","contain","native"],"type":"string"},"image":{"description":"Local path or remote URL to an image to fill the background of the loading screen. Image size and aspect ratio are up to you. Must be a .png.","type":"string","meta":{"asset":true,"contentTypePattern":"^image/png$","contentTypeHuman":".png image"}},"mdpi":{"description":"Local path or remote URL to an image to fill the background of the loading screen in \"native\" mode. Image size and aspect ratio are up to you. [Learn more]( https://developer.android.com/training/multiscreen/screendensities) \n\n `Natural sized image (baseline)`","type":"string","meta":{"asset":true,"contentTypePattern":"^image/png$","contentTypeHuman":".png image"}},"hdpi":{"description":"Local path or remote URL to an image to fill the background of the loading screen in \"native\" mode. Image size and aspect ratio are up to you. [Learn more]( https://developer.android.com/training/multiscreen/screendensities) \n\n `Scale 1.5x`","type":"string","meta":{"asset":true,"contentTypePattern":"^image/png$","contentTypeHuman":".png image"}},"xhdpi":{"description":"Local path or remote URL to an image to fill the background of the loading screen in \"native\" mode. Image size and aspect ratio are up to you. [Learn more]( https://developer.android.com/training/multiscreen/screendensities) \n\n `Scale 2x`","type":"string","meta":{"asset":true,"contentTypePattern":"^image/png$","contentTypeHuman":".png image"}},"xxhdpi":{"description":"Local path or remote URL to an image to fill the background of the loading screen in \"native\" mode. Image size and aspect ratio are up to you. [Learn more]( https://developer.android.com/training/multiscreen/screendensities) \n\n `Scale 3x`","type":"string","meta":{"asset":true,"contentTypePattern":"^image/png$","contentTypeHuman":".png image"}},"xxxhdpi":{"description":"Local path or remote URL to an image to fill the background of the loading screen in \"native\" mode. Image size and aspect ratio are up to you. [Learn more]( https://developer.android.com/training/multiscreen/screendensities) \n\n `Scale 4x`","type":"string","meta":{"asset":true,"contentTypePattern":"^image/png$","contentTypeHuman":".png image"}},"dark":{"description":"Configuration for loading and splash screen for managed and standalone Android apps in dark mode.","type":"object","properties":{"backgroundColor":{"description":"Color to fill the loading screen background","type":"string","pattern":"^#|(#)\\d{6}$","meta":{"regexHuman":"6 character long hex color string, for example, `'#000000'`"}},"resizeMode":{"description":"Determines how the `image` will be displayed in the splash loading screen. Must be one of `cover`, `contain` or `native`, defaults to `contain`.","enum":["cover","contain","native"],"type":"string"},"image":{"description":"Local path or remote URL to an image to fill the background of the loading screen. Image size and aspect ratio are up to you. Must be a .png.","type":"string","meta":{"asset":true,"contentTypePattern":"^image/png$","contentTypeHuman":".png image"}},"mdpi":{"description":"Local path or remote URL to an image to fill the background of the loading screen in \"native\" mode. Image size and aspect ratio are up to you. [Learn more]( https://developer.android.com/training/multiscreen/screendensities) \n\n `Natural sized image (baseline)`","type":"string","meta":{"asset":true,"contentTypePattern":"^image/png$","contentTypeHuman":".png image"}},"hdpi":{"description":"Local path or remote URL to an image to fill the background of the loading screen in \"native\" mode. Image size and aspect ratio are up to you. [Learn more]( https://developer.android.com/training/multiscreen/screendensities) \n\n `Scale 1.5x`","type":"string","meta":{"asset":true,"contentTypePattern":"^image/png$","contentTypeHuman":".png image"}},"xhdpi":{"description":"Local path or remote URL to an image to fill the background of the loading screen in \"native\" mode. Image size and aspect ratio are up to you. [Learn more]( https://developer.android.com/training/multiscreen/screendensities) \n\n `Scale 2x`","type":"string","meta":{"asset":true,"contentTypePattern":"^image/png$","contentTypeHuman":".png image"}},"xxhdpi":{"description":"Local path or remote URL to an image to fill the background of the loading screen in \"native\" mode. Image size and aspect ratio are up to you. [Learn more]( https://developer.android.com/training/multiscreen/screendensities) \n\n `Scale 3x`","type":"string","meta":{"asset":true,"contentTypePattern":"^image/png$","contentTypeHuman":".png image"}},"xxxhdpi":{"description":"Local path or remote URL to an image to fill the background of the loading screen in \"native\" mode. Image size and aspect ratio are up to you. [Learn more]( https://developer.android.com/training/multiscreen/screendensities) \n\n `Scale 4x`","type":"string","meta":{"asset":true,"contentTypePattern":"^image/png$","contentTypeHuman":".png image"}}}}}},"intentFilters":{"description":"Configuration for setting an array of custom intent filters in Android manifest. [Learn more](https://developer.android.com/guide/components/intents-filters)","example":[{"autoVerify":true,"action":"VIEW","data":{"scheme":"https","host":"*.example.com"},"category":["BROWSABLE","DEFAULT"]}],"exampleString":"\n [{ \n \"autoVerify\": true, \n \"action\": \"VIEW\", \n \"data\": { \n \"scheme\": \"https\", \n \"host\": \"*.example.com\" \n }, \n \"category\": [\"BROWSABLE\", \"DEFAULT\"] \n }]","type":"array","uniqueItems":true,"items":{"type":"object","properties":{"autoVerify":{"description":"You may also use an intent filter to set your app as the default handler for links (without showing the user a dialog with options). To do so use `true` and then configure your server to serve a JSON file verifying that you own the domain. [Learn more](https://developer.android.com/training/app-links)","type":"boolean"},"action":{"type":"string"},"data":{"anyOf":[{"type":"object","properties":{"scheme":{"description":"Scheme of the URL, e.g. `https`","type":"string"},"host":{"description":"Hostname, e.g. `myapp.io`","type":"string"},"port":{"description":"Port, e.g. `3000`","type":"string"},"path":{"description":"Exact path for URLs that should be matched by the filter, e.g. `/records`","type":"string"},"pathPattern":{"description":"Pattern for paths that should be matched by the filter, e.g. `.*`. Must begin with `/`","type":"string"},"pathPrefix":{"description":"Prefix for paths that should be matched by the filter, e.g. `/records/` will match `/records/123`","type":"string"},"mimeType":{"description":"MIME type for URLs that should be matched by the filter","type":"string"}},"additionalProperties":false},{"type":["array"],"items":{"type":"object","properties":{"scheme":{"description":"Scheme of the URL, e.g. `https`","type":"string"},"host":{"description":"Hostname, e.g. `myapp.io`","type":"string"},"port":{"description":"Port, e.g. `3000`","type":"string"},"path":{"description":"Exact path for URLs that should be matched by the filter, e.g. `/records`","type":"string"},"pathPattern":{"description":"Pattern for paths that should be matched by the filter, e.g. `.*`. Must begin with `/`","type":"string"},"pathPrefix":{"description":"Prefix for paths that should be matched by the filter, e.g. `/records/` will match `/records/123`","type":"string"},"mimeType":{"description":"MIME type for URLs that should be matched by the filter","type":"string"}},"additionalProperties":false}}]},"category":{"anyOf":[{"type":["string"]},{"type":"array","items":{"type":"string"}}]}},"additionalProperties":false,"required":["action"]},"meta":{"bareWorkflow":"This is set in `AndroidManifest.xml` directly. [Learn more.](https://developer.android.com/guide/components/intents-filters)"}},"allowBackup":{"description":"Allows your user's app data to be automatically backed up to their Google Drive. If this is set to false, no backup or restore of the application will ever be performed (this is useful if your app deals with sensitive information). Defaults to the Android default, which is `true`.","fallback":true,"type":"boolean"},"softwareKeyboardLayoutMode":{"description":"Determines how the software keyboard will impact the layout of your application. This maps to the `android:windowSoftInputMode` property. Defaults to `resize`. Valid values: `resize`, `pan`.","enum":["resize","pan"],"type":"string","fallback":"resize"},"jsEngine":{"description":"Specifies the JavaScript engine for Android apps. Supported only on EAS Build and in Expo Go. Defaults to `hermes`. Valid values: `hermes`, `jsc`.","type":"string","enum":["hermes","jsc"],"meta":{"bareWorkflow":"To change the JavaScript engine, update the `expo.jsEngine` value in `android/gradle.properties`"}},"runtimeVersion":{"description":"**Note: Don't use this property unless you are sure what you're doing** \n\nThe runtime version associated with this manifest for the Android platform. If provided, this will override the top level runtimeVersion key.\nSet this to `{\"policy\": \"nativeVersion\"}` to generate it automatically.","tsType":"string | { policy: 'nativeVersion' | 'sdkVersion' | 'appVersion'; }","oneOf":[{"type":"string","pattern":"^[a-zA-Z\\d][a-zA-Z\\d._+()-]{0,254}$","meta":{"notHuman":"String beginning with an alphanumeric character followed by any combination of alphanumeric character, \"_\", \"+\", \".\",\"(\", \")\", or \"-\". Valid examples: \"1.0.3a+\", \"1.0.0\", \"0\".","regexHuman":"String beginning with an alphanumeric character followed by any combination of alphanumeric character, \"_\", \"+\", \".\",\"(\", \")\", or \"-\". Valid examples: \"1.0.3a+\", \"1.0.0\", \"0\"."}},{"type":"string","pattern":"^exposdk:((\\d+\\.\\d+\\.\\d+)|(UNVERSIONED))$","meta":{"regexHuman":"An 'exposdk:' prefix followed by the SDK version of your project. Example: \"exposdk:44.0.0\"."}},{"type":"object","properties":{"policy":{"type":"string","enum":["nativeVersion","sdkVersion","appVersion"]}},"required":["policy"],"additionalProperties":false}]}},"additionalProperties":false},"web":{"description":"Configuration that is specific to the web platform.","type":"object","additionalProperties":true,"properties":{"output":{"description":"Sets the rendering method for the web app for both `expo start` and `expo export`. `static` statically renders HTML files for every route in the `app/` directory, which is available only in Expo Router apps. `single` outputs a Single Page Application (SPA), with a single `index.html` in the output folder, and has no statically indexable HTML. Defaults to `single`.","enum":["single","static"],"type":"string"},"favicon":{"description":"Relative path of an image to use for your app's favicon.","type":"string"},"name":{"description":"Defines the title of the document, defaults to the outer level name","type":"string","meta":{"pwa":"name"}},"shortName":{"description":"A short version of the app's name, 12 characters or fewer. Used in app launcher and new tab pages. Maps to `short_name` in the PWA manifest.json. Defaults to the `name` property.","type":"string","meta":{"pwa":"short_name","regexHuman":"Maximum 12 characters long"}},"lang":{"description":"Specifies the primary language for the values in the name and short_name members. This value is a string containing a single language tag.","type":"string","fallback":"en","meta":{"pwa":"lang"}},"scope":{"description":"Defines the navigation scope of this website's context. This restricts what web pages can be viewed while the manifest is applied. If the user navigates outside the scope, it returns to a normal web page inside a browser tab/window. If the scope is a relative URL, the base URL will be the URL of the manifest.","type":"string","meta":{"pwa":"scope"}},"themeColor":{"description":"Defines the color of the Android tool bar, and may be reflected in the app's preview in task switchers.","type":"string","pattern":"^#|(#)\\d{6}$","meta":{"pwa":"theme_color","html":"theme-color","regexHuman":"6 character long hex color string, for example, `'#000000'`"}},"description":{"description":"Provides a general description of what the pinned website does.","type":"string","meta":{"html":"description","pwa":"description"}},"dir":{"description":"Specifies the primary text direction for the name, short_name, and description members. Together with the lang member, it helps the correct display of right-to-left languages.","enum":["auto","ltr","rtl"],"type":"string","meta":{"pwa":"dir"}},"display":{"description":"Defines the developers’ preferred display mode for the website.","enum":["fullscreen","standalone","minimal-ui","browser"],"type":"string","meta":{"pwa":"display"}},"startUrl":{"description":"The URL that loads when a user launches the application (e.g., when added to home screen), typically the index. Note: This has to be a relative URL, relative to the manifest URL.","type":"string","meta":{"pwa":"start_url"}},"orientation":{"description":"Defines the default orientation for all the website's top level browsing contexts.","enum":["any","natural","landscape","landscape-primary","landscape-secondary","portrait","portrait-primary","portrait-secondary"],"type":"string","meta":{"pwa":"orientation"}},"backgroundColor":{"description":"Defines the expected “background color” for the website. This value repeats what is already available in the site’s CSS, but can be used by browsers to draw the background color of a shortcut when the manifest is available before the stylesheet has loaded. This creates a smooth transition between launching the web application and loading the site's content.","type":"string","pattern":"^#|(#)\\d{6}$","meta":{"pwa":"background_color","regexHuman":"6 character long hex color string, for example, `'#000000'`"}},"barStyle":{"description":"If content is set to default, the status bar appears normal. If set to black, the status bar has a black background. If set to black-translucent, the status bar is black and translucent. If set to default or black, the web content is displayed below the status bar. If set to black-translucent, the web content is displayed on the entire screen, partially obscured by the status bar.","enum":["default","black","black-translucent"],"type":"string","fallback":"black-translucent","meta":{"html":"apple-mobile-web-app-status-bar-style","pwa":"name"}},"preferRelatedApplications":{"description":"Hints for the user agent to indicate to the user that the specified native applications (defined in expo.ios and expo.android) are recommended over the website.","type":"boolean","fallback":true,"meta":{"pwa":"prefer_related_applications"}},"dangerous":{"description":"Experimental features. These will break without deprecation notice.","type":"object","properties":{},"additionalProperties":true},"splash":{"description":"Configuration for PWA splash screens.","type":"object","properties":{"backgroundColor":{"description":"Color to fill the loading screen background","type":"string","pattern":"^#|(#)\\d{6}$","meta":{"regexHuman":"6 character long hex color string, for example, `'#000000'`"}},"resizeMode":{"description":"Determines how the `image` will be displayed in the splash loading screen. Must be one of `cover` or `contain`, defaults to `contain`.","enum":["cover","contain"],"type":"string"},"image":{"description":"Local path or remote URL to an image to fill the background of the loading screen. Image size and aspect ratio are up to you. Must be a .png.","type":"string","meta":{"asset":true,"contentTypePattern":"^image/png$","contentTypeHuman":".png image"}}},"meta":{"bareWorkflow":"Use [expo-splash-screen](https://github.com/expo/expo/tree/main/packages/expo-splash-screen#expo-splash-screen)"}},"config":{"description":"Firebase web configuration. Used by the expo-firebase packages on both web and native. [Learn more](https://firebase.google.com/docs/reference/js/firebase.html#initializeapp)","type":"object","properties":{"firebase":{"type":"object","properties":{"apiKey":{"type":"string"},"authDomain":{"type":"string"},"databaseURL":{"type":"string"},"projectId":{"type":"string"},"storageBucket":{"type":"string"},"messagingSenderId":{"type":"string"},"appId":{"type":"string"},"measurementId":{"type":"string"}}}}},"bundler":{"description":"Sets the bundler to use for the web platform. Only supported in the local CLI `npx expo`.","enum":["webpack","metro"],"fallback":"webpack"}}},"hooks":{"description":"Configuration for scripts to run to hook into the publish process","type":"object","additionalProperties":false,"properties":{"postPublish":{"type":"array","items":{"type":"object","additionalProperties":true,"properties":{"file":{"type":"string"},"config":{"type":"object","additionalProperties":true,"properties":{}}}}},"postExport":{"type":"array","items":{"type":"object","additionalProperties":true,"properties":{"file":{"type":"string"},"config":{"type":"object","additionalProperties":true,"properties":{}}}}}}},"experiments":{"description":"Enable experimental features that may be unstable, unsupported, or removed without deprecation notices.","type":"object","additionalProperties":false,"properties":{"tsconfigPaths":{"description":"Enable tsconfig/jsconfig `compilerOptions.paths` and `compilerOptions.baseUrl` support for import aliases in Metro.","type":"boolean","fallback":false},"typedRoutes":{"description":"Enable support for statically typed links in Expo Router. This feature requires TypeScript be set up in your Expo Router v2 project.","type":"boolean","fallback":false},"turboModules":{"description":"Enables Turbo Modules, which are a type of native modules that use a different way of communicating between JS and platform code. When installing a Turbo Module you will need to enable this experimental option (the library still needs to be a part of Expo SDK already, like react-native-reanimated v2). Turbo Modules do not support remote debugging and enabling this option will disable remote debugging.","type":"boolean","fallback":false}}},"_internal":{"description":"Internal properties for developer tools","type":"object","properties":{"pluginHistory":{"description":"List of plugins already run on the config","type":"object","properties":{},"additionalProperties":true}},"additionalProperties":true,"meta":{"autogenerated":true}}}
\ No newline at end of file
diff --git a/docs/public/static/schemas/v49.0.0/app-config-schema.json b/docs/public/static/schemas/v49.0.0/app-config-schema.json
new file mode 100644
index 0000000000000..c14f5e6d6425d
--- /dev/null
+++ b/docs/public/static/schemas/v49.0.0/app-config-schema.json
@@ -0,0 +1 @@
+{"name":{"description":"The name of your app as it appears both within Expo Go and on your home screen as a standalone app.","type":"string","meta":{"bareWorkflow":"To change the name of your app, edit the 'Display Name' field in Xcode and the `app_name` string in `android/app/src/main/res/values/strings.xml`"}},"description":{"description":"A short description of what your app is and why it is great.","type":"string"},"slug":{"description":"The friendly URL name for publishing. For example, `myAppName` will refer to the `expo.dev/@project-owner/myAppName` project.","type":"string","pattern":"^[a-zA-Z0-9_\\-]+$"},"owner":{"description":"The name of the Expo account that owns the project. This is useful for teams collaborating on a project. If not provided, the owner defaults to the username of the current user.","type":"string","minLength":1},"currentFullName":{"description":"The auto generated Expo account name and slug used for display purposes. It is not meant to be set directly. Formatted like `@username/slug`. When unauthenticated, the username is `@anonymous`. For published projects, this value may change when a project is transferred between accounts or renamed.","type":"string","meta":{"autogenerated":true}},"originalFullName":{"description":"The auto generated Expo account name and slug used for services like Notifications and AuthSession proxy. It is not meant to be set directly. Formatted like `@username/slug`. When unauthenticated, the username is `@anonymous`. For published projects, this value will not change when a project is transferred between accounts or renamed.","type":"string","meta":{"autogenerated":true}},"privacy":{"description":"Defaults to `unlisted`. `unlisted` hides the project from search results. `hidden` restricts access to the project page to only the owner and other users that have been granted access. Valid values: `public`, `unlisted`, `hidden`.","enum":["public","unlisted","hidden"],"type":"string","fallback":"unlisted"},"sdkVersion":{"description":"The Expo sdkVersion to run the project on. This should line up with the version specified in your package.json.","type":"string","pattern":"^(\\d+\\.\\d+\\.\\d+)|(UNVERSIONED)$"},"runtimeVersion":{"description":"**Note: Don't use this property unless you are sure what you're doing** \n\nThe runtime version associated with this manifest.\nSet this to `{\"policy\": \"nativeVersion\"}` to generate it automatically.","tsType":"string | { policy: 'nativeVersion' | 'sdkVersion' | 'appVersion'; }","oneOf":[{"type":"string","pattern":"^[a-zA-Z\\d][a-zA-Z\\d._+()-]{0,254}$","meta":{"notHuman":"String beginning with an alphanumeric character followed by any combination of alphanumeric character, \"_\", \"+\", \".\",\"(\", \")\", or \"-\". Valid examples: \"1.0.3a+\", \"1.0.0\", \"0\".","regexHuman":"String beginning with an alphanumeric character followed by any combination of alphanumeric character, \"_\", \"+\", \".\",\"(\", \")\", or \"-\". Valid examples: \"1.0.3a+\", \"1.0.0\", \"0\"."}},{"type":"string","pattern":"^exposdk:((\\d+\\.\\d+\\.\\d+)|(UNVERSIONED))$","meta":{"regexHuman":"An 'exposdk:' prefix followed by the SDK version of your project. Example: \"exposdk:44.0.0\"."}},{"type":"object","properties":{"policy":{"type":"string","enum":["nativeVersion","sdkVersion","appVersion"]}},"required":["policy"],"additionalProperties":false}]},"version":{"description":"Your app version. In addition to this field, you'll also use `ios.buildNumber` and `android.versionCode` — read more about how to version your app [here](https://docs.expo.dev/distribution/app-stores/#versioning-your-app). On iOS this corresponds to `CFBundleShortVersionString`, and on Android, this corresponds to `versionName`. The required format can be found [here](https://developer.apple.com/documentation/bundleresources/information_property_list/cfbundleshortversionstring).","type":"string","meta":{"bareWorkflow":"To change your app version, edit the 'Version' field in Xcode and the `versionName` string in `android/app/build.gradle`"}},"platforms":{"description":"Platforms that your project explicitly supports. If not specified, it defaults to `[\"ios\", \"android\"]`.","example":["ios","android","web"],"type":"array","uniqueItems":true,"items":{"type":"string","enum":["android","ios","web"]}},"githubUrl":{"description":"If you would like to share the source code of your app on Github, enter the URL for the repository here and it will be linked to from your Expo project page.","pattern":"^https://github\\.com/","example":"https://github.com/expo/expo","type":["string"]},"orientation":{"description":"Locks your app to a specific orientation with portrait or landscape. Defaults to no lock. Valid values: `default`, `portrait`, `landscape`","enum":["default","portrait","landscape"],"type":"string"},"userInterfaceStyle":{"description":"Configuration to force the app to always use the light or dark user-interface appearance, such as \"dark mode\", or make it automatically adapt to the system preferences. If not provided, defaults to `light`. Requires `expo-system-ui` be installed in your project to work on Android.","type":"string","fallback":"light","enum":["light","dark","automatic"]},"backgroundColor":{"description":"The background color for your app, behind any of your React views. This is also known as the root view background color. Requires `expo-system-ui` be installed in your project to work on iOS.","type":"string","pattern":"^#|(#)\\d{6}$","meta":{"regexHuman":"6 character long hex color string, for example, `'#000000'`. Default is white: `'#ffffff'`"}},"primaryColor":{"description":"On Android, this will determine the color of your app in the multitasker. Currently this is not used on iOS, but it may be used for other purposes in the future.","type":"string","pattern":"^#|(#)\\d{6}$","meta":{"regexHuman":"6 character long hex color string, for example, `'#000000'`"}},"icon":{"description":"Local path or remote URL to an image to use for your app's icon. We recommend that you use a 1024x1024 png file. This icon will appear on the home screen and within the Expo app.","type":"string","meta":{"asset":true,"contentTypePattern":"^image/png$","contentTypeHuman":".png image","square":true,"bareWorkflow":"To change your app's icon, edit or replace the files in `ios//Assets.xcassets/AppIcon.appiconset` (we recommend using Xcode), and `android/app/src/main/res/mipmap-`. Be sure to follow the guidelines for each platform ([iOS](https://developer.apple.com/design/human-interface-guidelines/ios/icons-and-images/app-icon/), [Android 7.1 and below](https://material.io/design/iconography/#icon-treatments), and [Android 8+](https://developer.android.com/guide/practices/ui_guidelines/icon_design_adaptive)) and to provide your new icon in each existing size."}},"notification":{"description":"Configuration for remote (push) notifications.","type":"object","properties":{"icon":{"description":"(Android only) Local path or remote URL to an image to use as the icon for push notifications. 96x96 png grayscale with transparency. We recommend following [Google's design guidelines](https://material.io/design/iconography/product-icons.html#design-principles). If not provided, defaults to your app icon.","type":"string","meta":{"asset":true,"contentTypePattern":"^image/png$","contentTypeHuman":".png image","square":true}},"color":{"description":"(Android only) Tint color for the push notification image when it appears in the notification tray. Defaults to `#ffffff`","type":"string","pattern":"^#|(#)\\d{6}$","meta":{"regexHuman":"6 character long hex color string, for example, `'#000000'`"}},"iosDisplayInForeground":{"description":"Whether or not to display notifications when the app is in the foreground on iOS. `_displayInForeground` option in the individual push notification message overrides this option. [Learn more.](https://docs.expo.dev/push-notifications/receiving-notifications/#foreground-notification-behavior) Defaults to `false`.","type":"boolean"},"androidMode":{"description":"Show each push notification individually (`default`) or collapse into one (`collapse`).","enum":["default","collapse"],"type":"string"},"androidCollapsedTitle":{"description":"If `androidMode` is set to `collapse`, this title is used for the collapsed notification message. For example, `'#{unread_notifications} new interactions'`.","type":"string"}},"additionalProperties":false},"androidStatusBar":{"description":"Configuration for the status bar on Android. For more details please navigate to [Configuring StatusBar](https://docs.expo.dev/guides/configuring-statusbar/).","type":"object","properties":{"barStyle":{"description":"Configures the status bar icons to have a light or dark color. Valid values: `light-content`, `dark-content`. Defaults to `dark-content`","type":"string","enum":["light-content","dark-content"]},"backgroundColor":{"description":"Specifies the background color of the status bar. Defaults to `#00000000` (transparent) for `dark-content` bar style and `#00000088` (semi-transparent black) for `light-content` bar style","type":"string","pattern":"^#|(#)\\d{6}$","meta":{"regexHuman":"6 character long hex color string `'#RRGGBB'`, for example, `'#000000'` for black. Or 8 character long hex color string `'#RRGGBBAA'`, for example, `'#00000088'` for semi-transparent black."}},"hidden":{"description":"Instructs the system whether the status bar should be visible or not. Defaults to `false`","type":"boolean"},"translucent":{"description":"When false, the system status bar pushes the content of your app down (similar to `position: relative`). When true, the status bar floats above the content in your app (similar to `position: absolute`). Defaults to `true` to match the iOS status bar behavior (which can only float above content). Explicitly setting this property to `true` will add `android:windowTranslucentStatus` to `styles.xml` and may cause unexpected keyboard behavior on Android when using the `softwareKeyboardLayoutMode` set to `resize`. In this case you will have to use `KeyboardAvoidingView` to manage the keyboard layout.","type":"boolean"}},"additionalProperties":false},"androidNavigationBar":{"description":"Configuration for the bottom navigation bar on Android. Can be used to configure the `expo-navigation-bar` module in EAS Build.","type":"object","properties":{"visible":{"description":"Determines how and when the navigation bar is shown. [Learn more](https://developer.android.com/training/system-ui/immersive). Requires `expo-navigation-bar` be installed in your project. Valid values: `leanback`, `immersive`, `sticky-immersive` \n\n `leanback` results in the navigation bar being hidden until the first touch gesture is registered. \n\n `immersive` results in the navigation bar being hidden until the user swipes up from the edge where the navigation bar is hidden. \n\n `sticky-immersive` is identical to `'immersive'` except that the navigation bar will be semi-transparent and will be hidden again after a short period of time.","type":"string","enum":["leanback","immersive","sticky-immersive"]},"barStyle":{"description":"Configure the navigation bar icons to have a light or dark color. Supported on Android Oreo and newer. Valid values: `'light-content'`, `'dark-content'`","type":"string","enum":["light-content","dark-content"]},"backgroundColor":{"description":"Specifies the background color of the navigation bar.","type":"string","pattern":"^#|(#)\\d{6}$","meta":{"regexHuman":"6 character long hex color string, for example, `'#000000'`"}}},"additionalProperties":false},"developmentClient":{"description":"Settings that apply specifically to running this app in a development client","type":"object","properties":{"silentLaunch":{"description":"If true, the app will launch in a development client with no additional dialogs or progress indicators, just like in a standalone app.","type":"boolean","fallback":false}},"additionalProperties":false},"scheme":{"description":"URL scheme(s) to link into your app. For example, if we set this to `'demo'`, then demo:// URLs would open your app when tapped. This is a build-time configuration, it has no effect in Expo Go.","oneOf":[{"type":"string","pattern":"^[a-z][a-z0-9+.-]*$"},{"type":"array","items":{"type":"string","pattern":"^[a-z][a-z0-9+.-]*$"}}],"meta":{"regexHuman":"String beginning with a **lowercase** letter followed by any combination of **lowercase** letters, digits, \"+\", \".\" or \"-\"","standaloneOnly":true,"bareWorkflow":"To change your app's scheme, replace all occurrences of the old scheme in `Info.plist` and `AndroidManifest.xml`"}},"extra":{"description":"Any extra fields you want to pass to your experience. Values are accessible via `Constants.expoConfig.extra` ([Learn more](https://docs.expo.dev/versions/latest/sdk/constants/#constantsmanifest))","type":"object","properties":{},"additionalProperties":true},"packagerOpts":{"description":"@deprecated Use a `metro.config.js` file instead. [Learn more](https://docs.expo.dev/guides/customizing-metro/)","meta":{"deprecated":true,"autogenerated":true},"type":"object","properties":{},"additionalProperties":true},"updates":{"description":"Configuration for how and when the app should request OTA JavaScript updates","type":"object","properties":{"enabled":{"description":"If set to false, your standalone app will never download any code, and will only use code bundled locally on the device. In that case, all updates to your app must be submitted through app store review. Defaults to true. (Note: This will not work out of the box with ExpoKit projects)","type":"boolean"},"checkAutomatically":{"description":"By default, Expo will check for updates every time the app is loaded. Set this to `ON_ERROR_RECOVERY` to disable automatic checking unless recovering from an error. Set this to `NEVER` to completely disable automatic checking. Must be one of `ON_LOAD` (default value), `ON_ERROR_RECOVERY`, `WIFI_ONLY`, or `NEVER`","enum":["ON_ERROR_RECOVERY","ON_LOAD","WIFI_ONLY","NEVER"],"type":"string"},"fallbackToCacheTimeout":{"description":"How long (in ms) to allow for fetching OTA updates before falling back to a cached version of the app. Defaults to 0. Must be between 0 and 300000 (5 minutes).","type":"number","minimum":0,"maximum":300000},"url":{"description":"URL from which expo-updates will fetch update manifests","type":"string"},"codeSigningCertificate":{"description":"Local path of a PEM-formatted X.509 certificate used for requiring and verifying signed Expo updates","type":"string"},"codeSigningMetadata":{"description":"Metadata for `codeSigningCertificate`","type":"object","properties":{"alg":{"description":"Algorithm used to generate manifest code signing signature.","enum":["rsa-v1_5-sha256"],"type":"string"},"keyid":{"description":"Identifier for the key in the certificate. Used to instruct signing mechanisms when signing or verifying signatures.","type":"string"}},"additionalProperties":false},"requestHeaders":{"description":"Extra HTTP headers to include in HTTP requests made by `expo-updates`. These may override preset headers.","type":"object","additionalProperties":true},"useClassicUpdates":{"description":"Whether to use deprecated Classic Updates when developing with the local Expo CLI and creating builds. Omitting this or setting it to false affects the behavior of APIs like `Constants.manifest`. SDK 49 is the last SDK version that supports Classic Updates.","type":"boolean"}},"additionalProperties":false},"locales":{"description":"Provide overrides by locale for System Dialog prompts like Permissions Boxes","type":"object","properties":{},"meta":{"bareWorkflow":"To add or change language and localization information in your iOS app, you need to use Xcode."},"additionalProperties":{"type":["string","object"]}},"assetBundlePatterns":{"description":"An array of file glob strings which point to assets that will be bundled within your standalone app binary. Read more in the [Offline Support guide](https://docs.expo.dev/guides/offline-support/)","type":"array","items":{"type":"string"}},"plugins":{"description":"Config plugins for adding extra functionality to your project. [Learn more](https://docs.expo.dev/guides/config-plugins/).","meta":{"bareWorkflow":"Plugins that add modifications can only be used with [prebuilding](https://expo.fyi/prebuilding) and managed EAS Build"},"type":"array","items":{"anyOf":[{"type":["string"]},{"type":"array","items":[{"type":["string"]},{}],"additionalItems":false}]}},"splash":{"description":"Configuration for loading and splash screen for standalone apps.","type":"object","properties":{"backgroundColor":{"description":"Color to fill the loading screen background","type":"string","pattern":"^#|(#)\\d{6}$","meta":{"regexHuman":"6 character long hex color string, for example, `'#000000'`","bareWorkflow":"For Android, edit the `colorPrimary` item in `android/app/src/main/res/values/colors.xml`"}},"resizeMode":{"description":"Determines how the `image` will be displayed in the splash loading screen. Must be one of `cover` or `contain`, defaults to `contain`.","enum":["cover","contain"],"type":"string"},"image":{"description":"Local path or remote URL to an image to fill the background of the loading screen. Image size and aspect ratio are up to you. Must be a .png.","type":"string","meta":{"asset":true,"contentTypePattern":"^image/png$","contentTypeHuman":".png image"}}},"meta":{"bareWorkflow":"To change your app's icon, edit or replace the files in `ios//Assets.xcassets/AppIcon.appiconset` (we recommend using Xcode), and `android/app/src/main/res/mipmap-` (Android Studio can [generate the appropriate image files for you](https://developer.android.com/studio/write/image-asset-studio)). Be sure to follow the guidelines for each platform ([iOS](https://developer.apple.com/design/human-interface-guidelines/ios/icons-and-images/app-icon/), [Android 7.1 and below](https://material.io/design/iconography/#icon-treatments), and [Android 8+](https://developer.android.com/guide/practices/ui_guidelines/icon_design_adaptive)) and to provide your new icon in each required size."}},"jsEngine":{"description":"Specifies the JavaScript engine for apps. Supported only on EAS Build. Defaults to `hermes`. Valid values: `hermes`, `jsc`.","type":"string","enum":["hermes","jsc"],"meta":{"bareWorkflow":"To change the JavaScript engine, update the `expo.jsEngine` value in `ios/Podfile.properties.json` or `android/gradle.properties`"}},"ios":{"description":"Configuration that is specific to the iOS platform.","type":"object","meta":{"standaloneOnly":true},"properties":{"publishManifestPath":{"description":"The manifest for the iOS version of your app will be written to this path during publish.","type":"string","meta":{"autogenerated":true}},"publishBundlePath":{"description":"The bundle for the iOS version of your app will be written to this path during publish.","type":"string","meta":{"autogenerated":true}},"bundleIdentifier":{"description":"The bundle identifier for your iOS standalone app. You make it up, but it needs to be unique on the App Store. See [this StackOverflow question](http://stackoverflow.com/questions/11347470/what-does-bundle-identifier-mean-in-the-ios-project).","type":"string","pattern":"^[a-zA-Z0-9.-]+$","meta":{"bareWorkflow":"Set this value in `info.plist` under `CFBundleIdentifier`","regexHuman":"iOS bundle identifier notation unique name for your app. For example, `host.exp.expo`, where `exp.host` is our domain and `expo` is our app name."}},"buildNumber":{"description":"Build number for your iOS standalone app. Corresponds to `CFBundleVersion` and must match Apple's [specified format](https://developer.apple.com/documentation/bundleresources/information_property_list/cfbundleversion). (Note: Transporter will pull the value for `Version Number` from `expo.version` and NOT from `expo.ios.buildNumber`.)","type":"string","pattern":"^[A-Za-z0-9\\.]+$","meta":{"bareWorkflow":"Set this value in `info.plist` under `CFBundleVersion`"}},"backgroundColor":{"description":"The background color for your iOS app, behind any of your React views. Overrides the top-level `backgroundColor` key if it is present. Requires `expo-system-ui` be installed in your project to work on iOS.","type":"string","pattern":"^#|(#)\\d{6}$","meta":{"regexHuman":"6 character long hex color string, for example, `'#000000'`"}},"icon":{"description":"Local path or remote URL to an image to use for your app's icon on iOS. If specified, this overrides the top-level `icon` key. Use a 1024x1024 icon which follows Apple's interface guidelines for icons, including color profile and transparency. \n\n Expo will generate the other required sizes. This icon will appear on the home screen and within the Expo app.","type":"string","meta":{"asset":true,"contentTypePattern":"^image/png$","contentTypeHuman":".png image","square":true}},"appStoreUrl":{"description":"URL to your app on the Apple App Store, if you have deployed it there. This is used to link to your store page from your Expo project page if your app is public.","pattern":"^https://(itunes|apps)\\.apple\\.com/.*?\\d+","example":"https://apps.apple.com/us/app/expo-client/id982107779","type":["string"]},"bitcode":{"description":"Enable iOS Bitcode optimizations in the native build. Accepts the name of an iOS build configuration to enable for a single configuration and disable for all others, e.g. Debug, Release. Not available in Expo Go. Defaults to `undefined` which uses the template's predefined settings.","anyOf":[{"type":["boolean"]},{"type":["string"]}]},"config":{"type":"object","description":"Note: This property key is not included in the production manifest and will evaluate to `undefined`. It is used internally only in the build process, because it contains API keys that some may want to keep private.","properties":{"branch":{"description":"[Branch](https://branch.io/) key to hook up Branch linking services.","type":"object","properties":{"apiKey":{"description":"Your Branch API key","type":"string"}},"additionalProperties":false},"usesNonExemptEncryption":{"description":"Sets `ITSAppUsesNonExemptEncryption` in the standalone ipa's Info.plist to the given boolean value.","type":"boolean"},"googleMapsApiKey":{"description":"[Google Maps iOS SDK](https://developers.google.com/maps/documentation/ios-sdk/start) key for your standalone app.","type":"string"},"googleMobileAdsAppId":{"description":"[Google Mobile Ads App ID](https://support.google.com/admob/answer/6232340) Google AdMob App ID. ","type":"string"},"googleMobileAdsAutoInit":{"description":"A boolean indicating whether to initialize Google App Measurement and begin sending user-level event data to Google immediately when the app starts. The default in Expo (Go and in standalone apps) is `false`. [Sets the opposite of the given value to the following key in `Info.plist`.](https://developers.google.com/admob/ios/eu-consent#delay_app_measurement_optional)","type":"boolean","fallback":false}},"additionalProperties":false},"googleServicesFile":{"description":"[Firebase Configuration File](https://support.google.com/firebase/answer/7015592) Location of the `GoogleService-Info.plist` file for configuring Firebase.","type":"string"},"supportsTablet":{"description":"Whether your standalone iOS app supports tablet screen sizes. Defaults to `false`.","type":"boolean","meta":{"bareWorkflow":"Set this value in `info.plist` under `UISupportedInterfaceOrientations~ipad`"}},"isTabletOnly":{"description":"If true, indicates that your standalone iOS app does not support handsets, and only supports tablets.","type":"boolean","meta":{"bareWorkflow":"Set this value in `info.plist` under `UISupportedInterfaceOrientations`"}},"requireFullScreen":{"description":"If true, indicates that your standalone iOS app does not support Slide Over and Split View on iPad. Defaults to `false`","type":"boolean","meta":{"bareWorkflow":"Use Xcode to set `UIRequiresFullScreen`"}},"userInterfaceStyle":{"description":"Configuration to force the app to always use the light or dark user-interface appearance, such as \"dark mode\", or make it automatically adapt to the system preferences. If not provided, defaults to `light`.","type":"string","fallback":"light","enum":["light","dark","automatic"]},"infoPlist":{"description":"Dictionary of arbitrary configuration to add to your standalone app's native Info.plist. Applied prior to all other Expo-specific configuration. No other validation is performed, so use this at your own risk of rejection from the App Store.","type":"object","properties":{},"additionalProperties":true},"entitlements":{"description":"Dictionary of arbitrary configuration to add to your standalone app's native *.entitlements (plist). Applied prior to all other Expo-specific configuration. No other validation is performed, so use this at your own risk of rejection from the App Store.","type":"object","properties":{},"additionalProperties":true},"associatedDomains":{"description":"An array that contains Associated Domains for the standalone app. [Learn more](https://developer.apple.com/documentation/safariservices/supporting_associated_domains).","type":"array","uniqueItems":true,"items":{"type":"string"},"meta":{"regexHuman":"Entries must follow the format `applinks:[:port number]`. [Learn more](https://developer.apple.com/documentation/safariservices/supporting_associated_domains).","bareWorkflow":"Build with EAS, or use Xcode to enable this capability manually. [Learn more](https://developer.apple.com/documentation/safariservices/supporting_associated_domains)."}},"usesIcloudStorage":{"description":"A boolean indicating if the app uses iCloud Storage for `DocumentPicker`. See `DocumentPicker` docs for details.","type":"boolean","meta":{"bareWorkflow":"Use Xcode, or ios.entitlements to configure this."}},"usesAppleSignIn":{"description":"A boolean indicating if the app uses Apple Sign-In. See `AppleAuthentication` docs for details.","type":"boolean","fallback":false},"accessesContactNotes":{"description":"A Boolean value that indicates whether the app may access the notes stored in contacts. You must [receive permission from Apple](https://developer.apple.com/documentation/bundleresources/entitlements/com_apple_developer_contacts_notes) before you can submit your app for review with this capability.","type":"boolean","fallback":false},"splash":{"description":"Configuration for loading and splash screen for standalone iOS apps.","type":"object","properties":{"backgroundColor":{"description":"Color to fill the loading screen background","type":"string","pattern":"^#|(#)\\d{6}$","meta":{"regexHuman":"6 character long hex color string, for example, `'#000000'`"}},"resizeMode":{"description":"Determines how the `image` will be displayed in the splash loading screen. Must be one of `cover` or `contain`, defaults to `contain`.","enum":["cover","contain"],"type":"string"},"image":{"description":"Local path or remote URL to an image to fill the background of the loading screen. Image size and aspect ratio are up to you. Must be a .png.","type":"string","meta":{"asset":true,"contentTypePattern":"^image/png$","contentTypeHuman":".png image"}},"tabletImage":{"description":"Local path or remote URL to an image to fill the background of the loading screen. Image size and aspect ratio are up to you. Must be a .png.","type":"string","meta":{"asset":true,"contentTypePattern":"^image/png$","contentTypeHuman":".png image"}},"dark":{"description":"Configuration for loading and splash screen for standalone iOS apps in dark mode.","type":"object","properties":{"backgroundColor":{"description":"Color to fill the loading screen background","type":"string","pattern":"^#|(#)\\d{6}$","meta":{"regexHuman":"6 character long hex color string, for example, `'#000000'`"}},"resizeMode":{"description":"Determines how the `image` will be displayed in the splash loading screen. Must be one of `cover` or `contain`, defaults to `contain`.","enum":["cover","contain"],"type":"string"},"image":{"description":"Local path or remote URL to an image to fill the background of the loading screen. Image size and aspect ratio are up to you. Must be a .png.","type":"string","meta":{"asset":true,"contentTypePattern":"^image/png$","contentTypeHuman":".png image"}},"tabletImage":{"description":"Local path or remote URL to an image to fill the background of the loading screen. Image size and aspect ratio are up to you. Must be a .png.","type":"string","meta":{"asset":true,"contentTypePattern":"^image/png$","contentTypeHuman":".png image"}}}}}},"jsEngine":{"description":"Specifies the JavaScript engine for iOS apps. Supported only on EAS Build. Defaults to `hermes`. Valid values: `hermes`, `jsc`.","type":"string","enum":["hermes","jsc"],"meta":{"bareWorkflow":"To change the JavaScript engine, update the `expo.jsEngine` value in `ios/Podfile.properties.json`"}},"runtimeVersion":{"description":"**Note: Don't use this property unless you are sure what you're doing** \n\nThe runtime version associated with this manifest for the iOS platform. If provided, this will override the top level runtimeVersion key.\nSet this to `{\"policy\": \"nativeVersion\"}` to generate it automatically.","tsType":"string | { policy: 'nativeVersion' | 'sdkVersion' | 'appVersion'; }","oneOf":[{"type":"string","pattern":"^[a-zA-Z\\d][a-zA-Z\\d._+()-]{0,254}$","meta":{"notHuman":"String beginning with an alphanumeric character followed by any combination of alphanumeric character, \"_\", \"+\", \".\",\"(\", \")\", or \"-\". Valid examples: \"1.0.3a+\", \"1.0.0\", \"0\".","regexHuman":"String beginning with an alphanumeric character followed by any combination of alphanumeric character, \"_\", \"+\", \".\",\"(\", \")\", or \"-\". Valid examples: \"1.0.3a+\", \"1.0.0\", \"0\"."}},{"type":"string","pattern":"^exposdk:((\\d+\\.\\d+\\.\\d+)|(UNVERSIONED))$","meta":{"regexHuman":"An 'exposdk:' prefix followed by the SDK version of your project. Example: \"exposdk:44.0.0\"."}},{"type":"object","properties":{"policy":{"type":"string","enum":["nativeVersion","sdkVersion","appVersion"]}},"required":["policy"],"additionalProperties":false}]}},"additionalProperties":false},"android":{"description":"Configuration that is specific to the Android platform.","type":"object","meta":{"standaloneOnly":true},"properties":{"publishManifestPath":{"description":"The manifest for the Android version of your app will be written to this path during publish.","type":"string","meta":{"autogenerated":true}},"publishBundlePath":{"description":"The bundle for the Android version of your app will be written to this path during publish.","type":"string","meta":{"autogenerated":true}},"package":{"description":"The package name for your Android standalone app. You make it up, but it needs to be unique on the Play Store. See [this StackOverflow question](http://stackoverflow.com/questions/6273892/android-package-name-convention).","type":"string","pattern":"^[a-zA-Z][a-zA-Z0-9\\_]*(\\.[a-zA-Z][a-zA-Z0-9\\_]*)+$","meta":{"regexHuman":"Reverse DNS notation unique name for your app. Valid Android Application ID. For example, `com.example.app`, where `com.example` is our domain and `app` is our app. The name may only contain lowercase and uppercase letters (a-z, A-Z), numbers (0-9) and underscores (_), separated by periods (.). Each component of the name should start with a lowercase letter.","bareWorkflow":"This is set in `android/app/build.gradle` as `applicationId` as well as in your `AndroidManifest.xml` file (multiple places)."}},"versionCode":{"description":"Version number required by Google Play. Increment by one for each release. Must be a positive integer. [Learn more](https://developer.android.com/studio/publish/versioning.html)","type":"integer","minimum":0,"maximum":2100000000,"meta":{"bareWorkflow":"This is set in `android/app/build.gradle` as `versionCode`"}},"backgroundColor":{"description":"The background color for your Android app, behind any of your React views. Overrides the top-level `backgroundColor` key if it is present.","type":"string","pattern":"^#|(#)\\d{6}$","meta":{"regexHuman":"6 character long hex color string, for example, `'#000000'`","bareWorkflow":"This is set in `android/app/src/main/AndroidManifest.xml` under `android:windowBackground`"}},"userInterfaceStyle":{"description":"Configuration to force the app to always use the light or dark user-interface appearance, such as \"dark mode\", or make it automatically adapt to the system preferences. If not provided, defaults to `light`. Requires `expo-system-ui` be installed in your project to work on Android.","type":"string","fallback":"light","enum":["light","dark","automatic"]},"icon":{"description":"Local path or remote URL to an image to use for your app's icon on Android. If specified, this overrides the top-level `icon` key. We recommend that you use a 1024x1024 png file (transparency is recommended for the Google Play Store). This icon will appear on the home screen and within the Expo app.","type":"string","meta":{"asset":true,"contentTypePattern":"^image/png$","contentTypeHuman":".png image","square":true}},"adaptiveIcon":{"description":"Settings for an Adaptive Launcher Icon on Android. [Learn more](https://developer.android.com/guide/practices/ui_guidelines/icon_design_adaptive)","type":"object","properties":{"foregroundImage":{"description":"Local path or remote URL to an image to use for your app's icon on Android. If specified, this overrides the top-level `icon` and the `android.icon` keys. Should follow the [specified guidelines](https://developer.android.com/guide/practices/ui_guidelines/icon_design_adaptive). This icon will appear on the home screen.","type":"string","meta":{"asset":true,"contentTypePattern":"^image/png$","contentTypeHuman":".png image","square":true}},"monochromeImage":{"description":"Local path or remote URL to an image representing the Android 13+ monochromatic icon. Should follow the [specified guidelines](https://developer.android.com/guide/practices/ui_guidelines/icon_design_adaptive). This icon will appear on the home screen when the user enables 'Themed icons' in system settings on a device running Android 13+.","type":"string","meta":{"asset":true,"contentTypePattern":"^image/png$","contentTypeHuman":".png image","square":true}},"backgroundImage":{"description":"Local path or remote URL to a background image for your app's Adaptive Icon on Android. If specified, this overrides the `backgroundColor` key. Must have the same dimensions as `foregroundImage`, and has no effect if `foregroundImage` is not specified. Should follow the [specified guidelines](https://developer.android.com/guide/practices/ui_guidelines/icon_design_adaptive).","type":"string","meta":{"asset":true,"contentTypePattern":"^image/png$","contentTypeHuman":".png image","square":true}},"backgroundColor":{"description":"Color to use as the background for your app's Adaptive Icon on Android. Defaults to white, `#FFFFFF`. Has no effect if `foregroundImage` is not specified.","type":"string","pattern":"^#|(#)\\d{6}$","meta":{"regexHuman":"6 character long hex color string, for example, `'#000000'`"}}},"additionalProperties":false},"playStoreUrl":{"description":"URL to your app on the Google Play Store, if you have deployed it there. This is used to link to your store page from your Expo project page if your app is public.","pattern":"^https://play\\.google\\.com/","example":"https://play.google.com/store/apps/details?id=host.exp.exponent","type":["string"]},"permissions":{"description":"List of permissions used by the standalone app. \n\n To use ONLY the following minimum necessary permissions and none of the extras supported by Expo in a default managed app, set `permissions` to `[]`. The minimum necessary permissions do not require a Privacy Policy when uploading to Google Play Store and are: \n• receive data from Internet \n• view network connections \n• full network access \n• change your audio settings \n• prevent device from sleeping \n\n To use ALL permissions supported by Expo by default, do not specify the `permissions` key. \n\n To use the minimum necessary permissions ALONG with certain additional permissions, specify those extras in `permissions`, e.g.\n\n `[ \"CAMERA\", \"ACCESS_FINE_LOCATION\" ]`.\n\n You can specify the following permissions depending on what you need:\n\n- `ACCESS_COARSE_LOCATION`\n- `ACCESS_FINE_LOCATION`\n- `ACCESS_BACKGROUND_LOCATION`\n- `CAMERA`\n- `RECORD_AUDIO`\n- `READ_CONTACTS`\n- `WRITE_CONTACTS`\n- `READ_CALENDAR`\n- `WRITE_CALENDAR`\n- `READ_EXTERNAL_STORAGE`\n- `WRITE_EXTERNAL_STORAGE`\n- `USE_FINGERPRINT`\n- `USE_BIOMETRIC`\n- `WRITE_SETTINGS`\n- `VIBRATE`\n- `READ_PHONE_STATE`\n- `FOREGROUND_SERVICE`\n- `WAKE_LOCK`\n- `com.anddoes.launcher.permission.UPDATE_COUNT`\n- `com.android.launcher.permission.INSTALL_SHORTCUT`\n- `com.google.android.c2dm.permission.RECEIVE`\n- `com.google.android.gms.permission.ACTIVITY_RECOGNITION`\n- `com.google.android.providers.gsf.permission.READ_GSERVICES`\n- `com.htc.launcher.permission.READ_SETTINGS`\n- `com.htc.launcher.permission.UPDATE_SHORTCUT`\n- `com.majeur.launcher.permission.UPDATE_BADGE`\n- `com.sec.android.provider.badge.permission.READ`\n- `com.sec.android.provider.badge.permission.WRITE`\n- `com.sonyericsson.home.permission.BROADCAST_BADGE`\n","type":"array","meta":{"bareWorkflow":"To change the permissions your app requests, you'll need to edit `AndroidManifest.xml` manually. To prevent your app from requesting one of the permissions listed below, you'll need to explicitly add it to `AndroidManifest.xml` along with a `tools:node=\"remove\"` tag."},"items":{"type":"string"}},"blockedPermissions":{"description":"List of permissions to block in the final `AndroidManifest.xml`. This is useful for removing permissions that are added by native package `AndroidManifest.xml` files which are merged into the final manifest. Internally this feature uses the `tools:node=\"remove\"` XML attribute to remove permissions. Not available in Expo Go.","type":"array","items":{"type":"string"}},"googleServicesFile":{"description":"[Firebase Configuration File](https://support.google.com/firebase/answer/7015592) Location of the `GoogleService-Info.plist` file for configuring Firebase. Including this key automatically enables FCM in your standalone app.","type":"string","meta":{"bareWorkflow":"Add or edit the file directly at `android/app/google-services.json`"}},"config":{"type":"object","description":"Note: This property key is not included in the production manifest and will evaluate to `undefined`. It is used internally only in the build process, because it contains API keys that some may want to keep private.","properties":{"branch":{"description":"[Branch](https://branch.io/) key to hook up Branch linking services.","type":"object","properties":{"apiKey":{"description":"Your Branch API key","type":"string"}},"additionalProperties":false},"googleMaps":{"description":"[Google Maps Android SDK](https://developers.google.com/maps/documentation/android-api/signup) configuration for your standalone app.","type":"object","properties":{"apiKey":{"description":"Your Google Maps Android SDK API key","type":"string"}},"additionalProperties":false},"googleMobileAdsAppId":{"description":"[Google Mobile Ads App ID](https://support.google.com/admob/answer/6232340) Google AdMob App ID. ","type":"string"},"googleMobileAdsAutoInit":{"description":"A boolean indicating whether to initialize Google App Measurement and begin sending user-level event data to Google immediately when the app starts. The default in Expo (Client and in standalone apps) is `false`. [Sets the opposite of the given value to the following key in `Info.plist`](https://developers.google.com/admob/ios/eu-consent#delay_app_measurement_optional)","type":"boolean","fallback":false}},"additionalProperties":false},"splash":{"description":"Configuration for loading and splash screen for managed and standalone Android apps.","type":"object","properties":{"backgroundColor":{"description":"Color to fill the loading screen background","type":"string","pattern":"^#|(#)\\d{6}$","meta":{"regexHuman":"6 character long hex color string, for example, `'#000000'`"}},"resizeMode":{"description":"Determines how the `image` will be displayed in the splash loading screen. Must be one of `cover`, `contain` or `native`, defaults to `contain`.","enum":["cover","contain","native"],"type":"string"},"image":{"description":"Local path or remote URL to an image to fill the background of the loading screen. Image size and aspect ratio are up to you. Must be a .png.","type":"string","meta":{"asset":true,"contentTypePattern":"^image/png$","contentTypeHuman":".png image"}},"mdpi":{"description":"Local path or remote URL to an image to fill the background of the loading screen in \"native\" mode. Image size and aspect ratio are up to you. [Learn more]( https://developer.android.com/training/multiscreen/screendensities) \n\n `Natural sized image (baseline)`","type":"string","meta":{"asset":true,"contentTypePattern":"^image/png$","contentTypeHuman":".png image"}},"hdpi":{"description":"Local path or remote URL to an image to fill the background of the loading screen in \"native\" mode. Image size and aspect ratio are up to you. [Learn more]( https://developer.android.com/training/multiscreen/screendensities) \n\n `Scale 1.5x`","type":"string","meta":{"asset":true,"contentTypePattern":"^image/png$","contentTypeHuman":".png image"}},"xhdpi":{"description":"Local path or remote URL to an image to fill the background of the loading screen in \"native\" mode. Image size and aspect ratio are up to you. [Learn more]( https://developer.android.com/training/multiscreen/screendensities) \n\n `Scale 2x`","type":"string","meta":{"asset":true,"contentTypePattern":"^image/png$","contentTypeHuman":".png image"}},"xxhdpi":{"description":"Local path or remote URL to an image to fill the background of the loading screen in \"native\" mode. Image size and aspect ratio are up to you. [Learn more]( https://developer.android.com/training/multiscreen/screendensities) \n\n `Scale 3x`","type":"string","meta":{"asset":true,"contentTypePattern":"^image/png$","contentTypeHuman":".png image"}},"xxxhdpi":{"description":"Local path or remote URL to an image to fill the background of the loading screen in \"native\" mode. Image size and aspect ratio are up to you. [Learn more]( https://developer.android.com/training/multiscreen/screendensities) \n\n `Scale 4x`","type":"string","meta":{"asset":true,"contentTypePattern":"^image/png$","contentTypeHuman":".png image"}},"dark":{"description":"Configuration for loading and splash screen for managed and standalone Android apps in dark mode.","type":"object","properties":{"backgroundColor":{"description":"Color to fill the loading screen background","type":"string","pattern":"^#|(#)\\d{6}$","meta":{"regexHuman":"6 character long hex color string, for example, `'#000000'`"}},"resizeMode":{"description":"Determines how the `image` will be displayed in the splash loading screen. Must be one of `cover`, `contain` or `native`, defaults to `contain`.","enum":["cover","contain","native"],"type":"string"},"image":{"description":"Local path or remote URL to an image to fill the background of the loading screen. Image size and aspect ratio are up to you. Must be a .png.","type":"string","meta":{"asset":true,"contentTypePattern":"^image/png$","contentTypeHuman":".png image"}},"mdpi":{"description":"Local path or remote URL to an image to fill the background of the loading screen in \"native\" mode. Image size and aspect ratio are up to you. [Learn more]( https://developer.android.com/training/multiscreen/screendensities) \n\n `Natural sized image (baseline)`","type":"string","meta":{"asset":true,"contentTypePattern":"^image/png$","contentTypeHuman":".png image"}},"hdpi":{"description":"Local path or remote URL to an image to fill the background of the loading screen in \"native\" mode. Image size and aspect ratio are up to you. [Learn more]( https://developer.android.com/training/multiscreen/screendensities) \n\n `Scale 1.5x`","type":"string","meta":{"asset":true,"contentTypePattern":"^image/png$","contentTypeHuman":".png image"}},"xhdpi":{"description":"Local path or remote URL to an image to fill the background of the loading screen in \"native\" mode. Image size and aspect ratio are up to you. [Learn more]( https://developer.android.com/training/multiscreen/screendensities) \n\n `Scale 2x`","type":"string","meta":{"asset":true,"contentTypePattern":"^image/png$","contentTypeHuman":".png image"}},"xxhdpi":{"description":"Local path or remote URL to an image to fill the background of the loading screen in \"native\" mode. Image size and aspect ratio are up to you. [Learn more]( https://developer.android.com/training/multiscreen/screendensities) \n\n `Scale 3x`","type":"string","meta":{"asset":true,"contentTypePattern":"^image/png$","contentTypeHuman":".png image"}},"xxxhdpi":{"description":"Local path or remote URL to an image to fill the background of the loading screen in \"native\" mode. Image size and aspect ratio are up to you. [Learn more]( https://developer.android.com/training/multiscreen/screendensities) \n\n `Scale 4x`","type":"string","meta":{"asset":true,"contentTypePattern":"^image/png$","contentTypeHuman":".png image"}}}}}},"intentFilters":{"description":"Configuration for setting an array of custom intent filters in Android manifest. [Learn more](https://developer.android.com/guide/components/intents-filters)","example":[{"autoVerify":true,"action":"VIEW","data":{"scheme":"https","host":"*.example.com"},"category":["BROWSABLE","DEFAULT"]}],"exampleString":"\n [{ \n \"autoVerify\": true, \n \"action\": \"VIEW\", \n \"data\": { \n \"scheme\": \"https\", \n \"host\": \"*.example.com\" \n }, \n \"category\": [\"BROWSABLE\", \"DEFAULT\"] \n }]","type":"array","uniqueItems":true,"items":{"type":"object","properties":{"autoVerify":{"description":"You may also use an intent filter to set your app as the default handler for links (without showing the user a dialog with options). To do so use `true` and then configure your server to serve a JSON file verifying that you own the domain. [Learn more](https://developer.android.com/training/app-links)","type":"boolean"},"action":{"type":"string"},"data":{"anyOf":[{"type":"object","properties":{"scheme":{"description":"Scheme of the URL, e.g. `https`","type":"string"},"host":{"description":"Hostname, e.g. `myapp.io`","type":"string"},"port":{"description":"Port, e.g. `3000`","type":"string"},"path":{"description":"Exact path for URLs that should be matched by the filter, e.g. `/records`","type":"string"},"pathPattern":{"description":"Pattern for paths that should be matched by the filter, e.g. `.*`. Must begin with `/`","type":"string"},"pathPrefix":{"description":"Prefix for paths that should be matched by the filter, e.g. `/records/` will match `/records/123`","type":"string"},"mimeType":{"description":"MIME type for URLs that should be matched by the filter","type":"string"}},"additionalProperties":false},{"type":["array"],"items":{"type":"object","properties":{"scheme":{"description":"Scheme of the URL, e.g. `https`","type":"string"},"host":{"description":"Hostname, e.g. `myapp.io`","type":"string"},"port":{"description":"Port, e.g. `3000`","type":"string"},"path":{"description":"Exact path for URLs that should be matched by the filter, e.g. `/records`","type":"string"},"pathPattern":{"description":"Pattern for paths that should be matched by the filter, e.g. `.*`. Must begin with `/`","type":"string"},"pathPrefix":{"description":"Prefix for paths that should be matched by the filter, e.g. `/records/` will match `/records/123`","type":"string"},"mimeType":{"description":"MIME type for URLs that should be matched by the filter","type":"string"}},"additionalProperties":false}}]},"category":{"anyOf":[{"type":["string"]},{"type":"array","items":{"type":"string"}}]}},"additionalProperties":false,"required":["action"]},"meta":{"bareWorkflow":"This is set in `AndroidManifest.xml` directly. [Learn more.](https://developer.android.com/guide/components/intents-filters)"}},"allowBackup":{"description":"Allows your user's app data to be automatically backed up to their Google Drive. If this is set to false, no backup or restore of the application will ever be performed (this is useful if your app deals with sensitive information). Defaults to the Android default, which is `true`.","fallback":true,"type":"boolean"},"softwareKeyboardLayoutMode":{"description":"Determines how the software keyboard will impact the layout of your application. This maps to the `android:windowSoftInputMode` property. Defaults to `resize`. Valid values: `resize`, `pan`.","enum":["resize","pan"],"type":"string","fallback":"resize"},"jsEngine":{"description":"Specifies the JavaScript engine for Android apps. Supported only on EAS Build and in Expo Go. Defaults to `hermes`. Valid values: `hermes`, `jsc`.","type":"string","enum":["hermes","jsc"],"meta":{"bareWorkflow":"To change the JavaScript engine, update the `expo.jsEngine` value in `android/gradle.properties`"}},"runtimeVersion":{"description":"**Note: Don't use this property unless you are sure what you're doing** \n\nThe runtime version associated with this manifest for the Android platform. If provided, this will override the top level runtimeVersion key.\nSet this to `{\"policy\": \"nativeVersion\"}` to generate it automatically.","tsType":"string | { policy: 'nativeVersion' | 'sdkVersion' | 'appVersion'; }","oneOf":[{"type":"string","pattern":"^[a-zA-Z\\d][a-zA-Z\\d._+()-]{0,254}$","meta":{"notHuman":"String beginning with an alphanumeric character followed by any combination of alphanumeric character, \"_\", \"+\", \".\",\"(\", \")\", or \"-\". Valid examples: \"1.0.3a+\", \"1.0.0\", \"0\".","regexHuman":"String beginning with an alphanumeric character followed by any combination of alphanumeric character, \"_\", \"+\", \".\",\"(\", \")\", or \"-\". Valid examples: \"1.0.3a+\", \"1.0.0\", \"0\"."}},{"type":"string","pattern":"^exposdk:((\\d+\\.\\d+\\.\\d+)|(UNVERSIONED))$","meta":{"regexHuman":"An 'exposdk:' prefix followed by the SDK version of your project. Example: \"exposdk:44.0.0\"."}},{"type":"object","properties":{"policy":{"type":"string","enum":["nativeVersion","sdkVersion","appVersion"]}},"required":["policy"],"additionalProperties":false}]}},"additionalProperties":false},"web":{"description":"Configuration that is specific to the web platform.","type":"object","additionalProperties":true,"properties":{"output":{"description":"Sets the rendering method for the web app for both `expo start` and `expo export`. `static` statically renders HTML files for every route in the `app/` directory, which is available only in Expo Router apps. `single` outputs a Single Page Application (SPA), with a single `index.html` in the output folder, and has no statically indexable HTML. Defaults to `single`.","enum":["single","static"],"type":"string"},"favicon":{"description":"Relative path of an image to use for your app's favicon.","type":"string"},"name":{"description":"Defines the title of the document, defaults to the outer level name","type":"string","meta":{"pwa":"name"}},"shortName":{"description":"A short version of the app's name, 12 characters or fewer. Used in app launcher and new tab pages. Maps to `short_name` in the PWA manifest.json. Defaults to the `name` property.","type":"string","meta":{"pwa":"short_name","regexHuman":"Maximum 12 characters long"}},"lang":{"description":"Specifies the primary language for the values in the name and short_name members. This value is a string containing a single language tag.","type":"string","fallback":"en","meta":{"pwa":"lang"}},"scope":{"description":"Defines the navigation scope of this website's context. This restricts what web pages can be viewed while the manifest is applied. If the user navigates outside the scope, it returns to a normal web page inside a browser tab/window. If the scope is a relative URL, the base URL will be the URL of the manifest.","type":"string","meta":{"pwa":"scope"}},"themeColor":{"description":"Defines the color of the Android tool bar, and may be reflected in the app's preview in task switchers.","type":"string","pattern":"^#|(#)\\d{6}$","meta":{"pwa":"theme_color","html":"theme-color","regexHuman":"6 character long hex color string, for example, `'#000000'`"}},"description":{"description":"Provides a general description of what the pinned website does.","type":"string","meta":{"html":"description","pwa":"description"}},"dir":{"description":"Specifies the primary text direction for the name, short_name, and description members. Together with the lang member, it helps the correct display of right-to-left languages.","enum":["auto","ltr","rtl"],"type":"string","meta":{"pwa":"dir"}},"display":{"description":"Defines the developers’ preferred display mode for the website.","enum":["fullscreen","standalone","minimal-ui","browser"],"type":"string","meta":{"pwa":"display"}},"startUrl":{"description":"The URL that loads when a user launches the application (e.g., when added to home screen), typically the index. Note: This has to be a relative URL, relative to the manifest URL.","type":"string","meta":{"pwa":"start_url"}},"orientation":{"description":"Defines the default orientation for all the website's top level browsing contexts.","enum":["any","natural","landscape","landscape-primary","landscape-secondary","portrait","portrait-primary","portrait-secondary"],"type":"string","meta":{"pwa":"orientation"}},"backgroundColor":{"description":"Defines the expected “background color” for the website. This value repeats what is already available in the site’s CSS, but can be used by browsers to draw the background color of a shortcut when the manifest is available before the stylesheet has loaded. This creates a smooth transition between launching the web application and loading the site's content.","type":"string","pattern":"^#|(#)\\d{6}$","meta":{"pwa":"background_color","regexHuman":"6 character long hex color string, for example, `'#000000'`"}},"barStyle":{"description":"If content is set to default, the status bar appears normal. If set to black, the status bar has a black background. If set to black-translucent, the status bar is black and translucent. If set to default or black, the web content is displayed below the status bar. If set to black-translucent, the web content is displayed on the entire screen, partially obscured by the status bar.","enum":["default","black","black-translucent"],"type":"string","fallback":"black-translucent","meta":{"html":"apple-mobile-web-app-status-bar-style","pwa":"name"}},"preferRelatedApplications":{"description":"Hints for the user agent to indicate to the user that the specified native applications (defined in expo.ios and expo.android) are recommended over the website.","type":"boolean","fallback":true,"meta":{"pwa":"prefer_related_applications"}},"dangerous":{"description":"Experimental features. These will break without deprecation notice.","type":"object","properties":{},"additionalProperties":true},"splash":{"description":"Configuration for PWA splash screens.","type":"object","properties":{"backgroundColor":{"description":"Color to fill the loading screen background","type":"string","pattern":"^#|(#)\\d{6}$","meta":{"regexHuman":"6 character long hex color string, for example, `'#000000'`"}},"resizeMode":{"description":"Determines how the `image` will be displayed in the splash loading screen. Must be one of `cover` or `contain`, defaults to `contain`.","enum":["cover","contain"],"type":"string"},"image":{"description":"Local path or remote URL to an image to fill the background of the loading screen. Image size and aspect ratio are up to you. Must be a .png.","type":"string","meta":{"asset":true,"contentTypePattern":"^image/png$","contentTypeHuman":".png image"}}},"meta":{"bareWorkflow":"Use [expo-splash-screen](https://github.com/expo/expo/tree/main/packages/expo-splash-screen#expo-splash-screen)"}},"config":{"description":"Firebase web configuration. Used by the expo-firebase packages on both web and native. [Learn more](https://firebase.google.com/docs/reference/js/firebase.html#initializeapp)","type":"object","properties":{"firebase":{"type":"object","properties":{"apiKey":{"type":"string"},"authDomain":{"type":"string"},"databaseURL":{"type":"string"},"projectId":{"type":"string"},"storageBucket":{"type":"string"},"messagingSenderId":{"type":"string"},"appId":{"type":"string"},"measurementId":{"type":"string"}}}}},"bundler":{"description":"Sets the bundler to use for the web platform. Only supported in the local CLI `npx expo`.","enum":["webpack","metro"],"fallback":"webpack"}}},"hooks":{"description":"Configuration for scripts to run to hook into the publish process","type":"object","additionalProperties":false,"properties":{"postPublish":{"type":"array","items":{"type":"object","additionalProperties":true,"properties":{"file":{"type":"string"},"config":{"type":"object","additionalProperties":true,"properties":{}}}}},"postExport":{"type":"array","items":{"type":"object","additionalProperties":true,"properties":{"file":{"type":"string"},"config":{"type":"object","additionalProperties":true,"properties":{}}}}}}},"experiments":{"description":"Enable experimental features that may be unstable, unsupported, or removed without deprecation notices.","type":"object","additionalProperties":false,"properties":{"tsconfigPaths":{"description":"Enable tsconfig/jsconfig `compilerOptions.paths` and `compilerOptions.baseUrl` support for import aliases in Metro.","type":"boolean","fallback":false},"typedRoutes":{"description":"Enable support for statically typed links in Expo Router. This feature requires TypeScript be set up in your Expo Router v2 project.","type":"boolean","fallback":false},"turboModules":{"description":"Enables Turbo Modules, which are a type of native modules that use a different way of communicating between JS and platform code. When installing a Turbo Module you will need to enable this experimental option (the library still needs to be a part of Expo SDK already, like react-native-reanimated v2). Turbo Modules do not support remote debugging and enabling this option will disable remote debugging.","type":"boolean","fallback":false}}},"_internal":{"description":"Internal properties for developer tools","type":"object","properties":{"pluginHistory":{"description":"List of plugins already run on the config","type":"object","properties":{},"additionalProperties":true}},"additionalProperties":true,"meta":{"autogenerated":true}}}
\ No newline at end of file