diff --git a/.github/workflows/build-android.yml b/.github/workflows/build-android.yml index 72edf0e..1b67490 100644 --- a/.github/workflows/build-android.yml +++ b/.github/workflows/build-android.yml @@ -8,18 +8,18 @@ on: jobs: build: - runs-on: ubuntu-latest + runs-on: ubuntu-24.04 steps: - - uses: actions/checkout@v6 + - uses: actions/checkout@v6.1.0 - - uses: actions/setup-java@v5 + - uses: actions/setup-java@v5.7.0 with: - distribution: "temurin" - java-version: "21" + distribution: temurin + java-version: 21.0.11 - - uses: oven-sh/setup-bun@v2 + - uses: oven-sh/setup-bun@v2.2.0 with: - bun-version: latest + bun-version: 1.3.14 - name: Install dependencies run: bun ci diff --git a/.github/workflows/build-ios.yml b/.github/workflows/build-ios.yml index 4b65aa0..464fe71 100644 --- a/.github/workflows/build-ios.yml +++ b/.github/workflows/build-ios.yml @@ -8,13 +8,19 @@ on: jobs: build: - runs-on: macos-latest + runs-on: macos-26 steps: - - uses: actions/checkout@v6 + - uses: actions/checkout@v6.1.0 - - uses: oven-sh/setup-bun@v2 + - uses: oven-sh/setup-bun@v2.2.0 with: - bun-version: latest + bun-version: 1.3.14 + + - name: Select Xcode + run: sudo xcode-select --switch /Applications/Xcode_26.6.app + + - name: Pin CocoaPods + run: gem install cocoapods -v 1.17.0 --no-document - name: Install dependencies run: bun ci diff --git a/.github/workflows/lint.yml b/.github/workflows/lint.yml index d1f6177..988557d 100644 --- a/.github/workflows/lint.yml +++ b/.github/workflows/lint.yml @@ -6,13 +6,13 @@ on: jobs: lint: - runs-on: ubuntu-latest + runs-on: ubuntu-24.04 steps: - - uses: actions/checkout@v6 + - uses: actions/checkout@v6.1.0 - - uses: oven-sh/setup-bun@v2 + - uses: oven-sh/setup-bun@v2.2.0 with: - bun-version: latest + bun-version: 1.3.14 - name: Install dependencies run: bun ci diff --git a/.github/workflows/test-android.yml b/.github/workflows/test-android.yml index 8895959..51577c3 100644 --- a/.github/workflows/test-android.yml +++ b/.github/workflows/test-android.yml @@ -6,18 +6,18 @@ on: jobs: build: - runs-on: ubuntu-latest + runs-on: ubuntu-24.04 steps: - - uses: actions/checkout@v6 + - uses: actions/checkout@v6.1.0 - - uses: actions/setup-java@v5 + - uses: actions/setup-java@v5.7.0 with: - distribution: "temurin" - java-version: "21" + distribution: temurin + java-version: 21.0.11 - - uses: oven-sh/setup-bun@v2 + - uses: oven-sh/setup-bun@v2.2.0 with: - bun-version: latest + bun-version: 1.3.14 - name: Install dependencies run: bun ci diff --git a/.github/workflows/test-ios.yml b/.github/workflows/test-ios.yml index d40b286..a6f3de1 100644 --- a/.github/workflows/test-ios.yml +++ b/.github/workflows/test-ios.yml @@ -6,22 +6,34 @@ on: jobs: test: - runs-on: macos-latest + runs-on: macos-26 timeout-minutes: 60 steps: - - uses: actions/checkout@v6 + - uses: actions/checkout@v6.1.0 - - uses: oven-sh/setup-bun@v2 + - uses: actions/setup-java@v5.7.0 with: - bun-version: latest + distribution: temurin + java-version: 21.0.11 - - name: Install dependencies - run: bun ci + - uses: oven-sh/setup-bun@v2.2.0 + with: + bun-version: 1.3.14 + + - name: Select Xcode + run: sudo xcode-select --switch /Applications/Xcode_26.6.app + + - name: Pin CocoaPods + run: gem install cocoapods -v 1.17.0 --no-document - name: Install Maestro run: | - curl -fsSL "https://get.maestro.mobile.dev" | bash - echo "$HOME/.maestro/bin" >> $GITHUB_PATH + curl -fsSL https://github.com/mobile-dev-inc/maestro/releases/download/cli-2.8.0/maestro.zip -o "$RUNNER_TEMP/maestro.zip" + unzip -q "$RUNNER_TEMP/maestro.zip" -d "$HOME" + echo "$HOME/maestro/bin" >> "$GITHUB_PATH" + + - name: Install dependencies + run: bun ci - name: Build iOS Simulator App env: @@ -33,6 +45,8 @@ jobs: - uses: futureware-tech/simulator-action@v4 with: model: "iPhone 17 Pro" + os: "iOS" + os_version: "26.5" wait_for_boot: true - name: Install iOS App @@ -54,7 +68,7 @@ jobs: - name: Upload Debug Information if: failure() - uses: actions/upload-artifact@v6 + uses: actions/upload-artifact@v6.0.0 with: name: debug-info path: ./debug-info/ diff --git a/.github/workflows/test-web.yml b/.github/workflows/test-web.yml index 72de45a..aaad112 100644 --- a/.github/workflows/test-web.yml +++ b/.github/workflows/test-web.yml @@ -6,14 +6,14 @@ on: jobs: test: - runs-on: ubuntu-latest + runs-on: ubuntu-24.04 timeout-minutes: 60 steps: - - uses: actions/checkout@v6 + - uses: actions/checkout@v6.1.0 - - uses: oven-sh/setup-bun@v2 + - uses: oven-sh/setup-bun@v2.2.0 with: - bun-version: latest + bun-version: 1.3.14 - name: Install dependencies run: bun ci @@ -24,7 +24,7 @@ jobs: - name: Run Playwright tests run: bun run --filter @scheduli/web test - - uses: actions/upload-artifact@v6 + - uses: actions/upload-artifact@v6.0.0 if: failure() with: name: playwright-report diff --git a/.github/workflows/typecheck.yml b/.github/workflows/typecheck.yml index 6725922..e347b69 100644 --- a/.github/workflows/typecheck.yml +++ b/.github/workflows/typecheck.yml @@ -6,13 +6,13 @@ on: jobs: typecheck: - runs-on: ubuntu-latest + runs-on: ubuntu-24.04 steps: - - uses: actions/checkout@v6 + - uses: actions/checkout@v6.1.0 - - uses: oven-sh/setup-bun@v2 + - uses: oven-sh/setup-bun@v2.2.0 with: - bun-version: latest + bun-version: 1.3.14 - name: Install dependencies run: bun ci diff --git a/apps/mobile/eas.json b/apps/mobile/eas.json index faf00aa..675fbfd 100644 --- a/apps/mobile/eas.json +++ b/apps/mobile/eas.json @@ -1,6 +1,6 @@ { "cli": { - "version": ">= 5.2.0", + "version": "22.0.0", "promptToConfigurePushNotifications": false, "appVersionSource": "remote" }, diff --git a/apps/mobile/package.json b/apps/mobile/package.json index b6e511e..7ae56c0 100644 --- a/apps/mobile/package.json +++ b/apps/mobile/package.json @@ -4,77 +4,77 @@ "private": true, "main": "expo-router/entry", "scripts": { - "build:ios": "bunx eas-cli build --profile production --local --platform ios --non-interactive --output dist/app.ipa", - "submit:ios": "bunx eas-cli submit --platform ios --path dist/app.ipa --non-interactive", - "build:android": "bunx eas-cli build --profile production --local --platform android --non-interactive --output dist/app.aab", - "submit:android": "bunx eas-cli submit --platform android --path dist/app.aab --non-interactive", + "build:ios": "bunx eas-cli@22.0.0 build --profile production --local --platform ios --non-interactive --output dist/app.ipa", + "submit:ios": "bunx eas-cli@22.0.0 submit --platform ios --path dist/app.ipa --non-interactive", + "build:android": "bunx eas-cli@22.0.0 build --profile production --local --platform android --non-interactive --output dist/app.aab", + "submit:android": "bunx eas-cli@22.0.0 submit --platform android --path dist/app.aab --non-interactive", "clean": "git clean -xdf .cache .expo .turbo android ios node_modules dist", "dev": "expo start", "android": "expo run:android", "ios": "expo run:ios", "test": "./scripts/maestro-test.sh", - "env:dev": "bunx eas-cli env:pull --environment development", - "build:ios:simulator": "bunx eas-cli build --platform ios --profile e2e-test --local --non-interactive --output dist/app.tar.gz && tar -xvf dist/app.tar.gz -C dist/", - "build:android:simulator": "bunx eas-cli build --platform android --profile e2e-test --local --non-interactive --output dist/app.apk", + "env:dev": "bunx eas-cli@22.0.0 env:pull --environment development", + "build:ios:simulator": "bunx eas-cli@22.0.0 build --platform ios --profile e2e-test --local --non-interactive --output dist/app.tar.gz && tar -xvf dist/app.tar.gz -C dist/", + "build:android:simulator": "bunx eas-cli@22.0.0 build --platform android --profile e2e-test --local --non-interactive --output dist/app.apk", "install:ios:simulator": "xcrun simctl install booted dist/Scheduli.app", "typecheck": "tsc --noEmit" }, "dependencies": { - "@bacons/apple-targets": "^3.0.5", - "@expo-google-fonts/poppins": "^0.4.1", - "@expo/config-plugins": "^54.0.4", - "@expo/metro-runtime": "~6.1.2", - "@fortawesome/fontawesome-svg-core": "^6.7.2", - "@fortawesome/free-solid-svg-icons": "^6.7.2", - "@fortawesome/react-native-fontawesome": "^0.3.2", - "@gorhom/bottom-sheet": "^5.2.6", - "@notifee/react-native": "^9.1.8", + "@bacons/apple-targets": "3.0.6", + "@expo-google-fonts/poppins": "0.4.1", + "@expo/config-plugins": "54.0.4", + "@expo/metro-runtime": "6.1.2", + "@fortawesome/fontawesome-svg-core": "6.7.2", + "@fortawesome/free-solid-svg-icons": "6.7.2", + "@fortawesome/react-native-fontawesome": "0.3.2", + "@gorhom/bottom-sheet": "5.2.8", + "@notifee/react-native": "9.1.8", "@react-native-community/datetimepicker": "8.4.4", "@react-native-picker/picker": "2.11.1", - "@rnrepo/expo-config-plugin": "^0.1.0-beta.0", + "@rnrepo/expo-config-plugin": "0.1.0-beta.1", "@scheduli/types": "workspace:*", - "babel-preset-expo": "~54.0.9", - "expo": "~54.0.30", - "expo-application": "~7.0.7", - "expo-constants": "~18.0.12", - "expo-dev-client": "~6.0.17", - "expo-device": "~8.0.9", - "expo-file-system": "~19.0.21", - "expo-font": "~14.0.9", - "expo-haptics": "~15.0.7", - "expo-linking": "~8.0.11", - "expo-localization": "~17.0.7", - "expo-modules-core": "^3.0.29", - "expo-router": "~6.0.21", - "expo-splash-screen": "~31.0.13", - "expo-status-bar": "~3.0.8", - "nativewind": "^2.0.11", - "posthog-react-native": "^4.10.4", - "posthog-react-native-session-replay": "^1.2.1", + "babel-preset-expo": "54.0.9", + "expo": "54.0.30", + "expo-application": "7.0.8", + "expo-constants": "18.0.12", + "expo-dev-client": "6.0.20", + "expo-device": "8.0.10", + "expo-file-system": "19.0.21", + "expo-font": "14.0.10", + "expo-haptics": "15.0.8", + "expo-linking": "8.0.11", + "expo-localization": "17.0.8", + "expo-modules-core": "3.0.29", + "expo-router": "6.0.21", + "expo-splash-screen": "31.0.13", + "expo-status-bar": "3.0.9", + "nativewind": "2.0.11", + "posthog-react-native": "4.16.2", + "posthog-react-native-session-replay": "1.2.3", "react": "catalog:", "react-dom": "catalog:", "react-native": "0.81.5", - "react-native-android-widget": "^0.17.2", - "react-native-gesture-handler": "~2.28.0", - "react-native-mmkv": "^3.3.3", - "react-native-modal-datetime-picker": "^18.0.0", - "react-native-paper": "^5.14.5", - "react-native-reanimated": "~4.1.3", + "react-native-android-widget": "0.17.2", + "react-native-gesture-handler": "2.28.0", + "react-native-mmkv": "3.3.3", + "react-native-modal-datetime-picker": "18.0.0", + "react-native-paper": "5.14.5", + "react-native-reanimated": "4.1.6", "react-native-safe-area-context": "5.6.2", "react-native-screens": "4.16.0", - "react-native-store-version": "^1.4.1", + "react-native-store-version": "1.4.1", "react-native-svg": "15.12.1", - "react-native-web": "~0.21.1", + "react-native-web": "0.21.2", "react-native-worklets": "0.5.1", - "typescript": "~5.9.3" + "typescript": "5.9.3" }, "devDependencies": { - "@babel/core": "^7.28.4", - "@babel/plugin-proposal-export-namespace-from": "^7.18.9", - "@types/node": "^25.0.8", + "@babel/core": "7.28.5", + "@babel/plugin-proposal-export-namespace-from": "7.18.9", + "@types/node": "25.0.8", "@types/react": "catalog:", "tailwindcss": "3.3.2", - "tsx": "^4.21.0" + "tsx": "4.21.0" }, "patchedDependencies": { "react-native-mmkv@3.3.3": "apps/mobile/patches/react-native-mmkv@3.3.3.patch" diff --git a/apps/mobile/plugins/withAddPodDepsToTargets.ts b/apps/mobile/plugins/withAddPodDepsToTargets.ts index b07965e..3e6a0d3 100644 --- a/apps/mobile/plugins/withAddPodDepsToTargets.ts +++ b/apps/mobile/plugins/withAddPodDepsToTargets.ts @@ -14,13 +14,17 @@ target "StatusWidget" do end `; +const PINNED_PODS = ` + pod "PostHog", "3.69.8" +`; + export const withAddPodDepsToTargets: ConfigPlugin = (config) => { return withDangerousMod(config, [ "ios", async (config) => { const file = path.join(config.modRequest.platformProjectRoot, "Podfile"); const contents = await fs.promises.readFile(file, "utf8"); - await fs.promises.writeFile(file, addPodDepsToTargets(contents), "utf8"); + await fs.promises.writeFile(file, pinPods(addPodDepsToTargets(contents)), "utf8"); return config; }, ]); @@ -36,3 +40,22 @@ function addPodDepsToTargets(src: string) { comment: "#", }).contents; } + +function pinPods(src: string) { + const result = mergeContents({ + tag: `with-pinned-pods`, + src, + newSrc: PINNED_PODS.replace(/\n$/, ""), + anchor: /use_expo_modules!/, + offset: 1, + comment: "#", + }); + + if (!result.didMerge) { + throw new Error( + "withAddPodDepsToTargets: could not find `use_expo_modules!` in the Podfile, so pinned pods were not applied.", + ); + } + + return result.contents; +} diff --git a/apps/web/package.json b/apps/web/package.json index a4443b6..9a28318 100644 --- a/apps/web/package.json +++ b/apps/web/package.json @@ -11,27 +11,27 @@ "typecheck": "tsc --noEmit" }, "dependencies": { - "@formkit/auto-animate": "^0.8.1", - "@fortawesome/fontawesome-svg-core": "^6.4.2", - "@fortawesome/free-brands-svg-icons": "^6.4.2", - "@fortawesome/free-solid-svg-icons": "^6.4.2", - "@fortawesome/react-fontawesome": "^0.2.0", - "@headlessui/react": "^1.7.17", - "@headlessui/tailwindcss": "^0.2.0", + "@formkit/auto-animate": "0.8.4", + "@fortawesome/fontawesome-svg-core": "6.7.2", + "@fortawesome/free-brands-svg-icons": "6.7.2", + "@fortawesome/free-solid-svg-icons": "6.7.2", + "@fortawesome/react-fontawesome": "0.2.6", + "@headlessui/react": "1.7.19", + "@headlessui/tailwindcss": "0.2.2", "@scheduli/types": "workspace:*", "next": "16.0.10", - "posthog-js": "^1.276.0", - "posthog-node": "^5.10.0", + "posthog-js": "1.309.1", + "posthog-node": "5.17.4", "react": "catalog:", "react-dom": "catalog:" }, "devDependencies": { - "@playwright/test": "^1.57.0", - "@tailwindcss/postcss": "^4", - "@types/node": "^20", + "@playwright/test": "1.57.0", + "@tailwindcss/postcss": "4.1.18", + "@types/node": "20.19.27", "@types/react": "catalog:", "@types/react-dom": "catalog:", - "tailwindcss": "^4", - "typescript": "^5" + "tailwindcss": "4.1.18", + "typescript": "5.9.3" } } diff --git a/bun.lock b/bun.lock index e2447f7..3be01ed 100644 --- a/bun.lock +++ b/bun.lock @@ -5,97 +5,97 @@ "": { "name": "scheduli", "devDependencies": { - "oxfmt": "^0.35.0", - "oxlint": "^1.50.0", - "turbo": "latest", + "oxfmt": "0.35.0", + "oxlint": "1.50.0", + "turbo": "2.7.1", }, }, "apps/mobile": { "name": "@scheduli/mobile", - "version": "1.9.8", + "version": "1.10.0", "dependencies": { - "@bacons/apple-targets": "^3.0.5", - "@expo-google-fonts/poppins": "^0.4.1", - "@expo/config-plugins": "^54.0.4", - "@expo/metro-runtime": "~6.1.2", - "@fortawesome/fontawesome-svg-core": "^6.7.2", - "@fortawesome/free-solid-svg-icons": "^6.7.2", - "@fortawesome/react-native-fontawesome": "^0.3.2", - "@gorhom/bottom-sheet": "^5.2.6", - "@notifee/react-native": "^9.1.8", + "@bacons/apple-targets": "3.0.6", + "@expo-google-fonts/poppins": "0.4.1", + "@expo/config-plugins": "54.0.4", + "@expo/metro-runtime": "6.1.2", + "@fortawesome/fontawesome-svg-core": "6.7.2", + "@fortawesome/free-solid-svg-icons": "6.7.2", + "@fortawesome/react-native-fontawesome": "0.3.2", + "@gorhom/bottom-sheet": "5.2.8", + "@notifee/react-native": "9.1.8", "@react-native-community/datetimepicker": "8.4.4", "@react-native-picker/picker": "2.11.1", - "@rnrepo/expo-config-plugin": "^0.1.0-beta.0", + "@rnrepo/expo-config-plugin": "0.1.0-beta.1", "@scheduli/types": "workspace:*", - "babel-preset-expo": "~54.0.9", - "expo": "~54.0.30", - "expo-application": "~7.0.7", - "expo-constants": "~18.0.12", - "expo-dev-client": "~6.0.17", - "expo-device": "~8.0.9", - "expo-file-system": "~19.0.21", - "expo-font": "~14.0.9", - "expo-haptics": "~15.0.7", - "expo-linking": "~8.0.11", - "expo-localization": "~17.0.7", - "expo-modules-core": "^3.0.29", - "expo-router": "~6.0.21", - "expo-splash-screen": "~31.0.13", - "expo-status-bar": "~3.0.8", - "nativewind": "^2.0.11", - "posthog-react-native": "^4.10.4", - "posthog-react-native-session-replay": "^1.2.1", + "babel-preset-expo": "54.0.9", + "expo": "54.0.30", + "expo-application": "7.0.8", + "expo-constants": "18.0.12", + "expo-dev-client": "6.0.20", + "expo-device": "8.0.10", + "expo-file-system": "19.0.21", + "expo-font": "14.0.10", + "expo-haptics": "15.0.8", + "expo-linking": "8.0.11", + "expo-localization": "17.0.8", + "expo-modules-core": "3.0.29", + "expo-router": "6.0.21", + "expo-splash-screen": "31.0.13", + "expo-status-bar": "3.0.9", + "nativewind": "2.0.11", + "posthog-react-native": "4.16.2", + "posthog-react-native-session-replay": "1.2.3", "react": "catalog:", "react-dom": "catalog:", "react-native": "0.81.5", - "react-native-android-widget": "^0.17.2", - "react-native-gesture-handler": "~2.28.0", - "react-native-mmkv": "^3.3.3", - "react-native-modal-datetime-picker": "^18.0.0", - "react-native-paper": "^5.14.5", - "react-native-reanimated": "~4.1.3", + "react-native-android-widget": "0.17.2", + "react-native-gesture-handler": "2.28.0", + "react-native-mmkv": "3.3.3", + "react-native-modal-datetime-picker": "18.0.0", + "react-native-paper": "5.14.5", + "react-native-reanimated": "4.1.6", "react-native-safe-area-context": "5.6.2", "react-native-screens": "4.16.0", - "react-native-store-version": "^1.4.1", + "react-native-store-version": "1.4.1", "react-native-svg": "15.12.1", - "react-native-web": "~0.21.1", + "react-native-web": "0.21.2", "react-native-worklets": "0.5.1", - "typescript": "~5.9.3", + "typescript": "5.9.3", }, "devDependencies": { - "@babel/core": "^7.28.4", - "@babel/plugin-proposal-export-namespace-from": "^7.18.9", - "@types/node": "^25.0.8", + "@babel/core": "7.28.5", + "@babel/plugin-proposal-export-namespace-from": "7.18.9", + "@types/node": "25.0.8", "@types/react": "catalog:", "tailwindcss": "3.3.2", - "tsx": "^4.21.0", + "tsx": "4.21.0", }, }, "apps/web": { "name": "@scheduli/web", "dependencies": { - "@formkit/auto-animate": "^0.8.1", - "@fortawesome/fontawesome-svg-core": "^6.4.2", - "@fortawesome/free-brands-svg-icons": "^6.4.2", - "@fortawesome/free-solid-svg-icons": "^6.4.2", - "@fortawesome/react-fontawesome": "^0.2.0", - "@headlessui/react": "^1.7.17", - "@headlessui/tailwindcss": "^0.2.0", + "@formkit/auto-animate": "0.8.4", + "@fortawesome/fontawesome-svg-core": "6.7.2", + "@fortawesome/free-brands-svg-icons": "6.7.2", + "@fortawesome/free-solid-svg-icons": "6.7.2", + "@fortawesome/react-fontawesome": "0.2.6", + "@headlessui/react": "1.7.19", + "@headlessui/tailwindcss": "0.2.2", "@scheduli/types": "workspace:*", "next": "16.0.10", - "posthog-js": "^1.276.0", - "posthog-node": "^5.10.0", + "posthog-js": "1.309.1", + "posthog-node": "5.17.4", "react": "catalog:", "react-dom": "catalog:", }, "devDependencies": { - "@playwright/test": "^1.57.0", - "@tailwindcss/postcss": "^4", - "@types/node": "^20", + "@playwright/test": "1.57.0", + "@tailwindcss/postcss": "4.1.18", + "@types/node": "20.19.27", "@types/react": "catalog:", "@types/react-dom": "catalog:", - "tailwindcss": "^4", - "typescript": "^5", + "tailwindcss": "4.1.18", + "typescript": "5.9.3", }, }, "packages/types": { diff --git a/package.json b/package.json index f8a0b90..7dc2770 100644 --- a/package.json +++ b/package.json @@ -22,9 +22,9 @@ "clean": "git clean -dfx" }, "devDependencies": { - "oxfmt": "^0.35.0", - "oxlint": "^1.50.0", - "turbo": "latest" + "oxfmt": "0.35.0", + "oxlint": "1.50.0", + "turbo": "2.7.1" }, - "packageManager": "bun@1.3.4" + "packageManager": "bun@1.3.14" }