diff --git a/.changeset/151-objectos-rebrand.md b/.changeset/151-objectos-rebrand.md index 7232889..8f48907 100644 --- a/.changeset/151-objectos-rebrand.md +++ b/.changeset/151-objectos-rebrand.md @@ -8,7 +8,7 @@ Metadata-protocol: none Rebrand the app to ObjectOS. The app is named `ObjectOS`, its URL scheme defaults to `objectos` (`objectos://open?route=…`, `objectos://console/…`), the iOS bundle identifier and Android package are `ai.objectos.mobile`, and the -Expo slug is `objectos-mobile`. The server picker says "ObjectOS server" in +Expo slug is `objectos`. The server picker says "ObjectOS server" in en / zh / ar. Development builds made before this change are a different app (old bundle id, diff --git a/.changeset/eas-project-link.md b/.changeset/eas-project-link.md new file mode 100644 index 0000000..c2308a9 --- /dev/null +++ b/.changeset/eas-project-link.md @@ -0,0 +1,16 @@ +--- +"mobile": patch +--- + +Clause-②: no +Metadata-protocol: none + +Link the app to the EAS project `@objectstack/objectos`, so CI can produce +installable builds. The Expo slug moves from `objectos-mobile` to `objectos`, +matching that project. Over-the-air updates are on, gated by the fingerprint +runtime version (`expo-updates`). A `development-device` profile builds a dev +client for a phone (`expo-dev-client`). `preview` builds use channel `preview`, +pre-fill no server and skip Sentry's source map upload. The EAS workflows run on +Node 22, which `eas-cli` requires. + +Both modules are native: earlier development builds need rebuilding. diff --git a/.github/workflows/eas-build.yml b/.github/workflows/eas-build.yml index 56d986f..f4283fa 100644 --- a/.github/workflows/eas-build.yml +++ b/.github/workflows/eas-build.yml @@ -46,7 +46,7 @@ jobs: - uses: actions/setup-node@v4 if: ${{ env.EXPO_TOKEN != '' }} with: - node-version: 20 + node-version: 22 cache: pnpm - uses: expo/expo-github-action@v8 if: ${{ env.EXPO_TOKEN != '' }} diff --git a/.github/workflows/eas-submit.yml b/.github/workflows/eas-submit.yml index 4705232..eb704f1 100644 --- a/.github/workflows/eas-submit.yml +++ b/.github/workflows/eas-submit.yml @@ -32,7 +32,7 @@ jobs: - uses: actions/setup-node@v4 if: ${{ env.EXPO_TOKEN != '' }} with: - node-version: 20 + node-version: 22 cache: pnpm - uses: expo/expo-github-action@v8 if: ${{ env.EXPO_TOKEN != '' }} diff --git a/.github/workflows/eas-update.yml b/.github/workflows/eas-update.yml index be3e34c..bdd6043 100644 --- a/.github/workflows/eas-update.yml +++ b/.github/workflows/eas-update.yml @@ -31,7 +31,7 @@ jobs: - uses: actions/setup-node@v4 if: ${{ env.EXPO_TOKEN != '' }} with: - node-version: 20 + node-version: 22 cache: pnpm - uses: expo/expo-github-action@v8 if: ${{ env.EXPO_TOKEN != '' }} diff --git a/__tests__/lib/shell/incoming-link.test.ts b/__tests__/lib/shell/incoming-link.test.ts index 7d0157c..c12ec4c 100644 --- a/__tests__/lib/shell/incoming-link.test.ts +++ b/__tests__/lib/shell/incoming-link.test.ts @@ -239,7 +239,7 @@ describe("redirectIncomingPath", () => { it("passes internal paths and the dev-client launcher through", () => { expect(redirectIncomingPath("/server-config")).toBe("/server-config"); const dev = - "exp+objectos-mobile://expo-development-client/?url=http%3A%2F%2F10.0.0.2%3A8081"; + "exp+objectos://expo-development-client/?url=http%3A%2F%2F10.0.0.2%3A8081"; expect(redirectIncomingPath(dev)).toBe(dev); }); }); diff --git a/app.config.ts b/app.config.ts index 8f0bcd8..28b590b 100644 --- a/app.config.ts +++ b/app.config.ts @@ -36,11 +36,21 @@ const PERMISSION_LOCALES: Record< ar, }; +// The EAS project this app builds and publishes under: `@objectstack/objectos`. +// `owner`, `slug` and this ID must name the same project, and neither the slug +// nor the ID can change without moving to a new EAS project. +const EAS_PROJECT_ID = "40edd17e-752e-4062-a404-5eb8892ce47f"; + export default ({ config }: ConfigContext): ExpoConfig => ({ ...config, name: "ObjectOS", - slug: "objectos-mobile", + owner: "objectstack", + slug: "objectos", version: "2.0.0", + // An over-the-air update only reaches a binary with the same native modules: + // the fingerprint changes whenever the native side does. + runtimeVersion: { policy: "fingerprint" }, + updates: { url: `https://u.expo.dev/${EAS_PROJECT_ID}` }, orientation: "portrait", icon: "./assets/icon.png", scheme: process.env.EXPO_PUBLIC_APP_SCHEME ?? "objectos", @@ -145,5 +155,6 @@ export default ({ config }: ConfigContext): ExpoConfig => ({ // configured server — typically the SSO identity provider. trustedHosts: process.env.EXPO_PUBLIC_TRUSTED_HOSTS ?? "", sentryDsn: process.env.EXPO_PUBLIC_SENTRY_DSN ?? "", + eas: { projectId: EAS_PROJECT_ID }, }, }); diff --git a/app.json b/app.json index a76f2a0..9977b07 100644 --- a/app.json +++ b/app.json @@ -1,7 +1,7 @@ { "expo": { "name": "ObjectOS", - "slug": "objectos-mobile", + "slug": "objectos", "version": "2.0.0", "orientation": "portrait", "icon": "./assets/icon.png", diff --git a/docs/DEPLOYMENT.md b/docs/DEPLOYMENT.md index e1f26e8..3f6391f 100644 --- a/docs/DEPLOYMENT.md +++ b/docs/DEPLOYMENT.md @@ -9,7 +9,9 @@ | `EXPO_PUBLIC_SENTRY_DSN` | crash reporting | | `EXPO_PUBLIC_APP_SCHEME` | URL scheme for app links (default `objectos`) | -Profiles and their values live in `eas.json`. +Profiles and their values live in `eas.json`. `preview` skips Sentry's source map +upload (`SENTRY_DISABLE_AUTO_UPLOAD`); a `production` build uploads, so it needs a +`SENTRY_AUTH_TOKEN` in the project's EAS environment variables. ## Managed deployment (MDM) @@ -108,12 +110,16 @@ a build without it reads no managed config. ## Builds ```bash -eas build --profile development --platform ios|android # dev client +eas build --profile development --platform ios|android # dev client, iOS simulator +eas build --profile development-device --platform ios|android # dev client, phone eas build --profile preview --platform all # internal distribution eas build --profile production --platform all # store builds eas submit --platform ios|android --profile production ``` +The app builds under the EAS project `@objectstack/objectos`. `owner`, `slug` and +`extra.eas.projectId` in `app.config.ts` name it together. + CI (`.github/workflows/`): - `ci.yml` — Jest with coverage on every PR; @@ -128,6 +134,16 @@ release. A new store build is needed only for native changes (new native module, bridge method, permission, icon). Shell-only JavaScript fixes can ship over the air with EAS Update. +`runtimeVersion` uses the fingerprint policy, so an update only reaches binaries +with the same native side. A binary reads the branch its channel points at: +`preview` builds use channel `preview`, while `eas-update.yml` publishes with +`--auto`, to a branch named after the git branch (`main`). Until the channel is +pointed there, an update from CI reaches no installed build: + +```bash +eas channel:edit preview --branch main +``` + ## App review App Store guideline 4.2 rejects apps that are only a website in a frame. The diff --git a/docs/DEVICE-TESTING.md b/docs/DEVICE-TESTING.md index a76fedf..1474048 100644 --- a/docs/DEVICE-TESTING.md +++ b/docs/DEVICE-TESTING.md @@ -1,19 +1,45 @@ # Device Testing -The shell uses native modules (`react-native-webview`, notifications), so run a -**development build** rather than Expo Go. +The shell uses native modules (`react-native-webview`, notifications), so it does +not run in Expo Go. Install a build from EAS, project +[`@objectstack/objectos`](https://expo.dev/accounts/objectstack/projects/objectos/builds). -## Build and run +## Install on a phone + +The `preview` profile is the build for testers. It needs no computer on the +phone's side. + +**Android** + +1. Open the latest `preview` Android build on the + [builds page](https://expo.dev/accounts/objectstack/projects/objectos/builds), + or scan its QR code. +2. Install the APK. Android asks once to allow installs from that browser. + +**iOS** needs an Apple Developer team, and only registered devices can install. + +1. Someone with the Expo account runs `eas device:create` and sends the phone the + link it prints. Open it on the iPhone and install the profile. +2. Build after registering, because a build only includes the devices registered + when it was made: `eas build --profile preview --platform ios`. +3. Open the build's link on the iPhone and install. + +Then open the app and enter a server (see [Server address](#server-address)). +`preview` builds pre-fill no server. + +## Development builds + +For working on the shell itself, against `pnpm start`: ```bash pnpm install -eas build --profile development --platform ios # or android +eas build --profile development-device --platform ios # or android; a phone +eas build --profile development --platform ios # or android; a simulator # install the build, then: pnpm start ``` -`eas build --profile development --platform ios` produces a simulator build by -default (see `eas.json`); remove `ios.simulator` for a device build. +A development build for an iPhone needs the same device registration as above. ## Server address @@ -37,6 +63,30 @@ anything public must be `https://`. | Links | `xcrun simctl openurl booted "objectos://console/apps"` / `adb shell am start -d "objectos://console/apps"` opens that route | | Push | see [PUSH-NOTIFICATIONS.md](./PUSH-NOTIFICATIONS.md) — needs the server device registry | +## Smoke checklist for landed cards + +None of these has run on a device yet. Each comes from the manual check on its +card. "Dev" means it needs a development build for the tooling named. + +| Card | Check | +|---|---| +| #151 Rebrand | `objectos://console/apps` opens the Console's apps page (`adb shell am start -d "objectos://console/apps"`, Dev on iOS: `xcrun simctl openurl booted`) | +| #154 Server probe | a private server shows the confirm page with the right details; a server with a bad certificate says the certificate is invalid; an https site that is not ObjectOS says so | +| #162 Ready signals | kill the app, tap a push notification: the target record opens with no second cover or full page reload | +| #163 Device registration | after a push token rotates, a signed-in Console receives `objectstack-native:pushTokenChanged`; `window.ObjectStackNative.installId` survives clearing WebView storage | +| #156 Connect | scan a real connect QR code; open an `objectos://connect` link from mail or notes; deny the camera permission | +| #159 Languages | set the phone to Japanese, Arabic and Traditional Chinese (`zh-TW`) in turn: native pages follow, `zh-TW` shows Simplified Chinese, Arabic reads right to left | +| #146 Scan | in a Console page that calls `scan()`, a scanned code fills the field; closing the scanner returns `null`; a denied camera permission fails with `failed` | +| #152 Saved connections | add two connections and switch between them; remove one and confirm it is signed out; upgrade from a version that saved one server | +| #157 MDM | on Android with Test DPC or an EMM, push `serverUrl` and `lockServer=true`: the app goes straight to the confirm page, the switcher has no add-server row, the managed connection cannot be swiped away, and a failed probe says to contact the IT administrator | +| #155 IdP sign-in | with an https test OIDC provider: its page loads under the bar with its exact host; finishing sign-in removes the bar and loads the Console; Android back does not return to the provider; Cancel returns to `/login` | +| Navigation policy | Android: in-server navigation, trusted hosts and sign-in excursions work; a top-level page outside the policy is stopped and returns to the server | +| #147 Pick, share, open | take a photo and pick a library image to upload; open a PDF and an image; open the share sheet; on Android a page's own `input type=file` still works | +| #145 App lock | turn the lock on with "immediately", background and return: the cover shows; biometrics remove it with no reload and form contents intact; the passcode works after a cancelled prompt; the app switcher shows blur on iOS and blank on Android; changing the setting asks for biometrics first, and cancelling leaves it unchanged | + +Report results on the maintainer's device-testing card, and open a defect card +for each failure. + ## Debugging the page Development builds enable WebView debugging: Safari → Develop → (device) on diff --git a/eas.json b/eas.json index a054d54..d84b56f 100644 --- a/eas.json +++ b/eas.json @@ -10,17 +10,21 @@ "simulator": true } }, + "development-device": { + "extends": "development", + "ios": { + "simulator": false + } + }, "preview": { "distribution": "internal", + "channel": "preview", "env": { - "EXPO_PUBLIC_DEFAULT_SERVER_URL": "https://staging.objectstack.com" + "SENTRY_DISABLE_AUTO_UPLOAD": "true" } }, "production": { - "autoIncrement": true, - "env": { - "EXPO_PUBLIC_DEFAULT_SERVER_URL": "" - } + "autoIncrement": true } }, "submit": { diff --git a/package.json b/package.json index 6944360..d8aa2e2 100644 --- a/package.json +++ b/package.json @@ -22,6 +22,7 @@ "expo": "~55.0.26", "expo-camera": "~55.0.23", "expo-constants": "~55.0.16", + "expo-dev-client": "~55.0.41", "expo-device": "~55.0.17", "expo-file-system": "~55.0.22", "expo-font": "~55.0.8", @@ -41,6 +42,7 @@ "expo-sharing": "~55.0.25", "expo-status-bar": "~55.0.6", "expo-system-ui": "~55.0.18", + "expo-updates": "~55.0.33", "expo-web-browser": "~55.0.16", "i18next": "^25.8.4", "lucide-react-native": "^0.563.0", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 472fed1..2817eaa 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -26,6 +26,9 @@ importers: expo-constants: specifier: ~55.0.16 version: 55.0.16(expo@55.0.26)(react-native@0.83.6(@babel/core@7.29.7)(@types/react@19.2.13)(react@19.2.0)) + expo-dev-client: + specifier: ~55.0.41 + version: 55.0.41(expo@55.0.26) expo-device: specifier: ~55.0.17 version: 55.0.17(expo@55.0.26) @@ -83,6 +86,9 @@ importers: expo-system-ui: specifier: ~55.0.18 version: 55.0.18(expo@55.0.26)(react-native-web@0.21.2(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(react-native@0.83.6(@babel/core@7.29.7)(@types/react@19.2.13)(react@19.2.0)) + expo-updates: + specifier: ~55.0.33 + version: 55.0.33(expo@55.0.26)(react-native@0.83.6(@babel/core@7.29.7)(@types/react@19.2.13)(react@19.2.0))(react@19.2.0) expo-web-browser: specifier: ~55.0.16 version: 55.0.16(expo@55.0.26)(react-native@0.83.6(@babel/core@7.29.7)(@types/react@19.2.13)(react@19.2.0)) @@ -1143,6 +1149,9 @@ packages: '@expo/schema-utils@55.0.4': resolution: {integrity: sha512-65IdeeE8dAZR3n3J5Eq7LYiQ8BFGeEYCWPBCzycvafL7PkskbCyIclTQarRwf/HXFoRvezKCjaLwy/8v9Prk6g==} + '@expo/schema-utils@55.0.5': + resolution: {integrity: sha512-wdV4SzWJ/l+6y/r9vDaqPqXGyfxUD1igbX8rRbRBfkVXenAUY2qenq6HF4S0iJ0pjpVDNTANn5aQY7VV55hhsA==} + '@expo/sdk-runtime-versions@1.0.0': resolution: {integrity: sha512-Doz2bfiPndXYFPMRwPyGa1k5QaKDVpY806UJj570epIiMzWaYyCtobasyfC++qfIXVb5Ocy7r3tP9d62hAQ7IQ==} @@ -2017,6 +2026,9 @@ packages: resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==} engines: {node: '>= 8'} + arg@4.1.3: + resolution: {integrity: sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==} + arg@5.0.2: resolution: {integrity: sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==} @@ -2821,11 +2833,34 @@ packages: expo: '*' react-native: '*' + expo-dev-client@55.0.41: + resolution: {integrity: sha512-nEVrGdcsDMimSNGDTsNeQsV4KpL63JS8y75azINvwEULaGOZ6mutlFUxed3bsPvhCWc/oT7861XAEWsxpHFBbw==} + peerDependencies: + expo: '*' + + expo-dev-launcher@55.0.42: + resolution: {integrity: sha512-kjJT/Hp7pCrJutxRPSvm2xKFORK2elfyJB3G1Bsz/mPKMGvA6WOkEaO703SWEKEfUvw9aUTVcwypMFzlzMYdOg==} + peerDependencies: + expo: '*' + + expo-dev-menu-interface@55.0.2: + resolution: {integrity: sha512-DomUNvGzY/xliwnMdbAYY780sCv19N7zIbifc0ClcoCzJZpNSCkvJ2qGIFRPyM/7DmqmlHGCKi8di7kYYLKNEg==} + peerDependencies: + expo: '*' + + expo-dev-menu@55.0.35: + resolution: {integrity: sha512-Dd456WfsAzPTfLrijdsBQ8WcawERsDQM+Pj7/th3mmOl0oZSczBtRU9zQfTByCjdq8rkPR0Tlf4Cz1Qz1zblrQ==} + peerDependencies: + expo: '*' + expo-device@55.0.17: resolution: {integrity: sha512-ZcMrSeD0zWooosm5Bet5qluxUrhw+NPgcMmN6ySVF7cm4K8Bvh4KPogJePbI1qfhFAiJWcWeV9e/2uewb9ktfw==} peerDependencies: expo: '*' + expo-eas-client@55.0.5: + resolution: {integrity: sha512-wRagCeSbSnSGVXgP7V+qiGfXzZ9hTVKWvKIOP7lwrX3MIEenNmNlO4D3RVC3aNU2GhmO3ZCZIIEre80KZoUUHA==} + expo-file-system@55.0.22: resolution: {integrity: sha512-T5Rfv3vqcFyhVrl/tEEeglc/J8LJbcZQgC3TMT5jxzIgUgWmIgJEgncGYqB/YNXFgUTL2LiuCvqrU51Dzp83NQ==} peerDependencies: @@ -2882,6 +2917,9 @@ packages: peerDependencies: expo: '*' + expo-json-utils@55.0.2: + resolution: {integrity: sha512-QJMOZOPOG7CTnKcrdVaiummn2va1MCO56z++eyWkDv3GBRODldM6MFMDf/jTREWthFc2Nxo6TuyWRrEV9S6n/Q==} + expo-keep-awake@55.0.8: resolution: {integrity: sha512-PfIpMfM+STOBwkR5XOE+yVtER86c44MD+W8QD8JxuO0sT9pF7Y1SJYakWlpvX8xsGA+bjKLxftm9403s9kQhKA==} peerDependencies: @@ -2905,6 +2943,11 @@ packages: expo: '*' react: '*' + expo-manifests@55.0.21: + resolution: {integrity: sha512-Eu27Ia6v2Ev4i7AoswypTcqhWTKmyjd8t8cwznK3HkDQqhfHsAQIeBxSwiLmErS25iD5NsQ4C3+w/2TZdLABhQ==} + peerDependencies: + expo: '*' + expo-modules-autolinking@55.0.24: resolution: {integrity: sha512-A0OyMbTPZqibYrwqj98HFYTNSvl4NSS4Zt+R5A8qiAx3nM0mc81e6Iqw7Wl4J8M/t36lJ+cT3WuVTz5Oszj6Hw==} hasBin: true @@ -2995,6 +3038,9 @@ packages: react: '*' react-native: '*' + expo-structured-headers@55.0.2: + resolution: {integrity: sha512-KITovrWigTOtsII5hRQ9/3ydaNcxCux5g6O+eTPLyjnye9dpkDKl5GmCLVPVKIL/d7253OtbGtWMD4m0gha5pw==} + expo-symbols@55.0.9: resolution: {integrity: sha512-F85C/8ExQjd2gYjasLVKMT8wPj+1+19TVTqg4jAeVjVZklqiQtLO72io9Ji1xAjYNgmDeUI0diVHlFMMTC4Ekg==} peerDependencies: @@ -3013,6 +3059,19 @@ packages: react-native-web: optional: true + expo-updates-interface@55.1.6: + resolution: {integrity: sha512-evxNpagCkjT3lE6bGV570TFzRtKuIuLY8I37RYHoriXCJ+ZKCN1hbmklK29uAixya+BxGpeTI2K4FqYeJLvfrw==} + peerDependencies: + expo: '*' + + expo-updates@55.0.33: + resolution: {integrity: sha512-4KJF2o37o7LOaVtFFoIThR/j4vVsZfMjjT32yoWzMpgJ5zd0OXDjSyA8/dDLDfW6kqpJJR+3QfHYGoWgifswdg==} + hasBin: true + peerDependencies: + expo: '*' + react: '*' + react-native: '*' + expo-web-browser@55.0.16: resolution: {integrity: sha512-eeGs3439ewO/Q56Pzg3qbAVZSE0oH/R7XW9VCXI59k0m78ZIYbBtPT4PMFL/+sBgRkXm546Lq/DFcJQPTOfXJg==} peerDependencies: @@ -3883,48 +3942,56 @@ packages: engines: {node: '>= 12.0.0'} cpu: [arm64] os: [linux] + libc: [glibc] lightningcss-linux-arm64-gnu@1.31.1: resolution: {integrity: sha512-WKyLWztD71rTnou4xAD5kQT+982wvca7E6QoLpoawZ1gP9JM0GJj4Tp5jMUh9B3AitHbRZ2/H3W5xQmdEOUlLg==} engines: {node: '>= 12.0.0'} cpu: [arm64] os: [linux] + libc: [glibc] lightningcss-linux-arm64-musl@1.27.0: resolution: {integrity: sha512-rCGBm2ax7kQ9pBSeITfCW9XSVF69VX+fm5DIpvDZQl4NnQoMQyRwhZQm9pd59m8leZ1IesRqWk2v/DntMo26lg==} engines: {node: '>= 12.0.0'} cpu: [arm64] os: [linux] + libc: [musl] lightningcss-linux-arm64-musl@1.31.1: resolution: {integrity: sha512-mVZ7Pg2zIbe3XlNbZJdjs86YViQFoJSpc41CbVmKBPiGmC4YrfeOyz65ms2qpAobVd7WQsbW4PdsSJEMymyIMg==} engines: {node: '>= 12.0.0'} cpu: [arm64] os: [linux] + libc: [musl] lightningcss-linux-x64-gnu@1.27.0: resolution: {integrity: sha512-Dk/jovSI7qqhJDiUibvaikNKI2x6kWPN79AQiD/E/KeQWMjdGe9kw51RAgoWFDi0coP4jinaH14Nrt/J8z3U4A==} engines: {node: '>= 12.0.0'} cpu: [x64] os: [linux] + libc: [glibc] lightningcss-linux-x64-gnu@1.31.1: resolution: {integrity: sha512-xGlFWRMl+0KvUhgySdIaReQdB4FNudfUTARn7q0hh/V67PVGCs3ADFjw+6++kG1RNd0zdGRlEKa+T13/tQjPMA==} engines: {node: '>= 12.0.0'} cpu: [x64] os: [linux] + libc: [glibc] lightningcss-linux-x64-musl@1.27.0: resolution: {integrity: sha512-QKjTxXm8A9s6v9Tg3Fk0gscCQA1t/HMoF7Woy1u68wCk5kS4fR+q3vXa1p3++REW784cRAtkYKrPy6JKibrEZA==} engines: {node: '>= 12.0.0'} cpu: [x64] os: [linux] + libc: [musl] lightningcss-linux-x64-musl@1.31.1: resolution: {integrity: sha512-eowF8PrKHw9LpoZii5tdZwnBcYDxRw2rRCyvAXLi34iyeYfqCQNA9rmUM0ce62NlPhCvof1+9ivRaTY6pSKDaA==} engines: {node: '>= 12.0.0'} cpu: [x64] os: [linux] + libc: [musl] lightningcss-win32-arm64-msvc@1.27.0: resolution: {integrity: sha512-/wXegPS1hnhkeG4OXQKEMQeJd48RDC3qdh+OA8pCuOPCyvnm/yEayrJdJVqzBsqpy1aJklRCVxscpFur80o6iQ==} @@ -6933,6 +7000,8 @@ snapshots: '@expo/schema-utils@55.0.4': {} + '@expo/schema-utils@55.0.5': {} + '@expo/sdk-runtime-versions@1.0.0': {} '@expo/spawn-async@1.7.2': @@ -7988,6 +8057,8 @@ snapshots: normalize-path: 3.0.0 picomatch: 2.3.1 + arg@4.1.3: {} + arg@5.0.2: {} argparse@1.0.10: @@ -8992,11 +9063,38 @@ snapshots: transitivePeerDependencies: - supports-color + expo-dev-client@55.0.41(expo@55.0.26): + dependencies: + expo: 55.0.26(@babel/core@7.29.7)(@expo/dom-webview@55.0.6)(@expo/metro-runtime@55.0.11)(expo-router@55.0.16)(react-dom@19.2.0(react@19.2.0))(react-native-webview@13.16.0(react-native@0.83.6(@babel/core@7.29.7)(@types/react@19.2.13)(react@19.2.0))(react@19.2.0))(react-native-worklets@0.7.4(@babel/core@7.29.7)(react-native@0.83.6(@babel/core@7.29.7)(@types/react@19.2.13)(react@19.2.0))(react@19.2.0))(react-native@0.83.6(@babel/core@7.29.7)(@types/react@19.2.13)(react@19.2.0))(react@19.2.0)(typescript@5.9.3) + expo-dev-launcher: 55.0.42(expo@55.0.26) + expo-dev-menu: 55.0.35(expo@55.0.26) + expo-dev-menu-interface: 55.0.2(expo@55.0.26) + expo-manifests: 55.0.21(expo@55.0.26) + expo-updates-interface: 55.1.6(expo@55.0.26) + + expo-dev-launcher@55.0.42(expo@55.0.26): + dependencies: + '@expo/schema-utils': 55.0.5 + expo: 55.0.26(@babel/core@7.29.7)(@expo/dom-webview@55.0.6)(@expo/metro-runtime@55.0.11)(expo-router@55.0.16)(react-dom@19.2.0(react@19.2.0))(react-native-webview@13.16.0(react-native@0.83.6(@babel/core@7.29.7)(@types/react@19.2.13)(react@19.2.0))(react@19.2.0))(react-native-worklets@0.7.4(@babel/core@7.29.7)(react-native@0.83.6(@babel/core@7.29.7)(@types/react@19.2.13)(react@19.2.0))(react@19.2.0))(react-native@0.83.6(@babel/core@7.29.7)(@types/react@19.2.13)(react@19.2.0))(react@19.2.0)(typescript@5.9.3) + expo-dev-menu: 55.0.35(expo@55.0.26) + expo-manifests: 55.0.21(expo@55.0.26) + + expo-dev-menu-interface@55.0.2(expo@55.0.26): + dependencies: + expo: 55.0.26(@babel/core@7.29.7)(@expo/dom-webview@55.0.6)(@expo/metro-runtime@55.0.11)(expo-router@55.0.16)(react-dom@19.2.0(react@19.2.0))(react-native-webview@13.16.0(react-native@0.83.6(@babel/core@7.29.7)(@types/react@19.2.13)(react@19.2.0))(react@19.2.0))(react-native-worklets@0.7.4(@babel/core@7.29.7)(react-native@0.83.6(@babel/core@7.29.7)(@types/react@19.2.13)(react@19.2.0))(react@19.2.0))(react-native@0.83.6(@babel/core@7.29.7)(@types/react@19.2.13)(react@19.2.0))(react@19.2.0)(typescript@5.9.3) + + expo-dev-menu@55.0.35(expo@55.0.26): + dependencies: + expo: 55.0.26(@babel/core@7.29.7)(@expo/dom-webview@55.0.6)(@expo/metro-runtime@55.0.11)(expo-router@55.0.16)(react-dom@19.2.0(react@19.2.0))(react-native-webview@13.16.0(react-native@0.83.6(@babel/core@7.29.7)(@types/react@19.2.13)(react@19.2.0))(react@19.2.0))(react-native-worklets@0.7.4(@babel/core@7.29.7)(react-native@0.83.6(@babel/core@7.29.7)(@types/react@19.2.13)(react@19.2.0))(react@19.2.0))(react-native@0.83.6(@babel/core@7.29.7)(@types/react@19.2.13)(react@19.2.0))(react@19.2.0)(typescript@5.9.3) + expo-dev-menu-interface: 55.0.2(expo@55.0.26) + expo-device@55.0.17(expo@55.0.26): dependencies: expo: 55.0.26(@babel/core@7.29.7)(@expo/dom-webview@55.0.6)(@expo/metro-runtime@55.0.11)(expo-router@55.0.16)(react-dom@19.2.0(react@19.2.0))(react-native-webview@13.16.0(react-native@0.83.6(@babel/core@7.29.7)(@types/react@19.2.13)(react@19.2.0))(react@19.2.0))(react-native-worklets@0.7.4(@babel/core@7.29.7)(react-native@0.83.6(@babel/core@7.29.7)(@types/react@19.2.13)(react@19.2.0))(react@19.2.0))(react-native@0.83.6(@babel/core@7.29.7)(@types/react@19.2.13)(react@19.2.0))(react@19.2.0)(typescript@5.9.3) ua-parser-js: 0.7.41 + expo-eas-client@55.0.5: {} + expo-file-system@55.0.22(expo@55.0.26)(react-native@0.83.6(@babel/core@7.29.7)(@types/react@19.2.13)(react@19.2.0)): dependencies: expo: 55.0.26(@babel/core@7.29.7)(@expo/dom-webview@55.0.6)(@expo/metro-runtime@55.0.11)(expo-router@55.0.16)(react-dom@19.2.0(react@19.2.0))(react-native-webview@13.16.0(react-native@0.83.6(@babel/core@7.29.7)(@types/react@19.2.13)(react@19.2.0))(react@19.2.0))(react-native-worklets@0.7.4(@babel/core@7.29.7)(react-native@0.83.6(@babel/core@7.29.7)(@types/react@19.2.13)(react@19.2.0))(react@19.2.0))(react-native@0.83.6(@babel/core@7.29.7)(@types/react@19.2.13)(react@19.2.0))(react@19.2.0)(typescript@5.9.3) @@ -9046,6 +9144,8 @@ snapshots: dependencies: expo: 55.0.26(@babel/core@7.29.7)(@expo/dom-webview@55.0.6)(@expo/metro-runtime@55.0.11)(expo-router@55.0.16)(react-dom@19.2.0(react@19.2.0))(react-native-webview@13.16.0(react-native@0.83.6(@babel/core@7.29.7)(@types/react@19.2.13)(react@19.2.0))(react@19.2.0))(react-native-worklets@0.7.4(@babel/core@7.29.7)(react-native@0.83.6(@babel/core@7.29.7)(@types/react@19.2.13)(react@19.2.0))(react@19.2.0))(react-native@0.83.6(@babel/core@7.29.7)(@types/react@19.2.13)(react@19.2.0))(react@19.2.0)(typescript@5.9.3) + expo-json-utils@55.0.2: {} + expo-keep-awake@55.0.8(expo@55.0.26)(react@19.2.0): dependencies: expo: 55.0.26(@babel/core@7.29.7)(@expo/dom-webview@55.0.6)(@expo/metro-runtime@55.0.11)(expo-router@55.0.16)(react-dom@19.2.0(react@19.2.0))(react-native-webview@13.16.0(react-native@0.83.6(@babel/core@7.29.7)(@types/react@19.2.13)(react@19.2.0))(react@19.2.0))(react-native-worklets@0.7.4(@babel/core@7.29.7)(react-native@0.83.6(@babel/core@7.29.7)(@types/react@19.2.13)(react@19.2.0))(react@19.2.0))(react-native@0.83.6(@babel/core@7.29.7)(@types/react@19.2.13)(react@19.2.0))(react@19.2.0)(typescript@5.9.3) @@ -9072,6 +9172,11 @@ snapshots: react: 19.2.0 rtl-detect: 1.1.2 + expo-manifests@55.0.21(expo@55.0.26): + dependencies: + expo: 55.0.26(@babel/core@7.29.7)(@expo/dom-webview@55.0.6)(@expo/metro-runtime@55.0.11)(expo-router@55.0.16)(react-dom@19.2.0(react@19.2.0))(react-native-webview@13.16.0(react-native@0.83.6(@babel/core@7.29.7)(@types/react@19.2.13)(react@19.2.0))(react@19.2.0))(react-native-worklets@0.7.4(@babel/core@7.29.7)(react-native@0.83.6(@babel/core@7.29.7)(@types/react@19.2.13)(react@19.2.0))(react@19.2.0))(react-native@0.83.6(@babel/core@7.29.7)(@types/react@19.2.13)(react@19.2.0))(react@19.2.0)(typescript@5.9.3) + expo-json-utils: 55.0.2 + expo-modules-autolinking@55.0.24(typescript@5.9.3): dependencies: '@expo/require-utils': 55.0.5(typescript@5.9.3) @@ -9186,6 +9291,8 @@ snapshots: react-native: 0.83.6(@babel/core@7.29.7)(@types/react@19.2.13)(react@19.2.0) react-native-is-edge-to-edge: 1.2.1(react-native@0.83.6(@babel/core@7.29.7)(@types/react@19.2.13)(react@19.2.0))(react@19.2.0) + expo-structured-headers@55.0.2: {} + expo-symbols@55.0.9(expo-font@55.0.8)(expo@55.0.26)(react-native@0.83.6(@babel/core@7.29.7)(@types/react@19.2.13)(react@19.2.0))(react@19.2.0): dependencies: '@expo-google-fonts/material-symbols': 0.4.38 @@ -9206,6 +9313,32 @@ snapshots: transitivePeerDependencies: - supports-color + expo-updates-interface@55.1.6(expo@55.0.26): + dependencies: + expo: 55.0.26(@babel/core@7.29.7)(@expo/dom-webview@55.0.6)(@expo/metro-runtime@55.0.11)(expo-router@55.0.16)(react-dom@19.2.0(react@19.2.0))(react-native-webview@13.16.0(react-native@0.83.6(@babel/core@7.29.7)(@types/react@19.2.13)(react@19.2.0))(react@19.2.0))(react-native-worklets@0.7.4(@babel/core@7.29.7)(react-native@0.83.6(@babel/core@7.29.7)(@types/react@19.2.13)(react@19.2.0))(react@19.2.0))(react-native@0.83.6(@babel/core@7.29.7)(@types/react@19.2.13)(react@19.2.0))(react@19.2.0)(typescript@5.9.3) + + expo-updates@55.0.33(expo@55.0.26)(react-native@0.83.6(@babel/core@7.29.7)(@types/react@19.2.13)(react@19.2.0))(react@19.2.0): + dependencies: + '@expo/code-signing-certificates': 0.0.6 + '@expo/plist': 0.5.4 + '@expo/spawn-async': 1.8.0 + arg: 4.1.3 + chalk: 4.1.2 + debug: 4.4.3 + expo: 55.0.26(@babel/core@7.29.7)(@expo/dom-webview@55.0.6)(@expo/metro-runtime@55.0.11)(expo-router@55.0.16)(react-dom@19.2.0(react@19.2.0))(react-native-webview@13.16.0(react-native@0.83.6(@babel/core@7.29.7)(@types/react@19.2.13)(react@19.2.0))(react@19.2.0))(react-native-worklets@0.7.4(@babel/core@7.29.7)(react-native@0.83.6(@babel/core@7.29.7)(@types/react@19.2.13)(react@19.2.0))(react@19.2.0))(react-native@0.83.6(@babel/core@7.29.7)(@types/react@19.2.13)(react@19.2.0))(react@19.2.0)(typescript@5.9.3) + expo-eas-client: 55.0.5 + expo-manifests: 55.0.21(expo@55.0.26) + expo-structured-headers: 55.0.2 + expo-updates-interface: 55.1.6(expo@55.0.26) + getenv: 2.0.0 + glob: 13.0.6 + ignore: 5.3.2 + react: 19.2.0 + react-native: 0.83.6(@babel/core@7.29.7)(@types/react@19.2.13)(react@19.2.0) + resolve-from: 5.0.0 + transitivePeerDependencies: + - supports-color + expo-web-browser@55.0.16(expo@55.0.26)(react-native@0.83.6(@babel/core@7.29.7)(@types/react@19.2.13)(react@19.2.0)): dependencies: expo: 55.0.26(@babel/core@7.29.7)(@expo/dom-webview@55.0.6)(@expo/metro-runtime@55.0.11)(expo-router@55.0.16)(react-dom@19.2.0(react@19.2.0))(react-native-webview@13.16.0(react-native@0.83.6(@babel/core@7.29.7)(@types/react@19.2.13)(react@19.2.0))(react@19.2.0))(react-native-worklets@0.7.4(@babel/core@7.29.7)(react-native@0.83.6(@babel/core@7.29.7)(@types/react@19.2.13)(react@19.2.0))(react@19.2.0))(react-native@0.83.6(@babel/core@7.29.7)(@types/react@19.2.13)(react@19.2.0))(react@19.2.0)(typescript@5.9.3)