From 92f82c0f969842e8bd8739ada90efaa768e77f53 Mon Sep 17 00:00:00 2001 From: Yash Singh Date: Tue, 2 Jun 2026 10:42:06 -0500 Subject: [PATCH 01/13] chore: setup eas ci --- .github/workflows/mobile-eas-preview.yml | 77 ++++++++++++++++++++++++ apps/mobile/.fingerprintignore | 24 ++++++++ apps/mobile/README.md | 9 +++ apps/mobile/app.config.ts | 2 +- apps/mobile/eas.json | 15 +++++ apps/mobile/package.json | 3 + 6 files changed, 129 insertions(+), 1 deletion(-) create mode 100644 .github/workflows/mobile-eas-preview.yml create mode 100644 apps/mobile/.fingerprintignore diff --git a/.github/workflows/mobile-eas-preview.yml b/.github/workflows/mobile-eas-preview.yml new file mode 100644 index 00000000000..076d20ca389 --- /dev/null +++ b/.github/workflows/mobile-eas-preview.yml @@ -0,0 +1,77 @@ +name: Mobile EAS Preview + +on: + pull_request: + paths: + - "apps/mobile/**" + +jobs: + preview: + name: EAS Preview + if: | + github.event.pull_request.user.login == 'Yash-Singh1' || + github.event.pull_request.user.login == 'juliusmarminge' + runs-on: blacksmith-8vcpu-ubuntu-2404 + permissions: + contents: read + pull-requests: write + env: + APP_VARIANT: preview + NODE_OPTIONS: --max-old-space-size=8192 + MOBILE_VERSION_POLICY: fingerprint + steps: + - name: Check for EXPO_TOKEN + run: | + if [ -z "${{ secrets.EXPO_TOKEN }}" ]; then + echo "You must provide an EXPO_TOKEN secret linked to this project's Expo account in this repo's secrets. Learn more: https://docs.expo.dev/eas-update/github-actions" + exit 1 + fi + + - name: Checkout + uses: actions/checkout@v6 + with: + fetch-depth: 0 + + - name: Setup Bun + uses: oven-sh/setup-bun@v2 + with: + bun-version-file: package.json + + - name: Setup Node + uses: actions/setup-node@v6 + with: + node-version-file: package.json + + - name: Cache Bun and Turbo + uses: actions/cache@v5 + with: + path: | + ~/.bun/install/cache + .turbo + key: ${{ runner.os }}-bun-${{ hashFiles('bun.lock') }}-${{ hashFiles('turbo.json') }} + restore-keys: | + ${{ runner.os }}-bun-${{ hashFiles('bun.lock') }}- + + - name: Install dependencies + run: bun install --frozen-lockfile + + - name: Setup EAS + uses: expo/expo-github-action@v8 + with: + eas-version: latest + token: ${{ secrets.EXPO_TOKEN }} + packager: bun + + - name: Pull preview environment variables + working-directory: apps/mobile + run: eas env:pull preview --non-interactive + + - name: Deploy with fingerprint check + uses: expo/expo-github-action/continuous-deploy-fingerprint@main + with: + profile: preview:dev + branch: pr-${{ github.event.pull_request.number }} + platform: all + environment: preview + working-directory: apps/mobile + github-token: ${{ secrets.GITHUB_TOKEN }} diff --git a/apps/mobile/.fingerprintignore b/apps/mobile/.fingerprintignore new file mode 100644 index 00000000000..7f04b98cabe --- /dev/null +++ b/apps/mobile/.fingerprintignore @@ -0,0 +1,24 @@ +# Expo artifacts +.expo/ +.eas/ + +# Build outputs +android/ +ios/ +dist/ +web-build/ + +# Test files +**/*.test.ts +**/*.test.tsx + +# Docs +*.md + +# Local env +.env +.env.local +.env*.local + +# TypeScript +*.tsbuildinfo diff --git a/apps/mobile/README.md b/apps/mobile/README.md index 44639e74ccf..09edb857c3c 100644 --- a/apps/mobile/README.md +++ b/apps/mobile/README.md @@ -61,6 +61,14 @@ The native lint task runs SwiftLint for Swift plus ktlint and detekt for Kotlin. ## EAS Builds +Pull requests that touch `apps/mobile` run a GitHub Actions preview workflow. CI uses Expo fingerprinting with the `preview:dev` profile to reuse an existing compatible build when possible, or start a new internal EAS build when native runtime inputs change. Production and default local builds continue to use the `appVersion` runtime policy. + +Create a PR preview dev-client build manually: + +```bash +vp run eas:ios:preview:dev +``` + Create a cloud dev-client build: ```bash @@ -77,5 +85,6 @@ Android equivalents: ```bash vp run eas:android:dev +vp run eas:android:preview:dev vp run eas:android:preview ``` diff --git a/apps/mobile/app.config.ts b/apps/mobile/app.config.ts index 5c46d01bfd8..198dcf23b97 100644 --- a/apps/mobile/app.config.ts +++ b/apps/mobile/app.config.ts @@ -56,7 +56,7 @@ const config: ExpoConfig = { scheme: variant.scheme, version: "0.1.0", runtimeVersion: { - policy: "appVersion", + policy: process.env.MOBILE_VERSION_POLICY ?? "appVersion", }, orientation: "portrait", icon: "./assets/icon.png", diff --git a/apps/mobile/eas.json b/apps/mobile/eas.json index cb0075613b8..4e6b55a4223 100644 --- a/apps/mobile/eas.json +++ b/apps/mobile/eas.json @@ -17,13 +17,28 @@ "APP_VARIANT": "preview" }, "channel": "preview", + "environment": "preview", "distribution": "internal" }, + "preview:dev": { + "env": { + "APP_VARIANT": "preview", + "MOBILE_VERSION_POLICY": "fingerprint" + }, + "channel": "preview", + "environment": "preview", + "developmentClient": true, + "distribution": "internal", + "android": { + "buildType": "apk" + } + }, "production": { "env": { "APP_VARIANT": "production" }, "channel": "production", + "environment": "production", "autoIncrement": true } }, diff --git a/apps/mobile/package.json b/apps/mobile/package.json index d2dec20e521..6f48f529c87 100644 --- a/apps/mobile/package.json +++ b/apps/mobile/package.json @@ -16,6 +16,7 @@ "android:prod": "APP_VARIANT=production EXPO_NO_GIT_STATUS=1 expo prebuild --clean --platform android && expo run:android", "eas:android:dev": "eas build --profile development -p android", "eas:android:preview": "eas build --profile preview -p android", + "eas:android:preview:dev": "eas build --profile preview:dev -p android", "eas:android:prod": "eas build --profile production -p android", "ios": "EXPO_NO_GIT_STATUS=1 expo prebuild --clean --platform ios && expo run:ios", "ios:dev": "APP_VARIANT=development EXPO_NO_GIT_STATUS=1 expo prebuild --clean --platform ios && expo run:ios", @@ -23,9 +24,11 @@ "ios:prod": "APP_VARIANT=production EXPO_NO_GIT_STATUS=1 expo prebuild --clean --platform ios && expo run:ios", "eas:ios:dev": "eas build --profile development -p ios", "eas:ios:preview": "eas build --profile preview -p ios", + "eas:ios:preview:dev": "eas build --profile preview:dev -p ios", "eas:ios:prod": "eas build --profile production -p ios", "eas:dev": "eas build --profile development", "eas:preview": "eas build --profile preview", + "eas:preview:dev": "eas build --profile preview:dev", "eas:prod": "eas build --profile production", "config:dev": "APP_VARIANT=development expo config", "config:preview": "APP_VARIANT=preview expo config", From 98f40f3c2673fd28621e849a81c7c06fed653c12 Mon Sep 17 00:00:00 2001 From: Yash Singh Date: Tue, 2 Jun 2026 12:11:21 -0500 Subject: [PATCH 02/13] pls work --- .github/workflows/mobile-eas-preview.yml | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) diff --git a/.github/workflows/mobile-eas-preview.yml b/.github/workflows/mobile-eas-preview.yml index 076d20ca389..420f43f7536 100644 --- a/.github/workflows/mobile-eas-preview.yml +++ b/.github/workflows/mobile-eas-preview.yml @@ -66,12 +66,22 @@ jobs: working-directory: apps/mobile run: eas env:pull preview --non-interactive - - name: Deploy with fingerprint check + - name: Deploy iOS with fingerprint check uses: expo/expo-github-action/continuous-deploy-fingerprint@main with: profile: preview:dev branch: pr-${{ github.event.pull_request.number }} - platform: all + platform: ios + environment: preview + working-directory: apps/mobile + github-token: ${{ secrets.GITHUB_TOKEN }} + + - name: Deploy Android with fingerprint check + uses: expo/expo-github-action/continuous-deploy-fingerprint@main + with: + profile: preview:dev + branch: pr-${{ github.event.pull_request.number }} + platform: android environment: preview working-directory: apps/mobile github-token: ${{ secrets.GITHUB_TOKEN }} From f4f256d9e7a1d52e8deeead67aab99f6a6bde001 Mon Sep 17 00:00:00 2001 From: Yash Singh Date: Tue, 2 Jun 2026 12:30:22 -0500 Subject: [PATCH 03/13] pls work --- .github/workflows/mobile-eas-preview.yml | 14 ++------------ package.json | 1 + 2 files changed, 3 insertions(+), 12 deletions(-) diff --git a/.github/workflows/mobile-eas-preview.yml b/.github/workflows/mobile-eas-preview.yml index 420f43f7536..076d20ca389 100644 --- a/.github/workflows/mobile-eas-preview.yml +++ b/.github/workflows/mobile-eas-preview.yml @@ -66,22 +66,12 @@ jobs: working-directory: apps/mobile run: eas env:pull preview --non-interactive - - name: Deploy iOS with fingerprint check + - name: Deploy with fingerprint check uses: expo/expo-github-action/continuous-deploy-fingerprint@main with: profile: preview:dev branch: pr-${{ github.event.pull_request.number }} - platform: ios - environment: preview - working-directory: apps/mobile - github-token: ${{ secrets.GITHUB_TOKEN }} - - - name: Deploy Android with fingerprint check - uses: expo/expo-github-action/continuous-deploy-fingerprint@main - with: - profile: preview:dev - branch: pr-${{ github.event.pull_request.number }} - platform: android + platform: all environment: preview working-directory: apps/mobile github-token: ${{ secrets.GITHUB_TOKEN }} diff --git a/package.json b/package.json index 9b03728f3eb..bd023c59bd4 100644 --- a/package.json +++ b/package.json @@ -67,6 +67,7 @@ "sync:repos": "node scripts/sync-reference-repos.ts" }, "devDependencies": { + "@babel/plugin-transform-react-jsx": "7.28.6", "@effect/tsgo": "catalog:", "@oxlint/plugins": "^1.63.0", "@types/node": "catalog:", From 0e32ea5820f38f7cdfa1123e91128732cc51ab19 Mon Sep 17 00:00:00 2001 From: Yash Singh Date: Tue, 2 Jun 2026 13:10:37 -0500 Subject: [PATCH 04/13] pls work --- package.json | 1 + patches/@expo%2Fmetro-config@56.0.13.patch | 93 ++++++++++++++++++++++ 2 files changed, 94 insertions(+) create mode 100644 patches/@expo%2Fmetro-config@56.0.13.patch diff --git a/package.json b/package.json index bd023c59bd4..81ca5a2a77f 100644 --- a/package.json +++ b/package.json @@ -100,6 +100,7 @@ ] }, "patchedDependencies": { + "@expo/metro-config@56.0.13": "patches/@expo%2Fmetro-config@56.0.13.patch", "@pierre/diffs@1.1.20@1.1.20": "patches/@pierre%2Fdiffs@1.1.20.patch", "effect@4.0.0-beta.73@4.0.0-beta.73": "patches/effect@4.0.0-beta.73.patch", "react-native-nitro-modules@0.35.9@0.35.9": "patches/react-native-nitro-modules@0.35.9.patch" diff --git a/patches/@expo%2Fmetro-config@56.0.13.patch b/patches/@expo%2Fmetro-config@56.0.13.patch new file mode 100644 index 00000000000..c25173730c8 --- /dev/null +++ b/patches/@expo%2Fmetro-config@56.0.13.patch @@ -0,0 +1,93 @@ +diff --git a/build/serializer/sourceMap.js b/build/serializer/sourceMap.js +index 4cc9aa4..703dfe0 100644 +--- a/build/serializer/sourceMap.js ++++ b/build/serializer/sourceMap.js +@@ -20,6 +20,20 @@ function loadRemapping() { + } + return _remapping; + } ++let _sourceMapCodec; ++function loadSourceMapCodec() { ++ if (!_sourceMapCodec) { ++ _sourceMapCodec = require('@jridgewell/sourcemap-codec'); ++ } ++ return _sourceMapCodec; ++} ++let _traceMapping; ++function loadTraceMapping() { ++ if (!_traceMapping) { ++ _traceMapping = require('@jridgewell/trace-mapping'); ++ } ++ return _traceMapping; ++} + let _Generator; + function loadGenerator() { + if (!_Generator) { +@@ -199,6 +213,58 @@ function patchMetroSourceMapStringForPackedMaps() { + stock.sourceMapString = sourceMapString; + stock.sourceMapStringNonBlocking = sourceMapStringNonBlocking; + } ++// Hermes can emit mappings for Metro trailer/debug lines that have no ++// corresponding Metro source-map line. @jridgewell/remapping assumes every ++// referenced generated line exists, so strip those invalid bridge segments. ++function getGeneratedLineCount(map) { ++ const { TraceMap, decodedMappings } = loadTraceMapping(); ++ return decodedMappings(new TraceMap(map)).length; ++} ++function dropInvalidOriginalSegments(map, maxOriginalLine) { ++ const { TraceMap, decodedMappings } = loadTraceMapping(); ++ const decoded = decodedMappings(new TraceMap(map)); ++ let didChange = false; ++ const filtered = decoded.map((line) => { ++ const filteredLine = line.filter((segment) => { ++ if (segment.length < 4) { ++ return true; ++ } ++ const sourceIndex = segment[1]; ++ const sourceLine = segment[2]; ++ const sourceColumn = segment[3]; ++ return (sourceIndex >= 0 && ++ sourceIndex < map.sources.length && ++ sourceLine >= 0 && ++ sourceLine < maxOriginalLine && ++ sourceColumn >= 0); ++ }); ++ if (filteredLine.length !== line.length) { ++ didChange = true; ++ } ++ return filteredLine; ++ }); ++ if (!didChange) { ++ return map; ++ } ++ return { ++ ...map, ++ mappings: loadSourceMapCodec().encode(filtered), ++ }; ++} ++function sanitizeSourceMapsForComposition(maps) { ++ let sanitized = maps; ++ for (let index = 1; index < maps.length; index++) { ++ const maxOriginalLine = getGeneratedLineCount(sanitized[index - 1]); ++ const next = dropInvalidOriginalSegments(sanitized[index], maxOriginalLine); ++ if (next !== sanitized[index]) { ++ if (sanitized === maps) { ++ sanitized = maps.slice(); ++ } ++ sanitized[index] = next; ++ } ++ } ++ return sanitized; ++} + // `maps[0]` is the original-most transform; `maps[maps.length - 1]` is + // the most recent. Built on `@jridgewell/remapping` instead of mozilla's + // `SourceMapConsumer`-based composer. +@@ -226,7 +292,7 @@ function composeSourceMaps(maps) { + return { ...map, ignoreList: map.x_google_ignoreList }; + }); + // Metro convention is original-first; remapping is most-recent first. +- const reversed = normalized.slice().reverse(); ++ const reversed = sanitizeSourceMapsForComposition(normalized).slice().reverse(); + const composed = loadRemapping()(reversed, () => null); + // Re-emit as a plain object — remapping returns a `SourceMap` class + // instance, which doesn't round-trip JSON cleanly. From 9c128b0ff03b9dc815d4a6de4189ed5c0476dcd0 Mon Sep 17 00:00:00 2001 From: Yash Singh Date: Tue, 2 Jun 2026 13:20:08 -0500 Subject: [PATCH 05/13] pls work --- apps/mobile/app.config.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/apps/mobile/app.config.ts b/apps/mobile/app.config.ts index 198dcf23b97..378ca1964a7 100644 --- a/apps/mobile/app.config.ts +++ b/apps/mobile/app.config.ts @@ -53,6 +53,7 @@ const variant = VARIANT_CONFIG[APP_VARIANT]; const config: ExpoConfig = { name: variant.appName, slug: "t3-code", + platforms: ["ios", "android"], scheme: variant.scheme, version: "0.1.0", runtimeVersion: { From 771b288b7b0da4f9cbd1bec94212437446e05957 Mon Sep 17 00:00:00 2001 From: Yash Singh Date: Tue, 2 Jun 2026 13:43:43 -0500 Subject: [PATCH 06/13] remove author check --- .github/workflows/mobile-eas-preview.yml | 10 ---------- 1 file changed, 10 deletions(-) diff --git a/.github/workflows/mobile-eas-preview.yml b/.github/workflows/mobile-eas-preview.yml index 076d20ca389..14f28497cd5 100644 --- a/.github/workflows/mobile-eas-preview.yml +++ b/.github/workflows/mobile-eas-preview.yml @@ -8,9 +8,6 @@ on: jobs: preview: name: EAS Preview - if: | - github.event.pull_request.user.login == 'Yash-Singh1' || - github.event.pull_request.user.login == 'juliusmarminge' runs-on: blacksmith-8vcpu-ubuntu-2404 permissions: contents: read @@ -20,13 +17,6 @@ jobs: NODE_OPTIONS: --max-old-space-size=8192 MOBILE_VERSION_POLICY: fingerprint steps: - - name: Check for EXPO_TOKEN - run: | - if [ -z "${{ secrets.EXPO_TOKEN }}" ]; then - echo "You must provide an EXPO_TOKEN secret linked to this project's Expo account in this repo's secrets. Learn more: https://docs.expo.dev/eas-update/github-actions" - exit 1 - fi - - name: Checkout uses: actions/checkout@v6 with: From f986a9d3a2b09119ff461dcd299f5c29a058ce41 Mon Sep 17 00:00:00 2001 From: Yash Singh Date: Tue, 2 Jun 2026 14:23:45 -0500 Subject: [PATCH 07/13] skip if unset --- .github/workflows/mobile-eas-preview.yml | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/.github/workflows/mobile-eas-preview.yml b/.github/workflows/mobile-eas-preview.yml index 14f28497cd5..53589549cb7 100644 --- a/.github/workflows/mobile-eas-preview.yml +++ b/.github/workflows/mobile-eas-preview.yml @@ -17,22 +17,38 @@ jobs: NODE_OPTIONS: --max-old-space-size=8192 MOBILE_VERSION_POLICY: fingerprint steps: + - id: expo-token + name: Check for EXPO_TOKEN + env: + EXPO_TOKEN: ${{ secrets.EXPO_TOKEN }} + run: | + if [ -n "$EXPO_TOKEN" ]; then + echo "present=true" >> "$GITHUB_OUTPUT" + else + echo "present=false" >> "$GITHUB_OUTPUT" + echo "EXPO_TOKEN is not available; skipping EAS preview." + fi + - name: Checkout + if: steps.expo-token.outputs.present == 'true' uses: actions/checkout@v6 with: fetch-depth: 0 - name: Setup Bun + if: steps.expo-token.outputs.present == 'true' uses: oven-sh/setup-bun@v2 with: bun-version-file: package.json - name: Setup Node + if: steps.expo-token.outputs.present == 'true' uses: actions/setup-node@v6 with: node-version-file: package.json - name: Cache Bun and Turbo + if: steps.expo-token.outputs.present == 'true' uses: actions/cache@v5 with: path: | @@ -43,9 +59,11 @@ jobs: ${{ runner.os }}-bun-${{ hashFiles('bun.lock') }}- - name: Install dependencies + if: steps.expo-token.outputs.present == 'true' run: bun install --frozen-lockfile - name: Setup EAS + if: steps.expo-token.outputs.present == 'true' uses: expo/expo-github-action@v8 with: eas-version: latest @@ -53,10 +71,12 @@ jobs: packager: bun - name: Pull preview environment variables + if: steps.expo-token.outputs.present == 'true' working-directory: apps/mobile run: eas env:pull preview --non-interactive - name: Deploy with fingerprint check + if: steps.expo-token.outputs.present == 'true' uses: expo/expo-github-action/continuous-deploy-fingerprint@main with: profile: preview:dev From d4db2dd90a772c19768338d766eff9a0c08c7c82 Mon Sep 17 00:00:00 2001 From: Yash Singh Date: Tue, 2 Jun 2026 17:30:06 -0500 Subject: [PATCH 08/13] rm from path --- .github/workflows/mobile-eas-preview.yml | 2 -- apps/mobile/README.md | 2 +- 2 files changed, 1 insertion(+), 3 deletions(-) diff --git a/.github/workflows/mobile-eas-preview.yml b/.github/workflows/mobile-eas-preview.yml index 53589549cb7..7717b39b039 100644 --- a/.github/workflows/mobile-eas-preview.yml +++ b/.github/workflows/mobile-eas-preview.yml @@ -2,8 +2,6 @@ name: Mobile EAS Preview on: pull_request: - paths: - - "apps/mobile/**" jobs: preview: diff --git a/apps/mobile/README.md b/apps/mobile/README.md index 09edb857c3c..87e144f1735 100644 --- a/apps/mobile/README.md +++ b/apps/mobile/README.md @@ -61,7 +61,7 @@ The native lint task runs SwiftLint for Swift plus ktlint and detekt for Kotlin. ## EAS Builds -Pull requests that touch `apps/mobile` run a GitHub Actions preview workflow. CI uses Expo fingerprinting with the `preview:dev` profile to reuse an existing compatible build when possible, or start a new internal EAS build when native runtime inputs change. Production and default local builds continue to use the `appVersion` runtime policy. +CI uses Expo fingerprinting with the `preview:dev` profile to reuse an existing compatible build when possible, or start a new internal EAS build when native runtime inputs change. Production and default local builds continue to use the `appVersion` runtime policy. Create a PR preview dev-client build manually: From 2234f7a8926db0bcd40f05199dfb210066452718 Mon Sep 17 00:00:00 2001 From: Julius Marminge Date: Wed, 3 Jun 2026 19:22:43 -0700 Subject: [PATCH 09/13] chore: use pnpm for EAS preview workflow --- .github/workflows/mobile-eas-preview.yml | 61 +++++++++++++----------- apps/mobile/package.json | 1 + pnpm-lock.yaml | 29 +++++++++-- 3 files changed, 58 insertions(+), 33 deletions(-) diff --git a/.github/workflows/mobile-eas-preview.yml b/.github/workflows/mobile-eas-preview.yml index 7717b39b039..da4a236968d 100644 --- a/.github/workflows/mobile-eas-preview.yml +++ b/.github/workflows/mobile-eas-preview.yml @@ -33,49 +33,45 @@ jobs: with: fetch-depth: 0 - - name: Setup Bun + - name: Setup Vite+ if: steps.expo-token.outputs.present == 'true' - uses: oven-sh/setup-bun@v2 - with: - bun-version-file: package.json - - - name: Setup Node - if: steps.expo-token.outputs.present == 'true' - uses: actions/setup-node@v6 + uses: voidzero-dev/setup-vp@v1 with: node-version-file: package.json + cache: true + run-install: true - - name: Cache Bun and Turbo + - name: Install EAS CLI if: steps.expo-token.outputs.present == 'true' - uses: actions/cache@v5 - with: - path: | - ~/.bun/install/cache - .turbo - key: ${{ runner.os }}-bun-${{ hashFiles('bun.lock') }}-${{ hashFiles('turbo.json') }} - restore-keys: | - ${{ runner.os }}-bun-${{ hashFiles('bun.lock') }}- - - - name: Install dependencies - if: steps.expo-token.outputs.present == 'true' - run: bun install --frozen-lockfile - - - name: Setup EAS - if: steps.expo-token.outputs.present == 'true' - uses: expo/expo-github-action@v8 - with: - eas-version: latest - token: ${{ secrets.EXPO_TOKEN }} - packager: bun + run: | + eas_cli_dir="$RUNNER_TEMP/eas-cli" + mkdir -p "$eas_cli_dir" + node --print "JSON.stringify({ packageManager: require('./package.json').packageManager }, null, 2)" > "$eas_cli_dir/package.json" + ( + cd "$eas_cli_dir" + vp add eas-cli@latest --allow-build dtrace-provider + ) + echo "$eas_cli_dir/node_modules/.bin" >> "$GITHUB_PATH" + "$eas_cli_dir/node_modules/.bin/eas" --version + pnpm_version="$(node --print "require('./package.json').packageManager.split('@').pop()")" + vp_pnpm_bin="$HOME/.vite-plus/package_manager/pnpm/$pnpm_version/pnpm/bin" + echo "$vp_pnpm_bin" >> "$GITHUB_PATH" + "$vp_pnpm_bin/pnpm" --version - name: Pull preview environment variables if: steps.expo-token.outputs.present == 'true' working-directory: apps/mobile + env: + EXPO_TOKEN: ${{ secrets.EXPO_TOKEN }} run: eas env:pull preview --non-interactive - name: Deploy with fingerprint check + id: deploy if: steps.expo-token.outputs.present == 'true' uses: expo/expo-github-action/continuous-deploy-fingerprint@main + continue-on-error: true + env: + EXPO_TOKEN: ${{ secrets.EXPO_TOKEN }} with: profile: preview:dev branch: pr-${{ github.event.pull_request.number }} @@ -83,3 +79,10 @@ jobs: environment: preview working-directory: apps/mobile github-token: ${{ secrets.GITHUB_TOKEN }} + + - name: Deploy update without bytecode + if: steps.deploy.outcome == 'failure' + working-directory: apps/mobile + env: + EXPO_TOKEN: ${{ secrets.EXPO_TOKEN }} + run: eas update --no-bytecode --auto --branch pr-${{ github.event.pull_request.number }} --platform all --non-interactive --json --environment preview diff --git a/apps/mobile/package.json b/apps/mobile/package.json index 6f48f529c87..3185525347a 100644 --- a/apps/mobile/package.json +++ b/apps/mobile/package.json @@ -96,6 +96,7 @@ "uniwind": "^1.6.2" }, "devDependencies": { + "@expo/cli": "56.1.13", "@types/react": "~19.2.0", "babel-preset-expo": "~56.0.0", "tailwindcss": "^4.0.0", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index e4bab3509ea..6c8211be620 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -63,6 +63,9 @@ importers: .: devDependencies: + '@babel/plugin-transform-react-jsx': + specifier: 7.28.6 + version: 7.28.6(@babel/core@7.29.7) '@effect/tsgo': specifier: 'catalog:' version: 0.11.4 @@ -324,6 +327,9 @@ importers: specifier: ^1.6.2 version: 1.7.0(react-native@0.85.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.16)(react@19.2.3))(react@19.2.3)(tailwindcss@4.3.0) devDependencies: + '@expo/cli': + specifier: 56.1.13 + version: 56.1.13(@expo/dom-webview@56.0.5)(@expo/metro-runtime@56.0.13)(expo-constants@56.0.16)(expo-font@56.0.5)(expo-router@56.2.8)(expo@56.0.8)(react-dom@19.2.3(react@19.2.3))(react-native@0.85.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.16)(react@19.2.3))(react@19.2.3)(typescript@6.0.3) '@types/react': specifier: ~19.2.0 version: 19.2.16 @@ -1223,6 +1229,12 @@ packages: peerDependencies: '@babel/core': ^7.0.0-0 + '@babel/plugin-transform-react-jsx@7.28.6': + resolution: {integrity: sha512-61bxqhiRfAACulXSLd/GxqmAedUSrRZIu/cbaT18T1CetkTmtDN15it7i80ru4DVqRK1WMxQhXs+Lf9kajm5Ow==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + '@babel/plugin-transform-react-jsx@7.29.7': resolution: {integrity: sha512-WsZulLVBUHXVj2cUcPVx6UE21TpalB6bHbSFErKT0Ib++ax24jjXe73FqlWvdylFOjiuPHYi6VCcgRad1ItN+A==} engines: {node: '>=6.9.0'} @@ -8196,6 +8208,17 @@ snapshots: '@babel/core': 7.29.7 '@babel/helper-plugin-utils': 7.29.7 + '@babel/plugin-transform-react-jsx@7.28.6(@babel/core@7.29.7)': + dependencies: + '@babel/core': 7.29.7 + '@babel/helper-annotate-as-pure': 7.29.7 + '@babel/helper-module-imports': 7.29.7 + '@babel/helper-plugin-utils': 7.29.7 + '@babel/plugin-syntax-jsx': 7.29.7(@babel/core@7.29.7) + '@babel/types': 7.29.7 + transitivePeerDependencies: + - supports-color + '@babel/plugin-transform-react-jsx@7.29.7(@babel/core@7.29.7)': dependencies: '@babel/core': 7.29.7 @@ -9831,7 +9854,7 @@ snapshots: '@babel/plugin-transform-private-methods': 7.29.7(@babel/core@7.29.7) '@babel/plugin-transform-private-property-in-object': 7.29.7(@babel/core@7.29.7) '@babel/plugin-transform-react-display-name': 7.29.7(@babel/core@7.29.7) - '@babel/plugin-transform-react-jsx': 7.29.7(@babel/core@7.29.7) + '@babel/plugin-transform-react-jsx': 7.28.6(@babel/core@7.29.7) '@babel/plugin-transform-react-jsx-self': 7.29.7(@babel/core@7.29.7) '@babel/plugin-transform-react-jsx-source': 7.29.7(@babel/core@7.29.7) '@babel/plugin-transform-regenerator': 7.29.7(@babel/core@7.29.7) @@ -9921,9 +9944,7 @@ snapshots: metro-runtime: 0.84.4 transitivePeerDependencies: - '@babel/core' - - bufferutil - supports-color - - utf-8-validate '@react-native/normalize-colors@0.85.3': {} @@ -11092,7 +11113,7 @@ snapshots: '@babel/plugin-transform-private-methods': 7.29.7(@babel/core@7.29.7) '@babel/plugin-transform-private-property-in-object': 7.29.7(@babel/core@7.29.7) '@babel/plugin-transform-react-display-name': 7.29.7(@babel/core@7.29.7) - '@babel/plugin-transform-react-jsx': 7.29.7(@babel/core@7.29.7) + '@babel/plugin-transform-react-jsx': 7.28.6(@babel/core@7.29.7) '@babel/plugin-transform-react-jsx-development': 7.29.7(@babel/core@7.29.7) '@babel/plugin-transform-react-pure-annotations': 7.29.7(@babel/core@7.29.7) '@babel/plugin-transform-runtime': 7.29.7(@babel/core@7.29.7) From d122aae5c1afa3f2d24b8413f9358d6d6ea4de6b Mon Sep 17 00:00:00 2001 From: Yash Singh Date: Wed, 3 Jun 2026 22:38:19 -0500 Subject: [PATCH 10/13] keep patch for pnpm --- pnpm-lock.yaml | 9 ++++++--- pnpm-workspace.yaml | 1 + 2 files changed, 7 insertions(+), 3 deletions(-) diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 6c8211be620..faed984c792 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -49,6 +49,9 @@ overrides: packageExtensionsChecksum: sha256-MDpMSm2Rk8Y7FDIbaAgFkT45PZBPV7JBzjTAft+noEM= patchedDependencies: + '@expo/metro-config@56.0.13': + hash: 8cb08b5bb7051ed9d2dbe46a2c293c5a1e17f1bd6ddf30de27909e18c921ff46 + path: patches/@expo%2Fmetro-config@56.0.13.patch '@pierre/diffs@1.1.20': hash: e4e35ba95100de3708f900e0d9ea62bca732b1e4486024b5055f48cd128dd9e0 path: patches/@pierre%2Fdiffs@1.1.20.patch @@ -8630,7 +8633,7 @@ snapshots: '@expo/json-file': 10.2.0 '@expo/log-box': 56.0.12(@expo/dom-webview@56.0.5)(expo@56.0.8)(react-native@0.85.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.16)(react@19.2.3))(react@19.2.3) '@expo/metro': 56.0.0 - '@expo/metro-config': 56.0.13(expo@56.0.8)(typescript@6.0.3) + '@expo/metro-config': 56.0.13(patch_hash=8cb08b5bb7051ed9d2dbe46a2c293c5a1e17f1bd6ddf30de27909e18c921ff46)(expo@56.0.8)(typescript@6.0.3) '@expo/metro-file-map': 56.0.3 '@expo/osascript': 2.6.0 '@expo/package-manager': 1.12.1 @@ -8823,7 +8826,7 @@ snapshots: react-native: 0.85.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.16)(react@19.2.3) stacktrace-parser: 0.1.11 - '@expo/metro-config@56.0.13(expo@56.0.8)(typescript@6.0.3)': + '@expo/metro-config@56.0.13(patch_hash=8cb08b5bb7051ed9d2dbe46a2c293c5a1e17f1bd6ddf30de27909e18c921ff46)(expo@56.0.8)(typescript@6.0.3)': dependencies: '@babel/code-frame': 7.29.7 '@babel/core': 7.29.7 @@ -11980,7 +11983,7 @@ snapshots: '@expo/local-build-cache-provider': 56.0.8(typescript@6.0.3) '@expo/log-box': 56.0.12(@expo/dom-webview@56.0.5)(expo@56.0.8)(react-native@0.85.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.16)(react@19.2.3))(react@19.2.3) '@expo/metro': 56.0.0 - '@expo/metro-config': 56.0.13(expo@56.0.8)(typescript@6.0.3) + '@expo/metro-config': 56.0.13(patch_hash=8cb08b5bb7051ed9d2dbe46a2c293c5a1e17f1bd6ddf30de27909e18c921ff46)(expo@56.0.8)(typescript@6.0.3) '@ungap/structured-clone': 1.3.1 babel-preset-expo: 56.0.14(@babel/core@7.29.7)(@babel/runtime@7.29.7)(expo@56.0.8)(react-refresh@0.14.2) expo-asset: 56.0.15(expo@56.0.8)(react-native@0.85.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.16)(react@19.2.3))(react@19.2.3)(typescript@6.0.3) diff --git a/pnpm-workspace.yaml b/pnpm-workspace.yaml index 0db3d4d8293..0a680160864 100644 --- a/pnpm-workspace.yaml +++ b/pnpm-workspace.yaml @@ -57,6 +57,7 @@ packageExtensions: dependencies: "@vitest/runner": "catalog:" patchedDependencies: + "@expo/metro-config@56.0.13": patches/@expo%2Fmetro-config@56.0.13.patch "@pierre/diffs@1.1.20": patches/@pierre%2Fdiffs@1.1.20.patch effect@4.0.0-beta.73: patches/effect@4.0.0-beta.73.patch react-native-nitro-modules@0.35.9: patches/react-native-nitro-modules@0.35.9.patch From d7a2294ba6df0f406bf323d141dec0e43a5855e6 Mon Sep 17 00:00:00 2001 From: Julius Marminge Date: Wed, 3 Jun 2026 20:51:46 -0700 Subject: [PATCH 11/13] chore: simplify EAS preview setup --- .github/workflows/mobile-eas-preview.yml | 28 ++++++++---------------- apps/mobile/package.json | 1 - pnpm-lock.yaml | 5 ++--- 3 files changed, 11 insertions(+), 23 deletions(-) diff --git a/.github/workflows/mobile-eas-preview.yml b/.github/workflows/mobile-eas-preview.yml index da4a236968d..77d3bff06e5 100644 --- a/.github/workflows/mobile-eas-preview.yml +++ b/.github/workflows/mobile-eas-preview.yml @@ -41,23 +41,22 @@ jobs: cache: true run-install: true - - name: Install EAS CLI + - name: Expose pnpm if: steps.expo-token.outputs.present == 'true' run: | - eas_cli_dir="$RUNNER_TEMP/eas-cli" - mkdir -p "$eas_cli_dir" - node --print "JSON.stringify({ packageManager: require('./package.json').packageManager }, null, 2)" > "$eas_cli_dir/package.json" - ( - cd "$eas_cli_dir" - vp add eas-cli@latest --allow-build dtrace-provider - ) - echo "$eas_cli_dir/node_modules/.bin" >> "$GITHUB_PATH" - "$eas_cli_dir/node_modules/.bin/eas" --version pnpm_version="$(node --print "require('./package.json').packageManager.split('@').pop()")" vp_pnpm_bin="$HOME/.vite-plus/package_manager/pnpm/$pnpm_version/pnpm/bin" echo "$vp_pnpm_bin" >> "$GITHUB_PATH" "$vp_pnpm_bin/pnpm" --version + - name: Setup EAS + if: steps.expo-token.outputs.present == 'true' + uses: expo/expo-github-action@v8 + with: + eas-version: latest + token: ${{ secrets.EXPO_TOKEN }} + packager: pnpm + - name: Pull preview environment variables if: steps.expo-token.outputs.present == 'true' working-directory: apps/mobile @@ -66,10 +65,8 @@ jobs: run: eas env:pull preview --non-interactive - name: Deploy with fingerprint check - id: deploy if: steps.expo-token.outputs.present == 'true' uses: expo/expo-github-action/continuous-deploy-fingerprint@main - continue-on-error: true env: EXPO_TOKEN: ${{ secrets.EXPO_TOKEN }} with: @@ -79,10 +76,3 @@ jobs: environment: preview working-directory: apps/mobile github-token: ${{ secrets.GITHUB_TOKEN }} - - - name: Deploy update without bytecode - if: steps.deploy.outcome == 'failure' - working-directory: apps/mobile - env: - EXPO_TOKEN: ${{ secrets.EXPO_TOKEN }} - run: eas update --no-bytecode --auto --branch pr-${{ github.event.pull_request.number }} --platform all --non-interactive --json --environment preview diff --git a/apps/mobile/package.json b/apps/mobile/package.json index 3185525347a..6f48f529c87 100644 --- a/apps/mobile/package.json +++ b/apps/mobile/package.json @@ -96,7 +96,6 @@ "uniwind": "^1.6.2" }, "devDependencies": { - "@expo/cli": "56.1.13", "@types/react": "~19.2.0", "babel-preset-expo": "~56.0.0", "tailwindcss": "^4.0.0", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index faed984c792..bbdbeb076ed 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -330,9 +330,6 @@ importers: specifier: ^1.6.2 version: 1.7.0(react-native@0.85.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.16)(react@19.2.3))(react@19.2.3)(tailwindcss@4.3.0) devDependencies: - '@expo/cli': - specifier: 56.1.13 - version: 56.1.13(@expo/dom-webview@56.0.5)(@expo/metro-runtime@56.0.13)(expo-constants@56.0.16)(expo-font@56.0.5)(expo-router@56.2.8)(expo@56.0.8)(react-dom@19.2.3(react@19.2.3))(react-native@0.85.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.16)(react@19.2.3))(react@19.2.3)(typescript@6.0.3) '@types/react': specifier: ~19.2.0 version: 19.2.16 @@ -9947,7 +9944,9 @@ snapshots: metro-runtime: 0.84.4 transitivePeerDependencies: - '@babel/core' + - bufferutil - supports-color + - utf-8-validate '@react-native/normalize-colors@0.85.3': {} From d8763875b57bbb906fe940edb0a64b1f6ab0067b Mon Sep 17 00:00:00 2001 From: Julius Marminge Date: Wed, 3 Jun 2026 22:01:33 -0700 Subject: [PATCH 12/13] chore: use vp for EAS setup --- .github/workflows/mobile-eas-preview.yml | 10 +--------- 1 file changed, 1 insertion(+), 9 deletions(-) diff --git a/.github/workflows/mobile-eas-preview.yml b/.github/workflows/mobile-eas-preview.yml index 77d3bff06e5..67ec14c08f7 100644 --- a/.github/workflows/mobile-eas-preview.yml +++ b/.github/workflows/mobile-eas-preview.yml @@ -41,21 +41,13 @@ jobs: cache: true run-install: true - - name: Expose pnpm - if: steps.expo-token.outputs.present == 'true' - run: | - pnpm_version="$(node --print "require('./package.json').packageManager.split('@').pop()")" - vp_pnpm_bin="$HOME/.vite-plus/package_manager/pnpm/$pnpm_version/pnpm/bin" - echo "$vp_pnpm_bin" >> "$GITHUB_PATH" - "$vp_pnpm_bin/pnpm" --version - - name: Setup EAS if: steps.expo-token.outputs.present == 'true' uses: expo/expo-github-action@v8 with: eas-version: latest token: ${{ secrets.EXPO_TOKEN }} - packager: pnpm + packager: vp - name: Pull preview environment variables if: steps.expo-token.outputs.present == 'true' From f313c1feec8fb1d6010fdd7cc98d7313bfd2eb45 Mon Sep 17 00:00:00 2001 From: Julius Marminge Date: Wed, 3 Jun 2026 22:03:07 -0700 Subject: [PATCH 13/13] Revert "chore: use vp for EAS setup" This reverts commit d8763875b57bbb906fe940edb0a64b1f6ab0067b. --- .github/workflows/mobile-eas-preview.yml | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/.github/workflows/mobile-eas-preview.yml b/.github/workflows/mobile-eas-preview.yml index 67ec14c08f7..77d3bff06e5 100644 --- a/.github/workflows/mobile-eas-preview.yml +++ b/.github/workflows/mobile-eas-preview.yml @@ -41,13 +41,21 @@ jobs: cache: true run-install: true + - name: Expose pnpm + if: steps.expo-token.outputs.present == 'true' + run: | + pnpm_version="$(node --print "require('./package.json').packageManager.split('@').pop()")" + vp_pnpm_bin="$HOME/.vite-plus/package_manager/pnpm/$pnpm_version/pnpm/bin" + echo "$vp_pnpm_bin" >> "$GITHUB_PATH" + "$vp_pnpm_bin/pnpm" --version + - name: Setup EAS if: steps.expo-token.outputs.present == 'true' uses: expo/expo-github-action@v8 with: eas-version: latest token: ${{ secrets.EXPO_TOKEN }} - packager: vp + packager: pnpm - name: Pull preview environment variables if: steps.expo-token.outputs.present == 'true'